При работе с контрольно-кассовой техникой (ККТ) Атол через стандартные механизмы БПО (Библиотека подключаемого оборудования) 1С, часто возникает потребность получить не только фискальный признак документа или номер чека ФН, но и порядковый номер чека внутри текущей смены. Разберем, почему стандартные методы не всегда дают нужный результат и как получить эти данные напрямую из драйвера.
Важно различать две сущности при работе с оборудованием Атол:
СформироватьЧек. Однако эта компонента часто ограничена и не позволяет обращаться к специфическим регистрам ККТ напрямую.AddIn.Fptr10), предоставляемая производителем оборудования. Именно через него происходит низкоуровневое управление устройством, включая чтение регистров состояния.Проблема автора заключается в том, что ОбъектДрайвера.СформироватьЧек возвращает данные, предопределенные стандартом БПО, в то время как номер чека за смену является параметром конкретного устройства, который нужно запрашивать отдельно.
Чтобы получить порядковый номер чека в смене, необходимо использовать метод чтения регистров. В протоколах Атол информация о смене и документах хранится в специальных регистрах. Чаще всего для этой цели используется регистр 53.
Рассмотрим пошагово, как реализовать этот процесс в коде 1С:
Давайте проанализируем фрагмент кода, который позволит считать значение регистра. Учтите, что в зависимости от версии драйвера (v.9 или v.10), имена свойств могут отличаться, поэтому всегда сверяйтесь с документацией к используемой версии библиотеки.
Для современной 10-й версии драйвера процесс выглядит следующим образом:
// Создание объекта драйвера
ОбъектДрайвера = Новый COMОбъект("AddIn.Fptr10");
// Установка параметров соединения (порт, скорость и т.д.)
ОбъектДрайвера.DeviceSettings = НастройкиПодключения;
ОбъектДрайвера.Connect();
// Установка номера регистра для получения данных
// 53 - регистр, содержащий номер чека в смене
ОбъектДрайвера.RegisterNumber = 53;
// Чтение данных регистра
Если ОбъектДрайвера.GetRegister() Тогда
// Получение значения из свойства Value
НомерЧекаВСмене = ОбъектДрайвера.Value;
Сообщить("Номер чека в смене: " + НомерЧекаВСмене);
Иначе
Сообщить("Ошибка при чтении регистра: " + ОбъектДрайвера.ErrorDescription);
КонецЕсли;
// Обязательное отключение для освобождения порта
ОбъектДрайвера.Disconnect();
При реализации данного решения обратите внимание на следующие моменты:
БПО в фоновом режиме или параллельно с другими операциями, прямое обращение к драйверу может вызвать конфликт доступа. Рекомендуется выполнять такие операции либо до, либо после выполнения основных фискальных транзакций.CheckNumber напрямую. Если вы вынуждены использовать устаревшую версию, синтаксис будет отличаться, однако логика остается прежней: обращение к объекту драйвера напрямую, а не через обертку БПО.Используя этот подход, вы сможете программно извлекать актуальный номер чека в смене прямо из ККТ, минуя ограничения стандартных интерфейсов 1С.