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