В типовых механизмах обмена данными 1С, построенных на базе Библиотеки стандартных подсистем (БСП) и «Конвертации данных 2.1», регистрация документов для обмена обычно привязана к стандартному реквизиту Дата. Однако на практике часто возникают задачи, когда документ должен попадать в обмен не по основной дате, а по иному критерию. Например, когда документ ПриходныйКассовыйОрдер должен регистрироваться только в том случае, если его ДатаПробитияЧека входит в интервал синхронизации, независимо от даты самого документа.
В этой статье мы подробно разберем, как изменить это поведение, настроить правила регистрации и обойти ограничения стандартных механизмов БСП.
Прежде чем приступать к правке кода, разберем, как именно объект попадает в таблицу регистрации плана обмена. Существует два основных подхода:
Проанализируем ситуацию: если мы хотим регистрировать документ по спец-дате, нам нужно либо скорректировать ПР, либо вмешаться в процесс выгрузки. Рассмотрим наиболее правильный и производительный метод — настройку правил регистрации в «Конвертации данных 2.1».
Этот способ является наиболее корректным, так как он отсекает лишние данные еще на этапе записи объекта в базу, не перегружая таблицу регистрации. Выполним следующие шаги.
Шаг 1. Подготовка конфигураций и выгрузка правил
Рассмотрим процесс выгрузки необходимых данных для работы в КД 2.1. Нам понадобятся описания структур метаданных обеих баз и текущий пакет правил синхронизации.
MD8xExp.epf (идет в комплекте с КД 2.1) в обеих базах, чтобы получить файлы описания конфигураций.RegistrationRules.xml (правила регистрации) и ExchangeRules.xml (правила обмена).Шаг 2. Загрузка данных в «Конвертацию данных 2.1»
Запустим информационную базу КД 2.1 и загрузим туда наши структуры метаданных и правила регистрации. Перейдем в раздел «Правила регистрации объектов» и найдем нужное правило для нашего документа.
Шаг 3. Настройка обработчика «Перед обработкой»
Выясним причину, по которой стандартный фильтр нам не подходит. Стандартные правила БСП часто используют встроенный параметр ДатаНачалаВыгрузкиДокументов. Чтобы внедрить свою логику, нам нужно обратиться к обработчику «Перед обработкой» в правиле регистрации конкретного объекта.
Проанализируем пример кода, который нужно вставить в этот обработчик:
// 1. Получаем дату начала выгрузки из настроек узла плана обмена
// В БСП этот параметр обычно называется ДатаНачалаВыгрузкиДокументов
ДатаНачала = УзелОбмена.ДатаНачалаВыгрузкиДокументов;
// 2. Проверяем наличие нашего специфичного реквизита
Если ЗначениеЗаполнено(Объект.ДатаПробитияЧека) Тогда
// Если дата пробития чека меньше даты начала — отменяем регистрацию
Если Объект.ДатаПробитияЧека < ДатаНачала Тогда
Отказ = Истина;
КонецЕсли;
Иначе
// Решаем, что делать, если реквизит не заполнен.
// Например, если чека нет, мы можем вообще не передавать документ.
Отказ = Истина;
КонецЕсли;
Важный нюанс: В настройках правила регистрации на вкладке «Настройки» обязательно проверьте флаг «Использовать стандартный период». Если этот флаг включен, система может игнорировать ваш код и продолжать фильтровать объект по стандартному реквизиту Дата. Для реализации нашей задачи этот флаг следует отключить.
Если логика требует более сложного анализа (например, нужно проверить данные не только самого объекта, но и связанных регистров), рассмотрим использование обработчика «При обработке». В нем также доступен параметр Отказ.
Посмотрим на пример ситуации, когда дата регистрации хранится в дополнительных сведениях:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДополнительныеСведения.Значение КАК ДатаРегистрации
|ИЗ
| РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения
|ГДЕ
| ДополнительныеСведения.Объект = &Объект
| И ДополнительныеСведения.Свойство = &Свойство";
Запрос.УстановитьПараметр("Объект", Объект.Ссылка);
Запрос.УстановитьПараметр("Свойство", ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.НайтиПоНаименованию("ДатаАктуальности"));
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.ДатаРегистрации < УзелОбмена.ДатаНачалаВыгрузкиДокументов Тогда
Отказ = Истина;
КонецЕсли;
Иначе
// Если сведения не найдены, отказываемся от регистрации
Отказ = Истина;
КонецЕсли;
Если по каким-то причинам вы не можете или не хотите менять правила регистрации (например, из-за опасений нарушить работу других механизмов), существует альтернативный метод — фильтрация непосредственно при выгрузке. Это менее эффективно с точки зрения производительности (объект будет постоянно пытаться выгрузиться), но это «быстрое» решение.
В правилах обмена (ExchangeRules.xml) найдите Правило Конвертации Объекта (ПКО) для вашего документа. Перейдите в обработчик «Перед выгрузкой» и напишите:
ДатаНачала = Параметры.ДатаНачалаВыгрузки; // Имя параметра зависит от настроек правил
Если Объект.ДатаПробитияЧека < ДатаНачала Тогда
Отказ = Истина;
КонецЕсли;
В этом случае, когда база попытается отправить данные, обработчик установит Отказ = Истина. Объект не попадет в файл обмена, но при этом пометится в плане обмена как успешно переданный (регистрация снимется). Это предотвратит повторные бесполезные попытки выгрузки этого документа до его следующего изменения.
После того как мы внесли изменения в КД 2.1, выполним обратный процесс:
Проанализируем, как можно проверить работу наших правил, не запуская реальный обмен. Для этого можно использовать обработку «Регистрация изменений для обмена» (входит в состав БСП или консоль запросов).
Также в КД 2.1 есть возможность отладки обработчиков. Для этого при сохранении правил установите флаг «Режим отладки». Программа сформирует модуль, который можно вставить во внешнюю обработку и пройтись по шагам конфигуратором, проверяя, как вычисляется переменная Отказ для конкретных документов.
Разберем типичную ошибку: часто программисты забывают, что УзелОбмена в ПР — это не просто ссылка, а полноценный объект. Вы можете обращаться к любым его реквизитам. Если стандартного реквизита даты начала в плане обмена нет, вы можете добавить свой реквизит или использовать Константы для хранения периода среза данных.
Таким образом, мы рассмотрели комплексный подход к изменению логики регистрации. Использование обработчика «Перед обработкой» в правилах регистрации является «золотым стандартом» для подобных задач, обеспечивая чистоту таблицы регистрации и высокую скорость работы обмена.