Меню

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



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

ДеревоЗначений — это программный объект встроенного языка, позволяющий строить произвольные иерархические наборы данных в памяти компьютера, отображать их в табличном и\или древовидном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать строки).

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

Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.

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

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

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

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

Как и большинство объектов встроенного языка, новая дерево значений может быть создано с помощью оператора Новый :

Свойства и методы дерева значений

Имя Тип Описание
Свойства
Колонки КоллекцияКолонокДереваЗначений содержит коллекцию колонок дерева значений
Строки КоллекцияСтрокДереваЗначений содержит коллекцию корневых строк дерева значений
Методы
ВыбратьСтроку() СтрокаДереваЗначений открывает диалог для интерактивного выбора строки дерева значений
Скопировать() ДеревоЗначений создает новый объект копированием текущего (копируются все колонки и строки)

Колонки дерева значений

Прежде чем начать работу с деревом значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:

Имя Тип Описание
Имя Строка символьный идентификатор колонки, по которому к ней можно обращаться из кода. Может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания
Заголовок Строка строковое представление колонки на форме. Может содержать произвольные символы
ТипЗначения ОписаниеТипов тип значения содержимого ячеек в этой колонке. Свойство ограничивает пространство доступных значений, которые можно указать в данной колонке
Ширина Число ширина колонки на форме (выражается в количестве символов)

Доступ к колонкам производится через свойство Колонки объекта ДеревоЗначений . Для добавления новой колонки используется метод Колонки.Добавить():

Для того, чтобы определить наличие колонки с нужным именем используется метод Колонки.Найти():

Перебор колонок выполняется следующим образом:

Для удаления колонки используется метод Колонки.Удалить():

Методы коллекции колонок дерева значений

Вставить() Вставляет новую колонку в указанную позицию коллекции
Добавить() Добавляет новую колонку в конец коллекции
Индекс() Возвращает индекс колонки в коллекции колонок
Получить() Возвращает колонку по ее индексу
Количество() Возвращает количество колонок в коллекции
Найти() Ищет колонку в коллекции по имени
Очистить() Удаляет все колонки из коллекции
Сдвинуть() Сдвигает колонку влево или вправо
Удалить() Удаляет колонку из коллекции

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

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

В отличие от таблицы значений, доступ к строкам дерева значений производится через свойство Строки объекта ДеревоЗначений или объекта СтрокаДереваЗначений . Каждая строка является узлом иерархии, поэтому обладает следующими свойствами и методами:

Имя Тип Описание
Свойства
Родитель СтрокаДереваЗначений ссылается на строку верхнего уровня. Для корневой строки имеет значение Неопределено
Строки КоллекцияСтрокДереваЗначений содержит коллекцию подчиненных строк
Методы
Владелец() ДеревоЗначений возвращает ссылку на дерево значений, которому принадлежит строка
Уровень() Число возвращает уровень вложенности строки в иерархии дерева. Для строки, не имеющей родителя, уровень будет равен 0 (верхний уровень или корневой уровень). Подчиненная ей строка будет иметь уровень 1 и т.д.

Добавление и удаление строк

Для добавления новой строки используется метод Строки.Добавить(). Метод возвращает объект СтрокаДереваЗначений , с которым доступны дальнейшие манипуляции:

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

Для удаления строки используется метод Строки.Удалить(). Строку можно удалить передав методу либо саму строку, либо ее индекс:

Перебор строк дерева значений

Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :

Читайте также:  Как я одни и те же кроссовки 2 раза покупала И кстати купила бы и в третий раз Детская КАЧЕСТВЕННАЯ обувь за 700 рублей

Поиск строк

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

Поиск возможен даже среди вложенных строк. Внимательно изучите документацию к методам Строки.Найти() и Строки.НайтиСтроки().

Все методы коллекции строк дерева значений:

Вставить() Вставляет строку на указанное место коллекции строк
ВыгрузитьКолонку() Выгружает значения ячеек указанной колонки из текущей коллекции строк в массив значений
Добавить() Добавляет новую строку в коллекцию строк
ЗагрузитьКолонку() Загружает значения из массива в ячейки указанной колонки коллекции строк
Индекс() Возвращает индекс строки дерева значений в коллекции
Итог() Возвращает просуммированный итог по колонке дерева значений
Количество() Возвращает количество строк в коллекции строк
Найти() Выполняет поиск строки по значению
НайтиСтроки() Выполняет поиск строк по указанным параметрам
Очистить() Удаляет все строки из текущей коллекции строк
Получить() Возвращает строку по ее индексу
Сдвинуть() Сдвигает строку вверх или вниз по коллекции строк
Сортировать() Выполняет сортировку строк в коллекции по указанным колонкам
Удалить() Удаляет строку из коллекции строк

