Как правильно переносить и заполнять регистр «Дополнительные сведения» при синхронизации УТ 11 и БП 3.0?

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

При настройке правил обмена данными между конфигурациями 1С:Управление торговлей и 1С:Бухгалтерия предприятия разработчики часто сталкиваются с необходимостью переноса дополнительных реквизитов и сведений. При попытке перенести или дозаполнить регистр сведений ДополнительныеСведения через типовые обработчики правил конвертации объектов (ПКО) нередко возникает ошибка «Поле объекта не обнаружено (Свойство)». Разберем причины возникновения этой ошибки и детально рассмотрим работающие способы передачи дополнительных сведений.

Причины возникновения ошибки «Поле объекта не обнаружено (Свойство)»

Проанализируем механику работы правил конвертации данных (КД 2.x / БСП). Когда в обмене участвует регистр сведений, в обработчике события ПослеЗагрузкиОбъекта переменная Объект содержит не отдельную запись регистра, а коллекцию — РегистрСведенийНаборЗаписей.ДополнительныеСведения.

У набора записей отсутствуют реквизиты и измерения конкретной строки на верхнем уровне. Прямое обращение вида Объект.Свойство = ... вызывает ошибку платформы, так как свойство доступно только у строк внутри набора.

Также важно учитывать особенности подсистемы «Свойства» библиотеки стандартных подсистем (БСП):

  1. Дополнительные реквизиты хранятся непосредственно в табличной части ссылочного объекта (документа или справочника) с именем ДополнительныеРеквизиты.
  2. Дополнительные сведения хранятся отдельно от самого объекта в независимом регистре сведений ДополнительныеСведения.
  3. Для отображения дополнительного сведения в интерфейсе документа свойство из плана видов характеристик ДополнительныеРеквизитыИСведения обязательно должно быть включено в состав соответствующего набора в справочнике НаборыДополнительныхРеквизитовИСведений.

Способ 1. Установка значения внутри набора записей в ПКО регистра

Если обмен настроен через отдельное правило конвертации для регистра сведений ДополнительныеСведения, задать нужное значение свойства можно двумя путями.

Первый вариант — указать алгоритм заполнения в правиле конвертации свойства (ПКС) для измерения Свойство в обработчике ПередЗагрузкой или ПередВыгрузкой через предопределенную переменную Значение:


Значение = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Проект (Поступление (акты, накладные))");

Второй вариант — если требуется изменить измерение именно в обработчике ПослеЗагрузкиОбъекта правила конвертации набора записей, выполним обход всех строк набора циклом:


СвойствоСсылка = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Проект (Поступление (акты, накладные))");

Если ЗначениеЗаполнено(СвойствоСсылка) Тогда
    Для Каждого Запись Из Объект Цикл
        Запись.Свойство = СвойствоСсылка;
    КонецЦикла;
КонецЕсли;

Способ 2. Запись дополнительного сведения через параметры объекта документа

Часто передавать регистр как отдельный объект обмена избыточно. Удобнее передать значение дополнительного сведения в параметрах самого документа (например, ПоступлениеТоваровУслуг), а затем записать его в базу-приемник.

Разберем реализацию по шагам:

  1. В конфигурации-источнике в ПКО документа в обработчике ПриВыгрузке или ПередВыгрузкой помещаем значение в ПараметрыОбъекта.
  2. В конфигурации-приемнике выполняем запись в регистр сведений. Делать это рекомендуется в обработчике ПослеЗаписиОбъекта (а не ПослеЗагрузкиОбъекта), чтобы ссылка на документ уже гарантированно существовала и была сохранена в базе.

Посмотрим на пример безопасного кода для обработчика ПослеЗаписиОбъекта в ПКО документа:


// Проверяем наличие переданных параметров
Если ПараметрыОбъекта <> Неопределено Тогда

    ЗначениеПроекта = Неопределено;
    
    // Безопасно получаем значение параметра и проверяем его заполненность
    Если ПараметрыОбъекта.Свойство("Проект", ЗначениеПроекта) И ЗначениеЗаполнено(ЗначениеПроекта) Тогда
        
        СсылкаНаСвойство = ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("Проект (Поступление (акты, накладные))");
        
        Если ЗначениеЗаполнено(СсылкаНаСвойство) Тогда
            МенеджерЗаписи = РегистрыСведений.ДополнительныеСведения.СоздатьМенеджерЗаписи();
            МенеджерЗаписи.Объект = Объект.Ссылка;
            МенеджерЗаписи.Свойство = СсылкаНаСвойство;
            МенеджерЗаписи.Значение = ЗначениеПроекта;
            МенеджерЗаписи.Записать(Истина);
        КонецЕсли;
        
    КонецЕсли;

КонецЕсли;

Рекомендации по повышению надежности синхронизации

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

  1. Проверка заполненности параметров: простое условие ПараметрыОбъекта["Проект"] <> Неопределено может возвращать Истина даже для пустых строк и пустых ссылок. Всегда используйте функцию ЗначениеЗаполнено() для проверки фактического наличия данных.
  2. Поиск свойств: метод НайтиПоНаименованию() чувствителен к случайным пробелам и изменению названий пользователями. Если дополнительное сведение является предопределенным или создано разработчиком, надежнее сопоставлять его по уникальному идентификатору (GUID) или коду/имени для разработчиков.
  3. Проверка вхождения в набор свойств: убедитесь, что в базе-приемнике в справочнике НаборыДополнительныхРеквизитовИСведений для строки набора документа Поступление (акты, накладные) добавлена ссылка на нужное свойство. Иначе данные физически запишутся в регистр, но не будут видны пользователям в стандартной форме объекта.
← На главную