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

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

Как обратиться к столбцу в 1С: практическое руководство

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

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

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

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

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

Табличная часть — это коллекция строк, встроенная в объект (документ, справочник). Чтобы прочитать или изменить значение столбца, нужно перебрать строки циклом или взять конкретную строку по индексу. Обращение к колонке выполняется через точку по её имени, заданному в конфигураторе.

// Перебор всех строк табличной части "Товары"

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

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

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

КонецЦикла;

// Обращение к первой строке по индексу (нумерация с нуля)

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

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

Сообщить(ПерваяСтрока.Цена);

КонецЕсли;

Имя колонки должно точно совпадать с именем реквизита табличной части в конфигураторе, включая регистр букв не имеет значения, но написание — критично. Если реквизита нет, при обращении возникнет ошибка «Поле объекта не обнаружено».

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

Таблица значений — универсальная структура для промежуточного хранения данных в памяти. Прежде чем обращаться к столбцу, его нужно добавить в коллекцию Колонки, иначе обращение вызовет ошибку. Чтение и запись выполняются так же, через точку от строки.

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

ТЗ.Колонки.Добавить("Номенклатура");

ТЗ.Колонки.Добавить("Количество");

НоваяСтрока = ТЗ.Добавить();

НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду("000001");

НоваяСтрока.Количество = 5;

// Итог по столбцу без цикла

ВсегоКоличество = ТЗ.Итог("Количество");

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

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

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

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

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

"ВЫБРАТЬ

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

| Товары.Количество КАК Количество

|ИЗ

| Документ.РеализацияТоваровУслуг.Товары КАК Товары

|ГДЕ

| Товары.Ссылка = &Ссылка";

Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);

Выборка = Запрос.Выполнить().Выбрать();

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

Сообщить(Выборка.Товар); // обращение по псевдониму КАК

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

КонецЦикла;

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

bsl
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    ЗначениеКолонки = Выборка.ИмяПоля;
КонецЦикла;

Обращение к столбцу по имени через строковую переменную

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

ИмяКолонки = "Сумма";

Значение = СтрокаТаблицы[ИмяКолонки]; // чтение

СтрокаТаблицы[ИмяКолонки] = 1000; // запись

// Проверка существования колонки в таблице значений

Если ТЗ.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда

Значение = ТЗ[0][ИмяКолонки];

КонецЕсли;

Для таблицы значений существование колонки проверяется через Колонки.Найти(). Для табличной части объекта прямой проверки нет — имя реквизита можно получить только через метаданные: Объект.Метаданные().ТабличныеЧасти.Товары.Реквизиты.Найти(ИмяКолонки).

Столбец на форме: таблица формы и динамический список

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

// Изменение данных текущей строки таблицы формы

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

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

ТекущиеДанные.Цена = 150;

КонецЕсли;

// Изменение видимости столбца на форме

Элементы.ТоварыЦена.Видимость = Ложь;

Для динамического списка напрямую изменять данные нельзя — он предназначен для просмотра. Чтобы повлиять на состав столбцов, меняют текст запроса списка или настройки через Список.КомпоновщикНастроек. Текущую строку динамического списка получают через Элементы.Список.ТекущаяСтрока, где возвращается ключ записи (например, ссылка), а не строка с данными.

Проверка результата и типичные ошибки

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

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

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

Значение колонки в отладчике
Норма

Тип и содержимое соответствуют ожиданиям

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

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

Существование колонки
Норма

Колонки.Найти(Имя) вернул объект колонки

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

Вернул Неопределено — колонка не добавлена или имя неверно

Запись в табличную часть
Норма

После Записать() значение сохранено в базе

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

После перепроведения или повторного открытия значение старое — объект не был записан

Если обращение через точку выдаёт ошибку, а вы уверены в имени, проверьте, не работаете ли вы со строкой дерева значений (у неё свои колонки) или с данными формы, где коллекция называется иначе. Частая ситуация: разработчик обращается к Объект.Товары в модуле формы, тогда как данные лежат в реквизите формы с другим именем.

Часто задаваемые вопросы

Можно ли обратиться к столбцу по номеру (индексу), а не по имени?

У строки таблицы значений обращение по индексу колонки напрямую не поддерживается — только по имени. Но можно получить имя колонки по индексу через коллекцию колонок: ИмяКолонки = ТЗ.Колонки[2].Имя;, а затем обратиться Строка[ИмяКолонки].

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

Чаще всего причина в опечатке имени реквизита или в обращении к колонке, которой нет в данном объекте — например, к реквизиту шапки как к колонке табличной части. Проверьте имя в конфигураторе и убедитесь, что обращаетесь к строке, а не к самой табличной части.

Как изменить значение столбца во всех строках сразу?

Специальной команды массового присвоения нет — используется цикл Для Каждого с записью значения в каждую строку. Для вычисляемых итогов по колонке без цикла применяйте метод Итог("ИмяКолонки").

Чем отличается обращение к колонке в обычных и управляемых формах?

Принцип одинаков — через строку данных. Разница в доступе к строке: в управляемых формах текущую строку получают через Элементы.ИмяТаблицы.ТекущиеДанные, а в обычных формах работали напрямую с табличным полем и его данными. Также в управляемых формах нельзя обращаться к данным объекта напрямую — только через реквизиты формы.

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

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

Итог

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

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