Разработка в 1С 8.0

       

Код:


Ма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);  

КонецЦикла;  

КонецПроцедуры

 

ПоказатьПодчиненные(дзОтделы);

 

Результат работы программы:  


Бухгалтерия

Расчет зарплаты  

Основные средства  

Руководство

Высшее руководство  

Отдел маркетинга  

Аналогично таблице значений, дерево значений позволяет искать значение с помощью метода Найти или искать сразу несколько строк методом НайтиСтроки. Принципы работы этих методов полностью идентичны рассмотренным выше для таблицы значений, за исключением последнего параметра ВключатьПодчиненные. Если передать в него значение Истина, то поиск будет производиться в том числе и по подчиненным строкам, иначе ?только по строкам текущего уровня.  

 



Содержание раздела