Как сделать иерархию в табличной части 1с
Дерево значений представляет из себя некую структуру с иерархией. Каждая строка имеет свойства «Родитель» и «Строки». У каждой строки может быть сколько угодно подчиненных строк. При этом такие операции как поиск, сортировка, подсчет итогов можно проводить с учетом уровня иерархии и подчиненных строк.
Программное создание дерева значений
Как уже упоминалось выше, каждая строка имеет свойство Строки , которое содержит коллекцию дочерних строк. И сам объект ДеревоЗначений имеет свойство Строки , которое содержит коллекцию строк верхнего уровня.
- Добавляет колонку в конец коллекции колонок дерева значений.
- Возвращаемое значение: КолонкаДереваЗначений .
- Добавляет строку в конец коллекции строк данного уровня дерева значений.
- Возвращаемое значение: СтрокаДереваЗначений .
Заполнить табличное поле на форме
Визуальное представление дерева значений на форме обеспечивает элемент Таблица .
Пример программного заполнения дерева значений для управляемых форм:
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом Выгрузить() и указать параметр ТипОбхода отличным от того, что стоит по умолчанию, т.е. ПоГруппировкам или ПоГруппировкамСИерархией .
Свернуть и развернуть строки дерева значений
Свернуть и развернуть дочерние строки элемента дерева значений можно с помощью методов Свернуть() и Развернуть() .
- Сворачивает узел в указанной строке дерева.
- ИдектификаторСтроки — идентификатор строки таблицы.
- Разворачивает узел в указанной строке дерева.
- ИдектификаторСтроки — идентификатор строки таблицы.
- СПодчиненными — определяет необходимость раскрытия подчиненных узлов.
- Получает коллекцию элементов дерева верхнего уровня.
- Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева .
- Получает коллекцию дочерних элементов.
- Возвращаемое значение: ДанныеФормыКоллекцияЭлементовДерева .
Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:
- ДанныеФормыСтруктура — содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект .
- ДанныеФормыКоллекция — это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
- ДанныеФормыСтруктураСКоллекцией — это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
- ДанныеФормыДерево — объект предназначен для хранения иерархических данных.
Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).
Удалить строку и очистить дерево значений
Поиск в дереве значений
Среди наиболее часто используемых методов стоит отметить метод Найти() коллекции строк дерева значений.
- Значение (обязательный, тип Произвольный ). Искомое значение.
- Колонки (необязательный, тип Строка ). Список имен колонок, в которых будет осуществляться поиск, разделенных запятыми. Если параметр не указан, поиск осуществляется по всем колонкам дерева. Значение по умолчанию — Пустая строка.
- ВключатьПодчиненные (необязательный, тип Булево ). Определяет, будут ли участвовать в поиске строки подчиненных коллекций (если таковые имеются). Если Истина — строки подчиненных коллекций участвуют в поиске. Значение по умолчанию — Ложь .
Метод осуществляет поиск значения в дереве в указанных колонках коллекции строк дерева значений. Возвращает строку (тип СтрокаДереваЗначений ), которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено . Предназначен для поиска уникальных значений.
Дерево значений является одним из популярных типов данных, часто встречающихся на формах и конфигурации. Важным его преимуществом является заложенная платформой иерархичность, которой удобно воспользоваться в некоторых ситуациях, например, осуществить поиск по определенной группе элементов или получить отдельные итоговые суммы в различных категориях. Дерево значений в 1С – достаточно эффективный инструмент, достойный, чтобы разработчики тратили на его изучение свое время.
Размещение на форме и заполнение дерева значений
Чтобы на управляемой форме вывести дерево значений, необходимо добавить новый реквизит, выбрать нужный тип, добавить колонки и перетащить влево. На вопрос о добавлении колонок ответьте утвердительно, и перед вами предстанет общий вид дерева значений. Чтобы увидеть какие-либо записи, необходимо добавить строки дерева значений 1С с нужными данными.
Существует несколько способов заполнения дерева значений нужными нам свойствами с определенной иерархией. Самый простой вариант – заполнить вручную, последовательно добавляя элементы и внимательно самостоятельно соблюдая иерархию. Естественно, при большом количестве элементов данный вариант не должен рассматриваться разработчиками 1С. Данный способ вывода информации состоит из следующих операторов:
На стороне сервера:
- Получение значения реквизита;
- Добавление элементов с учетом иерархии;
- Возврат значения в элемент формы на клиенте для вывода пользователю.
На стороне клиента:
- Получение элементов дерева;
- Добавление новых.
Таким способом можно оформить на управляемой форме 1С небольшое дерево значений или простую иерархию, используя цикл. Однако часто возникает задача представить на форме сложный иерархический справочник из базы данных. И здесь на помощь придет помещение результата запроса в дерево на форме. Алгоритм достаточно прост и логичен:
- Создаем запрос и указываем нужные нам условия. Важно, чтобы псевдонимы совпадали с наименованием колонок дерева значений на форме;
- Получаем данные с нужным видом обхода. Если не указывать, то получится не иерархическая таблица значений.
При многократном использовании управляемой формы приходится очищать реквизиты. Не является исключением и дерево значений, если нам нужно получать актуальную информацию. Полностью очистить наш реквизит можно различными способами без особых усилий программиста:
Вышеперечисленные действия достаточно просты и не требуют усилий. Намного сложнее действия с конкретными строками, которые тоже необходимо использовать в работе. Ведь зачастую мы не будем иметь ни малейшего понятия о количестве строк в дереве, его иерархии, ее глубине и пр. Именно корректная работа с данными произвольной структуры требуется от качественно разработанной функциональности решения для анализа и обработки информации дерева значений.
Работа с заполненным деревом значений
В первую очередь, нужно научиться работать с данными, получая их из дерева. Для этого придется написать процедуру обхода строк дерева значений. Данные можно получить на сервере или клиенте, причем разница в алгоритмах будет небольшая. Ниже представлен алгоритм обхода дерева с краткими пояснениями операторов:
На клиентской стороне:
- Вызываем процедуру, используя в качестве параметров строки дерева;
- Внутри процедуры в цикле перебираем строки и проверяем наличие вложенных строк внутри каждой из них. Если таковые обнаружились, то снова вызываем эту же процедуру. Таким способом мы последовательно обойдем все строки, какой бы вложенностью не обладало наше дерево значений.
На серверной стороне:
- Получаем объект с формы;
- Вызываем процедуру с объектом в качестве параметра;
- В цикле по каждой строке дерева проверяем количество вложенных элементов и при их наличии снова вызываем процедуру.
Иногда в процессе обхода строк нам может потребоваться удалить что-либо. Для этого используется метод «Удалить(_параметр_)», для которого в качестве параметра может использоваться индекс или непосредственно строка. Так как в процессе обхода вы рассматриваете все строки по отдельности, не составит труда удалить некоторые из них. Будьте внимательны, так как при удалении строки удаляются все вложенные элементы.
Также достаточно распространенной задачей является преобразование дерева значений в таблицу значений. Так как нам нельзя терять иерархию, в таблице будет на 2 поля больше, чем в дереве – добавятся идентификатор и родитель. Заполнить таблицу с сохранением структуры мы сможем с помощью рекурсивной процедуры.
Целиком алгоритм состоит из:
- Вызов процедуры с указанием начального идентификатора;
- Цикл с добавлением данных в таблицу значений и проверкой на наличие вложенных элементов в дереве в каждой итерации. При их наличии снова начинается вызов рекурсивной процедуры.
Зачастую пользователям бывает мало просто добавить дерево значений в 1С на управляемую форму. Постоянно поступают запросы, чтобы была возможность посмотреть всю структуру. Для этого придется развернуть дерево значений прямо на глазах у пользователя. В 1С это можно сделать, обойдя в цикле все строки и воспользовавшись одним из их методов:
Также могут случаться ситуации, когда нужно свернуть имеющееся дерево. Для сворачивания конкретной строки можно воспользоваться методом «Свернуть(_Строка_)», аналогичным по синтаксису вышеописанному «Развернуть()». Чтобы полностью свернуть все дерево, придется воспользоваться рекурсивной функцией. Ее код достаточно прост и поддерживает общую методологию работы с деревом значений:
Созданный в платформе 1С тип «Дерево значений» отлично подходит для задач отображения иерархических списков и не только. Пользуясь им грамотно, можно существенно сэкономить время и удовлетворить требования пользователей по визуализации необходимых им данных, легко загрузив данные в дерево, обойти их и отразить развернутый список на управляемой форме.
1) Идея проста – выбираем запросом элементы, не являющиеся папками, а всю иерархию нам построит запрос. Тут сразу начинаются неожиданности. Какую конструкцию использовать: ИЕРАРХИЯ или ТОЛЬКО ИЕРАРХИЯ? Вроде логично было бы ТОЛЬКО ИЕРАРХИЯ, т.к. итоги на уровне элементов нам не нужны (будут дубли). Заглядываем в справку: "ИЕРАРХИЯ. В результате будут рассчитаны итоги по контрольным точкам и итоги по иерархии для контрольных точек . При необходимости можно рассчитать итоги только значений по иерархии, без расчета итогов в контрольных точках. Для этого перед ключевым словом ИЕРАРХИЯ нужно указать ключевое слово ТОЛЬКО."
Для однозначного понимания моих объяснений введу несколько "терминов", которыми буду пользоваться. Все листья дерева буду называть элементами. Узлы дерева, которые содержат только элементы – нижние папки, Остальные узлы, которые содержат хотя бы одну нижнюю папку – верхние папки.
Для ИЕРАРХИЯ – все логично: разбираем дерево итогов по иерархии для папок. У всех папок тип – ТипЗаписиЗапроса.ИтогПоИерархии. У элементов тип – ТипЗаписиЗапроса.ИтогПоГруппировке. Внутри группировки одна запись того же элемента но уже с типом ТипЗаписиЗапроса.ДетальнаяЗапись. Все как заявлено. Но если выгрузить в дерево, дубль пропадает!
Либо сформировать вручную
Для ТОЛЬКО ИЕРАРХИЯ все немного не так, как ожидалось. Верхние папки – ТипЗаписиЗапроса.ИтогПоИерархии, нижние – ТипЗаписиЗапроса.ИтогПоГруппировке. Внутри элементы с типом – ТипЗаписиЗапроса.ДетальнаяЗапись. НО, если верхняя папка содержит элементы, все они будут помещены в еще в одну вложенную группу с типом ТипЗаписиЗапроса.ИтогПоГруппировке. Поэтому выгрузить() приводит к дублированию! Цель такого дублирования думаю в том, чтобы все элементы обязательно содержались в папке с ТипЗаписиЗапроса.ИтогПоГруппировке, чтобы мы могли обходить выборку ОбходРезультатаЗапроса.ПоГруппировкам. Поэтому, если использовать ТОЛЬКО ИЕРАРХИЯ, лучше обойти выборку и сформировать ручками дерево, устраняя дублирование. При обходе нужно обязательно указывать второй параметр "Группировки". Привожу обход для ТОЛЬКО ИЕРАРХИЯ
Недостатки такого метода очевидны. Все папки вычисляет запрос, и мы не можем как-то их использовать. Например, при соединении с другой таблицей по номенклатуре, склеются только элементы, а на уровне папок нам доступны только вычисления в итогах. Проблема производительности здесь не рассматривается.
2) Для решения этой проблемы необходимо выбрать папки в запросе. Такой запрос не получиться выгрузить в дерево, но, если мы будем использовать в запросе УПОРЯДОЧИТЬ ПО . ИЕРАРХИЯ, а также выберем в запросе родителя, то обход дерева станет простым, мы будем обходить выборку в цикле и прицеплять следующий элемент к текущему или одному из его родителей. К кому цеплять покажет выбранное поле родитель.
Рассмотрим задачу получения только иерархии по набору элементов. Для решения задачи выберем для элементов все папки, в которых они содержатся, затем замыканием вычислим всех родителей этих папок, ну и далее выборка с обходом по 2 методу.
Здравствуйте, подскажите будьте добры. Имеется Справочник_1 с табличной частью, в которую выбираются элементы из некоторого Справочник_2. Этот Справочник_2 имеет иерархию(группы и т.д.). Теперь вопрос: Как для элемента Справочник_1 при заполнении ТЧ сделать так, чтобы с одной стороны это была ТЧ с ее быстрым редактированием и прочим, а с другой стороны чтобы визуально видеть структуру выбранных элементов в соответствии с их иерархией в Справочник_2. Т.е. допустим при клацаньи на добавление элемента в ТЧ открывается маленькая форма выбора например, там выбирается необходимый элемент Справочник_2, и по нажатию "ОК" у меня вместо ТЧ это все выглядело как условно говоря как Справочник_2, открытый с отбором выбранных в ТЧ элементов и с сохранением визуальной иерархии.
Подскажите идеи пожалуйста, что-то с ходу не соображу никак, решил посоветоваться ))
(2) alljoke, да сходу не получится, я хочу чтобы в определенном месте формы, где располагается табличная часть (я просто хз тут, может ее придется сделать скрытой/неявной и на форме будет не ТЧ), в ней при добавлении нового элемента добавляются они из некоторого справочника с группами, и я при добавлении нового элемента в такую "ТЧ" хочу чтобы он добавился не последним, а "стал на свое место" в соответствии с его иерархией в пред справочнике.
Т.е. вместо
ТЧ
ЭлементСправочника№1|200|14
ЭлементСправочника№2|220|14
ЭлементСправочника№3|200|16
Было
ТЧ
(+)ГруппаИзначальная
(+)ГруппаВложеннаяПервая
ЭлементСправочника№1|200|14
ЭлементСправочника№2|220|14
(+)ГруппаВложеннаяТретья
ЭлементСправочника№3|200|16
где (+) - соответственно плюсик как во всех справочниках, раскрывающеся/закрывающийся.
Можно конечно (как и сделано сейчас) сделать Справочник_2 подчиненным Справочнику_1 и при просмотре открывать Справочник_2 с отбором в соответствии с ссылками на выбранные элементы, но это калечно + элементы удаляются через пометку + долго и т.д. И вообще ересь. Зато структуру выбранных видно. А мне надо в ТЧ ИЛИ ОсобенномЭлементе сохранить отображение иерархии с сохранением функциональности быстрого редактирования)
Всем добрый вечер. Подскажите пожалуйста, вот есть у меня табличная часть с реквизитам Родитель и Номенклатура,оба типа СправочникСсылка.Номенклатура, как сделать так, чтобы в связанном с табличной частью табличном поле отобразить иерархию по родителям. ну на всякий случай пример:
+ родитель1
- номенклатура1
- номенклатура2
+ родитель2
- номенклатура3
- номенклатура4
на форму вешаешь дерево которой заполняешь табличной частью измененйи в дереве также обратно фиксируешь в табличную часть. Работа непростая с нулевыми знаниями
Да, знаний, к сожалению, не так много, пока только учусь, вроде со всем сам разбирался, но тут конечно в ступор попал. По поводу запроса думал уже, но там тоже не очень простая реализация будет при добавлении/удалении элемента.
Я немного неправильно наверно написал, напишу еще раз более конкретно. Есть 2ух уровневый иерархический справочник "Разделы номенклатуры"(1ый уровень раздел,2ой - подраздел), вида:
+Вентиляция
Дело в том, что в форме элемента справочника "Номенклатура", нужно указать к каком подразделу/подразделам, конкретная номенклатура относится, и так как вы видите, в данном примере подраздел "Холод" есть как в первом, так и во втором разделе, и вследствие этого, мне необходимо сделать отображение по иерархии в форме справочника "Номенклатура", дабы наглядно было видно что к чему.
Я не прошу указывать мне точных алгоритмов, сам стараюсь во всем разбираться, но тут не получается, прошу лишь указать мне ход мысли, в какую сторону двигаться для решения этой проблемы. Заранее спасибо.
(8) В справочник номенклатуры можно добавить ТЧ "Разделы", которую заполнять разделами, без родителей. Например, у элемента справочника Номенклатура1 в ТЧ будет Электрика и Кондиционирование.
На форме будет табличное поле с типом дерево значений, которое будет строиться запросом:
После удаления или добавления элементов в ТЧ "Разделы" перестраиваешь дерево запросом.
При добавлении элемента в дерево, добавляешь его в ТЧ.
В результате на выходе получаю лишь выбранные подразделы без иерархии, родителей не получаю. Как всегда с примером для наглядности:
наверно еще и тупой, потому что проблему я вижу в том, что я в запросе не выбираю родителей, а вследствие этого они не выводятся и никакой иерархии, соответственно, нет.
Спасибо, Maniac. le_, а причем здесь обход результатов, если в результате выполнения запроса, я самой иерархии не получаю. Да, я в консоль именно в дерево и выгружаю.
Да я понимаю, просто если я конкретно не выбираю родителей, а я их конкретно не выбираю, то ниче я собсна не получу, ну да ладно.
без итогов ПО в котором доступен метод ИЕРАРХИЯ любые запросы работают прямолинейно и выводят только записи таблиц данных в которых содержаться только элементы. Чтобы программа выводила иерархию (т/е/ добавляла в результат запроса еще и группы соответствующего справочника) это единственный метод. Хочешь доказать обратное - докажи!
можно конечно еще сделать в запросе переменные типа через точку 7Родитель и делать сгруппировать НО это будет неправильным подходом для многоуровневого справочника с разным количеством групп разных элементов!
(29) Справочник номенклатуры есть в базе?
Выполни запрос:
(31) епона мать. в сабже речь не сказана о справочнике. а о табличной части, в которой я на сто процентов верен еще есть числовые показатели и прочая лабуда и без итогов никак не обойтись. неужели сложно так догадаться.
когда вы уже научитесь задачи воспринимать как следует а не с примитивной стороны. и за этого вашего примитива у людей ничерта и не получается. потому что до конца задачу воспринимать не желаете. Я сразу например понял что речь идет о построенни дерева с данными а не тупой выборки справочника. Убиваете и свое время и автор ничерта понять не моет почему все не так.
(38) правда в том что ты потратил мое время на читание твоего обвинения в лжи, когда в действительности сам понес ересь. Всю тему 20 раз было сказано - нужно ДЕРЕВО а ты влез с нулывыми знаниями элементарных вещей.
(0) ктстати заранее предупреждаю (прдвижу) следующую твою проблему. Если ты будешь выгружать запрос в дерево? а именно только так и не иначе ты получишь ДЕРЕВО в нем на последнем уровне строк дерева будут идти детальные записи. а это значит что если ты хочешь в форме увидеть это дерево то в нем будет идти еще один + который будет дубливароть две строки. Это особенность!
Чтобы убрать эти строки понадобится специальный рекурсивный обход дерева полученного из запроса для построения нормального дерева на форме.
Этто еще добавит код в котором нужно знать как сделат рекурсивный обход дерева. Но это даже плюс. Потому что в случае еще дополнительных расчетов или условий которые произойдут в обходе можно будет добавлять еще какие то свои расчеты специфические которые можно будет выполнять программно.
+(42) причем эта проблема ОТСУТСТВУЕТ если речь идет об 82 на управляемых формах и запрос был получае программно при помощи СКД и программно выгружен в дерево. Тюкю в СКД группировки и значение иерархии не нужно задавать в запросе и там отсутствует понятие ИТОГИ ПО. группировки и ерархия задаются в самом СКД и выгрузка такого запроса в дерево происходит без детальных записей (т/е/ не будет задвоения нижних уровней по каждой строке).
Впрочем я думаю все чт оя описал никому нихрена из тех кто в этой ветке учавствовал даже неизвестно по прчине недостаточного уровня знаний.
Ого, тут дискуссия)(22) Извиняюсь, что сразу не сказал - иерархия элементов.
ну в общем, после метода проб и ошибок, на выходе получил единственный работающий вариант:
Чтобы был такой же функционал с УПОРЯДОЧИТЬ ПО, как я понимаю, необходимо явно выбирать группы и элементы этой самой иерархии. А с ИТОГИ ПО ТОЛЬКО ИЕРАРХИЯ, необходимо выбрать лишь один элемент какого-нибудь уровня иерархии, вобщем в моем случае намного удобней. Всем спасибо.
(43) Вот вариант без дублирования элементов в дереве. (!)Только для справочника с известным количеством уровней. Для задачи Invis91 вполне сгодится. Здесь не нужно будет обходить дерево.
(42) а может просто добавить после ИТОГИ ПО взамен ключевого слово ИЕРАРХИЯ, кл.слово ТОЛЬКО ИЕРАРХИЯ, если я правильно понял. Да, вначале была такая проблема, но после добавления ТОЛЬКО ИЕРАРХИЯ - исчезла
(44) уПОРЯДОЧИТЬ ПО не делает никакого дерева. эио метод сортировки!! Т7к если ты будешь делать запрос по обычному справочнику - запрос сделает обращение к базе и выведет все элементы справочника в результат запроса (все группы и элементы) но это не будет ИЕРАРХИЕЙ и ДЕРЕВОМ. он тупо выведет все как есть в таблицах базы данных. метод УПОРЯДОЧИТЬ ПО тупо просто сделает сортировку как она у тебя выглядит в справочнике - НО это не будет ДЕРЕВОМ. это просто окажется таблицей в которой в действительности все будет упорядочено НО ты никогда не получишь дерева с плюсиками и минусиками. Это будет обыяная таблица значений в которой будут конечно будут папки и элементы но это будет просто упорядоченной таблицей и не более.
(45) для простых задач может быть.. хотя надо смотреть на замеры. Для сложных задач (у меня например есть запрос по 10 регистрам в результате которого формируется дерево с полным перечнем всех данных и еще кучи наворотов. включая то что мне рекусрия потом в любом случае необходимо из за количества нстроек пользовтеля которые он может задавать при расчетах и которые в запрос просто вообще никак не воткнуть.
Опят таки логически - если зачем то понадобилось дерево на форме - я уверен на 100 процентов что не просто так. Кому то и зачем то это понадобилось для работы! а это значит кто то и что то будет делать в ней. И в любом случае все что будет связано с работой пользователя с работйо в дереве неизбежно приведет в рекурсиям.
(48) А вот это уже неправда.
Пример:
(50) Замеры замерами, а дерево обходить не нужно. В обоих запросах объединения установлены параметры. Отработает довольно быстро.
(51) я думаю что ты сейчас решаил тольк процентов 20 того что еще потом навешается с этими деревьями.
(52) Я делал подобное просто для представления данных в дереве. Пользователям так проще было ориентироваться. Ничего особенного они с ним не делали, только добавляли/удаляли элементы, которые хранились в ТЧ.
(53) у тебя простой запрос. не хочу уже делать усложнений. реально тема надоела) как и сама 1С)) пора отдыхать.
Но могу скзать что вряд ли я буду такую конструкцию использовать т/к/ у меня задачи все равно в стократном размере сложнее
у номенклатуры никогда не бывает одного уровня. а это онсоновй справочник по кторому 99.99 процентов работы приходится делаьт всем 1Сникам вместе взятым.
(58) Здесь я справочник номенклатуры использовал только потому, что он в большинстве типовых есть и любой сможет проверить примеры.
Так, задача усложнилась, вот, например, есть у меня справочник "Номенклатура", в ТЧ "Разделы" у Справочника записаны все подразделы (разделы мы берем из СправочникСсылка.РазделыНоменклатуры), к которым принадлежит Номенклатура.
Справочник.РазделыНоменклатуры:
+Вентиляция
ТЧ "Разделы:
Кондиционирование
Электрика
Так вот, необходимо, чтобы в созданной мною обработке, при добавлении в Табличное Поле "Обработка"(тип Дерево Значений) номенклатуры, добавлялась и вся иерархия разделов, ну вот пример:
Табличное Поле "Обработка"
Как добавить иерархию разделов, в этой теме уже написали, но как к этой иерархии, добавить еще один уровень и отображать там Номенклатуру, которая относится к данному подразделу - вот это действительно проблема, ничего путного в голову не приходит. Если только программно добавлять к подразделам подчиненные записи в дереве
(62) А не проще вместо справочника "Разделы номенклатуры" завести группы в справочнике "Номенклатура"?
(63) К сожалению нет, группы используются для другой цели, необходимо функционал именно со справочником "Разделы Номенклатуры". Были бы просто группы - было бы конечно намного проще)
(62) Можно делать запрос к ТЧ разделов, выбирать разделы и ссылку на саму номенклатуру и добавить ее (ссылку) в итоги.
Сделал так(Оборудование - ТП Дерево Значений), немного кривовато, но пока что первый вариант:
Если в форме списке надо выводить группы и элементы в разных таблицах, так как, например, в проводнике - слева группы, справа элементы, то для тех кто не знал или забыл, представлена инструкция, как это сделать.
Установить в справочнике свойство иерархия
На форму списка добавить два динамических списка "Список" (по умолчанию) и "Дерево" (для групп), и перенести их в группу с горизонтальным расположением:
Установить свойства реквизита «Список»:
Для сведения:________________________________________________________________________________
Если установить флаг "ПроизвольныйЗапрос", то "ОсновнаяТаблица" станет недоступной.
В "Настройке списка" появится конструктор запроса. Запрос можно составить на собственное усмотрение.
Поля таблицы "Список" будут соответствовать полям результирующей таблицы запроса.
Если в результирующей таблице запроса есть колонки со значением NULL, то такие колонки в режиме предприятия выводиться не будут.
Пример:
ВЫБРАТЬ
СправочникТест.Ссылка,
СправочникТест.ПометкаУдаления,
СправочникТест.Родитель,
СправочникТест.ЭтоГруппа,
СправочникТест.Код,
СправочникТест.Наименование,
СправочникТест.Предопределенный,
СправочникТест.ИмяПредопределенныхДанных,
ТрудоемкостьЗадач.Задача
ИЗ
Справочник.Тест КАК СправочникТест
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТрудоемкостьЗадач КАК ТрудоемкостьЗадач
ПО СправочникТест.Ссылка= ТрудоемкостьЗадач.СправочникТестСсылка
Если нет необходимости в оперативном просмотре изменённых данных в табличной части, то думаю, что этот вариант лучше использовать вместо события "ПриПолученииДанныхНаСервере"
_ _______________________________________________________________________________________________
Установить свойства реквизита «Дерево»:
Очень часто в 1С 8.3. в справочнике необходимо настроить определенный порядок подчинения элементов. Для реализации подобных задач из простого справочника необходимо сделать иерархический справочник 1С.
В платформе 1С существует два вида иерархии – иерархия групп и элементов и иерархия элементов.
Иерархия групп и элементов
Для того, чтобы справочник имел иерархию групп и элементов, необходимо в редакторе справочника на закладке Иерархия установить флаг Иерархический справочник, а свойству Вид иерархии установить значение Иерархия групп и элементов.
Тогда у справочника можно будет создавать группы, и размещать элементы в группах.
При иерархии групп или элементов существуют группы (каталоги), в которые входят или другие группы, или элементы. И группы, и элементы являются экземплярами объекта справочника.
Группа это тоже экземпляр объекта справочника, по которому не ведется какой-либо учёт (как правило), и который может быть родителем другого экземпляра, т.е. в группу могут входить другие группы и элементы справочников.
Иерархия элементов
Иерархия элементов настраивается похожим способом: в редакторе справочника на закладке Иерархия устанавливается флаг Иерархический справочник, но свойству Вид иерархии следует установить значение Иерархия элементов.
После этого, каждый элемент может быть родителем другого элемента.
Родитель иерархического справочника 1С
У каждого элемента иерархического справочника должен быть родитель. В случае иерархии групп и элементов родитель это группа иерархического справочника, в случае иерархии элементов, родитель это элемент.
Родитель это стандартный реквизит справочника. Если иерархия отключена, то этот стандартный реквизит не доступен. Как у этого справочника Сотрудники.
А если иерархия включена, то этот реквизит доступен. Как у справочника Контрагенты.
Если форма элемента справочника автоматически генерируется платформой (т.е. она не создана), то этот реквизит отображается на управляемой форме. И, в случае иерархии групп и элементов в нем указана группа, в которую входит этот элемент.
Если группа не указана, то значит элемент верхнего уровня.
Также, родитель имеется у элементов справочника с иерархией элементов.
Создать элемент иерархического справочника 1С
Для того, чтобы создать группу справочника (в случае, иерархии групп и элементов), необходимо воспользоваться методом менеджера справочника СоздатьГруппу(). А для создания элемента следует воспользоваться методом СоздатьЭлемент(). Если мы хотим, чтобы вновь созданный элемент входил в какую-то группу, то следует в свойство Родитель этого элемента записать ссылку на нужную группу.
В коде ниже, создаем группу, а потом создаем элемент, который входит в эту группу:
Заметьте, группа в коде выше, группа верхнего уровня. У неё при создании не был задан Родитель.
В случае иерархии элементов всегда нужно создавать элементы, но также следует в свойстве Родитель созданного элемента указать ссылку на другой элемент, которому будет подчинен созданный.
Изменить элемент иерархического справочника 1С
Если мы хотим поменять подчиненность элемента иерархического справочника, или вообще убрать её, т.е. сделать из элемента элемент верхнего уровня, то следует работать со стандартным реквизитом Родитель. В случае, изменения подчиненности, этому реквизиту нужно присвоить ссылку на другую группу.
Если же мы хотим сделать элемент верхнего уровня, то этому реквизиту нужно присвоить пустую ссылку.
Поиск в иерархическом справочнике 1С
В платформе 1С имеется возможность искать в определенной группе иерархического справочника, для этого следует в методах НайтиПоНаименованию, НайтиПоКоду и НайтиПоРеквизиту заполнять параметр Родитель.
Например, поиск в определенной группе будет осуществляться так:
Где, третий параметр Группа — это ссылка на группу, внутри которой ищется элемент по указанному названию.
Выборка иерархического справочника 1С
В платформе 1С 8.3. существует возможность выбрать элементы иерархического справочника, которые входят в ту или иную группу, для этого следует воспользоваться методом Выбрать с заполненным параметром Родитель. В этом случае будут выбраны группы и элементы, которых входят непосредственно в указанную группу, но не будут выбраны группы элементы, которые входят в подчиненные группы. Чтобы выбрать элемент и группы, входящие в какую-то группу, следует воспользоваться методом ВыбратьИерархически.
Например, при таком коде:
Будут выбраны элементы, входящие в указанную группу.
А в этом случае:
Будут выбраны элементы, которые входят и в указанную группу, и в подчиненные ей группы.
И Выбрать, и ВыбратьИерархически отбирают и группы, и элементы справочников. Поэтому, в коде выше было использовано свойство ссылки справочника ЭтоГруппа. Это свойство имеет значение Истина, если ссылка является группой справочника.
Более подробно и основательно начальные вопросы программирования в 1С есть вы можете изучить в
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книгой «Программировать в 1С за 11 шагов»
Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника
О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Эти книги, плюс книга по программированию оперативного учета имеются в едином комплекте: комплект книг по разработке в 1С.
Только для читателей моего блога,
промо-код на скидку в 300 рублей на весь комплект: blog
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму.
Читайте также: