Как подставить фиксированное или вычисляемое значение в реквизит приемника при несовпадении типов в Конвертации данных 2.1

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

При переносе данных между базами 1С с помощью конфигурации Конвертация данных (редакция 2.1) часто возникают ситуации, когда структура реквизитов в источнике и приемнике различается. Например, в документе-источнике реквизит может иметь составной тип данных или отсутствовать вовсе, а в приемнике требуется перенаправить данные в другой реквизит (например, Касса_ККМ) или подставить конкретное предопределенное значение.

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

Вариант 1. Настройка ПКС без источника с подстановкой значения

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

Разберем по шагам алгоритм настройки:

  1. В Правиле конвертации объектов (ПКО) создаем новое правило конвертации свойств (ПКС).
  2. Поле Источник оставляем пустым, а в поле Приемник выбираем нужный реквизит (например, Касса_ККМ).
  3. Если реквизит приемника является ссылочным (например, справочник Кассы), указываем соответствующее ПКО для этого справочника.
  4. Открываем обработчик события Перед выгрузкой данного ПКС и задаем значение поиска.

Если мы знаем код или наименование элемента в базе-приемнике, передаем ключевое значение в служебную переменную Значение:


// Обработчик "Перед выгрузкой" в ПКС для реквизита Касса_ККМ
// Передаем код элемента, по которому ПКО приемника найдет объект
Значение = "А00000092";

Если требуется выполнить поиск элемента через алгоритм или выражение в приемнике, можно воспользоваться переменной Выражение:


// Обработчик "Перед выгрузкой" в ПКС
Выражение = "Справочники.Кассы.НайтиПоКоду(""А00000092"")";

Вариант 2. Передача значения через параметры объекта

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

Рассмотрим последовательность действий:

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

// Задаем значение, которое будет передано в параметры
Значение = "А00000092";

На стороне базы-приемника переданный параметр будет доступен в обработчике После загрузки в составе соответствия ПараметрыОбъекта. Проанализируем пример заполнения реквизита:


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

Вариант 3. Заполнение реквизита в обработчике После загрузки

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


// Обработчик "После загрузки" в ПКО документа
Объект.Касса_ККМ = Справочники.Кассы.НайтиПоКоду("А00000092");

Работа с составными типами данных в источнике

Если исходный реквизит имеет составной тип (например, может содержать ссылки на справочники Контрагенты, ФизическиеЛица или Субконто), а выбор правила конвертации зависит от фактического типа выгружаемого значения, логику выбора ПКО следует прописать в обработчике Перед выгрузкой реквизита.

Посмотрим на пример динамического выбора правила конвертации:


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

Важные особенности и рекомендации по отладке

При настройке обмена важно учитывать следующую специфику платформы 1С и Конвертации данных:

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