При настройке правил обмена в конфигурации «Конвертация данных 2.0» (КД 2) разработчики часто сталкиваются с двумя взаимосвязанными задачами: корректной передачей параметров периода из обработки «Универсальный обмен данными в формате XML» в произвольный алгоритм выборки данных и оптимизацией производительности при выгрузке сотен тысяч элементов. Неоптимально составленный запрос или некорректные настройки правил конвертации объектов (ПКО) приводят к исчерпанию оперативной памяти и аварийному завершению сеанса с ошибкой обращения к серверу.
Разберем по шагам, как правильно передавать даты периода в текст запроса обработчика правила выгрузки данных (ПВД), как оптимизировать выборку больших объемов номенклатуры и какие настройки применить при загрузке в базу-приемник.
Когда в ПВД используется произвольный алгоритм выборки данных, запрос формируется непосредственно в обработчике события Перед обработкой или При обработке. Для фильтрации по датам нет необходимости создавать дополнительные параметры вручную, если используются стандартные реквизиты периода обработки обмена.
Реквизиты ДатаНачала и ДатаОкончания являются штатными реквизитами обработки «Универсальный обмен данными в формате XML» и напрямую доступны в контексте выполнения обработчиков КД. Проанализируем правильный вариант установки параметров в коде запроса:
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Если требуется передавать произвольные пользовательские значения, которых нет в стандартном диалоге обработки, мы можем объявить их на вкладке Параметры в конфигурации «Конвертация данных» и при выгрузке обращаться к ним через коллекцию Параметры.ИмяПараметра.
Типичная ошибка при выгрузке номенклатуры по движениям документов (например, по табличным частям реализации) — многократное дублирование одних и тех же ссылок. Если одна и та же позиция присутствует в тысячах документов, простой запрос без группировки вернет миллионы повторяющихся строк, что вызовет гигантский размер XML-файла и переполнение памяти.
Кроме того, категорически не рекомендуется использовать конструкцию ВыборкаДанных = Запрос.Выполнить().Выгрузить(), так как метод Выгрузить() полностью считывает всю таблицу значений в оперативную память. Вместо этого следует передавать результат запроса или выборку.
Посмотрим на пример оптимизированного кода выборки данных в ПВД с использованием временной таблицы и группировки уникальных позиций:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.Номенклатура.Ссылка КАК Ссылка
|ПОМЕСТИТЬ СписокТоваров
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Номенклатура.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| СписокТоваров.Ссылка КАК Ссылка,
| СписокТоваров.Ссылка.Артикул КАК Артикул,
| СписокТоваров.Ссылка.Наименование КАК Наименование,
| СписокТоваров.Ссылка.ФирмаИзготовитель КАК ФирмаИзготовитель,
| СписокТоваров.Ссылка.СтавкаНДС КАК СтавкаНДС,
| СписокТоваров.Ссылка.Родитель КАК Родитель,
| СписокТоваров.Ссылка.ЭтоГруппа КАК ЭтоГруппа
|ИЗ
| СписокТоваров КАК СписокТоваров";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
ВыборкаДанных = Запрос.Выполнить().Выбрать();
При выгрузке сотен тысяч элементов справочников критически важно следить за тем, как обработка запоминает ссылки в процессе работы. Рассмотрим ключевые флаги и обработчики в правилах конвертации:
ВыборкаДанных, для соответствующего ПКО обычно устанавливают данный флаг, чтобы не дублировать ссылки в памяти выгрузки. Однако при наличии циклических зависимостей или иерархии нужно проверять, чтобы объект не выгружался повторно из подчиненных правил.Поля поиска рекомендуется явно разграничивать правила поиска для папок и элементов. Посмотрим пример:
Если СвойстваПоиска["ЭтоГруппа"] = Истина Тогда
СтрокаИменСвойствПоиска = "ЭтоГруппа, Наименование, Родитель";
Иначе
СтрокаИменСвойствПоиска = "Артикул, Наименование, ФирмаИзготовитель";
КонецЕсли;
Ошибка выполнения POST-запроса к ресурсу /e1cib/logForm в управляемом клиенте возникает из-за переполнения серверного контекста, разрыва клиент-серверного соединения при длительном вызове и чрезмерного разрастания транзакции записи. Выясним, как стабилизировать процесс загрузки:
ОбменДанными.Загрузка = Истина, что отключает прикладные проверки в модулях объектов и ресурсоемкие подписки на события.rphost регулярно освобождать оперативную память после фиксации каждой порции.