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