Как реализовать работу с ФФД 1.2 для оборудования Штрих-М в нетиповой конфигурации 1С

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

Переход на формат фискальных данных (ФФД) 1.2 внес существенные изменения в алгоритм работы кассового программного обеспечения, особенно в части реализации контроля маркируемых товаров. Если в типовых решениях (например, «1С:Розница 2.3» или «1С:УНФ») этот функционал обновляется вендором, то владельцы нетиповых (самописных) конфигураций, особенно на старых платформах типа 1С 8.2, сталкиваются с необходимостью ручной доработки механизмов взаимодействия с драйвером. Простая отправка кода маркировки в тег 1162 больше не работает — теперь требуется реализация полноценного цикла проверки марки средствами фискального накопителя нового образца (ФН-М).

В данной статье мы разберем, как выстроить последовательность запросов к драйверу «Штрих-М», чтобы обеспечить корректную продажу маркированного товара с соблюдением требований законодательства.

Подготовительный этап: оборудование и драйвер

Перед тем как приступить к написанию кода, проанализируем технические требования. Для работы по стандарту ФФД 1.2 необходимо выполнение трех условий:

  1. Кассовый аппарат должен иметь прошивку с поддержкой ФФД 1.2.
  2. В ККТ должен быть установлен фискальный накопитель версии ФН-М.
  3. На рабочем месте должен быть установлен драйвер «Штрих-М: Драйвер ККТ» версии 5.16 или выше.

Работа в 1С будет строиться через COM-объект AddIn.DrvFR. Рассмотрим, как инициализировать соединение с кассой в контексте управляемых форм.


&НаКлиенте
Процедура ИнициализироватьФР() Экспорт
    Попытка
        // Подключаем внешнюю компоненту
        ПодключитьВнешнююКомпоненту("AddIn.DrvFR"); 
        глФР = Новый COMОбъект("AddIn.DrvFR"); 
    Исключение
        Сообщить("Ошибка инициализации фискального регистратора: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        Возврат;
    КонецПопытки;

    // Настройка связи (параметры обычно хранятся в константах или справочнике)
    глФР.Password = 30; // Пароль системного администратора по умолчанию
    глФР.Connect();

    Если глФР.ResultCode <> 0 Тогда
        Сообщить("Ошибка подключения: " + глФР.ResultCodeDescription);
    КонецЕсли;
КонецПроцедуры

Алгоритм работы с маркированным товаром в ФФД 1.2

Рассмотрим подробнее новую логику. В отличие от ФФД 1.05, где мы просто передавали структуру данных в чек, в ФФД 1.2 процесс разделен на этапы предварительной проверки и последующего подтверждения. Проанализируем последовательность действий программиста:

  1. Инициализация процесса проверки: вызываем метод FNBeginMarkingProcessing.
  2. Передача кода маркировки: записываем считанный сканером DataMatrix в свойство MarkingCode.
  3. Запуск проверки: метод FNCheckMarkingCode инициирует обращение ФН к ОФД и системе «Честный Знак».
  4. Получение статуса: через метод FNGetValidationRes мы узнаем, прошел ли код проверку.
  5. Фиксация реализации: после успешного формирования позиции чека (метод 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);
        Возврат Ложь;
    КонецЕсли;
    
    Возврат Истина;
КонецФункции

Важные нюансы при работе на платформе 8.2

Проанализируем специфические проблемы, с которыми вы можете столкнуться при реализации данного алгоритма в старых конфигурациях:

Посмотрим на пример установки ИНН кассира:


глФР.TagNumber = 1203; 
глФР.TagType = 7; // Тип "Строка"
глФР.TagValueStr = СокрЛП(ИННКассира); 
глФР.FNSendTag(); 

Использование данной методики позволит вам адаптировать практически любую нетиповую конфигурацию 1С для работы с современными кассовыми аппаратами «Штрих-М» под управлением ФФД 1.2, обеспечив легальную продажу товаров с маркировкой (табак, обувь, одежда, молочная продукция и другие).

← На главную