В процессе сопровождения распределенных информационных баз (РИБ) или интеграций по планам обмена часто возникает задача полной перерегистрации данных. Например, когда необходимо принудительно выгрузить весь справочник ФизическиеЛица или Номенклатура на все периферийные узлы. Выполнение этой операции в цикле по каждому узлу и по каждому элементу — крайне неоптимальный путь, который приводит к длительным блокировкам базы данных и падению производительности.
В рамках этой статьи мы разберем наиболее эффективные способы решения этой задачи, начиная от чистого платформенного кода и заканчивая возможностями Библиотеки стандартных подсистем (БСП) и интерактивными инструментами администратора.
Для быстрой регистрации изменений в платформе 1С предусмотрен метод ПланыОбмена.ЗарегистрироватьИзменения(). Самая распространенная ошибка разработчиков — обходить все узлы плана обмена в цикле и вызывать этот метод для каждого узла отдельно. На самом деле платформа умеет делать это пакетно на уровне СУБД, что работает в десятки раз быстрее.
Рассмотрим правильный алгоритм работы:
Проанализируем программный код, реализующий эту задачу:
// 1. Получаем выборку узлов конкретного плана обмена (например, ПоМагазину)
ВыборкаУзлов = ПланыОбмена.ПоМагазину.Выбрать();
МассивУзлов = Новый Массив;
// 2. Наполняем массив получателями, исключая текущий узел
Пока ВыборкаУзлов.Следующий() Цикл
Если ВыборкаУзлов.Ссылка <> ПланыОбмена.ПоМагазину.ЭтотУзел() Тогда
МассивУзлов.Добавить(ВыборкаУзлов.Ссылка);
КонецЕсли;
КонецЦикла;
// 3. Регистрируем изменения для всего справочника "Физические лица" сразу для всех узлов
Если МассивУзлов.Количество() > 0 Тогда
ПланыОбмена.ЗарегистрироватьИзменения(МассивУзлов, Метаданные.Справочники.ФизическиеЛица);
Сообщить("Регистрация изменений успешно выполнена для " + МассивУзлов.Количество() + " узлов.");
КонецЕсли;
Важный нюанс работы платформы: если во второй параметр метода ЗарегистрироватьИзменения передать значение Неопределено вместо конкретных метаданных, система зарегистрирует абсолютно все типы данных (все справочники, документы и регистры, входящие в состав этого плана обмена) для переданного массива узлов.
Использование прямого платформенного метода, описанного выше, имеет один серьезный недостаток. В типовых конфигурациях (таких как «1С:Розница 2», «1С:Управление торговлей» или «1С:ERP») обмен данными редко идет «в лоб». Почти всегда настроены **Правила регистрации объектов (ПРО)**. Например, в магазин должны мигрировать только те физические лица, которые работают именно в этом магазине, или номенклатура только определенных групп.
Если вы примените метод ПланыОбмена.ЗарегистрироватьИзменения() напрямую, платформа проигнорирует все установленные фильтры БСП и запишет регистрацию на все узлы без разбора. Это приведет к критическому замусориванию периферийных баз избыточными данными.
Чтобы выполнить регистрацию корректно с учетом всех правил и ограничений, используйте программные интерфейсы БСП. Разберем основные методы:
// Метод БСП для регистрации данных с проверкой правил регистрации
// Позволяет зарегистрировать данные для конкретного узла с применением отборов
ОбменДаннымиСервер.ЗарегистрироватьДанныеДляНачальнойВыгрузки(УзелСсылка, Метаданные.Справочники.ФизическиеЛица);
Если необходимо зарегистрировать конкретный объект или массив объектов с проверкой прав и разрешений на выгрузку, используется следующий метод:
// Регистрация с проверкой разрешений выгрузки
ОбменДаннымиСобытия.ЗарегистрироватьИзмененияДанных(УзелСсылка, СсылкаНаОбъект, Истина);
Если вам, как администратору или внедренцу, нужно выполнить эту операцию разово, писать обработку или код в консоли не обязательно. В состав БСП входит стандартный инструмент — обработка «Регистрация изменений для обмена данными».
Выполним задачу по шагам через интерфейс системы:
При массовой регистрации изменений (особенно если справочник насчитывает сотни тысяч элементов) последующая выгрузка данных может полностью заблокировать работу пользователей в СУБД. Это происходит из-за того, что по умолчанию выгрузка может пытаться выполниться в рамках одной огромной транзакции.
Выясним, как управлять этим поведением в конфигурациях на базе БСП (например, «Розница 2»):
0, что означает выполнение всей операции в одной транзакции. Для больших объемов это гарантирует долгие транзакционные блокировки таблиц.100 или 500.ОбменДаннымиСервер.КоличествоЭлементовВТранзакцииВыгрузкиДанных().Использование пакетного метода регистрации изменений в сочетании с правильной настройкой транзакций БСП позволяет быстро, безопасно и без блокировок актуализировать данные на всех узлах распределенной системы. Для автоматизации этого процесса по расписанию поверх настроенных планов обмена применяется программа автоматического регулярного обмена данными.