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