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