При переходе на онлайн-кассы и новые версии драйверов (в частности, АТОЛ ДТО 10) у многих разработчиков, сопровождающих системы на платформе 1С:Предприятие 7.7, возникают вопросы архитектурного характера. Одной из частых задач является подключение онлайн-касс к нетиповым конфигурациям 1С 7.7 для организации работы нескольких фискальных регистраторов (ККТ) на одном физическом рабочем месте (ПК). Например, когда одна касса пробивает чеки по одному юридическому лицу, а вторая — по другому.
В этой статье мы подробно разберем, как реализовать механизм работы с двумя кассами АТОЛ (например, АТОЛ 30Ф) на одном компьютере, используя драйвер 10-й версии и платформу 7.7. Мы выясним, как управлять программным идентификатором (ProgID), как реализовать подключение кассы с поддержкой ФФД 1.05 через драйвер v10 и рассмотрим примеры кода.
Прежде чем приступать к коду, давайте разберемся с главным вопросом, который часто ставит в тупик: "Как быть с программным идентификатором, если касс две?".
В старых версиях драйверов (ДТО 8) использовалось понятие "Логическое устройство" (ЛУ), настройки которого хранились в реестре Windows или конфигурационном файле драйвера. В 1С мы просто указывали номер ЛУ.
В ДТО 10 подход кардинально изменился:
AddIn.Fptr10.Следовательно, чтобы работать с двумя кассами, нам не нужно искать "второй" ProgID. Мы будем использовать один и тот же класс, но инициализировать его с разными параметрами.
Рассмотрим два основных способа организации работы. В качестве фундамента вы можете использовать обработку обслуживания торгового оборудования для печати чеков, адаптировав её под работу с несколькими устройствами.
Мы создаем один глобальный или локальный объект драйвера. Каждый раз перед пробитием чека мы передаем драйверу настройки нужного COM-порта, устанавливаем связь, печатаем чек и (опционально) разрываем связь.
Плюсы: Экономия оперативной памяти.
Минусы: Небольшая задержка перед печатью на установку соединения (Connect). Если поток чеков большой, это может быть заметно.
Мы создаем отдельные переменные для каждой кассы (например, глККМ1 и глККМ2). При запуске 1С инициализируем каждую переменную своим экземпляром драйвера, настраиваем на разные COM-порты и держим соединение активным постоянно.
Плюсы: Мгновенная печать.
Минусы: Нужно корректно обрабатывать ошибки потери связи для каждого объекта.
Давайте реализуем механизм, при котором настройки касс хранятся в справочнике 1С. Для тех, кто только начинает разработку, будет полезна демонстрация того, как выполняется встраивание инструментов для работы с кассой АТОЛ в нетиповую 1С 7.7. Это позволит гибко настраивать привязку COM-портов к конкретному рабочему месту.
Предположим, у нас есть справочник СпрКассы, в котором есть реквизиты:
ИмяПК — имя компьютера, к которому подключена касса.КомПорт — номер COM-порта (например, "3", "4").Модель — модель кассы (хотя для ДТО 10 часто достаточно использовать автоопределение).Рассмотрим функцию подключения, которая инициализирует драйвер с нужными настройками. В данном примере мы будем настраивать объект драйвера "на лету" (по Способу 1 или комбинированному).
Сначала создадим объект драйвера:
Попытка
ДрайверККТ = СоздатьОбъект("AddIn.Fptr10");
Исключение
Сообщить("Не удалось загрузить драйвер АТОЛ 10 (AddIn.Fptr10)!");
Возврат 0;
КонецПопытки;
Теперь напишем процедуру настройки параметров. Обратите внимание на методы setSingleSetting и applySingleSettings. Именно они заменяют старую настройку через свойства.
// Пример настройки драйвера на конкретный порт
// Параметр: НомерПорта (Строка, например "5")
Процедура НастроитьИПодключитьККТ(НомерПорта)
// Сначала отключаемся, если были подключены
ДрайверККТ.put_DeviceEnabled(0);
// Устанавливаем модель (обычно Авто — 500)
// LIBFPTR_SETTING_MODEL = 65536
// LIBFPTR_MODEL_ATOL_AUTO = 500
ДрайверККТ.setSingleSetting(65536, "500");
// Устанавливаем канал связи (COM-порт)
// LIBFPTR_SETTING_PORT = 65537
// LIBFPTR_PORT_COM = 0
ДрайверККТ.setSingleSetting(65537, "0");
// Указываем номер COM-порта
// LIBFPTR_SETTING_COM_FILE = 65538
ДрайверККТ.setSingleSetting(65538, "COM" + СокрЛП(НомерПорта));
// Настройки скорости (обычно 115200 для USB-COM)
// LIBFPTR_SETTING_BAUDRATE = 65539
// LIBFPTR_BAUDRATE_115200 = 115200
ДрайверККТ.setSingleSetting(65539, "115200");
// Применяем настройки
ДрайверККТ.applySingleSettings();
// Пытаемся подключиться
ДрайверККТ.put_DeviceEnabled(1);
Если ДрайверККТ.get_DeviceEnabled() = 0 Тогда
Сообщить("Ошибка подключения к порту COM" + НомерПорта);
// Можно получить код ошибки через get_ErrorDescription()
КонецЕсли;
КонецПроцедуры
Самое важное — логика выбора. Когда кассир нажимает кнопку "Пробить чек", программа должна понять, на какое устройство отправить команду.
Рассмотрим сценарий, когда выбор происходит автоматически в зависимости от Фирмы документа или выбора пользователя.
// Фрагмент процедуры печати чека
Процедура ПечатьЧека(ДокументОснование)
// Определяем, какая фирма
Если ДокументОснование.Фирма = Константа.ОсновнаяФирма Тогда
НужныйПорт = "3"; // Условно COM3 для первой фирмы
Иначе
НужныйПорт = "4"; // Условно COM4 для второй фирмы
КонецЕсли;
// Или ищем порт в справочнике по Имени ПК и Фирме
// ... Код поиска в справочнике ...
// Вызываем настройку
НастроитьИПодключитьККТ(НужныйПорт);
Если ДрайверККТ.get_DeviceEnabled() = 1 Тогда
// Здесь идет код формирования чека (открытие смены, регистрации позиций)
// ...
// ...
// После пробития чека, если используем один объект на всех,
// можно отключиться, чтобы освободить порт (не обязательно, но надежнее при сбоях)
ДрайверККТ.put_DeviceEnabled(0);
КонецЕсли;
КонецПроцедуры
При подключении двух одинаковых устройств (например, двух АТОЛ 30Ф) по USB, Windows создает виртуальные COM-порты. Главная проблема — при перезагрузке ПК или переподключении кабелей порты могут поменяться местами (ККТ 1 станет COM4, а ККТ 2 — COM3).
Как зафиксировать порты:
Рассмотрим еще несколько технических моментов, которые обеспечат стабильность:
1. Передача данных в ОФД (EoU)
Если ваши кассы передают данные в налоговую через компьютер (Ethernet over USB), у вас будет запущена служба EoU. Для двух касс важно проверить файл настроек settings.xml (обычно лежит в C:\ProgramData\ATOL\EoU или в папке установки драйвера). Там должны быть прописаны секции для обоих устройств с указанием их портов передачи данных. Иначе чеки с одной из касс могут не уходить.
2. Идентификация по серийному номеру
Если вы хотите сделать систему "пуленепробиваемой", не полагайтесь только на номер COM-порта. После команды put_DeviceEnabled(1) запросите у кассы серийный номер через метод драйвера get_SerialNumber(). Сравните его с тем, что записан в базе 1С для этой фирмы. Если номера не совпадают — значит, порты перепутаны, и нужно выдать предупреждение кассиру, чтобы он не пробил чек не той организации.
3. Лицензирование драйвера
Драйвер АТОЛ 10 является бесплатным для работы с кассами АТОЛ. Никаких дополнительных лицензий для работы с несколькими устройствами на одном ПК не требуется.
Подключить две кассы АТОЛ к 1С 7.7 на одном компьютере абсолютно реально и не требует сложных "костылей". Ключевой момент — понимание, что объект AddIn.Fptr10 един, а управление выбором устройства осуществляется путем передачи параметра LIBFPTR_SETTING_COM_FILE перед установкой соединения. Рекомендуем хранить соответствие "Фирма — Номер порта" в справочнике вашей конфигурации для удобства администрирования.