Почему зависает РМК в 1С:Розница при нажатии на кнопку "Наличные" или "Карта" при продаже алкоголя и маркированных товаров?

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

При работе кассиров в режиме рабочего места кассира (РМК) в конфигурации 1С:Розница (особенно в релизах ветки 2.2 и 2.3) часто возникает крайне неприятная ситуация. При сканировании обычных товаров переход к оплате по кнопке "Наличные" или "Карта" происходит мгновенно. Однако стоит добавить в чек хотя бы одну бутылку алкоголя или пачку сигарет, как при попытке принять оплату интерфейс РМК зависает на одну, две, а иногда и более пяти минут. В этот момент операционная система может сообщать, что программа "Не отвечает", а кассовая смена фактически простаивает, создавая очереди.

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

---

Техническая суть проблемы с алкоголем (почему виснет РМК)

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

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

Рассмотрим, как устроен алгоритм проверки в типовом решении:

  1. В старых версиях Розницы проверка выполнялась быстро по регистру сведений АкцизныеМарки (или аналогичному в зависимости от релиза), куда записываются сведения о проданных марках.
  2. В последующих обновлениях разработчики 1С решили ужесточить контроль дублей марок внутри базы данных. Для этого они добавили в алгоритм запрос, который выполняет поиск сканируемой марки не только в регистре сведений, но и в табличных частях всех ранее проведенных и отложенных документов продажи (в первую очередь по таблице документов Документ.ЧекККМ.АкцизныеМарки).
  3. Если база данных работает в файловом режиме, размещена на обычном жестком диске (HDD) и содержит историю продаж за несколько месяцев или лет, такой запрос становится чрезвычайно "тяжелым". СУБД начинает последовательно перебирать гигабайты архивных документов на диске, полностью загружая процессор кассового компьютера. В результате время выполнения запроса может достигать нескольких минут.

---

Решение проблемы с помощью расширения конфигурации

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

Разберем по шагам, как это реализовать:

  1. Откроем конфигуратор нашей базы данных и перейдем в меню Конфигурация -> Расширения конфигурации.
  2. Создадим новое расширение (например, с именем ОптимизацияПроверкиМаркировки), снимем у него флажки "Безопасный режим" и "Защита от опасных действий".
  3. Найдем в основной конфигурации общий модуль, отвечающий за проверку акцизных марок перед записью чека (например, ПродажиСервер), кликнем по нему правой кнопкой мыши и выберем Добавить в расширение.
  4. В модуле расширения переопределим метод проверки с помощью аннотации &Вместо.

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


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

КонецПроцедуры

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

---

Аналогичная проблема с табаком и маркировкой ("Честный знак")

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

Проанализируем две основные причины, почему это происходит:

  1. Локальная проверка кодов маркировки: По аналогии с алкогольным модулем, в 1С реализован механизм локальной проверки кодов маркировки на предмет их повторной продажи в рамках одной информационной базы. Программа снова пытается сканировать табличные части исторических документов продаж. Решение здесь аналогичное — оптимизация запросов через расширение или отключение избыточных локальных проверок в настройках интеграции с ИС МП (Честный знак), оставив только обязательные онлайн-проверки.
  2. Баг старого интерфейса РМК при работе через веб-сервер: В релизах Розницы 2.3 при использовании тонкого клиента, подключенного через веб-сервер (Apache или IIS), старый интерфейс РМК зависает намертво при сканировании маркированной продукции. Это связано с особенностями обработки модальных окон и синхронных вызовов в старых формах. Рекомендуется перевести кассу на новый интерфейс РМК (его можно включить в настройках администрирования продаж), где логика работы с торговым оборудованием и веб-сервисами полностью переписана и оптимизирована.

---

Другие скрытые причины зависания РМК при переходе к оплате

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

Влияние антивируса и Защитника Windows

Защитник Windows (Windows Defender) и сторонние антивирусные программы очень агрессивно реагируют на сетевую активность платформы 1С и транспортного модуля ЕГАИС (УТМ). При переходе к оплате 1С активно обменивается локальными XML-пакетами с УТМ по протоколу HTTP и генерирует множество временных файлов. Антивирус блокирует эти файлы для сканирования "на лету", увеличивая время отклика оборудования с миллисекунд до минут.

Для решения этой проблемы добавим в исключения антивируса и Защитника Windows:

Настройка энергосбережения USB-портов

Многие кассовые аппараты (ККТ) и эквайринговые терминалы подключаются к компьютеру по USB-кабелю с эмуляцией COM-порта. По умолчанию в Windows включена функция приостановки работы USB-портов для экономии энергии. Когда кассир долго не пробивает чеки, порт "засыпает". При нажатии кнопки "Наличные" или "Карта" 1С пытается инициализировать подключение к кассе или терминалу. Если порт уснул, программа зависает, ожидая ответа от драйвера оборудования по таймауту.

Чтобы исправить это, перейдем в Диспетчер устройств Windows, найдем разделы "Контроллеры USB" и "Порты (COM и LPT)", зайдем в свойства каждого устройства и на вкладке "Управление электропитанием" снимем флажок "Разрешить отключение этого устройства для экономии энергии".

Переход на SSD-накопители и обслуживание базы

Работа с современными государственными системами маркировки и ЕГАИС накладывает жесткие требования к дисковой подсистеме кассового компьютера. Использование обычных дисков HDD на кассах недопустимо. Перенос файловой базы данных 1С на быстрый твердотельный накопитель (SSD) сам по себе способен ускорить время отклика РМК в несколько раз.

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

---

Выводы и рекомендации

Зависание РМК при оформлении чеков с алкоголем или маркировкой — это комплексная проблема, которая чаще всего вызвана неоптимальным кодом проверки дублей в типовых конфигурациях 1С, наложенным на медленную работу дисковой системы и блокировки со стороны антивирусного ПО.

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

← На главную