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