Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут!

Работа с деревом значений в 1С 8.3 и 8.2 на примерах

Эту статью я хочу написать в виде конкретных примеров по работе с деревом значений в 1С 8.3 и 8.2.

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

Предлагаю сразу начать с примера и получить все записи из справочника «Номенклатура» в виде дерева значений.

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

Проще всего это сделать с помощью запроса. Предлагаю создать внешнюю обработку 1С на управляемых формах, добавить на форму табличное поле и кнопку «Получить дерево». По действию кнопки (точнее команды) выполним простейший запрос.

Вот пример процедуры:

&НаСервере

Процедура ПолучитьДеревоНаСервере()

      Запрос = Новый Запрос;

      Запрос.Текст =

            "ВЫБРАТЬ

            |     Номенклатура.Родитель КАК Родитель,

            |     Номенклатура.Ссылка КАК Номенклатура

            |ИЗ

            |     Справочник.Номенклатура КАК Номенклатура

            |ИТОГИ ПО

            |     Родитель";

ПромДерево = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

      ЗначениеВРеквизитФормы(ПромДерево, "ДеревоЗн");

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

Здесь стоит особенно обратить внимание на два фактора, без которых дерево не сформируется:

  • строка в запросе «ИТОГИ ПО Родитель»
  • и Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);

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

Получите 267 видеоуроков по 1С бесплатно:

Результат вывода данного запроса 1С дерево значений на управляемую форму выглядит следующим образом:

дерево значений 1с 8.3 на управляемой форме

Мы получаем структуру с подчиненными строками. Колонка «Родитель» – это группа, колонка «Номенклатура – это элемент справочника.

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

Обход дерева значений с помощью рекурсии

В основном обход дерева в 1С делается с помощью рекурсии. Даже когда известно, сколько уровней в нем. С рекурсией это проще, всего около шести строк:

&НаКлиенте

Процедура ОбходДерева(Команда)

ОбойтиДеревоНаСервере();

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



&НаСервере

Процедура ОбойтиДеревоНаСервере()

ДеревоЗнач = РеквизитФормыВЗначение("ДеревоЗн");

ОбходДереваДетально(ДеревоЗнач);

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



//Рекурсивная процедура

&НаСервере

Процедура ОбходДереваДетально(ПереданноеДер)

Для Каждого СтрПолученногоДерева Из ПереданноеДер.Строки Цикл

Сообщить(СтрПолученногоДерева.Номенклатура);

Если СтрПолученногоДерева.Строки.Количество()>0 Тогда

ОбходДереваДетально(СтрПолученногоДерева);

КонецЕсли;

КонецЦикла;

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

В результате получим такие сообщения:

обработка

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

При обходе дерева, вы можете выполнять различные действия над ним. Например:

  • подсчет итогов по группам;
  • раскраску строк по нужным параметрам;
  • удалять ненужные строки;
  • можно делать различные отборы;
  • и так далее.

Работать с деревом значений не так уж и трудно. Фактически, это та же таблица значений, но здесь присутствует невидимая колонка «Родитель». Поэтому нет ни каких проблем преобразовать дерево значений в таблицу значений.

P.S. Наша компания предоставляет услуги по настройке, доработке и комплексному внедрению 1С. Закажите бесплатный расчет стоимости вашей задачи на странице Услуги 1С или по телефону +7 (499) 350 29 00.

Остались вопросы?

СПРОСИТЕ в комментариях!

Добавить комментарий:

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


*