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