Как подключить фискальный регистратор Мини-ФП54.01 к 1С 7.7 и правильно обрабатывать ответы драйвера?

Программист 1С v7.7 Торговля и дистрибуция
← На главную

Работа с фискальными регистраторами семейства «Мини» (в частности, моделью Мини-ФП54.01) в среде 1С 7.7 через библиотеку ecrT400.dll часто сопряжена с определенными трудностями. Одной из наиболее распространенных проблем является то, что при отправке любой команды через метод t400me драйвер возвращает значение -1. На первый взгляд это кажется ошибкой, однако это особенность работы OLE-сервера ecrmini.t400. Разберем пошагово, как правильно настроить обмен данными, получить корректные ответы от устройства и реализовать полноценную печать фискального чека.

Решение проблемы с получением ответа от драйвера

Проанализируем типичную ситуацию: программист вызывает метод t400me и ожидает получить строку с результатом (например, номер чека или статус порта), но получает -1. Это происходит потому, что основная функция лишь подтверждает факт передачи команды драйверу. Чтобы считать реальный результат выполнения последней операции, необходимо использовать недокументированную (или слабо задокументированную) команду get_last_result.

Рассмотрим пример кода для получения остатка наличности в кассе:


Попытка
    фрОбъект.t400me("get_cashbox_sum");
    ОстатокРРО = фрОбъект.get_last_result;
    
    // Результат возвращается в виде строки с разделителями ";", например: "0;1500.50;0;0;..."
    Спис = СоздатьОбъект("СписокЗначений");
    СтрПарс = ОстатокРРО;
    Инд = Найти(СтрПарс, ";");
    Пока Инд <> 0 Цикл
        ТекСтр = Сред(СтрПарс, 1, Инд - 1);
        СтрПарс = Сред(СтрПарс, Инд + 1, СтрДлина(СтрПарс) - Инд);
        Спис.ДобавитьЗначение(СокрЛП(ТекСтр));
        Инд = Найти(СтрПарс, ";");
    КонецЦикла;
    
    // Вторая позиция в ответе обычно содержит сумму наличности
    тОстатокРРО = Число(Спис.ПолучитьЗначение(2));
Исключение
    РезОш = фрОбъект.get_last_error;
    Сообщить("Ошибка ЭККА МИНИ ФП54: " + РезОш);
КонецПопытки;

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

Настройка подключения и инициализация устройства

Перед началом работы необходимо убедиться, что библиотека ecrT400.dll зарегистрирована в операционной системе с помощью команды regsvr32. В коде 1С инициализация выглядит следующим образом:


Попытка
    Соед = CreateObject("ecrmini.t400");
    Сообщить("Драйвер подключен успешно.");
Исключение
    Сообщить("Ошибка запуска компоненты. Работа с ФР невозможна.");
    Возврат;
КонецПопытки;

При открытии порта (команда open_port) важно учитывать скорость соединения. Хотя современные аппараты поддерживают 115200, в некоторых случаях (особенно при использовании длинных кабелей или переходников USB-COM) стабильность повышается на скорости 57600 или ниже. Также обратите внимание на номер порта: в современных ОС виртуальные порты могут иметь номера выше 9, что требует корректной передачи строки подключения.

Алгоритм печати фискального чека

Выясним причину, по которой у многих не получается пробить чек с первого раза. В фискальных принтерах «Мини» реализована жесткая структура чека. Нельзя просто отправить команду «напечатать строку». Процесс должен быть следующим:

  1. Открытие порта (open_port).
  2. Регистрация кассира (cashier_registration). Без этой команды ФР не позволит открыть чек.
  3. Работа с базой товаров (PLU). Фискальный принтер — это, по сути, кассовый аппарат, и он требует, чтобы товар был сначала занесен в его внутреннюю память (add_plu), а затем продан по коду (sale_plu).
  4. Открытие чека (open_receipt).
  5. Регистрация продаж (sale_plu).
  6. Закрытие чека и оплата (pay).
  7. Закрытие порта (close_port).

