Как исключить автоматическую регистрацию всех документов при первоначальной настройке узла обмена в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При настройке синхронизации данных между информационными базами 1С администраторы и разработчики часто сталкиваются с неприятной ситуацией: сразу после создания нового узла обмена в режиме «1С:Предприятие» система автоматически пытается зарегистрировать к отправке абсолютно все исторические документы, которые есть в базе данных. Если информационная база ведется давно, этот объем данных может исчисляться сотнями тысяч или миллионами документов. Как результат — создание огромных файлов выгрузки, зависание системы, переполнение диска и блокировки базы данных.

В этой статье мы подробно разберем, почему возникает эффект «регистрации всего», как оперативно решить проблему в ручном режиме (устранить симптом) и как правильно настроить обмен на уровне архитектуры 1С (вылечить саму «болезнь»).

Выясним причину: почему платформа 1С регистрирует все данные?

Автоматическая регистрация всех существующих в базе объектов при создании нового узла обмена — это штатное поведение платформы 1С. Рассмотрим основные факторы, которые его вызывают:

  1. Свойство «Авторегистрация» в конфигураторе: Если открыть состав плана обмена в конфигураторе, для каждого входящего в него объекта (справочника, документа, регистра) установлено свойство Авторегистрация. По умолчанию там часто стоит значение «Разрешить». Это значит, что при создании любого нового узла платформа автоматически ставит в очередь на выгрузку вообще все существующие в базе данных элементы этого типа.
  2. Программный вызов полной регистрации в коде: Очень часто при создании узла в кодовой базе конфигурации или в сторонних обработках выполняется вызов метода ПланыОбмена.ЗарегистрироватьИзменения(Узел) без указания конкретного объекта или массива ссылок. Такой вызов безусловно регистрирует абсолютно все данные, входящие в состав плана обмена, для данного узла.

Давайте рассмотрим несколько способов решения этой проблемы — от быстрых ручных манипуляций в пользовательском режиме до правильной архитектурной настройки обмена в конфигураторе.

Способ 1. Быстрое решение проблемы вручную (через типовую обработку)

Если узел обмена уже создан, и система автоматически зарегистрировала миллионы ненужных старых документов, мы можем быстро исправить ситуацию с помощью стандартных инструментов платформы. Для этого нам понадобится типовая обработка «Регистрация изменений для обмена данными» (в современных конфигурациях на БСП она доступна прямо из меню настроек синхронизации или через функции для технического специалиста).

Проанализируем пошагово процесс ручной корректировки:

  1. Открываем обработку Регистрация изменений для обмена и в поле выбора узла указываем наш только что созданный узел обмена. Мы увидим дерево объектов, напротив которых будут стоять огромные цифры — количество зарегистрированных элементов.
  2. Выделяем самый верхний (корневой) элемент дерева узла, нажимаем кнопку «Очистить» (или «Снять регистрацию») и выбираем вариант «Для всех объектов». После этого очередь регистрации полностью очистится, и узел станет абсолютно «пустым».
  3. Теперь нам необходимо зарегистрировать только те документы, которые попадают в наш целевой период обмена. Вопреки распространенному мнению, современные версии этой обработки позволяют делать гибкие отборы. Нажимаем кнопку «Зарегистрировать изменения» и выбираем пункт «По отбору...» (или «Зарегистрировать объекты по отбору»).
  4. В появившемся окне настройки отбора платформы выбираем нужный тип документа, добавляем в табличную часть отбора поле Дата, указываем вид сравнения «Больше или равно» и задаем дату начала нашего периода (например, начало текущего года). После нажатия кнопки «ОК» система зарегистрирует только те документы, которые действительно необходимы для выгрузки.

Этот способ прост и эффективен в моменте, однако он является лишь «борьбой с симптомами». При создании следующего узла обмена вам придется повторять всю процедуру заново вручную. Рассмотрим более профессиональные варианты решения.

Способ 2. Архитектурное решение с использованием механизмов БСП

Если ваша конфигурация разработана на базе современных типовых решений 1С (таких как «ERP Управление предприятием», «Комплексная автоматизация», «Управление торговлей», «Бухгалтерия предприятия» и др.), в них используется Библиотека стандартных подсистем (БСП). В БСП эта проблема решена на системном уровне.

Рассмотрим, как это работает:

Способ 3. Использование Правил регистрации объектов (ПРО) в «Конвертации данных»

Если вы разрабатываете правила обмена самостоятельно с помощью конфигурации «Конвертация данных 2.1» (или 3.1), вы можете жестко зафиксировать период выгрузки документов на уровне Правил регистрации объектов (ПРО).

Посмотрим на пример реализации такого ограничения. В Конвертации данных для каждого правила регистрации документа мы можем прописать алгоритм в обработчике события Перед регистрацией объекта. Нам необходимо сравнить дату регистрируемого документа с нашей границей периода:


// Пример кода в обработчике "Перед регистрацией объекта" в КД
ДатаПредела = '20260101000000'; // Задаем дату начала периода обмена

Если Объект.Дата < ДатаПредела Тогда
    Отказ = Истина; // Отменяем регистрацию документа на узле
КонецЕсли;

После загрузки обновленных правил регистрации в вашу информационную базу система физически не сможет зарегистрировать ни один документ, созданный ранее указанной даты, даже при попытке сделать полную регистрацию изменений.

Способ 4. Программный метод инициализации узла (для самописных обменов)

Выясним, как правильно решить проблему программно, если вы создаете полностью самописный план обмена и не используете БСП. В этом случае категорически не рекомендуется использовать стандартный метод полной авторегистрации платформы.

Правильный алгоритм программного создания и первичной настройки узла выглядит следующим образом:

  1. В конфигураторе для всех объектов плана обмена устанавливаем свойство Авторегистрация в значение «Запретить». Это гарантирует, что при создании узла платформа не начнет бесконтрольно ставить данные в очередь.
  2. В программном коде, который отвечает за создание и первоначальную настройку узла, мы полностью отказываемся от вызова метода ПланыОбмена.ЗарегистрироватьИзменения(НовыйУзел) без параметров.
  3. Вместо этого мы пишем процедуру первоначального наполнения узла данными, которая с помощью запроса выбирает только актуальные документы за нужный период и регистрирует их точечно.

Рассмотрим подробнее пример кода такой процедуры:


Процедура ЗарегистрироватьДокументыЗаПериод(НовыйУзел, ДатаНачалаПериода) Экспорт
    
    // Создаем запрос для выборки документов за указанный период
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |   РеализацияТоваровУслуг.Ссылка КАК Ссылка
        |ИЗ
        |   Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        |ГДЕ
        |   РеализацияТоваровУслуг.Проведен = ИСТИНА
        |   И РеализацияТоваровУслуг.Дата >= &ДатаНачала";
        
    Запрос.УстановитьПараметр("ДатаНачала", ДатаНачалаПериода);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    // Блокируем транзакцию для оптимизации записи регистрации изменений
    НачатьТранзакцию();
    Попытка
        Пока Выборка.Следующий() Цикл
            // Регистрируем только те документы, которые вернул запрос
            ПланыОбмена.ЗарегистрироватьИзменения(НовыйУзел, Выборка.Ссылка);
        КонецЦикла;
        ЗафиксироватьТранзакцию();
    Исключение
        ОтменитьТранзакцию();
        ВызватьИсключение КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
    
КонецПроцедуры

Использование этого кода гарантирует, что в очередь отправки попадут только нужные, проведенные документы за строго определенный интервал времени. Это снизит первоначальную нагрузку на сервер 1С и СУБД до минимума, а первый сеанс синхронизации пройдет быстро и без ошибок.

← На главную