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