Как подключить и настроить онлайн-кассу по 54-ФЗ в 1С:Предприятие 7.7?

Программист 1С v7.7 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

Переход на применение контрольно-кассовой техники в рамках требований 54-ФЗ часто вызывает сложности у пользователей платформы 1С 7.7 (в частности, конфигураций «Торговля и склад 9.2», комплексных и самописных решений). Поскольку типовые механизмы платформы устарели, интеграция с новыми фискальными регистраторами выполняется через прямое обращение к OLE/COM-объектам актуальных драйверов производителей ККТ (АТОЛ, Штрих-М) либо через обновленные внешние обработки обслуживания.

Разберем ключевые особенности, структуру взаимодействия, примеры программного кода и типовые проблемы, возникающие при подключении онлайн-касс к 1С 7.7.

Архитектура взаимодействия с онлайн-кассами

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

  1. Передача данных в ОФД: отправкой чеков оператору фискальных данных занимается непосредственно сам кассовый аппарат через сетевое подключение (Ethernet, Wi-Fi, либо по технологии EthernetOverUSB/RNDIS). Со стороны 1С 7.7 не требуется организовывать интернет-шлюз для ОФД — учетная система лишь передает команды драйверу кассы.
  2. Инициализация драйвера: вместо устаревшей функции ЗагрузитьВнешнююКомпоненту() рекомендуется использовать прямое создание объекта драйвера через OLE: СоздатьОбъект("AddIn.DrvFR") (для Штрих-М) или СоздатьОбъект("AddIn.FprnM45") (для АТОЛ). При использовании внешних компонент в каталоге базы должны присутствовать необходимые вспомогательные библиотеки (например, sqlite3.dll для Штрих-М).
  3. Построчная регистрация позиций: закон 54-ФЗ требует передачи в чек обязательных реквизитов каждой позиции (наименование, количество, цена за единицу с учетом скидок, ставка НДС, предмет и способ расчета).

Подключение и печать чека на ККТ АТОЛ (ДТО 8.х / 10.х)

Посмотрим на пример прямой реализации пробития чека через COM-объект драйвера АТОЛ. В коде настраивается передача должности и ФИО кассира (тег 1021), применяемой системы налогообложения (тег 1055), контактов покупателя для отправки электронного чека (тег 1008) и признаков НДС.


// Создание объекта драйвера ККТ АТОЛ
Попытка
    Драйвер = СоздатьОбъект("AddIn.FprnM45");
Исключение
    Сообщить("Ошибка создания объекта драйвера АТОЛ!");
    Возврат;
КонецПопытки;

Драйвер.DeviceEnabled = 1; // Занимаем порт
Если Драйвер.ResultCode <> 0 Тогда
    Сообщить("Ошибка подключения к ККТ: " + Драйвер.ResultDescription);
    Возврат;
КонецЕсли;

// Вход в режим регистрации
Драйвер.Mode = 1;
Драйвер.Password = "30";
Драйвер.SetMode();

// Отменяем незавершенный чек, если касса осталась в промежуточном состоянии
Драйвер.GetStatus();
Если Драйвер.CheckState <> 0 Тогда
    Попытка
        Драйвер.CancelCheck();
    Исключение
    КонецПопытки;
КонецЕсли;

// Открытие чека (CheckType: 1 - Приход, 2 - Возврат прихода)
Драйвер.CheckType = 1;
Драйвер.CheckMode = 1; // 1 - печать на ленте, 0 - только электронный чек
Драйвер.OpenCheck();

// Передача ФИО кассира (Тег 1021)
Драйвер.AttrNumber = 1021;
Драйвер.AttrValue = "Иванов И.И.";
Драйвер.WriteAttribute();

// Передача СНО (Тег 1055: 1 - ОСН, 2 - УСН доход, 4 - УСН доход-расход, 8 - ЕНВД, 16 - ЕСХН, 32 - Патент)
Драйвер.AttrNumber = 1055;
Драйвер.AttrValue = 2; // УСН Доход
Драйвер.WriteAttribute();

// Передача телефона или e-mail покупателя (Тег 1008)
КонтактПокупателя = "+79991234567";
Если ПустаяСтрока(КонтактПокупателя) = 0 Тогда
    Драйвер.AttrNumber = 1008;
    Драйвер.AttrValue = СокрЛП(КонтактПокупателя);
    Драйвер.WriteAttribute();
КонецЕсли;

// Построчная регистрация товаров
// TaxTypeNumber: 1 - НДС 0%, 2 - НДС 10%, 3 - НДС 18% (20%), 4 - Без НДС
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
    Драйвер.Name = СокрЛП(СписокТоваров.Товар);
    Драйвер.Price = Окр(СписокТоваров.ЦенаСоСкидкой, 2, 1);
    Драйвер.Quantity = СписокТоваров.Количество;
    Драйвер.Department = 1;
    Драйвер.TaxTypeNumber = 4; // Без НДС
    
    Драйвер.Registration();
    Если Драйвер.ResultCode <> 0 Тогда
        Сообщить("Ошибка регистрации позиции: " + Драйвер.ResultDescription);
        Драйвер.CancelCheck();
        Драйвер.DeviceEnabled = 0;
        Возврат;
    КонецЕсли;
КонецЦикла;

