К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как получить строку списка в 1С

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

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

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

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

Как определить, с каким списком вы работаете

Прежде чем писать код, уточните тип объекта. В конфигураторе это можно сделать через отладчик: поставьте точку останова, вычислите выражение и посмотрите тип значения. Типичные варианты: «СписокЗначений», «ТаблицаЗначений», «ТабличнаяЧасть», «ДанныеФормыКоллекция», «ДинамическийСписок».

От типа зависит всё остальное. Например, у динамического списка нельзя напрямую получить строку по индексу — он предназначен для отображения данных запроса, а не для программного обхода. А у табличной части документа строки доступны и по индексу, и поиском.

Получение строки списка значений по индексу

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

Список = Новый СписокЗначений;

Список.Добавить("Первый");

Список.Добавить("Второй");

Элемент = Список.Получить(0); // первый элемент

ЗначениеСтроки = Элемент.Значение; // "Первый"

// Короткий вариант — сразу значение:

ЗначениеСтроки = Список[0].Значение;

Если нужно только значение без обращения к объекту элемента, можно использовать квадратные скобки: Список[Индекс].Значение. Количество элементов возвращает метод Количество() — он нужен, чтобы не выйти за границы списка.

Попытка обратиться к индексу, которого нет в списке, вызовет ошибку «Индекс находится за границами массива». Поэтому перед обращением проверяйте: Если Индекс < Список.Количество() Тогда ... КонецЕсли;.

Поиск строки по значению

Если индекс неизвестен, но известно значение, используйте метод НайтиПоЗначению(). Он вернёт элемент списка или Неопределено, если значение не найдено. Результат поиска всегда нужно проверять перед использованием.

НайденныйЭлемент = Список.НайтиПоЗначению(ИскомоеЗначение);

Если НайденныйЭлемент <> Неопределено Тогда

ИндексСтроки = Список.Индекс(НайденныйЭлемент);

Сообщить("Найдено в строке " + ИндексСтроки);

Иначе

Сообщить("Значение не найдено");

КонецЕсли;

У таблицы значений и табличной части вместо этого применяется метод Найти(Значение, ИмяКолонки), который ищет по конкретной колонке, а метод НайтиСтроки() возвращает массив всех подходящих строк по структуре отбора.

ПараметрыОтбора = Новый Структура("Номенклатура", ИскомаяНоменклатура);

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

Для Каждого Строка Из НайденныеСтроки Цикл

Сообщить(Строка.Количество);

КонецЦикла;

Получение строки табличной части документа

Табличная часть — самый частый случай на практике: товары в накладной, сотрудники в приказе, этапы в заказе. Строки доступны по индексу через квадратные скобки или метод Получить(), а также через перебор в цикле.

// Первая строка табличной части "Товары" документа

ПерваяСтрока = ДокументОбъект.Товары[0];

// Обход всех строк

Для Каждого СтрокаТовара Из ДокументОбъект.Товары Цикл

СуммаСтроки = СтрокаТовара.Количество * СтрокаТовара.Цена;

КонецЦикла;

У строки табличной части есть поле НомерСтроки — это номер, который видит пользователь (начинается с 1), тогда как индекс в коллекции начинается с 0. Путаница между номером строки и индексом — одна из самых распространённых ошибок: чтобы получить строку по её номеру, нужно вычесть единицу: Товары[НомерСтроки - 1].

Текущая строка списка на форме

Когда нужно получить строку, которую пользователь выделил на форме (например, в обработчике нажатия кнопки), используется свойство ТекущиеДанные элемента формы. Для табличной части и таблицы значений это выглядит так:

&НаКлиенте

Процедура ПоказатьСтроку(Команда)

ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;

Если ТекущаяСтрока = Неопределено Тогда

Сообщить("Строка не выбрана");

Возврат;

КонецЕсли;

Сообщить(ТекущаяСтрока.Номенклатура);

КонецПроцедуры

Для динамического списка (например, списка документов) ТекущиеДанные может быть недоступно в некоторых контекстах — тогда используйте Элементы.Список.ТекущаяСтрока, которое вернёт ссылку на объект. По ссылке при необходимости получают объект или данные через запрос.

Порядок действий для получения строки на форме
  1. 1
    Определите имя элемента формы, связанного со списком (например, «Товары»)
  2. 2
    В обработчике обратитесь к Элементы.Товары.ТекущиеДанные
  3. 3
    Проверьте результат на Неопределено — строка может быть не выбрана
  4. 4
    Обратитесь к нужному полю строки по имени колонки
  5. 5
    Для динамического списка используйте ТекущаяСтрока, чтобы получить ссылку

