Требования законодательства (54-ФЗ) и контролирующих органов заставляют внимательно следить за соответствием времени на кассовом чеке реальному времени. Налоговая служба допускает отклонение времени на чеке от фактического не более чем на 5 минут. При работе с несколькими десятками кассовых аппаратов коррекция времени вручную через утилиты драйвера становится крайне трудоемкой задачей, поэтому целесообразно автоматизировать этот процесс прямо из конфигурации 1С.
В этой статье мы разберем аппаратные ограничения кассовой техники, а также рассмотрим практические примеры кода для программной установки даты и времени на фискальных регистраторах популярных производителей (Штрих-М и АТОЛ).
Прежде чем приступать к программной установке времени на ККТ, необходимо учитывать важные аппаратные и законодательные правила:
ТекущаяДата(), системные часы на ПК должны быть точно настроены (например, через NTP-сервер). Если на компьютере сели батарейка CMOS или сбилось время, неверная дата передастся на кассу.Для взаимодействия с фискальными регистраторами марки «Штрих-М» используется внешняя компонента AddIn.DrvFR. Настройка времени производится путем передачи значений свойствам Дата и Время с последующим вызовом соответствующих методов драйвера.
Рассмотрим пример процедуры обновления времени и даты, которую можно встроить в логику обработки обслуживаемого оборудования перед открытием смены или при закрытии Z-отчета:
Процедура СинхронизироватьВремяШтрих(ПараметрыПодключения)
Попытка
ПрогИД = "AddIn.DrvFR";
ПодключитьВнешнююКомпоненту(ПрогИД);
Драйвер = Новый (ПрогИД);
Исключение
Возврат;
КонецПопытки;
// Настройка параметров подключения к устройству
Драйвер.COMпортЛУ = ПараметрыПодключения.Порт;
Драйвер.ТаймаутЛУ = ПараметрыПодключения.Таймаут;
Драйвер.Пароль = ПараметрыПодключения.ПарольАдминистратора;
Драйвер.УстановитьПараметрыЛУ();
Драйвер.УстановитьАктивноеЛУ();
Драйвер.УстановитьСвязь();
Если Драйвер.Результат <> 0 Тогда
Предупреждение("Ошибка связи с ККТ: " + Драйвер.ОписаниеРезультата);
Возврат;
КонецЕсли;
Драйвер.ПолучитьСостояниеККМ();
// Проверяем режим ККМ (смена должна быть закрыта)
Если Драйвер.РежимККМ = 4 ИЛИ Драйвер.РежимККМ = 7 ИЛИ Драйвер.РежимККМ = 9 Тогда
// Установка даты, если она отличается
Если НачалоДня(Дата(Драйвер.Дата)) <> НачалоДня(ТекущаяДата()) Тогда
Драйвер.Дата = Формат(ТекущаяДата(), "ДФ=dd.MM.yy");
Драйвер.УстановитьДату();
Драйвер.ПодтвердитьДату();
КонецЕсли;
// Установка времени, если расхождение превышает 30 секунд
ВремяККТ = Дата(Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy") + " " + Драйвер.ВремяСтрока);
Если МодульЧисла(ВремяККТ - ТекущаяДата()) > 30 Тогда
Драйвер.Время = Формат(ТекущаяДата(), "ДФ=HH:mm:ss");
Драйвер.УстановитьВремя();
КонецЕсли;
КонецЕсли;
Драйвер.РазорватьСвязь();
Драйвер.УдалитьЛУ();
КонецПроцедуры
Функция МодульЧисла(Значение)
Возврат ?(Значение < 0, -Значение, Значение);
КонецФункции
Для устройств производства компании «АТОЛ» (например, АТОЛ 55Ф, FPrint и др.) при использовании драйвера ДТО 8 применяется внешняя компонента AddIn.FPrnM8. Время задается раздельно по компонентам: Hour, Minute и Second.
Разберем пример кода установки времени для ККТ АТОЛ при закрытой кассовой смене:
Процедура СинхронизироватьВремяАтол(ПараметрыКассы)
Попытка
ВнешняяКомпонента = "AddIn.FPrnM8";
ПодключитьВнешнююКомпоненту(ВнешняяКомпонента);
Драйвер = Новый (ВнешняяКомпонента);
Исключение
Возврат;
КонецПопытки;
Попытка
// Настройка подключения к кассе
Драйвер.AddDevice();
Драйвер.PortNumber = ПараметрыКассы.Порт;
Драйвер.Password = ПараметрыКассы.Пароль;
Драйвер.DeviceEnabled = 1;
// Переключение ККТ в режим выбора (Режим = 0)
Драйвер.Режим = 0;
Драйвер.SetMode();
// Передача текущих часов, минут и секунд
ТекущееВремя = ТекущаяДата();
Драйвер.Hour = Строка(Час(ТекущееВремя));
Драйвер.Minute = Строка(Минута(ТекущееВремя));
Драйвер.Second = Строка(Секунда(ТекущееВремя));
РезультатУстановки = Драйвер.SetTime();
Если РезультатУстановки <> 0 Тогда
// Обработка ошибки установки времени
ОписаниеОшибки = Драйвер.ResultDescription;
КонецЕсли;
// Отключение устройства
Драйвер.DeviceEnabled = 0;
Исключение
Драйвер.DeviceEnabled = 0;
КонецПопытки;
Драйвер = Неопределено;
КонецПроцедуры
Если в вашей конфигурации используется современная Библиотека подключаемого оборудования (БПО 1С) или драйверы более новых версий (например, АТОЛ ДТО 10 — AddIn.Fptr10), писать низкоуровневый код работы с COM-объектами не обязательно: