При настройке обмена данными между конфигурациями 1С с использованием «Универсального формата» (EnterpriseData) часто возникает задача ограничить состав передаваемых данных. Типичный пример — необходимость запретить выгрузку или загрузку документов (например, УстановкаЦенНоменклатуры) ранее определенной даты. В этой статье мы подробно разберем, как реализовать такие ограничения на разных уровнях системы, начиная от стандартных настроек и заканчивая программным кодом в расширениях.
Прежде чем приступать к написанию кода, проанализируем, как именно данные попадают в канал обмена. В современных конфигурациях на базе БСП (Библиотека стандартных подсистем) процесс проходит через три основных фильтра:
Рассмотрим пошагово каждый из способов решения задачи.
Прежде чем редактировать МенеджерОбменаЧерезУниверсальныйФормат, проверим стандартные возможности. В большинстве типовых решений, таких как Управление торговлей 11, Бухгалтерия предприятия 3.0 или ERP, фильтрация по дате уже заложена в функционал.
Разберем, как это найти. Перейдем в раздел Администрирование — Синхронизация данных — Настройки синхронизации данных. Выберем нужную настройку и нажмем «Изменить правила выгрузки данных». В открывшемся окне, как правило, доступно поле «Дата начала выгрузки документов». Если установить там 01.01.2021, система автоматически отсечет все документы с более ранней датой на уровне платформенного механизма планов обмена.
Если стандартной настройки недостаточно (например, нужно ограничить только конкретный тип документа), рекомендуется использовать правила регистрации. Это наиболее «чистый» способ, так как он предотвращает саму постановку документа в очередь на выгрузку.
Выясним, как это работает. Правила регистрации представляют собой XML-файл, который можно отредактировать в конфигурации «Конвертация данных 3.0». Однако внести изменения можно и без снятия базы с поддержки:
ПередОбработкой или непосредственно в условии для документа УстановкаЦенНоменклатуры пропишем логику: Отказ = Объект.Дата < '20210101';.Этот метод хорош тем, что база не будет тратить ресурсы на попытку обработки старых документов.
Рассмотрим ситуацию, когда необходимо жестко закрепить логику в коде конфигурации. Для этого используется модуль МенеджерОбменаЧерезУниверсальныйФормат. В нем существуют специальные процедуры — обработчики событий для каждого типа объекта.
Для ограничения отправки (выгрузки) документов УстановкаЦенНоменклатуры нам потребуется процедура ПОД_Документ_УстановкаЦенНоменклатуры_Отправка_ПриОбработке. Проанализируем пример кода, который можно внедрить:
Процедура ПОД_Документ_УстановкаЦенНоменклатуры_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
// Проверяем дату документа
Если ДанныеИБ.Дата < '20210101' Тогда
// Устанавливаем Ложь, чтобы пропустить выгрузку этого объекта
ИспользованиеПКО.Документ_УстановкаЦенНоменклатуры_Отправка = Ложь;
Возврат;
КонецЕсли;
КонецПроцедуры
В данном коде ДанныеИБ — это структура или ссылка на объект в информационной базе, а ИспользованиеПКО — структура, управляющая тем, какие правила конвертации будут применены. Устанавливая свойство в Ложь, мы сообщаем системе, что данный конкретный документ выгружать не нужно.
Чтобы не снимать конфигурацию с поддержки, воспользуемся механизмом расширений. Это современный стандарт разработки в среде 1С. Посмотрим, как это реализовать:
МенеджерОбменаЧерезУниверсальныйФормат (или аналогичный в вашей конфигурации).&Вместо или &Перед.Пример реализации в расширении с использованием &Вместо:
&Вместо("ПОД_Документ_УстановкаЦенНоменклатуры_Отправка_ПриОбработке")
Процедура Расш1_ПОД_Документ_УстановкаЦенНоменклатуры_Отправка_ПриОбработке(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена)
// Сначала вызываем стандартную логику, если она необходима
// ПродолжитьВызов(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена);
// Добавляем наше условие
Если ДанныеИБ.Дата < Дата(2021, 1, 1) Тогда
ИспользованиеПКО.Документ_УстановкаЦенНоменклатуры_Отправка = Ложь;
Возврат;
КонецЕсли;
// Если дата корректна, вызываем основную логику (если не вызывали ранее)
ПродолжитьВызов(ДанныеИБ, ИспользованиеПКО, КомпонентыОбмена);
КонецПроцедуры
Важно различать направление потока данных. Если мы хотим ограничить прием данных в текущую базу (чтобы старые документы из другой системы не перезаписывали наши данные), код нужно писать в обработчиках ПКО (Правила Конвертации Объектов).
Проанализируем ситуацию загрузки. Нам понадобится обработчик ПКО_Документ_УстановкаЦенНоменклатуры_ПриКонвертацииДанныхXDTO. В нем мы анализируем входящие данные (структуру XDTO) и, если дата нам не подходит, прерываем процесс записи, устанавливая значение Получатель = Неопределено.
Часто программисты сталкиваются с тем, что код написан верно, но «старые» документы все равно продолжают уходить в другую базу. Выясним причину: это происходит потому, что объекты уже зарегистрированы в Плане обмена до того, как вы внесли изменения в код.
Для решения этой проблемы выполним следующие действия:
Документ.УстановкаЦенНоменклатуры.01.01.2021.После этого система начнет работать исключительно по новым правилам, и лишние данные не будут нагружать канал связи.
Для придания гибкости решению мы можем не «зашивать» дату 01.01.2021 жестко в код. Рассмотрим использование Параметров конвертации. В интерфейсе настройки синхронизации можно добавить дополнительные параметры, которые будут доступны в модуле менеджера обмена через структуру КомпонентыОбмена.ПараметрыКонвертации. Это позволит администратору менять дату ограничения прямо в режиме «1С:Предприятие» без вызова программиста.
Таким образом, мы рассмотрели комплексный подход к ограничению обмена данными. Выбор метода зависит от ваших задач: для разового ограничения достаточно интерфейсных настроек, для долгосрочной кастомизации лучше использовать расширения и правила регистрации.