«Честный знак» видит нарушение, а в чеке всё правильно: как типовая раздаёт коды маркировки не тем строкам

28.09.26

Интеграция - Обмен с ГосИС

В чеке две пачки сигарет одной марки: одна по старой МРЦ, другая по новой. Сумма верная, кассир ничего не нарушил. А в «Честном знаке» по этому чеку два отклонения: превышение МРЦ на одном коде и уменьшение на другом. Разобрал по исходникам «Розницы» 2.3 и УТ 11.5: при отправке на кассу типовая раздаёт коды маркировки заново, товары и коды сортирует независимо, а связь строки с её маркой не использует. Показываю, где рвётся, как проверить свои чеки без кассы и ККТ, и три ловушки, каждая из которых стоила мне отдельного круга проверок

Симптом

Магазин торгует сигаретами. В личном кабинете «Честного знака» появляются отклонения по чекам: на одной позиции превышение МРЦ, на другой уменьшение. Продавец смотрит этот чек в 1С и не понимает претензии. Цены в документе верные, марки в документе верные, сумма сошлась.

Претензия при этом законная. Просто она не про документ, а про то, что ушло в ККТ.

У табака максимальная розничная цена зашита в код маркировки. Пачка с МРЦ 278 и пачка с МРЦ 298 несут разные коды. В данных магазина у одной карточки номенклатуры пачки с разной МРЦ имели и разные GTIN, то есть смена МРЦ там приводила к новому GTIN; документом ЦРПТ я это не сверял. «Честный знак» сверяет цену позиции фискального чека с МРЦ из кода этой же позиции. Если коды поменялись местами, одна позиция оказывается проданной дороже своей МРЦ, и это уже нарушение, зафиксированное в государственной системе.

Вот как выглядел чек на четыре пачки одной марки (номера кодов условные, данные магазина обезличены):

 

Строка

Цена в документе

Марка в документе (МРЦ кода)

Что ушло в ККТ (МРЦ кода)

1

298

код А (298)

код Б (278)

2

278

код Б (278)

код В (298)

3

298

код В (298)

код Г (298)

4

298

код Г (298)

код А (298)

 

Коды сдвинулись по кругу на одну позицию. Трём строкам из четырёх это безразлично: у них одинаковая цена и одинаковая МРЦ, перестановка внутри такой группы ничего не меняет. А строка с ценой 278 получила код с МРЦ 298, и строка с ценой 298 получила код с МРЦ 278. Первое даёт отклонение «уменьшение МРЦ», второе «превышение».

Подтверждение не из рассуждений, а из фискального XML, который прислал магазин: позиция с PriceWithDiscount="298" несёт MarkingCode, который декодируется в код с МРЦ 278.

Пока все пачки в чеке одной цены, дефекта не существует. Он просыпается ровно тогда, когда в одном чеке встречаются пачки одного товара с разной МРЦ, то есть в период смены МРЦ, когда старые пачки допродаются рядом с новыми.

Есть и второе условие: строки должны быть разведены по цене. Если программа сложила обе пачки в одну строку с одной ценой, переставлять нечего, но тогда и цена на обе пачки одна. В «Рознице» строки разводит штатная подстановка МРЦ при сканировании, в УТ их приходится разводить самому. То есть разведение цен не создаёт дефект, а делает видимым тот, что уже есть.

Где рвётся связь в «Рознице» 2.3

Путь чека от формы РМК до кассы:

ФормаРМК
  -> ОбщегоНазначенияРМК.ДанныеДляПробитияЧека
  -> Документы.ЧекККМ.ПодготовитьДанныеДляПробитияЧека
  -> ПродажиСервер.ДанныеДляПробитияЧекаККМ
  -> РаспределитьШтрихкодыПоТаблицеТоваров
  -> ШтрихкодированиеИС.РаспределениеШтрихкодовУпаковокПоТоварам

Внутри последней функции (РаспределениеШтрихкодовУпаковокПоТоварам, строка 2386 выгрузки 2.3.25.23) товары и штрихкоды сортируются двумя независимыми вызовами, после чего спариваются по порядку следования:

ТаблицаТовары.Сортировать("Приоритет Убыв, Количество Убыв");
ТаблицаШтрихкоды.Сортировать("Приоритет Убыв, Количество Убыв");

Первое, чего в этом коде нет: КлючСвязи. В документе именно он держит связь марки со строкой, а в раздаче кодов не участвует ни разу, я проверил поиском по всему телу функции.

