Разработка и Конфигурация · 10 мин
Как выбрать строку в таблице значений 1С
Как выбрать строку в таблице значений 1С: Найти, НайтиСтроки, перебор в цикле, индекс строки. Примеры кода, проверка результата и типичные ошибки разработчиков.
Таблица значений в 1С — один из самых используемых объектов: в неё загружаются результаты запросов, данные документов, списки для обработки. Почти любая задача сводится к тому, чтобы найти нужную строку по условию и прочитать или изменить её значения. Платформа предлагает несколько способов: методы Найти(), НайтиСтроки(), прямой перебор в цикле и обращение по индексу.
Выбор способа влияет и на скорость, и на надёжность кода. Ошибка в логике поиска приводит к тому, что программа работает с неправильной строкой или вообще с пустым значением, а это уже риск порчи данных в учёте. Поэтому важно не только знать синтаксис, но и понимать, что возвращает каждый метод и как проверить результат.
Ниже разобраны основные приёмы выбора строки, условия их применения, способы проверки результата и типичные ошибки, которые допускают даже опытные разработчики.
Как устроена таблица значений и что такое строка
Таблица значений — это объект встроенного языка, состоящий из колонок и строк. Каждая строка имеет тип СтрокаТаблицыЗначений, и к её данным обращаются по имени колонки: Строка.Номенклатура, Строка.Количество. Строки пронумерованы индексами от нуля, общее количество возвращает метод Количество().
Важно понимать: строка таблицы значений — это ссылочная структура внутри самой таблицы. Если вы получили строку и изменили её поле, изменится и сама таблица. Отдельно копировать строку не нужно — но и удаление строки из таблицы сделает сохранённую ссылку на неё бесполезной.
Выбор одной строки методом Найти()
Метод Найти(Значение, Колонки) ищет первую строку, где в указанной колонке (или колонках) находится искомое значение. Если совпадений нет, метод возвращает Неопределено — это ключевой момент, который нужно обрабатывать всегда.
СтрокаТовара = ТаблицаТоваров.Найти(ИскомыйАртикул, "Артикул");
Если СтрокаТовара = Неопределено Тогда
Сообщить("Товар с артикулом " + ИскомыйАртикул + " не найден");
Иначе
Цена = СтрокаТовара.Цена;
КонецЕсли;
Второй параметр может содержать список колонок через запятую, например "Артикул, Склад". Тогда поиск идёт по всем перечисленным колонкам, и вернётся первая строка, где значение найдено хотя бы в одной из них. Если нужно совпадение по нескольким колонкам одновременно, используйте НайтиСтроки() со структурой отбора.
Помните о типах данных: поиск сравнивает значения строго. Если в колонке хранится число, а вы ищете строку "123", совпадения не будет. То же касается ссылок разных видов документов и значений NULL из запросов.
Выбор нескольких строк методом НайтиСтроки()
Когда условию может соответствовать несколько строк, применяется НайтиСтроки(ПараметрыОтбора). Параметр — структура, где ключи это имена колонок, а значения — искомые данные. Метод возвращает массив строк, возможно пустой.
Отбор = Новый Структура;
Отбор.Вставить("Склад", ВыбранныйСклад);
Отбор.Вставить("Отгружено", Ложь);
НайденныеСтроки = ТаблицаТоваров.НайтиСтроки(Отбор);
Для Каждого Строка Из НайденныеСтроки Цикл
Строка.Количество = 0;
КонецЦикла;
Отбор по структуре работает как логическое «И»: строка попадёт в результат, только если совпадут все указанные колонки. Это удобно для точной фильтрации, но не позволяет задать условия вида «больше», «меньше», «содержит» — для таких случаев нужен перебор в цикле или запрос.
Перебор строк в цикле с условием
Цикл Для Каждого — универсальный способ, когда условие выбора сложнее простого равенства: сравнение по диапазону, проверка нескольких полей с «ИЛИ», поиск подстроки. Внутри цикла доступна каждая строка, и условие проверяется произвольным выражением.
Для Каждого Строка Из ТаблицаТоваров Цикл
Если Строка.Цена > 10000 И Строка.Остаток > 0 Тогда
// обработка подходящей строки
КонецЕсли;
КонецЦикла;
Если нужна только первая подходящая строка, после нахождения используйте Прервать — это ускорит обработку больших таблиц. Для удаления строк во время перебора используйте цикл по индексу с конца таблицы к началу, иначе сдвиг индексов приведёт к пропуску строк.
- 1Определите, сколько строк может подойти: одна или несколько
- 2Для одной строки по равенству используйте Найти(), для нескольких — НайтиСтроки() со структурой отбора
- 3Для сложных условий (больше, меньше, ИЛИ) применяйте цикл Для Каждого
- 4Проверьте результат: Неопределено для Найти(), Количество() для массива
- 5Только после проверки обращайтесь к колонкам найденной строки
Обращение к строке по индексу
Если позиция строки известна, обратиться к ней можно напрямую: Строка = ТаблицаТоваров[0] вернёт первую строку. Индексация начинается с нуля, последняя строка имеет индекс Количество() - 1. Обращение за границы диапазона вызывает ошибку выполнения.
Обратная задача — узнать индекс конкретной строки — решается методом Индекс(Строка). Это полезно, когда нужно вставить новую строку перед найденной или после неё через метод Вставить(Индекс).
Прямой доступ по индексу оправдан в циклах с модификацией таблицы и при работе с заранее известной структурой. В остальных случаях поиск по значению читается лучше и устойчивее к изменениям порядка строк.
Сравнение способов выбора строки
| Способ | Когда подходит | Ограничения |
|---|---|---|
| Найти() | Одна строка, отбор по равенству | Только первое совпадение, строгое сравнение типов |
| НайтиСтроки() | Несколько строк, отбор по равенству нескольких колонок | Только условие «И», только равенство |
| Цикл Для Каждого | Сложные условия: диапазоны, ИЛИ, подстроки | Медленнее на больших таблицах, больше кода |
| По индексу | Известна позиция, модификация при переборе | Риск выхода за границы, привязка к порядку строк |
| Запрос к таблице | Сложная фильтрация и сортировка больших данных | Требует помещения таблицы во временную таблицу |
Для больших таблиц с десятками тысяч строк и сложными условиями эффективнее поместить таблицу в запрос как временную и выбрать строки средствами языка запросов. Это особенно актуально при соединениях с другими данными и группировках.
Сравнение вариантов
Быстро и лаконично для отбора по равенству; не подходит для условий «больше», «содержит», «ИЛИ»
Гибкие условия любой сложности; проигрывает по скорости на больших таблицах
Оптимален для сложной фильтрации больших объёмов; требует больше кода и понимания языка запросов
Проверка результата и типичные ошибки
Главное правило безопасной работы: никогда не обращайтесь к колонкам строки, не убедившись, что строка найдена. Обращение Строка.Цена при Строка = Неопределено вызывает ошибку «Поле объекта не обнаружено» и прерывает выполнение кода.
Ещё одна частая проблема — поиск по представлению вместо ссылки. В колонке может храниться ссылка на элемент справочника, а разработчик ищет строку с наименованием. Сравнение ссылки со строкой никогда не даст совпадения. Проверяйте тип данных колонки через ТаблицаТоваров.Колонки.Артикул.ТипЗначения.
Как проверить результат
Возвращена строка, поля доступны
Неопределено — строка не найдена, обращение к полям вызовет ошибку
Массив с Количество() > 0
Пустой массив — условия отбора не выполнены
Тип искомого значения совпадает с типом колонки
Строка ищется в числовой колонке или наоборот — совпадений нет
Частые вопросы
Чем Найти() отличается от НайтиСтроки()?
Найти() возвращает одну строку (первую подходящую) или Неопределено, а НайтиСтроки() — массив всех подходящих строк, который может быть пустым. Найти() ищет по одному значению в указанных колонках, НайтиСтроки() принимает структуру отбора с условиями по нескольким колонкам одновременно.
Что делать, если Найти() не находит строку, хотя она есть в таблице?
Проверьте типы данных: значение в колонке и искомое значение должны совпадать по типу и содержимому. Частые причины — поиск строки в числовой колонке, лишние пробелы в строковых значениях, поиск по наименованию вместо ссылки. Выведите значения через Сообщить() или посмотрите таблицу в отладчике.
Как выбрать строки по условию «больше» или «содержит»?
Методы Найти() и НайтиСтроки() работают только на равенство. Для нестрогих условий используйте цикл Для Каждого с проверкой внутри (например, Строка.Сумма > 1000 или СтрНайти(Строка.Наименование, "текст") > 0) либо поместите таблицу в запрос и используйте язык запросов.
Как удалить найденную строку из таблицы?
Передайте строку в метод Удалить(): ТаблицаТоваров.Удалить(СтрокаТовара). Если удаляете несколько строк в цикле, перебирайте таблицу по индексу от конца к началу или сначала соберите строки в массив через НайтиСтроки(), а затем удаляйте их в отдельном цикле.
Можно ли искать сразу по нескольким колонкам с условием «И»?
Да, для этого предназначен НайтиСтроки() со структурой отбора: каждый элемент структуры задаёт колонку и требуемое значение, и в результат попадут только строки, где совпали все условия. Если нужна ровно одна строка, возьмите первый элемент массива после проверки его количества.
Как узнать номер (индекс) найденной строки?
Используйте метод Индекс(): НомерСтроки = ТаблицаТоваров.Индекс(СтрокаТовара). Метод вернёт позицию строки начиная с нуля. Это полезно для вставки новых строк рядом с найденной или для вывода пользователю понятного номера строки (прибавьте единицу).
Что важно запомнить
Для отбора по равенству используйте Найти() и НайтиСтроки(), для сложных условий — цикл или запрос. Всегда проверяйте результат на Неопределено или пустой массив перед обращением к полям, следите за типами данных в отборе, а удаление строк выполняйте с учётом сдвига индексов.