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