В процессе эксплуатации торгового оборудования часто возникает необходимость синхронизации времени на кассовых аппаратах (ККТ) с системным временем сервера или компьютера. Несовпадение времени даже на несколько минут может привести к блокировке кассы фискальным накопителем или к серьезным штрафам со стороны налоговых органов согласно требованиям 54-ФЗ. В этой статье мы подробно разберем, как программно прочитать текущее время из ККТ и как корректно установить новые значения для двух популярнейших семейств касс — Штрих-М и Атол.
Прежде чем переходить к написанию кода на языке 1С, проанализируем физику процесса и основные ограничения, накладываемые фискальными накопителями (ФН) и архитектурой кассовых аппаратов:
Рассмотрим подробнее программную реализацию изменения времени для каждого типа оборудования.
Для работы с кассами Штрих-М традиционно используется 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();
Если вы написали код, но время на кассе упорно не меняется, выполните следующие проверочные действия:
ResultCode (для Штрих) или возвращаемое значение метода SetTime() (для Атол). Практически всегда там будет содержаться четкое указание проблемы (например, "Смена открыта", "Неверный пароль" или "Команда не поддерживается в данном режиме").ConfirmDate(), касса вернет прежние значения при следующем включении.Используя приведенные шаблоны кода и соблюдая правила работы с фискальными накопителями, вы сможете легко автоматизировать процесс контроля и синхронизации времени на ваших торговых точках напрямую из конфигураций 1С. Для предварительной диагностики устройств и фискальных накопителей подойдёт утилита для тестирования ККМ Штрих-М и Атол.