Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЦОО_ПОЭИС_Л4.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
147.97 Кб
Скачать

4.9. Таблица значений

Таблица значений - это не сохраняемый в базе данных объект, предназначенный для создания динамических наборов данных. Таблица значений состоит из строк и колонок. В отличие от списка значений, таблица значений имеет структуру, которую определяет разработчик.

Объект ТаблицаЗначений имеет много полезных методов для обработки данных. Разработчик средствами встроенного языка может добавлять и удалять строки и колонки, перебирать строки, искать значение, сортировать по любым колонкам и выполнять другие операции.

При создании новой таблицы значений в нее обычно добавляются колонки:

тзТовары = Новый ТаблицаЗначений;

тзТовары.Колонки.Добавить("Ссылка");

тзТовары.Колонки.Добавить("Наименование");

тзТовары.Колонки.Добавить("Цена");

тзТовары.Колонки.Добавить("Количество");

У таблицы значений есть свойство Колонки, которое представляет собой коллекцию колонок и позволяет добавлять, удалять и менять их порядок.

По умолчанию в таблице значений могут храниться значения разных типов. Но в 1С:Предприятии 8 для колонки можно задать список возможных типов значений. Это делается следующим образом (для повышения наглядности нам понадобится вспомогательная функция СоздатьОписаниеТипов):

Функция СоздатьОписаниеТипов(НазваниеТипа,Длина,Точность=" ")

мас = Новый Массив;

мас.Добавить(Тип(НазваниеТипа));

Если Точность = " " Тогда

КвалифСтроки = Новый КвалификаторыСтроки(Длина,

ДопустимаяДлина.Переменная);

Иначе

КвалифЧисла = Новый КвалификаторыЧисла(ДопустимыйЗнак.Любой,

Длина,Точность);

КонецЕсли;

Возврат Новый ОписаниеТипов(мае, КвалифСтроки, КвалифЧисла);

КонецФункции

тзТовары = Новый ТаблицаЗначений;

ТипКолСсылка = СоздатьОписаниеТипов("СправочникСписок.Номенклатура");

тзТовары.Колонки.Добавить("Ссылка", ТипКолСсылка,"Товар",5);

ТипКолНаим = СоздатьОписаниеТипов("Строка",50);

тзТовары.Колонки.Добавить("Наименование", ТипКолНаим);

ТипКолЦена = СоздатьОписаниеТипов("Строка",15,2);

тзТовары.Колонки.Добавить("Цена", ТипКолЦена, "Цена",15);

ТипКолКолич = СоздатьОписаниеТипов("Строка",15,4);

тзТовары.Колонки.Добавить("Количество",ТипКолКолич,"Кол-во",15);

При работе со строками таблицы значений необходимо понимать, что строка - это объект типа СтрокаТаблицыЗначений. Поэтому добавление строк в таблицу значений производится следующим образом:

//удаляем все строки из таблицы (колонки остаются)

тзТовары.Очистить();

СпрВыборка = Справочники.Номенклатура.Выбрать();

Пока СпрВыборка.Следующий() Цикл

НовСтрока = тзТовары.Добавить();

НовСтрока.Ссылка = СпрВыборка.Ссылка;

НовСтрока.Наименование = СпрВыборка.Наименование;

НовСтрока.Цена = СпрВыборка.Цена;

КонецЦикла;

Чтобы удалить колонки из таблицы значений нужно применить метод Очистить для свойства-коллекции Колонки:

тзТовары.Колонки.Очистить();

По индексу можно удалить строку:

тзТовары.Удалить(0); //удалить 1-ю строку с индексом 0

тзТовары.Удалить(1); //удалить 2-ю строку с индексом 1

Перебор строк таблицы значений обычно реализуется с помощью конструкции «Для Каждого», при этом в переменной цикла будет содержаться не номер строки, а вся строка целиком как объект СтрокаТаблицыЗначений:

Для Каждого стр Из тзТовары Цикл

Сообщить(стр.Наименование);

Сообщить(стр.Цена);

КонецЦикла;

