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