После обновления конфигурации 1С:Розница до версии 2.2.10.19 многие пользователи столкнулись с критической проблемой при работе в режиме РМК (Рабочее место кассира). Ситуация выглядит следующим образом: в корзине находятся товары, принадлежащие двум разным организациям (например, алкогольная продукция и сопутствующие товары). При попытке пробить чек первый фискальный документ (обычно с маркированным товаром или алкоголем) выходит корректно, а второй чек не печатается. Вместо этого система выдает ошибку: «Чек не напечатан на устройстве для печати чеков. Дополнительное описание: Тэг "Позиции чека" не заполнен».
В этой статье мы подробно разберем, почему это происходит, проанализируем программный код, вызывающий сбой, и рассмотрим несколько вариантов решения проблемы — от простых настроек до программной правки конфигурации.
Проанализируем техническую сторону вопроса. Ошибка возникает из-за нарушения логики работы управляемой формы РМК. Когда программа обрабатывает оплату по двум организациям, она должна последовательно сформировать и отправить на фискализацию два пакета данных. Однако в релизе 2.2.10.19 была допущена ошибка в последовательности вызова процедур.
Выясним причину: после успешной печати первого чека (например, по организации с алкоголем) программа автоматически переходит к процедуре ЗавершитьОплатуТоваровПослеВыводаСдачи. В этой процедуре жестко прописана команда на очистку таблицы Товары, расположенной на форме. Проблема в том, что эта очистка происходит до того, как система успевает собрать данные для второго чека. Когда очередь доходит до второй организации, программный код обращается к табличной части формы, видит ее пустой и передает драйверу ККТ пустой массив позиций. Драйвер, следуя требованиям ФФД, выдает закономерную ошибку об отсутствии позиций в чеке.
Интересно, что ошибка проявляется не у всех. Это связано с тем, что скорость выполнения операций может зависеть от производительности компьютера и настроек драйвера ККТ. Если система успевает «подхватить» данные до полной очистки, чек может выйти, но в большинстве случаев происходит сбой.
Рассмотрим официальное временное решение, которое предложила компания 1С для тех, кто не хочет вносить изменения в программный код. Этот способ помогает создать необходимую задержку в выполнении процедур и изменить поток выполнения операций.
Важный момент: эта настройка актуальна даже для файловых баз данных. Перенос выполнения части логики на «серверный» слой (даже если он эмулируется в файловом варианте) позволяет корректно отработать цепочку событий печати без преждевременной очистки формы.
Если первый способ не помог или не подходит по техническим причинам, разберем, как можно поправить логику работы через расширение или доработку конфигурации. Один из эффективных методов — изменить сортировку организаций при подготовке таблицы чеков.
Проанализируем ситуацию: ошибка чаще всего возникает, когда первым печатается чек с алкоголем. Если сделать так, чтобы «алкогольный» чек печатался последним, система успеет подготовить и отправить на печать все предыдущие чеки по обычным организациям.
Для этого в обработке РМКУправляемыйРежим необходимо найти процедуру ЗаполнитьТаблицуЧеков. Рассмотрим пример того, как можно изменить логику сортировки:
// В расширении для формы РМКУправляемыйРежим
&Вместо("ЗаполнитьТаблицуЧеков")
Процедура Ист_ЗаполнитьТаблицуЧеков(ПараметрыЧека)
// Вызываем оригинальную логику заполнения
ПродолжитьВызов(ПараметрыЧека);
// Добавляем свою сортировку в ТаблицаЧеков
// Задача: переместить организацию с алкоголем в конец списка
// Это позволит избежать очистки ТЧ на форме раньше времени
ПараметрыЧека.ТаблицаЧеков.Сортировать("ЕстьАлкоголь Возр");
КонецПроцедуры
Такой подход гарантирует, что процедура ЗавершитьОплатуТоваровПослеВыводаСдачи, инициирующая очистку данных, сработает только в самом конце процесса.
Более правильным, с точки зрения архитектуры, решением будет добавление проверки в процедуру очистки. Проанализируем код процедуры ЗавершитьОплатуТоваровПослеВыводаСдачи. В идеале очистка должна происходить только тогда, когда в очереди не осталось ни одного непробитого чека по текущей сделке.
Разберем логику исправления:
Объект.Товары.Очистить() выполняется только в том случае, если текущий чек является последним в массиве.К сожалению, в релизе 2.2.10.19 эта проверка была реализована некорректно, что и привело к массовым жалобам пользователей.
Если вы уже столкнулись с этой проблемой и у вас зависли «пустые» чеки, проанализируем, что нужно сделать для восстановления учета:
Данная ошибка была официально признана разработчиками (код ошибки 000109968) и исправлена в последующих патчах. Мы настоятельно рекомендуем обновить конфигурацию 1С:Розница до версии 2.2.10.23 или выше (например, актуальные ветки 2.3.x), где данная проблема полностью устранена. Если оперативное обновление невозможно, используйте перевод обмена ЕГАИС на сервер, как самый простой и безопасный способ «лечения» системы без вмешательства в код.