При реализации автоматизированного обмена данными между конфигурациями «1С:Предприятие», особенно когда используется связка Универсальный обмен данными в формате XML и Конвертация данных 2.1, часто возникает задача оптимизации. Если регламентное задание запускается часто, оно может создавать «пустые» файлы обмена, в которых нет полезных данных, но присутствует заголовок XML. Это излишне нагружает дисковую подсистему, сеть и принимающую сторону. Чтобы этого избежать, нам необходимо научиться быстро и эффективно проверять наличие зарегистрированных изменений на конкретном узле плана обмена перед началом процесса выгрузки.
В этой статье мы подробно разберем несколько способов решения этой задачи: от стандартных методов платформы до оптимизированных запросов и использования функций Библиотеки стандартных подсистем (БСП).
Самый очевидный способ, который предоставляет платформа 1С — это использование метода ВыбратьИзменения объекта ПланыОбменаМенеджер. Этот метод предназначен для получения набора данных, которые были изменены и зарегистрированы для конкретного узла.
Рассмотрим ситуацию: у нас есть узел плана обмена с кодом "БП". Мы хотим понять, есть ли там хоть одна запись. Проанализируем программный код, который позволяет это сделать:
// Получаем ссылку на нужный узел плана обмена
Узел = ПланыОбмена.ВыгрузкаВБУХ.НайтиПоКоду("БП");
// Формируем выборку изменений.
// Вторым параметром передаем номер сообщения (необязательно для простой проверки)
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, Узел.НомерОтправленного + 1);
// Проверяем наличие данных
Если Выборка.Следующий() Тогда
Сообщить("Изменения есть, можно запускать выгрузку.");
Иначе
Сообщить("Изменений нет, пропускаем шаг.");
КонецЕсли;
Важный нюанс: у объекта выборки изменений нет метода Пустой() или свойства Количество(). Единственный способ узнать, содержит ли выборка данные — вызвать метод Следующий(). Если он возвращает Истина, значит, в базе есть как минимум один измененный объект.
Однако помните о критически важном моменте: если вы передаете в ВыбратьИзменения второй параметр (номер сообщения), система помечает все выбранные записи этим номером. Если после такой «проверки» вы не удалите регистрацию или не завершите обмен подтверждением, эти записи могут оказаться «заблокированными» для последующих выборок с другими номерами сообщений. Для простой проверки наличия изменений лучше вызывать метод без указания номера сообщения.
Если в вашем плане обмена зарегистрированы сотни тысяч объектов, метод ВыбратьИзменения может работать недостаточно быстро. Более производительный подход — использование языка запросов 1С или выполнение запросов через COM-подключение для обращения к виртуальным таблицам изменений.
Выясним причину эффективности этого метода: запрос обращается напрямую к таблице БД, не инициализируя сложные механизмы планов обмена. Рассмотрим пример запроса для проверки изменений по конкретному справочнику Номенклатура:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| НоменклатураИзменения.Узел КАК Узел
|ИЗ
| Справочник.Номенклатура.Изменения КАК НоменклатураИзменения
|ГДЕ
| НоменклатураИзменения.Узел = &Узел";
Запрос.УстановитьПараметр("Узел", СсылкаНаУзел);
РезультатЗапроса = Запрос.Выполнить();
Если НЕ РезультатЗапроса.Пустой() Тогда
// Изменения найдены
КонецЕсли;
Если в плане обмена участвует много типов объектов, такой запрос придется собирать динамически. Это сложнее в реализации, но работает максимально быстро в высоконагруженных системах.
Если ваша конфигурация разработана на основе Библиотеки стандартных подсистем (БСП), вам не нужно писать велосипеды. В составе БСП есть программный интерфейс, который уже оптимизирован для таких задач. Разберем использование функции общего модуля ОбменДаннымиСервер.
Для проверки наличия любых изменений для узла используйте следующий код:
// Метод возвращает Булево: Истина, если есть зарегистрированные изменения
ЕстьДанные = ОбменДаннымиСервер.ЕстьИзмененияДляУзла(УзелОбмена);
Если ЕстьДанные Тогда
// Выполняем выгрузку
КонецЕсли;
Внутри этой функции БСП реализует эффективную проверку, учитывая особенности платформы и состава плана обмена. Это наиболее предпочтительный вариант для современных конфигураций (ERP, КА, УТ 11, БП 3.0).
Проанализируем ситуацию, когда Выборка.Следующий() возвращает Истина, но выгружать фактически нечего. Такое бывает в двух случаях:
УдалениеОбъекта. Это запись о том, что элемент был удален из базы. Если ваша логика обмена не предполагает обработку удалений (хотя КД 2.1 обычно их обрабатывает), вы можете посчитать это ложным срабатыванием.Для корректной работы автоматики рекомендуется проверять тип данных в выборке:
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, НомерСообщения);
Пока Выборка.Следующий() Цикл
Данные = Выборка.Данные;
Если ТипЗнч(Данные) = Тип("УдалениеОбъекта") Тогда
// Обработка удаления
Иначе
// Обработка обычного объекта
КонецЕсли;
КонецЦикла;
В процессе обсуждения на профессиональных форумах часто поднимается вопрос о моральном устаревании технологии КД 2.1. Несмотря на надежность, формат XML достаточно громоздкий. Посмотрим, какие современные альтернативы существуют:
Подводя итог, отметим: для простой и быстрой проверки в самописных решениях лучше всего подходит метод ВыбратьИзменения с проверкой через Следующий(), а для сложных систем на базе типовых решений 1С — вызов функций БСП. Это обеспечит стабильную работу вашего обмена и отсутствие лишних пустых файлов в каталогах обмена.