Как записать код маркировки в табличную часть документа в 1С 7.7 при сканировании штрихкода

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

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

Анализ исходной ситуации

В типовых конфигурациях 1С 7.7 (например, «Торговля и Склад») вся работа со сканером штрихкодов сосредоточена в процедуре ОбработкаВнешнегоСобытия. Когда сканер считывает код, он генерирует событие, которое перехватывает форма документа. Проанализируем типичную ошибку начинающих разработчиков: попытку записать значение напрямую в реквизит без учета текущего состояния строки табличной части. Выясним причину, по которой конструкция КодМаркировки = Штрихкодвр может не срабатывать. Чаще всего это происходит из-за того, что в момент присваивания не выбрана активная строка документа или данные передаются через глобальные процедуры подбора, которые «затирают» локальные переменные.

Способ 1. Прямая запись при создании строки

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

Найдем в процедуре ОбработкаВнешнегоСобытия блок, отвечающий за добавление товара. Обычно он выглядит так:


НоваяСтрока();
Номенклатура = ВремТовар;
Количество = 1;
// Здесь мы добавляем запись нашего кода
КодМаркировки = Штрихкодвр; 

Важный нюанс: Перед выполнением этого кода убедитесь, что в конфигураторе для данного документа в табличной части действительно создан реквизит КодМаркировки с типом «Строка» и достаточной длиной (рекомендуется не менее 100 символов, чтобы поместился полный криптохвост маркировки).

Способ 2. Использование модальной формы для ввода маркировки

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

Проанализируем ситуацию: в справочнике Номенклатура должен быть признак (флаг), указывающий на то, что товар маркируемый (например, реквизит Маркер). В процедуре обработки сканера мы добавляем проверку:


Если ВремТовар.Маркер = 1 Тогда
    // Вызываем модальное окно для считывания DataMatrix
    Марка = "";
    ОткрытьФормуМодально("Обработка.ВводКодаМаркировки", Марка);
    
    Если ПустоеЗначение(Марка) = 1 Тогда
        Предупреждение("Код маркировки не считан! Товар не будет добавлен.");
        Возврат;
    КонецЕсли;
    
    // Если марка получена, добавляем строку
    НоваяСтрока();
    Номенклатура = ВремТовар;
    КодМаркировки = Марка;
    Количество = 1;
Иначе
    // Обычная логика добавления без маркировки
    НоваяСтрока();
    Номенклатура = ВремТовар;
    Количество = 1;
КонецЕсли;

В этом примере ОткрытьФормуМодально передает управление специальной обработке. Внутри этой обработки в ОбработкаВнешнегоСобытия вы записываете считанные данные в Форма.Параметр и закрываете форму командой Форма.Закрыть(). Это гарантирует, что кассир не забудет отсканировать марку.

Способ 3. Передача через таблицу подбора и глобальный модуль

В крупных конфигурациях добавление товара часто идет через процедуру глОбработкаПодбора. Чтобы передать туда код маркировки, нужно модифицировать список параметров. Посмотрим на пример изменения структуры передачи данных:

  1. Создаем объект типа СписокЗначений или ТаблицаЗначений.
  2. Добавляем колонку или значение с именем КодМаркировки.
  3. В глобальном модуле, в функции глОбработкаПодбора, дописываем код получения этого значения.

Пример подготовки таблицы подбора в модуле формы:


ТаблицаПодбора = СоздатьОбъект("ТаблицаЗначений");
ТаблицаПодбора.НоваяКолонка("Номенклатура");
ТаблицаПодбора.НоваяКолонка("Количество");
ТаблицаПодбора.НоваяКолонка("КодМаркировки"); // Добавленная колонка

ТаблицаПодбора.НоваяСтрока();
ТаблицаПодбора.Номенклатура = ВремТовар;
ТаблицаПодбора.Количество = 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.

← На главную