Розница 2.2: как решить проблему с неверным кассиром в чеке ККМ при смене пользователей

Программист 1С v8.3 (Управляемые формы) 1С:Розница Управленческий учет Торговля и дистрибуция
← На главную

В розничной торговле крайне распространена ситуация, когда за одним рабочим местом кассира (РМК) в течение дня работают несколько сотрудников. Они могут сменять друг друга во время обеда, работать посменно или осуществлять продажи одновременно, авторизуясь в программе перед каждым чеком. Однако пользователи конфигурации 1С:Розница 2.2 при работе с фискальными регистраторами (в частности, марки «Штрих-М») часто сталкиваются с неприятной проблемой: при смене пользователя в программе на чеке продолжает печататься имя предыдущего кассира (чаще всего того, кто открыл кассовую смену утром).

В этой статье мы подробно разберем, почему возникает эта проблема, как устроена передача данных о кассире из 1С в ККТ и какими способами — от простых настроек до создания расширения — можно добиться корректной печати ФИО фактического продавца на чеках.

Почему на чеке печатается не тот кассир? Разбор причин

Для начала давайте разберемся, как имя кассира попадает на фискальный документ. Согласно требованиям 54-ФЗ и форматам фискальных данных (ФФД 1.05 и выше), на кассовом чеке обязательно должны быть указаны ФИО и ИНН лица, осуществившего расчет (теги 1021 и 1203). Существует два принципиально разных механизма, по которым ККТ определяет, чье имя напечатать:

  1. Аппаратный метод (через таблицы ККТ): В памяти фискального регистратора есть таблица № 2 «Пароли кассиров и администраторов». Если в настройках подключения ККТ в 1С жестко задан фиксированный «Пароль кассира» (например, «1» для первого кассира или «30» для системного администратора), ККТ берет ФИО из своей внутренней таблицы, полностью игнорируя данные, присылаемые из программы.
  2. Программный метод (передача XML-пакета из 1С): Современный и правильный метод. При пробитии чека 1С формирует XML-пакет, в котором передает имя текущего пользователя (физического лица) и его ИНН. Драйвер ККТ принимает эти данные и динамически подставляет их в фискальный документ.

Если на чеках двоится имя кассира или выводится один и тот же сотрудник, причины могут быть следующими:

Рассмотрим последовательно варианты решения этой проблемы.

Способ №1. Проверка справочников и настроек драйвера ККТ (Без программирования)

Прежде чем приступать к доработке кода, нам необходимо исключить базовые ошибки настройки системы. Выполним следующие шаги:

  1. Проверяем привязку физических лиц: Перейдите в раздел «Администрирование» — «Настройки пользователей и прав» — «Пользователи». Откройте карточки кассиров, которые работают на кассе. Убедитесь, что для каждого пользователя ИБ в поле «Физическое лицо» выбрано его собственное, уникальное физлицо. Если там пусто или у всех выбрано одно и то же лицо, касса физически не сможет получить разные ФИО.
  2. Проверяем заполнение ИНН: У каждого физического лица (кассира) в его карточке должен быть заполнен корректный ИНН. Без ИНН передача данных по тегу 1203 может работать некорректно или вызывать ошибки ФР.
  3. Очищаем таблицы драйвера ККТ Штрих-М:
    • Запустите утилиту «Тест драйвера ККТ» (версии 4.14 или 4.15).
    • Установите связь с кассовым аппаратом.
    • Перейдите в раздел «Настройка свойств» — «Таблицы».
    • Найдите Таблицу № 2 («Пароли кассиров и администраторов»).
    • Сотрите текстовые имена кассиров (ФИО) в этой таблице или переименуйте их в общие должности (например, «Кассир 1»), чтобы убедиться, передает ли 1С данные динамически. Если после очистки таблицы на чеке продолжает выходить старое ФИО, значит, касса берет данные из программы, и проблему нужно решать на стороне 1С.

Способ №2. Программный обход проблемы через расширение конфигурации

Если в вашем магазине продавцы работают посменно под одной учетной записью 1С (для экономии времени на постоянный перезапуск программы) и просто авторизуют себя в интерфейсе РМК кнопкой «Смена продавца» (или сканированием бейджа), то типовая 1С:Розница 2.2 все равно будет отправлять на кассу ФИО пользователя сеанса. Это связано с тем, что реквизит Ответственный (пользователь ИБ) не меняется, меняется только реквизит Продавец в документе ЧекККМ.

Чтобы исправить это поведение и принудительно отправлять на печать ФИО фактически выбранного в РМК продавца, мы можем использовать механизм расширений. Это позволит нам сохранить конфигурацию на поддержке и легко обновлять ее в будущем.

Нам необходимо перехватить формирование данных перед отправкой на кассу. За это отвечает функция ПодготовитьДанныеДляПробитияЧека, расположенная в модуле менеджера документа ЧекККМ. Разберем по шагам логику доработки:

  1. Создайте новое расширение в конфигураторе (или откройте существующее).
  2. Добавьте в расширение документ ЧекККМ и его модуль менеджера.
  3. Найдите функцию ПодготовитьДанныеДляПробитияЧека и добавьте к ней аннотацию &Вместо или используйте перехват &После для изменения структуры возвращаемых реквизитов.

