При работе с торговым оборудованием в среде 1С:Предприятие (особенно на старых платформах 8.1 или 7.7) разработчики часто сталкиваются с вопросом: каким методом отправить данные чека на фискальный регистратор? В современных типовых конфигурациях используется передача XML-структуры через метод ProcessCheck, однако при работе напрямую с драйвером Штрих-М (объект AddIn.DrvFR) такого метода не существует. Рассмотрим подробно, как реализовать пробитие чека и передачу обязательных тегов ФФД, используя низкоуровневые команды драйвера.
Для начала выясним важную техническую деталь: драйвер DrvFR.dll (программный интерфейс от производителя) "не знает" о формате XML. Метод ProcessCheck и работа с XML-пакетами — это стандарт фирмы 1С для так называемых "Интеграционных компонент" (например, ShtrihM_KKT_2.dll). Эти компоненты являются "прослойкой": они принимают от 1С XML-файл, разбирают его внутри себя и вызывают последовательность команд обычного драйвера DrvFR.dll.
Если вы работаете в нетиповой или старой конфигурации, где невозможно подключить современную компоненту, вам придется реализовать логику "сборки" чека самостоятельно, вызывая методы драйвера по шагам. Проанализируем, какие именно методы для этого нужны.
Вместо отправки одной длинной строки, мы должны открыть чек, зарегистрировать каждую позицию (товар) и закрыть чек. Рассмотрим примерный код для платформы 8.x:
// 1. Установка связи и авторизация
ФР.Password = "30"; // Пароль администратора или кассира
ФР.Connect();
// 2. Открытие чека (0 - продажа, 1 - покупка, 2 - возврат продажи)
ФР.CheckType = 0;
ФР.OpenCheck();
// 3. Регистрация позиций (цикл по товарам в документе)
Для Каждого СтрокаТЧ Из Товары Цикл
ФР.Password = "30";
ФР.Quantity = СтрокаТЧ.Количество;
ФР.Price = СтрокаТЧ.Цена;
ФР.Department = 1; // Номер секции
ФР.Tax1 = 0; // Налоговая ставка (настраивается в таблицах ККТ)
ФР.StringForPrinting = СтрокаТЧ.Наименование;
ФР.Registration();
КонецЦикла;
// 4. Закрытие чека с указанием сумм оплаты
ФР.Summ1 = СуммаНаличные;
ФР.Summ2 = СуммаБезнал;
ФР.CloseCheck();
С введением 54-ФЗ в чеке стали обязательными дополнительные реквизиты, такие как ИНН кассира (тег 1203). В драйвере Штрих-М для этого используется универсальный метод FNSendTag. Выясним важный нюанс: теги должны отправляться после открытия чека (или начала сессии), но до завершения операции закрытия.
Посмотрим на пример реализации функции передачи ИНН кассира:
Процедура ПередатьИННКассира(ОбъектФР, ИНН)
ОбъектФР.Password = "30";
ОбъектФР.TagNumber = 1203; // Номер тега по классификатору ФФД
ОбъектФР.TagType = 7; // Тип тега (7 - строка)
ОбъектФР.TagValueStr = СокрЛП(ИНН);
ОбъектФР.FNSendTag(); // Отправка тега в фискальный накопитель
Если ОбъектФР.ResultCode <> 0 Тогда
Сообщить("Ошибка передачи тега: " + ОбъектФР.ResultCodeDescription);
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию с открытием смены. Обычный метод OpenSession не всегда позволяет передать необходимые данные для ФФД 1.05. Разработчики Штрих-М рекомендуют использовать расширенную последовательность команд: FNBeginOpenSession (начало открытия) -> передача тегов -> FNOpenSession (финальное открытие). Рассмотрим подробный пример:
Функция ОперацияОткрытьСмену(ФР, Пароль, ИННКассира)
// Начинаем подготовку к открытию смены
ФР.Password = Пароль;
ФР.FNBeginOpenSession();
Если ФР.ResultCode <> 0 Тогда
Возврат ФР.ResultCodeDescription;
КонецЕсли;
// Передаем ИНН кассира (тег 1203)
ФР.TagNumber = 1203;
ФР.TagType = 7;
ФР.TagValueStr = ИННКассира;
ФР.FNSendTag();
// Завершаем открытие смены
ФР.FNOpenSession();
Если ФР.ResultCode <> 0 Тогда
Возврат ФР.ResultCodeDescription;
КонецЕсли;
Возврат "ОК";
КонецФункции
Частой проблемой при прямой работе с драйвером является некорректная отрезка чека: нож срабатывает слишком рано, "зарезая" последние строки текста. Это происходит из-за особенностей протяжки бумаги в механизмах Штрих-М. Выясним, как это исправить.
Способ 1: Программная протяжка. Самый простой метод — печать нескольких пустых строк или строк с точкой перед командой отрезки. Проанализируем код:
Для Сч = 1 По 4 Цикл
ФР.Password = "30";
ФР.StringForPrinting = " "; // Печатаем пробел или точку
ФР.PrintString();
КонецЦикла;
ФР.CutType = 1; // 0 - полная, 1 - частичная
ФР.CutCheck();
Способ 2: Настройка таблиц ККТ. Чтобы не загромождать код 1С лишними циклами, правильнее один раз настроить саму кассу. В утилите "Тест драйвера" перейдите в Таблицы -> Таблица 17 (Региональные настройки). Найдите поле "Количество строк после чека" (обычно это поле 20) и установите значение 4 или 5. После этого касса будет автоматически проматывать бумагу перед каждым срабатыванием ножа.
При использовании прямого обращения к DrvFR.dll помните следующие правила:
30, для кассиров — от 1 до 29. Большинство методов (запись таблиц, закрытие смены) требуют именно пароль администратора.GetECRStatus. Если касса находится в режиме ожидания ввода даты или в режиме открытого чека после сбоя, команды регистрации товара будут возвращать ошибку "Неверное состояние".CloseCheck параметры Summ1, Summ2, Summ3, Summ4 соответствуют типам оплаты, настроенным в таблицах кассы. Обычно Summ1 — это наличные, а Summ2 — безналичный расчет (электронные).Таким образом, переход на прямую работу с драйвером требует более детального описания бизнес-логики в коде 1С, но дает полный контроль над процессом формирования фискального документа, что критично для нестандартных конфигураций и старых платформ.