Обход всех строк и работа с выделенными строками

Для обработки всех строк списка применяется цикл Для Каждого ... Из ... Цикл. Если нужно обратиться к строке по позиции, подойдёт классический цикл со счётчиком от 0 до Количество() - 1.

Для Индекс = 0 По Список.Количество() - 1 Цикл

Элемент = Список[Индекс];

// работа с элементом

КонецЦикла;

Если пользователь может выделить несколько строк таблицы на форме, их получают через свойство ВыделенныеСтроки — это массив идентификаторов. Каждый идентификатор преобразуют в данные строки методом НайтиПоИдентификатору() у данных формы.

Для Каждого Идентификатор Из Элементы.Товары.ВыделенныеСтроки Цикл

СтрокаДанных = Объект.Товары.НайтиПоИдентификатору(Идентификатор);

Сообщить(СтрокаДанных.Номенклатура);

КонецЦикла;

Типичные ошибки и как их избежать

Большинство проблем при получении строки списка связано с невнимательностью к типам и границам коллекции. Ниже — ошибки, которые встречаются чаще всего.

Типичные ошибки
01
Обращение по несуществующему индексу — возникает ошибка «Индекс за границами»; всегда сравнивайте индекс с Количество()
02
Смешение номера строки и индекса: НомерСтроки начинается с 1, индекс — с 0; используйте НомерСтроки - 1
03
Вызов НайтиПоЗначению() у таблицы значений — метод есть только у списка значений; для таблицы нужен Найти() или НайтиСтроки()
04
Использование ТекущиеДанные без проверки на Неопределено — если строка не выбрана, обращение к полю вызовет ошибку
05
Попытка получить строку динамического списка по индексу — динамический список не поддерживает произвольный доступ, берите ТекущаяСтрока или используйте запрос

Ещё одна тонкость: при изменении коллекции внутри цикла (например, удалении строк) индексы сдвигаются. Если нужно удалять строки в цикле, обходите коллекцию с конца или собирайте строки для удаления в отдельный массив, а удаляйте после цикла.

Проверка результата

После написания кода убедитесь, что строка получена корректно. Используйте отладчик конфигуратора: вычислите переменную со строкой и проверьте её тип и значения полей.

Контрольные точки

Как проверить результат

Значение переменной после Получить() или Найти()
Норма

Переменная содержит объект строки, поля доступны

Тревожный признак

Неопределено — значение не найдено или индекс неверен

Индекс перед обращением
Норма

Индекс от 0 до Количество()-1

Тревожный признак

Индекс равен или больше Количество() — будет ошибка

ТекущиеДанные на форме
Норма

Содержит данные выбранной строки

Тревожный признак

Неопределено — пользователь не выбрал строку

FAQ

Как получить последнюю строку списка?

Используйте индекс Количество() - 1: например, ПоследняяСтрока = Товары[Товары.Количество() - 1]. Предварительно убедитесь, что коллекция не пуста, иначе получите ошибку обращения по отрицательному индексу.

Чем отличается Найти() от НайтиСтроки()?

Метод Найти() возвращает первую строку, удовлетворяющую условию, или Неопределено. НайтиСтроки() принимает структуру отбора и возвращает массив всех подходящих строк, что удобно, когда совпадений может быть несколько.

Как получить строку динамического списка программно?

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

Почему НайтиПоЗначению() возвращает Неопределено, хотя значение есть?

Чаще всего причина в несовпадении типов: например, ищется строка, а в списке хранится число, или ссылки относятся к разным типам справочников. Проверьте типы значений в отладчике и при необходимости приведите их к одному типу.

Как узнать индекс найденной строки таблицы значений?

Используйте метод Индекс(): Индекс = Таблица.Индекс(НайденнаяСтрока). Для списка значений аналогично — Список.Индекс(Элемент).

Можно ли получить строку списка без цикла, если известно значение колонки?

Да, для таблицы значений и табличной части используйте Найти(Значение, "ИмяКолонки") — цикл не потребуется. Для списка значений достаточно НайтиПоЗначению(Значение).

Итог

Что важно запомнить

Способ получения строки зависит от типа списка: Получить(Индекс) — для списка значений и таблиц, НайтиПоЗначению() — для списка значений, Найти() и НайтиСтроки() — для таблиц и табличных частей, ТекущиеДанные — для выбранной строки на форме. Всегда проверяйте результат на Неопределено и следите за границами индексов.