ICQ: 378 171 273 Skype: programict-1c info@1c-programist.ru

Пример работы с деревом значений в 1С. Часть первая - добавление строк.

Работа с деревом значений немного отличается от работы с таблицей значений, в частности это видно на операции добавления строк. Смотрим на примере.
Пример работы с деревом значений в 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)

Вы еще не читали? Вам это будет интересно...

К списку новостей и статей

Написать мне