Переход на формат фискальных данных (ФФД) 1.2 внес существенные изменения в алгоритм работы кассового программного обеспечения, особенно в части реализации контроля маркируемых товаров. Если в типовых решениях (например, «1С:Розница 2.3» или «1С:УНФ») этот функционал обновляется вендором, то владельцы нетиповых (самописных) конфигураций, особенно на старых платформах типа 1С 8.2, сталкиваются с необходимостью ручной доработки механизмов взаимодействия с драйвером. Простая отправка кода маркировки в тег 1162 больше не работает — теперь требуется реализация полноценного цикла проверки марки средствами фискального накопителя нового образца (ФН-М).
В данной статье мы разберем, как выстроить последовательность запросов к драйверу «Штрих-М», чтобы обеспечить корректную продажу маркированного товара с соблюдением требований законодательства.
Перед тем как приступить к написанию кода, проанализируем технические требования. Для работы по стандарту ФФД 1.2 необходимо выполнение трех условий:
Работа в 1С будет строиться через COM-объект AddIn.DrvFR. Рассмотрим, как инициализировать соединение с кассой в контексте управляемых форм.
&НаКлиенте
Процедура ИнициализироватьФР() Экспорт
Попытка
// Подключаем внешнюю компоненту
ПодключитьВнешнююКомпоненту("AddIn.DrvFR");
глФР = Новый COMОбъект("AddIn.DrvFR");
Исключение
Сообщить("Ошибка инициализации фискального регистратора: " + ОписаниеОшибки(), СтатусСообщения.Важное);
Возврат;
КонецПопытки;
// Настройка связи (параметры обычно хранятся в константах или справочнике)
глФР.Password = 30; // Пароль системного администратора по умолчанию
глФР.Connect();
Если глФР.ResultCode <> 0 Тогда
Сообщить("Ошибка подключения: " + глФР.ResultCodeDescription);
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее новую логику. В отличие от ФФД 1.05, где мы просто передавали структуру данных в чек, в ФФД 1.2 процесс разделен на этапы предварительной проверки и последующего подтверждения. Проанализируем последовательность действий программиста:
FNBeginMarkingProcessing.MarkingCode.FNCheckMarkingCode инициирует обращение ФН к ОФД и системе «Честный Знак».FNGetValidationRes мы узнаем, прошел ли код проверку.Sale) вызываем FNAcceptMarkingCode.Выясним, как это выглядит в коде 1С. Мы подготовили пример функции, которую необходимо вызывать перед добавлением товара в чек.
&НаКлиенте
Функция ПроверитьМарку(ПолныйКодМаркировки)
// 1. Указываем драйверу на начало обработки маркировки
глФР.FNBeginMarkingProcessing();
// 2. Передаем полный код (включая криптохвост)
глФР.MarkingCode = ПолныйКодМаркировки;
// 3. Запускаем проверку (параметр 0 - обычная продажа)
глФР.ItemStatus = 1;
глФР.CheckMarkingBarcodeMode = 0;
глФР.FNCheckMarkingCode();
Если глФР.ResultCode <> 0 Тогда
Сообщить("Ошибка при проверке кода в ФН: " + глФР.ResultCodeDescription);
Возврат Ложь;
КонецЕсли;
// Ожидаем завершения проверки (может занять время)
// В реальных условиях рекомендуется добавить цикл ожидания статуса
глФР.FNGetValidationRes();
// Результат проверки отобразится в теге 2106 (символы М+, М-, М)
Возврат Истина;
КонецФункции
Разберем, как интегрировать проверку марки в общий процесс пробития чека. Обратите внимание на использование метода FNCloseCheckEx для корректного закрытия документа в ФФД 1.2.
&НаКлиенте
Функция ПробитьЧекСМаркировкой(ТипЧека, ТаблицаТоваров)
глФР.Password = 1; // Пароль кассира
// Открываем чек
глФР.CheckType = ТипЧека;
глФР.OpenCheck();
Для Каждого Стр Из ТаблицаТоваров Цикл
Если Стр.ЭтоМаркированныйТовар Тогда
Если ПроверитьМарку(Стр.КодМаркировки) Тогда
// Заполняем параметры продажи
глФР.Quantity = Стр.Количество;
глФР.Price = Стр.Цена;
глФР.StringForPrinting = Стр.Наименование;
глФР.Tax1 = Стр.СтавкаНДС;
// Важно: передаем меру количества (шт, кг и т.д.) по ФФД 1.2 (Тег 2108)
глФР.MeasureOfQuantity = 0; // 0 - шт
глФР.Sale();
// Подтверждаем использование марки в чеке
глФР.FNAcceptMarkingCode();
Иначе
Сообщить("Товар " + Стр.Наименование + " не может быть продан.");
глФР.SysAdminCancelCheck();
Возврат Ложь;
КонецЕсли;
Иначе
// Обычная продажа немаркированного товара
глФР.Quantity = Стр.Количество;
глФР.Price = Стр.Цена;
глФР.StringForPrinting = Стр.Наименование;
глФР.Sale();
КонецЕсли;
КонецЦикла;
// Оплата (Summ1 - нал, Summ2 - безнал)
глФР.Summ1 = Объект.СуммаНаличные;
глФР.Summ2 = Объект.СуммаБезнал;
// Закрытие чека
глФР.FNCloseCheckEx();
Если глФР.ResultCode <> 0 Тогда
Сообщить("Ошибка закрытия чека: " + глФР.ResultCodeDescription);
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Проанализируем специфические проблемы, с которыми вы можете столкнуться при реализации данного алгоритма в старых конфигурациях:
FNCheckMarkingCode включает в себя сетевой запрос к ОФД. Если интернет-канал нестабилен, драйвер может вернуть ошибку по таймауту раньше, чем придет ответ от «Честного Знака». Увеличьте таймауты в настройках драйвера (через утилиту «Тест драйвера») или программно через свойство Timeout.ResultCode после вызова каждого метода FN....FNSendTag перед открытием чека или в процессе его формирования.Посмотрим на пример установки ИНН кассира:
глФР.TagNumber = 1203;
глФР.TagType = 7; // Тип "Строка"
глФР.TagValueStr = СокрЛП(ИННКассира);
глФР.FNSendTag();
Использование данной методики позволит вам адаптировать практически любую нетиповую конфигурацию 1С для работы с современными кассовыми аппаратами «Штрих-М» под управлением ФФД 1.2, обеспечив легальную продажу товаров с маркировкой (табак, обувь, одежда, молочная продукция и другие).