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