Добавить строку в дерево значений на сервере
Необходимо в текущую строку дерева значений записать данные в процедуре с директивой На сервере. В ОФ работает
В уф падает: "Ошибка передачи данных между клиентом и сервером. Отсутствует отображение для типа 'СтрокаДереваЗначений'".
Падает при открытии формы, обработки запускаются в ПриСозданииНаСервере.
мДерево - строка дерева значений, как ее добавить в дерево значений на сервере?
Заранее спасибо!
Элементы.ДеревоДокументов.ТекущаяСтрока = мДерево;
В уф падает: "Ошибка передачи данных между клиентом и сервером. Отсутствует отображение для типа 'СтрокаДереваЗначений'".
Падает при открытии формы, обработки запускаются в ПриСозданииНаСервере.
мДерево - строка дерева значений, как ее добавить в дерево значений на сервере?
Заранее спасибо!
По теме из базы знаний
- Вывод Таблицы Значений или Дерева Значений на экран управляемой формы без объявления колонок в реквизитах формы
- Программное копирование узла/строки дерева значений на управляемой форме (УФ, ДанныеФормыДерево, ДанныеФормыЭлементДерева) в вариантах на клиенте и на сервере
- Загрузка JSON в дерево значений
- Преобразование Структуры в Дерево значений и Дерева значений в Структуру. Управляемые формы
- Вывод условного оформления дерева значений или табличной части в эксель
Найденные решения
(27)Плохая идея с идентификатором.
Попробуйте так:
Попробуйте так:
&НаСервере
Перем ТекСтрока;
&НаСервере
Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
///.......................................
Если СписокРеквизитов.Количество() = 1 Тогда
ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
ВывестиБезРодителей(СписокРеквизитов);
ТекСтрока = ДеревоДокументов;
КонецЕсли;
Если ТекСтрока = Неопределено Тогда
Строка = ДеревоДокументов.ПолучитьЭлементы().Добавить();
Иначе
Строка = ТекСтрока.ПолучитьЭлементы().Добавить();
КонецЕсли;
ТекСтрока = Строка;
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
КонецЕсли;
Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Строка.Ссылка= Выборка.Ссылка;
Строка.Проведен = Выборка.Проведен;
Строка.ПометкаУдаления = Выборка.ПометкаУдаления;
Строка.ДокументПредставление = Выборка.Представление;
Строка.СуммаДокумента = Выборка.СуммаДокумента;
Строка.ВалютаДокумента = Выборка.ВалютаДокумента;
Строка.ВидДокумента = Выборка.Метаданные;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
Иначе
Строка.Ссылка= ДокументСсылка;
Строка.ДокументПредставление = Строка(ДокументСсылка);
Строка.СуммаДокумента = ДокументСсылка.СуммаДокумента;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
КонецЕсли;
КонецПроцедуры
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1) Идентификатор = Элементы.ДеревоДокументов.ТекущаяСтрока
ДобавитьНаСервере(Идентификатор)
процедура ДобавитьНаСервере(Идентификатор)
ДанныеДерева = деревоДокументов.НайтиПоИдентификатору(Идентификатор)
ПодчиненнаяСтрока = ДанныеДерева.ПолучитьЭлементы().добавить();
ДобавитьНаСервере(Идентификатор)
процедура ДобавитьНаСервере(Идентификатор)
ДанныеДерева = деревоДокументов.НайтиПоИдентификатору(Идентификатор)
ПодчиненнаяСтрока = ДанныеДерева.ПолучитьЭлементы().добавить();
(16) Я добился иерархии в дереве значений, но только в строке дерева значений. Т.е. у меня тип значения "СтрокаДереваЗначений", значение в отладчике раскрывается иерархией. Как мне теперь На Сервере записать эту строку в дерево значений ?
Пытаюсь вот так, но дерево пустое:
Прошу помочь, не исключаю, что делаю какую-то глупость...
Пытаюсь вот так, но дерево пустое:
//Вот тут я получаю строку (к сожалению, если сразу в реквизит формы (дерево) записывать, не получается добиться иерархии, так как при новом обращении к реквизиту через "РеквизитФормыВЗначение" не виден родитель, т.е. записывается новая строка, а не подстрока)
Дерево = ВывестиРодительскиеДокументы(ДокументСсылка);
тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
Строка = тДерево.Строки.Добавить();
Строка = Дерево;
ЗначениеВРеквизитФормы(Дерево,"ДеревоДокументов");
ПоказатьПрошу помочь, не исключаю, что делаю какую-то глупость...
(16) К чему сейчас пришел:
Но дерево выводится без иерархии, в "Строка" иерархия есть, но в "СтрокаДерево" помещается без иерархии
Строка = ВывестиРодительскиеДокументы(ДокументСсылка);
тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
СтрокаДерева = тДерево.Строки.Добавить();
ЗаполнитьЗначенияСвойств(СтрокаДерева,Строка);
ЗначениеВРеквизитФормы(тДерево,"ДеревоДокументов");
ПоказатьНо дерево выводится без иерархии, в "Строка" иерархия есть, но в "СтрокаДерево" помещается без иерархии
(19)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.ДокументСсылка = Неопределено ИЛИ Параметры.ДокументСсылка.Пустая() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ДокументСсылка = Параметры.ДокументСсылка;
мУжеВСписке = Новый Соответствие;
мКэшРеквизитовДокумента = Новый Соответствие;
мКэшПраваДоступаКМетаданным = Новый Соответствие;
ВывестиДеревоДокументов(); //!!!
КонецПроцедуры
&НаСервере
Процедура ВывестиДеревоДокументов()
Дерево = ВывестиРодительскиеДокументы(ДокументСсылка);
ЗначениеВРеквизитФормы(Дерево,"ДеревоДокументов");
//Если Дерево - дерево, то возвращается без иерархии
//Если Дерево - строка дерева, то возвращается с нужной правильной иерархией, но в таком случае не получается строку
//поместить в дерево реквизит формы
КонецПроцедуры
&НаСервере
Функция ВывестиРодительскиеДокументы(ДокументСсылка)
МетаданныеДокумента = ДокументСсылка.Метаданные();
СписокРеквизитов = Новый СписокЗначений;
МетаданныеДокументы = Метаданные.Документы;
мКэшМетаданныеРеквизита = новый соответствие;
Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
ТипыРеквизита = Реквизит.Тип.Типы();
Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
МетаданныеРеквизита = мКэшМетаданныеРеквизита.Получить(ТекущийТип);
Если МетаданныеРеквизита = неопределено Тогда
МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
мКэшМетаданныеРеквизита.Вставить(ТекущийТип,МетаданныеРеквизита);
КонецЕсли;
Если МетаданныеРеквизита<>Неопределено
И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
Попытка
ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
Исключение
Прервать;
КонецПопытки;
ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
Попытка
СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
Исключение
ОтладкаТекстОшибки = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
СтрРеквизитов = "";
Попытка
СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
Исключение
Прервать;
КонецПопытки;
Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
ТипыРеквизита = Реквизит.Тип.Типы();
Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
Если МетаданныеРеквизита<>Неопределено И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
СодержимоеТЧ.Свернуть(СтрРеквизитов);
Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
Попытка
ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
Исключение
Продолжить;
КонецПопытки;
МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
Если МетаданныеЗначения = Неопределено Тогда
// базовый тип
Продолжить;
КонецЕсли;
ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
И МетаданныеДокументы.Содержит(МетаданныеЗначения)
И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
Попытка
СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
Исключение
ОтладкаТекстОшибки = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СписокРеквизитов.СортироватьПоПредставлению();
мУжеВСписке.Вставить(ДокументСсылка, Истина);
Если СписокРеквизитов.Количество() = 1 Тогда
Родитель = ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение); //Вот тут рекурсия
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
Родитель = ВывестиБезРодителей(СписокРеквизитов); //Вывожу верхние элементы. Если возвращаю дерево, то*
КонецЕсли;
СтрокаРодителя = Родитель.Строки.Добавить(); //*вот здесь строка ставится новой строкой из-за этого нет иерархии, если
//возвращаю строку, то здесь в строке есть последний добавленный элемент,
//который является родителем и далее при завершении предыдущих вызовов
//элементы становятся дочерними
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
КонецЕсли;
Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтрокаРодителя.Ссылка= Выборка.Ссылка;
СтрокаРодителя.Проведен = Выборка.Проведен;
СтрокаРодителя.ПометкаУдаления = Выборка.ПометкаУдаления;
СтрокаРодителя.ДокументПредставление = Выборка.Представление;
СтрокаРодителя.СуммаДокумента = Выборка.СуммаДокумента;
СтрокаРодителя.ВалютаДокумента = Выборка.ВалютаДокумента;
СтрокаРодителя.ВидДокумента = Выборка.Метаданные;
Иначе
СтрокаРодителя.Ссылка= ДокументСсылка;
СтрокаРодителя.ДокументПредставление = Строка(ДокументСсылка);
СтрокаРодителя.СуммаДокумента = ДокументСсылка.СуммаДокумента;
КонецЕсли;
Возврат Родитель;
//Возврат СтрокаРодителя;
КонецФункции
&НаСервере
Функция ВывестиБезРодителей(СписокДокументов)
Дерево = Новый ДеревоЗначений;
МассивТипов = Новый Массив;
МассивТиповВалюты = Новый Массив;
МассивТиповВалюты.Добавить(Тип("СправочникСсылка.Валюты"));
Дерево.Колонки.Добавить("СуммаДокумента", Новый ОписаниеТипов("Число"));
Дерево.Колонки.Добавить("ДокументПредставление", Новый ОписаниеТипов("Строка"));
Дерево.Колонки.Добавить("ВидДокумента", Новый ОписаниеТипов("Строка"));
Дерево.Колонки.Добавить("Ссылка", Новый ОписаниеТипов(МассивТипов));
Дерево.Колонки.Добавить("ПометкаУдаления", Новый ОписаниеТипов("Булево"));
Дерево.Колонки.Добавить("ОграничениеПоРодителям", Новый ОписаниеТипов("Булево"));
Дерево.Колонки.Добавить("Проведен", Новый ОписаниеТипов("Булево"));
Дерево.Колонки.Добавить("ВалютаДокумента", Новый ОписаниеТипов(МассивТиповВалюты));
Для Каждого ЭлементСписка Из СписокДокументов Цикл
МетаданныеДокумента = ЭлементСписка.Значение.Метаданные();
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ЭлементСписка.Значение);
Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
КонецЕсли;
Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
КонецЕсли;
Для Каждого ЭлементТипа Из Документы.ТипВсеСсылки().Типы() Цикл
МассивТипов.Добавить(ЭлементТипа)
КонецЦикла;
Для Каждого ЭлементТипа Из Справочники.ТипВсеСсылки().Типы() Цикл
МассивТипов.Добавить(ЭлементТипа)
КонецЦикла;
Для Каждого ЭлементТипа Из ПланыВидовХарактеристик.ТипВсеСсылки().Типы() Цикл
МассивТипов.Добавить(ЭлементТипа)
КонецЦикла;
Выборка = Запрос.Выполнить().Выбрать();
ЕСли Выборка.Следующий() Тогда
Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
СтрокаДерева = Дерево.Строки.Добавить();
//тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
//СтрокаДерева = тДерево.Строки.Добавить();
////СтрокаДерева = мДерево.Строки.Добавить();
СтрокаДерева.Ссылка= Выборка.Ссылка;
СтрокаДерева.Проведен = Выборка.Проведен;
СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
СтрокаДерева.ДокументПредставление = Выборка.Представление;
СтрокаДерева.ВидДокумента = Выборка.Метаданные;
СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
СтрокаДерева.ОграничениеПоРодителям = Истина;
//ЗначениеВРеквизитФормы(тДерево,"ДеревоДокументов");
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Дерево;
//Возврат СтрокаДерева;
КонецФункции
Показать
(20)Примерно так:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.ДокументСсылка = Неопределено ИЛИ Параметры.ДокументСсылка.Пустая() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;
ДокументСсылка = Параметры.ДокументСсылка;
мУжеВСписке = Новый Соответствие;
мКэшРеквизитовДокумента = Новый Соответствие;
мКэшПраваДоступаКМетаданным = Новый Соответствие;
ВывестиДеревоДокументов(); //!!!
КонецПроцедуры
&НаСервере
Процедура ВывестиДеревоДокументов()
ВывестиРодительскиеДокументы(ДокументСсылка);
КонецПроцедуры
&НаСервере
Функция ВывестиРодительскиеДокументы(ДокументСсылка)
МетаданныеДокумента = ДокументСсылка.Метаданные();
СписокРеквизитов = Новый СписокЗначений;
МетаданныеДокументы = Метаданные.Документы;
мКэшМетаданныеРеквизита = новый соответствие;
Для Каждого Реквизит ИЗ МетаданныеДокумента.Реквизиты Цикл
ТипыРеквизита = Реквизит.Тип.Типы();
Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
МетаданныеРеквизита = мКэшМетаданныеРеквизита.Получить(ТекущийТип);
Если МетаданныеРеквизита = неопределено Тогда
МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
мКэшМетаданныеРеквизита.Вставить(ТекущийТип,МетаданныеРеквизита);
КонецЕсли;
Если МетаданныеРеквизита<>Неопределено
И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
Попытка
ЗначениеРеквизита = ДокументСсылка[Реквизит.Имя];
Исключение
Прервать;
КонецПопытки;
ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая() И ТипЗнч(ЗначениеРеквизита) = ТекущийТип
И мУжеВСписке[ЗначениеРеквизита] = Неопределено И СписокРеквизитов.НайтиПоЗначению(ДокументСсылка[Реквизит.Имя]) = Неопределено Тогда
Попытка
СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
Исключение
ОтладкаТекстОшибки = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Для Каждого ТЧ Из МетаданныеДокумента.ТабличныеЧасти Цикл
СтрРеквизитов = "";
Попытка
СодержимоеТЧ = ДокументСсылка[ТЧ.Имя].Выгрузить();
Исключение
Прервать;
КонецПопытки;
Для Каждого Реквизит ИЗ ТЧ.Реквизиты Цикл
ТипыРеквизита = Реквизит.Тип.Типы();
Для Каждого ТекущийТип ИЗ ТипыРеквизита Цикл
МетаданныеРеквизита = Метаданные.НайтиПоТипу(ТекущийТип);
Если МетаданныеРеквизита<>Неопределено И МетаданныеДокументы.Содержит(МетаданныеРеквизита)
И ПравоДоступа("Чтение", МетаданныеРеквизита) Тогда
СтрРеквизитов = СтрРеквизитов + ?(СтрРеквизитов = "", "", ", ") + Реквизит.Имя;
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
СодержимоеТЧ.Свернуть(СтрРеквизитов);
Для Каждого КолонкаТЧ ИЗ СодержимоеТЧ.Колонки Цикл
Для Каждого СтрокаТЧ ИЗ СодержимоеТЧ Цикл
Попытка
ЗначениеРеквизита = СтрокаТЧ[КолонкаТЧ.Имя];
Исключение
Продолжить;
КонецПопытки;
МетаданныеЗначения = Метаданные.НайтиПоТипу(ТипЗнч(ЗначениеРеквизита));
Если МетаданныеЗначения = Неопределено Тогда
// базовый тип
Продолжить;
КонецЕсли;
ЕСли ЗначениеРеквизита<>Неопределено И НЕ ЗначениеРеквизита.Пустая()
И МетаданныеДокументы.Содержит(МетаданныеЗначения)
И мУжеВСписке[ЗначениеРеквизита] = Неопределено Тогда
Если СписокРеквизитов.НайтиПоЗначению(ЗначениеРеквизита) = Неопределено Тогда
Попытка
СписокРеквизитов.Добавить(ЗначениеРеквизита,Формат(ЗначениеРеквизита.Дата,"ДФ=yyyyMMddЧЧММсс"));
Исключение
ОтладкаТекстОшибки = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СписокРеквизитов.СортироватьПоПредставлению();
мУжеВСписке.Вставить(ДокументСсылка, Истина);
Если СписокРеквизитов.Количество() = 1 Тогда
Родитель = ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение); //Вот тут рекурсия
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
ВывестиБезРодителей(СписокРеквизитов); //Вывожу верхние элементы. Если возвращаю дерево, то*
Родитель = ДеревоДокументов;
КонецЕсли;
СтрокаРодителя = Родитель.ПолучитьЭлементы().Добавить(); //*вот здесь строка ставится новой строкой из-за этого нет иерархии, если
//возвращаю строку, то здесь в строке есть последний добавленный элемент,
//который является родителем и далее при завершении предыдущих вызовов
//элементы становятся дочерними
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
КонецЕсли;
Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
СтрокаРодителя.Ссылка= Выборка.Ссылка;
СтрокаРодителя.Проведен = Выборка.Проведен;
СтрокаРодителя.ПометкаУдаления = Выборка.ПометкаУдаления;
СтрокаРодителя.ДокументПредставление = Выборка.Представление;
СтрокаРодителя.СуммаДокумента = Выборка.СуммаДокумента;
СтрокаРодителя.ВалютаДокумента = Выборка.ВалютаДокумента;
СтрокаРодителя.ВидДокумента = Выборка.Метаданные;
Иначе
СтрокаРодителя.Ссылка= ДокументСсылка;
СтрокаРодителя.ДокументПредставление = Строка(ДокументСсылка);
СтрокаРодителя.СуммаДокумента = ДокументСсылка.СуммаДокумента;
КонецЕсли;
Возврат Родитель;
//Возврат СтрокаРодителя;
КонецФункции
&НаСервере
Процедура ВывестиБезРодителей(СписокДокументов)
МассивТипов = Новый Массив;
Для Каждого ЭлементСписка Из СписокДокументов Цикл
МетаданныеДокумента = ЭлементСписка.Значение.Метаданные();
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ЭлементСписка.Значение);
Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
КонецЕсли;
Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
КонецЕсли;
Для Каждого ЭлементТипа Из Документы.ТипВсеСсылки().Типы() Цикл
МассивТипов.Добавить(ЭлементТипа)
КонецЦикла;
Для Каждого ЭлементТипа Из Справочники.ТипВсеСсылки().Типы() Цикл
МассивТипов.Добавить(ЭлементТипа)
КонецЦикла;
Для Каждого ЭлементТипа Из ПланыВидовХарактеристик.ТипВсеСсылки().Типы() Цикл
МассивТипов.Добавить(ЭлементТипа)
КонецЦикла;
Выборка = Запрос.Выполнить().Выбрать();
ЕСли Выборка.Следующий() Тогда
Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
СтрокаДерева = ДеревоДокументов.ПолучитьЭлементы().Добавить();
СтрокаДерева.Ссылка= Выборка.Ссылка;
СтрокаДерева.Проведен = Выборка.Проведен;
СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
СтрокаДерева.ДокументПредставление = Выборка.Представление;
СтрокаДерева.ВидДокумента = Выборка.Метаданные;
СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
СтрокаДерева.ОграничениеПоРодителям = Истина;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(21)
Вот так ошибка: Поле объекта не обнаружено (Строки)
т.к. это ДанныеФормыДерево
А если вот так, то выводит без иерархии:
Заменил на
Теперь выводит с иерархией, но очень странно, родитель - пустая строка. (На скрине сверху что получилось, снизу к чему надо придти)
Могу получить последний элемент. Может быть можно как-то от него "двигаться" ?
Если СписокРеквизитов.Количество() = 1 Тогда
ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
ВывестиБезРодителей(СписокРеквизитов);
Родитель = ДеревоДокументов;
КонецЕсли;
СтрокаРодителя = Родитель.Строки.Добавить();
ПоказатьВот так ошибка: Поле объекта не обнаружено (Строки)
т.к. это ДанныеФормыДерево
А если вот так, то выводит без иерархии:
СтрокаРодителя = ДеревоДокументов.ПолучитьЭлементы().Добавить();
Заменил на
СтрокаРодителя = ДеревоДокументов.ПолучитьЭлементы().Добавить();
ПодстрокаРодителя = СтрокаРодителя.ПолучитьЭлементы().Добавить();
Теперь выводит с иерархией, но очень странно, родитель - пустая строка. (На скрине сверху что получилось, снизу к чему надо придти)
Могу получить последний элемент. Может быть можно как-то от него "двигаться" ?
Прикрепленные файлы:
(24) К сожалению, не получается...
Дело в том, что при "остаточном" выполнении кода (не знаю, как назвать правильно), когда продолжает двигаться тот код, который вызвал рекурсию в условии, и в "ИначеЕсли" он не попадает, поэтому сначала Родитель - ДанныеФормыДерево, а потом уже Не определено.
Вынес за условие:
И в таком случае не получается иерархии в дереве.
Дело в том, что при "остаточном" выполнении кода (не знаю, как назвать правильно), когда продолжает двигаться тот код, который вызвал рекурсию в условии, и в "ИначеЕсли" он не попадает, поэтому сначала Родитель - ДанныеФормыДерево, а потом уже Не определено.
Родитель = ДеревоДокументов;
КонецЕсли;
СтрокаРодителя = Родитель.ПолучитьЭлементы().Добавить();
Вынес за условие:
Если СписокРеквизитов.Количество() = 1 Тогда
ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
ВывестиБезРодителей(СписокРеквизитов);
//Родитель = ДеревоДокументов;
КонецЕсли;
Родитель = ДеревоДокументов;
СтрокаРодителя = Родитель.ПолучитьЭлементы().Добавить();
ПоказатьИ в таком случае не получается иерархии в дереве.
(24) К чему я сейчас пришел)
Есть иерархия, но создается пустая строка, и каждый след элемент наследуется от новой пустой строки.
Почему-то во время завершения старых вызовов количество элементов дерева не меняется (2), хотя я могу получить по идентификатору и 3-й (пустая строка) и 4-й и 5-й (пустая строка).
Думал сделать счетчик в выборке, и раз не увеличивается количество элементов, то могу прибавлять счетчик из идентификатора - но он тоже обнуляется при завершении предыдущих вызовов...
Индентификатор = Родитель.ПолучитьЭлементы().Количество() - 1;
Строка = ДеревоДокументов.НайтиПоИдентификатору(Индентификатор).ПолучитьЭлементы().Добавить();
ПодстрокаРодителя = Строка.ПолучитьЭлементы().Добавить();
Есть иерархия, но создается пустая строка, и каждый след элемент наследуется от новой пустой строки.
Почему-то во время завершения старых вызовов количество элементов дерева не меняется (2), хотя я могу получить по идентификатору и 3-й (пустая строка) и 4-й и 5-й (пустая строка).
Думал сделать счетчик в выборке, и раз не увеличивается количество элементов, то могу прибавлять счетчик из идентификатора - но он тоже обнуляется при завершении предыдущих вызовов...
Прикрепленные файлы:
(24) Дорогой дневник..))))
В общем, есть сдвиги, осталось разобраться, почему пустые строки добавляются...
В общем, есть сдвиги, осталось разобраться, почему пустые строки добавляются...
Перем Сч;
&НаСервере
Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
///.......................................
Если СписокРеквизитов.Количество() = 1 Тогда
ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
ВывестиБезРодителей(СписокРеквизитов);
КонецЕсли;
Родитель = ДеревоДокументов;
Количество = ДеревоДокументов.ПолучитьЭлементы().Количество();
Индентификатор = ДеревоДокументов.ПолучитьЭлементы().Количество() - 1 + Сч;
Строка = ДеревоДокументов.НайтиПоИдентификатору(Индентификатор).ПолучитьЭлементы().Добавить();
//ПодстрокаРодителя = Строка.ПолучитьЭлементы().Добавить();
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
КонецЕсли;
Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Строка.Ссылка= Выборка.Ссылка;
Строка.Проведен = Выборка.Проведен;
Строка.ПометкаУдаления = Выборка.ПометкаУдаления;
Строка.ДокументПредставление = Выборка.Представление;
Строка.СуммаДокумента = Выборка.СуммаДокумента;
Строка.ВалютаДокумента = Выборка.ВалютаДокумента;
Строка.ВидДокумента = Выборка.Метаданные;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
Сч = Сч + 2;
Иначе
Строка.Ссылка= ДокументСсылка;
Строка.ДокументПредставление = Строка(ДокументСсылка);
Строка.СуммаДокумента = ДокументСсылка.СуммаДокумента;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
Сч = Сч + 2;
КонецЕсли;
КонецПроцедуры
ПоказатьПрикрепленные файлы:
(27)Плохая идея с идентификатором.
Попробуйте так:
Попробуйте так:
&НаСервере
Перем ТекСтрока;
&НаСервере
Процедура ВывестиРодительскиеДокументы(ДокументСсылка)
///.......................................
Если СписокРеквизитов.Количество() = 1 Тогда
ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);
ИначеЕсли СписокРеквизитов.Количество() > 1 Тогда
ВывестиБезРодителей(СписокРеквизитов);
ТекСтрока = ДеревоДокументов;
КонецЕсли;
Если ТекСтрока = Неопределено Тогда
Строка = ДеревоДокументов.ПолучитьЭлементы().Добавить();
Иначе
Строка = ТекСтрока.ПолучитьЭлементы().Добавить();
КонецЕсли;
ТекСтрока = Строка;
Запрос = Новый Запрос("ВЫБРАТЬ РАЗРЕШЕННЫЕ Ссылка, Проведен, ПометкаУдаления, #Сумма, #Валюта, Представление, """ + МетаданныеДокумента.Имя + """ КАК Метаданные
| ИЗ Документ."+МетаданныеДокумента.Имя + " ГДЕ Ссылка = &Ссылка");
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Если МетаданныеДокумента.Реквизиты.Найти("СуммаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "СуммаДокумента КАК СуммаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Сумма", "NULL КАК СуммаДокумента");
КонецЕсли;
Если МетаданныеДокумента.Реквизиты.Найти("ВалютаДокумента") <> Неопределено Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "ВалютаДокумента КАК ВалютаДокумента");
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, "#Валюта", "NULL КАК ВалютаДокумента");
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Строка.Ссылка= Выборка.Ссылка;
Строка.Проведен = Выборка.Проведен;
Строка.ПометкаУдаления = Выборка.ПометкаУдаления;
Строка.ДокументПредставление = Выборка.Представление;
Строка.СуммаДокумента = Выборка.СуммаДокумента;
Строка.ВалютаДокумента = Выборка.ВалютаДокумента;
Строка.ВидДокумента = Выборка.Метаданные;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
Иначе
Строка.Ссылка= ДокументСсылка;
Строка.ДокументПредставление = Строка(ДокументСсылка);
Строка.СуммаДокумента = ДокументСсылка.СуммаДокумента;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
КонецЕсли;
КонецПроцедуры
Показать
(21)
Добавил:
Получилось убрать первую пустую, но дальше дочерние так и "цепляются" за пустые строки.
Почему-то количество элементов в дереве не меняется...
Добавил:
Индентификатор = ДеревоДокументов.ПолучитьЭлементы().Количество() - 1;
Строка = ДеревоДокументов.НайтиПоИдентификатору(Индентификатор).ПолучитьЭлементы().Добавить();
ПодстрокаРодителя = Строка.ПолучитьЭлементы().Добавить();
Получилось убрать первую пустую, но дальше дочерние так и "цепляются" за пустые строки.
Почему-то количество элементов в дереве не меняется...
(6)Прошу Вас помочь, не могу разобраться...
ОФ:
Пытаюсь переделать на УФ:
Но в таком случае не получается иерархии.
в ОФ в переменную, которая везде доступна записывается строка дерева значений с иерархией, а потом в дерево значений формы записывается получившаяся строка
Если так же пытаюсь через переменную, то в УФ пишет Поле объекта не обнаружено (Строки) у этой переменной...
ОФ:
.....
//В процедуре 1
Выборка = Запрос.Выполнить().Выбрать();
СтрокаДерева = мДерево.Строки.Добавить();
Если Выборка.Следующий() Тогда
СтрокаДерева.Ссылка= Выборка.Ссылка;
СтрокаДерева.Проведен = Выборка.Проведен;
СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
СтрокаДерева.ДокументПредставление = Выборка.Представление;
СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
СтрокаДерева.ВидДокумента = Выборка.Метаданные;
Иначе
СтрокаДерева.Ссылка= ДокументСсылка;
СтрокаДерева.ДокументПредставление = Строка(ДокументСсылка);
СтрокаДерева.СуммаДокумента = ДокументСсылка.СуммаДокумента;
КонецЕсли;
мДерево = СтрокаДерева;
// В процедуре 2
ЕСли Выборка.Следующий() Тогда
Если мУжеВСписке[Выборка.Ссылка] = Неопределено Тогда
СтрокаДерева = мДерево.Строки.Добавить();
СтрокаДерева.Ссылка= Выборка.Ссылка;
СтрокаДерева.Проведен = Выборка.Проведен;
СтрокаДерева.ПометкаУдаления = Выборка.ПометкаУдаления;
СтрокаДерева.ДокументПредставление = Выборка.Представление;
СтрокаДерева.ВидДокумента = Выборка.Метаданные;
СтрокаДерева.СуммаДокумента = Выборка.СуммаДокумента;
СтрокаДерева.ВалютаДокумента = Выборка.ВалютаДокумента;
СтрокаДерева.ОграничениеПоРодителям = Истина;
мУжеВСписке.Вставить(Выборка.Ссылка, Истина);
КонецЕсли;
КонецЕсли;
КонецЦикла;
мДерево = СтрокаДерева;
//В выводе
мДерево = ДеревоДокументов;
Процедура 1
Процедура 2
ЭлементыФормы.ДеревоДокументов.ТекущаяСтрока = мДерево;
ПоказатьПытаюсь переделать на УФ:
тДерево = РеквизитФормыВЗначение("ДеревоДокументов");
СтрокаДерева = тДерево.Строки.Добавить();
ЗначениеВРеквизитФормы(тДерево,"ДеревоДокументов");
Но в таком случае не получается иерархии.
в ОФ в переменную, которая везде доступна записывается строка дерева значений с иерархией, а потом в дерево значений формы записывается получившаяся строка
Если так же пытаюсь через переменную, то в УФ пишет Поле объекта не обнаружено (Строки) у этой переменной...
(7)Добавить строку в дерево в управляемую форму:
НоваяСтрокаКорня = ДеревоДокументов.ПолучитьЭлементы().Добавить();
//тут заполнить значения реквизитов строки дерева
ПодчиненнаяСтрока = НоваяСтрокаКорня.ПолучитьЭлементы().Добавить();
//тут заполнить значения реквизитов строки дерева
(7)
Это не так работает.
Это просто позиционирование - то есть делается текущей нужная строка дерева.
Заполнение дерева выполняется при добавлении строк в мДерево.
в ОФ в переменную, которая везде доступна записывается строка дерева значений с иерархией, а потом в дерево значений формы записывается получившаяся строка
Это не так работает.
ЭлементыФормы.ДеревоДокументов.ТекущаяСтрока = мДерево;
Это просто позиционирование - то есть делается текущей нужная строка дерева.
Заполнение дерева выполняется при добавлении строк в мДерево.
(9) Спасибо Вам большое! А Вы не могли бы еще подсказать, пожалуйста, почему после завершения процедуры код прыгает на строку "ВывестиРодительскиеДокументы(СписокРеквизитов[0].Значение);" ?
Прикрепленные файлы:
Video_2023_04_19-1.webm
Пора бы уже определиться - либо работать с деревом значений на сервере, либо работать с КоллекциейФормы, которая имеет тип дерево значений.
А то вы тут все в кучу намешали.
Да еще и запросы в рекурсии... А если есть запросы - то и нефиг использовать клиент-серверные методы вида ПолучитьЭлементы(), а надо работать сразу с универсальной коллекцией ДеревоЗначений на сервере.
А то вы тут все в кучу намешали.
Да еще и запросы в рекурсии... А если есть запросы - то и нефиг использовать клиент-серверные методы вида ПолучитьЭлементы(), а надо работать сразу с универсальной коллекцией ДеревоЗначений на сервере.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот