Posted in 1С: Предприятие 8.х Программирование

1Cv8 Отбор в запросе ссылок <Объект не найден>

В запросе 1С можно выборочно включать поля в запрос по условию наличия или отсутствия битых ссылок:

ВЫБРАТЬ
ВЫБОР
КОГДА
Прайс.Номенклатура.Ссылка ЕСТЬ NULL
ТОГДА NULL
ИНАЧЕ Прайс.Номенклатура
КОНЕЦ КАК Номенклатура

также можно отбирать по результаты запроса по условию битой ссылки:

ГДЕ
НЕ (Прайс.Контрагент.Ссылка ЕСТЬ NULL)

Сам запрос может выглядеть примерно так:

ВЫБРАТЬ
ВЫБОР
КОГДА
Прайс.Номенклатура.Ссылка ЕСТЬ NULL
ТОГДА NULL
ИНАЧЕ Прайс.Номенклатура
КОНЕЦ КАК Номенклатура,
Прайс.Цена
ИЗ
РегистрСведений.Прайс КАК Прайс
ГДЕ
НЕ (Прайс.Контрагент.Ссылка ЕСТЬ NULL)

Posted in 1С: Предприятие 8.х Программирование

как в запросе 1Сv8 преобразовать дату в начало дня?

для преобразования даты в начало дня нужно использовать функцию запросов НАЧАЛОПЕРИОДА()


НАЧАЛОПЕРИОДА(ДокументЗаказ.Дата, ДЕНЬ)

Posted in 1С: Предприятие 8.х

Как не надо писать код в 1Сv8 и вообще в 1С

Как не надо писать код:


Если НЕ ПустаяСтрока(ТекСтрока.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.МеждународноеСокращение) Тогда       
   лUNIT = СокрЛП(ТекСтрока.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.МеждународноеСокращение);               
КонецЕсли;

ТекСтрока.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.МеждународноеСокращение это 2 подзапроса в одной строке. Этот код выполняется в цикле по табличной части и из-за этого ведется множество подзапросов к БД. Никакого кэширования сервер не производит, т.к. для него это каждый раз новые запросы по разной номенклатуре. А 1С вообще не умеет нормально кэшировать.

Кроме того, как Вы заметили эти 2 подзапроса выполняются еще и 2 раза: один в условии и один в присвоении значения. Это рост нагрузки на сервер, БД, сеть и клиента, не 2 раза на каждую строку, а в 4 раза.

как надо:


лЕдИзмENG = ТекСтрока.ЕдиницаИзмерения.ЕдиницаПоКлассификатору.МеждународноеСокращение;
Если НЕ ПустаяСтрока(лЕдИзмENG) Тогда     
   лUNIT = СокрЛП(лЕдИзмENG);             
КонецЕсли;

Posted in 1С: Предприятие 8.х Программирование

как сформировать строку подключения к ODBC через мастер ODBC подключений

Для работы с мастером нужно использовать COM-объект DataLinks. Вот код для этого:


    Соединение = Новый COMОбъект("ADODB.Connection");
    ДатаЛ = Новый COMОбъект("DataLinks");
    Соединение.ConnectionString = Строка_Подключения;
    ДатаЛ.PromptEdit(Соединение);
    Строка_Подключения = Соединение.ConnectionString;

где Строка_Подключения это реквизит или переменная куда сохраняем строку подключения и откуда читаем строку подключения.

передача Соединение.ConnectionString строки подключения позволяет вставить все настройки строки подключения в мастер и не вводить их повторно.

Posted in 1С: Предприятие 8.х

Конкатенация (сложение) строк в запросе 1С v8


ВЫБРАТЬ
ВЫРАЗИТЬ(
  ВЫРАЗИТЬ("123" КАК Строка(15))
+
  ВЫРАЗИТЬ("789" КАК Строка(15))
КАК Строка(15)
) КАК Результат
ИЗ
Справочник.Номенклатура КАК Номенклатура

это нужно, например, чтобы в условии запроса сначала сложить строки, а потом сделать их результат проверяемым параметром. Или просто с помощью этого можно получить строку образованную сложением и преобразованием в строку различных значений, например, строк.

