Пример преобразования дерева значений в таблицу значений и обратно в 1Cv8

11.02.20

Разработка - Универсальные функции

Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно. Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее в табличных частях документа, а также в интерактивной обработке данных в виде дерева. Отсюда появился небольшой модуль для расширения возможности работы с деревом значений, хотя и с некоторыми оговорками. Основной идеей является использование двух ключевых реквизитов/колонок КлючСтроки и КлючСвязи. Однако они не всегда необходимы. Код, на мой взгляд достаточно "высушен". Цель публикации - поделиться с новичками опытом.

Скачать файлы

Наименование Файл Версия Размер
Конфигурация с примером использования в документах.
.dt 15,76Kb
526
.dt 15,76Kb 526 Скачать

////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ И ФУНКЦИИ ДЛЯ РАБОТЫ С ДЕРЕВОМ ЗНАЧЕНИЙ

// Функция формирует значение нового ключа строки табличной части.
//
// Параметры:
// Дерево - дерево значений
//

Функция ПолучитьНовыйКлючСтрокиДерева(Дерево, СписокКлючей = Неопределено) Экспорт

    Если
СписокКлючей = Неопределено Тогда
       
СписокКлючей = Новый СписокЗначений;
       
СписокКлючей.Добавить(0);
    КонецЕсли;
    Для Каждого
СтрокаДерева Из Дерево.Строки Цикл
       
СписокКлючей.Добавить(СтрокаДерева.КлючСтроки);
       
ПолучитьНовыйКлючСтрокиДерева(СтрокаДерева, СписокКлючей);
       
СписокКлючей.СортироватьПоЗначению(НаправлениеСортировки.Убыв);
       
МаксКлюч = СписокКлючей[0].Значение + 1;
    КонецЦикла;
    Возврат
МаксКлюч;

КонецФункции
// ПолучитьНовыйКлючСтрокиДерева()

// Процедура обновляет ключи связи в дереве значений
//

Процедура ОбновитьКлючиСвязиВДеревеЗначений(Дерево) Экспорт

    Для Каждого
СтрокаДерева Из Дерево.Строки Цикл
        Попытка
           
СтрокаДерева.КлючСвязи = СтрокаДерева.Родитель.КлючСтроки;
        Исключение
           
СтрокаДерева.КлючСвязи = 0;
        КонецПопытки;
       
ОбновитьКлючиСвязиВДеревеЗначений(СтрокаДерева);
    КонецЦикла;

КонецПроцедуры
// ОбновитьКлючиСвязиВДеревеЗначений()

// Процедура обновляет ключи связи в дереве значений
//

Процедура ОбновитьКлючиСтрокВДеревеЗначений(Дерево, КлючСтроки = 1) Экспорт

    Для Каждого
СтрокаДерева Из Дерево.Строки Цикл
       
СтрокаДерева.КлючСтроки = КлючСтроки;
       
КлючСтроки = КлючСтроки + 1;
       
ОбновитьКлючиСтрокВДеревеЗначений(СтрокаДерева, КлючСтроки);
    КонецЦикла;

КонецПроцедуры
// ОбновитьКлючиСтрокВДеревеЗначений()

// Процедура выгружает данные из дерева значений в таблицу значений
// данные выгружаются только в таблицу со сходным набором реквизитов
//

Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(Дерево, Таблица = Неопределено) Экспорт

    Если
Таблица = Неопределено Тогда
       
Таблица = Новый ТаблицаЗначений;
        Для Каждого
Колонка Из Дерево.Колонки Цикл
           
Таблица.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
        КонецЦикла;
    КонецЕсли;
    Для Каждого
СтрокаДерева Из Дерево.Строки Цикл
       
ЗаполнитьЗначенияСвойств(Таблица.Добавить(), СтрокаДерева);
       
ВыгрузитьДеревоЗначенийВТаблицуЗначений(СтрокаДерева, Таблица);
    КонецЦикла;
    Возврат
Таблица;

КонецФункции
//ВыгрузитьДеревоЗначенийВТаблицуЗначений()

