Как передать фиксированное значение измерения регистра бухгалтерии, если его нет в источнике?

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

При переносе данных между различными конфигурациями 1С с помощью «Конвертации данных 2.1» (КД 2) часто возникает ситуация, когда целевая база (Приемник) имеет более расширенную структуру метаданных, чем база-отправитель (Источник). Типичный пример — необходимость заполнения измерения ИсточникФинансирования в регистре бухгалтерии Хозрасчетный, которое присутствует в базе-приемнике, но полностью отсутствует в источнике. Разберем подробно, как правильно настроить правила конвертации для решения этой задачи.

Механика решения через ПКС и ПКО

Для реализации задачи нам необходимо создать механизм, который «подставит» нужное значение в процессе выгрузки, даже если в объекте-источнике нет соответствующего поля. Рассмотрим самый надежный способ, основанный на связке Правила Конвертации Объекта (ПКО) и Правила Конвертации Свойства (ПКС).

Шаг 1. Создание ПКО для справочника-измерения

Первым делом проанализируем справочник в приемнике, который является типом нашего измерения (например, ИсточникиФинансирования). Нам нужно создать ПКО для этого справочника, которое будет работать «вхолостую» относительно источника:

  1. Создаем новое ПКО (назовем его ИсточникиФинансирования).
  2. Поле Объект-источник оставляем пустым.
  3. Поле Объект-приемник устанавливаем как СправочникСсылка.ИсточникиФинансирования.
  4. В настройках ПКО устанавливаем флаг «Продолжить поиск по полям поиска, если по уникальному идентификатору объект не найден».
  5. Добавляем ПКС для реквизита Наименование. Поле «Источник» оставляем пустым, «Приемник» — Наименование. Устанавливаем флаг «Поиск».
  6. В обработчике ПКС Перед выгрузкой пишем код:

Значение = Источник;

Здесь Источник будет передаваться из вызывающего правила как строка с названием нужного нам элемента.

Шаг 2. Настройка ПКС в регистре бухгалтерии

Теперь перейдем к правилу конвертации самого регистра (или документа, который делает движения). Найдем в списке ПКС наше измерение ИсточникФинансирования:

  1. Поле Источник оставляем пустым.
  2. Поле Приемник — ИсточникФинансирования.
  3. В колонке Правило выбираем созданное на первом шаге ПКО ИсточникиФинансирования.
  4. В обработчике Перед выгрузкой этого ПКС прописываем фиксированное значение, которое мы хотим передать:

Значение = "Основной бюджет"; // Ваше конкретное наименование

Таким образом, система при выгрузке каждой записи регистра увидит строку "Основной бюджет", передаст ее в ПКО справочника, которое по этому наименованию найдет (или создаст, если указано в настройках) объект в базе-приемнике.

Использование структуры для поиска (передача по нескольким полям)

Проанализируем ситуацию, когда поиска только по наименованию недостаточно. Если в справочнике-приемнике могут быть дубли наименований или требуется поиск по коду, значение в ПКС регистра можно передать в виде структуры. Это более гибкий подход.

В обработчике Перед выгрузкой ПКС регистра пишем:


СтруктураПоиска = Новый Структура;
СтруктураПоиска.Вставить("Наименование", "Основной бюджет");
СтруктураПоиска.Вставить("Код", "00001");
Значение = СтруктураПоиска;

В этом случае в ПКО справочника ИсточникиФинансирования в обработчике Поля поиска система получит доступ к этим данным, что позволит однозначно идентифицировать объект в базе-приемнике.

Работа с набором записей и условиями по счетам

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

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


Если ОбъектКоллекции.СчетДт.Код = "20.01" Тогда
    Значение = "Бюджет производства";
ИначеЕсли ОбъектКоллекции.СчетКт.Код = "20.01" Тогда
    Значение = "Бюджет производства";
Иначе
    Отказ = Истина; // Измерение останется пустым для других счетов
КонецЕсли;

Альтернативный метод: Заполнение «После загрузки» в приемнике

Существует еще один профессиональный метод — не передавать лишние данные через файл обмена, а заполнить их непосредственно в момент загрузки в базу-приемник. Это особенно актуально, если логика заполнения сложная и зависит от настроек самой базы-приемника.

Рассмотрим алгоритм действий в ПКО регистра бухгалтерии (или набора записей):

  1. Переходим на вкладку Обработчики событий.
  2. Выбираем обработчик После загрузки.
  3. Пишем код перебора записей набора:

Для Каждого Запись Из Объект Цикл
    // Находим ссылку на нужный источник финансирования в базе-приемнике
    СсылкаНаИсточник = Справочники.ИсточникиФинансирования.НайтиПоНаименованию("Загружено из базы А");
    
    Если Не СсылкаНаИсточник.Пустая() Тогда
        Запись.ИсточникФинансирования = СсылкаНаИсточник;
    КонецЕсли;
КонецЦикла;

Преимущество этого метода: Вы гарантированно работаете с объектами базы-приемника, и вам не нужно настраивать сложные цепочки ПКО для передачи простых констант.

Использование глобальных параметров конвертации

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

  1. В КД 2 на вкладке «Параметры» создаем параметр ИмяБазыИсточника.
  2. При выгрузке данных (в обработчике Перед выгрузкой данных самой конвертации) инициализируем его.
  3. В ПКС регистра используем его: Значение = Параметры.ИмяБазыИсточника;.

Это позволит централизованно управлять логикой заполнения без необходимости править программный код в нескольких ПКС при изменении названия источника.

Тонкости работы с субконто

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

Использование связки пустого источника и программной установки Значение в ПКС — это стандарт «золотого сечения» в разработке правил обмена. Это делает ваши правила гибкими и позволяет адаптировать данные под любую структуру базы-приемника.

← На главную