Две строки по одной пачке, с одинаковым приоритетом и одинаковым количеством, дают неустойчивый порядок. Какой код ляжет в какую строку, зависит от того, как легли таблицы, а не от того, какая марка была отсканирована в эту строку.

Дальше важная оговорка, без которой картина будет неверной.

Учёт МРЦ в типовой есть, но он не везде включён

Было бы неправдой сказать, что типовая про МРЦ не знает. В той же функции есть поиск строки товара с учётом цены:

ТребуетсяПоискТоваровПриРаспределенииСУчетомЦены = ТребуетсяПоискТоваровПриРаспределенииСУчетомЦены(
	СтрокаШтрихкод, ПараметрыСканирования);
Если ТребуетсяПоискТоваровПриРаспределенииСУчетомЦены Тогда
	СтруктураПоиска.Вставить("Цена", СтрокаШтрихкод.МРЦ);
КонецЕсли;

Условие включения требует сразу четырёх вещей: продукция МОТП, заполненная МРЦ у строки штрихкода, вид упаковки потребительская или групповая, и флаг ПараметрыСканирования.ИспользуетсяРаспределениеКодовПоТоварамСУчетомМРЦ.

С этим флагом в двух конфигурациях по-разному. В «Рознице» 2.3.25.23 он объявлен со значением Ложь в ШтрихкодированиеОбщегоНазначенияИСМПКлиентСервер и включается в ИнтеграцияИСРТКлиентСервер (строки 814 и 815). В «Управлении торговлей» 11.5.22.182 он объявлен со значением Ложь в ШтрихкодированиеОбщегоНазначенияМОТПКлиентСервер (строка 71), и включения я в выгрузке не нашёл.

При этом на копии базы магазина, «Розница» 2.3.26.13, коды в ККТ всё равно уходили переставленными: четыре контрольных чека из четырёх, плюс фискальный XML самого магазина. Почему штатный механизм там не отработал, я не доразобрался. Условие требует заполненной МРЦ у строки штрихкода, и это первое, что я стал бы проверять на месте читателя.

И ещё одно наблюдение из базы приёмов: просто включить флаг в УТ нельзя. У него нет отката. Если цена строки не равна МРЦ кода, а это обычная продажа со скидкой, код не распределится вовсе, и чек не пробьётся.

Как проверить свои чеки, не трогая кассу

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

Касса для проверки и не нужна. Вся интересующая нас цепочка это серверный код, и она прогоняется на копии базы по уже пробитым чекам:

СтруктураДанных = РозничныеПродажиКлиентСервер.СтруктураДанныхДляПробитияЧека();
СтруктураДанных.ЧекККМСсылка = СсылкаЧека;
ОбщиеПараметры = РозничныеПродажиСервер.ПодготовитьДанныеДляПробитияЧека(СтруктураДанных);

Для Каждого Поз Из ОбщиеПараметры.ПозицииЧека Цикл
	// код позиции: КонтрольнаяМарка, при пустом значении ШтрихкодBase64
	// цена позиции: ЦенаСоСкидками, при пустом значении Цена
КонецЦикла;

Остаётся разобрать код маркировки каждой позиции, достать МРЦ и сравнить с ценой позиции. Найденное расхождение это будущее отклонение в «Честном знаке», увиденное до того, как оно туда попало.

Одна тонкость при сравнении: у блока МРЦ в коде указана на весь блок, а цена в строке за пачку. Делите МРЦ на вложенность, иначе получите ложное расхождение вида «цена 285 при МРЦ 2850».

Мои прогоны на копии базы магазина, релиз «Розницы» 2.3.26.13: 154 чека доведены до фискальных строк, 289 позиций несут код маркировки, 90 из них с распознаваемой МРЦ. На контрольных чеках со смешанными МРЦ перестановка воспроизвелась в четырёх случаях из четырёх. Отдельно прогнаны 302 последних табачных чека и 40 возвратов, чтобы видеть, что исправление не трогает обычные продажи.

Если у вас розница с табаком, этот прогон стоит сделать до того, как придут отклонения. База при этом не меняется, доступ к ГИС МТ не нужен.

Ловушка первая: я правил не то поле

Первые две версии исправления переставляли поле Штрихкод в строке таблицы товаров. Проверка показывала ноль расхождений. Магазин сообщал, что на кассе всё по-прежнему.

