1с уф отображать корень

Обновлено: 04.07.2024

Интерактивное редактирование в табличном поле, отображающем данные в виде дерева

У табличного поля, отображающего данные в виде дерева, имеется ряд особенностей, связанных с редактированием данных. Так, при добавлении в табличное поле строки, новая строка становится подчиненной текущей строке табличного поля, т.е. уровень новой строки увеличивается. Для того, чтобы добавить несколько строк одного уровня иерархии, т.е подчиненных определенной строке табличного поля, необходимо перед добавлением каждой новой строки активизировать родительскую строку, для которой новая строка будет подчиненной. Естественно, если табличное поле не имеет данных, то новая строка будет иметь иерархию верхнего уровня. При копировании строки (например, при нажатии клавиши F9 или при использовании команды " Скопировать " ), новая строка создается на том же уровне иерархии что и текущая. Из сказанного выше следует, что у табличного поля, отображающего данные в виде дерева, не существует стандартных средств, позволяющих добавлять несколько новых строк верхнего уровня иерархии.

Необходимо также отметить, что у иерархических динамических списков (например, списков справочников или списков планов видов характеристик), отображаемых в виде дерева, имеется специальный корневой элемент, так называемый " виртуальный корень " дерева, который является родителем для строк первого уровня иерархии.

В некоторых случаях может потребоваться добавлять в табличное поле, отображающее данные в виде дерева, несколько строк верхнего уровня иерархии.

Для табличного поля, отображающего иерархический динамический список, достаточно активизировать корневой элемент и добавлять строки, подчиненные этому элементу. Для быстрого перехода к родительской строке можно использовать комбинацию клавиш Ctrl+ Вверх, а если табличное поле имеет всего одну колонку, то клавишу " Влево " .

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

Рассмотрим пример программного добавления элементов условного оформления на форму документа. Сделаем так, чтобы возможность редактирования строки таблицы грУсловияОплатыТаблица зависела от реквизита формы АктивныйСчет (тип Булево) и от реквизита таблицы Редактирование (тип Булево) (рис. 1):

1С УФ: Программное добавление элементов условного оформления формы

Рис. 1. Реквизиты формы, от которых будет зависеть возможность редактирования строки таблицы

Если АктивныйСчет = Истина и Объект.грУсловияОплатыТаблица.Редактирование = Ложь, тогда редактирование строки таблицы будет недоступно: установим свойство ТолькоПросмотр = Истина. Можно добавить аналогичный код для случая, когда АктивныйСчет = Истина, Объект.грУсловияОплатыТаблица.Редактирование = Истина, и включить возможность редактирования строки: установить свойство ТолькоПросмотр = Ложь.

Эти условия можно задать в свойстве формы УсловноеОформление (рис. 2 и рис. 3):

1С УФ: Программное добавление элементов условного оформления формы

Рис. 2. Свойство формы УсловноеОформление

1С УФ: Программное добавление элементов условного оформления формы

Рис. 3. Настройка условного оформления

Иногда в коде очищают свойство формы УсловноеОформление и все заданные настройки (рис. 2 и рис. 3) пропадают. В таких случаях можно программно задать нужное условное оформление.

Описание текста процедуры модуля формы для программного добавления элементов условного оформления:

0. Название процедуры может быть любым; ее вызов может быть, например, из обработчика события формы ПриСозданииНаСервере.

1. Очищаем условное оформление формы (для примера, не обязательно).

2. Добавляем новый элемент условного оформления ЭлементОформления.

3. Устанавливаем свойство оформления ТолькоПросмотр = Истина.

4. Добавляем условия (отборы), при выполнении которых будет действовать настройка.

В примере это два условия И, поэтому добавляем группу элементов отбора ГруппаЭлементовОтбора с типом группы ГруппаИ, и два элемента отбора ЭлементОтбора (для АктивныйСчет = Истина и Объект.грУсловияОплатыТаблица.Редактирование = Ложь).

5. Указываем поля, для которых будет действовать настройка.

В нашем примере это будет вся строка таблицы грУсловияОплатыТаблица, поэтому добавляем одно поле ПолеОформления с названием таблицы грУсловияОплатыТаблица.

Данный материал будет полезен и начинающим программистам 1С, и тем, кто хочет сделать свои разработки удобнее для пользователей. Кроме того, рассмотрим некоторые новшества платформы 8.3.10.

