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

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

Свёртка крупной и непрерывно работающей базы 1С (работа в режиме 24/7) — одна из наиболее сложных задач администрирования и разработки. Стандартная процедура свёртки через создание отдельной копии, её очистку и последующую подмену рабочей базы сталкивается с серьёзной проблемой: если в рабочей базе непрерывно функционируют другие планы обмена (РИБ с филиалами, интеграции с сайтами, выгрузки в бухгалтерию или CRM), то за время проведения свёртки данные обмена разойдутся.

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

В чём заключается проблема рассинхронизации при свёртке на копии?

Проанализируем классическую схему свёртки через промежуточную базу:

  1. С рабочей базы снимается резервная копия или создаётся клон.
  2. Клон подключается к рабочей базе по специальному «Полному» плану обмена (для постоянной подгрузки новых документов, пока клон сворачивается).
  3. На клоне выполняется свёртка: формируются документы ввода остатков, удаляются движения и старые документы.
  4. После завершения свёртки планируется подменить рабочую базу данным клоном.

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

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

Вариант 1. Программная синхронизация очередей и счетчиков через 1С перед переключением

Рассмотрим порядок действий для программного переноса состояния очередей обмена без прямого вмешательства в структуру СУБД. Данный метод является наиболее безопасным с точки зрения целостности метаданных.

Разберем по шагам алгоритм финального переключения:

  1. Назначаем короткое технологическое окно (на 5–15 минут), в течение которого блокируем регламентные задания обмена в рабочей базе и работу пользователей.
  2. Передаем последний инкремент данных из рабочей базы в свернутую копию по «Полному» плану обмена.
  3. Запускаем служебную обработку в рабочей базе, которая сохраняет текущее состояние счетчиков узлов и списки зарегистрированных изменений во внешний файл (например, JSON или XML).
  4. Загружаем сохраненные данные в свернутую базу: актуализируем номера пакетов и восстанавливаем регистрацию объектов.

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


// Выполняется в рабочей базе для сохранения состояния узла
Функция ПолучитьПараметрыУзла(УзелОбмена) Экспорт
    Результат = Новый Структура;
    Результат.Вставить("НомерОтправленного", УзелОбмена.НомерОтправленного);
    Результат.Вставить("НомерПринятого", УзелОбмена.НомерПринятого);
    Результат.Вставить("Код", УзелОбмена.Код);
    Возврат Результат;
КонецФункции

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

Для переноса очереди изменений используем методы менеджера планов обмена ПланыОбмена.ВыбратьИзменения() в источнике и ПланыОбмена.ЗарегистрироватьИзменения() в приёмнике:


// Восстановление регистрации конкретного массива ссылок в целевой свернутой базе
Процедура ВосстановитьРегистрациюВБазе(УзелСсылка, МассивСсылок) Экспорт
    Для Каждого Ссылка Из МассивСсылок Цикл
        ПланыОбмена.ЗарегистрироватьИзменения(УзелСсылка, Ссылка);
    КонецЦикла;
КонецПроцедуры

Вариант 2. Перенос таблиц регистрации изменений на уровне СУБД (SQL)

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

Проанализируем внутреннее устройство таблиц обмена в Microsoft SQL Server / PostgreSQL. Платформа 1С создает для каждого объекта метаданных, входящего в состав плана обмена, специальную таблицу изменений с префиксом _ChangeRec* (например, _DocumentChngR*, _ReferenceChngR*, _AccumRgChngR*).

Разберем последовательность действий для переноса таблиц через SQL:

  1. Останавливаем фоновые задания обмена на обеих базах.
  2. Определяем имена физических таблиц СУБД с помощью вызова функции ПолучитьСтруктуруХраненияБазыДанных() в 1С:

ТаблицаСтруктуры = ПолучитьСтруктуруХраненияБазыДанных();
// Отбираем записи, где ИмяТаблицыХранения содержит информацию о регистрации изменений
Для Каждого Строка Из ТаблицаСтруктуры Цикл
    Если Строка.Назначение = "ТаблицаИзменений" Тогда
        // Строка.ИмяТаблицыХранения содержит реальное имя таблицы в SQL
    КонецЕсли;
КонецЦикла;
  1. В целевой (свернутой) базе очищаем таблицы регистрации и копируем их содержимое из рабочей базы прямым SQL-запросом:

-- Пример для MS SQL Server (между базами на одном сервере)
TRUNCATE TABLE [Base_Copy].[dbo].[_DocumentChngR1234];

INSERT INTO [Base_Copy].[dbo].[_DocumentChngR1234] 
SELECT * FROM [Base_Prod].[dbo].[_DocumentChngR1234];
  1. Аналогичным образом переносим значения полей _SentNo (НомерОтправленного) и _RcvdNo (НомерПринятого) из таблицы узлов _Node*.

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

Вариант 3. Сброс счетчиков пакетов и повторная инициализация обмена

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

Рассмотрим особенности этого подхода:

  1. В свернутой копии и во всех подчиненных узлах номера сообщений принудительно обнуляются:
    
    УзелОбъект = УзелСсылка.ПолучитьОбъект();
    УзелОбъект.НомерОтправленного = 0;
    УзелОбъект.НомерПринятого = 0;
    УзелОбъект.ОбменДанными.Загрузка = Истина;
    УзелОбъект.Записать();
    
  2. В этом случае следующий пакет будет принят базой-получателем независимо от того, какой номер был у предыдущего пакета, так как проверка непрерывности нумерации начинается заново.
  3. После сброса счетчиков вызывается полная или выборочная регистрация изменений за период проведения свёртки через ПланыОбмена.ЗарегистрироватьИзменения().

Предотвращение критических ошибок при проведении свёртки

Выясним, какие меры предосторожности необходимо предпринять в процессе свёртки копии, чтобы не повредить интеграционную инфраструктуру:

  1. Отключение авторегистрации при создании документов свёртки: Все документы ввода остатков и корректировки регистров должны записываться строго в режиме загрузки: ДокументОбъект.ОбменДанными.Загрузка = Истина. Это предотвращает автоматическое попадание технических документов свёртки в таблицы регистрации изменений сторонних узлов.
  2. Очистка «мусорной» регистрации: После завершения формирования остатков в свернутой базе необходимо вызвать очистку регистрации для всех узлов по документам свёртки:
    
    // Очищаем регистрацию для документов ввода остатков по всем планам обмена
    ПланыОбмена.УдалитьРегистрациюИзменений(УзелСсылка, Метаданные.Документы.ВводНачальныхОстатков);
    
  3. Удаление узла полного обмена перед переводом базы в статус основной: Вспомогательный «Полный» план обмена, связывавший рабочую базу и копию, после финальной синхронизации должен быть корректно отключен (удалена регистрация и снят признак подчиненности РИБ через УстановитьГлавныйУзел(Неопределено)).

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

← На главную