Иерархию свойств и типов значений, связанных с деревом значений, схематически можно представить в виде дерева:

Источник

1С 8.3 : Дерево значений в таблицу значений или в табличную часть и обратно

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

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

Для реализации такого механизма в ТЧ был добавлен реквизит “КлючСвязи” (обязательный реквизит) с типом число, куда помещался “НомерСтроки” (стандартный реквизит ТЧ) родителя (верхний уровень). А самый верхний элемент дерева имеет “КлючСвязи” равный 0.

На картинке ниже видно структуру дерева и структуру ТЧ

Нагрузка на сервер осуществляется при окрытии и при сохранении документа. А с деревом работают уже на клиенте.

На рабочей базе обрабатывается около 200 строк в одном документе.

Открытие и сохранение документа происходит моментально. С большем количеством строк не тестировалось.

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

Ниже приведен код преобразования дерева в таблицу и обратно.

Формирование дерева из таблицы значений

Формирование таблицы из дерева

Источник

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

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

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

Рассмотрим работу с деревом значений на примере решения следующей задачи:

Для этого поместим на форму табличное поле.

Элемент формы

Перейдем в его палитру свойств.

Палитра свойств табличного поля

Укажем тип значения «ДеревоЗначений».

Тип значения

Укажем, что это дерево.

Дерево

Теперь добавим в табличное поле колонку «Дата».

Колонка табличного поля

Далее перейдем в палитру свойств колонки «Дата».

Палитра свойств колонки

Установим галку «ОтображатьИерархию».

Отображать иерархию

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

Алгоритм примерно следующий:

Теперь разберем его.

Первое что необходимо сделать, это объявить переменную, содержащую строковое представление месяца.

Потом создадим массив, элементы которого хранят год; месяцы и дни, по которым необходимо вывести.

МассивГод = Новый Массив ; МассивГод . Добавить ( ) ; МассивГод . Добавить ( ) ;

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

Для каждого СтрокаГод Из МассивГод Цикл Дата = Дата ( «» + СтрокаГод + ) ; СтрокаДереваГод = Дерево . Строки . Добавить ( ) ; СтрокаДереваГод . Дата = Год ( Дата ) ; … КонецЦикла ;

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

Для Кол = По Цикл СтрокаДереваМесяц = СтрокаДереваГод . Строки . Добавить ( ) ; СтрокаДереваМесяц . Дата = ПолучитьПредставлениеМесяца ( Месяц ( Дата ) ) ; КоличествоДнейВМесяце = День ( КонецМесяца ( Дата ) ) ; … Дата = ДобавитьМесяц ( Дата , ) ; КонецЦикла ;

Читайте также:  On line учебник HTML с примерами справочник по созданию Web ов

В этом цикле мы используем функцию « ПолучитьПредставлениеМесяца ( Месяц ) », которая возвращает строковое представление месяца по переданному номеру.

Функция ПолучитьПредставлениеМесяца ( НомерМесяца ) ПредставлениеМесяца = СоответствиеМесяцы . Получить ( НомерМесяца ) ; Возврат ? ( ПредставлениеМесяца = Неопределено , НомерМесяца , ПредставлениеМесяца ) ; КонецФункции // ПолучитьПредставлениеМесяца()

Для перехода к следующему месяцу используем встроенную функцию « ДобавитьМесяц ( Дата , ) ».

И, наконец, третий цикл обеспечивает заполнение дней месяца, строки которого является их родителями.

Для КолДней = По КоличествоДнейВМесяце Цикл СтрокаДереваДень = СтрокаДереваМесяц . Строки . Добавить ( ) ; СтрокаДереваДень . Дата = Строка ( КолДней ) ; КонецЦикла;

Чтобы узнать сколько дней в каждом конкретном месяце мы будем использовать встроенную функцию КонецМесяца ( ) , передавая ей, обрабатываемую в текущий момент, дату.

КоличествоДнейВМесяце = День ( КонецМесяца ( Дата ) ) ;

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

СоответствиеМесяцы = Новый Соответствие ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ; СоответствиеМесяцы . Вставить ( , ) ;

Готово. Теперь при открытии формы происходит формирование строк дерева в три уровня.

Пример добавления строк в дерево значенийСкачать готовый пример Работа с деревом значений (часть 1)

Источник

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

