Имя: Пароль:
1C
1С v8
Как сохранить дерево значений во внешней обработке.
0 starjons
 
06.09.11
12:44
Коллеги, здравствуйте, подскажите пожалуйста, как я могу сохранить дерево значений во внешней обработке. По порядку: у меня есть элемент управления Табличное поле, который имеет тип - Дерево значений. Колонки создаются динамически приОткрытии. Мне нужно чтобы вся иерархия полностью, которую произвольным образом создает пользователь из справочника - сохранялась.
Что уже пробовала: делать колонки не динамическими при открытии, а стандартно на форме - соханяются данные, но плоско, внутрь папки зайти не могу. Поставила на форме галочку - сохранять данные из табличного поля используя сохранить значение - восстановить значение - сохраняются только плюсики иерархии. Ни ссылок тебе, ни наименования - ничего. Прошу помощи или совета
1 DSSS
 
06.09.11
12:45
Присоединяюсь к вопросу..:)
2 starjons
 
06.09.11
12:46
Спасибо, есть какие то соображения? я в этом хилый специалист)) но необходимость заставит
3 starjons
 
06.09.11
12:46
Процедура ПриОткрытии()
   //заполнение дерева номенклатуры
   ДерВыгр.Колонки.Добавить("Код",,"Код",35);
   ДерВыгр.Колонки.Добавить("Наименование",,"Наименование",100);
   ДерВыгр.Колонки.Добавить("Ссылка",,"Ссылка",0);
   ЭлементыФормы.ДерВыгр.СоздатьКолонки();
   ЭлементыФормы.ДерВыгр.Колонки.Ссылка.Видимость=Ложь;
   
КонецПроцедуры
4 kosts
 
06.09.11
12:47
Попробовать
СохранитьЗначениеВФайл(ЗначениеВСтроку(Дерево))
и обратно
Дерево1 = ЗначениеИЗСтроки(ЗначениеИЗФайла());
Дерево1 - перебрать строки и добавить в Дерево.
5 starjons
 
06.09.11
12:49
(4) вот я так делаю, но только руками. Тогда работает, ну если я сначала (при динамических колонках) сохраняю значения. Потом руками открываю восстановление, восстанавливаю - все нормально. Научи меня пожалуйста как насильно запускать восстановление при открытии?
6 kosts
 
06.09.11
12:54
(5) Как то так

ПриОткрытии()
Дерево1 = ЗначениеИЗСтроки(ЗначениеИЗФайла("Файл"));
Если Дерево1 <> Неопределено Тогда
Для каждого т из Дерево1 Цикл
т1 = Дерево.Добавить();
ЗаполнитьЗначенияСвойств(т1, т);
конеццикла;
конецЕсли;
7 starjons
 
06.09.11
12:55
А файл я должна делать при сохранении значения? По идее он же уже существует - файл с настройкой "Основная".Как на него указать?
8 starjons
 
06.09.11
12:56
(6) попробую щас как написал
9 GANR
 
06.09.11
12:58
(0)А если сначала в хранилище значения преобразовать, потом - в строку, потом - в файл? При восстановлении размотать цепочку в обратном порядке. На самый худой конец вот приблизительный алгоритм обхода дерева...

СтекВызовов = Новый Массив;    
СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ТвоеДерево.ПолучитьЭлементы(), 0));
   
Пока СтекВызовов.Количество() <> 0 Цикл
   ТекущиеПараметры = СтекВызовов[СтекВызовов.Количество()-1];
   Если ТекущиеПараметры.Курсор <= ТекущиеПараметры.НаборСтрок.Количество() - 1 Тогда
       ТекущиеПараметры.НаборСтрок[ТекущиеПараметры.Курсор].Используется = Ложь;
       ДочернийНабор = ТекущиеПараметры.НаборСтрок[ТекущиеПараметры.Курсор].ПолучитьЭлементы();
       ТекущиеПараметры.Курсор = ТекущиеПараметры.Курсор + 1;
       Если ДочернийНабор.Количество() <> 0 Тогда                    
           СтекВызовов.Добавить(Новый Структура("НаборСтрок, Курсор", ДочернийНабор, 0));
       КонецЕсли;
   Иначе                
       СтекВызовов.Удалить(СтекВызовов.Количество()-1);
   КонецЕсли;
КонецЦикла;
10 ASU_Diamond
 
