Получить консультацию

Примеры работы с коллекциями в 1С – какие бывают, зачем нужны?

В интернете можно найти множество примеров работы с массивами, таблицами значений и другими универсальными коллекциями, но крайне мало приводится информации о том, где именно можно использовать ту или иную коллекцию. В данной небольшой статье я постарался исправить этот пробел.

Общие сведения об универсальных коллекциях в 1С

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

Универсальные коллекции можно разделить на две группы – доступные в интерфейсе и недоступные. Список, таблицу и дерево значений можно отобразить в форме в виде соответствующих элементов. А вот массив, соответствие и структура – исключительно программные объекты, и работать с ними можно только средствами языка 1С.

Кроме того, коллекции условно можно разделить на упорядоченные и неупорядоченные. К последним относятся соответствие и структура. Это означает, что к элементам соответствия и структуры мы не сможем обратиться по номеру строки или индексу, и не можем гарантировать, что эти элементы будут храниться там в каком-либо порядке. То есть, даже если мы поместили в структуру данные по алфавиту, внутри структуры они будут храниться вперемешку.

Все универсальные коллекции можно сериализовать, т.е. представить в виде строки, которую можно где-либо сохранить(например во временном файле), а затем из этой строки восстановить исходное значение.

И еще один момент, объединяющий все универсальные коллекции – их элементы можно перебрать циклом Для каждого… из… Цикл.

Массив

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

Массивы используются в качестве параметров во множестве методов платформы, а также являются результатом выполнения множества встроенных функций. Рассмотрим простой пример:

	СтрокаПеречня = "Корзинка,картинка,картонка,маленькая собачонка";
	// разделим текст по запятым, получим массив
	МассивПеречня = СтрРазделить(СтрокаПеречня, ",");
	МассивПеречня.Добавить("лягушонка в коробчонке");
	СтрокаПеречня = СтрСоединить(МассивПеречня, ",");
	// получим новый текст
	//СтрокаПеречня = "Корзинка,картинка,картонка,маленькая собачонка,лягушонка в коробчонке";

Где еще применяются массивы? Пожалуй, самый близкий к истине ответ – почти везде. Получить пользователей информационной базы или Windows, узнать какие файлы выбраны пользователем в диалоге, получить сообщения системы взаимодействия, узнать какие строки выделены пользователем в таблице, и т.д., и т.п. Поэтому основной совет – просто обращать внимание на то что указано в документации, справке или контекстной подсказке.

Структура

Структура – это также очень часто используемая коллекция, состоящая из пар “Ключ-Значение”, при этом ключ может быть только строковый, и должен соответствовать требованиям для имен переменных (не содержать пробелы, спецсимволы, не начинаться с числа, и т.д.). Очень распространенное применение структуры – в качестве параметра для установки отборов и фильтров, например при поиске строк в табличной части методом НайтиСтроки, получении среза первых или последних для регистров сведений, получение выборки из справочника, и много где еще.

К элементу структуры нельзя обратиться по индексу, так как эта коллекция не упорядоченная. Вместо этого следует обращаться по имени – так, как мы обращаемся к реквизитам объекта, через точку. Например:

	// сперва сформируем структуру, которую используем в качестве фильтра, чтобы получить цену
	// только по нужной номенклатуре
	СтруктураОтбора = Новый Структура("Номенклатура", НужнаяНоменклатура);
	// в ответ получим структуру, содержащую значения ресурсов
	СтруктураПоследнейЦены = РегистрыСведений.Цены.ПолучитьПоследнее(, СтруктураОтбора);
	// например, у нас есть ресурс Цена
	Сообщить(СтруктураПоследнейЦены.Цена);

Также к элементам структуры можно обращаться, используя оператор квадратные скобки. Такое бывает удобно, если имена свойств структуры мы получаем из какого-нибудь строкового значения. Простой пример : СтруктураПоследнейЦены[“Цена”]

Соответствие

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

