Как исправить ошибки при выгрузке остатков товаров через Конвертацию Данных 2.1?

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

Перенос начальных остатков из одной конфигурации в другую (например, из «1С:Управление торговлей 10.3» в «1С:Бухгалтерия предприятия 2.0») — частая задача при настройке обмена. Для её реализации в программном комплексе «1С:Конвертация данных 2.1» (КД 2.1) обычно создают Правило Выгрузки Данных (ПВД) с произвольным алгоритмом и Правило Конвертации Объектов (ПКО) с пустым источником.

Однако при вызове функции ВыгрузитьПоПравилу разработчики часто сталкиваются с ошибками обработки данных. Разберем по шагам причины их возникновения и верные варианты настройки конвертации.

Анализ ошибки 1: «Значение не является значением объектного типа (Метаданные)»

Рассмотрим ситуацию, когда в обработчике события Перед обработкой правила выгрузки в ПВД выполняется следующий код:


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

Запрос.УстановитьПараметр("ДатаОстатков", ДатаОстатков);
Запрос.УстановитьПараметр("НашаФирма", Справочники.Организации.НайтиПоКоду("B00000002"));    
ТТТ = Запрос.Выполнить().Выгрузить();

ВходящиеДанные = Новый Структура;
ВходящиеДанные.Вставить("Дата", ДатаОстатков);
ВходящиеДанные.Вставить("МПЗПриобретенные", ТТТ);
ВходящиеДанные.Вставить("Комментарий", "Перенос из УТ");

ВыгрузитьПоПравилу(,, ВходящиеДанные,, "ВводНачальныхОстатков");

При запуске выгрузки платформа выдает ошибку:

Значение не является значением объектного типа (Метаданные) в обработчике ПередКонвертациейОбъекта.

Выясним причину:

В функции ВыгрузитьПоПравилу синтаксис параметров выглядит следующим образом:

ВыгрузитьПоПравилу(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, ИмяПравила)

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

Анализ ошибки 2: «Получение элемента по индексу для значения не определено»

Если передать структуру источником: ВыгрузитьПоПравилу(ВходящиеДанные,,,, "ВводНачальныхОстатков");, платформа может выдать новую ошибку:

Ошибка получения свойства объекта из входящих данных (--> Дата). Получение элемента по индексу для значения не определено.

Проанализируем ситуацию:

Эта ошибка возникает из-за несоответствия настроек в Правилах Конвертации Свойств (ПКС) внутри ПКО:

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

Правильные варианты настройки выгрузки остатков

Посмотрим на два корректных способа реализации выгрузки остатков произвольным алгоритмом.

Способ 1. Выгрузка через структуру источника (Рекомендуемый)

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

Настройка ПКО:

Код в ПВД (Перед обработкой):


ДатаОстатков = '20161231235959';

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

Запрос.УстановитьПараметр("ДатаОстатков", Новый Граница(ДатаОстатков, ВидГраницы.Включая));
Запрос.УстановитьПараметр("НашаФирма", Справочники.Организации.НайтиПоКоду("B00000002"));

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

ОбъектИсточника = Новый Структура;
ОбъектИсточника.Вставить("Дата", ДатаОстатков);
ОбъектИсточника.Вставить("Комментарий", "Перенос остатков из УТ");
ОбъектИсточника.Вставить("МПЗПриобретенные", ТаблицаОстатков);

// Передаем структуру первым параметром "Источник"
ВыгрузитьПоПравилу(ОбъектИсточника, , , , "ВводНачальныхОстатков");

Способ 2. Выгрузка через параметры ВходящиеДанные

Если требуется передать данные через 3-й параметр, обязательно взведите флаг «Получить из входящих данных» на каждом выгружаемом реквизите ПКС (как для шапки, так и для колонок ТЧ).

Код в ПВД:


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

// Передаем Неопределено в Источник и структуру в ВходящиеДанные
ВыгрузитьПоПравилу(Неопределено, , ВходящиеДанные, , "ВводНачальныхОстатков");

Важные технические нюансы при переносе остатков

  1. Граница периода в запросе: При передаче даты в виртуальную таблицу остатков '20161231235959' без использования объекта Граница остатки берутся на начало этой секунды. Чтобы захватить движения последней секунды дня, используйте Новый Граница(ДатаОстатков, ВидГраницы.Включая) или указывайте начало следующего дня '20170101000000'.
  2. Заполнение обязательных реквизитов БП: Для корректного проведения документа ВводНачальныхОстатков в приёмнике (1С:Бухгалтерия) необходимо заполнить служебный реквизит РазделУчета и реквизит Организация. Укажите их в структуре или пропишите по умолчанию в обработчике ПередПринятиемОбъекта / ПриЗагрузке на стороне приемника.
  3. Правила для ссылочных типов ТЧ: Для колонки Номенклатура в табличной части обязательно должно быть указано соответствующее ПКО для справочника Номенклатура, чтобы ссылочные объекты корректно сопоставлялись и создавались при загрузке.
← На главную