06.09.11
13:04
а сделать в обработке реквизит с типом Дерево значений не подойдет?
11 kosts
 
06.09.11
13:17
(5) Грубо, вот так как то

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

ПриОткрытии()
   Дерево1 = ЗначениеИЗСтроки(ЗначениеИЗФайла("Файл"));
   Если Дерево1 <> Неопределено Тогда
       // Тута лучше использовать что то вроде рекурсивной процедуры
       СкопироватьВетку(Дерево1.Строки, Дерево.Строки);
   конецЕсли;
конецПроцедуры
12 starjons
 
06.09.11
14:11
(10) не могу понять откуда мне надо взять файл для загрузки. 1С сама его делает
13 starjons
 
06.09.11
14:21
и потом в 8 я такого не нашла
есть ЗначениеИзСтрокиВнутр
14 starjons
 
06.09.11
14:33
v8: Есть ли в 8-ке возможность сохранять значений реквизитов формы в файл
нашла тему на форуме , но что то в ней нет  про дерево(
15 kosts
 
06.09.11
14:33
(12) Прежде чем взять что-то, нужно сперва положить что то.
Перед закрытием или при кнопке ОК.

(13)
ЗначениеИзСтрокиВнутр (ValueFromStringInternal)
Синтаксис:
ЗначениеИзСтрокиВнутр(<Строка>)
Параметры:
<Строка> (обязательный)
Тип: Строка. Системное представление значения в строковом виде.



ЗначениеИзФайла (ValueFromFile)
Синтаксис:
ЗначениеИзФайла(<ИмяФайла>)
Параметры:
<ИмяФайла> (обязательный)

Но можно и без ЗначениеИзСтрокиВнутр обойтись.
сразу использовать ЗначениеИзФайла и ЗначениеВФайл
16 starjons
 
06.09.11
14:37
то есть я правильно понимаю:
1.делаю свои кнопки (без автосохранения и автозаполнения)по которым происходит загрузка или сохранение в файл дерева.
2. при открытии беру ранее сохраненный файл и раскручиваю его, заполняя табличное поле.
3.при закрытии с табличное поле обхожу в рекурсии и преобразовываю в строку снова и сохраняю в фаил.
Правильно поняла?
17 kosts
 
06.09.11
14:41
(16) 1. Можно кнопками если интересует выбор из нескольких файлов. Можно жестко прописать файл, тогда при открытии сразу восстановиться предыдущая картина. (только разные пути для разных пользователей).
2. Да раскручивая. (Если случай тривиальный, то можно одним действием ЗначениеИзФайла(), но я рекомендую через промежуточное дерево).
3. Одним действием сохранение в файл
ЗначениеВФайл(Файл, Дерево).
18 starjons
 
06.09.11
14:45
kosts, спасибо большое за помощь - попробую теперь все реализовать как следует... потом выложу что получилось или спрошу.
19 starjons
 
06.09.11
14:59
Процедура ОсновныеДействияФормыСохранить(Кнопка)
   СохраняемВ = РежимДиалогаВыбораФайла.Открытие;
   ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(СохраняемВ);
   ДиалогОткрытияФайла.ПолноеИмяФайла = "";
       
   ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
   ДиалогОткрытияФайла.ПредварительныйПросмотр = Ложь;
   ДиалогОткрытияФайла.Заголовок = "Выберите файл для сохранения";    
   Если ДиалогОткрытияФайла.Выбрать() Тогда
       Фаил = ДиалогОткрытияФайла.ПолноеИмяФайла;
   КонецЕсли;
   ЗнВСтр = ЗначениеВСтрокуВнутр(ЭлементыФормы.ДерВыгр.Значение);
   ЗначениеВФайл(Фаил, ЗнВСтр);
   //запишем путь в реквизит, что бы было откуда брать при открытии
   ФайлСохраненияНастроек = Фаил;
КонецПроцедуры



Процедура ПриОткрытии()
   //заполнение дерева номенклатуры
   ДерВыгр.Колонки.Добавить("Код",,"Код",35);
   ДерВыгр.Колонки.Добавить("Наименование",,"Наименование",100);
   ДерВыгр.Колонки.Добавить("Ссылка",,"Ссылка",0);
   ЭлементыФормы.ДерВыгр.СоздатьКолонки();
   ЭлементыФормы.ДерВыгр.Колонки.Ссылка.Видимость=Ложь;
   
//считываем деревце...
Если ФайлСохраненияНастроек<>"" Тогда
       ЭлементыФормы.ДерВыгр = ЗначениеИЗФайла(ФайлСохраненияНастроек);
   КонецЕсли;
КонецПроцедуры
20 starjons
 
06.09.11
15:00
Сделала вот так, но проблема в том, что у меня опять  только плюсики и минусики....(( никаких наименований нет, кодов нет и ссылок на номенклатуру нет((( Блин, как и в самом начале....убиться
21 starjons
 
06.09.11
15:01
хны
22 starjons
 
06.09.11
15:08
Деревко = ЗначениеИЗСтрокиВнутр(ЗначениеИЗФайла(ФайлСохраненияНастроек));
Так тоже не пашет((
23 Eugeneer
 
06.09.11
15:09
Сейчас
24 Eugeneer
 
06.09.11
15:10
Процедура КоманднаяПанельСохранитьВФайл(Кнопка)
   
   СохранитьДерево = ДеревоНоменклатуры.Скопировать();
   
   ИмяФайла = ПолучитьИмяВременногоФайла("zakup.sel");
   
   Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
   Диалог.ПолноеИмяФайла = ИмяФайла;
   //Диалог.Каталог = ИмяПути;
   Диалог.Заголовок = "Укажите файл";
   Диалог.Расширение = "sel";
   Если Диалог.Выбрать() Тогда
       ИмяФайла = Диалог.ПолноеИмяФайла;
       //ИмяПути = Диалог.Каталог;
   КонецЕсли;
   
   ЗначениеВФайл(ИмяФайла,СохранитьДерево);
   
КонецПроцедуры

Процедура КоманднаяПанельОтрытьИзФайла(Кнопка)
   
   ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
   ДиалогВыбораФайла.Заголовок = "Открыть файл";
   ДиалогВыбораФайла.Фильтр    = "(*.sel)|*.sel";
   
   Если ДиалогВыбораФайла.Выбрать() Тогда
       ФайлНаДиске = Новый Файл(ДиалогВыбораФайла.ПолноеИмяФайла);
       
       ПолноеИмяФайла = СокрЛП(ДиалогВыбораФайла.ПолноеИмяФайла);
       
       ДеревоНоменклатуры = ЗначениеИзФайла(ПолноеИмяФайла);        
   КонецЕсли;
   
КонецПроцедуры
25 Eugeneer
 
06.09.11
15:15
Если же речь идет и стандартном механизме сохранения настроек (одна из которых дерево) при открытии и закрытии формы.
Т.е. сохраняем все в базе то (смотрим ДеревоПолейЗагрузки)

Процедура СформироватьСтруктуруДляСохраненияНастроек(СтруктураСНастройками,ДеревоПолейЗагрузки) Экспорт
   
   Если ТипЗнч(СтруктураСНастройками) <> Тип("Структура") Тогда        
       СтруктураСНастройками = Новый Структура;        
   КонецЕсли;
   
   СтруктураСНастройками.Вставить("НастройкаПоиска", НастройкаПоиска.Выгрузить());
   СтруктураСНастройками.Вставить("ДеревоПолейЗагрузки", ДеревоПолейЗагрузки.Скопировать());
   
   УправлениеОтчетами.СохранитьРеквизитыОтчета(ЭтотОбъект, СтруктураСНастройками);
   
КонецПроцедуры

Функция ВосстановитьНастройкиИзСтруктуры(СтруктураСНастройками,ДеревоПолейЗагрузки, Отчет = Неопределено) Экспорт
   
   Перем ТаблНастр, ТаблПоиск;
   
   УправлениеОтчетами.ВосстановитьРеквизитыОтчета(ЭтотОбъект, СтруктураСНастройками);

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

   Возврат Истина;
   
КонецФункции
26 starjons
 
06.09.11
15:16
Первый ваш код поправила под себя и хочу громко и торжественно прокричать:УРА!!!!!!!!!!!!!СПАСИБО!!!!!!!
Щас посмотрю второй ваш механизм.
27 Eugeneer
 
06.09.11
15:17
(19) не нужно использовать ЭлементыФормы.
Обращение идет напрямую к дереву без элементов.
28 starjons
 
06.09.11
15:20
(27) Возможно по этому тоже подгребало. Но я пробовала и так и сяк - не вышло. Сейчас работает...тестирую. Спасибо еще раз всем!! Благодарю!!
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн