В процессе разработки в среде 1С:Предприятие одной из наиболее часто встречающихся задач является поиск конкретной строки в табличной части документа или обработки. Типичный сценарий — сканирование штрихкода, после которого программа должна мгновенно найти соответствующий товар в списке, сфокусироваться на нем и, возможно, выделить его цветом. В этой статье мы подробно разберем, как реализовать этот функционал, проанализируем различные методы поиска и выясним, как избежать типичных ошибок программиста.
Одним из самых эффективных и быстрых способов поиска является использование метода НайтиСтроки. Этот метод доступен для объектов типа ТабличнаяЧасть и ТаблицаЗначений. Рассмотрим ситуацию, когда нам нужно найти строку по точному совпадению штрихкода.
Проанализируем программный код, который позволяет это сделать:
// Подготовим структуру поиска
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Штрихкод", ИскомыйШтрихкод);
// Выполняем поиск
НайденныеСтроки = Товары.НайтиСтроки(ПараметрыОтбора);
// Проверяем результат
Если НайденныеСтроки.Количество() > 0 Тогда
// Мы нашли как минимум одну строку. Обращаемся к первой найденной.
НайденнаяСтрока = НайденныеСтроки[0];
Сообщить("Товар найден: " + НайденнаяСтрока.Номенклатура);
Иначе
Сообщить("Штрихкод не найден в табличной части!");
КонецЕсли;
Важно помнить, что метод НайтиСтроки всегда возвращает массив, даже если найдено всего одно совпадение. Поэтому всегда необходимо проверять Количество() элементов в массиве перед тем, как обращаться к индексу [0], иначе программа может аварийно завершиться при отсутствии данных.
В некоторых типовых конфигурациях или при использовании специфических библиотек программисты применяют метод НайтиСтрокуТабЧасти. Этот метод часто является надстройкой над стандартными функциями и возвращает саму строку или Неопределено. Разберем пример реализации из практики:
Отбор = Новый Структура;
Отбор.Вставить("Штрихкод", РезультатПоиска);
СтрокаТабЧасти = ОбработкаТабличныхЧастей.НайтиСтрокуТабЧасти(Товары, Отбор);
Если СтрокаТабЧасти <> Неопределено Тогда
// Выполняем действия с найденной строкой
СтрокаТабЧасти.Проверка = Истина;
Сообщить("Данные успешно обновлены для товара: " + СтрокаТабЧасти.Номенклатура);
КонецЕсли;
Этот подход удобен тем, что нам не нужно работать с массивом результатов — мы сразу получаем объект строки или понимаем, что поиск не удался.
Представим ситуацию: в вашей табличной части 500 строк, поиск отработал успешно, но пользователь ничего не увидел, так как найденная строка находится в самом низу списка. Для комфортной работы нам необходимо программно «прокрутить» таблицу к найденному значению. Разберем, как это сделать для разных типов форм.
Для обычных форм:
Используется свойство ТекущаяСтрока элемента управления:
ЭлементыФормы.Товары.ТекущаяСтрока = НайденнаяСтрока;
Для управляемых форм:
Здесь работа идет через идентификатор строки. Нам нужно получить уникальный номер строки и передать его в элементы формы:
// Получаем идентификатор найденной строки
ИдентификаторСтроки = НайденнаяСтрока.ПолучитьИдентификатор();
// Устанавливаем фокус
Элементы.Товары.ТекущаяСтрока = ИдентификаторСтроки;
Часто пользователи просят не просто найти строку, но и «подсветить» её цветом. Рассмотрим, как реализовать это максимально правильно.
В управляемых формах лучшим решением является Условное оформление. Вместо того чтобы перебирать строки в коде, мы создаем правило на уровне формы:
Штрихкод должно быть равно нашему искомому значению (переменной или скрытому реквизиту формы).В обычных формах используется событие ПриВыводеСтроки. Проанализируем пример кода:
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Если ДанныеСтроки.Штрихкод = ИскомыйШтрихкод Тогда
ОформлениеСтроки.ЦветФона = Новый Цвет(255, 230, 230); // Светло-красный
КонецЕсли;
КонецПроцедуры
Выясним причину, по которой код может выдавать «Строка не найдена», хотя визуально данные в таблице есть. Основная проблема — несоответствие типов.
Ведущие нули: Штрихкоды часто хранятся как строки. Если в базе записано «000123», а поиск идет по числу 123, 1С никогда не сопоставит эти значения. Всегда используйте функции приведения типов и удаления пробелов:
ИскомоеЗначение = СокрЛП(Строка(ЭлементыФормы.ПолеПоиска.Значение));
Регистр букв: Если поиск идет по текстовому наименованию, используйте функцию ВРег() (в верхний регистр), чтобы избежать проблем с разным написанием (например, «товар» и «Товар»).
Если ваша табличная часть содержит тысячи строк и поиск выполняется часто (например, на складе при приемке товара), скорость работы методов НайтиСтроки может снизиться. Чтобы этого избежать, рекомендуется включить **Индексацию** для соответствующей колонки в конфигураторе. Это позволит платформе построить внутреннюю карту значений и находить их практически мгновенно.
Для поиска по частичному совпадению (например, по последним 4 цифрам штрихкода) стандартный метод НайтиСтроки не подойдет. В этом случае нам придется использовать перебор:
Для Каждого СтрокаТЧ Из Товары Цикл
Если Найти(СтрокаТЧ.Штрихкод, ЧастьШтрихкода) > 0 Тогда
// Строка найдена по вхождению подстроки
Элементы.Товары.ТекущаяСтрока = СтрокаТЧ.ПолучитьИдентификатор();
Прервать;
КонецЕсли;
КонецЦикла;
Этот метод более гибкий, но работает медленнее на больших объемах данных, чем прямые методы поиска по индексу.
Подведем итог: Для эффективной работы с поиском в 1С всегда проверяйте типы данных, используйте штатный метод НайтиСтроки и не забывайте про визуальную обратную связь для пользователя через фокусировку или условное оформление.