Соответствие иногда встречается в качестве параметров методов платформы 1С, а также в качестве возвращаемого значения. Например, КлючСтрокиДинамическогоСписка можно создать на основании соответствия, а метод ИнтернетПочта.ПолучитьФлагиСообщений возвращает соответствие идентификаторов почтовых сообщений и их флагов (новое, отвеченное, прочитанное и т.п.)

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

Рассмотрим пример работы с соответствием в 1С:

Процедура ПередНачаломРаботыСистемы(Отказ)
	
	СоответствиеПраздников = Новый Соответствие;
	СоответствиеПраздников.Вставить(Дата(1, 12, 31), "Новый Год");
	СоответствиеПраздников.Вставить(Дата(1, 2, 23), "День защитника Отечества");
	СоответствиеПраздников.Вставить(Дата(1, 3, 8), "Международный женский день");
	
	ДатаПроверки = Дата(1, Месяц(ТекущаяДата()), День(ТекущаяДата()));
	
	Праздник = СоответствиеПраздников[ДатаПроверки];
	Если ЗначениеЗаполнено(Праздник) Тогда
		Сообщить( СтрШаблон("Поздравляем! Сегодня %", Праздник));
	КонецЕсли;
		
КонецПроцедуры

Фиксированные варианты коллекций

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

Тем не менее, можно фиксированную коллекцию преобразовать в обычную, и наоборот. Например:

Массив = Новый Массив;
Массив.Добавить(1);
Массив.Добавить(2);
Массив.Добавить(3);

Фиксированный = Новый ФиксированныйМассив(Массив);
//фиксированные коллекции можно только читать, но не изменять.
Сообщить(Фиксированный.Количество());

СноваМассив = Новый Массив(Фиксированный);
// вот теперь снова можно что-то добавить, удалить и т.п.

Фиксированные массивы используются при работе с интерфейсом – например при описании связей параметров выбора, а также в методах, относящихся к механизму анализа данных. Также, многие методы платформы возвращают значения типа ФиксированныйМассив, например ПолучитьИменаПредопределенных, НайтиОбъекты, и др.

Фиксированное соответствие чаще всего встречается при работе с HTTP сервисами. Дело в том, что входящие HTTP запросы имеют заголовки, параметры URL и параметры запроса, и эти объекты как раз и имеют тип “ФиксированноеСоответствие”. Кроме того, фиксированное соответствие используется во многих методах, относящихся к работе с полем планировщика в управляемых формах.

Фиксированные структуры используются при программной работе с интерфейсом, сертификатами криптографии, историей данных.

Список значений

Списки значений в 1С широко применяются во множестве ситуаций. Их можно передавать в качестве параметров запросов, использовать в интерфейсе для интерактивной работы с пользователем, использовать в коде для временного хранения и обработки каких-нибудь данных.

Списки значений также используются при работе с механизмом выбора, например, для ограничения доступных значений при помощи свойства СписокВыбора, или в методе ОбработкаПолученияДанныхВыбора.

Но все же гораздо чаще списки значений используются именно как интерфейсный объект. Мы можем вывести список на форму, дать пользователю возможность добавлять или удалять строки списка, или отмечать флажками нужные – и в дальнейшем обработать отмеченные строки. Либо создать список значений программно, и в определенных ситуациях снова отображать его пользователю – для выбора одного значения, или для того чтобы пользователь отметил несколько. Для этого есть соответствующие методы, такие как ОтметитьЭлементыАсинх или ВыбратьЭлементАсинх.

Рассмотрим пару примеров. В первом мы программно создадим и заполним из массива список значений, а во втором мы дадим пользователю интерактивно наполнить список на форме, а затем программно его обработаем.

&НаКлиенте
Асинх Процедура ВыборЦвета(Команда)
	Массив = Новый Массив;
	Массив.Добавить("Красный");
	Массив.Добавить("Желтый");
	Массив.Добавить("Синий");
	Массив.Добавить("Оранжевый");
	СписокЦветов = Новый СписокЗначений;
	СписокЦветов.ЗагрузитьЗначения(Массив);
	СписокЦветов.ЗаполнитьПометки(Истина);
	ВыбранныйЦвет = Ждать СписокЦветов.ВыбратьЭлементАсинх("выберите цвет!");
	Если ВыбранныйЦвет <> Неопределено Тогда
		Сообщить("Выбран цвет " + ВыбранныйЦвет.Значение);
	КонецЕсли;
