Как программно создать ПКО и пробить чек в 1С:Управление торговлей 10.3

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

В практике автоматизации торгового учета на базе конфигурации «1С:Управление торговлей 10.3» (работающей на обычных формах платформы 1С:Предприятие 8) часто возникает задача автоматического приема оплат. Например, при интеграции с сайтом, обработке заказов из мобильных приложений или пакетном закрытии сделок необходимо не просто создать документ Приходный кассовый ордер (ПКО), но и программно, без участия пользователя и открытия диалоговых окон, фискализировать операцию — то есть пробить чек на подключенном фискальном регистраторе (ККМ).

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

Анализ типовых ошибок: почему простой вызов ПечатьЧекаПКО не работает

Рассмотрим ситуацию, когда разработчик пытается вызвать метод печати чека напрямую, используя следующий код:


Результат = ПолучитьСерверТО().ПечатьЧекаПКО(ФР, ПарольКассира, НомерЧека, НомерСмены, ТаблицаПлатежей, СуммаДокумента, 0);

При выполнении этого фрагмента система практически всегда выдает ошибку инициализации или сообщает о невозможности подключиться к устройству. Проанализируем основные причины этой проблемы:

  1. Неопределенное устройство (ФР): Переменная, отвечающая за фискальный регистратор, должна содержать конкретную ссылку на подключенное оборудование из справочника торгового оборудования. Если передать туда пустое значение или неопределенную переменную, система не поймет, на какой порт и драйвер отправлять команду.
  2. Отсутствие инициализации сессии ТО: Торговое оборудование работает в контексте текущего сеанса пользователя. Если сессия работы с торговым оборудованием не запущена или оборудование не подключено в коде перед выполнением печати, ККМ будет заблокирована.
  3. Некорректная структура таблицы платежей: Метод ожидает строго определенную структуру таблицы значений со ставками НДС, суммами и текстовыми наименованиями. Передача пустой таблицы или таблицы с неверными типами колонок вызовет системный сбой.

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

Решение №1: Реализация для классического торгового оборудования (до 54-ФЗ)

Если на вашем предприятии используется старая схема интеграции (без онлайн-передачи данных в налоговую), механизм взаимодействия строится через функции обработки торгового оборудования общего модуля РаботаСТорговымОборудованием и обработку обслуживания ТО.

Рассмотрим пошагово правильный алгоритм программной фискализации ПКО.

Шаг 1. Проверка и подключение фискального регистратора. Перед отправкой команды на печать необходимо убедиться, что устройство физически доступно, драйвер загружен, а параметры связи корректны. Для этого задействуем типовые механизмы конфигурации:


Перем ФР;

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

Шаг 2. Подготовка структуры таблицы платежей. Фискальный регистратор требует передачи детальной информации по платежу. Создадим таблицу значений с обязательными колонками Заголовок, Сумма и НДС:


ТаблицаПлатежей = Новый ТаблицаЗначений();
ТаблицаПлатежей.Колонки.Добавить("Заголовок", Новый ОписаниеТипов("Строка"));
ТаблицаПлатежей.Колонки.Добавить("Сумма",     Новый ОписаниеТипов("Число"));
ТаблицаПлатежей.Колонки.Добавить("НДС",       Новый ОписаниеТипов("Число"));

// Заполняем таблицу данными из расшифровки платежа нашего ПКО
Для Каждого СтрокаПКО Из ОбъектПКО.РасшифровкаПлатежа Цикл
    НоваяСтрока = ТаблицаПлатежей.Добавить();
    НоваяСтрока.Заголовок = "Оплата от " + СокрЛП(ОбъектПКО.Контрагент) + " по док. " + СокрЛП(СтрокаПКО.ДокументРасчетовСКонтрагентом);
    НоваяСтрока.Сумма     = СтрокаПКО.СуммаПлатежа;
    
    // Получаем числовое значение ставки НДС (например, 20 или 10)
    НоваяСтрока.НДС       = УчетНДС.ПолучитьСтавкуНДС(СтрокаПКО.СтавкаНДС); 
КонецЦикла;

Шаг 3. Непосредственная печать и обработка результата. После того как параметры подготовлены, вызываем сервер торгового оборудования для фискализации операции:


ПарольКассира = ПолучитьСерверТО().ПолучитьПарольКассираККМ();
НомерЧека = 0;
НомерСмены = 0;

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

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