Начнём с того, что условимся о некоторых ограничениях:

  • В статье рассматриваются концепции. Поэтому за рамками останутся решения, основанные на библиотеках / внешних компонентах
  • Примеры, приведённые в статье, не претендуют на «Единственно-верное-решение».

В статье последовательно будет рассмотрено: как было в обычных формах, что случилось с приходом управляемых форм и какие сюрпризы нам преподнесла платформа 8.3.10.

Итак, давайте приступим.

Думаю, никого не требуется убеждать, что информирование о ходе выполнения длительного процесса в программе очень важно. Каждый пользователь может привести примеры, когда смотришь в экран и думаешь – «перезагружать не надо ждать» (пишите в комментариях – где вы предпочитаете ставить запятую).

И платформа «1С:Предприятие 8» в этом не исключение – в ней для отображения хода процесса имеется специальный элемент обычных форм «Индикатор» (или вид поля управляемой формы «Поле индикатора»). Давайте рассмотрим нюансы его использования.

Обычные формы

Придумать что-то проще, чем вывод индикатора выполнения процесса в обычных формах – сложная задача. А всё это благодаря тому, что в режиме толстого клиента в «1С:Предприятие 8» по умолчанию отсутствуют границы между клиентской частью и серверной частью. То есть выполнение программного кода и интерфейсных методов происходит, как правило, в одном контексте. Поэтому у разработчика не возникает необходимости задумываться о доступности необходимых свойств, процедур и функций.

Схематично работу «1С:Предприятие» в толстом клиенте можно представить следующим образом:

Рисунок 1. Схема работы «1С:Предприятие» в режиме толстого клиента

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

В связи с этим в любой строчке кода, описывающего длительный процесс, можно оценить объем обработанных данных, получить процент его выполнения и поместить полученное значение в реквизит формы, связанный с выведенным на форму элементом «Индикатор». В этот момент пользователь увидит графическое изменение отображения полосы индикатора в интерфейсе – опять же, благодаря тому, что всё действие происходит на клиенте.

Самый простой «длительный процесс» с выводом процента выполнения в обычном режиме может выглядеть следующим образом:

Рисунок 2. Обычные формы – пример длительной операции с выводом процента выполнения в индикатор

Как говорится – «проще не придумаешь». Никакого «лишнего» кода, всё максимально прозрачно, понятно и самое главное – работает!

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

Управляемые формы

С приходом платформы 8.2 и управляемых форм ситуация с индикатором в корне изменилась. Но дело совсем не в версии платформы и не в новых формах, а в появлении новых видов клиентов для «1С:Предприятие» – тонкого и web-клиента. Схематично работу в управляемом режиме можно представить в следующем виде:

Рисунок 3. Схема работы «1С:Предприятие» в управляемом режиме

Если провести сравнение с обычным режимом, то сразу бросаются следующие отличия:

  • Постоянного соединения клиентской части с базой данных нет – их взаимодействие происходит только через сервер 1С (в файловом режиме вместо сервера 1С выступает некоторая эмуляция, но это уже другая история)
  • Отсутствует постоянное соединение клиентской части с серверной
  • Встроенный язык разделён на клиентский и серверный.
Дополнительно о серверных вызовах можно прочитать в статье Как работает серверный вызов в 1С

Как всё это повлияло на использование индикатора для отображения информации о ходе выполнения длительного процесса? Давайте подробно в этом разберёмся.

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

Получается, что в том или ином виде всегда требуется доступ к базе данных и/или выполнение методов, доступных только на стороне сервера. Для этого на него необходимо передать управление.

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

Получается, что если взять код из предыдущего примера и просто разбить его на клиентскую и серверную часть, то получим долгое подвисание приложения, после чего индикатор резко установится в значение «100%».

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

При таком использовании индикатора от него пользы никакой нет. Поэтому разработчики идут на различные хитрости – выполняют длительные процессы «порционно» с отображением на полосе индикатора значений относительно «порций»; используют динамическое уменьшение скорости движения индикатора в зависимости от времени выполнения процесса; или придумывают другие варианты. Но ни один из них не имеет ничего общего с отображением выполнения конкретного процесса в режиме реального времени.

