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