Как выгрузить записи регистра сведений, связанные с конкретным элементом справочника, в Конвертации данных 2.1?

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

При настройке обмена данными между конфигурациями 1С:Зарплата и управление персоналом и 1С:ERP Управление предприятием часто возникает задача переноса сложных объектов. Одной из таких задач является выгрузка справочника ГрафикиРаботыСотрудников вместе с соответствующими ему записями из регистра сведений ГрафикиРаботыПоВидамВремени. Основная сложность заключается в объеме данных: если регистр содержит миллионы записей, стандартная полная выгрузка становится невозможной. Нам необходимо реализовать механизм, который будет выбирать записи регистра только для тех графиков, которые участвуют в обмене.

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

Способ 1: Использование обработчика «После выгрузки» в ПКО справочника

Рассмотрим наиболее точный и управляемый метод. Мы можем прописать логику выгрузки связанных записей непосредственно в правиле конвертации объекта (ПКО) для справочника. Этот метод гарантирует, что сразу после того, как справочник ГрафикиРаботыСотрудников будет выгружен, система автоматически найдет и выгрузит относящиеся к нему записи регистра.

Разберем по шагам алгоритм действий в обработчике «После выгрузки» для ПКО справочника ГрафикиРаботыСотрудников:

  1. Создадим запрос к базе данных ЗУП для получения записей регистра.
  2. Установим фильтр по измерению ГрафикРаботы, используя ссылку на текущий выгружаемый объект (переменная Источник).
  3. В цикле вызовем функцию ВыгрузитьПоПравилу() для каждой найденной записи.

Посмотрим на пример программного кода, который реализует эту логику:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |   ГрафикиРаботыПоВидамВремени.Период,
    |   ГрафикиРаботыПоВидамВремени.ГрафикРаботы,
    |   ГрафикиРаботыПоВидамВремени.ВидВремени,
    |   ГрафикиРаботыПоВидамВремени.ОсновноеЗначение
    |ИЗ
    |   РегистрСведений.ГрафикиРаботыПоВидамВремени КАК ГрафикиРаботыПоВидамВремени
    |ГДЕ
    |   ГрафикиРаботыПоВидамВремени.ГрафикРаботы = &ГрафикРаботы";

Запрос.УстановитьПараметр("ГрафикРаботы", Источник.Ссылка);

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

Пока Выборка.Следующий() Цикл
    // Создаем структуру для передачи данных в ПКО регистра
    ДанныеРегистра = Новый Структура;
    ДанныеРегистра.Вставить("Период",          Выборка.Период);
    ДанныеРегистра.Вставить("ГрафикРаботы",   Выборка.ГрафикРаботы);
    ДанныеРегистра.Вставить("ВидВремени",     Выборка.ВидВремени);
    ДанныеРегистра.Вставить("ОсновноеЗначение", Выборка.ОсновноеЗначение);
    
    // Вызываем выгрузку по правилу конвертации регистра (ПКО_ГрафикиРаботыПоВидамВремени)
    ВыгрузитьПоПравилу(ДанныеРегистра, , , , "ГрафикиРаботыПоВидамВремени");
КонецЦикла;

Важный момент: При использовании этого метода необходимо убедиться, что для регистра сведений создано отдельное ПКО, а в вызове ВыгрузитьПоПравилу указано именно его имя. Это позволяет выгружать данные порционно, только для нужных объектов.

Способ 2: Оптимизация через передачу «Входящих данных»

Проанализируем ситуацию с производительностью. Если мы выгружаем тысячи графиков, выполнение запроса в цикле «После выгрузки» может существенно замедлить процесс из-за многократных обращений к базе данных. Чтобы избежать этой проблемы, можно использовать коллекцию ВходящиеДанные.

Суть метода заключается в том, чтобы собрать все необходимые записи регистра заранее или подготовить их в ПКО справочника в обработчике «Перед выгрузкой». Однако наиболее элегантным решением будет создание ПКС (Правила Конвертации Свойства) у справочника, которое будет являться виртуальным (не имеющим соответствия в приемнике), но инициирующим выгрузку коллекции записей регистра.

Выясним причину эффективности этого метода: он позволяет передать структуру записей регистра как вложенную коллекцию объекта-справочника. В ПКО регистра в этом случае источником данных будет выступать не объект базы данных, а переданная структура (ВходящиеДанные).

Способ 3: Правила выгрузки данных (ПВД) с произвольным алгоритмом

Если вы запускаете выгрузку не по ссылке, а через Универсальный обмен данными в формате XML, целесообразно использовать ПВД с типом выборки «Произвольный алгоритм». Это позволяет одним запросом получить и графики, и все связанные с ними записи регистра, что является самым быстрым способом обработки миллиона записей.

Разберем, как это реализовать:

  1. В правиле выгрузки данных для справочника ГрафикиРаботыСотрудников выберите режим «Произвольный алгоритм».
  2. Напишите запрос, объединяющий данные справочника и регистра (или два последовательных запроса).
  3. Используйте метод ВыгрузитьПоПравилу для каждой строки результата запроса.

Проанализируем пример кода для ПВД:


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

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

Пока ВыборкаГрафиков.Следующий() Цикл
    // Выгружаем сам график
    ВыгрузитьПоПравилу(ВыборкаГрафиков.График, , , , "ГрафикиРаботыСотрудников");
    
    // Здесь же можно добавить выгрузку связанных записей регистра, 
    // аналогично первому способу, либо вынести это в отдельный запрос.
КонецЦикла;

Особенности работы с большими объемами (миллион записей)

Когда мы имеем дело с миллионом записей в регистре ГрафикиРаботыПоВидамВремени, необходимо соблюдать правила технической гигиены 1С:

Где найти готовые примеры?

Если вам требуется наглядный пример реализации, обратите внимание на демонстрационную базу «Конвертация данных 2.1». Ее можно скачать с портала 1С:ИТС. В этой базе найдите конвертацию с префиксом «Демо:». Рассмотрим правила под названием «Выгрузка регистра сведений по ссылке». В них реализован именно тот механизм, который мы разобрали в первом способе: программная выборка записей регистра в привязке к объекту-владельцу.

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

← На главную