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