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