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

Публикация № 73969

Программирование - Практика программирования

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В 

132

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

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

См. также

Специальные предложения

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


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

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

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

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

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


Arxxximed; Redhatych; adhocprog; itc_Geo; ikekoval; artbear; +6 Ответить
17. Sintson 350 11.08.10 12:25 Сейчас в теме
(16) С первым согласен, однако если таблицу мы получаем из дерева - она так и так будет отсортирована. В моем случае в качестве таблицы выступала табличная часть документа для хранения данных.
Со вторым полностью согласен, достойный вариант построения.
34. tindir 03.07.12 13:07 Сейчас в теме
(16) Sergey K, пока не разорался как ваш кусок кода работает. и думаю стоит ли (в целях самообразованя -да, а вот в целях разработки..). на сколько он будет эффективнее, чем поиск с "найти" и "сортировать" ? (дерево будет строиться минимум из 10-15 элементов, максимум 6000.
shegarka; +1 Ответить
35. Sintson 350 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) выводил деревья в сотни тыс. строк.
18. Asdam 112 12.08.10 09:13 Сейчас в теме
Sintson, выложите, плиз, файл конфигурации с примером документа для чайников.
20. Sintson 350 13.08.10 00:11 Сейчас в теме
(18) Выложил простой пример использования процедур для табличной части документа.
(16) Проблем с построением ни разу за все время не было, во всяком случае если применять так как в конфигурации с примером ;) .
21. kisyalort 31.08.10 17:16 Сейчас в теме
22. Sintson 350 31.08.10 18:52 Сейчас в теме
(21) Пожалуйста, заходите еще ;)
23. vitaliy.ermolenko 07.09.10 17:06 Сейчас в теме
а как заставить заработать сабж в 1С: Предприятие 8.2 (управляемое приложение)?
25. Sintson 350 07.10.10 23:43 Сейчас в теме
(23) В 1С: Предприятие 8.2, как вариант рекомендую создать реквизит с типом хранилище значения и восстанавливать перед открытием и сохранять при закрытии формы.

Чтобы заставить работать мои процедуры - их нужно просто немного переписать, учитывая специфику управляемого приложения.
24. 1malder1 7 01.10.10 12:10 Сейчас в теме
Может у кого есть пример вывода дерева в печатную форму(в виде дерева), нужно сделать для обычной и управляемой формы
26. Sintson 350 07.10.10 23:49 Сейчас в теме
(24) Вывод в печатную форму из дерева значений осуществляется с использованием рекурсии.
Можно также запихнуть его в СКД, используя как внешние данные.
27. Kotta 13 22.09.11 15:39 Сейчас в теме
Спасибо, очень пригодилось.
28. adhocprog 1158 11.01.12 16:05 Сейчас в теме
Большое спасибо!
Картинка тоже порадовала! :)
29. Sintson 350 11.01.12 22:50 Сейчас в теме
(28) Ценю чувство юмора, спасибо!
46. ChelyapinDemlink 16.05.16 20:19 Сейчас в теме
(29) а подскажите, что передавать в качестве КлючСвязи?
Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки", КлючСвязи = "КлючСвязи")
47. Sintson 350 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 350 30.10.13 23:23 Сейчас в теме
(42) в контексте публикации, предлагаю ознакомиться с рабочей конфигурацией, где этот модуль является центральным для визуализации http://infostart.ru/public/205664/
44. yandextesting 143 11.09.14 16:24 Сейчас в теме
45. KroVladS 23 08.10.14 10:45 Сейчас в теме
(0) Ещё бы найти пример как в ТЧ загнать справочник номенклатуры с иерархией из запроса.
48. SvetaS2014 17.02.17 19:01 Сейчас в теме
не открывается -"Невосстановимая ошибка
Ошибка при выполнении запроса GET к ресурсу /e1cib/userSettings:
по причине:
Ошибка SDBL:
В схеме базы данных нет таблицы с именем SystemSettings (pos=20)"
49. Sintson 350 19.02.17 16:24 Сейчас в теме
(48) Возможно требуется конвертация, конфигурация по-моему 8.1.
50. SvetaS2014 19.02.17 21:25 Сейчас в теме
конфигуратор пишет "Невосстановимая ошибка" и вылетает.... Как её открыть??
51. SvetaS2014 19.02.17 21:27 Сейчас в теме
чем её конвертировать? конфигуратор вылетает...
53. Sintson 350 20.02.17 09:54 Сейчас в теме
(51) Коллега Alister прав. Конфигурация рабочая, у меня в 8.3.8 не конвертится напрямую из 8.1. Найдите платформу 8.2. или 8.1. и я думаю все получится.
54. Alister 9 20.02.17 14:15 Сейчас в теме
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 350 15.03.17 22:19 Сейчас в теме
(55) Добрый вечер!
Я бы посоветовал Вам скачать демо конфигурацию, там пример использования.
А вообще этот реквизит необходим, добавьте в дерево эту колонку.
57. Tanis 16.03.17 13:04 Сейчас в теме
Добрый день!
Спасибо! За совет. Правда, не написал сразу, и еще не пробовал добавить поле. Но у меня дерево виртуальное, там этот Ключ строки поставить в цикле - "н + 1" ? Или как-то по другому алгоритму? Что родитель - 1, а подчиненные 2....н, дерево двухуровневое.
Спасибо!
58. Sintson 350 16.03.17 18:17 Сейчас в теме
1. Добавьте в своем дереве колонки "КлючСтроки" и "КлючСвязи"
2. Запустите последовательно процедуры:
ОбновитьКлючиСтрокВДеревеЗначений(ВашеДерево)
ОбновитьКлючиСвязиВДеревеЗначений(ВашеДерево)
3. ВашеДерево готово для дальнейшей работы по теме
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 7 22.09.18 16:58 Сейчас в теме
(62) не взлетит, не все функции указали:

ИмяКолонкиОтбора = <<?>>УникальноеИмяКолонки(); (Проверка: Толстый клиент (обычное приложение))
65. Team leader 7 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х колонок)
63. Sintson 350 15.06.18 11:51 Сейчас в теме
(61) Что именно не работает? В чём выражается ошибка?
КлючСтроки - это ключ строки, КлючСвязи хранит ключ строки родителя. По этим колонкам строится структура делева.
Оставьте свое сообщение