Как исправить вывод единицы измерения «шт» для всех позиций в чеках ККМ в «Альфа-Авто 4.1»?

Программист 1С v8.3 (Обычные формы) Сфера услуг, туризм и социальный сектор
← На главную

При переходе на онлайн-кассы и обновлении отраслевой конфигурации «Альфа-Авто: Автосалон+Автосервис+Автозапчасти» редакции 4.1 пользователи и разработчики сталкиваются с ситуацией, когда фискальный регистратор печатает все позиции чека (включая услуги, разливные жидкости и весовые товары) исключительно с единицей измерения «шт».

Разберем причины такого поведения системы, проанализируем исходный код формирования чека и рассмотрим варианты обхода ограничений встроенной системы защиты торгового оборудования.

Причина проблемы в закрытом контуре торгового оборудования

Выясним причину, почему конфигурация игнорирует реальные единицы измерения из справочника номенклатуры. В типовой реализации «Альфа-Авто» 4.1 взаимодействие с контрольно-кассовой техникой выполняется через защищенные модули и специализированную внешнюю компоненту 1С-Рарус.

Посмотрим на типовой алгоритм заполнения массива параметров позиций чека перед отправкой в оборудование:


Для Каждого СтрокаТоваров Из ТабличнаяЧастьДокументаОснования Цикл
    КоличествоСУчетомКоэффициента = Окр(СтрокаТоваров.Количество * СтрокаТоваров.Коэффициент, 3);
    НомерСтрокиТоваров = СтрокаТоваров.НомерСтроки - 1;
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 0, Число(СтрокаТоваров.НомерСтроки)); // Номер строки ТЧ
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 1, ПолучитьНомерОтдела(СтрокаТоваров.МестоРазмещения)); // N Отдела
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 2, СтрокаТоваров.Номенклатура.Артикул); // Артикул
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 3, Строка(СтрокаТоваров.Номенклатура.Наименование)); // Наименование
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 4, Число(СтрокаТоваров.Цена)); // Цена
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 5, КоличествоСУчетомКоэффициента); // Количество
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 6, Число(СтрокаТоваров.Сумма)); // Сумма
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 7, Строка(СтрокаТоваров.СкидкаНаТовар.Наименование)); // Скидка
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 8, Число(СтрокаТоваров.СуммаСкидкиСтроки));
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 9, Число(СтрокаТоваров.ПроцентСкидкиСтроки));
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 10, ?(обЗначениеНеЗаполнено(СтрокаТоваров.ХарактеристикаНоменклатуры), "",
        Строка(СтрокаТоваров.ХарактеристикаНоменклатуры)));
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 11, СтрокаТоваров.СуммаНДС);
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 12, 0); // Тип позиции (0-товар, 1-модификатор)
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 13, СтрокаТоваров.Номенклатура.СтавкаНДС.Ставка);
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 14, СтрокаТоваров.СтавкаНДС.НомерНалоговойГруппыФР);
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 15, 0);
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 16, 0);
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 17, -1);
    SafeArrayТаблицаТоваров.SetValue(НомерСтрокиТоваров, 18, СтрокаТоваров.СуммаСкидки);
КонецЦикла;

Далее подготовленный массив передается в закрытую компоненту:


ВыполнитьКомандуОборудования("ФР", GUID_ФР, "ПробитьЧек", SafeArrayПараметрыЧека, ТаймаутФР, ТекстОшибки);

Как видно из структуры SafeArrayТаблицаТоваров, передача единицы измерения в параметрах вообще не предусмотрена интерфейсом компоненты. Защищенный модуль самостоятельно подставляет значение по умолчанию («шт») при обращении к низкоуровневому драйверу фискального регистратора.

Решение 1. Добавление единицы измерения в наименование номенклатуры (экспресс-метод)

Если требуется быстро обеспечить соответствие чеков требованиям читаемости без глобального переписывания взаимодействия с оборудованием, применим вывод единицы измерения в строке наименования позиции.

Разберем по шагам, как модифицировать код формирования массива позиций:

  1. Откроем модуль, формирующий параметры чека (например, процедуру обработки заполнения чека на оплату или модуль работы с торговым оборудованием).
  2. Найдем строку заполнения индекса 3 массива SafeArrayТаблицаТоваров.
  3. Скорректируем строку, добавив конкатенацию с основной единицей измерения:

SafeArrayТаблицаТоваров.SetValue(
    НомерСтрокиТоваров,
    3,
    Строка(СтрокаТоваров.Номенклатура.Наименование + " (" + СтрокаТоваров.Номенклатура.ОсновнаяЕдиницаИзмерения.Наименование + ")")
);

В результате на чековой ленте и в данных ОФД наименование товара или услуги будет содержать реальную единицу измерения (например, «Замена масла (н/час)» или «Масло моторное 5W40 (л)»), что устраняет двусмысленность при проверках.

Решение 2. Отказ от закрытой компоненты и прямая печать чеков через драйвер ККТ

Так как поддержка 4-й ветки конфигурации ограничена, а типовая подсистема не поддерживает расширенные сценарии (чеки коррекции, сложные возвраты, разделение оплат), наиболее надежным долгосрочным решением является полный обход системы защиты и реализация печати чеков напрямую через COM-объект драйвера производителя (например, АТОЛ или Штрих-М).

Рассмотрим структуру реализации внешней обработки для пробития чеков:

  1. Чтение документа: Обработка принимает ссылку на документ (ЗаказНаряд, ЧекНаОплату, ПриходныйКассовыйОрдер) и считывает табличную часть.
  2. Подключение к драйверу: Инициализируется COM-объект драйвера ККТ без вызова Рарус_Компонента.
  3. Регистрация позиций с правильными реквизитами: В методы драйвера напрямую передаются наименование, корректная цена, сумма со скидкой, ставка НДС и признак предмета расчета (услуга/товар).
  4. Закрытие чека: Вызывается фиксация оплаты нужным типом (наличные, электронные) и закрытие чека.

Для сетевой печати в терминальной среде (RDP) эффективен подход с выгрузкой XML-пакета чека по стандарту 1С в каталог очереди печати, где локальная служба (виртуальный принтер/спулер) перенаправляет команды на физический фискальный регистратор. Это исключает блокировки портов и зависания сессий.

Обновление системы защиты для работы с новыми моделями ККТ

Если вы сохраняете штатный механизм работы с оборудованием, убедимся в правильности настройки моделей фискальных регистраторов:

  1. При обновлении релиза конфигурации обязательно запускаем setup.exe из папки Protect дистрибутива, чтобы обновить сервер защиты оборудования.
  2. Проверяем, что файлы моделей оборудования (*.mdl) обновились в каталогах Protect\CommonProtect и Protect\LocalProtect.
  3. Для современных онлайн-касс (например, АТОЛ 11Ф, 30Ф, 55Ф) в справочнике «Оборудование» в большинстве случаев стабильно работает выбор совместимой модели FPrint-22К при установленном драйвере ККТ АТОЛ версии 8.14.x.
← На главную