Запуск обязательной маркировки товаров (шин, обуви, одежды, парфюмерии и других групп) ставит перед владельцами старых, сильно доработанных конфигураций сложную дилемму. С одной стороны, фирма «1С» поддерживает актуальные форматы маркировки только в современных конфигурациях (таких как «1С:Розница 2.3/3.0» или «1С:УНФ»). С другой стороны, переход на новую систему означает потерю уникального функционала, в который годами вкладывались средства, а также требует обновления парка компьютерной техники и покупки серверных лицензий.
В этой статье мы подробно проанализируем ситуацию, разберем все возможные пути решения проблемы и покажем, как технически реализовать поддержку маркировки в устаревшей конфигурации «1С:Розница 1.0» (или аналогичной «1С:Управление торговлей 10.3» на обычных формах) с минимальными затратами.
---
Перед тем как приступать к написанию кода, необходимо оценить экономическую и техническую целесообразность каждого из возможных вариантов развития событий. Рассмотрим подробнее четыре основных сценария.
Вариант 1. Полный переход на «1С:Розница 2.3 / 3.0»
Это официальный путь, рекомендуемый фирмой «1С».
Вариант 2. «Лобовой» перенос подсистемы маркировки из «1С:УТ 10.3»
Поскольку «1С:Управление торговлей 10.3» также построена на обычных формах, у разработчиков часто возникает соблазн просто скопировать модули ИС МП (Информационной системы маркировки продукции) в «1С:Розница 1.0».
Вариант 3. Облегченная самостоятельная доработка «1С:Розница 1.0»
Этот вариант предполагает, что мы отказываемся от полноценного обмена с ГИС МТ через саму программу 1С. Все операции по приемке накладных (УПД) и списанию кодов маркировки осуществляются вручную в личном кабинете «Честного Знака» или через веб-интерфейс оператора ЭДО. В самой 1С дорабатывается исключительно блок розничных продаж (РМК): сканирование кода DataMatrix и передача его в кассовый аппарат для печати чека.
Вариант 4. Гибридная схема (Бэк + Фронт)
Учет и доработки остаются в старой «1С:Розница 1.0» (она выступает в роли бэк-офиса). На рабочие места кассиров (фронт-офис) устанавливается легкое современное ПО, например, «1С:РМК» или автономные смарт-терминалы. Между базами настраивается простой односторонний обмен: из Розницы 1.0 на кассы выгружаются товары и цены, а обратно загружаются отчеты о розничных продажах. Этот вариант идеален при жестких требованиях к стабильности кассовой зоны.
---
Если принято решение идти по пути Варианта 3 (облегченная доработка), нам потребуется решить две ключевые технические задачи: научить программу корректно считывать и разбирать двухмерный код DataMatrix, а также передавать этот код в обработку обслуживания ККТ для формирования фискального признака в чеке.
Рассмотрим по шагам, как это реализовать на встроенном языке «1С:Предприятие 8».
Для работы с маркировкой необходим 2D-сканер штрихкодов, поддерживающий чтение формата DataMatrix GS1. На уровне 1С сканер должен быть подключен в режиме эмуляции COM-порта (через драйверы 1С или сторонние решения, например, АТОЛ). Это необходимо для того, чтобы программа могла перехватывать событие сканирования программно, не требуя фокуса ввода в текстовом поле.
При сканировании маркированного товара сканер передает в систему строку, содержащую различные группы данных (идентификаторы применения AI). Нам необходимо вычленить из этой строки чистый код маркировки, очистить его от лишних спецсимволов и разделителей (таких как символ GS с кодом 29).
Проанализируем пример функции разбора штрихкода DataMatrix на встроенном языке:
Функция РазобратьКодМаркировки(Знач ИсходныйШтрихкод) Экспорт
Результат = Новый Структура;
Результат.Вставить("Успешно", Ложь);
Результат.Вставить("GTIN", "");
Результат.Вставить("СерийныйНомер", "");
Результат.Вставить("ОчищенныйКод", "");
// Удаляем возможные символы GS (код символа 29)
СимволGS = Символ(29);
ОчищеннаяСтрока = СтрЗаменить(ИсходныйШтрихкод, СимволGS, "");
// В зависимости от товарной группы длина и структура кода могут отличаться.
// Рассмотрим стандартный шаблон GS1 для шин и обуви:
// (01) GTIN [14 символов] + (21) Серийный номер [13 символов]
Если Лев(ОчищеннаяСтрока, 2) = "01" Тогда
GTIN = Сред(ОчищеннаяСтрока, 3, 14);
// Ищем идентификатор серийного номера (обычно начинается с "21")
ОстатокСтроки = Сред(ОчищеннаяСтрока, 17);
Если Лев(ОстатокСтроки, 2) = "21" Тогда
СерийныйНомер = Сред(ОстатокСтроки, 3, 13);
Результат.GTIN = GTIN;
Результат.СерийныйНомер = СерийныйНомер;
// Формируем чистый код для передачи в ККТ
Результат.ОчищенныйКод = "01" + GTIN + "21" + СерийныйНомер;
Результат.Успешно = Истина;
КонецЕсли;
КонецЕсли;
Если Не Результат.Успешно Тогда
// Если код не соответствует стандартному шаблону, возвращаем исходный для прямой передачи
Результат.ОчищенныйКод = ИсходныйШтрихкод;
Результат.Успешно = Истина;
КонецЕсли;
Возврат Результат;
КонецФункции
В рабочем месте кассира (РМК) при подборе товара по штрихкоду необходимо добавить проверку: является ли сканируемый товар маркированным. Для этого в карточку номенклатуры (или в свойства/категории) предварительно добавляется признак «Маркируемый товар».
Рассмотрим алгоритм обработки события сканирования в форме РМК:
Процедура ОбработкаВнешнегоСобытия(Источник, Событие, Данные)
ПолученныйШтрихкод = СокрЛП(Данные);
// Проверяем, открыта ли смена и активна ли корзина
Если Не СменаОткрыта() Тогда
Предупреждение("Смена не открыта!");
Возврат;
КонецЕсли;
// Пытаемся найти номенклатуру по обычному штрихкоду
НоменклатураСсылка = НайтиНоменклатуруПоШтрихкоду(ПолученныйШтрихкод);
Если ЗначениеЗаполнено(НоменклатураСсылка) Тогда
// Это обычный штрихкод товара EAN-13
Если НоменклатураСсылка.Маркируемый Тогда
// Товар требует маркировки, просим кассира отсканировать марку
КодМарки = ЗапроситьКодМаркировкиСЭкрана();
Если КодМарки = "" Тогда
Возврат; // Отмена добавления
КонецЕсли;
ДобавитьТоварВЧек(НоменклатураСсылка, КодМарки);
Иначе
ДобавитьТоварВЧек(НоменклатураСсылка, "");
EndIf;
Иначе
// Возможно, кассир сразу отсканировал код маркировки DataMatrix
СведенияОМарке = РазобратьКодМаркировки(ПолученныйШтрихкод);
Если СведенияОМарке.Успешно Тогда
НоменклатураСсылка = НайтиНоменклатуруПоGTIN(СведенияОМарке.GTIN);
Если ЗначениеЗаполнено(НоменклатураСсылка) Тогда
ДобавитьТоварВЧек(НоменклатураСсылка, СведенияОМарке.ОчищенныйКод);
Иначе
Предупреждение("Товар с GTIN " + СведенияОМарке.GTIN + " не найден в базе данных!");
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Для того чтобы Честный Знак зафиксировал продажу, код маркировки должен быть передан в кассовый аппарат и отправлен через ОФД. В старых обработках обслуживания ККТ (купленных на Инфостарте или написанных самостоятельно) необходимо найти процедуру формирования XML-пакета чека или вызова метода драйвера ДобавитьТовар (в зависимости от требований драйвера АТОЛ или Штрих-М).
В современных фискальных накопителях и драйверах для передачи марки используется специальный реквизит (тег 1162 для старых ФФД или структура разбора для ФФД 1.2). Нам необходимо передать туда очищенный код маркировки в байтовом представлении или в виде строки.
Пример изменения структуры XML, передаваемой в обработку торгового оборудования АТОЛ:
// В процедуре формирования XML для ККТ добавляем атрибут маркировки
ЗаписьXML.ЗаписатьНачалоЭлемента("FiscalString");
ЗаписьXML.ЗаписатьАтрибут("Name", СтрокаТовара.Номенклатура.Наименование);
ЗаписьXML.ЗаписатьАтрибут("Quantity", СтрокаТовара.Количество);
ЗаписьXML.ЗаписатьАтрибут("PriceWithDiscount", СтрокаТовара.Цена);
ЗаписьXML.ЗаписатьАтрибут("SumWithDiscount", СтрокаТовара.Сумма);
ЗаписьXML.ЗаписатьАтрибут("Department", 1);
ЗаписьXML.ЗаписатьАтрибут("Tax", "none"); // НДС
Если ЗначениеЗаполнено(СтрокаТовара.КодМаркировки) Тогда
// Передаем шестнадцатеричное или строковое представление кода маркировки
// Для АТОЛ 10-й версии это может быть атрибут "MarkingCode"
ЗаписьXML.ЗаписатьАтрибут("MarkingCode", ПолучитьHexПреобразование(СтрокаТовара.КодМаркировки));
КонецЕсли;
ЗаписьXML.ЗаписатьКонецЭлемента(); // FiscalString
---
Если вы решите полностью локализовать решение внутри конфигурации, вам потребуется создать несколько новых объектов метаданных, чтобы не засорять типовой код:
---
Прежде чем программист приступит к работе по Варианту 3, руководство компании должно четко осознавать следующие риски:
Резюме: Если у вас небольшой магазин с оборотом в несколько сотен шин в месяц, доработка «1С:Розница 1.0» под сканирование на кассе и ручная приемка в Личном кабинете Честного Знака — это вполне рабочий, экономически оправданный костыль на короткую дистанцию. Однако, если бизнес планирует масштабироваться, лучшим решением будет переход на «1С:Розницу 2.3/3.0» через веб-клиент (для экономии на железе рабочих мест) либо развертывание гибридной схемы с использованием современного кассового фронт-офиса.