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