// Процедура выгружает данные из таблицы значений в дерево значений
// данные выгружаются только в таблицу со сходным набором реквизитов
//
// Параметры:
//
// КлючСтроки - имя колонки ТаблицыЗначений - уникальный идентификатор
// КлючСвязи - имя колонки ТаблицыЗначений - указатель привязки к строке Дерева,
// своего рода указатель на "Родителя"
//

Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи") Экспорт

   
Дерево = Новый ДеревоЗначений;
    Для Каждого
Колонка Из Таблица.Колонки Цикл
       
Дерево.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
    КонецЦикла;
    Для Каждого
СтрокаТаблицы Из Таблица Цикл
       
СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки,Истина);
        Если
СтрокаГруппировки = Неопределено Тогда
           
ЗаполнитьЗначенияСвойств(Дерево.Строки.Добавить(), СтрокаТаблицы);
        Иначе
           
ЗаполнитьЗначенияСвойств(СтрокаГруппировки.Строки.Добавить(), СтрокаТаблицы);
        КонецЕсли;
    КонецЦикла;
    Возврат
Дерево;

КонецФункции
//ВыгрузитьТаблицуЗначенийВДеревоЗначений()

// Процедура устанавливает значение во всем дереве значений
//

Процедура УстановитьЗначениеКолонкиДерева(Дерево, Колонка, Значение) Экспорт

    Для каждого
СтрокаДерева Из Дерево.Строки Цикл
       
СтрокаДерева[Колонка] = Значение;
       
УстановитьЗначениеКолонкиДерева(СтрокаДерева, Колонка, Значение);
    КонецЦикла;

КонецПроцедуры
//УстановитьЗначениеКолонкиДерева()

// Процедура копирует подчиненные строки дерева значений
//

Процедура СкопироватьПодчиненныеСтроки(СтрокаПриемник, СтрокаИсточник)

    Для каждого
Строка Из СтрокаИсточник.Строки Цикл
       
НоваяСтрока = СтрокаПриемник.Строки.Добавить();
       
НоваяСтрока.КлючСвязи = СтрокаПриемник.КлючСтроки;
       
ЗаполнитьЗначенияСвойств(НоваяСтрока, Строка);
       
СкопироватьПодчиненныеСтроки(НоваяСтрока, Строка);
    КонецЦикла;

КонецПроцедуры
// СкопироватьПодчиненныеСтроки()

// Процедура переносит выделенные строки дерева значений в указанную ветку
//

Процедура ПеренестиСтрокиДереваЗначений(СтрокаПриемник, ВыделенныеСтроки) Экспорт

    Если НЕ
СтрокаПриемник = Неопределено Тогда
       
МассивСтрок = Новый Массив;
        Для Каждого
СтрокаПереноса Из ВыделенныеСтроки Цикл
           
МассивСтрок.Добавить(СтрокаПереноса);
           
НоваяСтрока = СтрокаПриемник.Строки.Добавить();
           
СкопироватьПодчиненныеСтроки(НоваяСтрока, СтрокаПереноса);
           
ЗаполнитьЗначенияСвойств(НоваяСтрока, СтрокаПереноса);
           
НоваяСтрока.КлючСвязи = СтрокаПриемник.КлючСтроки;
        КонецЦикла;
        Для Каждого
СтрокаДерева Из МассивСтрок Цикл
            Если
СтрокаДерева.Родитель = Неопределено Тогда
               
СтрокаДерева.Строки.Удалить(СтрокаДерева);
            Иначе
               
СтрокаДерева.Родитель.Строки.Удалить(СтрокаДерева);
            КонецЕсли;
        КонецЦикла;
    КонецЕсли;

КонецПроцедуры
//ПеренестиСтрокиДереваЗначений()

Модуль был использован в моей разработке //infostart.ru/public/205664/ 

дерево значений обработка универсальные алгоритмы смета

См. также

Переоткрытие внешних обработок

Универсальные функции Платформа 1С v8.3 Бесплатно (free)

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

30.11.2023    3747    ke.92@mail.ru    16    

60

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8039    YA_418728146    6    

134

