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