Причина в том, что в ККТ уходит не Штрихкод, а ПолныйКодМаркировки из структуры РезультатРаспределенияШтрихкодов. Его кладёт в позицию чека Документы.ЧекККМ.ДополнитьТоварамиПараметрыПриПробитииЧека, в поля ШтрихкодBase64 и КонтрольнаяМарка. Поле Штрихкод я исправно переставлял, а в кассу ехала исходная неверная пара.

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

Правило, которое я из этого вынес: мерить надо то, что потребляет внешняя система, а не то, что правишь. Если результат уходит в ККТ, проверка читает структуру для ККТ, а не промежуточную таблицу.

Исправление свелось к тому, чтобы переставлять структуру результата распределения целиком: ПолныйКодМаркировки лежит внутри неё и переезжает вместе с кодом.

Ловушка вторая: МРЦ нельзя доставать из позиций с 22 по 25

В коде табачной пачки МРЦ лежит в известном месте, и соблазн разобрать её самому велик: четыре символа и простая арифметика. Я так и сделал, после чего на одном из чеков получил МРЦ 4 482,58 у товара, который к табаку отношения не имеет. На этих позициях у него лежал криптохвост.

Если к такому декодированию привязана блокировка чека, касса встанет на обычной продаже обычного товара, а причина будет выглядеть мистической.

Правильный путь: просить разбор у платформы через СоставКодаМаркировки, а собственное декодирование держать запасным вариантом и только для табачной потребительской пачки. На реальных данных два источника МРЦ разошлись ноль раз на сотне с лишним позиций, но эта цифра получена как раз потому, что запасной путь почти не работает.

«Управление торговлей» 11.5: то же самое в другом месте

