При отладке кассовых операций в конфигурации «1С:Управление производственным предприятием 1.3» разработчики часто используют стандартный эмулятор торгового оборудования. Типичная ситуация: вызов метода печати чека отрабатывает без ошибок, однако в окне сообщений или на экранной форме выводится только список номенклатурных позиций с ценами и суммами, тогда как шапка документа (наименование организации, ИНН, адрес расчетов, заводской номер ККТ) отсутствует.
Разберем, почему возникает такое поведение, как устроено взаимодействие 1С с фискальным регистратором и что на самом деле будет напечатано на физическом кассовом аппарате.
Проанализируем стандартный вызов печати чека в 1С:УПП 1.3 через подсистему торгового оборудования:
ОшибкаТО = ПолучитьСерверТО().ПечатьЧека(
ФР,
"",
ОбъектПКО.НомерЧекаККМ,
Неопределено,
ТаблицаТоваров,
СуммаНал,
0,
Ложь
);
Встроенный эмулятор ТО представляет собой программную заглушку (мок-объект). Его главная задача — проверить корректность передачи параметров из документов базы данных (структуру колонок в ТаблицаТоваров, типы данных, числовые суммы) и возвратить статус успешного выполнения операции. Эмулятор не содержит виртуальной памяти прошивки кассы и не формирует полноценный графический образ кассовой ленты.
Посмотрим на фрагмент реализации метода открытия чека в обработке эмулятора:
Функция ОткрытьЧек(Объект, Пароль, ЭтоВозврат, НомерЧека, НомерСмены, ФискальныйЧек = Истина) Экспорт
Результат = мНетОшибки;
мФискальныйЧек = ФискальныйЧек;
Если Не мСменаОткрыта Тогда
Сообщить("+++++++++++++++++++ Смена Открыта ++++++++++++++++++" + Символы.ПС);
мСменаОткрыта = Истина;
мНомерСмены = мНомерСмены + 1;
КонецЕсли;
Если мЧекОткрыт Тогда
ОтменитьЧек(Объект);
КонецЕсли;
мНомерЧека = мНомерЧека + 1;
Сообщить("=================== Открытие чека ==================");
Если ЭтоВозврат Тогда
Сообщить("====================== возврата ====================");
Иначе
Сообщить("====================== продажи =====================");
КонецЕсли;
Сообщить("================" + ?(ФискальныйЧек, "== Фискальный", " Нефискальный") + " режим ================");
Сообщить("№ чека: " + Формат(мНомерЧека, "ЧЦ=4; ЧВН=") + " № смены: " + Формат(мНомерСмены, "ЧЦ=4; ЧВН="));
НомерСмены = мНомерСмены;
НомерЧека = мНомерЧека;
мЧекОткрыт = Истина;
мИтогЧека = 0;
Возврат Результат;
КонецФункции
Как видно из кода, эмулятор просто выводит в окно служебных сообщений текстовые разделители и переданные аргументы. У него отсутствуют внутренние таблицы с реквизитами организации, поэтому шапка документа не генерируется.
В классической архитектуре подключения торгового оборудования (драйверы стандарта «1С:Совместимо» старого образца, такие как Штрих-М, АТОЛ) регистрационные данные не передаются из 1С при каждой операции. Выясним, откуда физическое устройство берет эти данные:
ОткрытьЧек или ПечататьСтроку микропрограмма кассового аппарата автоматически берет заголовок из своих таблиц и выводит его на чековую ленту перед списком товарных позиций.Рассмотрим, как выглядит обработка вызова реального драйвера (например, «Штрих-М»):
Если Не Объект.Драйвер.ОткрытьЧек(Объект.ИДУстройства, ФискальныйЧек, ЭтоВозврат, Истина, НомерЧека, НомерСмены) Тогда
Результат = мОшибкаНеизвестно;
Объект.Драйвер.ПолучитьОшибку(Объект.ОписаниеОшибки);
КонецЕсли;
В физический драйвер передаются только параметры режима чека (продажа, возврат, признак фискальности), а всю рутинную работу по выводу шапки берет на себя прошивка ККТ.
Если в боевом режиме из 1С передать только массив или таблицу строк с номенклатурой, ценами и суммами, на бумажном чеке сформируется полный и юридически корректный документ:
Если необходимо визуально оценить макет до ввода ККТ в эксплуатацию, используем следующие варианты:
ФискальныйЧек = Ложь. Касса напечатает полноценный нефискальный чек с шапкой из своих таблиц.