При интеграции фискальных регистраторов семейства «Штрих-М» (например, «Штрих-М-01Ф») с платформой 1С 7.7 («Торговля и Склад 9.2») разработчики часто сталкиваются с ситуацией, когда весь чек печатается с одной ставкой налога, а безналичные платежи или авансы закрываются как наличные. Разберем по шагам причины такого поведения драйвера и выясним, как правильно доработать код конфигурации и обработку обслуживания.
Проанализируем типичную ошибку при попытке назначить налоги. Разработчики нередко пытаются передать в свойства драйвера глФР.Налог1 ставку для первой позиции, а в глФР.Налог2 — ставку для второй позиции перед вызовом процедуры печати чека. Это в корне неверно по двум причинам:
Tax1–Tax4 (в русскоязычном варианте Налог1–Налог4) не предназначены для распределения налогов по строкам документа. В протоколе «Штрих-М» свойство Tax1 определяет номер строки из внутренней таблицы «Налоговые ставки» кассового аппарата именно для текущей регистрируемой позиции. Свойства со второго по четвертое исторически использовались для применения нескольких одновременных налогов (например, НДС и налога с продаж) к одной и той же позиции.глОборудованиеКоманда в глобальном модуле не имеет смысла, так как внутри типовой обработки обслуживания (например, fr_elves.ert) происходит перезапись этих параметров в цикле обхода строк документа.Чтобы каждая позиция чека содержала правильную ставку, необходимо передавать значение в Налог1 перед регистрацией каждой отдельной строки.
Откроем внешнюю обработку обслуживания кассы (как правило, fr_elves.ert) и найдем процедуру печати чека, где происходит цикл обхода таблицы товаров. Посмотрим на пример правильной передачи ставки:
// Внутри цикла по переданной таблице СписокТоваров:
СписокТоваров.ВыбратьСтроки();
Пока СписокТоваров.ПолучитьСтроку() = 1 Цикл
Объект.Password = Пароль;
Объект.ItemType = 1; // Товар
Объект.Quantity = СписокТоваров.Количество;
Объект.Price = СписокТоваров.Цена;
// Определяем номер налога в таблице ФР
// Например: 1 - НДС 18/20%, 2 - НДС 10%, 3 - Без НДС, 4 - НДС 0%
Если СписокТоваров.СтавкаНДС = 18*100 Тогда
Объект.Tax1 = 1;
ИначеЕсли СписокТоваров.СтавкаНДС = 0 Тогда
// Обратите внимание: "Без НДС" и "НДС 0%" - это разные ставки в ФР
Объект.Tax1 = 3; // Строка "Без НДС"
КонецЕсли;
// Свойства Tax2 - Tax4 обнуляем
Объект.Tax2 = 0;
Объект.Tax3 = 0;
Объект.Tax4 = 0;
Объект.Department = НомерСекции;
Объект.StringForPrinting = СписокТоваров.ТовНаим;
// Регистрация позиции чека
Объект.Sale();
КонецЦикла;
Также важно проверить настройки самого фискального регистратора через утилиту «Тест драйвера ККТ». В таблице 17 («Региональные настройки») параметр «Печать налога в операции» должен иметь значение 1, иначе аппарат не будет выводить буквенные маркеры налога рядом с суммой строки.
Вторая распространенная проблема — невозможность закрыть чек безналичной оплатой, авансом или кредитом. При передаче суммы в Summ2 или Summ14 фискальный регистратор либо закрывает чек наличными, либо сообщает об ошибке «Сумма всех оплат меньше итога чека».
Выясним причину этой проблемы. В старых обработках обслуживания для 1С 7.7 закрытие чека выполнялось устаревшим методом CloseCheck(). Данный метод был разработан задолго до вступления в силу требований 54-ФЗ и оперирует только четырьмя типами оплат (Summ1–Summ4), полностью игнорируя расширенные типы расчета (Summ14–Summ16).
Для работы по требованиям 54-ФЗ и форматов фискальных данных (ФФД) драйвер «Штрих-М» использует метод FNCloseCheckEx(), а свойства оплат распределяются следующим образом:
Summ1 — Наличные средства (тег 1031).Summ2 — Безналичные средства / электронные платежи (тег 1081).Summ14 — Предварительная оплата / аванс (тег 1215).Summ15 — Последующая оплата / кредит (тег 1216).Summ16 — Встречное предоставление (тег 1217).При работе с авансами важно четко разделять две разные хозяйственные операции:
Summ1) или безналичными (Summ2). Заполнять Summ14 здесь нельзя, иначе чек уйдет в налоговую с нулевой суммой фактической оплаты. Авансовый характер операции задается признаком способа расчета на уровне товарной позиции (признак способа расчета PaymentItemSign со значением аванса или предоплаты).Summ14 (сумма зачета аванса). Если сумма отгрузки превышает аванс, разница доплачивается наличными (Summ1) или картой (Summ2).Посмотрим на пример закрытия чека в обработке обслуживания с поддержкой зачета аванса и безналичной оплаты:
Объект.Password = Пароль;
// Обнуляем все суммы оплат перед заполнением
Объект.Summ1 = 0; // Наличные
Объект.Summ2 = 0; // Безналичные
Объект.Summ14 = 0; // Зачет аванса
Объект.Summ15 = 0; // Кредит
Объект.Summ16 = 0; // Встречное предоставление
// Распределяем суммы согласно переданным параметрам
Если ТипОплаты = 1 Тогда
Объект.Summ1 = СуммаЧека;
ИначеЕсли ТипОплаты = 2 Тогда
Объект.Summ2 = СуммаЧека;
ИначеЕсли ТипОплаты = 14 Тогда
Объект.Summ14 = СуммаЧека;
КонецЕсли;
Объект.DiscountOnCheck = 0;
Объект.StringForPrinting = "";
// Закрываем чек расширенным методом ФФД
Если Объект.FNCloseCheckEx() <> 0 Тогда
ОписаниеОшибки = "Ошибка закрытия чека: " + Объект.ResultCodeDescription;
Возврат 0;
КонецЕсли;
Таким образом, для стабильной работы кассы с современными типами оплат и несколькими ставками НДС в 1С 7.7 требуется перенести присвоение Tax1 внутрь построчного цикла регистрации позиций и обновить процедуру закрытия чека в fr_elves.ert с вызовом метода FNCloseCheckEx().