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

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

В типовой конфигурации «1С:Управление торговлей 10.3», работающей на обычных формах, часто возникает задача визуального контроля наличия штрихкодов непосредственно в списке товаров. Пользователям это необходимо для быстрой проверки заполнения карточек без открытия каждой позиции отдельно. Разберем, как реализовать этот функционал правильно с точки зрения производительности системы.

Анализ задачи и выбор метода реализации

Прежде всего, проанализируем техническую составляющую. В «1С:Предприятии 8» для обычных форм существует два основных события табличного поля, позволяющих выводить расчетные или дополнительные данные в список: ПриВыводеСтроки и ПриПолученииДанных.

Рассмотрим разницу между ними. Событие ПриВыводеСтроки срабатывает для каждой отрисовываемой строки по отдельности. Если мы будем выполнять запрос к регистру сведений Штрихкоды внутри этого обработчика, система выполнит столько запросов к базе данных, сколько строк отображается на экране. Это приведет к значительным «тормозам» при прокрутке списка.

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

Шаг 1. Подготовка формы списка

Для начала нам необходимо подготовить саму форму списка справочника Номенклатура:

  1. Откроем форму списка в конфигураторе.
  2. Найдем основной элемент — ТабличноеПоле (обычно называется Список).
  3. Добавим новую колонку в это табличное поле. Назовем её КолонкаШтрихкод и установим заголовок «Штрихкод».
  4. Важно: Убедимся, что у колонки не заполнено поле Данные, так как мы будем заполнять её программно.

Шаг 2. Настройка обработчика события

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

Рассмотрим пример кода для реализации этой задачи:


Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
    
    // Создаем массив ссылок на номенклатуру, которые сейчас видны в списке
    МассивНоменклатуры = Новый Массив;
    СоответствиеСтрок = Новый Соответствие;
    
    Для Каждого СтрокаОформления Из ОформленияСтрок Цикл
        // Проверяем, что в строке действительно ссылка на справочник
        Если ТипЗнч(СтрокаОформления.ДанныеСтроки.Ссылка) = Тип("СправочникСсылка.Номенклатура") Тогда
            МассивНоменклатуры.Добавить(СтрокаОформления.ДанныеСтроки.Ссылка);
            СоответствиеСтрок.Вставить(СтрокаОформления.ДанныеСтроки.Ссылка, СтрокаОформления);
        КонецЕсли;
    КонецЦикла;
    
    Если МассивНоменклатуры.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;
    
    // Выясним причину выбора запроса: нам нужен только один штрихкод, даже если их много
    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	Штрихкоды.Владелец КАК Номенклатура,
    |	МИНИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
    |ИЗ
    |	РегистрСведений.Штрихкоды КАК Штрихкоды
    |ГДЕ
    |	Штрихкоды.Владелец В(&МассивНоменклатуры)
    |СГРУППИРОВАТЬ ПО
    |	Штрихкоды.Владелец";
    
    Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    // Заполняем колонку данными
    Пока Выборка.Следующий() Цикл
        СтрокаОформления = СоответствиеСтрок.Получить(Выборка.Номенклатура);
        Если СтрокаОформления <> Неопределено Тогда
            СтрокаОформления.Ячейки.КолонкаШтрихкод.УстановитьТекст(Выборка.Штрихкод);
        КонецЕсли;
    КонецЦикла;

КонецПроцедуры

Шаг 3. Оптимизация и обработка нюансов

Проанализируем ситуацию с количеством штрихкодов. В типовой «1С:Управление торговлей 10.3» у одной позиции номенклатуры может быть несколько штрихкодов (например, для разных упаковок или разных типов кодировок). В нашем коде выше мы использовали функцию МИНИМУМ, чтобы гарантированно получить только одну строку на одну позицию товара.

Однако, если бизнес-логика требует вывода штрихкода именно для базовой единицы измерения, запрос следует уточнить. Посмотрим на пример более детального фильтра в запросе:


|ГДЕ
|	Штрихкоды.Владелец В(&МассивНоменклатуры)
|	И Штрихкоды.ЕдиницаИзмерения = Штрихкоды.Владелец.ЕдиницаХраненияОстатков

Такой подход позволит выводить в список именно тот код, который соответствует основной единице измерения товара, что минимизирует путаницу у пользователей.

Альтернативный вариант: Визуальная индикация

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

В том же обработчике ПриПолученииДанных мы можем менять оформление строки. Проанализируем следующий фрагмент кода:


// Вместо вывода текста меняем цвет фона строки, если штрихкод отсутствует
Если Выборка.Штрихкод = "" Тогда
    СтрокаОформления.ЦветФона = Новый Цвет(255, 200, 200); // Светло-красный
КонецЕсли;

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

Важные рекомендации по производительности

Выясним, на что стоит обратить внимание, чтобы форма не зависала:

  1. Индексация: Проверьте в конфигураторе, проиндексировано ли измерение Владелец в регистре сведений Штрихкоды. В типовой конфигурации это так, но если регистр кастомизировался, индекс мог пропасть. Без индекса поиск по массиву будет очень медленным.
  2. Объем данных: Метод ПриПолученииДанных работает быстро, но если в списке одновременно выводится 100 и более строк (например, на 4K мониторе с мелким шрифтом), задержка может стать ощутимой.
  3. Кэширование: В некоторых случаях программисты используют Соответствие для кэширования уже полученных штрихкодов в рамках сеанса, чтобы не запрашивать их повторно для одних и тех же строк при скроллинге вверх-вниз.

Таким образом, мы изучили механизм программного дополнения данных в обычных формах. Использование ПриПолученииДанных вместе с пакетным запросом — это наиболее правильный и профессиональный способ решения подобных задач в «1С:Предприятии 8.3» при работе с классическими интерфейсами.

← На главную