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