Как свернуть базу 1С:Розница 2.2 с РИБ и избежать ошибки памяти?

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

Рассмотрим распространенную и крайне болезненную проблему, с которой сталкиваются администраторы и разработчики при попытке свернуть распределенную информационную базу (РИБ) в конфигурации «1С:Розница 2.2». При ведении учета в течение нескольких лет объем базы данных на торговых точках разрастается до критических размеров. Назревает необходимость проведения свертки.

Однако стандартный механизм свертки в связке с активным РИБ часто преподносит неприятный сюрприз: при первой же попытке синхронизации после установки даты свертки центральная база намертво зависает, а через некоторое время аварийно завершает работу с системным сообщением «Недостаточно памяти» (Out of memory). Выясним причину этого поведения платформы и разберем по шагам полностью безопасный, эффективный алгоритм решения этой проблемы.

Почему возникает «ошибка памяти» и зависание обмена?

Проанализируем техническую сторону процесса. Когда мы запускаем штатную свертку в центральной базе (ЦБ), система производит колоссальный объем вычислений:

  1. Создаются документы ввода остатков на выбранную дату свертки.
  2. Документы, созданные ранее даты свертки, помечаются на удаление.
  3. Платформа 1С автоматически регистрирует изменения для всех этих объектов в планах обмена для каждого подчиненного узла (магазина).

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

Опасности «ручного» пути через Excel

Некоторые специалисты на форумах предлагают отказаться от штатной свертки и пойти по пути создания «чистой» базы данных, куда вручную или с помощью обработок (например, через загрузку/выгрузку в Excel) переносятся остатки и справочники. Проанализируем риски такого подхода:

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

Пошаговый алгоритм безопасной свертки базы РИБ

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

Шаг 1. Фиксация состояния и резервное копирование

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

  1. Убедимся, что все магазины закрыли кассовые смены и провели полную синхронизацию с центральной базой.
  2. Убедимся, что в центральной базе приняты и проведены все документы со всех подчиненных узлов.
  3. Обязательно создадим резервные копии всех информационных баз: как центральной базы, так и баз всех торговых точек. Это критически важно на случай непредвиденных сбоев.

Шаг 2. Выполнение свертки в центральной базе

Запускаем процедуру свертки в центральной базе на выбранную дату (например, 01.07.2019) через стандартную обработку «Свертка информационной базы». После успешного завершения процедуры в ЦБ появятся документы ввода остатков, а старые документы будут помечены на удаление.

Внимание! После завершения свертки в ЦБ ни в коем случае не запускайте синхронизацию данных! Если запустить обмен сейчас, база зависнет из-за регистрации миллионов удалений.

Шаг 3. Полное снятие регистрации изменений (Главный секрет успеха)

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

  1. В центральной базе откроем обработку «Регистрация изменений для обмена» (ее можно вызвать через меню «Функции для технического специалиста» или через стандартную обработку в составе БСП).
  2. Выберем поочередно каждый узел наших магазинов.
  3. Выполним команду полного удаления (очистки) регистрации для всех объектов обмена.

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


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

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

Шаг 4. Настройка даты обмена и генерация новых начальных образов

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

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

Совет по оптимизации: Процесс создания начального образа РИБ крайне требователен к дисковой подсистеме и процессору. Если ваша ЦБ работает в файловом режиме, скопируйте ее временно на компьютер со скоростным NVMe SSD-накопителем и мощным процессором, сформируйте все образы там, а затем верните базу назад.

Шаг 5. Запуск новых баз на торговых точках

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

  1. Переносим полученные файлы начальных образов (файлы 1Cv8.1CD для файловых баз) на торговые точки.
  2. Заменяем старые рабочие базы магазинов новыми файлами образов (старые базы точек предварительно сохраняем в архив!).
  3. Запускаем 1С на торговых точках. Так как мы использовали механизм РИБ, все настройки торгового оборудования, касс, пользователей и UUID объектов полностью сохранены и работоспособны.
  4. Выполняем первый тестовый обмен. Он пройдет за считанные секунды, так как объем передаваемых пакетов будет равен нулю благодаря очищенным номерам сообщений и отсутствию старого зарегистрированного мусора.

Важные особенности свертки в «1С:Розница»

Рассмотрим специфические нюансы работы конфигурации «1С:Розница», о которых необходимо помнить при свертке:

Проанализировав данную методику, мы видим, что использование штатных механизмов платформы в сочетании с ручным контролем планов обмена позволяет быстро, безопасно и без колоссальных затрат времени развернуть обновленную и быструю систему РИБ на базе «1С:Розница 2.2».

← На главную