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