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

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

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

Как получить значение строки табличной части, таблицы значений и строки запроса в 1С. Примеры кода на встроенном языке, типичные ошибки и проверка результата.

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

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

Как получить строку табличной части документа или справочника

Табличная часть — это коллекция строк, и обратиться к конкретной строке можно по индексу. Индексация начинается с нуля: первая строка имеет индекс 0, последняя — Количество() - 1. Прежде чем обращаться по индексу, убедитесь, что табличная часть не пуста, иначе получите ошибку времени выполнения.

Если Объект.Товары.Количество() > 0 Тогда

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

Сообщить("Номенклатура первой строки: " + ПерваяСтрока.Номенклатура);

КонецЕсли;

Чаще требуется не одна строка, а обход всех. Для этого используется цикл Для Каждого, который безопасен при пустой коллекции — он просто не выполнится ни разу:

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

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

Строка.Сумма = СуммаСтроки;

КонецЦикла;

Если нужно найти строку по условию, используйте метод Найти() для поиска одной строки или НайтиСтроки() для получения массива всех подходящих строк. Важно: Найти() возвращает Неопределено, если совпадений нет, — это значение нужно проверять перед обращением к полям.

Как получить текущую строку на форме

Когда пользователь работает с табличным полем на форме, часто нужно узнать, какая строка сейчас выделена. Для этого у элемента формы есть свойство ТекущаяСтрока, а у данных формы — методы получения строки по идентификатору. В управляемых формах ТекущаяСтрока возвращает не саму строку, а её идентификатор, поэтому прямое обращение к полям через него не сработает.

&НаКлиенте

Процедура ТоварыПриАктивизацииСтроки(Элемент)

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

Если ТекущиеДанные <> Неопределено Тогда

Сообщить("Выбрана: " + ТекущиеДанные.Номенклатура);

КонецЕсли;

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

Свойство ТекущиеДанные возвращает объект с полями строки — это самый удобный способ чтения значений выделенной строки на клиенте. Если строк не выбрано (например, таблица пуста), свойство равно Неопределено, и обращение к полям без проверки вызовет ошибку.

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

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

ТЗ = Новый ТаблицаЗначений;

// ... заполнение таблицы ...

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

Строка = ТЗ[Индекс];

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

КонецЦикла;

Для поиска по нескольким условиям передайте в НайтиСтроки() структуру с парами «имя колонки — значение». Метод вернёт массив строк, даже если найдена всего одна. Также полезен метод Итог(), если нужна не строка, а суммарное значение по колонке.

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

Запрос возвращает результат, который обрабатывается двумя способами: через выборку (последовательный обход) или через выгрузку в таблицу значений. Выборка экономичнее по памяти для больших результатов, выгрузка удобнее, если нужен многократный обход или индексный доступ.

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ

| Номенклатура.Ссылка КАК Ссылка,

| Номенклатура.Наименование КАК Наименование

|ИЗ

| Справочник.Номенклатура КАК Номенклатура

|ГДЕ

| НЕ Номенклатура.ПометкаУдаления";

Результат = Запрос.Выполнить();

Если Не Результат.Пустой() Тогда

Выборка = Результат.Выбрать();

Пока Выборка.Следующий() Цикл

Сообщить(Выборка.Наименование);

КонецЦикла;

КонецЕсли;

Обращение к полям выборки идёт по имени, указанному в тексте запроса (или по псевдониму после КАК). Если запросить несуществующее поле, получите ошибку «Поле не найдено». Перед обходом полезно проверять Результат.Пустой(), чтобы не выполнять лишних действий при пустом результате.

Сравнение вариантов

Выборка (Результат.Выбрать())

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

Выгрузка в ТЗ (Результат.Выгрузить())

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

Обход коллекции напрямую

Подходит для табличных частей и уже загруженных таблиц значений. Ограничение: данные должны быть уже получены из базы.

Как получить значение конкретной ячейки и работать с типами

Чтобы получить значение отдельной ячейки, сначала получите строку, затем обратитесь к полю через точку: Строка.Цена. Если имя поля хранится в переменной (например, приходит как параметр), используйте обращение через квадратные скобки со строковым именем: Строка[ИмяПоля]. Это работает для строк табличных частей, таблиц значений и выборок.

ИмяКолонки = "Количество";

ЗначениеЯчейки = Строка[ИмяКолонки];

Учитывайте типы данных: ссылочные поля содержат ссылку, а не строковое представление. Чтобы получить реквизит ссылки, обращайтесь «через точку» (Строка.Номенклатура.Артикул), но помните — каждое такое обращение на сервере может порождать отдельное обращение к базе. В циклах по большому числу строк это заметно замедляет код; в таких случаях лучше получать нужные поля сразу запросом.

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

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

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

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

Порядок действий
  1. 1
    Определите, откуда нужна строка: табличная часть, таблица значений, запрос или форма.
  2. 2
    Проверьте, что коллекция не пуста: Количество() > 0 или Результат.Пустой() = Ложь.
  3. 3
    Получите строку по индексу, в цикле или через Найти()/НайтиСтроки() с проверкой на Неопределено.
  4. 4
    Обратитесь к нужному полю через точку или через Строка[ИмяПоля].
  5. 5
    Проверьте результат через Сообщить() или отладчик, сравнив с ожидаемым значением.

Частые вопросы

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

У строки табличной части есть свойство НомерСтроки — оно возвращает порядковый номер, начиная с 1. В цикле Для Каждого Строка Из ТабличнаяЧасть Цикл обращайтесь к Строка.НомерСтроки. Для таблицы значений такого свойства нет — номер придётся считать вручную через переменную-счётчик или индекс.

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

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

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

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

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

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

Почему при обращении к полю строки возникает «Поле объекта не обнаружено»?

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

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

Да: обратитесь по индексу ТабличнаяЧасть[Номер - 1], поскольку пользовательские номера строк начинаются с 1, а индексы — с 0. Перед обращением убедитесь, что номер находится в диапазоне от 1 до Количество().

Итог

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

Строку получают по индексу, в цикле или поиском; поля читают через точку или Строка[Имя]. Всегда проверяйте пустоту коллекции и результат Найти() на Неопределено. На форме различайте ТекущаяСтрока (идентификатор) и ТекущиеДанные (значения). Для больших объёмов предпочитайте запрос с нужными полями, а не обращения через точку в цикле.