Как правильно выгрузить остатки из регистра в документ в 1С:Конвертации данных

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

Перенос остатков между базами 1С с помощью конфигурации «Конвертация данных 2.1» — одна из самых частых и в то же время вызывающих сложности задач. Классический сценарий: в источнике данные хранятся в виде записей регистра (накопления или сведений), а в базе-приемнике требуется сформировать документ ввода начальных остатков или документ поступления с заполненной табличной частью.

Разберем, почему при стандартных попытках выгрузки возникает ошибка «Поле объекта не обнаружено» или счетчик выгруженных объектов равен нулю, и рассмотрим правильные варианты реализации данной задачи.

Анализ проблемы: почему не работает простая передача результата запроса

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

Рассмотрим два корректных подхода к переносу остатков: через ПВД с произвольным алгоритмом и через ПКГС (Правило конвертации группы свойств).

Способ 1. Выгрузка через ПВД с произвольным алгоритмом и передачей структуры объекта

Этот способ является наиболее универсальным, так как позволяет в одном месте сформировать документ со всеми необходимыми реквизитами шапки и заполненной табличной частью.

Разберем по шагам настройку правил:

  1. В ПКО документа-приемника оставляем поле Источник пустым, а в поле Приемник выбираем нужный документ (например, ДокументСсылка.ПоступлениеТоваров или ДокументСсылка.ВводОстатков).
  2. Создаем необходимые правила конвертации свойств (ПКС) для реквизитов шапки и правило конвертации группы свойств (ПКГС) для табличной части. Поля источника у них также оставляем пустыми, имена свойств приемника должны совпадать с ключами структуры.
  3. Создаем правило выгрузки данных (ПВД). Устанавливаем Способ выборки — Произвольный алгоритм.
  4. В обработчике «Перед обработкой» формируем запрос к регистру остатков, собираем структуру документа и вызываем функцию ВыгрузитьПоПравилу.

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


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТоварыНаСкладахОстатки.Номенклатура КАК Номенклатура,
    |	ТоварыНаСкладахОстатки.КоличествоОстаток КАК Количество,
    |	ЦеныНоменклатурыСрезПоследних.Цена КАК Цена
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.Остатки(&КонДата, ) КАК ТоварыНаСкладахОстатки
    |	ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонДата, ) КАК ЦеныНоменклатурыСрезПоследних
    |		ПО ТоварыНаСкладахОстатки.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура";

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

ТаблицаТовары = Запрос.Выполнить().Выгрузить();

Если ТаблицаТовары.Количество() > 0 Тогда

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

КонецЕсли;

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

Способ 2. Получение строк табличной части в обработчике ПКГС

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

Разберем порядок действий для этого способа:

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

Посмотрим на пример кода в обработчике Перед обработкой правила конвертации группы свойств (ПКГС):


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Остатки.Номенклатура КАК Номенклатура,
    |	Остатки.КоличествоОстаток КАК Количество,
    |	Остатки.СуммаОстаток КАК Сумма
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.Остатки(&ДатаОстатков, ) КАК Остатки";

Запрос.УстановитьПараметр("ДатаОстатков", Дата(2023, 12, 31, 23, 59, 59));

// Заполняем коллекцию объектов таблицей значений
КоллекцияОбъектов = Запрос.Выполнить().Выгрузить();

Обратите внимание: переменная КоллекцияОбъектов обязательно должна быть коллекцией (ТаблицаЗначений или Массив структур). Нельзя присваивать ей выборку из результата запроса (ВыборкаИзРезультатаЗапроса), иначе при обращении по индексу система завершит работу с ошибкой.

Типовые ошибки и рекомендации

Проанализируем частые ошибки, возникающие при реализации данных алгоритмов:

  1. Несовпадение имен колонок: Имена колонок в выгружаемой таблице значений должны в точности совпадать с именами свойств источника в ПКС (или именами приемника, если источник пустой).
  2. Использование безопасного режима: Если внешняя обработка обмена подключена через механизмы БСП (справочник «Дополнительные отчеты и обработки»), платформа может запускать код правил в безопасном режиме, блокируя выполнение некоторых запросов и доступ к файлам. Для отладки и выгрузки открывайте обработку УниверсальныйОбменДаннымиXML напрямую через меню «Файл» — «Открыть» от имени пользователя с полными правами.
  3. Дублирование вызовов: Если в ПВД используется явный вызов функции ВыгрузитьПоПравилу, переменную ВыборкаДанных заполнять не нужно, чтобы избежать повторной выгрузки одних и тех же данных.
← На главную