Печать непроведенных документов для УТ, КА, ERP. Настройка печати по пользователям, документам и печатным формам

Пакетная печать Печатные формы Адаптация типовых решений Универсальные функции Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Абонемент ($m)

Расширение для программ 1С:Управление торговлей, 1С:Комплексная автоматизация, 1С:ERP, которое позволяет распечатывать печатные формы для непроведенных документов. Можно настроить, каким пользователям, какие конкретные формы документов разрешено печатать без проведения документа.

2 стартмани

22.08.2023    1873    17    progmaster    7    

3

Расширение: Быстрые отборы через буфер [Alt+C] Копировать список, [Alt+V] Вставить список, [Ctrl+C] Копировать из файлов

Инструментарий разработчика Универсальные функции Платформа 1С v8.3 Конфигурации 1cv8 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Абонемент ($m)

Копирует в буфер значения из списков, из ячеек отчетов, таблиц, настроек списков, других отборов и вставляет в выбранную настройку отбора. Работает с Объект не найден. Работает как в одной так и между разными базами 1С. Использует комбинации [Alt+C] Копировать список, [Alt+V] Вставить список. Также для копирования данных используется стандартная [Ctrl+C] (например из открытого xls, mxl, doc и т.п. файла скопировать список наименований)

1 стартмани

13.10.2022    15755    124    sapervodichka    111    

128

Система контроля ведения учета [БСП]

Универсальные функции Механизмы типовых конфигураций БСП (Библиотека стандартных подсистем) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данном материале рассмотрим типовой алгоритм подсистемы контроля учета БСП в конфигурациях на примерах.

18.07.2022    7108    quazare    8    

108

Хитрости СКД. Часть 3

СКД Универсальные функции Платформа 1С v8.3 Система компоновки данных Конфигурации 1cv8 Бесплатно (free)

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

28.05.2022    9109    milkers    11    

94
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Поручик 4667 09.08.10 14:14 Сейчас в теме
Программный код не хотите разукрасить?
http://infostart.ru/public/19856/
Lacoste4life; ivangrant; Fatov_DI; artbear; +4 1 Ответить
2. Sintson 411 09.08.10 14:23 Сейчас в теме
(1) Спасибо за наводку, разукрасил :)
3. Арчибальд 2706 09.08.10 16:29 Сейчас в теме
Меня бы больше порадовал алгоритм представления дерева в виде таблицы значений в "чистом виде", без привязки к восьмерке. Ну, хоть так...
5. Sintson 411 09.08.10 18:02 Сейчас в теме
(3) Если Вы поясните, что имеется в виду под "чистым видом", можно подумать, хотя рекурсия - она и в Африке рекурсия :) .
(4) Абсолютно согласен, можно и ПостроительОтчетов использовать.
6. Арчибальд 2706 09.08.10 18:19 Сейчас в теме
(5) Дерево и таблица существуют независимо от восьмерочной платформы. Соответственно и алгоритм представления дерева таблицей не имеет отношения к восьмерочной платформе. Т.е. задача, решенная в публикации, сильно заужена, является очень частным случаем.
Это не в укор, а мечтательно.
7. venger 2121 09.08.10 21:02 Сейчас в теме
(6)
Это не в укор, а мечтательно


