Как реализовать сканирование марок Честный Знак и определение номенклатуры в 1С 7.7?

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

Работа с современными системами маркировки ("Честный Знак") в устаревшей, но надежной платформе 1С:Предприятие 7.7 — задача нетривиальная. Основная проблема, с которой сталкиваются разработчики, заключается в том, как "подружить" поток данных со сканера штрихкодов с логикой программы, написанной много лет назад. Чтобы упростить этот процесс, часто используется бюджетное решение для доработки ТиС 7.7 под маркировку (поможет модуль автоматизации маркировки для 1С 7.7), которое позволяет извлекать нужные данные из DataMatrix. Особенно актуален вопрос: как по считанной "абракадабре" (коду DataMatrix) понять, какой именно товар (Номенклатуру) нужно добавить в документ.

В этой статье мы подробно разберем, как программно обработать сканирование марок, выделить из них идентификатор товара (GTIN) и решить вопрос с паллетной отгрузкой.

Постановка задачи

Представим типичную ситуацию на складе. Есть самописная база на 1С 7.7 (или сильно измененная "Торговля и Склад"). Кладовщик хочет просто "пропикивать" марки с пачек сигарет, бутылок воды или блоков, а программа должна сама находить соответствующую позицию в справочнике Номенклатура и добавлять её в накладную.

Сложность делится на две части:

  1. Штучный товар: Марка содержит информацию о товаре, но её нужно правильно извлечь.
  2. Паллета (Транспортная упаковка): Штрихкод паллеты (SSCC) не содержит информации о том, что внутри.

Давайте разберем эти процессы по порядку.

Разбор штрихкода и DataMatrix: Алгоритм

Ключ к определению номенклатуры из маркировки — это GTIN (Global Trade Item Number). В коде DataMatrix формата GS1 он всегда идет в начале, после идентификатора применения (01). Для корректной работы с такими кодами важно правильно настроить оборудование; в этом поможет исправленная инструкция по подключению сканера через Атол, устраняющая типичные ошибки связи.

Алгоритм действий должен быть следующим:

  1. Получаем строку со сканера.
  2. Анализируем длину строки и наличие специальных префиксов.
  3. Если это обычный EAN-13 — ищем по штрихкоду.
  4. Если это DataMatrix — "выкусываем" из него GTIN и ищем товар по нему.

Ниже приведен пример универсальной функции на языке 1С 7.7, которая анализирует входящую строку и определяет тип штрихкода. Этот код можно использовать в модуле формы документа или в глобальном модуле для обработки внешнего события сканера.

Рассмотрим код функции РазобратьШК, предложенной в обсуждении:


// Функция возвращает СписокЗначений, где первым элементом идет Тип ШК,
// а вторым — "чистый" EAN или GTIN для поиска в справочнике.
Функция РазобратьШК(Знач ШК) Экспорт
	СЗ			= СоздатьОбъект("СписокЗначений");
	СтрШК		= СокрЛП(ШК);
	
	// 1. Проверка на обычный EAN-13 или EAN-8
	Если СтрДлина(СтрШК) <= 13 Тогда
		СЗ.ДобавитьЗначение(1, 		"ТипЕд"); // Обычный товар
		СЗ.ДобавитьЗначение(СтрШК, 	"ЕАН");
		СЗ.ДобавитьЗначение(0);

	// 2. DataMatrix для пачек сигарет (короткий код)
	ИначеЕсли (СтрДлина(СтрШК) <= 29) И (СтрДлина(СтрШК) >= 21) Тогда
		СЗ.ДобавитьЗначение(2, 		"ТипЕд"); // Пачка сигарет
		// Первые 14 символов в табачной марке - это GTIN/EAN
		ВыдЕАН	= СокрЛП(Число(Лев(ШК, 14)));
		СЗ.ДобавитьЗначение(ВыдЕАН, "ЕАН");
		
		// Попытка извлечь МРЦ (максимальную розничную цену)
		Если СтрДлина(СтрШК) >= 25 Тогда
			МРЦ	= ВернутьМРЦ(Сред(СокрЛП(СтрШК), 22, 4));    
		Иначе	
			МРЦ	= 0;	
		КонецЕсли;
		СЗ.ДобавитьЗначение(МРЦ, "МРЦ");

	// 3. Алкогольные марки (PDF-417 и новые DataMatrix)
	ИначеЕсли СтрДлина(СтрШК) = 68 Тогда
		СЗ.ДобавитьЗначение(4, "ТипЕд"); // Алкоголь старый
		СЗ.ДобавитьЗначение(СтрШК, "ЕАН");
	ИначеЕсли СтрДлина(СтрШК) = 150 Тогда	
		СЗ.ДобавитьЗначение(5, "ТипЕд"); // Алкоголь новый
		СЗ.ДобавитьЗначение(СтрШК, "ЕАН");
	
	// 4. Обработка длинных DataMatrix (GS1), включая блоки, воду, молочку
	ИначеЕсли (СтрДлина(СтрШК) >= 30) И (СтрДлина(СтрШК) < 68) Тогда	
		// Предварительная очистка от скобок, если сканер настроен передавать AI в скобках (01)
		СтрШК = СтрЗаменить(СтрШК, "(", "");
		СтрШК = СтрЗаменить(СтрШК, ")", "");
		
		// Главная проверка на стандарт GS1: начинается с префикса 01
		Если Лев(СтрШК, 2) = "01"  Тогда
			// Проверка на наличие разделителя (ASCII 29)
			// Внимание: для 7.7 это критичный момент, см. пояснение ниже
			Если Найти(СтрШК, Симв(29)) > 0 Тогда               
				// Полная марка GS1
				СЗ.ДобавитьЗначение(7, "ТипЕд");
				// Выделяем GTIN - это 14 символов начиная с 3-го (после "01")
				GTIN = Сред(СтрШК, 3, 14);	
				ШК = СокрЛП(Число(Сред(СтрШК, 3, 14))); // Преобразуем в EAN
				
				СЗ.ДобавитьЗначение(ШК, 	"ЕАН");
				СЗ.ДобавитьЗначение(GTIN, 	"GTIN");
			Иначе	
				// Обработка вариантов без явного разделителя или блоков табака
				Если Найти(СтрШК, "8005") = 0 Тогда
					// Упаковка прочая (не блок с МРЦ)
					GTIN = СокрЛП(Число(Сред(СтрШК, 3, 14)));
					// Преобразование GTIN в EAN-13 (убираем ведущий ноль)
					Если Лев(GTIN, 1) = "0" Тогда
						ЕАН	= Сред(GTIN, 2, 13);
					Иначе
						ЕАН	= Лев(GTIN, 13);
					КонецЕсли;
					
					СЗ.ДобавитьЗначение(7, "ТипЕд");
					СЗ.ДобавитьЗначение(ЕАН, "ЕАН");
				ИначеЕсли Найти(СтрШК, "8005") >= 25 Тогда
					// Блок сигарет с МРЦ (тег 8005)
					ШК = СокрЛП(Число(Сред(СтрШК, 3, 14)));
					СЗ.ДобавитьЗначение(3, "ТипЕд");
					СЗ.ДобавитьЗначение(ШК, "ЕАН");
				КонецЕсли;
			КонецЕсли;	
		КонецЕсли;  
	
	// 5. Короткие коды маркировки (Молоко, Вода - упрощенный формат)
	ИначеЕсли (СтрДлина(СтрШК) >= 19) И (СтрДлина(СтрШК) < 21) Тогда 
		ШК	= СокрЛП(Число(Сред(СтрШК, 3, 14)));
		СЗ.ДобавитьЗначение(8, "ТипЕд");
		СЗ.ДобавитьЗначение(ШК, "ЕАН");
	КонецЕсли;	
	
	Возврат СЗ;