В УТ природа дефекта та же, а точка другая: коды раздаются по предметам расчёта при формировании фискального чека. Добавляется вторая особенность, которой в «Рознице» нет: пачки одного товара с разной МРЦ склеиваются в одну строку, если не разводить их принудительно. Про подстановку цены из марки в РМК УТ я писал отдельно (//infostart.ru/1c/articles/2770145/), там же про параметр «Учитывать МРЦ».

Цифры прогона на копии базы, релиз 11.5.22.182: 5 864 табачных чека за месяц для проверки, что правка не трогает обычные продажи; 58 табачных позиций в предметах расчёта на контрольной выборке, расхождений МРЦ кода и цены позиции ноль; архивирование 60 уже пробитых чеков без единой ложной остановки.

Отдельная история с ключом группировки. Когда переставляешь коды внутри группы одинаковых позиций, группу надо определить правильно. Ключ «номенклатура плюс характеристика плюс серия» кажется достаточным, пока в чеке не встретятся блок из десяти пачек и отдельная пачка того же товара: количество в строке разное, и без него группа не разводится. Попытка добавить в ключ GTIN ломается на смене МРЦ, потому что у пачек разной МРЦ GTIN разные, и одинаковые по смыслу строки перестают собираться вместе. Рабочим оказался ключ «номенклатура, характеристика, серия, количество в строке».

Ловушка третья: релиз 11.5.27 ломает встраивание целиком

Эта история уже про сопровождение, а не про сам дефект, но знать её полезно.

В УТ 11.5.27 у типовой функции ЧекККМЛокализация.ПредметыРасчетовПоДокументу появился второй параметр. Расширение, которое встраивалось в неё через &Вместо с прежним списком параметров, на новом релизе не применяется, и вместе с ним не применяется весь модуль расширения со всеми остальными перехватами. В журнале регистрации это выглядит так:

Ошибка применения модуля "ОбщийМодуль.ЧекККМЛокализация.Модуль".
Список параметров метода "...ПредметыРасчетовПоДокументуВместо"
не соответствует методу "ПредметыРасчетовПоДокументу".

Лечится переносом встраивания в точку, сигнатура которой одинакова в обоих релизах. У меня это ФормированиеПараметровФискальногоЧекаСерверПереопределяемый.ПараметрыФискальныхСтрокЧека: через неё проходят те же предметы расчёта до превращения в позиции чека, и туда сходятся все пути на ККТ.

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

Что делает исправление

Внутри группы одинаковых позиций коды раскладываются так, чтобы МРЦ кода совпала с ценой строки: не по порядку следования, а по смыслу. Переставляется структура результата распределения целиком, вместе с полным кодом маркировки. Правка применяется только если набор марок после перестановки совпадает с набором марок документа, то есть это действительно перестановка, а не подмена; строки с частичным выбытием и групповыми упаковками не трогаются. Документ при этом не меняется, правится только то, что уходит в ККТ.

К перестановке имеет смысл добавить отсечку: не пускать на кассу чек, где цена строки выше МРЦ её пачки. Здесь я тоже сначала сделал неверно. Первая версия блокировки срабатывала на любое несовпадение цены и МРЦ, в обе стороны, то есть запрещала законную продажу со скидкой. МРЦ это максимальная цена, продавать дешевле можно, поэтому условие должно быть строго «цена больше МРЦ». Возвраты из блокировки надо исключать: иначе покупатель не сможет вернуть пачку, купленную до смены МРЦ. В моих данных нашёлся возврат с ценой 210 при коде с МРЦ 200, на котором это видно.

Чего я не проверил

Живой кассы не было. Цепочка прогнана до структуры параметров фискальной операции; вызов драйвера ККТ, ответ ОФД и ответ «Честного знака» не воспроизводились.

Состояние «до» на уровне фискальной строки снято из протокола самого расширения и из фискального XML магазина, а не чистым прогоном без расширения на том же релизе.

Проверял на «Рознице» 2.3.26.13 и на УТ 11.5.22.182 и 11.5.27.88. На других релизах типовые процедуры могут отличаться, и в 11.5.27 это уже случилось. Старый РМК «Розницы» в управляемом режиме на продаже я не проверял.

Что с этим делать на практике

Если у вас розница с табаком, проверьте себя, не дожидаясь отклонений. Нужен один прогон по своим чекам за последний месяц: довести чек до фискальных строк, разобрать код каждой позиции, сравнить МРЦ из кода с ценой позиции. Ноль расхождений означает, что пачки одного товара с разной МРЦ в одном чеке вам просто пока не попадались. Расхождения означают, что они уже уехали в «Честный знак».

Дальше выбор простой. Чинить самому, зная три ловушки выше, или взять готовое: я собрал исправление расширением для «Розницы» 2.3 и УТ 11.5, оно возвращает коды на свои строки, ставит в строку чека МРЦ из отсканированной пачки и не даёт пробить чек дороже МРЦ, конфигурацию при этом не меняет.

Что до самой типовой, то поведение, о котором идёт речь, выглядит разумным ровно до появления товара, у которого цена лежит внутри кода. Табак такой товар. Возможно, на этом месте в типовой когда-нибудь появится учёт МРЦ при раздаче кодов, и расширение станет не нужно. Проверить, есть ли проблема у вас, стоит в любом случае.

Вступайте в нашу телеграмм-группу Инфостарт

маркировка Честный ЗНАК МРЦ код маркировки табак ЧекККМ РМК Розница 2.3 Управление торговлей 11.5 ГИС МТ

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Обмен с ГосИС Бюджетный учет Регламентированный учет и отчетность Бухгалтер Пользователь 1С:Предприятие 8 1С:Бухгалтерия 3.0 1С:Управление холдингом Химическая промышленность Государственные, бюджетные структуры Электротехника и микроэлектроника Машиностроение и приборостроение Металлургическая промышленность Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Автоматизация раздельного учета в 1С:Бухгалтерии по ГОЗ в соответствии с 275-ФЗ. Готовое решение для учета госконтрактов, формирования отчетности и контроля исполнения. Поддержка военной приемки, НИОКР и требований Минпромторга. Профессиональный консалтинг и регулярные обновления продукта

40000 руб.

28.08.2020    576017    4228    145    

1532

Бюджетный учет Обмен с ГосИС Бухгалтер 1С:Предприятие 8 1С:Бухгалтерия 3.0 Государственные, бюджетные структуры Россия Бухгалтерский учет Платные (руб)

Доработка конфигурации 1С:Бухгалтерия предприятия, редакция 3.0. реализована в виде расширения. Предназначена для ведения раздельного учета и автоматизации заполнения отчетности исполнения контрактов ГОЗ в конфигурациях 1С БП КОРП, ПРОФ, Базовая, БИТ.ФИНАНС.

62220 руб.

16.08.2019    108332    338    97    

190

Оптовая торговля Розничная торговля Обмен с ГосИС Бухгалтер 1С:Предприятие 8 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Россия Бухгалтерский учет Управленческий учет Акцизы Платные (руб)

Автоматизация учета ЕГАИС в 1С для оптовой торговли, производства и импорта алкогольной продукции. Получение и отправка ТТН, отправка акта о постановке на баланс и акта о списании. Получение остатков. Загрузка и сопоставление номенклатуры и контрагентов. Оправка в ЕГАИС отчетов о производстве и импорте.

1091 руб.

15.12.2015    188325    1403    374    

421

Оптовая торговля Розничная торговля Обмен с ГосИС Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Россия Бухгалтерский учет Управленческий учет Платные (руб)

Решение создано для помощи разработчикам, интеграторам и другим заинтересованным лицам по настройке системы маркировки обуви, одежды, лекарств, табака, фото, молока, духов(парфюма), питьевой воды, велосипедов и шин. Задавайте вопросы по работе с ЦРПТ, GS1, ЭДО, Национальным каталогом, накоплен опыт и знания по данным темам.

20900 руб.

18.03.2019    128290    108    115    

211

Обмен с ГосИС Бухгалтер Пользователь 1С 8.3 1С 8.5 1С:Бухгалтерия 3.0 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 1.6 1С:Управление нашей фирмой 3.0 1С:Управление торговлей 11 1С:Розница 2 1С:Розница 3.0 1С:РМК Ювелирная промышленность и торговля Россия Управленческий учет Платные (руб)

Интеграция для работы 1С с ГИИС ДМДК. Государственная интегрированная информационная система в сфере контроля за оборотом драгоценных металлов, драгоценных камней и изделий из них на всех этапах этого оборота.

80000 руб.

12.04.2022    27977    216    34    

57

Обмен с ГосИС Логистика, склад и ТМЦ Разработчик Пользователь 1С:Предприятие 8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Внешняя обработка для инвентаризации кодов маркировки в системе "Честный знак". Позволяет быстро определить и списать коды маркировки проданного, испорченного, утраченного (полный перечень причин списания указан ниже)  товара, которые всё ещё числятся за организацией. Привести в соответствие остатки маркированного товара программы 1С и системы "Честного знака".

6649 руб.

09.01.2024    22069    227    30    

204

Обмен с ГосИС Разработчик 1С:Предприятие 8 1C:Бухгалтерия Оптовая торговля, дистрибуция, логистика Россия Управленческий учет Платные (руб)

Универсальная конфигурация ХамелеонЗерно для взаимодействия с системой ФГИС Зерно (тестовый+рабочий контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Работа через API 1.0.7 и на API 1.0.8. Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом ФГИС Зерно, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе ФГИС Зерно и наоборот.

25498 руб.

27.06.2023    9794    52    2    

25

Оптовая торговля Производство готовой продукции (работ, услуг) Розничная торговля Обмен с ГосИС Разработчик Бухгалтер Пользователь 1С:Предприятие 8 1C:Бухгалтерия Сельское хозяйство и рыболовство Розничная и сетевая торговля (FMCG) Оптовая торговля, дистрибуция, логистика Рестораны, кафе и фаст-фуд Пищевая промышленность Россия Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная конфигурация Хамелеон Меркурий для взаимодействия с системой Меркурий (тестовый+рабочий+демо контур) может использоваться для интеграции в любую конфигурацию на базе 1С, версии ПРОФ и выше. Основное отличие от других решений - работа через веб-интерфейс и API 2.0(API 2.1). Для удобства реализован общий интерфейс в виде обработки, схожей с интерфейсом Меркурий, но возможностей гораздо больше, т.к. при интеграции в Вашу учетную систему, можно на основании Ваших справочников и документов, создавать соответствующие документы и справочники в системе Меркурий и наоборот.

11000 руб.

08.11.2017    131992    293    153    

409
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ValToDas 8 29.09.26 12:19 Сейчас в теме
Обнаружили такую же проблему Розница 2.3.24.26 не верно распределяются КМ в чеке на строки. Прилетают авто штрафы. Спасибо за направление меньше теперь искать где ошибки.
2. G_100802897175107255412 61 29.09.26 13:10 Сейчас в теме
Спасибо, что написали. Раз на 2.3.24.26 то же самое, дефект старше, чем релизы, которые я разбирал.

Проверить уже пробитые чеки можно прогоном из раздела «Как проверить свои чеки, не трогая кассу»: он покажет, какие чеки ушли в ККТ с переставленными кодами.

Исправление расширением: https://infostart.ru/marketplace/2790796/. На 2.3.24.26 я его не проверял, проверено на «Рознице» 2.3.26.13. У него есть демо на 5 дней: поставьте на копию базы и посмотрите, применяется ли оно на вашем релизе. Если не применится, напишите, разберусь.
Для отправки сообщения требуется регистрация/авторизация