Часто в процессе автоматизации складских операций, например, при приемке товаров, возникает необходимость визуально отмечать строки, которые были считаны сканером штрих-кода. Внесение изменений в структуру метаданных (добавление новых реквизитов) не всегда оправдано, особенно если данные нужны временно и не подлежат сохранению в базе. Давайте разберем, как реализовать такую задачу программно.
Для решения поставленной задачи мы будем использовать программное добавление колонки в табличную часть формы и создание ТаблицыЗначений для хранения признака сканирования в оперативной памяти. Такой подход позволяет избежать модификации конфигурации и упрощает процесс обновления базы в будущем.
ТаблицаЗначений, где будем фиксировать связь между номенклатурой и фактом сканирования.ПриВыводеСтроки будем проверять наличие записи в таблице и выводить соответствующий индикатор.Для начала нам нужно объявить переменную, которая будет доступна во всех процедурах модуля формы. Сделаем это в самом начале модуля:
Перем ТаблицаЗначенийШКСчитан Экспорт;
Далее, в процедуре ПриОткрытии, мы инициализируем эту таблицу и добавим колонку на форму документа:
Процедура ПриОткрытии()
// Создаем колонки для учета признака сканирования
ТаблицаЗначенийШКСчитан = Новый ТаблицаЗначений;
ТаблицаЗначенийШКСчитан.Колонки.Добавить("КодНоменклатуры");
ТаблицаЗначенийШКСчитан.Колонки.Добавить("ШКСчитан");
// Добавляем колонку в табличное поле Товары
ЭлементыФормы.Товары.Колонки.Добавить("ШКСчитан", "Штрих-код считан");
КонецПроцедуры
Когда сканер считывает штрих-код, система вызывает соответствующую процедуру (обычно это СШКНоменклатура или аналогичная в зависимости от конфигурации). В этот момент нам нужно добавить запись в нашу временную таблицу:
Процедура СШКНоменклатура(Номенклатура)
// Добавляем запись в таблицу значений
Стр = ТаблицаЗначенийШКСчитан.Добавить();
Стр.КодНоменклатуры = Номенклатура.Код;
Стр.ШКСчитан = "ШК";
// Обновляем отображение, чтобы изменения стали видны пользователю
ЭлементыФормы.Товары.ОбновитьСтроки();
КонецПроцедуры
Чтобы пользователь видел, какой именно товар был считан, используем событие ПриВыводеСтроки табличного поля. Это событие срабатывает для каждой отрисовываемой строки и позволяет нам динамически менять оформление:
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
// Ищем товар в нашей таблице по коду
СтрокаТаблицы = ТаблицаЗначенийШКСчитан.Найти(ДанныеСтроки.Номенклатура.Код, "КодНоменклатуры");
Если СтрокаТаблицы <> Неопределено И СтрокаТаблицы.ШКСчитан = "ШК" Тогда
ОформлениеСтроки.Ячейки.ШКСчитан.УстановитьТекст("ШК");
Иначе
ОформлениеСтроки.Ячейки.ШКСчитан.УстановитьТекст("--");
КонецЕсли;
КонецПроцедуры
При использовании данного метода стоит помнить о нескольких нюансах:
ТаблицеЗначений методом Найти может быть медленным. В таких случаях рекомендуем использовать объект Соответствие, где ключом будет уникальный идентификатор строки или ссылка на номенклатуру, а значением — булево (истина/ложь). Это значительно повысит скорость доступа к данным.ОформлениеСтроки.Ячейки.Наименование.ЦветФона для подсветки считанных строк. Это делает интерфейс более интуитивно понятным для складских работников.Этот метод является надежным и «чистым» решением, так как он не затрагивает логику работы с данными документа в базе данных и не требует пересчета итогов или записи изменений в реквизиты объекта.