// Закрытие чека (TypeClose: 0 - Наличные, 1 - Электронные / карта)
Драйвер.TypeClose = 0;
Драйвер.Summ = СуммаЧека;
Драйвер.Payment();
Драйвер.CloseCheck();

// Освобождение порта устройства
Драйвер.DeviceEnabled = 0;

Подключение и управление фискальным регистратором Штрих-М

Рассмотрим особенности работы с драйвером Штрих-М (DrvFR.dll версии 4.13 и выше). Для передачи ФИО кассира используется обращение к системным таблицам кассы, а управление сменами выполняется стандартными командами отчетов.


// Инициализация объекта драйвера Штрих-М
глФР = СоздатьОбъект("AddIn.DrvFR");
глФР.Password = 30; // Пароль системного администратора

// Программирование ФИО текущего кассира в Таблицу 2 (строка 2, поле 2)
глФР.TableNumber = 2;
глФР.RowNumber = 2;
глФР.FieldNumber = 2;
глФР.ValueOfFieldString = "Кассир Петрова А.С.";
глФР.WriteTable();

// Установка пароля кассира для регистрации чека
глФР.Password = 2;

// Открытие смены (происходит автоматически при первой продаже, либо явно):
// глФР.OpenSession();

// Регистрация продажи
глФР.StringForPrinting = "Товар 1";
глФР.Price = 150.00;
глФР.Quantity = 1;
глФР.Department = 1;
глФР.Tax1 = 0; // Налоговая ставка
глФР.Sale();

// Передача контакта покупателя (e-mail / телефон)
глФР.CustomerEmail = "client@domain.ru";
глФР.FNSendCustomerEmail();

// Оплата и закрытие чека
глФР.Summ1 = 150.00; // Наличные (Summ2 - безналичные)
глФР.StringForPrinting = "";
глФР.CloseCheck();

Реализация скидок и борьба с погрешностями округления

Выясним причину частых ошибок при печати чеков со скидками: согласно форматам фискальных документов (ФФД), кассовый аппарат рассчитывает итоговую сумму строки умножением передаваемой цены за единицу на количество (СуммаСтроки = Цена * Количество). Общая скидка на весь чек больше не поддерживается протоколами ККТ, за исключением округления чека вниз до целого рубля (отбрасывание копеек).

Для корректной работы со скидками применяются следующие подходы:

  1. Расчет скидки в учетной системе: цена позиции рассчитывается сразу с учетом всех предоставленных скидок и наценок перед передачей в ККТ: ЦенаСоСкидкой = Окр(СуммаСоСкидкой / Количество, 2). Текстовая информация о проценте скидки может быть выведена отдельной нефискальной строкой (PrintString()).
  2. «Правило одной копейки» (дробление строк): если при делении суммы позиции на количество возникают дробные доли копейки, сумма по строке в ККТ может разойтись с суммой в документе 1С. В этом случае позиция программно разбивается на две строки:
    
    // Пример: 3 шт. товара на сумму 100 руб. (100 / 3 = 33.333...)
    // Строка 1: 2 шт. по цене 33.33 руб. = 66.66 руб.
    // Строка 2: 1 шт. по цене 33.34 руб. = 33.34 руб.
    // Итого по чеку: 100.00 руб. без расхождений
    
  3. Округление чека суммой: для округления копеек в пользу покупателя в драйвере АТОЛ используется суммовая скидка на весь чек в пределах 1 рубля:
    
    Драйвер.Destination = 0; // Скидка на чек
    Драйвер.Summ = ОкруглениеКопеек; // Сумма до 1.00 руб.
    Драйвер.SummDiscount();
    

Снятие кассовых отчетов (X-отчет и Z-отчет)

Рассмотрим типовой фрагмент кода для формирования суточных отчетов с гашением и без гашения в 1С 7.7:


// Снятие X-отчета (без гашения)
Драйвер.Password = "29"; // Пароль администратора
Драйвер.Mode = 2;        // Режим отчетов без гашения
Драйвер.SetMode();
Драйвер.ReportType = 2;  // Суточный отчет без гашения
Драйвер.Report();

// Снятие Z-отчета (закрытие смены с гашением)
Драйвер.Password = "30"; // Пароль системного администратора
Драйвер.Mode = 3;        // Режим отчетов с гашением
Драйвер.SetMode();
Драйвер.ReportType = 1;  // Суточный отчет с гашением
Драйвер.Report();

// Сброс режима кассы в режим выбора
Драйвер.ResetMode();

Рекомендации по стабильной эксплуатации

  1. Работа в терминале (RDP): проброс локальных виртуальных COM-портов USB в сессию удаленного рабочего стола часто приводит к ошибкам «Нет связи». Для серверов терминалов рекомендуется подключать ККТ по сетевому интерфейсу Ethernet с фиксированным IP-адресом либо использовать внешнюю службу сервера печати чеков (HTTP/Web-сервер ККМ).
  2. Права доступа: для корректной регистрации COM-объектов в операционных системах Windows 7/10/Server библиотеки драйверов необходимо регистрировать через командную строку от имени Администратора (regsvr32 drvfr.dll или regsvr32 FprnM1C.dll).
  3. Контроль смены: длительность открытой кассовой смены не должна превышать 24 часа, иначе фискальный накопитель блокирует печать чеков до момента снятия Z-отчета.
← На главную