При автоматизации розничной торговли маркированными товарами и алкоголем технические специалисты часто сталкиваются со следующей ситуацией. На кассовом узле под управлением программы 1С:Розница оформляется продажа крупной партии однотипного товара (например, 200–250 бутылок крепкого алкоголя для корпоративного клиента). Оплата по карте проходит успешно, XML-пакет для ЕГАИС формируется и отправляется без сбоев, слип-чек ЕГАИС успешно печатается, но на этапе фискализации самого чека в ККТ (контрольно-кассовой технике) процесс прерывается.
На экране кассира буквально на секунду мелькает сообщение от драйвера ККТ АТОЛ с текстом «Неверное количество», «Неверный формат» или ошибками, связанными с объемом данных, после чего транзакция зависает. В этой статье мы подробно проанализируем, почему возникает эта проблема, разберем ограничения фискальных накопителей и рассмотрим три практических способа решения этой задачи.
Многие пользователи ошибочно полагают, что если кассир сканирует 250 бутылок одного и того же наименования, то в кассовый аппарат передается всего одна строка с указанием количества 250. Однако в эпоху обязательной маркировки и ФФД 1.2 правила игры кардинально изменились. Разберем детально техническую цепочку происходящего:
1 и добавляется свой уникальный код маркировки (тег 1162 или тег 2007).Ошибка 134 (Превышение размеров TLV данных ФН).Ошибка 408 (Переполнена таблица хранения КМ).10 или 17 («Неверное количество» / «Недопустимое количество»).В ходе обсуждений на форумах часто упоминается, что Федеральная налоговая служба разрешила экономить чековую ленту и группировать одинаковые маркированные товары в одну строку на бумаге (с выводом символа [М] и общего количества). Действительно, современные релизы 1С:Розница и актуальные прошивки ККТ АТОЛ умеют это делать. Бумажный чек в этом случае будет коротким и презентабельным.
Важное предупреждение: Оптимизация печати бумажного чека никак не влияет на передачу электронных данных! В электронном документе, который отправляется в фискальный накопитель и далее оператору фискальных данных (ОФД), по-прежнему передаются все 250 уникальных кодов маркировки. Таким образом, короткий бумажный чек не спасает ККТ от переполнения памяти ФН и зависания на этапе фискализации.
---
Рассмотрим подробнее три основных способа обхода ограничений ККТ при продаже крупных партий маркированного товара.
Самый простой и быстрый способ, не требующий изменения конфигурации или привлечения программистов 1С, — это разделение покупки непосредственно кассиром на рабочем месте.
Рекомендуется установить на торговой точке жесткое правило: не пробивать в одном чеке более 50–80 единиц маркированной продукции (или алкоголя). Этот диапазон выбран не случайно — он гарантирует достаточный запас по объему памяти фискального накопителя (до лимита в 32 КБ) даже при наличии дополнительных реквизитов (скидки, длинные наименования товаров, данные покупателя).
Если клиенту требуется приобрести 250 бутылок, кассир должен оформить эту операцию в 3–4 отдельных чека. Основной минус этого подхода — необходимость проведения нескольких транзакций по банковскому терминалу, если покупатель рассчитывается безналичным способом.
Для того чтобы облегчить работу кассира и исключить человеческий фактор, можно реализовать автоматическое разбиение чека в коде 1С:Розница. При превышении заданного лимита строк программа будет самостоятельно делить чек на части и последовательно фискализировать их.
Рассмотрим концептуальный пример реализации алгоритма разбиения табличной части чека на сервере. Предположим, у нас есть документ продажи, в котором превышено количество маркируемых позиций. Нам необходимо разделить исходный массив строк на порции.
// Функция разбивает исходную таблицу товаров на массив более мелких таблиц по лимиту строк
Функция РазделитьТабличнуюЧастьТоваров(ТаблицаТоваров, МаксимальныйЛимит) Экспорт
МассивТаблиц = Новый Массив;
ТекущаяТаблица = ТаблицаТоваров.СкопироватьКолонки();
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
Если ТекущаяТаблица.Количество() >= МаксимальныйЛимит Тогда
МассивТаблиц.Добавить(ТекущаяТаблица);
ТекущаяТаблица = ТаблицаТоваров.СкопироватьКолонки();
КонецЕсли;
ЗаполнитьЗначенияСвойств(ТекущаяТаблица.Добавить(), СтрокаТовара);
КонецЦикла;
Если ТекущаяТаблица.Количество() > 0 Тогда
МассивТаблиц.Добавить(ТекущаяТаблица);
КонецЕсли;
Возврат МассивТаблиц;
КонецФункции
Этот алгоритм позволяет разделить корзину покупателя на несколько чеков прямо перед вызовом процедур фискализации драйвера ККТ. В интерфейсе кассира при этом может происходить последовательная отправка команд на ККТ, что полностью решает проблему переполнения памяти устройства.
Продажа 250 бутылок алкоголя или аналогичного объема другого маркированного товара частному лицу в розницу — ситуация редкая. Чаще всего такие закупки совершают представители юридических лиц или индивидуальные предприниматели (например, рестораны, организаторы мероприятий) за безналичный расчет.
Проанализируем этот сценарий. Если покупателем выступает организация или ИП, проведение сделки через розничную кассу с физическим сканированием каждой бутылки крайне неэффективно. Правильным решением будет оформление классической оптовой сделки:
---
Если вы хотите точно убедиться, что зависание чека связано именно с аппаратной ошибкой ККТ, а не со сбоем в 1С, вам необходимо проанализировать технологические логи драйвера АТОЛ. Выполните следующие шаги:
C:\ProgramData\ATOL\drivers10\ (папка ProgramData по умолчанию является скрытой в Windows).gLog.txt. Это основной файл логирования работы драйвера ККТ АТОЛ 10.Error, Ошибка или кодам команд фискализации (например, FnWriteAttribute).[134] Превышение размеров TLV данных ФН или ошибки записи фискального признака, это однозначно указывает на физическое переполнение буфера ФН, описанное в нашей статье.Подводя итог, отметим, что столкновение со сбоем кассы при попытке пробить очень длинный чек — это не ошибка в коде программы 1С и не неисправность фискального регистратора АТОЛ. Это жесткое физическое ограничение архитектуры современных фискальных накопителей. Используя ручное дробление чеков кассирами или внедрив автоматическое разделение документов в коде конфигурации, вы сможете полностью обезопасить бизнес от зависания кассовой смены в моменты пиковых продаж крупных партий товаров.