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