Как передать параметры даты в запрос ПВД и избежать нехватки памяти при выгрузке данных в 1С

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

При настройке правил обмена в конфигурации «Конвертация данных 2.0» (КД 2) разработчики часто сталкиваются с двумя взаимосвязанными задачами: корректной передачей параметров периода из обработки «Универсальный обмен данными в формате XML» в произвольный алгоритм выборки данных и оптимизацией производительности при выгрузке сотен тысяч элементов. Неоптимально составленный запрос или некорректные настройки правил конвертации объектов (ПКО) приводят к исчерпанию оперативной памяти и аварийному завершению сеанса с ошибкой обращения к серверу.

Разберем по шагам, как правильно передавать даты периода в текст запроса обработчика правила выгрузки данных (ПВД), как оптимизировать выборку больших объемов номенклатуры и какие настройки применить при загрузке в базу-приемник.

Передача стандартных параметров периода в произвольный алгоритм ПВД

Когда в ПВД используется произвольный алгоритм выборки данных, запрос формируется непосредственно в обработчике события Перед обработкой или При обработке. Для фильтрации по датам нет необходимости создавать дополнительные параметры вручную, если используются стандартные реквизиты периода обработки обмена.

Реквизиты ДатаНачала и ДатаОкончания являются штатными реквизитами обработки «Универсальный обмен данными в формате XML» и напрямую доступны в контексте выполнения обработчиков КД. Проанализируем правильный вариант установки параметров в коде запроса:


Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

Если требуется передавать произвольные пользовательские значения, которых нет в стандартном диалоге обработки, мы можем объявить их на вкладке Параметры в конфигурации «Конвертация данных» и при выгрузке обращаться к ним через коллекцию Параметры.ИмяПараметра.

Оптимизация запроса в ПВД при выборке больших объемов номенклатуры

Типичная ошибка при выгрузке номенклатуры по движениям документов (например, по табличным частям реализации) — многократное дублирование одних и тех же ссылок. Если одна и та же позиция присутствует в тысячах документов, простой запрос без группировки вернет миллионы повторяющихся строк, что вызовет гигантский размер XML-файла и переполнение памяти.

Кроме того, категорически не рекомендуется использовать конструкцию ВыборкаДанных = Запрос.Выполнить().Выгрузить(), так как метод Выгрузить() полностью считывает всю таблицу значений в оперативную память. Вместо этого следует передавать результат запроса или выборку.

Посмотрим на пример оптимизированного кода выборки данных в ПВД с использованием временной таблицы и группировки уникальных позиций:


Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	РеализацияТоваровУслугТовары.Номенклатура.Ссылка КАК Ссылка
|ПОМЕСТИТЬ СписокТоваров
|ИЗ
|	Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
|	РеализацияТоваровУслугТовары.Ссылка.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
|
|СГРУППИРОВАТЬ ПО
|	РеализацияТоваровУслугТовары.Номенклатура.Ссылка
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
|	СписокТоваров.Ссылка КАК Ссылка,
|	СписокТоваров.Ссылка.Артикул КАК Артикул,
|	СписокТоваров.Ссылка.Наименование КАК Наименование,
|	СписокТоваров.Ссылка.ФирмаИзготовитель КАК ФирмаИзготовитель,
|	СписокТоваров.Ссылка.СтавкаНДС КАК СтавкаНДС,
|	СписокТоваров.Ссылка.Родитель КАК Родитель,
|	СписокТоваров.Ссылка.ЭтоГруппа КАК ЭтоГруппа
|ИЗ
|	СписокТоваров КАК СписокТоваров";

Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);

ВыборкаДанных = Запрос.Выполнить().Выбрать();

Настройка правил конвертации объектов (ПКО) для экономии памяти

При выгрузке сотен тысяч элементов справочников критически важно следить за тем, как обработка запоминает ссылки в процессе работы. Рассмотрим ключевые флаги и обработчики в правилах конвертации:

  1. Флаг «Не запоминать выгруженные объекты»: если в ПВД инициализируется параметр ВыборкаДанных, для соответствующего ПКО обычно устанавливают данный флаг, чтобы не дублировать ссылки в памяти выгрузки. Однако при наличии циклических зависимостей или иерархии нужно проверять, чтобы объект не выгружался повторно из подчиненных правил.
  2. Флаг «Не замещать существующие объекты»: для вспомогательных классификаторов и связанных справочников (например, производителей, стран мира, единиц измерения) включение этой опции в ПКО предотвращает лишнюю перезапись данных в базе-приемнике при повторном обнаружении элемента.
  3. Разделение поиска для групп и элементов: при обработке иерархических справочников в обработчике ПКО Поля поиска рекомендуется явно разграничивать правила поиска для папок и элементов. Посмотрим пример:
    
    Если СвойстваПоиска["ЭтоГруппа"] = Истина Тогда
    	СтрокаИменСвойствПоиска = "ЭтоГруппа, Наименование, Родитель";
    Иначе
    	СтрокаИменСвойствПоиска = "Артикул, Наименование, ФирмаИзготовитель";
    КонецЕсли;
    

Устранение ошибки «Недостаточно свободной памяти на сервере» при загрузке

Ошибка выполнения POST-запроса к ресурсу /e1cib/logForm в управляемом клиенте возникает из-за переполнения серверного контекста, разрыва клиент-серверного соединения при длительном вызове и чрезмерного разрастания транзакции записи. Выясним, как стабилизировать процесс загрузки:

  1. Загрузка данных в режиме обмена: обязательно убедимся, что включена опция загрузки в режиме обмена данными. Это устанавливает свойство ОбменДанными.Загрузка = Истина, что отключает прикладные проверки в модулях объектов и ресурсоемкие подписки на события.
  2. Настройка размера транзакции: в обработке загрузки данных уменьшим параметр Количество объектов в транзакции до 100–500 элементов. Это позволит СУБД и процессу rphost регулярно освобождать оперативную память после фиксации каждой порции.
  3. Отключение ведения протокола: при обработке массивов объемом более 100 000 записей отключим детальное протоколирование и вывод сообщений в окно сообщений клиента, чтобы не переполнять буфер клиентского сеанса.
  4. Запуск через толстый клиент или регламентное задание: для тяжелых разовых переносов рекомендуется запускать обработку загрузки в толстом клиенте или выполнять чтение файла внутри фонового задания на сервере, что полностью исключает влияние клиентского интерфейса и таймаутов веб-сервисов.
← На главную