Как программно получить номер чека за смену при использовании драйвера Атол в 1С?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с контрольно-кассовой техникой (ККТ) Атол через стандартные механизмы БПО (Библиотека подключаемого оборудования) 1С, часто возникает потребность получить не только фискальный признак документа или номер чека ФН, но и порядковый номер чека внутри текущей смены. Разберем, почему стандартные методы не всегда дают нужный результат и как получить эти данные напрямую из драйвера.

Понимание архитектуры взаимодействия

Важно различать две сущности при работе с оборудованием Атол:

  1. Интеграционная компонента (БПО): это высокоуровневая обертка, предназначенная для унифицированного взаимодействия с оборудованием. Она скрывает детали реализации драйвера, предоставляя стандартизированные методы вроде СформироватьЧек. Однако эта компонента часто ограничена и не позволяет обращаться к специфическим регистрам ККТ напрямую.
  2. Объект драйвера (Fptr): это прямой COM-объект или Native-компонента (например, AddIn.Fptr10), предоставляемая производителем оборудования. Именно через него происходит низкоуровневое управление устройством, включая чтение регистров состояния.

Проблема автора заключается в том, что ОбъектДрайвера.СформироватьЧек возвращает данные, предопределенные стандартом БПО, в то время как номер чека за смену является параметром конкретного устройства, который нужно запрашивать отдельно.

Решение задачи через чтение регистров ККТ

Чтобы получить порядковый номер чека в смене, необходимо использовать метод чтения регистров. В протоколах Атол информация о смене и документах хранится в специальных регистрах. Чаще всего для этой цели используется регистр 53.

Рассмотрим пошагово, как реализовать этот процесс в коде 1С:

  1. Создайте экземпляр драйвера напрямую (вне рамок БПО, если это необходимо для сервисных операций).
  2. Установите соединение с устройством.
  3. Укажите номер нужного регистра в свойство драйвера.
  4. Выполните метод получения данных.

Пример программной реализации

Давайте проанализируем фрагмент кода, который позволит считать значение регистра. Учтите, что в зависимости от версии драйвера (v.9 или v.10), имена свойств могут отличаться, поэтому всегда сверяйтесь с документацией к используемой версии библиотеки.

Для современной 10-й версии драйвера процесс выглядит следующим образом:


// Создание объекта драйвера
ОбъектДрайвера = Новый COMОбъект("AddIn.Fptr10");

// Установка параметров соединения (порт, скорость и т.д.)
ОбъектДрайвера.DeviceSettings = НастройкиПодключения;
ОбъектДрайвера.Connect();

// Установка номера регистра для получения данных
// 53 - регистр, содержащий номер чека в смене
ОбъектДрайвера.RegisterNumber = 53;

// Чтение данных регистра
Если ОбъектДрайвера.GetRegister() Тогда
    // Получение значения из свойства Value
    НомерЧекаВСмене = ОбъектДрайвера.Value;
    Сообщить("Номер чека в смене: " + НомерЧекаВСмене);
Иначе
    Сообщить("Ошибка при чтении регистра: " + ОбъектДрайвера.ErrorDescription);
КонецЕсли;

// Обязательное отключение для освобождения порта
ОбъектДрайвера.Disconnect();

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

При реализации данного решения обратите внимание на следующие моменты:

Используя этот подход, вы сможете программно извлекать актуальный номер чека в смене прямо из ККТ, минуя ограничения стандартных интерфейсов 1С.

← На главную