Как получить и изменить дату и время на ККМ (Штрих-М и Атол) из 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе эксплуатации торгового оборудования часто возникает необходимость синхронизации времени на кассовых аппаратах (ККТ) с системным временем сервера или компьютера. Несовпадение времени даже на несколько минут может привести к блокировке кассы фискальным накопителем или к серьезным штрафам со стороны налоговых органов согласно требованиям 54-ФЗ. В этой статье мы подробно разберем, как программно прочитать текущее время из ККТ и как корректно установить новые значения для двух популярнейших семейств касс — Штрих-М и Атол.

Почему время на кассе сбивается и какие есть ограничения?

Прежде чем переходить к написанию кода на языке 1С, проанализируем физику процесса и основные ограничения, накладываемые фискальными накопителями (ФН) и архитектурой кассовых аппаратов:

  1. Статус кассовой смены: Изменение даты и времени на любой ККТ возможно исключительно при закрытой кассовой смене. Если в кассе открыта смена, драйвер вернет ошибку выполнения операции.
  2. Ограничение фискального накопителя по времени: Вы не можете перевести время на кассе назад относительно даты и времени последнего фискального документа, записанного в память ФН. Например, если последний чек был пробит сегодня в 12:00:00, касса физически откажется устанавливать время 11:59:59. Время можно двигать только вперед.
  3. Автоматическая синхронизация: Некоторые современные кассы синхронизируют время через интернет (NTP-серверы) автоматически. Если на кассе включена эта функция, ручные манипуляции через драйвер могут игнорироваться ККТ при следующем выходе в сеть.

Рассмотрим подробнее программную реализацию изменения времени для каждого типа оборудования.

Решение для ККТ семейства «Штрих-М»

Для работы с кассами Штрих-М традиционно используется COM-компонента AddIn.DrvFR. Часто разработчики сталкиваются с тем, что при попытке передать значение даты и времени напрямую через объект 1С (тип Дата), драйвер выдает ошибку или просто игнорирует команду. Это связано со спецификой преобразования типов COM/ActiveX. При необходимости глубже разобраться во взаимодействии с компонентой драйвера можно изучить материал по работе с драйвером «Штрих-М» на уровне протокола.

Вместо передачи сложного типа Дата, разработчики драйвера Штрих-М предусмотрели специальное строковое свойство TimeStr (или русскоязычный аналог ВремяСтрока). Передача времени в виде строки формата ЧЧ:ММ:СС гарантированно избавляет от проблем с конвертацией типов.

Также важно помнить, что если вы корректируете не только время, но и дату, то касса Штрих-М требует обязательного подтверждения даты с помощью специального метода ConfirmDate(). Без вызова этого метода ККТ зависнет в режиме ожидания подтверждения, и изменения не вступят в силу.

Разберем по шагам правильный алгоритм синхронизации для касс Штрих-М:


// Создаем объект драйвера Штрих-М
Попытка
    ПодключитьВнешнююКомпоненту("AddIn.DrvFR");
    ДрайверККТ = Новый("AddIn.DrvFR");
Исключение
    Сообщить("Не удалось загрузить внешнюю компоненту AddIn.DrvFR!");
    Возврат;
КонецПопытки;

// Устанавливаем связь с кассой
ДрайверККТ.Connect();

// Для изменения системных параметров ККТ требуется пароль системного администратора.
// По умолчанию для оборудования Штрих-М этот пароль равен 30.
ДрайверККТ.Password = 30;

// Запрашиваем текущее состояние кассы
ДрайверККТ.GetECRStatus();

// Проверяем режим ККТ. Изменение времени доступно только в режиме закрытой смены.
// Режим 0 означает "Смена закрыта, документы закрыты"
Если ДрайверККТ.ECRMode <> 0 Тогда
    Сообщить("Ошибка: Изменение времени невозможно, так как кассовая смена не закрыта!");
    ДрайверККТ.Disconnect();
    Возврат;
КонецЕсли;

