Переход на применение контрольно-кассовой техники в рамках требований 54-ФЗ часто вызывает сложности у пользователей платформы 1С 7.7 (в частности, конфигураций «Торговля и склад 9.2», комплексных и самописных решений). Поскольку типовые механизмы платформы устарели, интеграция с новыми фискальными регистраторами выполняется через прямое обращение к OLE/COM-объектам актуальных драйверов производителей ККТ (АТОЛ, Штрих-М) либо через обновленные внешние обработки обслуживания.
Разберем ключевые особенности, структуру взаимодействия, примеры программного кода и типовые проблемы, возникающие при подключении онлайн-касс к 1С 7.7.
Проанализируем основные принципы работы оборудования в новых условиях:
ЗагрузитьВнешнююКомпоненту() рекомендуется использовать прямое создание объекта драйвера через OLE: СоздатьОбъект("AddIn.DrvFR") (для Штрих-М) или СоздатьОбъект("AddIn.FprnM45") (для АТОЛ). При использовании внешних компонент в каталоге базы должны присутствовать необходимые вспомогательные библиотеки (например, sqlite3.dll для Штрих-М).Посмотрим на пример прямой реализации пробития чека через 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();
Выясним причину частых ошибок при печати чеков со скидками: согласно форматам фискальных документов (ФФД), кассовый аппарат рассчитывает итоговую сумму строки умножением передаваемой цены за единицу на количество (СуммаСтроки = Цена * Количество). Общая скидка на весь чек больше не поддерживается протоколами ККТ, за исключением округления чека вниз до целого рубля (отбрасывание копеек).
Для корректной работы со скидками применяются следующие подходы:
ЦенаСоСкидкой = Окр(СуммаСоСкидкой / Количество, 2). Текстовая информация о проценте скидки может быть выведена отдельной нефискальной строкой (PrintString()).
// Пример: 3 шт. товара на сумму 100 руб. (100 / 3 = 33.333...)
// Строка 1: 2 шт. по цене 33.33 руб. = 66.66 руб.
// Строка 2: 1 шт. по цене 33.34 руб. = 33.34 руб.
// Итого по чеку: 100.00 руб. без расхождений
Драйвер.Destination = 0; // Скидка на чек
Драйвер.Summ = ОкруглениеКопеек; // Сумма до 1.00 руб.
Драйвер.SummDiscount();
Рассмотрим типовой фрагмент кода для формирования суточных отчетов с гашением и без гашения в 1С 7.7:
// Снятие X-отчета (без гашения)
Драйвер.Password = "29"; // Пароль администратора
Драйвер.Mode = 2; // Режим отчетов без гашения
Драйвер.SetMode();
Драйвер.ReportType = 2; // Суточный отчет без гашения
Драйвер.Report();
// Снятие Z-отчета (закрытие смены с гашением)
Драйвер.Password = "30"; // Пароль системного администратора
Драйвер.Mode = 3; // Режим отчетов с гашением
Драйвер.SetMode();
Драйвер.ReportType = 1; // Суточный отчет с гашением
Драйвер.Report();
// Сброс режима кассы в режим выбора
Драйвер.ResetMode();
regsvr32 drvfr.dll или regsvr32 FprnM1C.dll).