Как исправить ошибку «Поле объекта не обнаружено (ДополнительныеСвойства)» при обмене в 1С

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

При создании нового собственного плана обмена в конфигурациях на базе Библиотеки Стандартных Подсистем (БСП), таких как 1С:Бухгалтерия 3.0, разработчики часто сталкиваются с ситуацией, когда стандартный механизм обмена данными выдает ошибку при попытке проверить дату запрета загрузки:


{ОбщийМодуль.ОбменДаннымиСобытия.Модуль(3391)}: Поле объекта не обнаружено (ДополнительныеСвойства)
Если Не Отправитель.ДополнительныеСвойства.Свойство("НепринятыеПоДатеЗапрета") Тогда

Проанализируем причины возникновения этой проблемы и рассмотрим несколько вариантов ее решения.

Выясним причину ошибки

Разберем, почему возникает данное исключение в типовом коде общего модуля ОбменДаннымиСобытия:

  1. Особенность платформы 1С:Предприятие: В стандартные обработчики событий обмена данными платформа передает параметр Отправитель, который по умолчанию имеет тип ссылки ПланОбменаСсылка.<ИмяПланаОбмена>. У ссылочных типов платформы коллекция ДополнительныеСвойства отсутствует — она предусмотрена только для объектов (ПланОбменаОбъект, СправочникОбъект и т.д.), наборов записей и структур.
  2. Логика подсистемы БСП: Подписки на события обмена (например, процедуры модуля ОбменДаннымиСобытия) рассчитывают на то, что обмен выполняется в контексте БСП. При штатном обмене подсистема подменяет «сырую» ссылку на специальный контекстный объект или структуру, где инициализирована коллекция ДополнительныеСвойства.
  3. Нативный обмен в обход БСП: Если новый план обмена добавлен в состав типовых подписок на события, но сам обмен запускается напрямую через вызовы платформы (например, ПланыОбмена.ПрочитатьИзменения), типовые подписки все равно срабатывают. В них передается обычная ссылка, у которой платформа не может найти поле ДополнительныеСвойства.

Способ 1. Регистрация нового плана обмена в подсистеме БСП

Чтобы типовые процедуры загрузки и проверки дат запрета работали корректно, необходимо зарегистрировать созданный план обмена в инфраструктуре БСП:

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

Способ 2. Программная инициализация контекста обмена

Если для обмена используется собственный алгоритм считывания данных из файла или сообщения обмена, перед началом обработки документов необходимо программно инициализировать контекст обмена. Рассмотрим пример вызова процедуры инициализации БСП:


// Инициализируем контекст обмена для узла-отправителя
СтруктураКонтекста = Новый Структура;
ОбменДаннымиСервер.ИнициализироватьКонтекстОбмена(УзелОтправитель, СтруктураКонтекста);

Это позволит заполнить служебные параметры и избежать ошибок при вызове подписок на события записи загружаемых документов.

Способ 3. Ограничение выгрузки документов на стороне источника

Если требуется простая схема без глубокой интеграции собственного плана обмена в механизмы БСП, мы можем ограничить передачу закрытых периодов еще на этапе выгрузки или регистрации изменений:

  1. Добавим у плана обмена реквизит ДатаЗапрета или будем запрашивать дату запрета загрузки из регистра сведений Даты запрета изменения.
  2. При регистрации изменений или при формировании сообщения обмена проанализируем дату документа. Если документ попадает в закрытый период, исключаем его из выгрузки.

Такой подход исключает попадание старых документов в приемник и снимает необходимость обработки ошибок даты запрета при загрузке.

← На главную