В типовых конфигурациях «1С:Управление торговлей» (версии 11.4 и 11.5) механизм работы со штрихкодами достаточно гибок, однако часто возникают задачи, требующие выделения особого типа штрихкода (например, внутреннего «Штрих К» или кода производителя), по которому необходимо осуществлять поиск в документах реализации наравне с основным. Рассмотрим подробно, как решить эту задачу с помощью механизма расширений, не снимая основную конфигурацию с поддержки.
Прежде чем приступать к кодингу, проанализируем, где в 1С хранятся эти данные. Основным местом хранения является регистр сведений ШтрихкодыНоменклатуры. Важно понимать, что типовая система уже позволяет привязать к одной номенклатуре несколько разных штрихкодов. Однако, если задача стоит именно в добавлении отдельного поля (например, для специфической классификации), у нас есть два пути:
Номенклатура.ШтрихкодыНоменклатуры.Второй вариант является более правильным с точки зрения производительности и логики типового решения, так как вся поисковая механика «заточена» на работу именно с этим регистром. Разберем ситуацию, когда мы добавляем признак «Дополнительный» в существующий регистр или создаем новый реквизит для хранения альтернативного кода.
Для начала создадим расширение и добавим в него регистр сведений ШтрихкодыНоменклатуры. Добавим в этот регистр новый реквизит, назовем его ТипШтрихкода (перечисление) или просто создадим отдельное поле на форме записи, если нам нужно визуально выделить «Штрих К».
Если же мы идем по пути упрощения и нам просто нужно, чтобы поиск находил номенклатуру по любому из введенных кодов, достаточно убедиться, что записи в регистре присутствуют. Но по условию задачи нам нужно реализовать поиск именно по «второму» штрихкоду, который может иметь свою логику заполнения. Рассмотрим пример добавления нового реквизита ДополнительныйШтрихкод в расширение к регистру.
Проанализируем путь исполнения кода при нажатии кнопки поиска штрихкода в документе «Реализация товаров и услуг». В типовых решениях УТ 11 за это отвечает общий модуль ШтрихкодыНоменклатурыСервер. Нам необходимо найти функцию, которая принимает строку (штрихкод) и возвращает структуру с данными номенклатуры.
Обычно это функция НайтиПоШтрихкоду(). Выясним причину, почему стандартный поиск может не подходить: он ищет только по измерению Штрихкод. Наша задача — расширить этот поиск.
Используем аннотацию &Вместо для функции поиска в общем модуле. Нам нужно модифицировать запрос к базе данных так, чтобы он проверял совпадение как с основным полем, так и с нашим новым реквизитом. Рассмотрим пример кода, который можно внедрить в расширение:
&Вместо("НайтиПоШтрихкоду")
Функция Расш1_НайтиПоШтрихкоду(Штрихкод)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Номенклатура КАК Номенклатура,
| Штрихкоды.Характеристика КАК Характеристика,
| Штрихкоды.Упаковка КАК Упаковка,
| Штрихкоды.ЕдиницаИзмерения КАК ЕдиницаИзмерения
|ИЗ
| РегистрСведений.ШтрихкодыНоменклатуры КАК Штрихкоды
|ГДЕ
| (Штрихкоды.Штрихкод = &Штрихкод
| ИЛИ Штрихкоды.ДополнительныйШтрихкод = &Штрихкод)";
Запрос.УстановитьПараметр("Штрихкод", Штрихкод);
РезультатЗапроса = Запрос.Выполнить();
// Далее следует логика обработки результата, аналогичная типовой
// Если найдено несколько значений, система должна вернуть таблицу или вызвать диалог выбора
...
КонецФункции
Обратите внимание, что при использовании &Вместо вы полностью берете на себя ответственность за работу метода. Более безопасным вариантом является использование &ИзменениеИКонтроль, что позволит сохранить типовую логику при обновлениях конфигурации, лишь точечно изменив текст запроса ВЫБРАТЬ... ГДЕ....
Посмотрим на форму документа «Реализация товаров и услуг». Кнопка поиска вызывает команду, которая в итоге обращается к серверному методу. В расширении нам нужно убедиться, что вызывается именно наш модифицированный метод. Проанализируем ситуацию: если поиск вызывается через подключаемое оборудование (сканер), то задействуется механизм БПО (Библиотека подключаемого оборудования). Если же нажатием кнопки — проверяем процедуру Подключаемый_ВыполнитьКоманду в модуле формы документа.
Важный момент: Если штрихкод будет найден, функция должна вернуть структуру, содержащую не только ссылку на Номенклатура, но и Характеристика, Упаковка и Количество. Если эти данные не будут заполнены корректно, строка в табличную часть «Товары» не добавится или добавится с ошибками.
Разберем по шагам возможные сложности, с которыми мы можем столкнуться:
Результат.Количество() > 1. Обычно открывается форма выбора из списка.МенеджерОборудованияУТ.ИЛИ в запрос по неиндексированным полям может замедлить поиск при огромной базе штрихкодов. Рекомендуем убедиться, что на новое поле в расширении установлен индекс.Мы выяснили, что для реализации поиска по двум штрихкодам в УТ 11 через расширение, оптимальным путем является модификация общего модуля ШтрихкодыНоменклатурыСервер. Мы добавили поле в регистр, изменили запрос в функции поиска и обеспечили возврат корректной структуры данных. Такой подход сохраняет типовую логику работы документов и позволяет легко поддерживать систему при обновлениях.