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

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

Реализация помарочного (поштучного) учета алкогольной продукции в ЕГАИС является одной из самых сложных задач для разработчика 1С в сфере ритейла и дистрибуции. Основная проблема заключается в огромном объеме данных: при обороте в миллион бутылок в месяц база данных может быстро разрастись до критических размеров, а стандартные механизмы работы с остатками начнут вызывать серьезные задержки при проведении документов. В этой статье мы подробно разберем, как спроектировать архитектуру хранения марок, какие объекты 1С использовать и как обеспечить высокую производительность системы.

Выбор архитектуры: Регистр сведений или Регистр накопления?

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

  1. Регистр накопления (остатки): Использование регистра остатков кажется логичным, так как нам нужно знать текущее количество марок на балансе. Однако при объемах в миллионы записей расчет итогов станет «бутылочным горлышком». Каждая марка уникальна, и количество записей в таблице итогов будет равно количеству марок в обороте. Это приведет к катастрофическому падению производительности при проведении документов.
  2. Регистр сведений (независимый): Это наиболее предпочтительный вариант. Мы используем независимый непериодический регистр сведений для хранения текущего статуса каждой марки. Поскольку нам не нужно считать «количество» марки (она либо есть, либо ее нет), регистр сведений обеспечивает максимально быстрый доступ к данным по ключевым полям (Штрихкод).

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

Проектирование структуры данных

Разберем оптимальную структуру Регистра сведений «СостоянияАкцизныхМарок». Для обеспечения производительности и возможности интеграции с ЕГАИС (Регистр №3) нам потребуются следующие измерения и ресурсы:

Измерения:

Ресурсы:

Реквизиты:

Для оптимизации хранения строк длиной 68 или 150 символов (новые марки) крайне рекомендуется использовать Справочник «ШтрихкодыУпаковок». В регистре сведений мы будем хранить ссылку на этот справочник. Это позволит значительно уменьшить размер индекса регистра и ускорить поиск.

Логика работы документов с регистрами

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

1. Поступление товаров (ТТН ЕГАИС):

При получении входящей ТТН данные о марках часто приходят во вложенных файлах или XML-структурах. В этот момент мы можем записать марки в регистр со статусом ОжидаетсяПриход. После подтверждения акта приемки и получения квитанции из ЕГАИС, статус меняется на ВНаличии.

Пример кода для фиксации прихода:


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

2. Реализация товаров и Акт списания:

При проведении расходных документов мы должны проверять наличие марки в регистре и ее текущий статус. Если статус не равен ВНаличии, проведение должно блокироваться.

Рассмотрим алгоритм проверки:

  1. Получаем список сканированных марок из документа.
  2. Делаем запрос к Регистру Сведений.
  3. Если по какой-то марке статус отличается от «В наличии», выводим сообщение об ошибке с указанием документа, который «захватил» эту марку ранее.

3. Снятие документа с проведения:

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

Учет групповой тары (Агрегация)

В оптовой торговле невозможно сканировать каждую бутылку. ЕГАИС поддерживает иерархию упаковок. В нашей учетной системе мы должны реализовать дерево связей. Выясним, как это лучше сделать:

Создадим справочник УпаковкиЕГАИС, где родителем будет паллета, а подчиненными элементами — коробки. В регистре сведений для каждой марки будем хранить ИдентификаторУпаковки. При сканировании кода коробки система должна выполнить запрос к регистру и найти все марки, привязанные к этой упаковке.

Важно: При «распаковке» (извлечении одной бутылки из коробки) необходимо программно очищать поле ИдентификаторУпаковки у этой марки и, если этого требует бизнес-логика, отправлять в ЕГАИС соответствующий акт расформирования упаковки.

Производительность и фоновая обработка

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

Регламентные операции и очистка данных

Со временем регистр сведений будет раздуваться. Проанализируем критерии очистки:

Марки, которые были отгружены и по которым получено подтверждение от контрагента более года назад, можно переносить в архивную таблицу или удалять. Шанс того, что по ним будет возврат или проверка, крайне мал, а скорость работы основной таблицы значительно возрастет. Для этого следует создать регламентное задание, которое раз в месяц будет «схлопывать» историю по старым маркам.

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

← На главную