Как программно установить дату и время на фискальном регистраторе из 1С

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

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

В этой статье мы разберем аппаратные ограничения кассовой техники, а также рассмотрим практические примеры кода для программной установки даты и времени на фискальных регистраторах популярных производителей (Штрих-М и АТОЛ).

Ограничения и условия выполнения операции

Прежде чем приступать к программной установке времени на ККТ, необходимо учитывать важные аппаратные и законодательные правила:

  1. Статус кассовой смены: Изменение даты и времени аппаратно заблокировано, если кассовая смена открыта. Синхронизацию времени можно выполнять только при закрытой смене (после снятия Z-отчета или перед открытием новой смены).
  2. Ограничения Фискального Накопителя (ФН): Нельзя установить дату и время, которые предшествуют времени последнего записанного в ФН фискального документа. Перевести часы «назад» за пределы времени последнего чека невозможно.
  3. Точность системного времени ПК: Если программная установка берёт текущее время компьютера с помощью функции ТекущаяДата(), системные часы на ПК должны быть точно настроены (например, через 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-объектами не обязательно:

  1. Штатная кнопка в 1С: В окне настроек подключаемого оборудования БПО предусмотрена встроенная функция «Синхронизировать время», которая отправляет команду установки времени через стандартизированный API 1С.
  2. Настройка автосинхронизации в драйвере: В драйверах ККТ ККТ АТОЛ и Штрих-М есть встроенный флаг «Синхронизировать время с ПК при установке связи». При включении этой опции драйвер автоматически обновляет время в ККТ при каждом подключении из 1С без написания специального кода.
  3. NTP-синхронизация кассы: Если ККТ подключена по сетевому интерфейсу (Ethernet или Wi-Fi), в настройках самого фискального регистратора можно включить прямую синхронизацию времени с интернет-серверами точного времени (NTP).
← На главную