Присоединяюсь, даешь универсальный алгоритм;-)
8. Sintson 411 09.08.10 23:09 Сейчас в теме
(6)(7) Вызов принимается, как прикажете оформить?
10. Арчибальд 2706 10.08.10 07:25 Сейчас в теме
(8) Лучше всего (наглядней и прозрачней) - в виде комикса.
MaxTolya; adhocprog; +2 Ответить
11. venger 2121 10.08.10 10:52 Сейчас в теме
(10) Это как? В виде алгоритма - знаю, в виде комикса - это как?;-)
32. orefkov 1152 13.06.12 15:22 Сейчас в теме
(11)
Для универсального алгоритма достаточно ключи назвать id и parentid :)
adhocprog; ikekoval; venger; +3 Ответить
14. venger 2121 10.08.10 11:32 Сейчас в теме
(10) (13) Вот, спугнули;-) Хорошо хоть не в виде мульта;-)
4. Yashazz 4692 09.08.10 17:28 Сейчас в теме
А ещё такие фишки можно проделывать, используя построитель или СКД. Иной раз гибче выходит, хотя с оформлением источника данных, конечно, морока.
charushkin; +1 Ответить
9. Sergey K 65 10.08.10 06:35 Сейчас в теме
(0) Задача тривиальная.. добавить КлючСтроки и КлючСвязи (я использую даже точно такие же наименования - совпадение?)
Но данная реализация - достаточно медленная..
можно обойтись без использования метода "Найти", "СортироватьПоЗначению" - очень замедляет весь процесс
но, всеравно поставлю + :)
12. Sintson 411 10.08.10 11:09 Сейчас в теме
13. Sintson 411 10.08.10 11:12 Сейчас в теме
(9) Реверанс
(10) Я пас, алгоритмы в виде комикса для меня слишком 8-)
15. Sintson 411 11.08.10 03:26 Сейчас в теме
(9) может поделитесь реализацией? Хотелось бы взглянуть так сказать в метадле...
19. Asdam 119 12.08.10 09:15 Сейчас в теме
(9) Sergey K, выложите, плиз, Ваш пример реализации преобразования дерева значений в таблицу значений и обратно.
16. Sergey K 65 11.08.10 07:59 Сейчас в теме
Пример выгрузка Таблицы в Дерево..
1. в твой код необходимо вставить:
Таблица.Сортировать("КлючСтроки");
т.к. если в таблице строки не будут упорядочены по КлючуСтроки, то у тебя дерево построится неправильно

2. СтрокаГруппировки = Дерево.Строки.Найти(СтрокаТаблицы[КлючСвязи], КлючСтроки,Истина);

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

мой вариант:
числоЭлементов = Таблица.Количество();
Если числоЭлементов = 0 Тогда
Возврат;
КонецЕсли;
МассивСтрок = Новый Массив(Таблица[числоЭлементов-1]["КлючСтроки"]);

