При работе кассиров в режиме рабочего места кассира (РМК) в конфигурации 1С:Розница (особенно в релизах ветки 2.2 и 2.3) часто возникает крайне неприятная ситуация. При сканировании обычных товаров переход к оплате по кнопке "Наличные" или "Карта" происходит мгновенно. Однако стоит добавить в чек хотя бы одну бутылку алкоголя или пачку сигарет, как при попытке принять оплату интерфейс РМК зависает на одну, две, а иногда и более пяти минут. В этот момент операционная система может сообщать, что программа "Не отвечает", а кассовая смена фактически простаивает, создавая очереди.
В этой статье мы подробно разберем причины возникновения таких зависаний, проанализируем внутренние механизмы платформы 1С и конфигурации, а также рассмотрим пошаговые решения проблемы: от написания оптимизирующего расширения до тонкой настройки операционной системы Windows и торгового оборудования.
---
Выясним причину, почему зависание происходит именно в момент нажатия кнопок оплаты, а не при сканировании акцизной марки в чек. При добавлении алкогольной продукции в чек 1С выполняет лишь первичные проверки формата марки. Основной же процесс валидации и подготовки данных к фискализации запускается тогда, когда кассир завершает формирование чека и переходит к выбору способа оплаты.
Именно в этот момент программа пытается временно записать документ и выполнить комплексную проверку корректности данных. За этот процесс в типовом коде конфигурации отвечает общий модуль ПродажиСервер (или специализированные модули интеграции с ЕГАИС) и, в частности, процедура ПроверитьАкцизныеМаркиПередЗаписьюЧека.
Рассмотрим, как устроен алгоритм проверки в типовом решении:
АкцизныеМарки (или аналогичному в зависимости от релиза), куда записываются сведения о проданных марках.Документ.ЧекККМ.АкцизныеМарки).---
Самым эффективным и правильным способом решения проблемы является оптимизация запроса проверки акцизных марок. Мы можем переопределить стандартное поведение системы с помощью механизма расширений 1С, чтобы программа проверяла дубли марок исключительно по специализированному регистру сведений АкцизныеМарки (или РегистрСведений.АкцизныеМаркиЕГАИС), минуя сканирование табличных частей документов продаж.
Разберем по шагам, как это реализовать:
ОптимизацияПроверкиМаркировки), снимем у него флажки "Безопасный режим" и "Защита от опасных действий".ПродажиСервер), кликнем по нему правой кнопкой мыши и выберем Добавить в расширение.&Вместо.Рассмотрим пример оптимизированного кода процедуры, который мы можем применить в расширении:
&Вместо("ПроверитьАкцизныеМаркиПередЗаписьюЧека")
Процедура Опт_ПроверитьАкцизныеМаркиПередЗаписьюЧека(ДокументСсылка, Отказ)
// Если документ не содержит маркируемой продукции, проверку выполнять не нужно
Если Не ПродажиСервер.ЕстьМаркируемаяПродукцияВДокументе(ДокументСсылка) Тогда
Возврат;
КонецЕсли;
// Получаем список марок из текущего чека
ТаблицаМарки = ПродажиСервер.ПолучитьМаркиДокумента(ДокументСсылка);
Если ТаблицаМарки.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// Создаем быстрый запрос только по регистру сведений, исключая сканирование табличных частей ЧекККМ
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВГ_Марки.АкцизнаяМарка КАК АкцизнаяМарка
|ПОМЕСТИТЬ ВТ_МаркиЧека
|ИЗ
| &ТаблицаМарки КАК ВГ_Марки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| АкцизныеМарки.АкцизнаяМарка КАК АкцизнаяМарка,
| АкцизныеМарки.ДокументПродажи КАК ДокументПродажи
|ИЗ
| ВТ_МаркиЧека КАК ВТ_МаркиЧека
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.АкцизныеМарки КАК АкцизныеМарки
| ПО ВТ_МаркиЧека.AccизнаяМарка = АкцизныеМарки.АкцизнаяМарка
|ГДЕ
| АкцизныеМарки.ДокументПродажи <> &ТекущийДокумент";
Запрос.УстановитьПараметр("ТаблицаМарки", ТаблицаМарки);
Запрос.УстановитьПараметр("ТекущийДокумент", ДокументСсылка);
РезультатЗапроса = Запрос.Выполнить();
Если Не РезультатЗапроса.Пустой() Тогда
// Обработка найденных дублей
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
НСтр("ru = 'Марка " + Выборка.АкцизнаяМарка + " уже была продана в документе " + Выборка.ДокументПродажи + "!'"),
,,, Отказ);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Использование этого метода позволяет сократить время выполнения проверки с нескольких минут до сотых долей секунды, так как СУБД мгновенно обращается к индексированной таблице регистра сведений.
---
Пользователи часто отмечают, что схожие симптомы "зависания" кассы начинают проявляться и при продаже сигарет, обуви или молочной продукции. С введением обязательного разрешительного режима нагрузка на кассовый узел значительно возросла.
Проанализируем две основные причины, почему это происходит:
---
Если оптимизация запросов выполнена, но задержка при переходе к оплате все равно сохраняется, необходимо обратить внимание на инфраструктурные факторы.
Защитник Windows (Windows Defender) и сторонние антивирусные программы очень агрессивно реагируют на сетевую активность платформы 1С и транспортного модуля ЕГАИС (УТМ). При переходе к оплате 1С активно обменивается локальными XML-пакетами с УТМ по протоколу HTTP и генерирует множество временных файлов. Антивирус блокирует эти файлы для сканирования "на лету", увеличивая время отклика оборудования с миллисекунд до минут.
Для решения этой проблемы добавим в исключения антивируса и Защитника Windows:
C:\Program Files\1cv8 и C:\Program Files (x86)\1cv8.C:\TTN).%userprofile%\AppData\Local\1C и %userprofile%\AppData\Roaming\1C.Многие кассовые аппараты (ККТ) и эквайринговые терминалы подключаются к компьютеру по USB-кабелю с эмуляцией COM-порта. По умолчанию в Windows включена функция приостановки работы USB-портов для экономии энергии. Когда кассир долго не пробивает чеки, порт "засыпает". При нажатии кнопки "Наличные" или "Карта" 1С пытается инициализировать подключение к кассе или терминалу. Если порт уснул, программа зависает, ожидая ответа от драйвера оборудования по таймауту.
Чтобы исправить это, перейдем в Диспетчер устройств Windows, найдем разделы "Контроллеры USB" и "Порты (COM и LPT)", зайдем в свойства каждого устройства и на вкладке "Управление электропитанием" снимем флажок "Разрешить отключение этого устройства для экономии энергии".
Работа с современными государственными системами маркировки и ЕГАИС накладывает жесткие требования к дисковой подсистеме кассового компьютера. Использование обычных дисков HDD на кассах недопустимо. Перенос файловой базы данных 1С на быстрый твердотельный накопитель (SSD) сам по себе способен ускорить время отклика РМК в несколько раз.
Также не забываем регулярно проводить профилактическое обслуживание базы данных:
---
Зависание РМК при оформлении чеков с алкоголем или маркировкой — это комплексная проблема, которая чаще всего вызвана неоптимальным кодом проверки дублей в типовых конфигурациях 1С, наложенным на медленную работу дисковой системы и блокировки со стороны антивирусного ПО.
Для гарантированного устранения зависаний рекомендуем внедрить описанное выше расширение для оптимизации запросов к регистру акцизных марок, перевести работу РМК на новый интерфейс, перенести базу данных на SSD-накопитель и внести необходимые папки в список исключений антивируса. Эти действия позволят вернуть моментальный отклик кассы и обеспечат комфортную работу кассиров без задержек и очередей.