Работа с фискальными регистраторами семейства «Мини» (в частности, моделью Мини-ФП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, что требует корректной передачи строки подключения.
Выясним причину, по которой у многих не получается пробить чек с первого раза. В фискальных принтерах «Мини» реализована жесткая структура чека. Нельзя просто отправить команду «напечатать строку». Процесс должен быть следующим:
open_port).cashier_registration). Без этой команды ФР не позволит открыть чек.add_plu), а затем продан по коду (sale_plu).open_receipt).sale_plu).pay).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;
Сообщить("Результат операции: " + Ответ);
Проанализируем несколько критических моментов, которые помогут избежать сбоев в работе системы:
add_plu непосредственно перед sale_plu для каждой позиции чека.open_port;192.168.1.100;9100;.Для создания качественного интерфейса кассира в 1С 7.7 рекомендуется использовать следующие методы:
get_last_error — возвращает цифровой код последней ошибки (0 — успех).get_error_info — возвращает текстовое описание ошибки (например, "Нет бумаги" или "Смена превысила 24 часа").show_subtotal — позволяет получить текущую сумму открытого чека до его закрытия.execute_report;x1;12321; — печать X-отчета (дневной отчет без обнуления).execute_report;z1;12321; — печать Z-отчета (отчет с обнулением и закрытием смены).Использование связки метода t400me и обязательного последующего вызова get_last_result позволяет построить надежную систему взаимодействия между 1С 7.7 и фискальным регистратором Мини-ФП54.01, обеспечивая полный контроль над процессом печати чеков и состоянием устройства.