// Получаем текущее время компьютера и форматируем его в строку "ЧЧ:ММ:СС"
ТекущееВремяКомпьютера = ТекущаяДата();
ЧасСтр = Формат(Час(ТекущееВремяКомпьютера), "ЧЦ=2; ЧВН=");
МинСтр = Формат(Минута(ТекущееВремяКомпьютера), "ЧЦ=2; ЧВН=");
СекСтр = Формат(Секунда(ТекущееВремяКомпьютера), "ЧЦ=2; ЧВН=");
СтрокаВремени = ЧасСтр + ":" + МинСтр + ":" + СекСтр;

// Передаем отформатированную строку времени в драйвер
ДрайверККТ.TimeStr = СтрокаВремени;

// Вызываем метод установки времени
ДрайверККТ.SetTime();

// Обязательно анализируем результат выполнения команды драйвером
Если ДрайверККТ.ResultCode <> 0 Тогда
    Сообщить("Не удалось установить время на ККТ. Ошибка: " + ДрайверККТ.ResultCodeDescription);
Иначе
    Сообщить("Время на ККТ Штрих-М успешно синхронизировано: " + СтрокаВремени);
КонецЕсли;

// Отключаем связь с ККТ
ДрайверККТ.Disconnect();

Решение для ККТ семейства «Атол»

Для кассовых аппаратов Атол логика работы аналогична, но используются другие свойства и методы драйвера (обычно это компонента AddIn.FPrnM8 или новые версии драйверов 10.x). Отличительной особенностью драйверов Атол является обязательное включение устройства через свойство DeviceEnabled.

Проанализируем пример кода для работы с драйвером Атол:


// Загрузка компоненты драйвера Атол
Попытка
    ПодключитьВнешнююКомпоненту("AddIn.FPrnM8");
    ДрайверАтол = Новый("AddIn.FPrnM8");
Исключение
    Сообщить("Не удалось инициализировать драйвер Атол!");
    Возврат;
КонецПопытки;

// Настройка подключения к устройству
// Порт и скорость обычно хранятся в настройках торгового оборудования в 1С
ДрайверАтол.PortNumber = 1002; // Пример порта (например, для USB/COM или TCP)
ДрайверАтол.BaudRate = 115200; // Скорость обмена данными

// Обязательно активируем связь с устройством
ДрайверАтол.DeviceEnabled = 1;

// Авторизуемся под паролем системного администратора (по умолчанию у Атол это "30" или "0")
ДрайверАтол.Password = "30";

// Переводим кассу в режим программирования/выбора (Режим 0)
ДрайверАтол.Mode = 0;
ДрайверАтол.SetMode();

// Заполняем свойства времени отдельными составляющими (строками)
ТекущееВремя = ТекущаяДата();
ДрайверАтол.Hour = Строка(Час(ТекущееВремя));
ДрайверАтол.Minute = Строка(Минута(ТекущееВремя));
ДрайверАтол.Second = Строка(Секунда(ТекущееВремя));

// Вызываем команду записи времени
РезультатКоманды = ДрайверАтол.SetTime();

Если РезультатКоманды = 0 Тогда
    Сообщить("Время на ККТ Атол успешно установлено!");
Иначе
    Сообщить("Ошибка установки времени на Атол. Код ошибки: " + РезультатКоманды);
КонецЕсли;

// Корректно закрываем сессию работы с драйвером
ДрайверАтол.DeviceEnabled = 0;
ДрайверАтол.DeleteDevice();

Важные рекомендации по отладке

Если вы написали код, но время на кассе упорно не меняется, выполните следующие проверочные действия:

Используя приведенные шаблоны кода и соблюдая правила работы с фискальными накопителями, вы сможете легко автоматизировать процесс контроля и синхронизации времени на ваших торговых точках напрямую из конфигураций 1С. Для предварительной диагностики устройств и фискальных накопителей подойдёт утилита для тестирования ККМ Штрих-М и Атол.

← На главную