Почему вместо имени кассира в чеке 1С:УПП печатается GUID и как это исправить?

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

При доработке механизмов фискализации чеков на кассовых аппаратах (ККТ) под управлением «1С:Управление производственным предприятием 1.3» разработчики часто сталкиваются с неприятной проблемой: в печатной форме чека прихода вместо привычного имени кассира (например, «Иванов И.И.») отображается непонятный набор символов — уникальный идентификатор GUID (UUID). При этом в стандартных операциях (открытие/закрытие смены, чеки расхода) имя кассира выводится абсолютно корректно.

В этой статье мы подробно разберем, почему возникает эта ошибка, как работает механизм сериализации данных в XML для драйверов торгового оборудования и как правильно доработать код, чтобы чек полностью соответствовал требованиям 54-ФЗ.

Выясняем причину: как функция XMLСтрока() работает с типами данных

Для того чтобы понять природу возникновения GUID в чеке, нам необходимо заглянуть под капот платформы «1С:Предприятие» и проанализировать работу встроенной функции XMLСтрока(<Значение>). Эта функция отвечает за приведение различных типов данных к каноническому строковому XML-представлению.

Поведение функции напрямую зависит от типа переданного в нее параметра:

  1. Если мы передаем в нее значение типа Строка (например, строковое имя «Петров В.С.»), функция возвращает исходную строку без изменений.
  2. Если же в функцию передается Ссылка на объект базы данных (например, ссылка на элемент справочника Пользователи или ФизическиеЛица), платформа преобразует эту ссылку в ее уникальный идентификатор (GUID) в формате XML.

В библиотеке подключаемого оборудования (БПО), интегрированной в 1С:УПП, формирование XML-пакета для передачи драйверу ККТ (например, Атол) происходит именно через сериализацию параметров. В общем модуле МенеджерОборудованияВызовСервера при формировании XML-структуры чека можно встретить следующий код:


ЗаписьXML.ЗаписатьНачалоЭлемента("Parameters");
ЗаписьXML.ЗаписатьАтрибут("CashierName", XMLСтрока(ОбщиеПараметры.Кассир));

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

Анализируем исходный код печати чека из платежного поручения

Давайте посмотрим на процедуру печати чека из документа «Платежное поручение входящее» (ППВ), которая была представлена в исходном обращении:


ПараметрыЧека = МенеджерОборудованияClientСервер.ПараметрыОперацииФискализацииЧека();
ПараметрыЧека.Вставить("ОписаниеПКС", ОписаниеПКС);

МенеджерОборудованияВызовСервера.ПодготовитьДанныеДляФискализацииЧека(
    Ссылка, 
    ПараметрыЧека, 
    ВерсияФормата, 
    ПолучитьСерверТО().ПолучитьМодель(ФУ), 
    СокрЛП(Контрагент), 
    НазначениеПлатежа
);

Результат = ОбработкаОбслуживания.ФискализироватьЧек(ОбъектДрайвера, ПараметрыЧека);

Обратите внимание на вызов метода ПодготовитьДанныеДляФискализацииЧека. Внутри этого метода система пытается заполнить свойства чека на основе переданного документа-ссылки. В типовых конфигурациях для документов «Приходный кассовый ордер» (ПКО) или «Оплата от покупателя платежной картой» разработчики 1С уже предусмотрели явное преобразование ответственного сотрудника в строковый формат.

Однако при кастомной доработке печати из «Платежного поручения входящего» (ППВ) это преобразование часто упускается из виду. В структуру параметров передается непосредственно объект ссылки на справочник пользователей (Ссылка.Ответственный), что и приводит к ошибке.

Варианты исправления кода

Рассмотрим несколько вариантов решения этой проблемы в зависимости от требований к заполнению имени кассира в вашей организации.

Вариант 1. Простое приведение к строке через наименование (Быстрый способ)

Если в вашей информационной базе наименования пользователей в справочнике Пользователи соответствуют их реальным фамилиям и инициалам, достаточно принудительно передавать строковое свойство Наименование.

Перед вызовом формирования XML-пакета или непосредственно в процедуре подготовки данных найдите место заполнения параметра кассира и примените следующее исправление:


// Вместо передачи ссылки:
// ПараметрыЧека.Вставить("Кассир", Ссылка.Ответственный);

// Используем получение наименования напрямую:
Если ЗначениеЗаполнено(Ссылка.Ответственный) Тогда
    ПараметрыЧека.Вставить("Кассир", Ссылка.Ответственный.Наименование);
Иначе
    ПараметрыЧека.Вставить("Кассир", "Администратор");
КонецЕсли;

Для гарантированной защиты от передачи ссылочного типа можно также использовать безопасное приведение к строке через функцию Строка():

ПараметрыЧека.Вставить("Кассир", Строка(Ссылка.Ответственный));

Вариант 2. Получение ФИО из справочника Физических лиц (Рекомендуемый способ)

В соответствии с требованиями Федерального закона № 54-ФЗ «О применении контрольно-кассовой техники», в чеке должны быть указаны реальная должность и ФИО лица, осуществившего расчет. В крупных базах данных наименования пользователей часто записывают в техническом формате (например, «ИвановИИ» или «Админ»). Печать таких данных в чеке может повлечь замечания со стороны налоговых органов.

Правильнее всего получать ФИО кассира из связанного со справочником Пользователи элемента справочника ФизическиеЛица. Ниже представлен шаблон функции, которая позволяет корректно получить ФИО сотрудника для чека:


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

Внедрите вызов этой функции в процедуру печати чека из ППВ:


ИмяКассира = ПолучитьФИОКассираДляЧека(Ссылка.Ответственный);
ПараметрыЧека.Вставить("Кассир", ИмяКассира);

Вариант 3. Передача ИНН кассира (Требование ФФД 1.05 и выше)

Помимо имени кассира, современные форматы фискальных документов (ФФД) требуют передачи ИНН кассира (тег 1203). Обратите внимание, что ИНН также должен передаваться как строка длиной строго 12 символов. Если передать числовое значение или пустую ссылку, XML-пакет может быть сформирован с ошибками.

Доработаем наш код для корректного заполнения ИНН:


ИННКассира = "";
Если ЗначениеЗаполнено(Ссылка.Ответственный) И ЗначениеЗаполнено(Ссылка.Ответственный.ФизическоеЛицо) Тогда
    ИННКассира = СокрЛП(Ссылка.Ответственный.ФизическоеЛицо.ИНН);
КонецЕсли;

ПараметрыЧека.Вставить("КассирИНН", ИННКассира);

Резюме и рекомендации по отладке

Для того чтобы быстро диагностировать подобные проблемы при работе с торговым оборудованием в 1С, рекомендуем использовать отладчик платформы. Установите точку останова в общем модуле МенеджерОборудованияВызовСервера перед вызовом метода ЗаписатьАтрибут("CashierName", ...) и проверьте тип значения переменной, которая передается в функцию XMLСтрока(). Если тип переменной отличается от Строка, код требует доработки.

Использование строковых реквизитов при формировании параметров фискализации гарантирует корректную печать чека на любом типе ККТ (Атол, Штрих-М и др.) без возникновения скрытых ошибок передачи данных.

← На главную