Как заполнить реквизит-перечисление значением по умолчанию при переносе данных из Торговля и Склад 7.7 в Управление торговлей 11 через КД 2.0?

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

При переносе данных из конфигураций 1С 7.7 (например, «Торговля и Склад 7.7») в 1С 8.3 («Управление торговлей 11») с помощью правил Конвертации данных 2.0 (КД 2.0) часто возникает необходимость заполнить реквизит приемника значением по умолчанию, если в источнике соответствующее поле отсутствует.

Рассмотрим типовую ситуацию: выполняется перенос из объекта источника Номенклатура в справочник приемника СертификатыНоменклатуры. В приемнике есть реквизит Статус с типом ПеречислениеСсылка.СтатусыСертификатовНоменклатуры. При выгрузке необходимо установить этому реквизиту значение Действующий.

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

Причина 1. Ошибка на этапе выгрузки из 7.7: «Ошибка получения значения свойства объекта»

Проанализируем первую ошибку. Если в ПКС (Правиле конвертации свойств) поле «Источник» оставить пустым, а поле «Приемник» заполнить значением Статус, платформа 1С 7.7 при выгрузке попытается автоматически прочитать у объекта-источника атрибут с именем приемника. Так как у номенклатуры в 7.7 нет реквизита Статус, возникает исключение:

Ошибка получения значения свойства объекта. Объект: ..., свойство: Статус.

Решение 1. Заполнение переменной Значение в обработчике ПередВыгрузкой

Чтобы платформа не пыталась обращаться к отсутствующему реквизиту источника, укажем значение для выгрузки явно в обработчике ПередВыгрузкой данного ПКС.

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

Значение = "Действующий";

При этом в правилах конвертации для перечисления должно быть сопоставлено строковое имя элемента Действующий с нужным значением перечисления приемника.

Альтернативный вариант — использовать текстовое выражение для платформы 8.x в том же обработчике ПередВыгрузкой:

Выражение = "Перечисления.СтатусыСертификатовНоменклатуры.Действующий";

В этом случае платформа сама передаст в XML-файл правильное значение перечисления для приемника.

Причина 2. Ошибка на этапе загрузки в УТ 11: «Реквизит недоступен для группы»

После исправления выгрузки может возникнуть вторая ошибка уже при загрузке данных в базу 1С:Управление торговлей 11:

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

Выясним причину этого поведения. В 1С:Предприятии 8 для иерархических справочников реквизиты назначаются только элементам (когда ЭтоГруппа = Ложь). Обработчик ПослеЗагрузки в КД 2.0 исполняется для всех загружаемых объектов ПКО — как для элементов, так и для групп (папок). Попытка установить реквизит для группы приводит к ошибке контекста.

Решение 2. Проверка иерархии в обработчике ПослеЗагрузки

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

Рассмотрим пример правильного кода в обработчике ПослеЗагрузки:


Если Не Объект.ЭтоГруппа Тогда
    Объект.Статус = Перечисления.СтатусыСертификатовНоменклатуры.Действующий;
КонецЕсли;

Если же заполнение происходит через ПКС (как описано в Решении 1), то для предотвращения выгрузки этого свойства у папок на стороне 7.7 в обработчике ПередВыгрузкой ПКС добавляем условие:


Если Источник.ЭтоГруппа() = 1 Тогда
    Выгрузить = Ложь;
Иначе
    Значение = "Действующий";
КонецЕсли;

Таким образом, сочетание проверки на группу и корректного присвоения значения в обработчике ПередВыгрузкой или ПослеЗагрузки позволяет полностью решить проблему и успешно выгрузить данные из 1С 7.7 в 1С:УТ 11.

← На главную