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