Как перенести реквизиты в ресурсы и измерения регистра накопления на большой базе 1С

Программист 1С:Управление торговлей Управленческий учет IT и автоматизация бизнеса
← На главную

В процессе эксплуатации высоконагруженных систем на базе 1С, таких как "Управление торговлей 11" или "ERP Управление предприятием", часто возникает ситуация, когда первоначальная архитектура регистров накопления перестает удовлетворять требованиям производительности. Одной из типичных проблем является хранение агрегируемых данных (сумм, количеств) в реквизитах, а не в ресурсах. Это приводит к тому, что данные становятся недоступны в виртуальных таблицах оборотов, а отчеты, вынужденные обращаться к физической таблице движений, работают крайне медленно.

Разберем подробно, как правильно перенести данные из реквизитов в ресурсы и измерения, особенно если речь идет о базе объемом более 600 Гб, где стандартные методы могут привести к длительному простою системы.

Почему данные нужно переносить в ресурсы?

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

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

Вариант 1. Стандартный перенос через объектную модель 1С

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

  1. Добавляем в конфигураторе новый ресурс (например, СуммаВВалютеНовая) и, если необходимо, новое измерение.
  2. Старым реквизитам присваиваем префикс Удалить_.
  3. Пишем обработку, которая будет порциями считывать наборы записей и копировать значения из старых полей в новые.

Пример программного кода для такого переноса:


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

Важный нюанс: на базе в 600 Гб этот метод "умрет" на этапе записи. Каждая транзакция по записи набора будет вызывать пересчет итогов и блокировки, а лог транзакций SQL разрастется до невероятных размеров.

Вариант 2. Оптимизированный метод для больших баз (SQL + Пересчет итогов)

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

Разберем по шагам:

  1. Подготовка метаданных: В конфигураторе добавляем новые ресурсы. Старые реквизиты пока не удаляем. Применяем изменения. Платформа создаст новые колонки в таблице _AccumRegXX (где XX — номер таблицы вашего регистра), заполненные значениями NULL или 0.
  2. Отключение итогов: Чтобы не тратить время на обновление таблиц итогов во время SQL-операции, отключаем их использование. РегистрыНакопления.ВыручкаИСебестоимостьПродаж.УстановитьИспользованиеИтогов(Ложь); Это действие очистит физические таблицы итогов в SQL-базе.
  3. SQL-Update: Выполняем прямой запрос к базе данных.
    
    UPDATE _AccumReg123 -- имя таблицы вашего регистра
    SET _Fld456RRef = _Fld789RRef, -- перенос ссылки (валюта)
        _Fld111 = _Fld222 -- перенос числа (сумма)
    
    Где _Fld456 — колонка нового ресурса, а _Fld789 — колонка старого реквизита. Операция на уровне SQL пройдет максимально быстро.
  4. Включение и пересчет итогов: Включаем использование итогов обратно. РегистрыНакопления.ВыручкаИСебестоимостьПродаж.УстановитьИспользованиеИтогов(Истина); Платформа увидит, что итогов нет, и начнет их полный пересчет на основании актуальных данных в основной таблице движений. Для базы 600 Гб это займет время, но это будет гарантированно быстрее и стабильнее, чем построчная перезапись через 1С.

Особенности добавления измерений

Рассмотрим ситуацию с добавлением измерений (например, ВалютаВзаиморасчетов). В отличие от ресурсов, измерения критически влияют на уникальность записей и производительность:

Риски и рекомендации при работе с УТ 11

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

Если вы просто перенесете данные в SQL, но не поправите программный код в конфигурации, при первом же перепроведении документа или запуске "Расчета себестоимости" ваши новые ресурсы обнулятся, так как типовой алгоритм 1С о них "не знает".

Рекомендованный порядок действий:

  1. Выполните замер производительности отчетов "до" изменений.
  2. Проверьте наличие свободного места на диске для логов SQL (минимум 20-30% от объема базы).
  3. Используйте механизм фоновой реструктуризации (доступен в платформе с версии 8.3.14), чтобы минимизировать время монопольной блокировки базы при изменении состава полей регистра.
  4. После завершения переноса данных обязательно удалите старые реквизиты, чтобы не хранить дублирующую информацию и не раздувать размер БД.

Таким образом, для крупной базы наиболее жизнеспособным сценарием является сочетание корректного изменения метаданных, прямого SQL-обновления колонок и полного пересчета итогов через метод УстановитьИспользованиеИтогов(). Это позволит достичь целей, поставленных экспертами по оптимизации (например, командой Гилева), и существенно ускорить работу управленческой отчетности.

← На главную