Именно поэтому при обновлении типовых конфигураций рядом с индикатором мы наблюдаем фразу примерно следующего содержания: «эта операция может занять длительное время – от нескольких минут до нескольких часов». И отчасти поэтому при формировании отчётов крутятся «безликие» круги-индикаторы, которые в виде простой анимации указывают на то, что программа вовсе не зависла.

Кстати, в «1С:Бухгалтерии предприятия, ред. 3.0» разработчики нашли интересное решение (видимо, чтобы бухгалтеры не скучали) – вместо кругов разместили милого котёнка.

Не знаю, как на счет настроения, но понимания о планируемом времени окончания выполнения процесса этот котёнок точно не прибавляет.

Один из вариантов вывода индикатора для отображения хода выполнения длительного процесса заключается в следующем:

  1. Длительная операция запускается в виде фонового задания, в ходе выполнения которого промежуточные результаты помещаются во временное хранилище.
  2. На стороне клиента запускается обработчик ожидания, который с определённой периодичностью опрашивает временное хранилище и выводит данные из него в полосу индикатора.

Программный код будет состоять из двух частей: из кода интерфейсной части (в нашем случае – обработки) и кода общего модуля. Модуль формы обработки будет выглядеть примерно так:

Рисунок 5. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Модуль формы обработки

А общий модуль будет содержать процедуру для запуска в фоновом режиме:

Рисунок 6. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Общий модуль

Для тех, кто захочет проверить работоспособность данного примера, дополнительно приведём скриншот формы обработки:

Рисунок 7. Управляемые формы – пример длительной операции с выводом процента выполнения в индикатор. Форма обработки

Несмотря на то, что индикатор будет «живым», сказать, что эффект достигнут и пример рабочий, на сто процентов нельзя. Потому что между реальным состоянием выполнения процесса и интерфейсом пользователя есть аж целых две «прослойки» – временное хранилище и обработчик ожидания. При таком подходе мало того, что отображение идёт не в режиме реального времени, так ещё и возрастает возможность возникновения различного вида сбоев из-за использования промежуточных звеньев.

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

Платформа «8.3.10»

На самом деле в платформе «1С:Предприятие 8.3.10» касательно индикатора ровным счётом ничего не изменилось. Там есть много других интересных «фишек». Например, система взаимодействий, инкрементальная выгрузка конфигурации в XML, новые режимы основного окна. Но всё это не относится к теме данной статьи. Поэтому, можно было бы уже закончить писать… Если бы не наши «пытливые умы».

Давайте чуть-чуть пристальнее взглянем на систему взаимодействий. Для этого возьмём описание с одного из сайтов фирмы «1С»:

Теперь посмотрим на определение протокола WebSocket на сайте Википедии:

Обратите внимание на ключевые слова: двухсторонняя связь между клиентом и сервером в режиме реального времени! То, чего так не хватало для нормального функционирования индикатора в управляемых формах! Давайте для лучшего понимания взглянем на схему работы «1С:Предприятие» и системы взаимодействий:

Рисунок 8. Схема работы «1С:Предприятие» с системой взаимодействий

Остаётся вопрос: можно ли использовать систему взаимодействий для вывода хода выполнения процесса в индикатора? Ответ – можно конечно, но… Давайте сначала рассмотрим возможность информирования пользователя о ходе выполнения длительного процесса при помощи только системы взаимодействия.

Для этого нам потребуется длительный процесс, выполняемый в фоне:

Рисунок 9. Платформа 8.3.10 – пример длительной операции, выполняющейся в фоновом задании. Модуль формы обработки Рисунок 10. Платформа 8.3.10 – пример длительной операции, выполняющейся в фоновом задании. Общий модуль

Который мы дополним программным кодом работы с системой взаимодействия, достаточным для информирования пользователя о ходе выполнения процедуры в виде оповещений. Для этого нам будет необходимо немного изменить процедуру обработки фонового задания в общем модуле:

Рисунок 11. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в виде оповещения. Общий модуль Рисунок 12. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в виде оповещения. Пример работы

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

Рисунок 13. Платформа 8.3.10 – пример длительной операции с выводом процента выполнения в индикатор. Процедуры обработчика ожидания

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

