При разработке алгоритмов в 1С часто возникает необходимость работать с колонками объекта ТаблицаЗначений динамически, когда имя нужного столбца хранится в строковой переменной. Рассмотрим основные способы получения доступа к самой колонке, а также к значениям ячеек в строках таблицы.
Для того чтобы получить объект колонки (например, для чтения свойств Имя, Заголовок или ТипЗначения), необходимо обратиться к коллекции Колонки таблицы значений. В качестве индекса передается строковая переменная, содержащая имя колонки.
Разберем пример:
ИмяКолонки = "Размер";
КолонкаОбъект = ТаблицаЗначений.Колонки[ИмяКолонки];
Сообщить(КолонкаОбъект.Имя);
Сообщить(КолонкаОбъект.Заголовок);
Если требуется найти колонку по имени без возникновения ошибки при ее отсутствии, используют метод Найти(). Данный метод возвращает объект колонки или значение Неопределено, если колонка с таким именем не найдена в коллекции.
Для обращения к конкретной ячейке строки по динамическому имени колонки разберем два основных способа:
ИмяКолонки = "Размер";
НомерСтроки = 0; // Индексация строк начинается с 0
// Чтение значения из конкретной строки таблицы:
ЗначениеЯчейки = ТаблицаЗначений[НомерСтроки][ИмяКолонки];
// Получение значения напрямую из объекта СтрокаТаблицыЗначений:
СтрокаТЗ = ТаблицаЗначений[НомерСтроки];
ЗначениеЯчейки = СтрокаТЗ[ИмяКолонки];
// Запись значения в ячейку:
СтрокаТЗ[ИмяКолонки] = 180;
СтрокаТаблицыЗначений предоставляет специальные методы для считывания и записи данных.
ИмяКолонки = "Размер";
// Получение значения
ЗначениеЯчейки = СтрокаТЗ.Получить(ИмяКолонки);
// Установка значения
СтрокаТЗ.Установить(ИмяКолонки, 180);
Методы Получить() и Установить() принимают в качестве параметра имя колонки в виде строки, ее числовой индекс или сам объект КолонкаТаблицыЗначений.
Прямое обращение через квадратные скобки к несуществующей колонке (например, СтрокаТЗ[ИмяКолонки] или ТЗ.Колонки[ИмяКолонки]) приводит к аварийному завершению программы с ошибкой. Чтобы избежать этого, выполним предварительную проверку наличия колонки в таблице:
Если ТЗ.Колонки.Найти(ИмяКолонки) <> Неопределено Тогда
ЗначениеЯчейки = СтрокаТЗ[ИмяКолонки];
Иначе
Сообщить("Колонка с именем " + ИмяКолонки + " не найдена!");
КонецЕсли;
Платформа 1С поддерживает передачу имени колонки через строковую переменную в стандартные сервисные методы ТаблицыЗначений. Рассмотрим наиболее частые сценарии применения:
ИмяКолонки = "Сумма";
// 1. Подсчет суммы по колонке
ВсегоСумма = ТЗ.Итог(ИмяКолонки);
// 2. Выгрузка значений колонки в массив
МассивЗначений = ТЗ.ВыгрузитьКолонку(ИмяКолонки);
// 3. Заполнение всей колонки одним значением
ТЗ.ЗаполнитьЗначения(0, ИмяКолонки);
// 4. Поиск строк по значению в динамической колонке
Отбор = Новый Структура;
Отбор.Вставить(ИмяКолонки, 100);
НайденныеСтроки = ТЗ.НайтиСтроки(Отбор);
Проанализировав эти механизмы, мы видим, что встроенный язык 1С полностью поддерживает динамическую работу с таблицами значений через квадратные скобки и методы объектов, что позволяет создавать гибкие универсальные алгоритмы обработки данных.