Как реализовать продажу блока сигарет через ККМ в 1С 7.7

Программист 1С v7.7 Управленческий учет Торговля и дистрибуция
← На главную

Продажа табачной продукции в рознице требует строгого соблюдения правил маркировки «Честный ЗНАК». Если с продажей отдельной пачки сигарет большинство разработчиков на 1С 7.7 уже разобрались, то реализация целого блока часто вызывает вопросы. Разберем детально, как программно обработать код блока и передать его в ККМ (на примере драйвера Штрих-М), чтобы корректно вывести товар из оборота.

Общие принципы маркировки блоков сигарет

Прежде всего, проанализируем, как устроена система маркировки для табака. Блок сигарет является так называемой агрегированной упаковкой. Это значит, что код маркировки (DataMatrix), нанесенный на блок, «знает» о всех кодах пачек, которые находятся внутри него.

При продаже блока нам не нужно вскрывать его и сканировать каждую пачку по отдельности. Система мониторинга позволяет отсканировать один код с блока, и при его успешной фискализации через кассу все вложенные пачки автоматически будут считаться выведенными из оборота. Однако здесь есть критически важный нюанс: если вы уже продали хотя бы одну пачку из этого блока отдельно, код самого блока в системе становится недействительным (расформировывается). Продать такой блок как единое целое по его коду уже не получится.

Структура DataMatrix кода блока

Для правильной передачи данных в ККМ нам необходимо понимать структуру штрихкода. Рассмотрим пример реального кода блока:

0104600439935605211won_hk800510000093vjHM24014422555

Разберем его на составляющие части (идентификаторы применения):

Реализация в 1С 7.7 для драйвера Штрих-М

Рассмотрим ситуацию, когда нам необходимо передать данные в фискальный регистратор. В старых конфигурациях 1С 7.7 мы часто взаимодействуем с драйвером напрямую через COM-объект. Для продажи маркированного товара используется метод FNSendItemCodeData (или аналогичные методы в зависимости от версии драйвера и ФФД).

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


// Пример для одной пачки
ФР.Password = 30; // Пароль администратора/кассира
ФР.MarkingType = 17485; // Тип маркировки для табака (0x444D в HEX)
ФР.GTIN = Лев(ИДТабак, 14);
ФР.SerialNumber = Сред(СокрЛП(ИДТабак), 15, 7);
ФР.FNSendItemCodeData();

Теперь выясним, что меняется при продаже блока. Основное отличие заключается в позициях GTIN и серийного номера внутри считанной строки DataMatrix. Кроме того, согласно протоколу ФФД, при продаже блока количество в позиции чека должно быть равно 1 (один блок), а цена должна соответствовать цене за весь блок целиком, а не за одну пачку.

Алгоритм разбора кода блока

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


// Допустим, переменная СтрМаркировки содержит полный считанный сканером код
// 0104600439935605211won_hk800510000093vjHM...

// Извлекаем GTIN (всегда 14 знаков после идентификатора "01")
ТекGTIN = Сред(СтрМаркировки, 3, 14); 

// Извлекаем серийный номер. 
// В блоках он начинается после идентификатора "21" (позиция 17)
// Длина серийного номера может варьироваться, но часто для Штрих-М 
// передают комбинацию серийника и МРЦ.
ТекСерия = Сред(СтрМаркировки, 19, 7); 

// Если драйвер требует включения данных о цене в поле серийного номера
// (согласно спецификациям некоторых версий ФФД 1.05/1.1):
ТекЦенаДляМаркировки = Сред(СтрМаркировки, 30, 6); // Данные после "8005"
ТекSerialNumber = ТекСерия + ТекЦенаДляМаркировки;

ФР.GTIN = ТекGTIN;
ФР.SerialNumber = ТекSerialNumber;
ФР.MarkingType = 17485;
ФР.FNSendItemCodeData();

Важные замечания по ФФД 1.2

Если ваша касса переведена на ФФД 1.2, процедура продажи маркированного товара существенно усложняется. Теперь касса должна выполнять проверку кода в реальном времени (запрос КМ). Рассмотрим основные шаги работы в этом режиме:

  1. Запрос проверки кода: Перед пробитием чека вызывается команда проверки марки (BeginMarkingCodeCheck). Касса отправляет запрос в ОФД, который пересылает его в систему «Честный ЗНАК».
  2. Ожидание результата: Программа должна дождаться ответа от ККТ. Если код блока верный и он находится в обороте, касса вернет положительный результат.
  3. Фиксация кода: Только после успешной проверки код включается в состав чека (AcceptMarkingCode).
  4. Статус в чеке: В печатной форме чека напротив позиции блока должен появиться символ [M+].

При использовании ФФД 1.2 крайне рекомендуется обновить драйвер Штрих-М до актуальной версии (не ниже 5.16/5.17) и использовать обновленные методы работы с маркировкой, так как старый метод FNSendItemCodeData может не обеспечивать передачу всех необходимых тегов (например, тега 2106).

Особенности оформления чека

При продаже нескольких блоков одного наименования помните о требовании закона: один экземпляр маркированного товара — одна строка в чеке. Вы не можете указать в чеке «Блок сигарет — 2 шт.» и прикрепить два разных кода маркировки к одной позиции. Вы обязаны сформировать две разные позиции в чеке, в каждой из которых будет указано количество «1» и свой уникальный DataMatrix блока.

Это увеличивает расход кассовой ленты, но гарантирует, что каждый блок будет корректно выведен из оборота в системе ГИС МТ. Если же вы попытаетесь продать блок по цене пачки или ошибетесь в количестве, система «Честный ЗНАК» зафиксирует нарушение, что может привести к штрафам для торговой точки.

Таким образом, для успешной продажи блока сигарет в 1С 7.7 необходимо правильно реализовать парсинг входной строки со сканера, выделить идентификаторы GTIN и Serial Number и передать их в соответствующие свойства объекта драйвера ККМ перед регистрацией продажи позиции чека.

← На главную