Объект «ДеревоЗначений» в 1С 8.3 представляет собой динамический набор значений любого типа. Для такого набора доступны свойства «колонки» и «строки» где каждая строка может иметь набор подчинённых строк, а каждая подчинённая строка набор своих подчинённых строк и т.д. Программная инициализация дерева значений в 1С осуществляется с помощью оператора НОВЫЙ.

ДеревоЗначений = Новый ДеревоЗначений;

Визуально, объект «ДеревоЗначений» похож на дерево групп справочника. К примеру, можно открыть справочник «Номенклатура» любой типовой конфигурации выставив форму списка в «Режим просмотра» — «Дерево».

Полезно понимать, что объект «ДеревоЗначений» схож с объектом «ТаблицаЗначений». Основной отличительный признак наличие дополнительного реквизита «Родитель» у объекта «ДеревоЗначений», с помощью которого и организовывается иерархия и подчинённость.

Дерево значений на управляемой форме

Если появляется необходимость показать данные в виде дерева пользователю, следует на форме создать реквизит с типом «ДеревоЗначений» и определится с составом колонок.

Для отображения на форме добавим реквизит в раздел элементов формы простым перетаскиванием.

Заполнение дерева значений

Заполнить данными дерево значений в 1С можно программно (вручную) или получить из результата запроса. Рассмотрим на примерах оба способа.

Ручное заполнение реквизита формы с типом «ДеревоЗначений»

Результат запроса на форме:

Заполнение дерева значений из результата запроса

Сделаем простой запрос к справочнику «Номенклатура». Результат запроса преобразуем в дерево значений с помощью метода «Выгрузить», установив для его параметра «ТипОбхода» в значение «ПоГруппировкамСИерархией». Для передачи сформированного дерева значений на форму, важно чтобы имена колонок совпадали с именами колонок реквизита на форме.

Результат запроса на форме может выглядеть так:

Поиск строк в дереве значений

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

Метод «Найти()»

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

Для примера найдём строку со значением «Элемент №1» в дереве значений вида:

Из результата видно, что метод вернул первую попавшуюся строку, и поиск был прекращён.

Метод «НайтиСтроки()»

Если необходимо найти все строки со значением «Элемент №1» тогда следует использовать метод НайтиСтроки()

Где — это условия для поиска в виде структуры, а параметр с помощью значений Ложь/Истина контролирует возможность поиска в подчинённых коллекциях.

Очистка дерева значений или строк

Для очистки дерева значений пригодятся методы Очистить(), Удалить(). Пример кода:

С помощью данных методов возможно удаление конкретных строк дерева значений.

. При удалении либо очистки строки все её подчинённые строки удалятся.

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

Обойти все строки дерева значений удобнее всего с помощью рекурсии. Таким способом мы сможем обойти дерево значений любой вложенности.

Как преобразовать дерево значений в таблицу значений

Состав элементов и реквизитов формы:

Используя данный способ можно легко преобразовать таблицу значений обратно в дерево значений. Из примера «ГУИД» это уникальный идентификатор строки, а «Родитель» уникальный идентификатор родителя. Если обратного преобразования не требуется можно исключить использование колонок «Родитель» и «ГУИД».

Источник

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

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

Читайте также:  Таблица анализ коэффициентов ликвидности и показателей платежеспособности

Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».

  1. Дерево значений
  2. Дерево значений на форме
  3. Заполнение дерева значений
  4. Обход дерева значений
  5. Как свернуть и развернуть дерево значений
  6. Как удалить строку и очистить дерево значений
  7. Запрос и дерево значений
  8. Дерево значений в таблицу значений и обратно
  9. Отбор в дереве значений

Дерево значений

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

Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».

Дерево значений на форме

Визуальное представление дерева значений обеспечивает элемент «Табличное поле».

Дерево значений на обычной форме Дерево значений на обычной форме Дерево значений на управляемой форме Дерево значений на управляемой форме

Заполнение дерева значений

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

Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.

Небольшой пример программного заполнения таблицы значений для управляемых форм:

Обход дерева значений

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

Как свернуть и развернуть дерево значений

Сворачивается и разворачивается дерево значений очень просто.

Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).

Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.

Как удалить строку и очистить дерево значений

Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.

Очистить дерево значений:

Точно также можно очистить от подчиненных элементов другую другую строку.

Удалить строку дерева значений не сложнее — нужно только знать ее индекс:

Запрос и дерево значений

Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».

Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:

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

Дерево значений в таблицу значений и обратно

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

Отбор в дереве значений

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

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

Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.

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

Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.

На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.

Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

УжасноПлохоНеплохоХорошо Отлично(оценок: 28, средняя оценка: 4,89 из 5)

Источник