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