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