Как программно изменить состояние флажка в табличном поле при сканировании штрихкода в обычных формах 1С

Программист 1С v8.3 (Обычные формы)
← На главную

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

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

Постановка задачи и выбор архитектуры решения

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

  1. Добавление колонки в источник данных: Если источником данных табличного поля является ТаблицаЗначений, мы можем просто добавить в нее колонку типа Булево. Это самый простой способ, так как 1С автоматически свяжет значение в таблице с визуальным флажком.
  2. Использование вспомогательной коллекции (Соответствие): Если мы не можем или не хотим менять структуру источника данных (например, если используется ДинамическийСписок в старых версиях), мы используем объект Соответствие. В ключе этого объекта хранится идентификатор строки (или сама строка), а в значении — состояние флажка (Истина/Ложь).

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

Шаг 1: Подготовка коллекции для хранения состояний флажков

Для начала нам необходимо определить переменные, в которых будут храниться наши отметки. Использование объекта Соответствие удобно тем, что поиск по ключу в нем происходит очень быстро.


Перем ОтмеченныйПриход;
Перем ОтмеченныйВозврат;

Процедура ПриОткрытии()
    ОтмеченныйПриход = Новый Соответствие;
    ОтмеченныйВозврат = Новый Соответствие;
КонецПроцедуры

Шаг 2: Визуализация флажков через обработчик ПриВыводеСтроки

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

Разберем пример кода, который проверяет наличие текущей строки в нашем Соответствии и устанавливает визуальный флажок:


Процедура ТабПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    // Указываем, что в данной ячейке должен отображаться флажок
    ОформлениеСтроки.Ячейки.ПроверкаПриход.ОтображатьФлажок = Истина;
    
    // Проверяем, есть ли текущая строка в нашей коллекции отмеченных
    Если ОтмеченныйПриход[ДанныеСтроки] = Неопределено Тогда
        // Если в соответствии нет записи — флажок снят
        ОформлениеСтроки.Ячейки.ПроверкаПриход.Флажок = Ложь;
    Иначе
        // Если запись есть — флажок установлен
        ОформлениеСтроки.Ячейки.ПроверкаПриход.Флажок = Истина;
    КонецЕсли;
КонецПроцедуры

Важный момент: Обработчик ПриВыводеСтроки вызывается системой очень часто (при каждом движении мыши, прокрутке или обновлении окна). Поэтому код внутри него должен быть максимально оптимизированным. Использование Соответствия здесь оправдано, так как метод получения значения по ключу работает быстро.

Шаг 3: Обработка ручного изменения флажка пользователем

Чтобы пользователь мог не только сканировать, но и кликать по флажку мышкой, нам нужно реализовать событие ПриИзмененииФлажка. Здесь мы будем инвертировать состояние в нашей коллекции.


Процедура ТабПриИзмененииФлажка(Элемент, Колонка)
    Если Колонка.Имя = "ПроверкаПриход" Тогда
        // Проверяем текущее состояние в коллекции
        Состояние = ОтмеченныйПриход[Элемент.ТекущаяСтрока];
        
        Если Состояние = Неопределено Тогда
            // Если не было — добавляем (ставим галочку)
            ОтмеченныйПриход.Вставить(Элемент.ТекущаяСтрока, Истина);
        Иначе
            // Если было — удаляем (снимаем галочку)
            ОтмеченныйПриход.Удалить(Элемент.ТекущаяСтрока);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Шаг 4: Программная установка флажка при сканировании штрихкода

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

Проанализируем алгоритм действий:

  1. Получаем штрихкод.
  2. Ищем соответствующий документ или строку в таблице данных.
  3. Если строка найдена, добавляем ее в наше Соответствие.
  4. Критически важный шаг: Вызываем обновление строк табличного поля, чтобы 1С заново вызвала ПриВыводеСтроки и отрисовала изменения.

Процедура ОбработкаСканирования(Штрихкод)
    // 1. Поиск строки по штрихкоду (пример логики)
    ТекДокумент = НайтиДокументПоШтрихкоду(Штрихкод);
    Если ТекДокумент = Неопределено Тогда
        Предупреждение("Штрихкод не опознан!");
        Возврат;
    КонецЕсли;

    // 2. Находим строку в таблице на форме
    СтрокаТЗ = Таб.Найти(ТекДокумент, "Ссылка");
    
    Если СтрокаТЗ <> Неопределено Тогда
        // 3. Программно ставим отметку в нашу коллекцию
        ОтмеченныйПриход.Вставить(СтрокаТЗ, Истина);
        
        // 4. Обновляем визуальное отображение
        // Без этого метода пользователь не увидит галочку, пока не прокрутит таблицу
        ЭлементыФормы.Таб.ОбновитьСтроки();
        
        // Опционально: позиционируемся на найденной строке
        ЭлементыФормы.Таб.ТекущаяСтрока = СтрокаТЗ;
    КонецЕсли;
КонецПроцедуры

Почему флажок не обновлялся? Разбор типичных ошибок

Разберем ситуацию, с которой часто сталкиваются начинающие разработчики: код вроде бы написан, данные в Соответствие добавляются, а визуально флажок в таблице не появляется. Выясним основные причины:

1. Отсутствие вызова ОбновитьСтроки() или Обновить(). В обычных формах 1С интерфейс «ленив». Если вы изменили переменную в памяти (ваше Соответствие), табличное поле об этом не знает. Метод ЭлементыФормы.ИмяТаблицы.ОбновитьСтроки() заставляет систему перерисовать видимую область и вызвать обработчики оформления.

2. Использование ТекущихДанных вместо конкретной строки. При сканировании фокус может находиться на другой строке или вообще на другом элементе формы. Если вы используете ЭлементыФормы.Таб.ТекущиеДанные, вы измените флажок для той строки, где стоит курсор, а не для той, которую нашли по штрихкоду. Всегда работайте с результатом метода Найти().

3. Проблемы с типами данных. В Соответствие в качестве ключа нужно передавать именно тот объект, который является строкой в табличном поле. Если табличное поле связано с ТаблицейЗначений, то ключом должна быть СтрокаТаблицыЗначений. Если вы передадите просто ссылку на документ, а в таблице лежат строки ТЗ, поиск в обработчике ПриВыводеСтроки не сработает.

Оптимизация: использование ПриПолученииДанных

Если в вашей таблице тысячи строк, постоянный вызов ПриВыводеСтроки может замедлить работу интерфейса. Проанализируем более профессиональный подход — использование события ПриПолученииДанных.

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


Процедура ТабПриПолученииДанных(Элемент, ОформленияСтрок)
    Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
        ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
        ОформлениеСтроки.Ячейки.ПроверкаПриход.ОтображатьФлажок = Истина;
        
        // Оптимизированная проверка
        Если ОтмеченныйПриход[ДанныеСтроки] <> Неопределено Тогда
            ОформлениеСтроки.Ячейки.ПроверкаПриход.Флажок = Истина;
        Иначе
            ОформлениеСтроки.Ячейки.ПроверкаПриход.Флажок = Ложь;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Заключение

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

Подведем итог: для успешной реализации нужно создать коллекцию для хранения состояний (Соответствие), связать её с визуальным оформлением в событии ПриВыводеСтроки и не забывать принудительно обновлять форму методом ОбновитьСтроки() после каждого программного изменения данных. Это обеспечит быструю и корректную работу интерфейса вашего решения.

← На главную