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