Почему центральный узел РИБ в 1С:Розница выгружает файл огромного размера при каждом обмене?

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

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

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

Как работает цикл подтверждения (квитирования) в РИБ

Для того чтобы понять природу бесконечной выгрузки, проанализируем базовый транзакционный механизм, который платформа 1С использует для минимизации передаваемого трафика. Этот механизм называется квитированием (или подтверждением доставки) и работает по строгому замкнутому циклу:

  1. Регистрация изменений и выгрузка: Когда в центральной базе создается или изменяется любой объект (документ, элемент справочника, запись регистра), платформа фиксирует это событие в специальных таблицах регистрации изменений. При старте обмена система формирует XML-файл, присваивает ему очередной порядковый номер (например, сообщение №150) и привязывает этот номер ко всем выгружаемым объектам.
  2. Получение данных периферийной базой: Периферийный узел считывает этот файл. Если чтение и запись в базу проходят успешно, периферийная база фиксирует у себя: «Последний успешно принятый пакет от Центра имеет номер 150».
  3. Отправка подтверждения: При формировании ответного файла обмена из периферии в заголовок XML-документа записывается специальный служебный тег ConfirmationMessageNo со значением 150.
  4. Очистка регистрации в Центре: Центральный узел считывает ответный файл от периферии, находит в заголовке подтверждение для сообщения №150 и только после этого физически удаляет из своих таблиц регистрации изменений все записи с номерами пакетов, меньшими или равными 150.

Если этот цикл разрывается на любом из этапов, центральный узел считает, что периферийная база так и не получила изменения №150. Соответственно, при следующем сеансе связи центральная база обязана повторно выгрузить все эти данные, что и приводит к зацикливанию выгрузки файла размером в 4 ГБ.

Причина 1: Сбой номеров сообщений после ручного пересоздания узла

Рассмотрим ситуацию, с которой столкнулся автор темы. Из-за сбоя обновления периферийная база была удалена в центральном узле и создана заново. При создании нового узла "с нуля" внутренние счетчики сообщений обнулились.

Если центральная база ожидает от периферийной подтверждения пакета №150, а вновь созданная периферийная база шлет в заголовке сообщения номер подтверждения 0 (так как для нее это первый обмен), центральная база игнорирует это подтверждение. Регистрация изменений в центре не очищается, и все накопленные за годы работы данные продолжают выгружаться при каждой итерации.

Для решения этой проблемы нам необходимо принудительно синхронизировать номера сообщений в обеих базах. Выполним это по шагам:

  1. В центральной базе перейдем в раздел Администрирование — Синхронизация данных — Настройки синхронизации.
  2. Выберем нужный узел обмена, нажмем правой кнопкой мыши и откроем форму «Состав отправляемых данных».
  3. Найдем кнопку «Редактировать номера сообщений» (в некоторых версиях интерфейса этот пункт доступен через меню "Еще").
  4. Проанализируем текущие номера. Нам нужно добиться зеркального соответствия показателей:
    • В Центральной базе: Номер отправленного = X, Номер принятого = Y.
    • В Периферийной базе: Номер отправленного = Y, Номер принятого = X.

Если интерактивно изменить номера не получается или база работает в режиме, ограничивающем доступ к этим реквизитам, мы можем воспользоваться программным кодом. Запустим внешнюю обработку или воспользуемся групповой обработкой объектов, выполнив следующий код на стороне центральной базы:


// Корректировка номеров сообщений узла обмена программно
УзелОбъект = СсылкаНаУзелРИБ.ПолучитьОбъект();
УзелОбъект.НомерОтправленного = 1; // Устанавливаем начальное значение
УзелОбъект.НомерПринятого = 1;
УзелОбъект.Записать();

После этого аналогичные действия (со значениями 1 и 1) необходимо проделать на стороне периферийной базы, чтобы полностью синхронизировать отправку и прием с чистого листа.

Причина 2: Проблемы синхронизации через облачные диски (Google Диск, Яндекс.Диск)

Когда обмен настроен через файловый каталог, синхронизируемый сторонним облачным клиентом (например, Google Диск), критическим фактором становится время загрузки тяжелых файлов в облако.