Разберем подробный пример реализации функции печати чека из документа 1С:


// 1. Подготовка командного файла (или выполнение последовательно)
ФайлКоманд = "C:\temp\cmd.txt";
ФТекст = СоздатьОбъект("Текст");
ФТекст.ДобавитьСтроку("open_port;1;115200;"); // Порт 1, скорость 115200
ФТекст.ДобавитьСтроку("cashier_registration;1;0;"); // Кассир №1, пароль 0

// 2. Добавление товаров в память принтера перед продажей
ВыбратьСтроки();
Пока ПолучитьСтроку() > 0 Цикл
    КодТовара = СокрЛП(Товар.Код);
    ИмяТовара = Лев(СокрЛП(Товар.Наименование), 46); // Ограничение длины наименования
    ЦенаТовара = СокрЛП(Формат(Цена, "Ч10.2"));
    Колво = СокрЛП(Формат(Количество, "Ч10.3"));
    
    // Команда add_plu;код;налог;группа;отдел;флаги;...;цена;штрихкод;название;кол-во;
    ФТекст.ДобавитьСтроку("add_plu;" + КодТовара + ";1;0;0;0;1;1;" + ЦенаТовара + ";" + КодТовара + ";" + ИмяТовара + ";" + Колво + ";");
КонецЦикла;

// 3. Открытие и наполнение чека
ФТекст.ДобавитьСтроку("open_receipt;0"); // 0 - тип чека (продажа)
ВыбратьСтроки();
Пока ПолучитьСтроку() > 0 Цикл
    КодТовара = СокрЛП(Товар.Код);
    Колво = СокрЛП(Формат(Количество, "Ч10.3"));
    ЦенаТовара = СокрЛП(Формат(Цена, "Ч10.2"));
    
    // Продажа товара из памяти по коду
    ФТекст.ДобавитьСтроку("sale_plu;0;0;0;" + Колво + ";" + КодТовара + ";" + ЦенаТовара + ";");
КонецЦикла;

// 4. Оплата и завершение
ФТекст.ДобавитьСтроку("pay;0;0"); // Тип оплаты 0 (наличные), сумма 0 (автоматически на всю сумму)
ФТекст.ДобавитьСтроку("close_port;");
ФТекст.Записать(ФайлКоманд);

// Выполнение пакета команд
Соед.t400me("execute_file;C:\temp\cmd.txt");
Ответ = Соед.get_last_result;
Сообщить("Результат операции: " + Ответ);

Важные технические нюансы и советы

Проанализируем несколько критических моментов, которые помогут избежать сбоев в работе системы:

  1. Динамическая база товаров: Память фискального принтера ограничена (обычно несколько тысяч артикулов). Если ваша база товаров в 1С больше, используйте циклическую перезапись кодов или очистку базы PLU. Однако самый простой и надежный способ для Мини-ФП54.01 — это вызов add_plu непосредственно перед sale_plu для каждой позиции чека.
  2. Округление и налоги: Алгоритмы округления в 1С и в прошивке принтера могут различаться на копейку. Рекомендуется рассчитывать скидки в 1С и передавать в принтер уже финальную цену за единицу, либо использовать передачу скидки значением, а не процентом.
  3. Ошибки USB-соединения: В ОС Windows существует проблема, при которой после сбоя питания или отключения кабеля виртуальный COM-порт "зависает". Помогает только перезагрузка ПК или использование Ethernet-подключения, если модель принтера его поддерживает. При подключении по сети строка открытия порта изменится на open_port;192.168.1.100;9100;.
  4. Таймауты: Если вы работаете с медленными каналами связи, увеличьте время ожидания ответа от устройства в настройках драйвера.

Сервисные команды для отладки

Для создания качественного интерфейса кассира в 1С 7.7 рекомендуется использовать следующие методы:

Использование связки метода t400me и обязательного последующего вызова get_last_result позволяет построить надежную систему взаимодействия между 1С 7.7 и фискальным регистратором Мини-ФП54.01, обеспечивая полный контроль над процессом печати чеков и состоянием устройства.

← На главную