В типовой конфигурации «1С:Управление торговлей 10.3», работающей на обычных формах, часто возникает задача визуального контроля наличия штрихкодов непосредственно в списке товаров. Пользователям это необходимо для быстрой проверки заполнения карточек без открытия каждой позиции отдельно. Разберем, как реализовать этот функционал правильно с точки зрения производительности системы.
Прежде всего, проанализируем техническую составляющую. В «1С:Предприятии 8» для обычных форм существует два основных события табличного поля, позволяющих выводить расчетные или дополнительные данные в список: ПриВыводеСтроки и ПриПолученииДанных.
Рассмотрим разницу между ними. Событие ПриВыводеСтроки срабатывает для каждой отрисовываемой строки по отдельности. Если мы будем выполнять запрос к регистру сведений Штрихкоды внутри этого обработчика, система выполнит столько запросов к базе данных, сколько строк отображается на экране. Это приведет к значительным «тормозам» при прокрутке списка.
Поэтому мы выберем метод ПриПолученииДанных. Этот обработчик срабатывает один раз для всего пакета строк, которые система подготовила к выводу на экран. Это позволяет нам выполнить один-единственный запрос, получить данные сразу для всех видимых товаров и быстро распределить их по ячейкам.
Для начала нам необходимо подготовить саму форму списка справочника Номенклатура:
ТабличноеПоле (обычно называется Список).КолонкаШтрихкод и установим заголовок «Штрихкод».Данные, так как мы будем заполнять её программно.Теперь перейдем в свойства табличного поля и найдем событие ПриПолученииДанных. Создадим процедуру-обработчик в модуле формы. Проанализируем структуру кода, который нам предстоит написать. Нам нужно собрать все ссылки на номенклатуру, отображаемые на экране, получить для них штрихкоды и вывести в нашу новую колонку.
Рассмотрим пример кода для реализации этой задачи:
Процедура СписокПриПолученииДанных(Элемент, ОформленияСтрок)
// Создаем массив ссылок на номенклатуру, которые сейчас видны в списке
МассивНоменклатуры = Новый Массив;
СоответствиеСтрок = Новый Соответствие;
Для Каждого СтрокаОформления Из ОформленияСтрок Цикл
// Проверяем, что в строке действительно ссылка на справочник
Если ТипЗнч(СтрокаОформления.ДанныеСтроки.Ссылка) = Тип("СправочникСсылка.Номенклатура") Тогда
МассивНоменклатуры.Добавить(СтрокаОформления.ДанныеСтроки.Ссылка);
СоответствиеСтрок.Вставить(СтрокаОформления.ДанныеСтроки.Ссылка, СтрокаОформления);
КонецЕсли;
КонецЦикла;
Если МассивНоменклатуры.Количество() = 0 Тогда
Возврат;
КонецЕсли;
// Выясним причину выбора запроса: нам нужен только один штрихкод, даже если их много
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Штрихкоды.Владелец КАК Номенклатура,
| МИНИМУМ(Штрихкоды.Штрихкод) КАК Штрихкод
|ИЗ
| РегистрСведений.Штрихкоды КАК Штрихкоды
|ГДЕ
| Штрихкоды.Владелец В(&МассивНоменклатуры)
|СГРУППИРОВАТЬ ПО
| Штрихкоды.Владелец";
Запрос.УстановитьПараметр("МассивНоменклатуры", МассивНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
// Заполняем колонку данными
Пока Выборка.Следующий() Цикл
СтрокаОформления = СоответствиеСтрок.Получить(Выборка.Номенклатура);
Если СтрокаОформления <> Неопределено Тогда
СтрокаОформления.Ячейки.КолонкаШтрихкод.УстановитьТекст(Выборка.Штрихкод);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Проанализируем ситуацию с количеством штрихкодов. В типовой «1С:Управление торговлей 10.3» у одной позиции номенклатуры может быть несколько штрихкодов (например, для разных упаковок или разных типов кодировок). В нашем коде выше мы использовали функцию МИНИМУМ, чтобы гарантированно получить только одну строку на одну позицию товара.
Однако, если бизнес-логика требует вывода штрихкода именно для базовой единицы измерения, запрос следует уточнить. Посмотрим на пример более детального фильтра в запросе:
|ГДЕ
| Штрихкоды.Владелец В(&МассивНоменклатуры)
| И Штрихкоды.ЕдиницаИзмерения = Штрихкоды.Владелец.ЕдиницаХраненияОстатков
Такой подход позволит выводить в список именно тот код, который соответствует основной единице измерения товара, что минимизирует путаницу у пользователей.
Разберем ситуацию, описанную в обсуждении: если пользователям нужно просто «видеть, где есть штрих, а где нет», то выводить длинную строку цифр может быть не самым удобным вариантом. Вместо этого можно применить цветовое выделение.
В том же обработчике ПриПолученииДанных мы можем менять оформление строки. Проанализируем следующий фрагмент кода:
// Вместо вывода текста меняем цвет фона строки, если штрихкод отсутствует
Если Выборка.Штрихкод = "" Тогда
СтрокаОформления.ЦветФона = Новый Цвет(255, 200, 200); // Светло-красный
КонецЕсли;
Это позволит менеджеру мгновенно замечать «пробелы» в данных при пролистывании каталога, не вчитываясь в цифры штрихкода.
Выясним, на что стоит обратить внимание, чтобы форма не зависала:
Владелец в регистре сведений Штрихкоды. В типовой конфигурации это так, но если регистр кастомизировался, индекс мог пропасть. Без индекса поиск по массиву будет очень медленным.ПриПолученииДанных работает быстро, но если в списке одновременно выводится 100 и более строк (например, на 4K мониторе с мелким шрифтом), задержка может стать ощутимой.Соответствие для кэширования уже полученных штрихкодов в рамках сеанса, чтобы не запрашивать их повторно для одних и тех же строк при скроллинге вверх-вниз.Таким образом, мы изучили механизм программного дополнения данных в обычных формах. Использование ПриПолученииДанных вместе с пакетным запросом — это наиболее правильный и профессиональный способ решения подобных задач в «1С:Предприятии 8.3» при работе с классическими интерфейсами.