- Работа с деревом значений в 1С 8.3 на примерах
- Создание дерева значений в 1С
- Обход дерева значений с помощью рекурсии
- Дерево значений в 1С 8.3
- Дерево значений на управляемой форме
- Заполнение дерева значений
- Ручное заполнение реквизита формы с типом «ДеревоЗначений»
- Заполнение дерева значений из результата запроса
- Поиск строк в дереве значений
- Метод «Найти()»
- Метод «НайтиСтроки()»
- Очистка дерева значений или строк
- Обход дерева значений в 1С
- Как преобразовать дерево значений в таблицу значений
- Работаем с деревом значений программно
- Создание дерева значений
- Свойства и методы дерева значений
- Колонки дерева значений
- Методы коллекции колонок дерева значений
- Строки дерева значений
- Добавление и удаление строк
- Перебор строк дерева значений
- Поиск строк
- Все методы коллекции строк дерева значений:
Работа с деревом значений в 1С 8.3 на примерах
Эту статью я хочу написать в виде конкретных примеров по работе с деревом значений в 1С 8.3 и 8.2.
Дерево значений представляет из себя некую структуру с иерархией. У каждой строки дерева значений может быть сколько угодно подчиненных строк.
Предлагаю сразу начать с примера и получить все записи из справочника «Номенклатура» в виде дерева значений.
Создание дерева значений в 1С
Проще всего это сделать с помощью запроса. Предлагаю создать внешнюю обработку 1С на управляемых формах, добавить на форму табличное поле и кнопку «Получить дерево». По действию кнопки (точнее, команды) выполним простейший запрос.
Вот пример процедуры:
Здесь стоит особенно обратить внимание на два фактора, без которых дерево не сформируется:
- строка в запросе «ИТОГИ ПО Родитель»
- и Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Если не указать правильно вид обхода результата выборки по запросу, то мы получим обычную таблицу значений.
Результат вывода данного запроса 1С дерево значений на управляемую форму выглядит следующим образом:
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания — попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Мы получаем структуру с подчиненными строками. Колонка «Родитель» – это группа, колонка «Номенклатура – это элемент справочника.
Теперь, на мой взгляд, самое интересное. Как организовать обход дерева значений, если мы заранее не знаем, сколько уровней в нем.
Обход дерева значений с помощью рекурсии
В основном обход дерева в 1С делается с помощью рекурсии. Даже когда известно, сколько уровней в нем. С рекурсией это проще, всего около шести строк:
В результате получим такие сообщения:
Пример данной обработки для управляемых форм можно скачать по ссылке. С помощью аналогичного кода 1С возможно преобразовать дерево значений в таблицу значений.
При обходе дерева Вы можете выполнять различные действия над ним. Например:
- подсчет итогов по группам;
- раскраску строк по нужным параметрам;
- удалять ненужные строки;
- можно делать различные отборы;
- и так далее.
Работать с деревом значений не так уж и трудно. Фактически это та же таблица значений, но здесь присутствует невидимая колонка «Родитель». Поэтому нет никаких проблем с преобразованием дерева значений в таблицу значений.
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
Источник
Дерево значений в 1С 8.3
Объект «ДеревоЗначений» в 1С 8.3 представляет собой динамический набор значений любого типа. Для такого набора доступны свойства «колонки» и «строки» где каждая строка может иметь набор подчинённых строк, а каждая подчинённая строка набор своих подчинённых строк и т.д. Программная инициализация дерева значений в 1С осуществляется с помощью оператора НОВЫЙ.
ДеревоЗначений = Новый ДеревоЗначений;
Визуально, объект «ДеревоЗначений» похож на дерево групп справочника. К примеру, можно открыть справочник «Номенклатура» любой типовой конфигурации выставив форму списка в «Режим просмотра» — «Дерево».
Полезно понимать, что объект «ДеревоЗначений» схож с объектом «ТаблицаЗначений». Основной отличительный признак наличие дополнительного реквизита «Родитель» у объекта «ДеревоЗначений», с помощью которого и организовывается иерархия и подчинённость.
Дерево значений на управляемой форме
Если появляется необходимость показать данные в виде дерева пользователю, следует на форме создать реквизит с типом «ДеревоЗначений» и определится с составом колонок.
Для отображения на форме добавим реквизит в раздел элементов формы простым перетаскиванием.
Заполнение дерева значений
Получите понятные самоучители по 1С бесплатно:
Заполнить данными дерево значений в 1С можно программно (вручную) или получить из результата запроса. Рассмотрим на примерах оба способа.
Ручное заполнение реквизита формы с типом «ДеревоЗначений»
Результат запроса на форме:
Заполнение дерева значений из результата запроса
Сделаем простой запрос к справочнику «Номенклатура». Результат запроса преобразуем в дерево значений с помощью метода «Выгрузить», установив для его параметра «ТипОбхода» в значение «ПоГруппировкамСИерархией». Для передачи сформированного дерева значений на форму, важно чтобы имена колонок совпадали с именами колонок реквизита на форме.
Результат запроса на форме может выглядеть так:
Поиск строк в дереве значений
Для поиска строк в дереве значений существует два способа, точнее говоря, метода.
Метод «Найти()»
Возвращает строку дерева значений, если строка не найдена, вернёт «Неопределено». Поиск можно ограничивать, указав в параметре нужные колонки для поиска. Также расширять, указав для параметра значение «Истина», тогда в поиске будут участвовать строки подчинённых коллекций.
Для примера найдём строку со значением «Элемент №1» в дереве значений вида:
Из результата видно, что метод вернул первую попавшуюся строку, и поиск был прекращён.
Метод «НайтиСтроки()»
Если необходимо найти все строки со значением «Элемент №1» тогда следует использовать метод НайтиСтроки()
Где — это условия для поиска в виде структуры, а параметр с помощью значений Ложь/Истина контролирует возможность поиска в подчинённых коллекциях.
Очистка дерева значений или строк
Для очистки дерева значений пригодятся методы Очистить(), Удалить(). Пример кода:
С помощью данных методов возможно удаление конкретных строк дерева значений.
. При удалении либо очистки строки все её подчинённые строки удалятся.
Обход дерева значений в 1С
Обойти все строки дерева значений удобнее всего с помощью рекурсии. Таким способом мы сможем обойти дерево значений любой вложенности.
Как преобразовать дерево значений в таблицу значений
Состав элементов и реквизитов формы:
Используя данный способ можно легко преобразовать таблицу значений обратно в дерево значений. Из примера «ГУИД» это уникальный идентификатор строки, а «Родитель» уникальный идентификатор родителя. Если обратного преобразования не требуется можно исключить использование колонок «Родитель» и «ГУИД».
Источник
Работаем с деревом значений программно
ДеревоЗначений — это программный объект встроенного языка, позволяющий строить произвольные иерархические наборы данных в памяти компьютера, отображать их в табличном и\или древовидном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать строки).
Как и таблица значений, дерево состоит из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Однако, в отличие от таблицы значений, строки дерева значений могут иметь подчиненные строки любой глубины вложенности.
Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.
Пересечения строк и колонок образуют ячейки, в которых содержатся значения. Тип значения определяется типом значения колонки.
Дерево значений является полностью динамическим объектом, т.е. Вы можете манипулировать не только строками дерева, добавляя и удаляя их, но и колонками.
Дерево значений может использоваться явно при создании в коде необходимого количества переменных типа ДеревоЗначений , либо неявно: при добавлении элемента управления ТабличноеПоле на обычную форму, и ТаблицаФормы — на управляемую. Здесь мы рассмотрим только программную работу с деревом значений.
Создание дерева значений
Как и большинство объектов встроенного языка, новая дерево значений может быть создано с помощью оператора Новый :
Свойства и методы дерева значений
Имя | Тип | Описание |
---|---|---|
Свойства | ||
Колонки | КоллекцияКолонокДереваЗначений | содержит коллекцию колонок дерева значений |
Строки | КоллекцияСтрокДереваЗначений | содержит коллекцию корневых строк дерева значений |
Методы | ||
ВыбратьСтроку() | СтрокаДереваЗначений | открывает диалог для интерактивного выбора строки дерева значений |
Скопировать() | ДеревоЗначений | создает новый объект копированием текущего (копируются все колонки и строки) |
Колонки дерева значений
Прежде чем начать работу с деревом значений, необходимо создать структуру колонок. Каждая колонка характеризуется следующими свойствами:
Имя | Тип | Описание |
---|---|---|
Имя | Строка | символьный идентификатор колонки, по которому к ней можно обращаться из кода. Может содержать только алфавитные символы, цифры и знаки подчеркивания. Причем, начинаться имя колонки может только с буквы или символа подчеркивания |
Заголовок | Строка | строковое представление колонки на форме. Может содержать произвольные символы |
ТипЗначения | ОписаниеТипов | тип значения содержимого ячеек в этой колонке. Свойство ограничивает пространство доступных значений, которые можно указать в данной колонке |
Ширина | Число | ширина колонки на форме (выражается в количестве символов) |
Доступ к колонкам производится через свойство Колонки объекта ДеревоЗначений . Для добавления новой колонки используется метод Колонки.Добавить():
Для того, чтобы определить наличие колонки с нужным именем используется метод Колонки.Найти():
Перебор колонок выполняется следующим образом:
Для удаления колонки используется метод Колонки.Удалить():
Методы коллекции колонок дерева значений
Вставить() | Вставляет новую колонку в указанную позицию коллекции |
Добавить() | Добавляет новую колонку в конец коллекции |
Индекс() | Возвращает индекс колонки в коллекции колонок |
Получить() | Возвращает колонку по ее индексу |
Количество() | Возвращает количество колонок в коллекции |
Найти() | Ищет колонку в коллекции по имени |
Очистить() | Удаляет все колонки из коллекции |
Сдвинуть() | Сдвигает колонку влево или вправо |
Удалить() | Удаляет колонку из коллекции |
Строки дерева значений
С колонками разобрались. Давайте теперь разберемся со строками. Строки дерева значений можно программно добавлять и удалять, перемещать и сортировать, а также выполнять операции поиска и отбора.
В отличие от таблицы значений, доступ к строкам дерева значений производится через свойство Строки объекта ДеревоЗначений или объекта СтрокаДереваЗначений . Каждая строка является узлом иерархии, поэтому обладает следующими свойствами и методами:
Имя | Тип | Описание |
---|---|---|
Свойства | ||
Родитель | СтрокаДереваЗначений | ссылается на строку верхнего уровня. Для корневой строки имеет значение Неопределено |
Строки | КоллекцияСтрокДереваЗначений | содержит коллекцию подчиненных строк |
Методы | ||
Владелец() | ДеревоЗначений | возвращает ссылку на дерево значений, которому принадлежит строка |
Уровень() | Число | возвращает уровень вложенности строки в иерархии дерева. Для строки, не имеющей родителя, уровень будет равен 0 (верхний уровень или корневой уровень). Подчиненная ей строка будет иметь уровень 1 и т.д. |
Добавление и удаление строк
Для добавления новой строки используется метод Строки.Добавить(). Метод возвращает объект СтрокаДереваЗначений , с которым доступны дальнейшие манипуляции:
И только теперь мы можем заполнить строку данными. Для этого обращаемся к ячейкам строки, указывая идентификаторы колонок через точку:
Для удаления строки используется метод Строки.Удалить(). Строку можно удалить передав методу либо саму строку, либо ее индекс:
Перебор строк дерева значений
Для перебора строк удобнее всего использовать оператор цикла Для Каждого . В редких случаях оправдано применение цикла Для :
Поиск строк
Поиск в дереве значений можно выполнять не только по значению в колонке (в этом случае будет возвращена первая найденная строка), но и по набору свойств (в этом случае возвращается массив строк).
Поиск возможен даже среди вложенных строк. Внимательно изучите документацию к методам Строки.Найти() и Строки.НайтиСтроки().
Все методы коллекции строк дерева значений:
Вставить() | Вставляет строку на указанное место коллекции строк |
ВыгрузитьКолонку() | Выгружает значения ячеек указанной колонки из текущей коллекции строк в массив значений |
Добавить() | Добавляет новую строку в коллекцию строк |
ЗагрузитьКолонку() | Загружает значения из массива в ячейки указанной колонки коллекции строк |
Индекс() | Возвращает индекс строки дерева значений в коллекции |
Итог() | Возвращает просуммированный итог по колонке дерева значений |
Количество() | Возвращает количество строк в коллекции строк |
Найти() | Выполняет поиск строки по значению |
НайтиСтроки() | Выполняет поиск строк по указанным параметрам |
Очистить() | Удаляет все строки из текущей коллекции строк |
Получить() | Возвращает строку по ее индексу |
Сдвинуть() | Сдвигает строку вверх или вниз по коллекции строк |
Сортировать() | Выполняет сортировку строк в коллекции по указанным колонкам |
Удалить() | Удаляет строку из коллекции строк |
Иерархию свойств и типов значений, связанных с деревом значений, схематически можно представить в виде дерева:
Источник