При переходе на онлайн-кассы по стандарту 54-ФЗ многие пользователи конфигурации «1С:Управление торговлей, редакция 10.3» столкнулись с неожиданным поведением системы: при попытке пробить чек на ККТ из документа «Приходный кассовый ордер» (ПКО) на печать выводится не детализированный список товаров, а одна обобщенная строка вида «Принято от... Основание и сумма». При этом разработчик, открывая отладчик, видит, что массив ПараметрыФискализацииЧека.ПозицииЧека внутри программы успешно заполняется конкретными номенклатурными позициями, ценами и суммами.
В этой статье мы подробно разберем, почему так происходит, изучим внутреннюю логику конфигурации и найдем пути решения этой проблемы как методологическими, так и программными средствами.
---
Давайте разберемся по шагам, как устроена обработка фискализации в типовом решении УТ 10.3. В системе существует жесткое разделение документов на две категории: товарные документы (непосредственно отражающие отгрузку) и платежные документы (фиксирующие движение денежных средств).
Проанализируем фрагмент кода, отвечающий за выбор алгоритма заполнения фискального чека:
ЭтоТоварныйДокумент = ТипЗнч(Ссылка) = Тип("ДокументСсылка.РеализацияТоваровУслуг") ИЛИ
ТипЗнч(Ссылка) = Тип("ДокументСсылка.ВозвратТоваровОтПокупателя");
Если ЭтоТоварныйДокумент Тогда
Если Ссылка.ВалютаДокумента = глЗначениеПеременной("ВалютаРегламентированногоУчета") Тогда
КурсОплаты = 1;
Иначе
КурсОплаты = Ссылка.КурсВзаиморасчетов / Ссылка.КратностьВзаиморасчетов;
КонецЕсли;
ЗаполнитьОплатыДляТоварногоДокумента(Ссылка, ОбщиеПараметры, КурсОплаты);
ЗаполнитьТоварныеПозицииДляТоварногоДокумента(Ссылка, ОбщиеПараметры, КурсОплаты);
Иначе
ЗаполнитьОплатыДляПлатежногоДокумента(Ссылка, ОбщиеПараметры);
РасчетыСПокупателем = (ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийПКО.ОплатаПокупателя"))
ИЛИ (ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийРКО.ВозвратДенежныхСредствПокупателю"))
ИЛИ (ТипЗнч(Ссылка) = Тип("ДокументСсылка.ОплатаОтПокупателяПлатежнойКартой"))
Или (ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийПоступлениеБезналичныхДенежныхСредств.ОплатаПокупателя"));
ЭтоВозврат = (ВидОперации = ПредопределенноеЗначение("Перечисление.ВидыОперацийОплатаОтПокупателяПлатежнойКартой.ВозвратДенежныхСредствПокупателю"))
ИЛИ (ТипЗнч(Ссылка) = Тип("ДокументСсылка.РасходныйКассовыйОрдер")) ИЛИ (ТипЗнч(Ссылка) = Тип("ДокументСсылка.ПлатежноеПоручениеИсходящее"));
ЗаполнитьТоварныеПозицииДляПлатежногоДокумента(Ссылка, ОбщиеПараметры,
РасчетыСПокупателем, ЭтоВозврат, КомуОтКого, Основание);
КонецЕсли;
Как мы видим, переменная ЭтоТоварныйДокумент принимает значение Истина только для документов типа «Реализация товаров и услуг» (РТУ) или «Возврат товаров от покупателя». Наш документ ПКО под это условие не подходит, а значит, управление безусловно передается в ветку Иначе, где вызывается процедура ЗаполнитьТоварныеПозицииДляПлатежногоДокумента().
Именно внутри этой процедуры скрыта ключевая логика разделения платежей в рамках требований ФЗ-54. Программа анализирует схему расчетов и определяет признак способа расчета:
Если система квалифицирует платеж как «Оплата кредита» (погашение ранее возникшего долга), то по правилам фискального учета детальная номенклатура не должна дублироваться в чеке. Перечень товаров уже был передан в ОФД в момент проведения документа «Реализация товаров и услуг» с признаком расчета «Передача в кредит». В чеке ПКО должна выводиться только одна общая строка с признаком предмета расчета ПлатежВыплата (погашение кредита).
---
Прежде чем приступать к программированию, давайте проверим корректность ведения учета. Зачастую поведение системы связано с неверным заполнением документов:
---
Если специфика вашего бизнеса требует обязательного вывода детальных позиций номенклатуры при печати чеков именно из ПКО (даже при условии частичной оплаты или постоплаты), потребуется внести изменения в общий модуль, где формируются параметры фискализации.
Рассмотрим пример кастомизации алгоритма заполнения позиций чека для нетоварных документов. Нам необходимо скорректировать поведение процедуры ЗаполнитьТоварныеПозицииДляПлатежногоДокумента.
Мы можем принудительно заставить систему рассчитывать доли стоимости товаров пропорционально сумме платежа, если у ПКО заполнена связь с документом отгрузки. Посмотрим на пример реализации такого алгоритма:
// Фрагмент доработки внутри общего модуля, отвечающего за подготовку чека ПКО
// Выясним, есть ли привязанная реализация
Если ЗначениеЗаполнено(ДокументОснование) И ТипЗнч(ДокументОснование) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда
// Получаем таблицу товаров из реализации
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТовары.Номенклатура.Наименование КАК НоменклатураНаименование,
| РеализацияТовары.Количество КАК Количество,
| РеализацияТовары.СуммаРег КАК Сумма,
| РеализацияТовары.СтавкаНДС КАК СтавкаНДС
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТовары
|ГДЕ
| РеализацияТовары.Ссылка = &ДокументОснование";
Запрос.УстановитьПараметр("ДокументОснование", ДокументОснование);
ТаблицаТоваров = Запрос.Выполнить().Выгрузить();
ИтогоСуммаРТУ = ТаблицаТоваров.Итог("Сумма");
СуммаДокументаПКО = Ссылка.СуммаДокумента;
// Вычисляем коэффициент пропорции для частичной оплаты
КоэффициентОплаты = ?(ИтогоСуммаРТУ <> 0, СуммаДокументаПКО / ИтогоСуммаРТУ, 1);
Для Каждого СтрокаТовара Из ТаблицаТоваров Цикл
СтрокаПозицииЧека = МенеджерОборудованияКлиентСервер.ПараметрыФискальнойСтрокиЧека();
// Устанавливаем корректный признак расчета
СтрокаПозицииЧека.ПризнакПредметаРасчета = Перечисления.ПризнакиПредметаРасчета.Товар;
СтрокаПозицииЧека.Наименование = СтрокаТовара.НоменклатураНаименование;
// Пересчитываем количество и сумму пропорционально оплате
СтрокаПозицииЧека.Количество = СтрокаТовара.Количество;
СтрокаПозицииЧека.Сумма = Окр(СтрокаТовара.Сумма * КоэффициентОплаты, 2);
Если СтрокаПозицииЧека.Количество <> 0 Тогда
СтрокаПозицииЧека.ЦенаСоСкидками = Окр(СтрокаПозицииЧека.Сумма / СтрокаПозицииЧека.Количество, 2);
КонецЕсли;
СтрокаПозицииЧека.СтавкаНДС = РозничныеПродажиКлиентСервер.СтавкаНДСФискальнойОперации(СтрокаТовара.СтавкаНДС);
СтрокаПозицииЧека.НомерСекции = 1;
ПозицииЧека.Добавить(СтрокаПозицииЧека);
КонецЦикла;
ПараметрыФискализацииЧека.ПозицииЧека = ПозицииЧека;
КонецЕсли;
Важное примечание: Использование модифицированного алгоритма с пропорциональным распределением сумм (коэффициент оплаты) позволяет корректно распределить частичную оплату по всем товарным позициям из исходной накладной. Это исключит возникновение расхождений между фискальными данными в ОФД и фактической отгрузкой.
---
Мы выяснили, что отсутствие товаров в чеке из ПКО в УТ 10.3 — это не ошибка программы, а заложенное вендором архитектурное решение, соответствующее базовой методологии ФЗ-54.
Для исправления ситуации вам доступны два пути: перестроить бизнес-процесс работы кассиров (пробивать чеки непосредственно из документов отгрузки «Реализация товаров и услуг»), либо модифицировать процедуру ЗаполнитьТоварныеПозицииДляПлатежногоДокумента() в кодовой базе конфигурации для принудительного разворачивания номенклатурного состава.