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

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

Как обратиться к колонке массива в 1С

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

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

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

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

Как устроены массивы и колонки в 1С

Массив в 1С — это одномерная упорядоченная коллекция, доступ к элементам возможен только по числовому индексу, начиная с нуля: Массив[0], Массив[1]. У массива нет имён колонок, свойств и методов для работы с «столбцами». Если вы пытаетесь написать Массив.Колонка, платформа выдаст ошибку, потому что у объекта «Массив» такого свойства нет.

Табличная структура реализуется через объект «ТаблицаЗначений». У неё есть коллекция «Колонки» с именованными колонками и коллекция строк. Каждая строка — объект «СтрокаТаблицыЗначений», к полям которого можно обращаться по имени колонки. Именно таблицу значений чаще всего имеют в виду, говоря про «массив с колонками».

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

Обращение к колонке таблицы значений по имени

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

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

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

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

Строка = Таблица.Добавить();

Строка.Номенклатура = "Товар А";

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

// Чтение значения колонки первой строки

ТекКоличество = Таблица[0].Количество;

Имя колонки должно быть допустимым идентификатором: без пробелов, не начинаться с цифры. Если имя колонки содержит недопустимые символы (что возможно при загрузке из внешних источников), обращение через точку не сработает — используйте обращение по индексу колонки через метод «Получить» или конструкцию Строка["Имя колонки"], которая поддерживается для строк таблицы значений в квадратных скобках.

Обращение к несуществующей колонке вызывает ошибку «Поле объекта не обнаружено». Имя чувствительно к написанию, но не к регистру: «Количество» и «КОЛИЧЕСТВО» — одна и та же колонка.

bsl
Значение = Таблица[0].ИмяКолонки; // чтение
Таблица[0].ИмяКолонки = НовоеЗначение; // запись

Обращение по индексу строки и колонки

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

ИндексКолонки = Таблица.Колонки.Индекс(Таблица.Колонки.Найти("Количество"));

Значение = Таблица[0].Получить(ИндексКолонки);

// Альтернатива — по имени через квадратные скобки

Значение = Таблица[0]["Количество"];

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

Обращение по индексу полезно в универсальных алгоритмах, которые обрабатывают произвольные таблицы: например, при выгрузке любой таблицы в файл, когда структура колонок неизвестна на этапе написания кода.

Как выгрузить колонку целиком в массив

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

МассивТоваров = Таблица.ВыгрузитьКолонку("Номенклатура");

Для Каждого Товар Из МассивТоваров Цикл

Сообщить(Товар);

КонецЦикла;

У полученного массива снова действует правило: доступ только по индексу, МассивТоваров[0] — значение колонки из первой строки. Изменение элемента массива не меняет данные в таблице, потому что «ВыгрузитьКолонку» создаёт копию значений (для ссылочных типов копируется ссылка, а не объект).

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

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

ВыгрузитьКолонку()

Быстро получить массив значений одной колонки. Не подходит, если нужно менять данные в исходной таблице.

Цикл по строкам

Полный контроль: чтение, изменение, условия. Требует больше кода, но универсален.

НайтиСтроки() с отбором

Когда нужны не все строки, а только подходящие под условие по значению колонки.

Перебор строк и работа с колонками в цикле

Самый частый сценарий — обойти все строки и обработать значения колонок. Используйте цикл «Для Каждого», который автоматически перебирает строки без ручного управления индексами:

Для Каждого Строка Из Таблица Цикл

Если Строка.Количество > 0 Тогда

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

КонецЕсли;

КонецЦикла;

Если внутри цикла нужен номер строки, добавьте счётчик вручную или используйте цикл «Для» с индексом от 0 до Таблица.Количество() - 1. Удалять строки внутри цикла «Для Каждого» нельзя — это нарушит итерацию; для удаления используйте обратный цикл по индексу от последней строки к первой или метод «НайтиСтроки» с последующим удалением найденных.

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

Порядок действий
  1. 1
    Определите тип объекта: массив, таблица значений или массив структур
  2. 2
    Для таблицы значений проверьте наличие колонки через Таблица.Колонки.Найти()
  3. 3
    Получите строку по индексу или в цикле Для Каждого
  4. 4
    Обратитесь к колонке по имени: Строка.ИмяКолонки
  5. 5
    Проверьте результат в отладчике или через Сообщить()

Обращение к элементу вложенного массива и массива структур

Двумерная структура на массивах создаётся как массив массивов. Обращение к «ячейке» выполняется двумя индексами подряд: сначала индекс строки (внешний массив), затем индекс «колонки» (вложенный массив):

Строка1 = Новый Массив;

Строка1.Добавить("Товар А");

Строка1.Добавить(10);

ТаблицаМассив = Новый Массив;

ТаблицаМассив.Добавить(Строка1);

Значение = ТаблицаМассив[0][1]; // 10

Для массива структур обращение комбинирует индекс и имя ключа: МассивСтруктур[0].Количество. Перед обращением к ключу структуры полезно проверять его наличие методом Структура.Свойство("Количество", Значение) — он вернёт Ложь, если ключа нет, и не вызовет ошибку.

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

Маршрут решения

Как выбрать действие

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

Проверка существования колонки и защита от ошибок

Перед обращением к колонке, особенно в универсальном коде, проверяйте её наличие. Метод Таблица.Колонки.Найти("Имя") возвращает объект колонки или Неопределено:

Если Таблица.Колонки.Найти("Количество") = Неопределено Тогда

ВызватьИсключение "В таблице отсутствует колонка ""Количество""";

КонецЕсли;

Дополнительно проверяйте, что таблица не пуста, прежде чем обращаться к Таблица[0]: пустая таблица вызовет ошибку выхода за границы индекса. Условие Таблица.Количество() > 0 — обязательная защита перед прямым обращением по индексу.

В отладчике конфигуратора удобно смотреть содержимое таблицы значений через «Вычислить выражение» (Shift+F9): введите имя переменной и раскройте коллекцию строк и колонок. Это быстрый способ убедиться, что колонка называется именно так, как вы ожидаете, а данные заполнены.

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

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

Как обратиться к колонке, если её имя хранится в переменной?

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

Можно ли обратиться к колонке табличной части документа так же, как у таблицы значений?

Да, синтаксис идентичен: Документ.Товары[0].Номенклатура или перебор в цикле «Для Каждого Строка Из Документ.Товары Цикл». Табличная часть ведёт себя как таблица значений по способу обращения к строкам и полям.

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

Сначала найдите колонку: Колонка = Таблица.Колонки.Найти("Количество"), затем получите индекс: Индекс = Таблица.Колонки.Индекс(Колонка). Если колонка не найдена, метод Найти вернёт Неопределено — проверьте это перед вызовом Индекс().

Почему возникает ошибка «Индекс находится за границами массива»?

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

Как обратиться к колонке строки, найденной через Найти()?

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

Чем отличается обращение к колонке на клиенте и на сервере?

Синтаксис одинаковый. Различие в доступных типах: таблица значений недоступна на тонком клиенте вне контекста формы, поэтому для клиент-серверного обмена используют массив структур или данные формы. На сервере ограничений нет.

Итог

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

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