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