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