Таблица значений - это универсальная коллекция 1С, которая предназначена для хранения данных в табличном виде. Таблица значений хранит ссылки на объекты СтрокаТаблицыЗначений. Помимо строк у таблицы есть колонки. Таблицу значений нельзя создать на клиенте и нельзя передавать между клиентом и сервером.
Создание таблицы значений
Для создания таблицы значений используются конструктор:
//создание таблицы без колонок
ТаблицаДокументов = Новый ТаблицаЗначений;
В данной таблице не будет ни одной колонки и добавление в нее строк бессмысленно. Для добавления колонок нужно использовать свойство Колонки таблицы значений:
//добавление двух колонок
ТаблицаДокументов.Колонки.Добавить("Товар");
ТаблицаДокументов.Колонки.Добавить("Цена");
Теперь в таблицу можно добавить несколько строк. Добавление строк выполняется методом Добавить. Данный метод вернет строку таблицу значений. К именам колонок таблицы значений можно обращаться как к свойствам строки:
//строки добавляются методом Добавить
СтрочкаТабл = ТаблицаДокументов.Добавить();
//к колонкам можно обращаться через ее имя
СтрочкаТабл.Товар = "Диван";
СтрочкаТабл.Цена = 1000;
СтрочкаТабл.Товар = "Кресло";
СтрочкаТабл.Цена = 500;
Типы колонок таблицы значений
В таблицу было добавлено 2 колонки. Тип не был определен и поэтому в эту колонку можно поместить любой тип данных, тип будет определяться в зависимости от типа данных значения в колонке. В примере выше тип колонки Товар - строка, а колонки Цена - число. Если добавить еще одну строку с другим типом, то тип колонки станет составным:
СтрочкаТабл.Товар = Истина;
СтрочкаТабл.Цена = Ложь;
//теперь каждая колонка составного типа
//Товар - строка и булево
//Цена - число и булево
Тип можно указать при добавлении новой колонки, тогда в нее можно будет помещать значения только данного типа, для всех остальных значений будет выполняться преобразование типа:
ТаблицаДокументов = Новый ТаблицаЗначений;
//колонка с типом Строка
ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
//колонка с типом Число
ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = Истина; //в колонке будет строка "Истина"
СтрочкаТабл.Цена = Ложь; //в колонке будет 0
Работа с колонками таблицы значений
Для проверки наличия необходимой колонки в таблице можно выполнить поиск в коллекции колонок. Если такой колонки нет, то метод Найти вернет Неопределено:
ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
СтрочкаТабл = ТаблицаДокументов.Добавить();
//проверка что есть колонка Товар
Если ТаблицаДокументов.Колонки.Найти("Товар") <> Неопределено Тогда
СтрочкаТабл.Товар = "Диван";
КонецЕсли;
//проверка что есть колонка Цена
Если ТаблицаДокументов.Колонки.Найти("Цена") <> Неопределено Тогда
СтрочкаТабл.Цена = 1000;
КонецЕсли;
Колонку можно переименовать. При этом, значения в данной колонке сохранятся. Изменить тип колонки нельзя.
//получаем колонку
КолонкаТовар = ТаблицаДокументов.Колонки.Найти("Товар");
Если КолонкаТовар <> Неопределено Тогда
//меняем имя колонки
КолонкаТовар.Имя = "Номенклатура";
КонецЕсли;
Колонки можно удалять, соответственно будут удалены и все значения в данной колонке:
//удаление колонки Цена
ТаблицаДокументов.Колонки.Удалить("Цена");
//удаление всех колонок
ТаблицаДокументов.Колонки.Очистить();
Изменение значений в существующих строках
К строкам таблицы значений можно обращаться через оператор индексации [ ]. Индексация строк начинается с нуля, чтобы изменить значение в первой строке нужно использовать индекс 0:
//меняем значение в первой строке в колонке Товар
Стр[0].Товар = "Телевизор";
Перебор строк таблицы значений
Перебрать все строки таблицы значений можно с помощью циклов Для Каждого и Для. При необходимости на каждой итерации цикла можно изменить значения колонок строки.
//через цикл Для Каждого
Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл
Сообщить(СтрочкаТабл.Товар);
//можно менять значения колонок
СтрочкаТабл.Цена = СтрочкаТабл.Цена * 1.1;
КонецЦикла;
//через цикл Для
//метод Количество() вернет количество строк таблицы
Для ё = 0 По ТаблицаДокументов.Количество()-1 Цикл
Сообщить(ТаблицаДокументов[0].Товар);
//можно менять значения колонок
ТаблицаДокументов[0].Цена = ТаблицаДокументов[0].Цена * 1.1;
КонецЦикла;
Удаление строк
Удалить строку из таблицы можно методом Удалить. Параметром можно передать индекс строки или саму строку. Для удаления всех строк таблицы можно воспользоваться методом Очистить.
//удаление первой строки
ТаблицаДокументов.Удалить(0);
//параметром можно передать ссылку на строку
СтрочкаТабл = ТаблицаДокументов.Добавить();
ТаблицаДокументов.Удалить(СтрочкаТабл);
//удаление всех строк
ТаблицаДокументов.Очистить();
Иногда нужно удалить несколько строк из таблицы по условию. Например, все строки, где цена меньше 100. На первый взгляд это можно сделать так:
//создаем таблицу
ТаблицаДокументов= Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
//добавим 4 строки
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Диван";
СтрочкаТабл.Цена = 1000;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Ручка";
СтрочкаТабл.Цена = 50;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Линейка";
СтрочкаТабл.Цена = 80;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Кресло";
СтрочкаТабл.Цена = 2000;
Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл
Если СтрочкаТабл.Цена < 100 Тогда
ТаблицаДокументов.Удалить(СтрочкаТабл);
КонецЕсли;
КонецЦикла;
Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл
Сообщить(СтрочкаТабл.Товар);
КонецЦикла;
//в таблице остались
//диван
//линейка
//кресло
Однако после удаления линейка осталась в таблице, хотя ее цена равна 80. Почему так произошло? При удалении строки, таблица как бы сжимается. То есть на первой итерации цикла мы получили первую строку с диваном, его цена больше 100, поэтому строка осталась. Получаем вторую строку с ручкой за 50. Так как цена меньше 100, строка была удалена. И после удаления все строки сдвинулись, третья строка переместилась на вторую позицию, четвертая на третью и т.д. На следующей итерации мы получаем третью строку, а там уже кресло за 2000. Линейка была пропущена, цикл даже не проверял ее цену.
Поэтому правильно удалять строки с конца таблицы. При удалении строки цикл может несколько раз пройти по одной строке, но точно не пропустит ни одну строку:
//создаем таблицу
ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
//добавим 4 строки
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Диван";
СтрочкаТабл.Цена = 1000;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Ручка";
СтрочкаТабл.Цена = 50;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Линейка";
СтрочкаТабл.Цена = 80;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Кресло";
СтрочкаТабл.Цена = 2000;
//получаем индекс максимальной строки
Инд = ТаблицаДокументов.Количество() - 1;
Пока Инд >= 0 Цикл
//получаем строку по индексу и проверяем цену
Если ТаблицаДокументов[Инд].Цена < 100 Тогда
//удаляем строку
ТаблицаДокументов.Удалить(Инд);
КонецЕсли;
//уменьшаем индекс
Инд = Инд - 1;
КонецЦикла;
Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл
Сообщить(СтрочкаТабл.Товар);
КонецЦикла;
//в таблице остались
//диван
//кресло
Другой способ - это сначала поместить все строки в массив, а потом обойти массив и удалить эти строки:
//создаем таблицу
ТаблицаДокументов = Новый ТаблицаЗначений;
ТаблицаДокументов.Колонки.Добавить("Товар", Новый ОписаниеТипов("Строка"));
ТаблицаДокументов.Колонки.Добавить("Цена", Новый ОписаниеТипов("Число"));
//добавим 4 строки
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Диван";
СтрочкаТабл.Цена = 1000;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Ручка";
СтрочкаТабл.Цена = 50;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Линейка";
СтрочкаТабл.Цена = 80;
СтрочкаТабл = ТаблицаДокументов.Добавить();
СтрочкаТабл.Товар = "Кресло";
СтрочкаТабл.Цена = 2000;
//массив для удаляемых строк
МассивСтрок = Новый Массив;
Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл
Если СтрочкаТабл.Цена < 100 Тогда
//добавляем строки, которые будем удалять
МассивСтрок.Добавить(СтрочкаТабл);
КонецЕсли;
КонецЦикла;
//обходим массив строк
Для Каждого СтрочкаТабл Из МассивСтрок Цикл
//и удаляем строки
ТаблицаДокументов.Удалить(СтрочкаТабл);
КонецЦикла;
Для Каждого СтрочкаТабл Из ТаблицаДокументов Цикл
Сообщить(СтрочкаТабл.Товар);
КонецЦикла;
//в таблице остались
//диван
//кресло
Таблица значений в 1С 8.3 (2 часть) Смотрите также:
Электронный учебник по по программированию в 1С Рекомендации по изучению программирования 1С с нуля Программное решение для сдачи и подготовки к экзаменам Программирование в 1С 8.3 с нуля - краткий самоучитель Комплексная подготовка программистов 1С:Предприятие 8.2 Сайты с уроками программирования и со справочниками Youtube-каналы с уроками программирования Сайты для обучения программированию Лекции и уроки