При разработке собственных механизмов или интеграций, связанных с печатью чеков на контрольно-кассовой технике (ККТ), часто возникает вопрос выбора правильных программных методов. В современных конфигурациях 1С, использующих Библиотеку стандартных подсистем (БСП) версии 3.0 и выше, существует два схожих по названию, но разных по сути общих модуля для работы с оборудованием. Разберемся, какой из них использовать и почему.
Проанализируем две функции: ПодключаемоеОборудованиеВызовСервера.ДанныеЧекаДляФискализации и МенеджерОборудованияВызовСервера.СформироватьСтруктуруДанныхЧека. Наша задача — понять их различия и освоить актуальный способ формирования данных для печати фискального чека.
Основное различие между этими функциями заключается в версиях Библиотеки стандартных подсистем (БСП), в которых они являются основными. Понимание этой разницы — ключ к написанию современного и поддерживаемого кода.
1. Устаревший подход: ПодключаемоеОборудованиеВызовСервера
Модуль ПодключаемоеОборудованиеВызовСервера и его функции, включая ДанныеЧекаДляФискализации, относятся к более ранним версиям БСП (до 3.0). Этот механизм все еще сохраняется в типовых конфигурациях для обеспечения обратной совместимости со старыми драйверами и разработками. Использовать его для новых проектов не рекомендуется, так как он может быть исключен в будущих версиях и не поддерживает все возможности современного оборудования.
2. Актуальный подход: МенеджерОборудованияВызовСервера
Модуль МенеджерОборудованияВызовСервера является частью новой архитектуры работы с подключаемым оборудованием, представленной в БСП 3.0. Функция СформироватьСтруктуруДанныхЧека — это современный, рекомендуемый способ подготовки данных для фискализации. Этот подход обладает рядом преимуществ:
ПараметрыОперации, что делает код более читаемым и простым для модификации.Вывод: для любых новых разработок, связанных с печатью фискальных чеков в современных конфигурациях, следует однозначно использовать методы общего модуля МенеджерОборудованияВызовСервера.
Рассмотрим по шагам, как программно сформировать и отправить на печать фискальный чек, используя актуальный механизм БСП 3.0. Процесс состоит из нескольких логических этапов: подготовка параметров, формирование структуры данных и выполнение команды печати.
Подготовка исходных данных
Сначала необходимо подготовить структуру с параметрами операции. Это основной объект, который будет содержать всю информацию о чеке, устройстве и документе-основании. В него нужно поместить идентификатор рабочего места, идентификатор устройства ККТ, ссылку на документ-основание и массив строк с данными чека.
// Создаем основную структуру параметров
ПараметрыОперации = Новый Структура;
// Указываем идентификатор рабочего места текущего пользователя
ПараметрыОперации.Вставить("ИдентификаторРабочегоМеста", МенеджерОборудованияКлиентСервер.ИдентификаторРабочегоМеста());
// Указываем идентификатор устройства. Его можно получить из справочника "ПодключаемоеОборудование"
// Например, для определенного устройства с известным кодом:
// Устройство = Справочники.ПодключаемоеОборудование.НайтиПоКоду("000000001");
// ПараметрыОперации.Вставить("ИдентификаторУстройства", Устройство.Ссылка);
// В данном примере будем считать, что он уже получен и хранится в переменной ИдентификаторУстройства
ПараметрыОперации.Вставить("ИдентификаторУстройства", ИдентификаторУстройства);
// Вставляем ссылку на документ-основание, например, "Реализация товаров и услуг"
ПараметрыОперации.Вставить("ДокументОснование", СсылкаНаДокументОснование);
// Готовим массив строк для чека. Это еще одна структура внутри основной.
ДанныеЧека = Новый Структура;
ДанныеЧека.Вставить("МассивСтрок", Новый Массив); // Сюда будут добавляться товарные позиции
// ... здесь будет код добавления товаров
ПараметрыОперации.Вставить("ДанныеЧека", ДанныеЧека);
Заполнение товарных позиций чека
Теперь нужно заполнить массив товарных позиций (МассивСтрок). Каждая позиция — это структура с определенным набором полей: Номенклатура, Количество, Цена, СтавкаНДС и т.д. Пройдемся по табличной части документа-основания и добавим каждую строку в наш массив.
// Предположим, что ДокументОбъект - это объект документа "РеализацияТоваровУслуг"
Для Каждого ТекСтрокаТовары Из ДокументОбъект.Товары Цикл
СведенияОТоваре = Новый Структура;
СведенияОТоваре.Вставить("Номенклатура", ТекСтрокаТовары.Номенклатура);
СведенияОТоваре.Вставить("Наименование", ТекСтрокаТовары.Номенклатура.Наименование);
СведенияОТоваре.Вставить("Количество", ТекСтрокаТовары.Количество);
СведенияОТоваре.Вставить("Цена", ТекСтрокаТовары.Цена);
СведенияОТоваре.Вставить("Сумма", ТекСтрокаТовары.Сумма);
СведенияОТоваре.Вставить("СтавкаНДС", ТекСтрокаТовары.СтавкаНДС);
СведенияОТоваре.Вставить("СуммаНДС", ТекСтрокаТовары.СуммаНДС);
СведенияОТоваре.Вставить("ЕдиницаИзмерения", ТекСтрокаТовары.ЕдиницаИзмерения.Наименование);
// Добавляем заполненную структуру в массив строк чека
ПараметрыОперации.ДанныеЧека.МассивСтрок.Добавить(СведенияОТоваре);
КонецЦикла;
Важно: набор полей в структуре СведенияОТоваре может отличаться в зависимости от требований к чеку (например, для маркировки, агентских схем и т.д.). Необходимо сверяться с документацией к БСП для вашей версии конфигурации.
Вызов функции формирования данных
Когда структура ПараметрыОперации полностью заполнена, вызываем функцию СформироватьСтруктуруДанныхЧека. Она обработает наши данные и вернет новую структуру, готовую для передачи драйверу ККТ.
// Вызываем серверную функцию для формирования данных для фискализации
ПараметрыКоманды = МенеджерОборудованияВызовСервера.СформироватьСтруктуруДанныхЧека(ПараметрыОперации);
Результат ПараметрыКоманды содержит все необходимые данные в формате, понятном для драйвера оборудования. Если на этом этапе возникнут ошибки (например, не заполнены обязательные поля), функция вызовет исключение.
Выполнение команды печати чека
Последний шаг — отправка подготовленных данных на устройство. Для этого используется метод ВыполнитьКоманду, которому мы передаем идентификатор команды (в нашем случае "НапечататьЧек") и полученную на предыдущем шаге структуру ПараметрыКоманды.
// Определяем идентификатор команды
ИдентификаторКоманды = "НапечататьЧек";
// Выполняем команду на сервере
РезультатВыполнения = МенеджерОборудованияВызовСервера.ВыполнитьКоманду(
ИдентификаторКоманды,
ПараметрыКоманды
);
// Проверяем результат
Если НЕ РезультатВыполнения.Выполнена Тогда
// Обрабатываем ошибку печати чека
Сообщить("Не удалось напечатать чек: " + РезультатВыполнения.ИнформацияОбОшибке);
КонецЕсли;
Структура РезультатВыполнения содержит информацию об успехе операции. Если флаг Выполнена равен Ложь, то в свойстве ИнформацияОбОшибке будет содержаться текст ошибки, полученный от драйвера ККТ.
Таким образом, мы рассмотрели полный цикл программной печати чека с использованием актуальной архитектуры БСП 3.0. Всегда отдавайте предпочтение методам из модуля МенеджерОборудованияВызовСервера, чтобы ваш код был современным, надежным и легко адаптируемым к будущим изменениям в законодательстве и технологиях 1С.