Как организовать структуру хранения и поштучного учета миллионов единиц номенклатуры в 1С

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

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

Выбор объекта метаданных: Справочники или Регистры сведений

Первый вопрос, который возникает: где именно хранить уникальные идентификаторы (коды маркировки, серийные номера)? Рассмотрим плюсы и минусы основных объектов 1С.

Использование подчиненных справочников. Это классический подход. Мы создаем справочник СерийныеНомера, подчиненный справочнику Номенклатура. Плюсы: Наличие стандартной ссылки (GUID), возможность использования в качестве типа данных в документах. Минусы: Избыточность данных (поля «Код», «Наименование», «Родитель», «Владелец»), которые занимают место в БД. При сотнях миллионов записей ссылочная целостность становится «тяжелой» для СУБД.

Использование независимых регистров сведений. Это наиболее рекомендуемый вариант для высоконагруженных систем. Плюсы: Отсутствие лишних системных полей, высокая скорость записи и поиска по измерениям. Минусы: Нет прямой ссылки, поиск осуществляется по комбинации измерений.

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

Оптимизация поиска: Хеширование строк

Когда идентификатор представляет собой длинную строку (например, 150 символов), поиск по нему в SQL замедляется. Чтобы ускорить процесс, мы можем использовать хеширование. Вместо поиска по длинной строке, мы будем искать по числовому или короткому строковому хешу.

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


Функция ПолучитьХешИдентификатора(Знач Идентификатор) Экспорт
    // Можно использовать встроенный объект ХешированиеДанных
    ХешОбъект = Новый ХешированиеДанных(АлгоритмХеширования.MD5);
    ХешОбъект.Добавить(Идентификатор);
    Возврат НРег(СтрЗаменить(Строка(ХешОбъект.ХешСумма), " ", ""));
КонецФункции

В этом случае в регистре сведений добавляется измерение ХешИдентификатора, по которому строится основной индекс. Это кратно сокращает время отклика при сканировании продукции на складе.

Концепция агрегации и SSCC-кодов

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

В системе это реализуется через дерево связей. Вместо того чтобы перемещать 10 000 бутылок, мы перемещаем один код паллеты (SSCC). 1С должна хранить информацию о том, какие коды «вложены» в данный SSCC. При проведении документа статус меняется только у кода упаковки, а подчиненные элементы меняют свой статус «виртуально». Это позволяет избежать блокировок таблиц при массовых операциях.

Оптимизация записи: Пакетная обработка и фоновые процессы

Выясним причину, по которой база может «зависать» при выпуске продукции. Если записывать каждую единицу в транзакции проведения документа, время ожидания пользователя станет критическим. Рекомендуется использовать очередь сообщений и фоновую запись.

  1. Документ выпуска фиксирует только общее количество и ссылку на временную таблицу с кодами.
  2. Специальное регламентное задание подхватывает эти данные.
  3. Запись в регистры осуществляется пакетами (например, по 5000 записей в одной транзакции).

Пример пакетной записи в регистр сведений:


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

Работа на уровне СУБД: Секционирование

Для программиста 1С важно понимать, что происходит «под капотом» SQL-сервера. При достижении объема в 200–500 миллионов записей даже индексы перестают помогать. В этом случае системному администратору рекомендуется настроить секционирование таблиц (Table Partitioning) на уровне MS SQL или PostgreSQL.

Данные можно секционировать по дате или по сериям продукции. Физически SQL-сервер будет хранить данные в разных файлах, но для платформы 1С это останется одной таблицей. Это позволяет мгновенно архивировать старые данные (например, за прошлый год), просто отключая старую секцию, что практически не требует времени по сравнению с операцией Удалить.

Жизненный цикл данных (Data Lifecycle Management)

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

Проанализируем стратегию очистки:

Резюме: Идеальная архитектура

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

  1. Использовать независимые непериодические регистры сведений вместо справочников.
  2. Внедрить хеширование строковых идентификаторов для ускорения поиска.
  3. Активно использовать агрегацию (SSCC) в складских процессах.
  4. Применять пакетную запись данных через фоновые задания, чтобы не блокировать работу пользователей.
  5. Рассмотреть возможность секционирования таблиц на уровне СУБД при росте базы свыше 1 ТБ.

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

← На главную