Как реализовать автоматическое изменение статуса документа при сканировании штрихкода в 1С:Управление торговлей

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В современных складских процессах автоматизация смены статусов документов позволяет значительно ускорить работу персонала и минимизировать ошибки ручного ввода. Типичный сценарий: кладовщик или менеджер сканирует штрихкод на распечатанной накладной, и система автоматически меняет статус документа на Реализовано, а при повторном сканировании отмечает получение бумажного оригинала. Рассмотрим подробно, как реализовать этот функционал в конфигурации "1С:Управление торговлей" (УТ 11).

Принцип работы сканера штрихкодов в 1С

Прежде чем переходить к коду, проанализируем, как 1С взаимодействует с оборудованием. Сканер, подключенный в режиме эмуляции COM-порта или через Native API, генерирует внешнее событие. Программа перехватывает его в активной форме. Выясним, какая процедура за это отвечает.

Основной "точкой входа" для данных со сканера в управляемых формах является процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник). Когда сканер считывает код, система рассылает оповещение всем открытым формам. Если ИмяСобытия соответствует событию сканера (например, "BarcodeEvent"), в переменной Параметр будет содержаться считанный штрихкод.

Шаг 1: Формирование уникального штрихкода для документа

Чтобы система могла найти конкретную "Реализацию товаров и услуг", нам необходимо привязать к ней уникальный идентификатор. Рассмотрим два варианта:

  1. Использование GUID: В печатную форму документа выводится штрихкод, содержащий УникальныйИдентификатор ссылки документа. Это самый надежный способ, так как поиск по внутреннему ID работает быстрее и точнее всего.
  2. Типовой механизм БПО: Использование регистра сведений ШтрихкодыОбъектов. Однако для документов чаще используют кодирование типа "Префикс + Номер документа".

Шаг 2: Перехват события сканирования

Разберем, как отловить момент сканирования. Если мы хотим, чтобы изменение статуса происходило в конкретной форме (например, в списке документов), нам нужно прописать логику в модуле этой формы. Однако более современный и правильный метод для УТ 11 — использование расширения для перехвата общих механизмов обработки штрихкодов.

Посмотрим на пример кода, который можно разместить в расширении для формы списка или формы документа РеализацияТоваровУслуг:


&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
    Если ИмяСобытия = "BarcodeEvent" Тогда // Имя события зависит от настроек драйвера
        Штрихкод = Параметр;
        ОбработатьСканированиеДокумента(Штрихкод);
    КонецЕсли;
КонецПроцедуры

Шаг 3: Поиск документа и изменение реквизитов

Теперь проанализируем ситуацию: штрихкод получен, теперь нужно найти документ и применить к нему бизнес-логику "двойного сканирования". Логика заключается в следующем: если документ еще не реализован — ставим статус Реализовано. Если уже реализован — меняем статус бумажного оригинала (реквизит СтатусДокументаОригинала).

Реализуем серверную функцию для обработки логики:


&НаСервере
Процедура ОбработатьСканированиеНаСервере(Знач Штрихкод)
    // Предположим, мы ищем документ по внутреннему коду, зашитому в штрихкод
    СсылкаНаДокумент = Документы.РеализацияТоваровУслуг.НайтиПоРеквизиту("УникальныйКодШтрихкода", Штрихкод);
    
    Если СсылкаНаДокумент.Пустая() Тогда
        Возврат; // Документ не найден
    КонецЕсли;

    ОбъектДокумент = СсылкаНаДокумент.ПолучитьОбъект();
    
    // Реализуем логику переключения статусов
    Если ОбъектДокумент.Статус <> Перечисления.СтатусыРеализацийТоваровУслуг.Реализовано Тогда
        // Первое сканирование
        ОбъектДокумент.Статус = Перечисления.СтатусыРеализацийТоваровУслуг.Реализовано;
        Сообщение = "Документ №" + ОбъектДокумент.Номер + " переведен в статус Реализовано";
    Иначе
        // Повторное сканирование - меняем статус бумажного носителя
        // В УТ 11 это может быть дополнительный реквизит или типовой механизм оригиналов
        ОбъектДокумент.ДополнительныеРеквизиты.Установить("СтатусБумажногоДокумента", "Подписан");
        Сообщение = "Для документа №" + ОбъектДокумент.Номер + " отмечен возврат оригинала";
    КонецЕсли;
    
    Попытка
        ОбъектДокумент.Записать(РежимЗаписиДокумента.Запись);
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(Сообщение);
    Исключение
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Ошибка при сохранении документа: " + ОписаниеОшибки());
    КонецПопытки;
КонецПроцедуры

Шаг 4: Использование расширений (рекомендуемый способ)

В конфигурациях на базе БСП (Библиотеки стандартных подсистем), к которым относится и УТ 11, существует общий механизм ОбработатьШтрихкоды. Чтобы не изменять типовую конфигурацию, воспользуемся расширением. Рассмотрим пример перехвата события через аннотацию &После:


&НаКлиенте
&После("ОбработатьШтрихкоды")
Процедура Расш1_ОбработатьШтрихкоды(ДанныеШтрихкодов)
    Для Каждого ТекущийШтрихкод Из ДанныеШтрихкодов Цикл
        // ДанныеШтрихкодов - это массив структур, возвращаемый подсистемой БПО
        ШтрихкодСтрокой = ТекущийШтрихкод.Штрихкод;
        // Вызываем нашу процедуру обработки
        ИзменитьСтатусДокументаПоШтрихкоду(ШтрихкодСтрокой);
    КонецЦикла;
КонецПроцедуры

Технические нюансы и оптимизация

Разберем важные моменты, которые могут повлиять на стабильность решения:

Таким образом, мы рассмотрели комплексный подход к автоматизации смены статусов. Мы выяснили, что наиболее гибким методом является использование расширения для перехвата событий подключаемого оборудования, а логика "двойного сканирования" эффективно реализуется через проверку текущего состояния реквизитов документа на сервере.

← На главную