При переходе на онлайн-кассы и обновлении отраслевой конфигурации «Альфа-Авто: Автосалон+Автосервис+Автозапчасти» редакции 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ТаблицаТоваров, передача единицы измерения в параметрах вообще не предусмотрена интерфейсом компоненты. Защищенный модуль самостоятельно подставляет значение по умолчанию («шт») при обращении к низкоуровневому драйверу фискального регистратора.
Если требуется быстро обеспечить соответствие чеков требованиям читаемости без глобального переписывания взаимодействия с оборудованием, применим вывод единицы измерения в строке наименования позиции.
Разберем по шагам, как модифицировать код формирования массива позиций:
SafeArrayТаблицаТоваров.
SafeArrayТаблицаТоваров.SetValue(
НомерСтрокиТоваров,
3,
Строка(СтрокаТоваров.Номенклатура.Наименование + " (" + СтрокаТоваров.Номенклатура.ОсновнаяЕдиницаИзмерения.Наименование + ")")
);
В результате на чековой ленте и в данных ОФД наименование товара или услуги будет содержать реальную единицу измерения (например, «Замена масла (н/час)» или «Масло моторное 5W40 (л)»), что устраняет двусмысленность при проверках.
Так как поддержка 4-й ветки конфигурации ограничена, а типовая подсистема не поддерживает расширенные сценарии (чеки коррекции, сложные возвраты, разделение оплат), наиболее надежным долгосрочным решением является полный обход системы защиты и реализация печати чеков напрямую через COM-объект драйвера производителя (например, АТОЛ или Штрих-М).
Рассмотрим структуру реализации внешней обработки для пробития чеков:
ЗаказНаряд, ЧекНаОплату, ПриходныйКассовыйОрдер) и считывает табличную часть.Рарус_Компонента.Для сетевой печати в терминальной среде (RDP) эффективен подход с выгрузкой XML-пакета чека по стандарту 1С в каталог очереди печати, где локальная служба (виртуальный принтер/спулер) перенаправляет команды на физический фискальный регистратор. Это исключает блокировки портов и зависания сессий.
Если вы сохраняете штатный механизм работы с оборудованием, убедимся в правильности настройки моделей фискальных регистраторов:
setup.exe из папки Protect дистрибутива, чтобы обновить сервер защиты оборудования.*.mdl) обновились в каталогах Protect\CommonProtect и Protect\LocalProtect.