Работа с маркируемыми товарами в системе 1С:Предприятие 7.7 накладывает определенные ограничения и требует от разработчика понимания событийной модели платформы. Основная сложность заключается в том, что процесс продажи или поступления маркированного товара обычно состоит из двух этапов: сканирование обычного линейного штрихкода (EAN-13) для поиска номенклатуры и последующее сканирование кода маркировки (DataMatrix). Рассмотрим подробнее, как реализовать механизм записи этих данных в реквизит табличной части документа.
В типовых конфигурациях 1С 7.7 (например, «Торговля и Склад») вся работа со сканером штрихкодов сосредоточена в процедуре ОбработкаВнешнегоСобытия. Когда сканер считывает код, он генерирует событие, которое перехватывает форма документа. Проанализируем типичную ошибку начинающих разработчиков: попытку записать значение напрямую в реквизит без учета текущего состояния строки табличной части. Выясним причину, по которой конструкция КодМаркировки = Штрихкодвр может не срабатывать. Чаще всего это происходит из-за того, что в момент присваивания не выбрана активная строка документа или данные передаются через глобальные процедуры подбора, которые «затирают» локальные переменные.
Если ваша бизнес-логика подразумевает, что код маркировки считывается одновременно с товаром (или используется специализированный сканер, передающий оба кода), мы можем внести изменения непосредственно в блок создания новой строки. Разберем по шагам, как это сделать в модуле формы документа:
Найдем в процедуре ОбработкаВнешнегоСобытия блок, отвечающий за добавление товара. Обычно он выглядит так:
НоваяСтрока();
Номенклатура = ВремТовар;
Количество = 1;
// Здесь мы добавляем запись нашего кода
КодМаркировки = Штрихкодвр;
Важный нюанс: Перед выполнением этого кода убедитесь, что в конфигураторе для данного документа в табличной части действительно создан реквизит КодМаркировки с типом «Строка» и достаточной длиной (рекомендуется не менее 100 символов, чтобы поместился полный криптохвост маркировки).
Это наиболее надежный и отказоустойчивый метод. Суть его заключается в следующем: когда система понимает, что отсканированный товар подлежит маркировке, она открывает небольшое вспомогательное окно. Это окно ожидает сканирования именно DataMatrix кода. Рассмотрим подробнее программную реализацию этой логики.
Проанализируем ситуацию: в справочнике Номенклатура должен быть признак (флаг), указывающий на то, что товар маркируемый (например, реквизит Маркер). В процедуре обработки сканера мы добавляем проверку:
Если ВремТовар.Маркер = 1 Тогда
// Вызываем модальное окно для считывания DataMatrix
Марка = "";
ОткрытьФормуМодально("Обработка.ВводКодаМаркировки", Марка);
Если ПустоеЗначение(Марка) = 1 Тогда
Предупреждение("Код маркировки не считан! Товар не будет добавлен.");
Возврат;
КонецЕсли;
// Если марка получена, добавляем строку
НоваяСтрока();
Номенклатура = ВремТовар;
КодМаркировки = Марка;
Количество = 1;
Иначе
// Обычная логика добавления без маркировки
НоваяСтрока();
Номенклатура = ВремТовар;
Количество = 1;
КонецЕсли;
В этом примере ОткрытьФормуМодально передает управление специальной обработке. Внутри этой обработки в ОбработкаВнешнегоСобытия вы записываете считанные данные в Форма.Параметр и закрываете форму командой Форма.Закрыть(). Это гарантирует, что кассир не забудет отсканировать марку.
В крупных конфигурациях добавление товара часто идет через процедуру глОбработкаПодбора. Чтобы передать туда код маркировки, нужно модифицировать список параметров. Посмотрим на пример изменения структуры передачи данных:
СписокЗначений или ТаблицаЗначений.КодМаркировки.глОбработкаПодбора, дописываем код получения этого значения.Пример подготовки таблицы подбора в модуле формы:
ТаблицаПодбора = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПодбора.НоваяКолонка("Номенклатура");
ТаблицаПодбора.НоваяКолонка("Количество");
ТаблицаПодбора.НоваяКолонка("КодМаркировки"); // Добавленная колонка
ТаблицаПодбора.НоваяСтрока();
ТаблицаПодбора.Номенклатура = ВремТовар;
ТаблицаПодбора.Количество = 1;
ТаблицаПодбора.КодМаркировки = Штрихкодвр;
ПараметрыПодбора = СоздатьОбъект("СписокЗначений");
ПараметрыПодбора.ДобавитьЗначение(ТаблицаПодбора, "ТаблицаПодбора");
глОбработкаПодбора(Контекст, ПараметрыПодбора, 0, 0, 1);
При работе с кодами маркировки в 1С 7.7 необходимо учитывать специфику хранения данных DataMatrix:
Длина строки: Код маркировки может содержать более 80 символов. Если реквизит в конфигураторе ограничен стандартными 20 или 50 символами, данные будут обрезаны, и вы не сможете корректно отчитаться в систему «Честный ЗНАК» или распечатать чек с признаком маркировки. Всегда устанавливайте длину 100 символов или более.
Спецсимволы (GS): Код маркировки содержит непечатный символ-разделитель GS (ASCII 29). Драйверы сканера в режиме эмуляции клавиатуры могут его игнорировать или заменять. Рекомендуем использовать сканер в режиме COM-порта (через внешнюю компоненту Scaner1C.dll), тогда в процедуру ОбработкаВнешнегоСобытия данные придут в "чистом" виде.
Очистка данных: Иногда требуется записывать не весь код, а только его значимую часть (GTIN + серийный номер). В этом случае используйте функции работы со строками, такие как Лев() или Сред(), чтобы отсечь «криптохвост» после идентификатора применения (21).
Рассмотрим подробнее проверку на уникальность. Чтобы избежать ситуации, когда один и тот же код маркировки сканируется дважды в один документ, полезно внедрить функцию поиска:
Процедура ПроверитьДубльМарки(ТекущаяМарка)
Перем ТекМарка;
ВыбратьСтроки();
Пока ПолучитьСтроку() = 1 Цикл
Если СокрЛП(КодМаркировки) = СокрЛП(ТекущаяМарка) Тогда
Предупреждение("Этот код маркировки уже есть в строке № " + НомерСтроки);
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Использование подобных проверок делает работу системы стабильной и предотвращает ошибки кассиров при интенсивном потоке покупателей. Выяснив причину ошибок и применив один из предложенных методов (прямая запись, модальное окно или модификация подбора), вы сможете успешно реализовать учет маркированной продукции в среде 1С 7.7.