Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1C_ПрикладноеПрограммирование8.doc
Скачиваний:
42
Добавлен:
22.09.2019
Размер:
51.67 Mб
Скачать

1.4.4.6 Иерархия объектов

Разберемся с иерархией объектов, позволяющих из языка работать с наполнением справочников.

В схеме, представленной на рис. 1.15, приведены далеко не все объекты. Их полный перечень, состав свойств, методов, событий, взаимосвязь объектов можно просмотреть в документации и в Синтакс – помощнике.

Для того, чтобы «добраться» и прочитать наименования всех элементов справочника «Номенклатура» потребуется прописать следующий код:

Рис. 1.15 Взаимосвязь объектов, обслуживающих справочники

//На чтение

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

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

Сообщить(Наим); КонецЦикла;

Для выборки и переноса всех элементов в предопределенную группу //На запись

ПредопределеннаяГруппа=Справочники.Номенклатура.ДляПереноса;

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

Если Выборка.Ссылка=ПредопределеннаяГруппа Тогда

Продолжить;

КонецЕсли;

ПолученныйОбъект=Выборка.ПолучитьОбъект();

ПолученныйОбъект.Родитель= ПредопределеннаяГруппа; ПолученныйОбъект.Записать();

КонецЦикла;

1.4.5 Работа с коллекциями значений

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

Большинство коллекций имеют набор схожих методов и свойств, таких как «Количество()», «Индекс()», «Добавить()», «Удалить()» и т.д. В качестве свойств коллекции, как правило, выступают ее элементы. Для коллекций доступен обход элементов коллекции посредством конструкции «Для каждого … Из …Цикл». Для большинства коллекций доступно обращение к элементам коллекции с помощью оператора [<Аргумент>] (квадратные скобки). Как правило, в качестве аргумента передается индекс элемента коллекции. Индексирование элементов коллекции начинается с 0. Это означает, что индекс последнего элемента равен количеству элементов в коллекции минус 1.

1.4.5.1 Использование номеров и индексов

В языке системы 1С:Предприятие есть ряд объектов, отдельные части которых имеют нумерацию. К таким объектам, например, относится строка, символы которой имеют номер в строке, или табличный документ, строки и колонки которого имеют номер и т.п. При обращении к частям объектов обычно используется понятие «Номер». Номера начинаются с 1.

При обращении к элементам коллекций используется понятие «Индекс». Индексирование элементов коллекций начинается с 0.

1.4.5.2 Массив

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

Необходимость в его использовании возникает, когда требуется работать с временным набором данных. Чаще всего это промежуточные операции обработки информации: подготовка отборов, реализация поиска, подготовка группирования, передача параметров и т.д.

Массивы могут создаваться конструктором «Новый» или получаться в результате применения методов некоторых объектов.

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

Данный объект является коллекцией значений. Для объекта доступен обход коллекции посредством оператора «Для каждого ... из ... Цикл». При обходе выбираются значения элементов массива. Возможно обращение к значению элемента посредством оператора [...]. В качестве аргумента передается индекс значения.

Создание массивов чаще всего происходит посредством оператора «Новый»:

Новый Массив(<КоличествоЭлементов1>,...,<КоличествоЭлементовN>)

Здесь

<КоличествоЭлементов1>,...,<КоличествоЭлементовN> - необязательный числовой параметр. Каждый параметр определяет количество элементов массива в соответствующем измерении. Может задаваться неограниченное количество параметров. Если ни один параметр не указан, создается одномерный массив с нулевым количеством элементов.

Конструктор позволяет создать массив из указанного количества элементов. Если задано несколько параметров, то будет создан массив, элементами которого являются массивы (и т.д. в зависимости от количества параметров). Фактически, конструктор позволяет создать массивы массивов, которые могут являться аналогом многомерного массива.

Пример:

М = Новый Массив(4);

где «М» - имя переменной, которая будет содержать созданный объект типа «Массив». После создания, к массиву можно добавлять произвольное количество элементов. Если же мы хотим создать массив с заранее определенной размерностью, то это можно сделать так:

СозданныйМассив=Новый Массив(10);

В результате в переменной «СозданныйМассив» будет создан массив с десятью значениями. Для такого массива можно потом сразу обращаться к любому из десяти значений (начиная с нулевого по девятое) для записи или для чтения. А при необходимости к такому массиву можно так же еще добавлять новые элементы. Первый же добавленный элемент получит индекс «10».

Массив является линейной динамической коллекцией с произвольным типом значений. Поэтому значениями массива могут выступать другие массивы, т.е. создание массива массивов и решает задачу создания многомерного массива.

Это можно делать при использовании конструктора массива:

ДвумерныйМассив=Новый Массив(2,8);

или в процессе добавления очередных элементов к массиву:

ДвумерныйМассив=Новый Массив;

МассивВторогоПорядка=Новый Массив(8);

ДвумерныйМассив.Добавить(МассивВторогоПорядка);

ДвумерныйМассив.Добавить(МассивВторогоПорядка);

И в том, и в другом случае мы решим задачу создания двумерного массива размерностью 2x8.

Чтение и запись значений такого массива можно производить посредством директивного указания индексов:

Значение=ДвумерныйМассив[2][5];

или при помощи метода «Получить()»:

Значение=ДвумерныйМассив.Получить(2).Получить(5);

Хотелось бы еще раз отметить, что создание массива определенной размерности конструктором ограничивает только количество возможных к заполнению значений массива, но не препятствует добавлению новых значений (в качестве которых могут выступать массивы произвольной размерности).

Рассмотрим, как выполняется добавление элементов к массиву. Допустим, массив, к которому нужно добавить значение из переменной «НовоеЗначение», называется «НашМассив».

