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