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

Управляемая форма 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. Вагит:

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

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

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

  2. Necropunk:

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

  3. Генрих:

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

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

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

  4. Петр:

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

  5. krt:

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

  6. Виталий:

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

  7. Владимир:

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

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

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

      1. Владимир:

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

  8. Сергей:

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

  9. Romowski:

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

  10. Анечка:

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

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

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

  11. nick:

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

  12. Саша:

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

  13. Васили:

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

  14. Александр:

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

  15. Aleksey:

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

  16. Юлия:

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

  17. Инга:

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

  18. Генрих:

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

  19. repin_mike:

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

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