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

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

При разработке внешних обработок в среде 1С:Управление торговлей 11 (особенно версий 11.4 и выше) часто возникает задача автоматизации печати фискальных чеков. Казалось бы, достаточно найти процедуру "Пробить чек" и вызвать её, но на практике разработчики сталкиваются с архитектурными особенностями взаимодействия платформы и торгового оборудования. В этой статье мы разберем по шагам, как правильно реализовать этот механизм, учитывая разделение на клиентский и серверный контексты.

Понимание архитектуры печати чеков (БПО)

Прежде чем приступать к написанию кода, проанализируем ситуацию: почему нельзя просто вызвать метод печати на сервере? В современных конфигурациях 1С используется Библиотека подключаемого оборудования (БПО). Фискальный регистратор (ККТ) подключен физически к клиентскому компьютеру (через USB, COM-порт или по сети, но драйвер инициализируется в сеансе пользователя). Сервер 1С "не видит" устройство напрямую. Поэтому процесс всегда делится на два этапа:

  1. На сервере: Сбор данных из документа (товары, суммы, ставки НДС, данные покупателя) и формирование специальной структуры или массива.
  2. На клиенте: Передача этой структуры драйверу оборудования и выполнение команды печати.

Рассмотрим подробнее каждый из этих этапов.

Шаг 1: Подготовка данных на сервере

Для того чтобы ККТ корректно сформировала чек, ей нужны данные в строго определенном формате. В УТ 11 за это отвечают модули менеджеров документов и специализированные серверные модули БПО. Если вы программно создали Приходный кассовый ордер (ПКО), убедитесь, что в нем заполнена табличная часть "Расшифровка платежа". Именно на её основании система понимает, за что принимаются деньги.

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


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

Обратите внимание, что в зависимости от версии УТ 11.4, названия методов могут незначительно меняться, но общая логика МенеджерОборудованияВызовСервера остается неизменной.

Шаг 2: Клиентская часть и вызов печати

Теперь перейдем к самому важному — вызову процедуры печати. Как правильно заметили участники обсуждения, в управляемых формах УТ 11 кнопка "Пробить чек" часто является динамической гиперссылкой. Чтобы воспроизвести её действие во внешней обработке, нам нужно обратиться к общему модулю МенеджерОборудованияКлиент.

Рассмотрим по шагам логику клиентского метода:

  1. Получаем подготовленные данные с сервера.
  2. Создаем ОписаниеОповещения (так как работа с оборудованием в новых версиях платформы 8.3 асинхронная).
  3. Вызываем команду ВыполнитьКомандуПечатиЧека.

Пример реализации на стороне клиента во внешней обработке:


&НаКлиенте
Процедура ПробитьЧекНаКлиенте(Команда)
    
    // 1. Получаем данные с сервера (функция из Шага 1)
    СтруктураДанных = ПодготовитьДанныеДляЧека(Объект.СсылкаНаПКО);
    
    // 2. Настраиваем оповещение о завершении
    Оповещение = Новый ОписаниеОповещения("ПослеПечатиЧека", ЭтотОбъект);
    
    // 3. Параметры печати
    ПараметрыПечати = Новый Структура;
    ПараметрыПечати.Вставить("ДанныеЧека", СтруктураДанных);
    ПараметрыПечати.Вставить("ИдентификаторУстройства", Объект.КассаККМ); // Если нужно конкретное устройство
    
    // 4. Вызов БПО
    МенеджерОборудованияКлиент.ВыполнитьКомандуПечатиЧека(ПараметрыПечати, Оповещение);
    
КонецПроцедуры

&НаКлиенте
Процедура ПослеПечатиЧека(Результат, ДополнительныеПараметры) Экспорт
    Если Результат = Истина Тогда
        ПоказатьОповещениеПользователя("Успех", , "Чек успешно пробит");
    Иначе
        // Обработка ошибки
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не удалось пробить чек.");
    КонецЕсли;
КонецПроцедуры

Шаг 3: Нюансы для версии УТ 11.4.3+

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

Важные моменты, которые стоит проверить:

Типичные ошибки при реализации

Разберем, почему решение может не работать:

1. Попытка печати "на сервере": Как мы уже выяснили, сервер 1С не имеет доступа к локальным портам пользователя. Если вам нужно реализовать "облачную печать" (когда сервер сам посылает данные на ККТ по IP), используются методы МенеджерОборудованияСервер, но это требует специфической настройки оборудования и поддержки со стороны драйвера (например, работа через Web-сервис или прямой TCP-стек).

2. Отсутствие прав: У пользователя, запускающего внешнюю обработку, должны быть права на использование торгового оборудования и на проведение кассовых документов.

3. Несоответствие типов: Структура ПараметрыПечати должна соответствовать ожиданиям БПО. Если вы вручную собираете массив строк чека, убедитесь, что все обязательные поля (Наименование, Количество, Цена, СтавкаНДС) заполнены корректно. Использование типового метода ПодготовитьДанныеДляПечатиЧека избавляет от этой проблемы.

Используя приведенную схему, вы сможете интегрировать печать чеков в любую внешнюю обработку, сохраняя при этом совместимость с типовыми механизмами обновления 1С:Управление торговлей 11.

← На главную