Как правильно отфильтровать документы при загрузке в КД 2.0?

Программист 1С v8.3 (Обычные формы) 1C:Бухгалтерия Бухгалтерский учет Торговля и дистрибуция
← На главную

В процессе обмена данными между конфигурациями часто возникает необходимость исключить загрузку определенных документов — например, помеченных на удаление или не относящихся к конкретной организации. Разберем, почему попытки прямого обращения к реквизитам объекта в обработчике ПередЗагрузкой приводят к ошибкам и как правильно реализовать логику фильтрации.

Почему возникают ошибки при проверке условий?

При использовании обработчика ПередЗагрузкой объект 1С еще не сформирован полностью. Система только начинает процесс чтения данных из XML-файла. Попытка обратиться к свойству Объект.ПометкаУдаления приводит к ошибке Значение не является значением объектного типа, так как парсер еще не дошел до заполнения этого реквизита. Важно помнить: на этом этапе объект еще не существует в памяти как полноценный объект базы данных.

Основные способы фильтрации данных

Для управления потоком загружаемых данных рассмотрим три основных подхода:

  1. Фильтрация на стороне выгрузки: Это наиболее правильный и производительный метод. Если вы можете изменить правила выгрузки в исходной базе, используйте обработчик ПередВыгрузкой для самого объекта. Это позволит избежать лишней нагрузки на сеть и сервер, так как ненужные данные даже не попадут в файл обмена.
  2. Использование параметра Отказ в обработчике ПослеЗагрузки: Если выгрузку изменить нельзя, можно отменить загрузку уже в принимающей базе. В обработчике ПослеЗагрузки объект уже полностью десериализован и доступен для анализа.
  3. Управление параметром НеЗамещатьОбъект: Если ваша задача — не перезаписывать существующие документы, используйте стандартные настройки правил или устанавливайте этот параметр программно.

Пример реализации фильтрации в ПослеЗагрузки

Если вам необходимо ограничить загрузку по организации, используйте следующий подход в обработчике ПослеЗагрузки. Обратите внимание, что мы анализируем уже готовый объект:


Если СокрЛП(Объект.Организация.Код) = "00-000001" Или СокрЛП(Объект.Организация.Код) = "RO-000004" Тогда    
    Отказ = Ложь;
Иначе
    Отказ = Истина;
КонецЕсли;

Однако помните, что установка Отказ = Истина в этом обработчике просто предотвратит запись объекта в базу. Это допустимый, но не самый оптимальный путь с точки зрения производительности.

Типичные ошибки при работе со ссылочными данными

При работе в ПослеЗагрузки часто возникают ошибки, связанные с типами данных. Например, при поиске элементов справочников важно корректно передавать результаты в реквизиты. Рассмотрим пример правильного поиска значения для табличной части:


// Неправильно: использование ПолучитьОбъект() для присвоения в реквизит ссылки
СпрВид = Справочники.ВидыОплатОрганизаций;
Для каждого СтрТЧ из Объект.Оплата Цикл        
    // Ищем элемент и сразу присваиваем найденную ссылку
    СтрТЧ.ВидОплаты = СпрВид.НайтиПоНаименованию("Сбер");  
КонецЦикла;

Важное примечание: метод ПолучитьОбъект() возвращает объект, который предназначен для записи или изменения в базе данных. Для заполнения ссылочных полей в табличных частях или реквизитах шапки достаточно присвоить найденную ссылку (результат методов НайтиПоНаименованию, НайтиПоКоду или НайтиПоРеквизиту). Если вы попытаетесь записать «объект» в «ссылку», система выдаст ошибку несоответствия типов.

Рекомендации по архитектуре обмена

Прежде чем внедрять фильтрацию на стороне загрузки, задайте себе вопрос: что произойдет с уже загруженными данными? Если вы просто перестанете грузить документы, которые ранее были загружены и теперь пометились на удаление, в вашей базе-приемнике они останутся «висеть» без обновлений.

Проанализируйте ситуацию: возможно, вместо того чтобы полностью блокировать загрузку, правильнее будет обновлять статус документа (например, устанавливать пометку на удаление), если он пришел с таким признаком из системы-источника. Это обеспечит актуальность данных и избавит от проблем с «зависшими» проводками.

Всегда используйте встроенную справку Конвертации данных для уточнения доступности параметра Отказ в конкретных событиях. Это лучший способ быстро найти ответ на вопрос, работает ли событие так, как вы ожидаете.

← На главную