Пример работы с деревом значений в 1С. Часть первая - добавление строк.
Универсальная коллекция значений, которая очень похожа на таблицу значений - это дерево значений. Отличие от таблицы значений заключается в том, что строки могут быть подчинены друг другу, то есть может быть образована некая иерархия.
Рассмотрим работу с деревом значений на примере решения следующей задачи:
Выведем в строки даты (год, месяц, число) за 2013, 2014 годы в три уровня. На первом уровне будет год, на втором месяц и на третьем день.
Для этого поместим на форму табличное поле.
Перейдем в его палитру свойств.
Укажем тип значения «ДеревоЗначений».
Укажем, что это дерево.
Теперь добавим в табличное поле колонку «Дата».
Далее перейдем в палитру свойств колонки «Дата».
Установим галку «ОтображатьИерархию».
Поместим алгоритм формирования строк дерева в процедуру обработки открытия формы.
Алгоритм примерно следующий:
Перем СоответствиеМесяцы;Функция ПолучитьПредставлениеМесяцаНомерМесяца) ПредставлениеМесяца = СоответствиеМесяцы.ПолучитьНомерМесяца); Возврат ?(ПредставлениеМесяца=Неопределено, НомерМесяца, ПредставлениеМесяца);КонецФункции // ПолучитьПредставлениеМесяца() Процедура ПриОткрытии() МассивГод = Новый Массив; МассивГод.Добавить("2013"); МассивГод.Добавить("2014"); Для каждого СтрокаГод Из МассивГод Цикл Дата = Дата(""+СтрокаГод+"0101"); СтрокаДереваГод = Дерево.Строки.Добавить(); СтрокаДереваГод.Дата = Год(Дата); Для Кол = 1 По 12 Цикл СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить(); СтрокаДереваМесяц.Дата = ПолучитьПредставлениеМесяца(Месяц(Дата)); КоличествоДнейВМесяце = День(КонецМесяца(Дата)); Для КолДней = 1 По КоличествоДнейВМесяце Цикл СтрокаДереваДень = СтрокаДереваМесяц.Строки.Добавить(); СтрокаДереваДень.Дата = Строка(КолДней); КонецЦикла; Дата = ДобавитьМесяц(Дата, 1); КонецЦикла; КонецЦикла; КонецПроцедурыСоответствиеМесяцы = Новый Соответствие;СоответствиеМесяцы.Вставить(1, "Январь");СоответствиеМесяцы.Вставить(2, "Февраль");СоответствиеМесяцы.Вставить(3, "Март");СоответствиеМесяцы.Вставить(4, "Апрель");СоответствиеМесяцы.Вставить(5, "Май");СоответствиеМесяцы.Вставить(6, "Июнь");СоответствиеМесяцы.Вставить(7, "Июль");СоответствиеМесяцы.Вставить(8, "Август");СоответствиеМесяцы.Вставить(9, "Сентабрь");СоответствиеМесяцы.Вставить(10, "Октябрь");СоответствиеМесяцы.Вставить(11, "Ноябрь");СоответствиеМесяцы.Вставить(12, "Декабрь");
Теперь разберем его.
Первое что необходимо сделать, это объявить переменную, содержащую строковое представление месяца.
Перем СоответствиеМесяцы;
Потом создадим массив, элементы которого хранят год; месяцы и дни, по которым необходимо вывести.
МассивГод = Новый Массив;МассивГод.Добавить("2013");МассивГод.Добавить("2014");
Первый цикл будет обходить годы, содержащиеся в массиве и добавлять их в наше дерево на первый уровень строк.
Для каждого СтрокаГод Из МассивГод ЦиклДата = Дата(""+СтрокаГод+"0101"); СтрокаДереваГод = Дерево.Строки.Добавить();СтрокаДереваГод.Дата = Год(Дата); …КонецЦикла;
Второй цикл обходит месяцы и заносит их на второй уровень строк, родителями которых являются строки, введенные нами выше (содержащие год).
Для Кол = 1 По 12 Цикл СтрокаДереваМесяц = СтрокаДереваГод.Строки.Добавить(); СтрокаДереваМесяц.Дата = ПолучитьПредставлениеМесяца(Месяц(Дата)); КоличествоДнейВМесяце = День(КонецМесяца(Дата)); … Дата = ДобавитьМесяц(Дата, 1);КонецЦикла;
В этом цикле мы используем функцию «ПолучитьПредставлениеМесяца(Месяц)
», которая возвращает строковое представление месяца по переданному номеру.
Функция ПолучитьПредставлениеМесяца(НомерМесяца) ПредставлениеМесяца = СоответствиеМесяцы.Получить(НомерМесяца); Возврат ?(ПредставлениеМесяца=Неопределено, НомерМесяца, ПредставлениеМесяца);КонецФункции // ПолучитьПредставлениеМесяца()
Для перехода к следующему месяцу используем встроенную функцию «ДобавитьМесяц(Дата, 1)
».
И, наконец, третий цикл обеспечивает заполнение дней месяца, строки которого является их родителями.
Для КолДней = 1 По КоличествоДнейВМесяце Цикл СтрокаДереваДень = СтрокаДереваМесяц.Строки.Добавить(); СтрокаДереваДень.Дата = Строка(КолДней);КонецЦикла;
Чтобы узнать сколько дней в каждом конкретном месяце мы будем использовать встроенную функцию КонецМесяца()
, передавая ей, обрабатываемую в текущий момент, дату.
КоличествоДнейВМесяце = День(КонецМесяца(Дата));
В модуль формы вставим блок, обеспечивающий заполнение универсальной коллекции значений «Соответствие», хранящей строковое представление месяца.
СоответствиеМесяцы = Новый Соответствие;СоответствиеМесяцы.Вставить(1, "Январь");СоответствиеМесяцы.Вставить(2, "Февраль");СоответствиеМесяцы.Вставить(3, "Март");СоответствиеМесяцы.Вставить(4, "Апрель");СоответствиеМесяцы.Вставить(5, "Май");СоответствиеМесяцы.Вставить(6, "Июнь");СоответствиеМесяцы.Вставить(7, "Июль");СоответствиеМесяцы.Вставить(8, "Август");СоответствиеМесяцы.Вставить(9, "Сентабрь");СоответствиеМесяцы.Вставить(10, "Октябрь");СоответствиеМесяцы.Вставить(11, "Ноябрь");СоответствиеМесяцы.Вставить(12, "Декабрь");
Готово. Теперь при открытии формы происходит формирование строк дерева в три уровня.
Скачать готовый пример Работа с деревом значений (часть 1)Вы еще не читали? Вам это будет интересно...