Переход на поштучный учет алкогольной продукции (помарочный учет ЕГАИС) требует сохранения и обработки сотен тысяч уникальных кодов маркировки. Если на предприятии используется файловый вариант информационной базы, разработчик сталкивается с жесткими архитектурными ограничениями, главным из которых является лимит на максимальный размер одной таблицы (4 ГБ в формате 1CD). Рассмотрим, как правильно спроектировать структуру данных в конфигурации 1С, чтобы база не разрасталась до критических объемов и обеспечивала высокую скорость чтения и записи.
Прежде чем приступать к разработке метаданных, проанализируем исходные параметры данных:
Строка(150) в измерениях регистров создаются крупные индексы, которые растут быстрее тела самой таблицы.Разберем классическую архитектуру, разделяющую хранение самих строковых кодов и их оперативных состояний. Прямое хранение строкового кода марки длиной 150 символов в измерениях регистра остатков приводит к лавинообразному росту индексов. Вместо этого разделим данные на нормативно-справочную информацию и оперативные остатки.
Справочник выступает хранилищем уникальных марок и упаковок. Он содержит:
ЗначениеШтрихкода (тип Строка, переменная длина, без индексации всей строки).ХешСумма (тип Строка(32) или Число, с индексацией) — для быстрого поиска марки.Номенклатура, Характеристика, СерияНоменклатуры / Партия, Справка2 (РФУ-2).Регистр хранит только текущее состояние и местоположение конкретной марки на складе:
Марка (тип СправочникСсылка.ШтрихкодыУпаковокИТоваров).Статус (перечисление: ВНаличии, ВРезерве, Отгружен, Списан), Склад, Ячейка.ДокументРезерва, ДатаИзменения.Чтобы оперативная таблица не росла бесконечно при обороте 100 000 марок в месяц, используем принцип очистки оперативного регистра. Рассмотрим логику его работы:
Поиск строки из 150 символов без индекса замедляет сканирование, а создание индекса по длинной строке раздувает файл БД. Решим эту проблему через вычисление хэша (например, MD5 или контрольной суммы) при записи марки. Разберем пример реализации поиска марки по хэш-сумме:
// Пример поиска марки по предварительно рассчитанному хэшу
Функция НайтиМаркуПоШтрихкоду(Знач ТекстМарки, Знач ХешМарки) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Марки.Ссылка КАК МаркаСсылка
|ИЗ
| Справочник.ШтрихкодыУпаковокИТоваров КАК Марки
|ГДЕ
| Марки.ХешСумма = &ХешСумма
| И Марки.ЗначениеШтрихкода = &ЗначениеШтрихкода";
Запрос.УстановитьПараметр("ХешСумма", ХешМарки);
Запрос.УстановитьПараметр("ЗначениеШтрихкода", ТекстМарки);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.МаркаСсылка;
КонецЕсли;
Возврат Справочники.ШтрихкодыУпаковокИТоваров.ПустаяСсылка();
КонецФункции
На оптовом складе критически важно использовать агрегацию. Выясним, почему это снижает нагрузку на базу данных:
Если объем оборота превышает возможности файлового режима, рассмотрим следующие практические варианты перехода: