Структура и соответствие



Структура и соответствие являются динамическими наборами данных — коллекциями значений. Каждый элемент такой коллекции представляет собой пару «ключ» и «значение». Ключи структуры и соответствия уникальны, поэтому они однозначно идентифицируют элемент коллекции.

Структуры часто применяются в методах объектов для указания отборов,

Отбор = Новый Структура("Цена", 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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!