Posted in 1С: Предприятие 8.х Программирование

Как в 1Cv8 (1С: Предприятие версий 8.x) быстро создать XDTO объект, если есть шаблон результирующего XML файла?

мое мнение, что если в шаблон нужно вносить мало изменений (например это файл ответа о результатах обмена), то нужно сделать так:


стрКодировка = "Windows-1251";
ШаблонОтветаXML   = ЭтотОбъект.ПолучитьМакет("ШаблонОтветаXML");
локИмяВременногоФайла = ПолучитьИмяВременногоФайла("xml");
ШаблонОтветаXML.Записать(локИмяВременногоФайла);

локЧтениеXML = Новый ЧтениеXML;
локЧтениеXML.ОткрытьФайл(локИмяВременногоФайла);
   
локФабрикаXDTO = Новый ФабрикаXDTO;
ОбXDTO = локФабрикаXDTO.ПрочитатьXML(локЧтениеXML);

шаблон можно сохранить в макетах обработки (или конфигурации) и читать через команды:


ШаблонОтветаXML   = ЭтотОбъект.ПолучитьМакет("ШаблонОтветаXML");
локИмяФайлаОтвета = ПолучитьИмяВременногоФайла("xml");
ШаблонОтветаXML.Записать(локИмяФайлаОтвета);
Posted in 1С: Предприятие 8.х Программирование

Как в 1Сv8 (1С: Предприятие версий 8.x) указать параметры XML файла, включая кодировку?


локЗаписьXML = Новый ЗаписьXML();
локЗаписьXML.ОткрытьФайл(ПолучитьИмяВременногоФайла(".xml"), "windows-1251");
//именно эта строка записывает
//&lt;?xml version="1.0" encoding="windows-1251"?>
локЗаписьXML.ЗаписатьОбъявлениеXML();

кодировка указывается строкой


локЗаписьXML.ОткрытьФайл(ПолучитьИмяВременногоФайла(".xml"), "windows-1251");

объявление параметров XML файла записывается строкой


локЗаписьXML.ЗаписатьОбъявлениеXML();
Posted in 1С: Предприятие 8.х Программирование

как в 1Сv8 (1С: Предприятие версий 8.x) быстро записать объект XDTO фабрикиXDTO в файл XML?

чтобы записать объект нужно создать объект ЗаписьXML, открыть файл в который будешь писать и вызвать у фабрики XDTO метод ЗаписатьXML() с параметрами (указываю по порядку):

  • Объект ЗаписьXML который будет осуществлять запись
  • ОбъектXDTO который будет записан в файл
  • ИмяВетки-контейнера (обрамляющий тег)

локЧтениеXML.ОткрытьФайл(стрИмяФайла);
ОбXDTO = локФабрикаXDTO.ПрочитатьXML(локЧтениеXML);
//имея некоторый объект полученный от ФабрикиXDTO, например, как я указал выше, нужно сделать так:
локЗаписьXML = Новый ЗаписьXML();
локЗаписьXML.ОткрытьФайл(ПолучитьИмяВременногоФайла(".xml"), "windows-1251");
локЗаписьXML.ЗаписатьОбъявлениеXML();
локФабрикаXDTO.ЗаписатьXML(локЗаписьXML, ОбXDTO,"Файл");
Posted in 1С: Предприятие 8.х Программирование

1C8 важно, чтобы XSD схема была в кодировке UTF-8

я загружал XSD схему в кодировке windows-1251 в CериализаторXDTO

1С8 выдавала ошибку 

Ошибка при вызове метода контекста (СоздатьФабрикуXDTO)
локФабрикаИзXSD = СоздатьФабрикуXDTO(локИмяФайлаXSD_Ответа);
по причине:
Ошибка разбора XML: — [2,21] Фатальная ошибка:
Input is not proper UTF-8, indicate encoding !
Bytes: 0xD4 0xE0 0xE9 0xEB

Сохранил XSD файл в кодировке UTF-8  и все заработало.

также эту проблему можно устранить указав в начале XSD файла тег


&lt;?xml version="1.0" encoding="windows-1251"?>