Решение №2: Современная программная печать чеков для онлайн-ККТ (по 54-ФЗ)

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

При работе с онлайн-кассами в УТ 10.3 используется интеграция через подсистему БСП (Библиотека стандартных подсистем) — «Менеджер оборудования». Фискализация выполняется на клиенте в асинхронном режиме.

Рассмотрим два основных варианта реализации программного пробития чеков для онлайн-ККТ.

Вариант А. Программная эмуляция интерактивного пробития чека из формы

Этот способ является наиболее безопасным и простым в реализации, так как он использует уже протестированные разработчиками 1С алгоритмы проверки смен, подготовки XML-данных чека и отправки команд на драйвер ККТ. Мы можем программно открыть форму нужного ПКО в скрытом или свернутом режиме и вызвать процедуру обработки нажатия кнопки «Чек».

Проанализируем пример кода для реализации этой схемы:


// Шаг 1. Документ ПКО обязательно должен быть проведен в базе данных
Если Не ОбъектПКО.Проведен Тогда
    ОбъектПКО.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;

// Шаг 2. Получаем форму документа
ПараметрыОткрытия = Новый Структура("Ключ", ОбъектПКО.Ссылка);
ФормаДокумента = ПолучитьФорму("Документ.ПриходныйКассовыйОрдер.ФормаДокумента", ПараметрыОткрытия);

// Открываем форму программно (при необходимости можно сделать ее невидимой для пользователя)
ФормаДокумента.Открыть();

// Шаг 3. Инициируем вызов процедуры печати чека
// Название экспортной процедуры может незначительно отличаться в зависимости от релиза УТ 10.3
Попытка
    ФормаДокумента.ОсновныеДействияФормыЧек(Неопределено);
    ФормаДокумента.Закрыть();
Исключение
    Сообщить("Ошибка при вызове фискализации: " + ОписаниеОшибки(), СтатусСообщения.Важное);
    ФормаДокумента.Закрыть();
КонецПопытки;

Вариант Б. Полностью фоновое пробитие чека без использования форм (через API Менеджера оборудования)

Если вам требуется реализовать массовую фоновую печать чеков (например, регламентным заданием), открывать интерактивные формы документов нельзя. В этом случае логику придется реализовать через обращение к функциям модуля объекта ПКО и менеджеру оборудования клиента.

Разберем, как выглядит схема вызова низкоуровневых методов фискализации:


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

Если ПодготовленныеДанные = Неопределено Тогда
    ВызватьИсключение "Не удалось сформировать XML-данные для чека. Проверьте заполнение ПКО!";
КонецЕсли;

// 2. Определяем уникальный идентификатор подключенной ККТ
ИдентификаторУстройства = МенеджерОборудованияКлиент.ПолучитьАктивноеУстройство(Перечисления.ВидыТорговогоОборудования.ККТ);

Если Не ЗначениеЗаполнено(ИдентификаторУстройства) Тогда
    ВызватьИсключение "Активная онлайн-касса не найдена в системе!";
КонецЕсли;

// 3. Отправляем команду на фискализацию устройства
ПараметрыОперации = Новый Структура();
ПараметрыОперации.Вставить("ДанныеЧека", ПодготовленныеДанные);

// Асинхронный вызов печати на подключенной ККТ
МенеджерОборудованияКлиент.НачатьФискализациюЧекаНаФискальномУстройстве(
    Новый ОписаниеОповещения("ПослеПечатиЧека", ЭтотОбъект), 
    УникальныйИдентификатор, 
    ИдентификаторУстройства, 
    ПараметрыОперации
);

При использовании асинхронного вызова обязательно опишем процедуру обратного вызова (оповещения) ПослеПечатиЧека в модуле, откуда инициируется печать, чтобы зафиксировать успешное окончание операции или обработать возникшие ошибки ККТ:


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

Подведем итоги

Программное пробитие чеков из ПКО в конфигурации «1С:Управление торговлей 10.3» требует четкого понимания используемой архитектуры кассового оборудования на предприятии. Для устаревших не-онлайн моделей ККМ ключевым фактором является предварительная инициализация переменной ФР и корректное ручное построение таблицы платежей с расчетом НДС. В случае использования современных онлайн-касс по 54-ФЗ лучшим решением будет использование типовых процедур подготовки XML-данных чека через вызовы методов БСП, так как ручное формирование структуры чека без номенклатурного состава приведет к нарушению действующего законодательства.

← На главную