Рассмотрим пример кода, который нужно внедрить в расширение:


&Вместо("ПодготовитьДанныеДляПробитияЧека")
Функция ИмяРасширения_ПодготовитьДанныеДляПробитияЧека(ДокументСсылка, ПараметрыПробития = Неопределено)
    
    // Вызываем оригинальный алгоритм для получения базовой структуры данных
    Результат = ПродолжитьВызов(ДокументСсылка, ПараметрыПробития);
    
    // Получаем реквизиты текущего документа ЧекККМ
    РеквизитыДокумента = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(ДокументСсылка, "Продавец, Ответственный");
    
    // Определяем, кто должен быть указан кассиром в чеке
    Если ЗначениеЗаполнено(РеквизитыДокумента.Продавец) Тогда
        // Если в чеке выбран конкретный продавец, берем его в качестве кассира
        КассирФизическоеЛицо = РеквизитыДокумента.Продавец;
    Иначе
        // Если продавец не выбран, берем физическое лицо ответственного за документ
        КассирФизическоеЛицо = РеквизитыДокумента.Ответственный.ФизическоеЛицо;
    КонецЕсли;
    
    // Если нам удалось определить физическое лицо кассира
    Если ЗначениеЗаполнено(КассирФизическоеЛицо) Тогда
        
        // Формируем структуру для получения реквизитов физлица (ФИО и ИНН)
        СтруктураРеквизитов = Новый Структура("Наименование, ИНН");
        ДанныеКассира = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(КассирФизическоеЛицо, СтруктураРеквизитов);
        
        // Подменяем данные кассира в результирующей структуре для передачи на ККТ
        Если Результат.Свойство("ТаблицаТоваров") Тогда
            // Для некоторых версий БПО данные могут лежать в корне структуры Результат
            Результат.Вставить("Кассир", ДанныеКассира.Наименование);
            Результат.Вставить("КассирИНН", ДанныеКассира.ИНН);
        КонецЕсли;
        
        // Также проверяем наличие вложенных параметров регистрации ККТ
        Если Результат.Свойство("ПараметрыРегистрации") Тогда
            Результат.ПараметрыРегистрации.Вставить("Кассир", ДанныеКассира.Наименование);
            Результат.ПараметрыРегистрации.Вставить("КассирИНН", ДанныеКассира.ИНН);
        КонецЕсли;
        
    КонецЕсли;
    
    Возврат Результат;

КонецФункции

Данный код проверяет, выбран ли в чеке продавец (реквизит Продавец). Если выбран, программа обращается к справочнику физических лиц, получает его ФИО и ИНН, после чего заменяет ими стандартные значения текущего пользователя информационной базы. В итоге драйвер ККТ получает актуальные данные сотрудника, фактически пробившего чек.

Способ №3. Автоматическая подмена ответственного при выборе продавца в РМК

Существует еще один изящный способ решения проблемы, который затрагивает интерфейсную часть рабочего места кассира. Мы можем сделать так, чтобы при авторизации нового продавца в РМК (например, через сканирование карты сотрудника) программа автоматически меняла реквизит Ответственный в создаваемом документе на пользователя, связанного с этим продавцом.

Для этого нам потребуется доработать модуль управляемой формы РМК (форма ФормаРМКУправляемыйРежим). Найдем процедуру оповещения о выборе продавца:


&НаКлиенте
Процедура ОповещениеОткрытьФормуВыбораПродавца(РезультатОткрытияФормы, ДополнительныеПараметры) Экспорт
    
    Если НЕ РезультатОткрытияФормы = Неопределено Тогда
        Объект.Продавец = РезультатОткрытияФормы;
        
        // Вместо стандартной логики выполняем подмену ответственного лица:
        // Объект.Ответственный = ПолучитьПользователяПоПродавцу(РезультатОткрытияФормы);
        
        ЛогированиеВводаПродавца(Неопределено, ПредопределенноеЗначение("Справочник.ИнформационныеКарты.ПустаяСсылка"), Объект.Продавец);
    КонецЕсли;
    УстановитьЗаголовок();
    
КонецПроцедуры

Для реализации этого метода вам потребуется написать вспомогательную функцию на сервере, которая будет находить элемент справочника Пользователи, связанный с выбранным физическим лицом (продавцом). Это решение хорошо тем, что оно меняет данные прямо на форме документа, и пользователь наглядно видит, от чьего имени будет пробит чек еще до момента физической печати.

Важные нюансы и законодательные требования

При внедрении любого из описанных решений обязательно учитывайте следующие важные правила:

Применяя данные методы, вы сможете настроить гибкую и безошибочную работу продавцов в 1С:Розница 2.2, обеспечив полное соответствие фискальных чеков требованиям законодательства.

← На главную