Связано это с тем, что некоторые методы работы с системой взаимодействия не доступны на клиенте. Но это будет меняться, и разработчики платформы «1С:Предприятие» уже анонсировали, что в версии 8.3.11 на основе системы взаимодействий появится возможность инициирования сервером передачи информации на сторону клиента!

Вместо заключения

В настоящее время эргономика инструмента играет большую роль в дальнейшей его судьбе – будет оно активно использоваться/применяться или его отложат/выкинут.

И если раньше достаточно было показать пользователю куда/какие вводить данные в программе и где/какой он от этого будет видеть результат, то сейчас важно – удобно ли эти данные вносить и как быстро можно получить обратную связь.

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

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

Конечно, не всегда представляется возможным в начале длительной операции предвидеть объем обрабатываемых данных или время выполнения операции. В этих случаях использование индикатора не будет давать пользователю достоверной информации о ходе процесса и его использование становится нецелесообразным. Поэтому порой приходится выкручиваться различными способами, чтобы работа в программе вызывала меньше негативных эмоций – использовать анимированные кольца или милых котят.

Если вас заинтересовала система взаимодействий, и вы хотели бы попробовать с ней поработать, но не знаете, что это такое и с чего начать – читайте следующую статью Система взаимодействий в платформе 8.3.10.

А пока – пишите в комментариях истории из своего опыта по работе с индикаторами!

Анна Викулина

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

Размещение на форме и заполнение дерева значений

Чтобы на управляемой форме вывести дерево значений, необходимо добавить новый реквизит, выбрать нужный тип, добавить колонки и перетащить влево. На вопрос о добавлении колонок ответьте утвердительно, и перед вами предстанет общий вид дерева значений. Чтобы увидеть какие-либо записи, необходимо добавить строки дерева значений 1С с нужными данными.

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

На стороне сервера:

  1. Получение значения реквизита;
  2. Добавление элементов с учетом иерархии;
  3. Возврат значения в элемент формы на клиенте для вывода пользователю.

На стороне клиента:

  1. Получение элементов дерева;
  2. Добавление новых.

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

  • Создаем запрос и указываем нужные нам условия. Важно, чтобы псевдонимы совпадали с наименованием колонок дерева значений на форме;
  • Получаем данные с нужным видом обхода. Если не указывать, то получится не иерархическая таблица значений.

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

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

Работа с заполненным деревом значений

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

На клиентской стороне:

  • Вызываем процедуру, используя в качестве параметров строки дерева;
  • Внутри процедуры в цикле перебираем строки и проверяем наличие вложенных строк внутри каждой из них. Если таковые обнаружились, то снова вызываем эту же процедуру. Таким способом мы последовательно обойдем все строки, какой бы вложенностью не обладало наше дерево значений.

На серверной стороне:

  • Получаем объект с формы;
  • Вызываем процедуру с объектом в качестве параметра;
  • В цикле по каждой строке дерева проверяем количество вложенных элементов и при их наличии снова вызываем процедуру.

Иногда в процессе обхода строк нам может потребоваться удалить что-либо. Для этого используется метод «Удалить(_параметр_)», для которого в качестве параметра может использоваться индекс или непосредственно строка. Так как в процессе обхода вы рассматриваете все строки по отдельности, не составит труда удалить некоторые из них. Будьте внимательны, так как при удалении строки удаляются все вложенные элементы.

Также достаточно распространенной задачей является преобразование дерева значений в таблицу значений. Так как нам нельзя терять иерархию, в таблице будет на 2 поля больше, чем в дереве – добавятся идентификатор и родитель. Заполнить таблицу с сохранением структуры мы сможем с помощью рекурсивной процедуры.

Целиком алгоритм состоит из:

  1. Вызов процедуры с указанием начального идентификатора;
  2. Цикл с добавлением данных в таблицу значений и проверкой на наличие вложенных элементов в дереве в каждой итерации. При их наличии снова начинается вызов рекурсивной процедуры.

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

Также могут случаться ситуации, когда нужно свернуть имеющееся дерево. Для сворачивания конкретной строки можно воспользоваться методом «Свернуть(_Строка_)», аналогичным по синтаксису вышеописанному «Развернуть()». Чтобы полностью свернуть все дерево, придется воспользоваться рекурсивной функцией. Ее код достаточно прост и поддерживает общую методологию работы с деревом значений:

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

Читайте также: