Как вывести штрихкод номенклатуры в табличную часть документа 1С:ERP?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

При автоматизации складских процессов часто возникает необходимость отображения штрихкода номенклатуры непосредственно в табличной части документа. Это позволяет оперативно контролировать наличие данных и проверять товар перед проведением заказа. Давайте разберем, как реализовать эту задачу наиболее оптимально, избегая распространенных ошибок производительности.

Основы решения задачи

Основная сложность заключается в том, что штрихкоды хранятся в регистре сведений ШтрихкодыНоменклатуры, и у одной номенклатуры их может быть несколько. Главное правило, которое мы должны усвоить: никогда не выполняйте запрос к базе данных внутри цикла. Это приведет к критическому падению производительности при открытии или заполнении документа, особенно если в табличной части содержится много позиций.

Шаг 1: Подготовка табличной части

Для начала вам необходимо добавить новый реквизит в табличную часть Товары вашего документа. Назовем его Штрихкод с типом Строка (длину можно установить 200, так как современные стандарты EAN-13 или GS1 DataBar требуют достаточного запаса). После добавления реквизита перетащите его на форму в элементы табличной части, чтобы колонка стала видимой для пользователя.

Шаг 2: Реализация оптимального запроса

Вместо того чтобы искать штрихкод для каждой строки по отдельности, мы соберем всю номенклатуру из документа в один массив и выполним один запрос к регистру. Рассмотрим пример кода, который эффективно решает эту задачу.

Для начала мы собираем массив номенклатуры и передаем его в запрос. Используем ВЫБРАТЬ РАЗЛИЧНЫЕ, чтобы избежать дублей, если для одной номенклатуры в регистре заведено несколько штрихкодов.


Процедура ЗаполнитьШтрихкодыВТабличнойЧасти()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ РАЗЛИЧНЫЕ
        |	ШтрихкодыНоменклатуры.Номенклатура КАК Номенклатура,
        |	ШтрихкодыНоменклатуры.Штрихкод КАК Штрихкод
        |ИЗ
        |	РегистрСведений.ШтрихкодыНоменклатуры КАК ШтрихкодыНоменклатуры
        |ГДЕ
        |	ШтрихкодыНоменклатуры.Номенклатура В(&МассивНом)";

    // Формируем массив номенклатуры из ТЧ
    МассивНом = Объект.Товары.ВыгрузитьКолонку("Номенклатура");
    Запрос.УстановитьПараметр("МассивНом", МассивНом);

    Выборка = Запрос.Выполнить().Выбрать();

    // Создаем структуру для поиска строк в табличной части
    СтруктураПоиска = Новый Структура("Номенклатура");

    Пока Выборка.Следующий() Цикл
        СтруктураПоиска.Номенклатура = Выборка.Номенклатура;
        // Находим все строки, соответствующие данной номенклатуре
        МассивСтрокТЧ = Объект.Товары.НайтиСтроки(СтруктураПоиска);
        
        Для Каждого СтрокаТЧ Из МассивСтрокТЧ Цикл
            СтрокаТЧ.Штрихкод = Выборка.Штрихкод;
        КонецЦикла;
    КонецЦикла;
КонецПроцедуры

Шаг 3: Альтернативный подход через Соответствие (Map)

Если табличная часть документа очень большая, метод НайтиСтроки может работать медленно, так как он перебирает всю таблицу для каждой номенклатуры. Более профессиональный подход — использование объекта Соответствие. Это позволит нам работать с данными практически мгновенно.


Процедура ЗаполнитьШтрихкодыЧерезСоответствие()
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ 
        |	Ш.Номенклатура КАК Номенклатура,
        |	МАКСИМУМ(Ш.Штрихкод) КАК Штрихкод
        |ИЗ
        |	РегистрСведений.ШтрихкодыНоменклатуры КАК Ш
        |ГДЕ
        |	Ш.Номенклатура В(&МассивНом)
        |СГРУППИРОВАТЬ ПО Ш.Номенклатура";

    Запрос.УстановитьПараметр("МассивНом", Объект.Товары.ВыгрузитьКолонку("Номенклатура"));
    Выборка = Запрос.Выполнить().Выбрать();

    СоответствиеШК = Новый Соответствие;
    Пока Выборка.Следующий() Цикл
        СоответствиеШК.Вставить(Выборка.Номенклатура, Выборка.Штрихкод);
    КонецЦикла;

    // Заполняем ТЧ одним проходом
    Для Каждого Стр Из Объект.Товары Цикл
        Стр.Штрихкод = СоответствиеШК.Получить(Стр.Номенклатура);
    КонецЦикла;
КонецПроцедуры

Важные рекомендации по доработке

Используя эти методы, вы обеспечите стабильную работу документа даже при большом количестве номенклатурных позиций. Пробуйте, внедряйте и не забывайте тестировать производительность на реальных объемах данных! Если требуется готовое решение без ручной разработки, можно воспользоваться расширением для вывода штрихкодов в табличные части документов.

← На главную