При настройке обмена данными между конфигурациями через Конвертацию данных 2.0 часто возникает задача трансформации данных. Типичный пример: необходимо перенести строки табличной части документа из источника (например, «Управление торговлей») в записи регистра бухгалтерии документа «Операция (бухгалтерский учет)» в приемнике (например, «Бухгалтерия предприятия»).
В процессе такой настройки программисты часто сталкиваются с ошибкой: «Итератор для значения не определен». Проанализируем ситуацию, выясним причину этой ошибки и разберем по шагам правильный алгоритм настройки такой выгрузки.
Разберем техническую сторону вопроса. В системе 1С записи регистра бухгалтерии имеют сложное строение, особенно в части Субконто. Субконто — это не просто реквизит, а коллекция (карта), где ключом является вид субконто, а значением — конкретный объект (номенклатура, контрагент и т.д.).
Когда мы настраиваем ПКС (Правило конвертации свойства) для свойства СубконтоДт или СубконтоКт, встроенный алгоритм обработки обмена УниверсальныйОбменДаннымиXML ожидает, что в переменную Значение попадет объект, который можно перебрать циклом (Для каждого). Если мы просто укажем в качестве источника реквизит табличной части (например, Источник.Номенклатура), то в Значение попадет ссылка на объект. Ссылка не является коллекцией, поэтому при попытке платформы выполнить внутренний код:
Для каждого КлючИЗначение из Значение Цикл
ВидСубконто = КлючИЗначение.Ключ;
Субконто = КлючИЗначение.Значение;
// ... логика КД
КонецЦикла;
Происходит аварийная остановка с сообщением об ошибке итератора. Наша задача — подать на вход КД именно ту структуру, которую она ожидает.
Рассмотрим самый надежный способ решения проблемы через явное определение коллекции субконто. Этот метод позволяет четко сопоставить виды субконто, определенные в плане счетов приемника, с данными из источника.
Хозрасчетный).СубконтоДт (или СубконтоКт, в зависимости от задачи).Соответствие:
// Создаем коллекцию для субконто
Значение = Новый Соответствие();
// Наполняем данными из строки табличной части (ОбъектКоллекции)
// В качестве ключа используем ссылку на ВидСубконто из конфигурации ПРИЕМНИКА
// В качестве значения — само значение из источника
Значение.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура, ОбъектКоллекции.Номенклатура);
Значение.Вставить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады, ОбъектКоллекции.Склад);
Важно: При использовании такого кода убедитесь, что в ПКО документа правильно настроена передача ОбъектКоллекции (строки ТЧ) в правило конвертации группы свойств (ПКГС).
Проанализируем, как правильно связать саму табличную часть документа с движениями. Чтобы строки таблицы стали движениями регистра, используется ПКГС (Правило конвертации группы свойств).
Разберем по шагам настройки в ПКО документа-источника:
Товары).Движения.Хозрасчетный).СчетДт, СчетКт, Сумма, Количество и т.д.
// Гарантируем, что КД будет итерировать по строкам ТЧ
КоллекцияОбъектов = Источник.Товары.Выгрузить();
При выгрузке данных в документ «Операция» в 1С:Бухгалтерии нужно учитывать специфику забалансового учета и активности записей:
Активность = Истина, иначе проводки не будут влиять на итоги в приемнике. В ПКС для свойства Активность укажите Значение = Истина;.ПустаяСсылка(), а субконто должны быть привязаны строго к активному плечу проводки.Регистратор, но это стоит проверить в правилах.Если структура документа-источника и набора записей приемника сильно различаются, рассмотрим вариант с использованием параметра ВходящиеДанные. Это позволяет подготовить данные в ПКО документа и передать их «пакетом» в ПКО набора записей.
В ПКО документа (источник) в обработчике «После выгрузки» можно подготовить таблицу значений, полностью соответствующую структуре регистра, и вызвать выгрузку набора записей вручную через функцию ВыгрузитьОбъект(), передав подготовленную таблицу в параметр ВходящиеДанные.
Подведем итог: ошибка итератора чаще всего исправляется переходом от прямой передачи ссылок в ПКС Субконто к программному формированию соответствия ВидСубконто -> Значение. Это позволяет КД корректно обработать коллекцию и создать правильные проводки в информационной базе приемника.