КонецПроцедуры
1С пример выбора из списка
&НаКлиенте
Процедура ОбработатьСписок(Команда)
	
	Для Каждого Элемент Из Список Цикл
		Если Элемент.Пометка Тогда
			Сообщить("Выбрана строка с номенклатурой " + Элемент.Значение);
		КонецЕсли;
	КонецЦикла;
	
КонецПроцедуры

Таблица значений

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

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

У регистров есть возможность получения виртуальных таблиц – остатков, оборотов, срезов последних и др. – которые возвращают значение с типом ТаблицаЗначений.

В языке 1С для работы с таблицей значений предусмотрено множество методов, которые позволяют очень гибко обрабатывать данные – находить строки, сортировать таблицу, сворачивать строки с суммированием по нужным колонками, выгружать определенные колонки, и многое другое. Это делает таблицу значений незаменимой при решении множества задач. Более подробно про работу с таблицей значений можно прочитать тут.

Дерево значений

Дерево значений предназначено для работы в первую очередь с иерархическими данными. Каждая строка дерева может содержать подчиненные строки, которые в свою очередь также могут содержать подчиненные строки, и уровень вложенности при этом не ограничен. В качестве наглядного примера можно привести структуру каталогов в проводнике Windows или каталог товаров, когда товар “Морковь” может быть в группе “Продукты питания”, в подгруппе “Овощи”.

При работе с деревом значений известной глубины вложенности можно использовать вложенные циклы, но чаще всего прибегают к рекурсии, т.к. заранее может быть неизвестно сколько вложенных строк и сколько уровней вложенности может быть у каждой строки дерева. Рассмотрим стандартный рекурсивный обход всех строк дерева:

1С Дерево значений

На управляемой форме реквизит ДеревоЗначенийФормы будет иметь тип “ДанныеФормыДерево” – это некий “контейнер”, в который на клиенте трансформируется объект дерева значений. Для получения полноценного дерева значений мы используем метод РеквизитФормыВЗначение. 

&НаСервере
Процедура ОбходДереваНаСервере()
	ДеревоОбъект = РеквизитФормыВЗначение("ДеревоЗначенийФормы");
	ОбходДереваРекурсивный(ДеревоОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ОбходДерева(Команда)
	ОбходДереваНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОбходДереваРекурсивный(КоллекцияСтрок)
	Для Каждого СтрПолученногоДерева Из КоллекцияСтрок.Строки Цикл
		Сообщить(СтрПолученногоДерева.Номенклатура);
		Если СтрПолученногоДерева.Строки.Количество() > 0 Тогда
			ОбходДереваРекурсивный(СтрПолученногоДерева);
		КонецЕсли;
	КонецЦикла;	
КонецПроцедуры
1С Дерево значений рекурсия

Другие коллекции значений, похожие на универсальные

В языке 1С доступно большое количество объектов-коллекций, похожих на универсальные. Есть коллекции, похожие на массив, например “Колонки” у таблицы значений, “ТочкиДиаграммы” у диаграммы, коллекция “ИзбранноеРаботыПользователя”, и многие другие. У этих коллекций есть очень похожие методы – Добавить, Вставить, Индекс, Удалить и др.. Тем не менее, это не массивы, а самостоятельные объекты языка с разными типами значений.

Также существуют коллекции, похожие на соответствия или структуры. В них также в качестве элементов содержатся пары ключ-значение, например, коллекции СтрокиДинамическогоСписка, ТекстыСообщенийОбОшибках или РегистрБухгалтерииСубконто. Однако от универсальных коллекций их отличает узкая специфика и поддержка только определенного типа значений.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

16 + два =

К НАЧАЛУ