- Табличную часть в дерево значений
- Работа с деревом значений в 1С
- Дерево значений
- Дерево значений на форме
- Заполнение дерева значений
- Обход дерева значений
- Как свернуть и развернуть дерево значений
- Как удалить строку и очистить дерево значений
- Запрос и дерево значений
- Дерево значений в таблицу значений и обратно
- Отбор в дереве значений
Табличную часть в дерево значений
В вашем случае лучше всего собрать дерево значений в цикле.
Запросом без постобработки, тоже не получится, т.к. он не умеет группировать по двум полям. Можно еще схемой СКД, но это уже перебор.
(3)Можно, только зачем это делать, если все равно нужна постобработка, что бы удалить верхний уровень? Если автор получает данные запросом, то окей. но я так понимаю он в модуле формы или объекта и данные уже прочитаны.
(6)это будет документ
С таблично часть
Номенклатура
Характеристика
упаковка
факт
учёт
И реквизитом документ расходная накладная
По кнопке заполнить заполняется тч вида который я описал выше
А дерево значений нужно для визуализации скажем тоесть номенклатура состоит из 5 упаковок пока я их все не отсканирую не смогу отгрузить товар, а чтобы видно было сколько отсканировано упаковок нужно дерево
(3)Можно в запросе объединить в кортеж поля номенклатура и характеристика и получить итог по этому кортежу тогда будет только одна группировка итогов — то что нужно, не?
(11) проще говоря это соединение в уникальном выражении нескольких полей
Вот у вас есть поле номенклатура и поле характеристика. из которых в запросе вы можете выразить одно поле
номенклатура.код + характеристика как уникальный_ключ
И по нему уже получить итог как по одному полю вместо того чтобы добавлять в выражение итоги по номенклатуру и характеристику. Что приведет к образованию двухуровневого дерева результата.
(12)
Вариант, но все равно красиво выгрузить в дерево результат не получится, ведь в дереве будет присутствовать уникальный ключ, а он не нужен в выводе на форму.
(13) Ну это как подумать, Чем комбинация Номенклатура.наименование + «: » + Характеристика , если формировать кортеж так, а не по коду, как я предложил сначала, в одной колонке, органолептически для пользователя — хуже чем номенклатура и характеристика в разных колонках ? 🙂
(15)а потом обратно если в дереве значений таком что то поправили как будете обращаться? например
—номенклатура характеристика
——————упаковка1 1 шт
——————упаковка2 2 шт
я взял и поменял на упаковка2 10 шт трудность наверное возникнет с обратным переводом в таблицу значений
(20) Во первых: что мешает иметь в дереве значений колонок больше чем отображается на форму?
Во вторых: распарсить кортеж точно зная разделитель тоже вроде бы не сложно. Тут сложно только то что там будут строковые представления, а не ссылки. Если для номенклатуры наименования скорее уникальны то для характеристик скорее не уникальны. И потом по этим представлениям фиг определишь нужный элемент но это не точно.
Так что надежнее в дереве иметь колонки ссылок номенклатуры и характеристик но не отображать их на форму если вам в этом дереве надо менять данные для сохранения их в базе.
(13) Вот пример как выглядит в дереве кортеж наименование продукции / спецификация в одном из инструментов
Для Каждого Строка Из ТЧ Цикл СтрокаТовара = Дерево.Строки.Найти(Строка.Номенклатура, "Номенклатура"); Если СтрокаТовара = Неопределено Тогда СтрокаТовара = Дерево.Строки.Добавить(); СтрокаТовара.Номенклатура = Строка.Номенклатура; КонецЕсли; СтрокаСтроки = Строка.Строки.Найти("Упаковка", Строка.Упаковка); Если СтрокаСтроки = Неопределено Тогда СтрокаСтроки = СтрокаТовара.Строки.Добавить(); СтрокаСтроки = Строка.Упаковка; КонецЕсли; КонецЦикла;
это все написать — две минуты. На обсуждение потрачено намного больше. Вот так мы и получаем производительность труда как в Зимбабве, вместо того, чтобы сделать — болтаем.
(14) две минуты если бы не одно но
надо сразу по двум колонкам сделать
—Номенклатура характеристика
———Упаковка
// Процедура выгружает данные из таблицы значений в дерево значений // данные выгружаются только в таблицу со сходным набором реквизитов // // Параметры: // // КлючСтроки - имя колонки ТаблицыЗначений - уникальный идентификатор // КлючСвязи - имя колонки ТаблицыЗначений - указатель привязки к строке Дерева, // своего рода указатель на "Родителя" // Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи") Экспорт Дерево = Новый ДеревоЗначений; Для Каждого Колонка Из Таблица.Колонки Цикл Дерево.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения); КонецЦикла; Для Каждого СтрокаТаблицы Из Таблица Цикл СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки,Истина); Если СтрокаГруппировки = Неопределено Тогда ЗаполнитьЗначенияСвойств(Дерево.Строки.Добавить(), СтрокаТаблицы); Иначе ЗаполнитьЗначенияСвойств(СтрокаГруппировки.Строки.Добавить(), СтрокаТаблицы); КонецЕсли; КонецЦикла; Возврат Дерево; КонецФункции //ВыгрузитьТаблицуЗначенийВДеревоЗначений()
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //. СтруктураДокументаПоказатьНаСервере(); КонецПроцедуры &НаСервере Процедура СтруктураДокументаПоказатьНаСервере() ТЗ=Объект.СтруктураДокумента.Выгрузить(); ДЗ=КФСервер.ВыгрузитьТаблицуЗначенийВДеревоЗначений(ТЗ); ЗначениеВРеквизитФормы(ДЗ,"ДЗСтруктураДокумента"); Элементы.ДЗСтруктураДокумента.Обновить(); Для каждого ИмяЭл Из СкрываемыеЭлементы Цикл Если ИмяЭл.Значение="" Тогда Продолжить; КонецЕсли; Эл=Элементы[ИмяЭл.Значение]; Эл.Видимость=Ложь; КонецЦикла; КонецПроцедуры
(17)это тоже только для одной колонке
—Номенклатура характеристика
———Упаковка
У меня сделано через СКД.
Я создал макет схему компановки данных и программно передавал в него данные ТЧ, на выходе получил готовое дерево, которое просто грузил в реквизит формы.
ПромДерево = Новый ДеревоЗначений; ТекОбъект = РеквизитФормыВЗначение("Объект"); НовыйСКД = ТекОбъект.ПолучитьМакет("МОЙ МАКЕТ СКД"); Настройки = НовыйСКД.НастройкиПоУмолчанию; НовыйОтбор = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); //////// программно устанавливаю отборы в СКД если просто ТЧ передать то этого не надо НовыйОтбор.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(" "); НовыйОтбор.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке; НовыйОтбор.ПравоеЗначение = ВыделенныеСтроки; НовыйОтбор.Использование = Истина; //// ДанныеРасшифровкиСКД = Новый ДанныеРасшифровкиКомпоновкиДанных; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(НовыйСКД,Настройки, ДанныеРасшифровкиСКД,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, ,ДанныеРасшифровкиСКД); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбъект(ПромДерево); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); ЗначениеВРеквизитФормы(ПромДерево, "РЕКВИЗИТ ФОРМЫ ДЕРЕВО");
Источник
Работа с деревом значений в 1С
В последнее время аномально часто мне в работе попадалось дерево значений, поэтому решил написать на эту тему статью.
Попробую рассмотреть способы решения основных задач связанных с деревом значений, при этом постараюсь писать «без воды».
Дерево значений
Из названия объекта понятно, что дерево значений служит для хранения/отображения какой-либо иерархической информации. Каждая строка дерева значений может иметь какое-то количество подчиненных строк, при этом такие операции как поиск, сортировка, подсчет итогов можно проводит с учетом уровня иерархии и подчиненных строк.
Кроме этого, каждая строка дерева значений имеет свойства «Родитель» и «Строки».
Дерево значений на форме
Визуальное представление дерева значений обеспечивает элемент «Табличное поле».
Заполнение дерева значений
При заполнении дерева значений нужно помнить, что сам объект «ДеревоЗначений» и все его строки имеют свойство «Строки»и добавление новых строк на любом уровне дерева осуществляется через это свойство.
Сам же объект «ДеревоЗначений» имеет еще и свойство «Колонки», которое ничем не отличается от аналогичного свойства у таблицы значений.
Небольшой пример программного заполнения таблицы значений для управляемых форм:
Обход дерева значений
Обход всех строк дерева значений делается при помощи рекурсии, вот так будет выглядеть код для обхода дерева созданного в примере выше:
Как свернуть и развернуть дерево значений
Сворачивается и разворачивается дерево значений очень просто.
Привел три примера: для сворачивания текущей строки, для сворачивания строк верхнего уровня, для сворачивания вообще всех строк (рекурсия).
Два примера: для разворачивания текущей строки и для разворачивания всех строк. У метода «Развернуть» есть дополнительный параметр, который позволяет указать нужно ли разворачивать подчиненные строки.
Как удалить строку и очистить дерево значений
Тут опять же все просто, нужно помнить, что при удалении/очистке строки, все подчиненные строки удаляются.
Точно также можно очистить от подчиненных элементов другую другую строку.
Удалить строку дерева значений не сложнее — нужно только знать ее индекс:
Запрос и дерево значений
Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом «Выгрузить» и указать параметр «ТипОбхода» отличным от того, что стоит по умолчанию, т.е. «ПоГруппировкам» или «ПоГруппировкамСИерархией».
Если на форме имеется реквизит «ДеревоЗначений» и связанный с ним визуальный элемент, то можно сделать примерно так:
Причем полного совпадения колонок и типов не требуется — лишние колонки будут просто отброшены, а колонки с различными типами будут заполнены пустыми значениями.
Дерево значений в таблицу значений и обратно
Преобразовать дерево значений в таблицу значений и наоборот достаточно просто, ведь дерево значений это та же таблица значений, но с дополнительной колонкой — «Родитель». У меня есть отдельная статья о том как преобразовать дерево значений в таблицу значений и обратно.
Отбор в дереве значений
Стандартного отбора в дереве значений не предусмотрено. Так получилось потому, что непонятно как разрешать ситуацию, когда родительский элемент не удовлетворяет условию отбора, а подчиненные ему элементы удовлетворяют.
Таким образом, если Вам нужно реализовать отбор в дереве значений, то начать нужно с решения именно этой проблемы. А уже после этого можно придумать несколько способов реализовать задуманное.
Первый способ — накладывать отбор до вывода дерева значений (в запросе например). Это не классический отбор, но в тех случаях когда этот способ применим, то следует применять именно его, так как это почти всегда быстрее и правильнее чем что-либо другое.
Второй способ — перебор всех строк дерева значений. Описывать здесь особенно нечего, нужно просто взять обход дерева значений, проверять каждую строку на соответствие условию отбора и удалять лишние строки.
Еще один способ заключается в том, чтобы преобразовать дерево значений в таблицу значений, сделать отбор в таблице значений, проконтролировать результат (почистить «хвосты» — строки, родитель которых не удовлетворил условию отбора) и выполнить обратное преобразование в дерево значений.
На этом все, рассказал все, что знал, надеюсь мне удалось сэкономить Вам немного времени.
Если Вы нашли ошибку или неточность, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
(оценок: 36, средняя оценка: 4,64 из 5)
Источник