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