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