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