Как в Конвертации данных 2.1 установить значение перечисления или справочника, отсутствующее в источнике?

Программист IT и автоматизация бизнеса
← На главную

При настройке обмена данными между разными конфигурациями 1С, например, при переносе документов из «Управление автотранспортом» (УАТ) в «Бухгалтерию предприятия» (БП), часто возникает задача: в документе-приемнике есть обязательный реквизит, которого нет в источнике. Классический пример — реквизит ВидОперации в документе ПоступлениеТоваровУслуг, который должен быть заполнен значением из перечисления.

Рассмотрим, как правильно настроить правила конвертации для двух распространенных случаев: установка значения перечисления и установка ссылки на элемент справочника.

Задача 1: Установка значения для реквизита типа "Перечисление"

Проанализируем исходную проблему. При переносе документа "Поступление товаров и услуг" из УАТ в БП необходимо в документе-приемнике установить реквизит ВидОперации в конкретное значение, например, ПокупкаКомиссия. В конфигурации-источнике такого реквизита и даже такого перечисления нет.

Попытка написать в обработчике события ПриВыгрузке для свойства ВидОперации следующий код приводит к ошибке:


// Неправильный код!
Значение = ПеречислениеСсылка.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия;

Ошибка компиляции "Переменная не определена (ПеречислениеСсылка)" возникает по двум причинам:

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

Разберем два правильных способа решения этой задачи.

Решение 1.1: Передача строкового представления значения

Самый простой и распространенный метод — передать в приемник не ссылку на перечисление, а строку, содержащую его имя. Механизм загрузки данных в "Конвертации данных" достаточно "умен", чтобы самостоятельно преобразовать строку в нужную ссылку, если тип приемника — перечисление.

Порядок действий:

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

Посмотрим на пример кода:


// Обработчик "ПередВыгрузкой" для ПКС "ВидОперации"
Значение = "ПокупкаКомиссия";

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

При загрузке данных в базу-приемник обработка обмена увидит, что для реквизита типа "ПеречислениеСсылка" пришла строка, и попытается найти значение перечисления с таким именем. В большинстве случаев это работает безотказно.

Решение 1.2: Установка значения в обработчике "После загрузки"

Альтернативный подход — ничего не передавать из источника, а установить нужное значение уже в базе-приемнике, после того как объект будет создан.

Порядок действий:

  1. Убедитесь, что в ПКС для реквизита ВидОперации не задан источник и нет обработчиков, которые заполняют Значение при выгрузке.
  2. Откройте правило конвертации объекта (ПКО) для документа ПоступлениеТоваровУслуг.
  3. Найдите обработчик события ПослеЗагрузки. Этот код выполняется в базе-приемнике после того, как объект был создан и его реквизиты заполнены по правилам.
  4. Напишите код, который напрямую присваивает нужное значение реквизиту.

Пример кода для обработчика ПослеЗагрузки в ПКО:


// Обработчик "ПослеЗагрузки" для ПКО "ПоступлениеТоваровУслуг"
Объект.ВидОперации = Перечисления.ВидыОперацийПоступлениеТоваровУслуг.ПокупкаКомиссия;

Этот метод более надежен, так как не зависит от механизма автопреобразования строк и работает напрямую с объектами приемника. Он особенно полезен, если логика установки значения сложнее, чем просто присвоение константы.

Задача 2: Установка ссылки на элемент Справочника

Ситуация усложняется, если нужно установить ссылку не на перечисление, а на элемент справочника. Например, для всех загружаемых документов нужно установить ответственного сотрудника — "Иванов И.И." из справочника "Пользователи", при этом в источнике данных об ответственном нет.

Простой трюк со строкой, как в случае с перечислением, Значение = "Иванов И.И.", напрямую не сработает без дополнительных настроек, так как система не знает, по какому критерию искать элемент справочника.

Решение 2.1: Использование полей поиска

Этот метод похож на работу со строками для перечислений, но требует настройки правила конвертации для самого справочника.

Порядок действий:

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

Теперь при загрузке система получит строку "Иванов И.И.", перейдет к ПКО для справочника "Пользователи" и попытается найти в базе-приемнике элемент с таким наименованием. Если найдет — подставит ссылку на него. Если не найдет, то в зависимости от настроек ПКО может создать новый элемент или выдать ошибку.

Решение 2.2: Установка ссылки в обработчике "После загрузки" (надежный способ)

Этот метод аналогичен тому, что мы рассматривали для перечислений, и является более надежным, так как исключает проблемы с дублями наименований.

Порядок действий:

  1. В ПКО для документа (например, ПоступлениеТоваровУслуг) перейдите в обработчик ПослеЗагрузки.
  2. Напишите код, который находит нужный элемент справочника и присваивает ссылку на него реквизиту загруженного объекта.

Пример кода:


// Обработчик "ПослеЗагрузки" для ПКО документа
НайденныйПользователь = Справочники.Пользователи.НайтиПоНаименованию("Иванов И.И.");

Если НЕ НайденныйПользователь.Пустая() Тогда
    Объект.Ответственный = НайденныйПользователь;
Иначе
    // Здесь можно добавить логику обработки, если пользователь не найден:
    // например, записать сообщение в лог или не заполнять реквизит.
    Сообщить("Пользователь 'Иванов И.И.' не найден в базе-приемнике!");
КонецЕсли;

Решение 2.3: Использование параметров (рекомендуется для массовых операций)

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

Порядок действий:

  1. В правилах конвертации на вкладке "Параметры" создайте новый параметр, например, ПользовательПоУмолчанию. Тип можно не указывать.
  2. При запуске обмена (в обработке "Универсальный обмен данными в формате XML") на вкладке "Параметры выгрузки" появится ваш параметр. Перед выгрузкой вы сможете выбрать нужного пользователя из справочника базы-источника или приемника (в зависимости от того, где запускаете обмен и как настроили).
  3. В ПКО документа, в обработчике ПослеЗагрузки, используйте значение из параметра:

// Обработчик "ПослеЗагрузки" с использованием параметра
Если Параметры.Свойство("ПользовательПоУмолчанию") И ЗначениеЗаполнено(Параметры.ПользовательПоУмолчанию) Тогда
    Объект.Ответственный = Параметры.ПользовательПоУмолчанию;
КонецЕсли;

Этот метод — самый профессиональный и гибкий. Он позволяет менять "значение по умолчанию" без необходимости редактировать и заново выгружать правила конвертации.

← На главную