Как настроить печать чека ККТ из платежных поручений в 1С:УПП 1.3?

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

В типовой конфигурации 1С:Управление производственным предприятием (УПП) редакции 1.3 функционал печати чеков на контрольно-кассовой технике (ККТ) реализован для ограниченного набора документов, таких как «Приходный кассовый ордер» (ПКО), «Расходный кассовый ордер» (РКО) и «Реализация товаров и услуг» (РТУ). Однако согласно требованиям 54-ФЗ, при получении безналичных оплат от физических лиц через банк (платежные поручения) организация также обязана формировать фискальный чек. В данной статье мы подробно разберем, как самостоятельно доработать систему для печати чеков напрямую из документов ПлатежноеПоручениеВходящее и ПлатежноеПоручениеИсходящее.

Почему в УПП 1.3 нет типового решения?

Конфигурация УПП 1.3 построена на обычных формах и находится на ограниченной поддержке. В отличие от современных решений (БП 3.0, ERP), где используется актуальная Библиотека подключаемого оборудования (БПО) и управляемые формы, в УПП механизмы фискализации жестко привязаны к конкретным видам документов. Платежные поручения в УПП исторически не считались «кассовыми» документами, поэтому интеграция с драйвером ККТ для них не предусмотрена. Для решения этой задачи нам потребуется внести изменения в код документов и общих модулей.

Шаг 1: Подготовка метаданных документа

Прежде чем приступать к написанию кода, проанализируем необходимые реквизиты. Чтобы система могла корректно работать с ККТ и хранить результат операции, в документы ПлатежноеПоручениеВходящее и ПлатежноеПоручениеИсходящее необходимо добавить следующие реквизиты:

  1. НомерЧекаККМ (Тип: Число) — для хранения номера пробитого чека.
  2. ПризнакСпособаРасчета (Тип: ПеречислениеСсылка.ПризнакиСпособаРасчета) — для корректного указания тега 1214 (например, «Аванс» или «Полный расчет»).

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

Шаг 2: Модификация модуля формы документа

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

Разберем добавление поддержки торгового оборудования:


Функция ПоддерживаетсяВидТО(Вид) Экспорт
    Результат = Ложь;
    Если Вид = Перечисления.ВидыТорговогоОборудования.ККТ Тогда
        Результат = Истина;
    КонецЕсли;
    Возврат Результат;
КонецФункции

Далее настроим автоматическое подключение и отключение клиента торгового оборудования при открытии и закрытии формы:


Процедура ПриОткрытии()
    // Стандартный механизм подключения ТО
    ПолучитьСерверТО().ПодключитьКлиента(ЭтаФорма);
КонецПроцедуры

Процедура ПриЗакрытии()
    // Отключаем оборудование, чтобы освободить порт
    ПолучитьСерверТО().ОтключитьКлиента(ЭтаФорма);
КонецПроцедуры

Шаг 3: Реализация процедуры печати чека

Теперь создадим основную процедуру, которая будет вызываться по кнопке «Чек». Рассмотрим пример кода, который подготавливает параметры фискализации и отправляет команду на драйвер. Проанализируем ключевые моменты работы с объектом ОбработкаОбслуживания.


Процедура ОсновныеДействияФормыЧек(Кнопка)    
    Если НомерЧекаККМ <> 0 Тогда
        Предупреждение("Чек уже пробит!");
        Возврат;
    КонецЕсли;

    // Получаем список доступных устройств ККТ
    МассивККТ = ПолучитьСерверТО().ПолучитьСписокУстройств(
                    Перечисления.ВидыТорговогоОборудования.ККТ, Организация);
    
    Если МассивККТ.Количество() = 0 Тогда
        Предупреждение("Фискальное устройство не подключено!");
        Возврат;
    КонецЕсли;
    
    ФУ = МассивККТ[0]; // Берем первое найденное устройство

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

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

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

Шаг 4: Правка общего модуля МенеджерОборудованияВызовСервера

Система 1С:УПП использует общий модуль МенеджерОборудованияВызовСервера для формирования XML-пакета данных, который уходит в драйвер. Если мы просто добавим кнопку в форму, код в общем модуле «не узнает» новый тип документа. Выясним, какие изменения нужно внести в процедуру ПодготовитьДанныеДляФискализацииЧека.

Найдем место, где определяется тип документа, и добавим условие для наших платежных поручений:


ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.РасходныйКассовыйОрдер") 
      ИЛИ ТипЗнч(Ссылка) = Тип("ДокументСсылка.ПлатежноеПоручениеИсходящее") Тогда
    // Логика заполнения данных для исходящих платежей (Расход)
    ...
ИначеЕсли ТипЗнч(Ссылка) = Тип("ДокументСсылка.ПриходныйКассовыйОрдер") 
      ИЛИ ТипЗнч(Ссылка) = Тип("ДокументСсылка.ПлатежноеПоручениеВходящее") Тогда
    // Логика для входящих платежей (Приход)
    ...
КонецЕсли;

Важный нюанс: В процедуре ЗаполнитьОплатыДляПлатежногоДокумента того же модуля нужно убедиться, что тип оплаты устанавливается как «Электронно» (тип 1 для ФФД), так как платежное поручение — это безналичный расчет.

Шаг 5: Исправление ошибки с отсутствующим реквизитом АдресЭП

Часто при попытке пробить чек из документа, где не предусмотрено поле для почты/телефона, возникает системная ошибка: Поле не найдено "АдресЭП". Посмотрим на пример безопасного получения этого реквизита в процедуре ПодготовитьДанныеДляФискализацииЧека:


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

Альтернативный вариант: Внешняя печатная форма

Если вы не хотите «ломать» конфигурацию и снимать документы с поддержки, проанализируем возможность использования внешних печатных форм. В УПП 1.3 внешняя печатная форма — это полноценная обработка, в которой можно реализовать всю логику фискализации. Вы подключаете её через справочник «Внешние обработки», и в меню «Печать» документа появляется пункт «Чек ККМ». Это наиболее безопасный способ обновления системы, так как при обновлении типовой конфигурации ваши доработки не затрутся.

Основные преимущества использования внешней обработки:

Таким образом, мы рассмотрели два подхода к реализации печати чеков из безналичных платежных документов в УПП 1.3. Программная доработка требует внимательности при изменении общих модулей, но обеспечивает максимально тесную интеграцию с интерфейсом пользователя.

← На главную