Как найти и выделить значение в табличной части 1С: пошаговое руководство

Программист
← На главную

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

Метод 1: Использование функции НайтиСтроки

Одним из самых эффективных и быстрых способов поиска является использование метода НайтиСтроки. Этот метод доступен для объектов типа ТабличнаяЧасть и ТаблицаЗначений. Рассмотрим ситуацию, когда нам нужно найти строку по точному совпадению штрихкода.

Проанализируем программный код, который позволяет это сделать:


// Подготовим структуру поиска
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Штрихкод", ИскомыйШтрихкод);

// Выполняем поиск
НайденныеСтроки = Товары.НайтиСтроки(ПараметрыОтбора);

// Проверяем результат
Если НайденныеСтроки.Количество() > 0 Тогда
    // Мы нашли как минимум одну строку. Обращаемся к первой найденной.
    НайденнаяСтрока = НайденныеСтроки[0];
    Сообщить("Товар найден: " + НайденнаяСтрока.Номенклатура);
Иначе
    Сообщить("Штрихкод не найден в табличной части!");
КонецЕсли;

Важно помнить, что метод НайтиСтроки всегда возвращает массив, даже если найдено всего одно совпадение. Поэтому всегда необходимо проверять Количество() элементов в массиве перед тем, как обращаться к индексу [0], иначе программа может аварийно завершиться при отсутствии данных.

Метод 2: Поиск через НайтиСтрокуТабЧасти

В некоторых типовых конфигурациях или при использовании специфических библиотек программисты применяют метод НайтиСтрокуТабЧасти. Этот метод часто является надстройкой над стандартными функциями и возвращает саму строку или Неопределено. Разберем пример реализации из практики:


Отбор = Новый Структура;
Отбор.Вставить("Штрихкод", РезультатПоиска);

СтрокаТабЧасти = ОбработкаТабличныхЧастей.НайтиСтрокуТабЧасти(Товары, Отбор);

Если СтрокаТабЧасти <> Неопределено Тогда
    // Выполняем действия с найденной строкой
    СтрокаТабЧасти.Проверка = Истина;
    Сообщить("Данные успешно обновлены для товара: " + СтрокаТабЧасти.Номенклатура);
КонецЕсли;

Этот подход удобен тем, что нам не нужно работать с массивом результатов — мы сразу получаем объект строки или понимаем, что поиск не удался.

Фокусировка: как сделать найденную строку видимой

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

Для обычных форм:

Используется свойство ТекущаяСтрока элемента управления:

ЭлементыФормы.Товары.ТекущаяСтрока = НайденнаяСтрока;

Для управляемых форм:

Здесь работа идет через идентификатор строки. Нам нужно получить уникальный номер строки и передать его в элементы формы:


// Получаем идентификатор найденной строки
ИдентификаторСтроки = НайденнаяСтрока.ПолучитьИдентификатор();
// Устанавливаем фокус
Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;

Визуальное выделение: изменение цвета фона

Часто пользователи просят не просто найти строку, но и «подсветить» её цветом. Рассмотрим, как реализовать это максимально правильно.

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

  1. Переходим в свойства формы, закладка «Условное оформление».
  2. Добавляем новый элемент.
  3. В «Оформлении» выбираем нужный «Цвет фона».
  4. В «Условии» указываем, что поле Штрихкод должно быть равно нашему искомому значению (переменной или скрытому реквизиту формы).
  5. В «Оформляемых полях» выбираем всю строку или конкретную колонку.

В обычных формах используется событие ПриВыводеСтроки. Проанализируем пример кода:


Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
    Если ДанныеСтроки.Штрихкод = ИскомыйШтрихкод Тогда
        ОформлениеСтроки.ЦветФона = Новый Цвет(255, 230, 230); // Светло-красный
    КонецЕсли;
КонецПроцедуры

Почему поиск может не работать? Нюансы типов данных

Выясним причину, по которой код может выдавать «Строка не найдена», хотя визуально данные в таблице есть. Основная проблема — несоответствие типов.

Ведущие нули: Штрихкоды часто хранятся как строки. Если в базе записано «000123», а поиск идет по числу 123, 1С никогда не сопоставит эти значения. Всегда используйте функции приведения типов и удаления пробелов:

ИскомоеЗначение = СокрЛП(Строка(ЭлементыФормы.ПолеПоиска.Значение));

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

Оптимизация: Индексация и сложные случаи

Если ваша табличная часть содержит тысячи строк и поиск выполняется часто (например, на складе при приемке товара), скорость работы методов НайтиСтроки может снизиться. Чтобы этого избежать, рекомендуется включить **Индексацию** для соответствующей колонки в конфигураторе. Это позволит платформе построить внутреннюю карту значений и находить их практически мгновенно.

Для поиска по частичному совпадению (например, по последним 4 цифрам штрихкода) стандартный метод НайтиСтроки не подойдет. В этом случае нам придется использовать перебор:


Для Каждого СтрокаТЧ Из Товары Цикл
    Если Найти(СтрокаТЧ.Штрихкод, ЧастьШтрихкода) > 0 Тогда
        // Строка найдена по вхождению подстроки
        Элементы.Товары.ТекущаяСтрока = СтрокаТЧ.ПолучитьИдентификатор();
        Прервать;
    КонецЕсли;
КонецЦикла;

Этот метод более гибкий, но работает медленнее на больших объемах данных, чем прямые методы поиска по индексу.

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

← На главную