КонецФункции

Важные технические нюансы для 1С 7.7

При внедрении этого кода вы можете столкнуться с проблемой, когда 1С 7.7 "глотает" символы или неправильно воспринимает марку. Разберем причины.

1. Символ-разделитель (GS, ASCII 29)
В стандарте DataMatrix группы данных разделяются спецсимволом (код 29). В коде выше есть проверка Найти(СтрШК, Симв(29)). Однако, если ваш сканер работает в режиме "Разрыв клавиатуры" (Keyboard Wedge), этот символ может не передаваться в 1С или вызывать срабатывание горячих клавиш.
Решение: Переведите сканер в режим эмуляции COM-порта (USB-COM). Это позволит получать данные во внешней компоненте (например, ScanOPOS) в "сыром" виде, включая все спецсимволы. Если вы работаете с товарными группами вроде автопокрышек, вам может пригодиться специализированная реализация маркировки шин для 1С 7.7, где уже учтены нюансы авторизации и запросов данных по маркам.

2. Инверсия цвета (Табак)
Маркировка на пачках сигарет часто инвертирована (белые пиксели на черном фоне). Старые модели сканеров могут её не читать. Убедитесь, что в настройках оборудования включено чтение инвертированных кодов DataMatrix.

Проблема паллет и транспортных упаковок

Вопрос автора темы касался также сканирования паллет "сплошняком". Здесь есть фундаментальное отличие от штучного товара.

Штрихкод на паллете — это обычно код SSCC (Serial Shipping Container Code). Он выглядит как длинная последовательность цифр (обычно начинается с 00). Важно понимать: в коде SSCC не зашифрована номенклатура. Это просто уникальный номер "коробки".

Вы не сможете определить, что внутри паллеты, просто разобрав её штрихкод функцией Сред() или Лев().

Как реализовать работу с паллетами:

  1. Локальная агрегация: Если вы сами формировали эту паллету, то в вашей базе 1С должна быть сохранена связь: Код SSCC -> Список товаров внутри. При сканировании паллеты вы ищете этот код в своей таблице агрегации и подгружаете всё содержимое.
  2. Чужая паллета (приемка): Если паллета пришла от поставщика, данные о её составе содержатся в электронном УПД. Для автоматизации этого процесса можно использовать выгрузку и загрузку документов с маркировкой в XML по формату 5.02, что обеспечит корректную работу с вложенностью марок.
  3. Запрос в ЦРПТ: Если локальных данных нет, единственный способ узнать содержимое — отправить API-запрос к серверам "Честного Знака" на получение состава агрегата. Поскольку 1С 7.7 не имеет встроенных средств для работы с современным HTTPS и JSON, рекомендуется использовать готовый механизм взаимодействия с Честным Знаком через API (для этого есть модуль интеграции с Честным Знаком через API), который стабильно работает даже на старых операционных системах.

Итоговое решение

Для реализации задачи "пропикивания" всего подряд на 1С 7.7, логика работы документа отгрузки должна учитывать современные требования. В частности, для соблюдения законодательства с 2024 года важна настройка локального модуля Честный знак для разрешительного режима, который позволяет проводить проверки даже при отсутствии связи с серверами.

Общая логика процесса должна выглядеть так:

  1. Оператор сканирует код.
  2. Программа проверяет длину и префикс кода.
  3. Если это товарная марка (01...):
    • Вырезаем GTIN (14 знаков после "01").
    • Ищем Номенклатуру по штрихкоду (GTIN).
    • Добавляем 1 единицу в табличную часть.
  4. Если это код паллеты (00...):
    • Ищем код SSCC в регистре агрегации (загруженном из ЭДО или созданном ранее).
    • Если найдено — добавляем в табличную часть все товары, привязанные к этому SSCC.
    • Если не найдено — выдаем ошибку "Состав паллеты неизвестен" или инициируем запрос к API (если реализовано).

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

← На главную