Как оптимизировать регистры 1С под огромные объемы данных при поштучном учете маркировки и ЕГАИС?

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

При работе с поштучным учетом (будь то ЕГАИС, маркировка «Честный Знак» или другие государственные системы контроля) разработчики 1С часто сталкиваются с лавинообразным ростом базы данных. Ситуация, когда один регистр сведений разрастается до десятков гигабайт и начинает блокировать работу всей системы, блокируя проведение документов и работу ТСД (терминалов сбора данных), к сожалению, классическая.

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

В чем причина критического падения производительности?

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

При такой структуре база данных объемом в 50 Гб может содержать регистр размером 14 Гб. Главные причины деградации производительности здесь кроются в следующем:

  1. Строковые измерения большой длины. Хранение строки длиной 160 символов в качестве измерения регистра сведений — это архитектурная катастрофа для СУБД. На уровне базы данных (MS SQL Server или PostgreSQL) индексы строятся именно по измерениям. Индекс по строке в 160 символов занимает колоссальный объем оперативной памяти, глубина B-дерева индекса возрастает, из-за чего любой поиск (Index Seek) или сканирование (Index Scan) начинают сильно нагружать процессор и дисковую подсистему.
  2. Регистр, подчиненный регистратору. При проведении любого из 9 видов документов платформа 1С выполняет транзакционную запись набора записей с автоматическим наложением блокировок СУБД. При этом физически происходит удаление старых записей регистратора и запись новых. При объеме в миллионы строк это вызывает серьезные ожидания на блокировках и раздувание транзакционного лога (файла .ldf).
  3. Отсутствие нормализации данных. В одной таблице смешаны статические данные, которые никогда не меняются (какая алкогольная продукция соответствует марке, какая у нее упаковка), и динамические данные (в какую организацию поступила, когда выбыла). Из-за этого при изменении статуса марки СУБД вынуждена перезаписывать избыточные тяжелые данные.

---

Шаг 1. Переход от тяжелых строк к ссылочным типам

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

Вместо хранения строки длиной 160 символов непосредственно в измерении регистра необходимо создать справочник (например, Справочник.ШтрихкодыУпаковок или Справочник.НоменклатураЕГАИС). В самом справочнике длина наименования или специального реквизита будет составлять те самые 160 символов, а в измерении регистра мы будем использовать тип СправочникСсылка.

Давайте посчитаем выгоду. На уровне СУБД уникальный идентификатор ссылки (GUID) занимает всего 16 байт фиксированной длины. Сравните это со строкой Unicode длиной 160 символов, которая может занимать до 320 байт. Переход на ссылочный тип данных уменьшает размер индекса регистра более чем в 15 раз! Это позволит SQL-серверу полностью держать индекс в кэше оперативной памяти, что мгновенно ускорит операции поиска и записи.

---

Шаг 2. Нормализация данных (декомпозиция таблиц)

Разделим данные на условно-постоянные (статику) и оперативные (динамику). Выполним декомпозицию исходного регистра на два независимых объекта.

1. Статический реестр марок (Справочник):

При первом сканировании или загрузке накладной марка регистрируется в системе. Мы создаем элемент справочника ШтрихкодыНоменклатуры, где заполняем все неизменяемые свойства:

2. Легковесный динамический регистр (Регистр сведений):

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

Такая структура весит в десятки раз меньше исходной и обновляется мгновенно.

---

Шаг 3. Переход на независимый регистр сведений и оптимизация записи

Подчинение регистра регистратору накладывает жесткие рамки транзакционности. Если бизнес-логика позволяет, переведите регистр сведений в режим "Независимый".

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


НаборЗаписей = РегистрыСведений.СтатусыМаркировки.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Марка.Установить(ВыбраннаяМарка);

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

// Записываем с флагом ОбменДанными.Загрузка = Истина для отключения лишних проверок
НаборЗаписей.ОбменДанными.Загрузка = Истина;
НаборЗаписей.Записать(Истина);

Обратите внимание: использование свойства ОбменДанными.Загрузка = Истина позволяет обойти тяжелые обработчики событий платформы 1С, выполняя прямую и быструю транзакцию в СУБД.

---

Шаг 4. Использование новых возможностей платформы (8.3.26 и выше)

Если ваша система развернута на современных версиях платформы «1С:Предприятие 8», обязательно используйте встроенные оптимизации работы с СУБД.

Начиная с версий 8.3.26 и 8.3.27, разработчики платформы существенно оптимизировали запись наборов данных. Теперь при записи независимых регистров сведений платформа старается минимизировать избыточные SQL-запросы удаления. Внедрен механизм частичного обновления данных (слияния), что снижает нагрузку на дисковую подсистему сервера БД при массовых операциях записи с ТСД.

---

Шаг 5. Свертка данных и архивирование

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

Рекомендуется внедрить регламентный механизм свертки и архивирования:

  1. Создайте регламентное задание, которое запускается в период минимальной активности системы (например, ночью в выходные).
  2. Программа выбирает все марки со статусом "Выбыло/Продано", дата операции которых старше определенного периода (например, более 3 месяцев назад).
  3. Данные записи переносятся во внешнюю историческую базу (это может быть простая архивная база 1С, либо аналитическая СУБД типа ClickHouse через механизм Внешних источников данных).
  4. Из рабочего регистра оперативной базы эти строки безвозвратно удаляются методом Записать(Истина) с пустым набором полей по отбору.

---

Шаг 6. Настройки на уровне СУБД (для системных администраторов)

Если конфигурация закрыта для изменений (например, находится на поддержке и защищена СЛК), оптимизировать работу СУБД можно административными методами:

Применение этих комплексных мер позволяет сократить объем таблиц маркировки в базе данных в 5–10 раз и полностью ликвидировать задержки при проведении документов и работе складского персонала.

← На главную