Если нужно просто добавить очередной элемент (с индексом на единицу больше самого старшего) – действуем следующим образом:

НашМассив.Добавить(НовоеЗначение);

Если нужно, чтобы новые значения добавлялись с определенным индексом, то можно использовать метод «Вставить()»:

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

Массив.Вставить(5, «ООО Искра»);

Чтобы определить количество элементов массива «НашМассив» можно вызвать метод «Количество()»:

Размер=НашМассив.Количество();

Однако имейте в виду, поскольку индексация элементов массива начинается с нуля – значение переменной «Размер» будет на единицу больше значения самого старшего индекса.

Удаление отдельных элементов массива происходит с обязательным указанием индекса удаляемого элемента. Так, например, будет удален первый элемент массива:

МассивЭлементов.Удалить(0);

Естественно, если указанный индекс будет выходить за границы массива – получим сообщение об ошибке.

Кроме того, необходимо учитывать, что удаление элемента «из середины» массива приведет к уменьшению на единицу индексов элементов, стоявших «после» удаленного. Массив как бы «сомкнет ряды».

Поэтому, например, один из наиболее простых вариантов удаления всех числовых элементов массива может выглядеть так:

Индекс=МассивЭлементов.Вграница();

Пока Индекс>=0 Цикл

Если ТИПЗНЧ(МассивЭлементов[Индекс])=Тип(«Число») Тогда

МассивЭлементов.Удалить(Индекс);

КонецЕсли;

Индекс=Инднекс-1;

КонецЦикла;

Сначала определяем самый старший индекс элементов массива. Цикл проверок и удалений чисел будет выполняться, пока очередное значение индекса не окажется меньше нуля. В цикле определяем тип значения элемента с текущим индексом. Если это число – удаляем данный элемент. Кроме того, в любом случае уменьшаем на единицу значение переменной «Индекс». В результате, поскольку перебор элементов массива проводится с конца, эффект «смыкания рядов» будет производиться только для уже проверенных элементов.

Если требуется полное удаление элементов из массива, операция выполняется гораздо проще:

Массив.Очистить();

При обращении как для записи, так и для чтения элементов массива лучше пользоваться оператором [ ], указывая индекс элемента. Помните, что индексация начинается с нуля.

Пусть в переменную «ПервоеЗначение» нужно считать значение самого первого элемента массива, а в элемент массива с индексом «9» записать значение из переменной «ДесятоеЗначение»:

ПервоеЗначение=НашМассив[0];

НашМассив[9]=ДесятоеЗначение;

Аналогичных результатов можно добиться при помощи методов «Получить()» и «Установить()»:

ПервоеЗначение=НашМассив.Получить(0);

НашМассив.Установить(9,ДесятоеЗначение);

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

Если перебор элементов массива нужен для чтения данных из массива – проще всего организовывать посредством цикла перебора коллекции.

Например, чтобы вывести сообщения о каждом числе, найденном в массиве «МассивЭлементов», достаточно сделать следующее:

Для Каждого ЭлементМассива Из МассивЭлементов Цикл

Если ТипЗнч(ЭлементМассива)=Тип(«Число») Тогда

Сообщить(ЭлементМассива);

КонецЕсли;

КонецЦикла;

Обратите внимание, «ЭлементМассива» – это произвольное имя переменной, принимающей в себя очередное значение элемента коллекции при выполнении цикла.

Если же при переборе элементов массива нужно их редактировать, то для этого нужно работать еще и с индексами элементов. Лучше тогда использовать так называемый «цикл-счетчик».

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

Для Сч=0 по МассивЭлементов.ВГраница() Цикл

Если ТипЗнч(МассивЭлементов[Сч])=Тип(«Число») Тогда

МассивЭлементов[Сч]=0;

КонецЕсли;

КонецЦикла;

«Сч» – это переменная, принимающее очередное значение счетчика на каждом выполнении цикла. Именно из нее и будем считывать значение индекса очередного элемента массива. Значение самого большого индекса массива определяется посредством метода «ВГраница()».

Для получения копии массива в другом объекте (массиве) необходимо создать новый массив (массив–копию) конструктором. Далее в цикле перебора элементов исходного массива добавлять эти элементы в массив–копию.

Функция СкопироватьМассив(ИсходныйМассив)

МассивКопия=Новый Массив;

Для Каждого Элемент Из ИсходныйМассив Цикл

МассивКопия.Добавить(Элемент) ;

КонецЦикла;

Возврат МассивКопия;

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

Пример работы с массивом:

М = Новый Массив(4); Сообщить("Количество: " +М.Количество()); Сообщить("Наибольший индекс массива: " +М.ВГраница()); М.Удалить(2); Сообщить("Количество после удаления: "+М.Количество()); // Этот элемент массива имеет тип Строка: М.Добавить("Добавили строку"); // Этот элемент массива имеет тип Число: М.Добавить(123.45); Сообщить("Количество после добавления: " +М.Количество()); // Добавим элемент по индексу, большему, чем: ВГраница(): М.Вставить(8,"Метод добавил 4 новых элемента"); Сообщить("Количество после добавления: "+М.Количество))); // Массив может хранить разные типы данных: Сообщить("Типы элементов: "+Символы.ПС+     "     Для 3-го элемента: "+ТипЗнч(М[3])+Символы.ПС+     "     Для 4-го элемента: "+ТипЗнч(М[4])+Символы.ПС+     "     Для 5-го элемента: "+ТипЗнч(М[5]));

Результат выполнения:

Количество: 4 Наибольший индекс массива: 3 Количество после удаления: 3 Количество после добавления: 5 Количество после добавления: 9 Типы элементов: Для 3-го элемента: Строка Для 4-го элемента: Число Для 5-го элемента: Неопределено