Почему долго печатается чек с алкоголем в 1С:Розница 2.3 и как это исправить?

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

При переходе на новые релизы конфигурации «1С:Розница» (начиная с версии 2.3.1.40 и выше) многие пользователи и технические специалисты сталкиваются с крайне неприятной проблемой: при пробитии чека, содержащего алкогольную продукцию, касса «зависает» на 30–60 секунд. Обычные (немаркированные) товары при этом пробиваются мгновенно, а сетевой пинг до УТМ (Универсального транспортного модуля ЕГАИС) составляет менее 1 миллисекунды. Переустановка драйверов ККТ, обновление самого УТМ и стандартное тестирование базы данных результатов не дают.

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

Выясняем причину: почему тормозит именно алкогольный чек

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

Замер показывает, что практически все время задержки (до 90% экранного времени ожидания) уходит на выполнение одной-единственной процедуры: ПроверитьАкцизныеМаркиПередЗаписьюЧека в общем модуле ПродажиСервер. Запрос внутри этой процедуры пытается убедиться, что сканируемая акцизная марка не продавалась в магазине ранее.

Давайте разберем, почему этот механизм начинает тормозить именно после обновления на версию 2.3:

  1. Изменение логики проверки. В старых релизах (линейка 2.2) проверка акцизной марки выполнялась в момент ее сканирования (подбора товара в чек). Кассир добавлял бутылку в корзину, программа быстро опрашивала базу, и задержка в доли секунды оставалась незаметной. Начиная с версии 2.3, разработчики 1С перенесли этот тяжелый алгоритм непосредственно на этап оплаты и подготовки чека к записи. Теперь вся нагрузка суммируется в одной точке прямо перед печатью.
  2. Сканирование всей истории продаж. Алгоритм проверки выполняет поиск дублей акцизных марок по двум направлениям: по регистру сведений РегистрСведений.АкцизныеМаркиЕГАИС (работает быстро за счет индексов) и по табличным частям АкцизныеМарки всех исторических документов Документ.ЧекККМ.
  3. Проблема файловых баз (1CD). Если торговая точка работает давно, в информационной базе накапливаются сотни тысяч архивных чеков ККМ. В файловом режиме работы СУБД 1С вынуждена выполнять полное сканирование неиндексированных табличных частей документов за все годы работы. Это приводит к колоссальным задержкам на дисковых операциях.

Ниже мы подробно рассмотрим несколько практических вариантов решения этой технической проблемы — от оперативного вмешательства в код до системной оптимизации базы данных.

Решение 1: Замена процедуры проверки через расширение (Быстрый метод)

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

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

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


&Вместо("ПроверитьАкцизныеМаркиПередЗаписьюЧека")
Процедура Расш_ПроверитьАкцизныеМаркиПередЗаписьюЧека(ДокументОбъект, Отказ)
    // Мы сознательно обходим стандартный тяжелый запрос по табличным частям архивных ЧекККМ.
    // Контроль уникальности марок будет выполняться на стороне УТМ ЕГАИС при отправке чека.
    Возврат; 
КонецПроцедуры

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

Решение 2: Оптимизация запроса с ограничением глубины проверки

Более правильным с точки зрения бизнес-логики решением будет доработка поискового запроса в процедуре проверки. Вместо полного отключения контроля мы можем ограничить период поиска документов ЧекККМ. Например, искать повторные продажи марки только в чеках за последние 3-5 дней или в рамках текущей кассовой смены.

Давайте разберем, как изменить запрос через расширение конфигурации с использованием аннотации &Вместо. Нам нужно перехватить исходный текст запроса и добавить туда параметр ограничения даты:


&Вместо("ПроверитьАкцизныеМаркиПередЗаписьюЧека")
Процедура Расш_ПроверитьАкцизныеМаркиПередЗаписьюЧека(ДокументОбъект, Отказ)
    
    // Если документ не содержит маркируемой алкогольной продукции, проверку не выполняем
    Если Не ПродажиСервер.ЕстьМаркируемаяПродукцияВДокументе(ДокументОбъект) Тогда
        Возврат;
    КонецЕсли;
    
    // Задаем разумную глубину проверки истории продаж, например, 5 дней
    ГлубинаПроверки = ТекущаяДата() - (5 * 86400); 
    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |	ЧекМарки.АкцизнаяМарка КАК АкцизнаяМарка
        |ИЗ
        |	Документ.ЧекККМ.АкцизныеМарки КАК ЧекМарки
        |ГДЕ
        |	ЧекМарки.Ссылка.Дата >= &ГлубинаПроверки
        |	И ЧекМарки.АкцизнаяМарка В(&СписокМарокДокумента)
        |	И ЧекМарки.Ссылка <> &ТекущийДокумент";
        
    // Наполняем запрос параметрами и анализируем результат...
    // При нахождении дублей устанавливаем параметр Отказ = Истина;
    
КонецПроцедуры

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

Решение 3: Очистка старых архивных чеков ККМ

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

Выполним очистку базы по следующему алгоритму:

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

После удаления миллионов неиспользуемых строк из табличных частей документов ЧекККМ файловая СУБД снова начнет выполнять поисковые запросы за доли секунды, и задержка при печати чеков пропадет.

Решение 4: Дополнительные настройки кассы и переход на SQL

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

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

← На главную