Допускается также обращение к строке по индексу, при этом также возвращается объект типа СтрокаТаблицыЗначений. При работе с индексами необходимо всегда помнить, что индексация строк таблицы значений начинается с 0.

Для н=0 По тзТовары.Количество()-1 Цикл

Сообщить(тзТовары[н].Наименование);

Сообщить(тзТовары[н].Цена);

КонецЦикла ;

Часто возникает необходимость найти значение в таблице значений. Для решения этой задачи предназначены методы Найти и НайтиСтроки. В метод Найти передается искомое значение и список колонок, которые нужно просматривать. Если значение найдено, то возвращается строка таблицы значений, иначе - зна­чение Неопределено.

НайденнаяСтрока = тзТовары.Найти(100,"Цена");

Если НайденнаяСтрока <> Неопределено Тогда

Сообщить("Товар с такой ценой найден!" +

НайденнаяСтрока.Наименование);

КонецЕсли;

Метод НайтиСтроки позволяет найти сразу несколько строк таблицы значений, удовлетворяющих заданному условию. В параметрах этого метода передается структура, задающая условия от­бора. Ключ структуры определяет имя колонки, а ее значение - искомое значение. Метод НайтиСтроки возвращает массив, содержащий ссылки на найденные строки таблицы значений:

Отбор = Новый Структура("Цена",100);

МассивСтрок = тзТовары.НайтиСтроки(Отбор);

Сообщить("Найдено " + МассивСтрок.Количество () +

" товаров с такой ценой");

Замечание. Массив, возвращаемый методом НайтиСтроки, содержит строки таблицы значений (не их копии, а сами строки). При изменении какой-либо строки в таблице значений это отразится в массиве, и наоборот.

Таблица значений позволяет упорядочить содержащиеся в ней данные, для чего предназначен метод Сортировать:

тзТовары.Сортировать("Наименование Возр");

тзТовары.Сортировать("Цена Убыв");

тзТовары.Сортировать("Цена Убыв, Наименование Возр");

Таблица значений имеет очень полезную возможность группировки строк и подсчета итогов по группе, что реализуется методом Свернуть, имеющим следующие параметры:

Свернуть (<Колонки группировок>, <Колонки суммирования>)

Этот метод осуществляет свертку таблицы значений по указан­ным колонкам группировки. Строки, у которых совпадают значе­ния в колонках, указанных в первом параметре, сворачиваются в одну строку. Значения по этим строкам, хранящиеся в колонках, указанных во втором параметре, суммируются.

Замечание. Списки колонок для метода Свернуть не должны пересекаться. Колонки, не вошедшие ни в один из списков колонок, после выполнения метода удаляются из таблицы значений.

Например, у нас есть таблица значений со следующими данными:

Сотрудник

Год

Месяц

Доход

Иванов

2003

Январь

15000

Иванов

2003

Февраль

14000

Петров

2003

Январь

15000

Петров

2003

Февраль

12000

В следующем примере эта таблица сворачивается по колонкам Сотрудник и Год с подсчетом суммы по колонке Доход:

//подсчитаем годовой доход по каждому сотруднику

тзДоходыСотр.Свернуть("Сотрудник,Год","Доход");

В результате мы получим следующую таблицу значений:

Сотрудник

Год

Доход

Иванов

2003

29000

Петров

2003

27000

Если исходная таблица значений вам понадобится в дальнейшем, то лучше сделать копию таблицы значений и сворачивать уже ее:

тзДоходыПоГодам = тзДоходыСотр.Скопировать();

тзДоходыПоГодам.Свернуть{"Сотрудник,Год","Доход");

Таблица значений позволяет подсчитать итог по колонке числового типа, например:

ВсегоДоход = тзДоходыСотр.Итог("Доход");

ВсегоНДС = тзСостав.Итог ("НДС");

И последнее, о чем хотелось рассказать, из таблицы значений можно выгрузить целую колонку в массив и загрузить ее из массива:

МассивЦен = тзТовары.ВыгрузитьКолонку("Цена");

тзТовары.ЗагрузитьКолонку("Количество",МассивОстаткиТоваров);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]