Для каждого Строка Из Таблица Цикл
Если Строка.КлючСвязи = 0 Тогда
МассивСтрок.Вставить(КлючСтроки,Дерево.Строки.Добавить());
Иначе
МассивСтрок.Вставить(КлючСтроки,МассивСтрок[Строка.КлючСвязи.Строки.Добавить());
КонецЕсли;
ЗаполнитьЗначенияСвойств(МассивСтрок["КлючСтроки"], Строка);


LomayaZakat; Arxxximed; Redhatych; adhocprog; itc_Geo; ikekoval; artbear; +7 Ответить
17. Sintson 411 11.08.10 12:25 Сейчас в теме
(16) С первым согласен, однако если таблицу мы получаем из дерева - она так и так будет отсортирована. В моем случае в качестве таблицы выступала табличная часть документа для хранения данных.
Со вторым полностью согласен, достойный вариант построения.
34. tindir 03.07.12 13:07 Сейчас в теме
(16) Sergey K, пока не разорался как ваш кусок кода работает. и думаю стоит ли (в целях самообразованя -да, а вот в целях разработки..). на сколько он будет эффективнее, чем поиск с "найти" и "сортировать" ? (дерево будет строиться минимум из 10-15 элементов, максимум 6000.
shegarka; +1 Ответить
35. Sintson 411 03.07.12 15:27 Сейчас в теме
(34) Спасибо за комментарий, однако, задачка у Вас!
А может, пока на берегу, пересмотрите подходы к реализации?
Дерево это конечно интересно, но 6000 элементов!!!
Не лучше ли попробовать использовать динамические списки?
А то, опираясь на личный опыт, с такими объемами легко словить "ошибку памяти по адресу"
или "неизвестную ошибку компоненты C++"
, а то и банальное "недостаточно памяти"...
37. tindir 06.07.12 07:24 Сейчас в теме
(35) да. после прочтения вашего комментария начал смотреть в сторону дим.спискоков, но пришел начальник, настучал по головушке, без того опухшей, за неправильное соединение таблиц и теперь работаем с таблице в максимум 100 строк. Производительность посмотрел. Да чем больше объем, тем более явно выражается производительность (16).

Кстати, нет ли возможности напрямую передать через ком-соединение дерево? Т.к. первоначально стоит задача сделать дерево с возможность множественного выбора как в примере. Но есть одна беда - Ком-соединение.
Сейчас я делаю как : получаю Ком-таблицу вида (Ключ|КлючРодитель|Наименование), преобразую своей процедурой в Тз и прогоняю через вашу функцию. Получив дерево, отправляю его уже "разделанную" под мои нужды обработку из примера выше и получаю результат. Вся эта абра-кадабра очень медленная и порой дерево строится не верно.
По этому и вопрос - есть ли варианты напрямую передавать дерево (может не в явном, но с меньшим количество шагов) ?
38. Sergey K 65 06.07.12 08:21 Сейчас в теме
(37)ЗначениеВСтрокуВнутр()
39. tindir 06.07.12 11:14 Сейчас в теме
(38) Sergey K, XML!!! ДА! как раньше сам до этого не додумался! Спасибо!
36. Sergey K 65 03.07.12 15:45 Сейчас в теме
(34) Чем больше элементов в дереве, тем в разы быстрее будет работать вариант в (16)
С вариантом в (16) выводил деревья в сотни тыс. строк.
66. SmArtist 98 20.05.19 10:00 Сейчас в теме
(16)
мой вариант:

можете показать полный вариант своей рекурсивной процедуры? спасибо
67. пользователь 28.10.19 10:47
Сообщение было скрыто модератором.
...
18. Asdam 119 12.08.10 09:13 Сейчас в теме
Sintson, выложите, плиз, файл конфигурации с примером документа для чайников.
20. Sintson 411 13.08.10 00:11 Сейчас в теме
(18) Выложил простой пример использования процедур для табличной части документа.
(16) Проблем с построением ни разу за все время не было, во всяком случае если применять так как в конфигурации с примером ;) .
21. kisyalort 31.08.10 17:16 Сейчас в теме
22. Sintson 411 31.08.10 18:52 Сейчас в теме
(21) Пожалуйста, заходите еще ;)
23. vitaliy.ermolenko 52 07.09.10 17:06 Сейчас в теме
а как заставить заработать сабж в 1С: Предприятие 8.2 (управляемое приложение)?
25. Sintson 411 07.10.10 23:43 Сейчас в теме
(23) В 1С: Предприятие 8.2, как вариант рекомендую создать реквизит с типом хранилище значения и восстанавливать перед открытием и сохранять при закрытии формы.

Чтобы заставить работать мои процедуры - их нужно просто немного переписать, учитывая специфику управляемого приложения.
24. 1malder1 7 01.10.10 12:10 Сейчас в теме
Может у кого есть пример вывода дерева в печатную форму(в виде дерева), нужно сделать для обычной и управляемой формы
26. Sintson 411 07.10.10 23:49 Сейчас в теме
(24) Вывод в печатную форму из дерева значений осуществляется с использованием рекурсии.
Можно также запихнуть его в СКД, используя как внешние данные.
27. Kotta 13 22.09.11 15:39 Сейчас в теме
Спасибо, очень пригодилось.
28. adhocprog 1138 11.01.12 16:05 Сейчас в теме
Большое спасибо!
Картинка тоже порадовала! :)
29. Sintson 411 11.01.12 22:50 Сейчас в теме
(28) Ценю чувство юмора, спасибо!
46. ChelyapinDemlink 16.05.16 20:19 Сейчас в теме
(29) а подскажите, что передавать в качестве КлючСвязи?
Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи")
47. Sintson 411 24.05.16 00:11 Сейчас в теме
(46) Это название реквизита, близкий по смыслу к аналогу "родитель" в иерархическом справочнике.
30. takeshi3 27.02.12 12:53 Сейчас в теме
Спасибо!Поставил плюсик!
31. EfremoVich 13.04.12 13:23 Сейчас в теме
Вот бы ещё получилось бы скачать конфу для изучения.. ;(
33. tindir 03.07.12 13:04 Сейчас в теме
Отличное подспорье для новичков. Сидел и печально придумывал хитрые рекурсии на листочке, пока не наткнулся на ваш пример. Кстати, по поводу оптимизации на сколько пример с массивами будет работать быстрее. вопрос не пустой, мне в дерево надо будет перегонять таблицу с количеством строк от 10 до 6000 ( ух и огромная организационная структура у этой организации :-) )
40. stalker18 04.04.13 17:14 Сейчас в теме
Хочу предложить свою реализацию перевода таблицы в дерево значений:

