Управляемая форма 1С 8.2 – работа с деревом значений и таблицей значений. Часть I (Основы)

В данной статье речь пойдет о программном создании дерева значений (таблицы значений) на управляемой форме в управляемом приложении 1С 8.2. Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное что при этом нужно было не забыть так это СоздатьКолонки(). В управляемом приложении 1С 8.2 сделать это не так просто как кажется на первый взгляд.
Обращаю внимание, что ДеревоЗначений доступно только на сервере, в толстом клиенте и внешнем соединение. В данных самой управляемой формы для моделирования дерева используется тип ДанныеФормыДерево. Для преобразования ДеревоЗначений <-> ДанныеФормыДерево используются методы управляемой формы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение(). Для непосредственного отображения дерева используется элемент формы типа ТаблицаФормы связанный через реквизит ПутьКДанным с реквизитом формы типа ДанныеФормыДерево. Если Вам не очень понятна вышеописанная связь объектов, не огорчайтесь, ниже рассмотрим практический пример и все встанет на свои места.

Задача: Имеется дерево значений, необходимо отобразить его на управляемой форме.

Создаем новую внешнюю обработку, добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Создание и заполнение "обычного" объекта прикладного типа ДеревоЗначений,
    // который будет отображен на управляемой форме
    ДеревоОбъект = Новый ДеревоЗначений;
    ДеревоОбъект.Колонки.Добавить("Узел", Новый ОписаниеТипов("Строка"));
    Для к1 = 1 По 3 Цикл
        СтрокаУ1 = ДеревоОбъект.Строки.Добавить();
        СтрокаУ1.Узел = "Узел"+к1;
        Для к2 = 1 По 3 Цикл
            СтрокаУ2 = СтрокаУ1.Строки.Добавить();
            СтрокаУ2.Узел = СтрокаУ1.Узел+к2;
            Для к3 = 1 По 3 Цикл
                СтрокаУ3 = СтрокаУ2.Строки.Добавить();
                СтрокаУ3.Узел = СтрокаУ2.Узел+к3;
            КонецЦикла;
        КонецЦикла;
    КонецЦикла;

    // Создание Реквизита формы типа ДанныеФормыДерево
    МассивДобавляемыхРеквизитов = Новый Массив;
    МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Дерево", 
        Новый ОписаниеТипов("ДеревоЗначений")));
    Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
        МассивДобавляемыхРеквизитов.Добавить(
           Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, "Дерево"));
    КонецЦикла;
    ИзменитьРеквизиты(МассивДобавляемыхРеквизитов);

    // Преобразование объекта прикладного типа ДеревоЗначений 
    // в реквизит управляемой формы (данные формы)
    ЗначениеВРеквизитФормы(ДеревоОбъект, "Дерево");

    // Создание элемента формы типа ТаблицаФормы для отображения дерева
    ЭлементДерево = Элементы.Добавить("Дерево", Тип("ТаблицаФормы"));
    ЭлементДерево.ПутьКДанным = "Дерево";
    ЭлементДерево.Отображение = ОтображениеТаблицы.Дерево;

    Для Каждого Колонка Из ДеревоОбъект.Колонки Цикл
        НовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип("ПолеФормы"), 
            ЭлементДерево);
        НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
        НовыйЭлемент.ПутьКДанным = "Дерево." + Колонка.Имя;
    КонецЦикла;

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

Скачать обработку

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

Комментарии:

  1. repin_mike пишет:

    Добрый день! А подскажите пожалуйста, как применить условное оформление к строкам таким образом созданного дерева?

  2. Генрих пишет:

    Спасибо, очень помогло

  3. Инга пишет:

    Интересная и нужная статья. Спасибо

  4. Юлия пишет:

    Просто спасли! Спасибо автору!

  5. Aleksey пишет:

    Спасибо! Статья ответила на несколько вопросов.

  6. Александр пишет:

    Что про все это слышал, но сам руками не делал, когда пытался – все было как то коряво.. Здесь все на отлично. Пять баллов

  7. Васили пишет:

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

  8. Саша пишет:

    Большое спасибо. Очень хорошая и полезная статья.

  9. nick пишет:

    Спасибо! Не получалось выгрузить результат запроса в дерво на форме.

  10. Анечка пишет:

    Спасибо за хорошую публикацию!!! Очень помогли!!!

    1. Администратор пишет:

      Спасибо Анечка, пользуйтесь на здоровье.

  11. Romowski пишет:

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

  12. Сергей пишет:

    Тоже выскажу огромную благодарность за примеры! Возникла трудность. На форме есть две существующие таблицы формы. Данные в них берутся из существующих реквизитов объекта (ТаблицыЗначений, причём колонки ТЗ’s создаются программно “ЗначениеВРеквизитФормы”). ПриАктивизации строки верхней таблицы активизирую строку нижней таблицы и наоборот (они логически связаны по полю номенклатура). Строка в нижней таблице активизирется без проблем, а вот в верхней устанавливается значение неопределено (причём в самой процедуре установки тоже ТекущаяСтрока не устанавливаеся, устанавливается почему-то только в серверном методе). Может быть спасёте новичка дельным советом? )

  13. Владимир пишет:

    Спасибо за примеры!
    А как потом в коде обращаться к “рукотворному” дереву (реквизиту формы)?
    У меня получается только примерно так:
    ” ДеревоКопия = РеквизитФормыВЗначение(“Дерево”);
    ДеревоДобавитьСтроки(ДеревоКопия, Д);
    ЗначениеВРеквизитФормы(ДеревоКопия, “Дерево”);

    1. Администратор пишет:

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

      1. Владимир пишет:

        В примерах фигурирует “элемент формы ТЗОбъект “.
        Предполагается, что он доступен в процессе кодирования.
        А если он создается программно, как к нему обращаться?
        ["ТЗОбъект"] не получится…

  14. Виталий пишет:

    Огромное спасибо! Реально очень полезная штука :). Помогло.

  15. krt пишет:

    Красавчег! спасибо помог )

  16. Петр пишет:

    Очень полезно! Спасибо.

  17. Генрих пишет:

    Спасибо за подсказку

    1. Администратор пишет:

      Пользуйтесь на здоровье.

  18. Necropunk пишет:

    Спасибо большое, в очень запутанной задаче помогли разобраться.

  19. Вагит пишет:

    Бился полдня над динамическим созданием колонок – сдался. Вероятно, при создании формы можно поступить указанным в статье способом, а вот “на горячую”, когда форма уже открыта, у меня не получилось.

    1. Администратор пишет:

      Никакой разницы нет, колонки прекрасно создаются и при уже открытой форме. Обратите внимание, что данный пример предназначен для управляемых форм 8.2

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