Проанализируем стандартный сценарий возникновения ошибки при объеме данных 4 ГБ:

  1. Центральная база выгружает файл обмена размером 4 ГБ в локальную папку Google Диска.
  2. Утилита синхронизации Google Диска начинает медленно загружать этот гигантский файл на сервера. На это может уйти от 30 минут до нескольких часов в зависимости от скорости интернет-канала.
  3. В это время на периферийном компьютере запускается регламентное задание обмена. Оно не видит новый файл (так как он еще не загрузился в облако) или начинает читать недокачанный временный файл.
  4. В результате периферийная база забирает старые данные, формирует ответный файл со старым номером подтверждения. Центральный узел, получив этот ответ, не очищает таблицы регистрации изменений, так как актуальный номер подтверждения им не получен.

Для проверки этой гипотезы временно исключим влияние облачного хранилища. Настроим синхронизацию через локальный каталог на жестком диске или физический USB-накопитель. Выполним полный цикл обмена вручную, перенося файлы на флешке. Если размер выгружаемого файла из центра резко снизится с 4 ГБ до нескольких килобайт/мегабайт, значит, проблема заключалась исключительно в сетевых задержках облачного клиента.

Причина 3: Ограничения 32-битной платформы и нехватка оперативной памяти

Чтение и запись XML-файла размером 4 ГБ — это ресурсоемкая операция, требующая значительного объема оперативной памяти. Если на сервере или локальном компьютере установлена 32-разрядная версия платформы 1С:Предприятие, процесс 1cv8.exe физически не может адресовать более 2-4 ГБ оперативной памяти.

В процессе загрузки такого тяжелого пакета транзакция может аварийно завершиться на стороне СУБД или файловой системы из-за ошибки "Out of memory". При этом некоторые прикладные объекты (например, документы поступлений или чеки) могут физически успеть записаться в базу данных до падения системы, что создает у пользователя ложную иллюзию успешного обмена. Однако финальная транзакция записи номера принятого сообщения в плане обмена откатывается назад. Как результат — при следующем сеансе связи центральная база вновь инициирует выгрузку всего объема данных.

Причина 4: Бесконечная авторегистрация и фоновые процессы обновлений

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

Служебные алгоритмы конфигурации 1С:Розница в фоновом режиме перезаписывают старые документы и регистры сведений (например, ИнформативныеОстаткиПоМагазинам или данные штрихкодов), что лавинообразно регистрирует их к отправке в РИБ. В таком случае файл обмена будет весить 4 ГБ не из-за ошибки квитирования, а из-за того, что система действительно пытается отправить измененные фоновым обновлением объекты.

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

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

Если мы убедились, что все справочники, документы и остатки в центральной и периферийной базах полностью совпадают, а бесконечный цикл выгрузки файла 4 ГБ продолжается, наиболее эффективным решением будет принудительное обнуление регистрации изменений в центральном узле. Для выборочного или полного снятия объектов с регистрации без написания кода подойдёт обработка для отмены регистрации документов в плане обмена.

Для этого воспользуемся стандартным или программным методом очистки:

Метод 1: Использование стандартной обработки

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

Метод 2: Программная очистка через внешнюю обработку

Если объем зарегистрированных данных настолько велик, что стандартная интерактивная форма зависает или аварийно закрывается по нехватке памяти, выполним очистку с помощью следующего программного кода в контексте внешней обработки:


// Программная очистка регистрации изменений для выбранного узла
УзелОбмена = ПланыОбмена.ПоставитьИмяПланаОбмена.НайтиПоКоду("КодПериферийногоУзла");

Если ЗначениеЗаполнено(УзелОбмена) Тогда
    // Удаляем регистрацию абсолютно всех объектов для данного узла
    ПланыОбмена.УдалитьРегистрациюИзменений(УзелОбмена);
    Сообщить("Регистрация изменений успешно очищена для узла: " + УзелОбмена);
Иначе
    Сообщить("Указанный узел обмена не найден!");
КонецЕсли;

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

← На главную