Как в 1С:Конвертация данных 2.1 заполнить реквизит приемника, которого нет в источнике?

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

При переносе данных между различными конфигурациями (например, из Управление торговлей в Бухгалтерия предприятия) разработчики часто сталкиваются с ситуацией, когда в структуре базы-приемника присутствуют реквизиты, полностью отсутствующие в базе-источнике. Типичный пример — документ РеализацияТоваровУслуг: в конфигурации Бухгалтерия предприятия в табличной части Товары обязательно указывается реквизит СчетУчета (а также счета учета доходов, расходов и НДС), тогда как в Управление торговлей план счетов отсутствует вовсе.

Попытка напрямую сопоставить поля в конвертации свойств приводит к ошибкам, так как база-источник не может получить значение поля, которого нет в ее метаданных. Разберем по шагам основные способы решения этой задачи в конфигурации 1С:Конвертация данных 2.1.

Способ 1. Заполнение реквизитов в обработчике «ПослеЗагрузки» ПКО документа

Наиболее универсальным и рекомендуемым подходом при переносе документов в бухгалтерскую конфигурацию является использование типовых процедур автозаполнения счетов на стороне приемника. В этом случае в правиле конвертации свойств (ПККС) для реквизита СчетУчета сопоставление не настраивается вовсе (или правило для свойства отключается), а заполнение табличной части выполняется уже после загрузки объекта в память.

Разберем логику работы: в Правиле конвертации объектов (ПКО) соответствующего документа перейдем на вкладку Обработчики событий и откроем событие ПослеЗагрузки. В зависимости от редакции конфигурации-приемника код будет выглядеть следующим образом:

Для конфигурации Бухгалтерия предприятия 2.0:


Если Объект.Товары.Количество() > 0 Тогда
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        Объект.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(СтрокаТЧ, "Товары", Истина);
    КонецЦикла;
КонецЕсли;

Если Объект.Услуги.Количество() > 0 Тогда
    Для Каждого СтрокаТЧ Из Объект.Услуги Цикл
        Объект.ЗаполнитьСчетаУчетаВСтрокеТабЧастиУслуги(СтрокаТЧ, Истина);
    КонецЦикла;
КонецЕсли;

Для конфигурации Бухгалтерия предприятия 3.0 вызов механизмов заполнения вынесен в общий модуль СчетаУчетаВДокументах:


Если Объект.Товары.Количество() > 0 Тогда
    Для Каждого СтрокаТЧ Из Объект.Товары Цикл
        СчетаУчетаВДокументах.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(Объект, СтрокаТЧ, "Товары");
    КонецЦикла;
КонецЕсли;

Важный нюанс: для корректной работы этого способа в базе-приемнике должны быть предварительно настроены правила в регистре сведений СчетаУчетаНоменклатуры (по номенклатуре, группам или организациям). Кроме того, не следует вызывать внутри обработчика метод Объект.Записать() — штатный механизм загрузки КД 2.1 запишет модифицированный объект автоматически.

Способ 2. Использование переменной «Выражение» в ПККС

Если для строки табличной части всегда должен устанавливаться один конкретный счет (или значение вычисляется по простому алгоритму на стороне приемника), можно использовать специальный параметр Выражение.

  1. В ПКО табличной части создаем правило конвертации свойства (ПККС) для реквизита СчетУчета.
  2. Поле Источник оставляем пустым, а в поле Приемник указываем СчетУчета.
  3. В обработчике ПередВыгрузкой данного свойства пишем исполняемую строку для приемника:

Выражение = "ПланыСчетов.Хозрасчетный.ТоварыНаСкладах";

В этом случае в выгружаемый XML-файл помещается строка алгоритма. При выгрузке из источника обращение к несуществующему плану счетов не происходит, а на стороне приемника выражение вычисляется в момент разбора данных свойства.

Способ 3. Передача предопределенного имени или кода через «Значение»

Если для свойства настроено собственное ПКО для типа ПланСчетовСсылка.Хозрасчетный, мы можем передать строковый идентификатор или код счета из источника:

  1. В ПККС реквизита СчетУчета оставляем Источник пустым.
  2. В обработчике ПередВыгрузкой задаем текстовое значение: Значение = "41.01";
  3. В ПКО для плана счетов настраиваем поиск объекта в приемнике по реквизиту Код или ИмяПредопределенныхДанных.

Способ 4. Заполнение свойства в обработчике «ПриЗагрузке» ПККС

Если требуется присвоить значение непосредственно на этапе разбора конкретного свойства на стороне базы-приемника, используем обработчик ПриЗагрузке в ПККС:

  1. В ПККС реквизита СчетУчета оставляем Источник пустым.
  2. В обработчике ПриЗагрузке свойства переопределяем переменную Значение: Значение = ПланыСчетов.Хозрасчетный.НайтиПоКоду("41.01");

Передача условий заполнения из источника через параметры

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

  1. В ПКО документа в обработчике ПередВыгрузкой помещаем значение во временную структуру параметров: Параметры.Вставить("ВидСделкиИзИсточника", Источник.ВидОперации);
  2. В обработчике ПослеЗагрузки документа считываем параметр и заполняем строки:
    
    ВидСделки = "";
    ПараметрыОбъекта.Свойство("ВидСделкиИзИсточника", ВидСделки);
    
    Если ВидСделки = "Комиссия" Тогда
        Счет = ПланыСчетов.Хозрасчетный.ТоварыНаКомиссии;
    Иначе
        Счет = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах;
    КонецЕсли;
    
    Для Каждого СтрТЧ Из Объект.Товары Цикл
        СтрТЧ.СчетУчета = Счет;
    КонецЦикла;
    

Частые ошибки при настройке правил

  1. Обращение к метаданным приемника в событиях выгрузки: попытка написать ПланыСчетов.Хозрасчетный... в событиях ПередВыгрузкой, ПриВыгрузке или ПослеВыгрузки приведет к ошибке выполнения в источнике, так как в Управление торговлей таких объектов нет.
  2. Попытка ручного проведения объекта в обработчике: если счета учета заполняются в ПослеЗагрузки, документ не должен проводиться программно через Объект.Записать(РежимЗаписиДокумента.Проведение) внутри этого же обработчика. Проведение должно выполняться штатным механизмом правил обмена после завершения всех событий загрузки.
← На главную