Функция тз_в_дз(тз_Ссылка, дз_Ссылка, КлючСвязи=0)
м_Строки=тз_Ссылка.НайтиСтроки(Новый Структура("КлючСвязи", КлючСвязи));
Для Каждого ъ_Строка Из м_Строки Цикл
ъ_Строка_ДЗ=дз_Ссылка.Строки.Добавить();
ЗаполнитьЗначенияСвойств(ъ_Строка_ДЗ, ъ_Строка);
тз_в_дз(тз_Ссылка, ъ_Строка_ДЗ, ъ_Строка_ДЗ.КлючСтроки);
КонецЦикла;
КонецФункции


Предварительно в таблице необходимо добавить индекс для ускорения поиска строк:
тз_Ссылка.Индексы.Добавить("КлючСвязи");

Вызов:
тз_в_дз(тз_Источник, дз_Приемник);
remark; adhocprog; +2 Ответить
41. UJF 09.10.13 15:57 Сейчас в теме
42. UJF 09.10.13 15:59 Сейчас в теме
43. Sintson 411 30.10.13 23:23 Сейчас в теме
(42) в контексте публикации, предлагаю ознакомиться с рабочей конфигурацией, где этот модуль является центральным для визуализации http://infostart.ru/public/205664/
44. yandextesting 147 11.09.14 16:24 Сейчас в теме
45. KroVladS 34 08.10.14 10:45 Сейчас в теме
(0) Ещё бы найти пример как в ТЧ загнать справочник номенклатуры с иерархией из запроса.
48. SvetaS2014 17.02.17 19:01 Сейчас в теме
не открывается -"Невосстановимая ошибка
Ошибка при выполнении запроса GET к ресурсу /e1cib/userSettings:
по причине:
Ошибка SDBL:
В схеме базы данных нет таблицы с именем SystemSettings (pos=20)"
49. Sintson 411 19.02.17 16:24 Сейчас в теме
(48) Возможно требуется конвертация, конфигурация по-моему 8.1.
50. SvetaS2014 19.02.17 21:25 Сейчас в теме
конфигуратор пишет "Невосстановимая ошибка" и вылетает.... Как её открыть??
51. SvetaS2014 19.02.17 21:27 Сейчас в теме
чем её конвертировать? конфигуратор вылетает...
53. Sintson 411 20.02.17 09:54 Сейчас в теме
(51) Коллега Alister прав. Конфигурация рабочая, у меня в 8.3.8 не конвертится напрямую из 8.1. Найдите платформу 8.2. или 8.1. и я думаю все получится.
54. Alister 9 20.02.17 14:15 Сейчас в теме
(53) в 8.2 у него получилось
52. Alister 9 19.02.17 21:29 Сейчас в теме
Попробуйте не 8.3.9, а 8.3.8 или сначала 8.2, а потом уже 8.3
55. Tanis 15.03.17 18:30 Сейчас в теме
Добрый вечер!
Подскажите, пожалуйста, как и в какой последовательности обращаться к функциям/процедурам, для преобразования дерева значений в таблицу значений?
Сейчас поставил первое обращение к ПолучитьНовыйКлючСтрокиДерева(Дерево, СписокКлючей = Неопределено) Экспорт , а в ответ ошибка. У моего дерева нет ключа строки....
56. Sintson 411 15.03.17 22:19 Сейчас в теме
(55) Добрый вечер!
Я бы посоветовал Вам скачать демо конфигурацию, там пример использования.
А вообще этот реквизит необходим, добавьте в дерево эту колонку.
57. Tanis 16.03.17 13:04 Сейчас в теме
Добрый день!
Спасибо! За совет. Правда, не написал сразу, и еще не пробовал добавить поле. Но у меня дерево виртуальное, там этот Ключ строки поставить в цикле - "н + 1" ? Или как-то по другому алгоритму? Что родитель - 1, а подчиненные 2....н, дерево двухуровневое.
Спасибо!
58. Sintson 411 16.03.17 18:17 Сейчас в теме
1. Добавьте в своем дереве колонки "КлючСтроки" и "КлючСвязи"
2. Запустите последовательно процедуры:
ОбновитьКлючиСтрокВДеревеЗначений(ВашеДерево)
ОбновитьКлючиСвязиВДеревеЗначений(ВашеДерево)
3. ВашеДерево готово для дальнейшей работы по теме
behemoth96; +1 Ответить
59. Pavean 21.11.17 09:29 Сейчас в теме
А что изменено в обновлении 17.08.2017?
60. azamatjon98 03.01.18 04:21 Сейчас в теме
61. Bee2014 14.06.18 15:43 Сейчас в теме
Киньте работающий пример, s`il vous plat !! второй день бьюсь - что за КлючСвязи и КлючСтроки??
62. МихаилМ 14.06.18 18:00 Сейчас в теме
(61) метод преобразования дз в тз.

//------------------------------------------------------------------------------------------------------------------------------
//!!! в нетленку  
Функция ОтобратьМассивВсехСтрокДЗ(ДЗ,МассивТекСтрокДЗ) Экспорт
Перем Рез;
Перем ИмяКолонкиОтбора;
Перем Отбор;
	ИмяКолонкиОтбора = УникальноеИмяКолонки();
	
	Попытка
		
		ДЗ.Колонки.Добавить(ИмяКолонкиОтбора,Новый ОписаниеТипов("Булево"));
		Отбор = Новый Структура();
		Отбор.Вставить(ИмяКолонкиОтбора,FALSE);
		МассивТекСтрокДЗ = ДЗ.Строки.НайтиСтроки(Отбор,TRUE);
		ДЗ.Колонки.Удалить(ИмяКолонкиОтбора);
		Рез = TRUE;
	Исключение
	    Рез = FALSE;
	Конецпопытки;
	

Возврат Рез;

КонецФункции //ОтобратьМассивВсехСтрокТЗ


//------------------------------------------------------------------------------------------------------------------------------
Функция СтруктураТЗвДЗ(ТЗ,ДЗ) Экспорт
Перем Рез;
Перем ТекущаяКолока;
	Для Каждого ТекущаяКолока Из  ТЗ.Колонки Цикл
		ДЗ.Колонки.Добавить(ТекущаяКолока.Имя,ТекущаяКолока.ТипЗначения);	
	КонецЦикла;	
Возврат ИСТИНА
КонецФункции //СтруктураТЗвДЗ
//------------------------------------------------------------------------------------------------------------------------------

Функция СтрокиДЗ_вТЗ(ДЗ,ТЗ)
	Перем рез;
	Перем СтрокиДЗ;
	Перем ПустаяСтрокаТЗ;
	Перем БуФТЗ;
	
	
	ОтобратьМассивВсехСтрокДЗ(ДЗ,СтрокиДЗ);
	ТЗ = Новый ТаблицаЗначений;
	СтруктураТЗвДЗ(ДЗ,ТЗ); // и наоброт работает как тз в дз  , так и дз в тз
	
	// теперь имитируем   СтрокиДЗ в масив строк ТЗ 
	// путем вставки в массив первой строки из тз
	БуФТЗ = ТЗ.СкопироватьКолонки(); 
	
	ПустаяСтрокаТЗ = БуФТЗ.Добавить();
	СтрокиДЗ.Вставить(0, ПустаяСтрокаТЗ); 
	
	ТЗ = БуФТЗ.Скопировать(СтрокиДЗ); 
	
	// удаляем добавленную пустую строку
	ТЗ.Удалить(0);
	
	
	
	Рез = true;
	
	Возврат рез;
	
	
КонецФункции //СтрокиДЗ_вТЗ

Показать
64. Team leader 12 22.09.18 16:58 Сейчас в теме
(62) не взлетит, не все функции указали:

ИмяКолонкиОтбора = <<?>>УникальноеИмяКолонки(); (Проверка: Толстый клиент (обычное приложение))
65. Team leader 12 22.09.18 17:36 Сейчас в теме
(62) Эта схема лучше зашла:

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

&НаСервере
Процедура ВТЗНаСервере()
   тДерево = РеквизитФормыВЗначение("Дерево");
   тТаблица = РеквизитФормыВЗначение("Таблица");
 
   ПреобразоватьВТЗРекурсия(тДерево, тТаблица, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"));
   тДерево.Строки.Очистить();
 
   ЗначениеВРеквизитФормы(тТаблица, "Таблица");
   ЗначениеВРеквизитФормы(тДерево, "Дерево");
КонецПроцедуры
 
&НаСервере
Процедура ПреобразоватьВТЗРекурсия(тДерево, тТаблица, ГУИД)
   Для Каждого тСтр Из тДерево.Строки Цикл
      нСтр = тТаблица.Добавить();
      нСтр.Колонка1 = тСтр.Колонка1;
      нСтр.Колонка2 = тСтр.Колонка2;
      нСтр.Родитель = ГУИД;
      нСтр.ГУИД = Новый УникальныйИдентификатор();
 
      Если тСтр.Строки.Количество()>0 Тогда
         ПреобразоватьВТЗРекурсия(тСтр, тТаблица, нСтр.ГУИД);
      КонецЕсли;
   КонецЦикла;
КонецПроцедуры

//---------------------------------------------------------------------------------------
// 2. Таблица значений в дерево значений

&НаСервере
Процедура ВДЗНаСервере()
   тДерево = РеквизитФормыВЗначение("Дерево");
   тТаблица = РеквизитФормыВЗначение("Таблица");
 
   ПреобразоватьВДЗРекурсия(тДерево, тТаблица, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"));
   тТаблица.Очистить();
 
   ЗначениеВРеквизитФормы(тТаблица, "Таблица");
   ЗначениеВРеквизитФормы(тДерево, "Дерево"); 
КонецПроцедуры
 
 &НаСервере
Процедура ПреобразоватьВДЗРекурсия(тДерево, тТаблица, ГУИД)
   тПоиск = Новый Структура("Родитель", ГУИД);
   тМассив = тТаблица.НайтиСтроки(тПоиск);
   Для Каждого тСтр Из тМассив Цикл
      нСтр = тДерево.Строки.Добавить();
      нСтр.Колонка1 = тСтр.Колонка1;
      нСтр.Колонка2 = тСтр.Колонка2;
 
      ПреобразоватьВДЗРекурсия(нСтр, тТаблица, тСтр.ГУИД);
   КонецЦикла;
КонецПроцедуры
Показать


Для обычных форм функции тоже будут работать
(пример для сохранения дерева из 2х колонок)
Simonov_NPM; SmArtist; +2 Ответить
69. vladimir99kuzmin 03.09.21 07:53 Сейчас в теме
(65) Руки так и чешутся ссаной тряпкой тебя побить за это
keyn5565`; +1 Ответить
63. Sintson 411 15.06.18 11:51 Сейчас в теме
(61) Что именно не работает? В чём выражается ошибка?
КлючСтроки - это ключ строки, КлючСвязи хранит ключ строки родителя. По этим колонкам строится структура делева.
68. Cyberhawk 135 28.10.19 10:50 Сейчас в теме
Приведенный в статье метод нельзя считать унивесальным, поскольку он применим только если соблюдается условие: ключ родителя всегда "больше" ключа любых его потомков. Ну и необходимо упорядочить исходную таблицу по возрастанию значений поля ключа, как об этом уже заметили в комментарии № 16.

Простой пример иерархии, когда метод не работает:
- код = 111, родитель пустой
-- код = 11, родитель = 111
--- код = 1, родитель = 11
LomayaZakat; +1 Ответить
Оставьте свое сообщение