1С 8.3 : Интерактивный расчет итогов в дереве значений в контексте клиента после интерактивного ввода данных пользователем. 1С дерево значений добавить колонку


Пример работы с деревом значений в 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)

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

07.11.2013

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

1c-programist.ru

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

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

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

Разберем как можно для строки дерева значений, которую мы построили в предыдущем примере, установить элемент управленя "Флажок" и вывести картинку.

Для этого в свойствах колонки "Дата" для свойства "ДанныеФлажка" укажем значение "Флажок", а для свойства "ДанныеКартинки" - "Картинка".Флажок и картинка в дереве значений В процедуре "ПриОткрытии()", в блоке добавление строк дерева пропишем следующий код: // +++ Добавляем эти строкиСтрокаДереваГод.Флажок       = 2;СтрокаДереваГод.Картинка    = БиблиотекаКартинок.Календарь;// -- ... // +++ Добавляем эти строкиСтрокаДереваМесяц.Флажок    = 0;// -- ... // +++ Добавляем эти строкиСтрокаДереваДень.Флажок    = 0;СтрокаДереваДень.Картинка    = БиблиотекаКартинок.Картинка;// -- Код процедуры "ПриОткрытии" полностью: Процедура ПриОткрытии()      МассивГод = Новый Массив;   МассивГод.Добавить("2013");   МассивГод.Добавить("2014");      Для каждого СтрокаГод Из МассивГод Цикл            Дата = Дата(""+СтрокаГод+"0101");            СтрокаДереваГод = Дерево.Строки.Добавить();      СтрокаДереваГод.Дата       = Год(Дата);            // +++ Добавляем эти строки      СтрокаДереваГод.Флажок       = 2;      СтрокаДереваГод.Картинка    = БиблиотекаКартинок.Календарь;      // --               Для Кол = 1 По 12 Цикл         СтрокаДереваМесяц          = СтрокаДереваГод.Строки.Добавить();         СтрокаДереваМесяц.Дата       = ПолучитьПредставлениеМесяца(Месяц(Дата));                  // +++ Добавляем эти строки         СтрокаДереваМесяц.Флажок    = 0;         // --                  КоличествоДнейВМесяце = День(КонецМесяца(Дата));         Для КолДней = 1 По КоличествоДнейВМесяце Цикл            СтрокаДереваДень = СтрокаДереваМесяц.Строки.Добавить();            СтрокаДереваДень.Дата       = Строка(КолДней);                        // +++ Добавляем эти строки            СтрокаДереваДень.Флажок    = 0;            СтрокаДереваДень.Картинка    = БиблиотекаКартинок.Картинка;            // --                     КонецЦикла;                  Дата = ДобавитьМесяц(Дата, 1);      КонецЦикла;      КонецЦикла;   КонецПроцедуры По итогу мы получаем дерево значений, в строках которого отображается нужная нам картинка, а также появляется возможность проставлять галки для каждого конкретного элемента дерева. Флажок и картинка в дереве значений

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

14.11.2013

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

1c-programist.ru

1С 8.3 : Интерактивный расчет итогов в дереве значений в контексте клиента после интерактивного ввода данных пользователем

//события

&НаКлиенте

Процедура ДеревоРаботПередНачаломИзменения(Элемент, Отказ)

Если ПустаяСтрока(ПолучитьИмяКолонкиЧисловогоПоказателя()) Тогда

Возврат;

КонецЕсли;

Отказ=Элемент.ТекущиеДанные.ПолучитьЭлементы().Количество()>0;//значение предков редактировать нельзя

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

 

 

&НаКлиенте

Процедура ДеревоРаботПриАктивизацииЯчейки(Элемент)

ЗаполнитьТекущееЗначение();

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

 

&НаКлиенте

Процедура ДеревоРаботПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

ЗаполнитьТекущееЗначение();

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

 

&НаКлиенте

Процедура ДеревоРаботВнедрениеПриИзменении(Элемент)

ЭлементТекущиеДанные=Элементы.ДеревоРабот.ТекущиеДанные;

Если Неопределено=ЭлементТекущиеДанные Тогда

Возврат;

КонецЕсли;

//<<считаем сумму по колонкам

ИмяЭлемента=ПолучитьИмяКолонкиЧисловогоПоказателя();

Отказ=ЭлементТекущиеДанные.ПолучитьЭлементы().Количество()>0;

Если Отказ Тогда

ЭлементТекущиеДанные[ИмяЭлемента]=ТекущееЗначениеПоказателя;//итоговые строки не даем редактировать пользователю - восстанавливаем значение, которое запомнили перед изменением пользователем

Иначе

Если Не ПустаяСтрока(ИмяЭлемента) Тогда

ЭтиДанныеРекурсия=ЭлементТекущиеДанные;

Пока Истина Цикл

ЭтотРодитель=ЭтиДанныеРекурсия.ПолучитьРодителя();

Если Неопределено=ЭтотРодитель Тогда

Прервать;

КонецЕсли;

ЭтотРодитель[ИмяЭлемента]=ЭтотРодитель[ИмяЭлемента]-ТекущееЗначениеПоказателя+ЭтиДанныеРекурсия[ИмяЭлемента];//считаем сумму с поправкой на прошлое изменение

ЭтиДанныеРекурсия=ЭтотРодитель;

Пока Истина Цикл//тут считаем сумму для всех предков

ЭтотРодитель=ЭтиДанныеРекурсия.ПолучитьРодителя();

Если Неопределено=ЭтотРодитель Тогда

Прервать;

КонецЕсли;

ИтоговаяСумма=0;

Для каждого ЭтотЭлемент Из ЭтотРодитель.ПолучитьЭлементы() Цикл

ИтоговаяСумма=ИтоговаяСумма+ЭтотЭлемент[ИмяЭлемента];

КонецЦикла;

ЭтотРодитель[ИмяЭлемента]=ИтоговаяСумма;

ЭтиДанныеРекурсия=ЭтотРодитель;

КонецЦикла;

Прервать;

КонецЦикла;

КонецЕсли;

КонецЕсли;

//>>посчитали

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

 

 

 

 

//вспомогательная процедура

&НаКлиенте

Процедура ЗаполнитьТекущееЗначение()

ИмяЭлемента=ПолучитьИмяКолонкиЧисловогоПоказателя();

Если ПустаяСтрока(ИмяЭлемента) Тогда

Возврат;

КонецЕсли;

ТекущееЗначениеПоказателя=Элементы.ДеревоРабот.ТекущиеДанные[ИмяЭлемента];

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

zdst.net