Дерево значений на управляемой форме с сохранением
Доброго времени суток. Может вопрос и изъезженный но ответа не нашел.
Задача: на форме документа сделать дерево значений (в реквизитах формы создал элемент — дерево). Программно заполнить его первый столбец (сделал это без проблем)..дальше юзвери его заполняют и всеп должно сохраняться. ДЗ и ТЗ не сохраняемые в БД элементы коллекции.
По совету создал в объекте таблицу с одноименными колонками + 2, пробовал через преобразование ДЗ-в ТЗ при сохранении и обратно при открытии. Не помогает. Кто что может посоветовать. Спасибо.
(1) Пробовал через него но что-то тоже не взлетело.Может что-то не так делал..Примерчик можно какой-то? Спасибо
ТвоеДеревоОбъект = РеквизитФормыВЗначение(«ТвоеДеревоНаФорме»);
докОбъект.ТвойРеквизитХранилище = Новый ХранилищеЗначения(ТвоеДеревоОбъект);
//восстановление
ТвоеДеревоОбъект = РеквизитФормыВЗначение(«ТвоеДеревоНаФорме»);
ТвоеДеревоОбъект = докОбъект.ТвойРеквизитХранилище .Получить();
ЗначениеВРеквизитФормы(«ТвоеДеревоНаФорме», ТвоеДеревоОбъект )
лучше сделать табчасть, в ней добавить поля GUID строки и GUID родителя. По этим полям восстанавливать дерево при открытии и сохранять — при записи.
(4) В обработе приЗаписиНаСервере Хранилище он видит, а вот при создании и при открытии нифига. Реквизит создан как реквизит объекта
(8) В (4) просто сохранить/восстановить, в отчётах и для целей анализа использовать Хранилище несколько проблематично
По сути вопроса: в документе делаешь ТЧ в удобном для анализа виде с нужными тебе колонками
на форме создаёшь реквизит ТвоёДЗ
запись в ТЧ:
ТЧдокумента.Очистить(); ур1 = ТвоёДЗ.ПолучитьЭлементы(); Для каждого текЭлУр1 из ур1 цикл ур2 = текЭлУр1.ПолучитьЭлементы(); Для каждого текЭлУр2 из ур2 цикл сохраняешь данные в ТЧ документа КонецЦикла; КонеЦикла;
ТвоёДЗ.Очистить(); Для каждого текСтрока из ТЧдокумента цикл ур1 = ТвоёДЗ.ПолучитьЭлементы(); элУр1 = ур1.Добавить(); элур1.Месяц = текСторка.Месяц; ур2 = элУр1.ПолучитьЭлементы(); элУр2 = ур2.Добавить(); элур2.ХХХХ = текСтрока.ХХХХХ; КонецЦикла;
Как-то так, смотри в справке про ДанныеФормыКоллекцияЭлементовДерева или синтаксис помощник + отладчик
(17) чисто уточнить данные заносишь в Объект.ТвояТЧ или в ТекущийОбъект.ТвояТЧ?
ПередЗаписьюНаСервере(, , ) — таки ТекущийОбъект, то что будет записано в БД
(20) Обманываешь, ТекущийОбъект — это то, что из формы прошло контроль и преобразовалось из Формы в ДокументОбъект
В модуле объекта в ПередЗаписью проверь, заполнилась ли ТвояТЧ
21+ т.е. у тебя Объект — это старые данные формы, ТекущийОбъект — уже заполненный данными формы ДокументОбъект
но, в обработчике, ты имеешь доступ одновременно к Реквизитам формы и ДокументОбъект, вот и перелей своё дерево в ТЧ документа
(22) В оконцовке перед записью Объект.ТабЧасть заполненная а вот после закрытия при открытии в процедуре ПриСозданииНаСервере — пустая
надеюсь, идея будет понятна
подход, как в (10) тоже имеет право на существование, но имхо, забрать дерево на сервер методом ДанныеФормыВЗначение() а потом вернуть обратно несколько проще.
_год = Формат(Год(Объект.Дата), «ЧГ=;ЧРГ=;ЧРД=»);
ТекущийОбъект.БюджетПоМесяцам.Очистить();
СохранитьДеревоБДРвТаблицуДокументаРекурсивноСервер(ДеревоБДРФорма.Строки, ТекущийОбъект.БюджетПоМесяцам, _год);
КонецПроцедуры
Процедура СохранитьДеревоБДРвТаблицуДокументаРекурсивноСервер(СтрокиДереваФормы, БюджетПоМесяцам_, _год)
Для Каждого Стр Из СтрокиДереваФормы Цикл
Если Стр.ЭтоГруппа Тогда
СохранитьДеревоБДРвТаблицуДокументаРекурсивноСервер(Стр.Строки, БюджетПоМесяцам_, _год);
Иначе
//пропустим строки, в которых Итого — пусто (значит и в других колонках пусто)
Если Стр.План13 = 0 Тогда
Продолжить;
КонецЕсли;
//цикл по колонкам — месяцам. 13-я колонка (Итого по статье) не нужна, она не хранится, а вычисляется в дереве
Для сч = 1 по 12 Цикл
Если Стр[«План»+сч] = 0 Тогда
Продолжить;
КонецЕсли;
// план на месяц пишем в первое число месяца
ДатаДвижения = Дата(_год, Строка(сч), «1»);
// новая запись в ТЧ БюджетПоМесяцам
Запись = БюджетПоМесяцам_.Добавить();
Запись.Период = ДатаДвижения;
Запись.Статья = Стр.СтатьяДР;
Запись.СуммаПлан = Стр[«План»+сч];
это было сохранение
теперь то, что надо сделать при открытии
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
СтруктураПараметров = Новый Структура(«ДеревоБДРФорма, Объект, Бюджет»,
ДеревоБДРФорма, Объект, Объект.Бюджет);
Процедура ЗаполнитьДеревоИзСправочникаСервер(СтруктураПараметров) Экспорт
ДеревоБДРФорма=СтруктураПараметров.ДеревоБДРФорма;
Объект_=Неопределено;
СтруктураПараметров.Свойство(«Объект»,Объект_);//док ПланированиеБюджетаУУ, может быть Неопределено
Бюджет = Неопределено;
СтруктураПараметров.Свойство(«Бюджет»,Бюджет);
Запрос = Новый Запрос;
МенеджерВТ = Новый МенеджерВременныхТаблиц();
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.УстановитьПараметр(«ДокументПланирования»,Объект_.Ссылка);
Запрос.УстановитьПараметр(«НачПериода»,НачалоГода(Объект_.Дата));
Запрос.УстановитьПараметр(«КонПериода»,КонецГода(Объект_.Дата));
Запрос.УстановитьПараметр(«Бюджет»,Бюджет);
Запрос.Текст = ПолучитьТекстЗапроса(Запрос);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
Процедура ЗаполнитьДеревоБДРРекурсивноСервер(Выборка, СтрокаДереваФормы)
Пока Выборка.Следующий() Цикл
//это чтобы группы не попадали внутрь группировки
//пример того, что будет без этого условия, показан на
//общей картинке ОбходЗапросаПоГруппировкамСИерархией
//зеленым выделены правильные итоги по иерархии
//синим — итоги по группировкам элементов (там один элемент, но этого для примера достаточно)
//красным — итоги по группировкам, где в качестве группирующего объекта
//выступает группа справочника, по которой выше уже были выведены
//итоги, но по иерархии.
Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке И Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
НовСтр = СтрокаДереваФормы.Строки.Добавить();
НовСтр.СтатьяДР = Выборка.СтатьяДР;
Для сч = 1 по 13 Цикл
НовСтр[«План»+сч] = Выборка[«План»+сч];
НовСтр[«Факт»+сч] = Выборка[«Факт»+сч];
НовСтр[«Рез»+сч] = ?(Выборка[«План»+сч] = 0, 0, Выборка[«Факт»+сч]/Выборка[«План»+сч]*100);
КонецЦикла;
НоваяВыборка = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, «СтатьяДР»);
ВременнаяТаблицаПлан(Запрос); //если заполняется по документу
//использование функции ЕстьNULL — обязательно!
//если не использовать — в дереве будут поля NULL
ТекстЗапроса =
«ВЫБРАТЬ
| СтатьиДоходовРасходов.Ссылка КАК СтатьяДР,
| СтатьиДоходовРасходов.ЭтоГруппа,
| СУММА(ЕСТЬNULL(ПланФакт.План1, 0)) КАК План1,
| СУММА(ЕСТЬNULL(ПланФакт.Факт1, 0)) КАК Факт1,
| СУММА(ЕСТЬNULL(ПланФакт.План2, 0)) КАК План2,
| СУММА(ЕСТЬNULL(ПланФакт.Факт2, 0)) КАК Факт2,
| СУММА(ЕСТЬNULL(ПланФакт.План3, 0)) КАК План3,
| СУММА(ЕСТЬNULL(ПланФакт.Факт3, 0)) КАК Факт3,
| СУММА(ЕСТЬNULL(ПланФакт.План4, 0)) КАК План4,
| СУММА(ЕСТЬNULL(ПланФакт.Факт4, 0)) КАК Факт4,
| СУММА(ЕСТЬNULL(ПланФакт.План5, 0)) КАК План5,
| СУММА(ЕСТЬNULL(ПланФакт.Факт5, 0)) КАК Факт5,
| СУММА(ЕСТЬNULL(ПланФакт.План6, 0)) КАК План6,
| СУММА(ЕСТЬNULL(ПланФакт.Факт6, 0)) КАК Факт6,
| СУММА(ЕСТЬNULL(ПланФакт.План7, 0)) КАК План7,
| СУММА(ЕСТЬNULL(ПланФакт.Факт7, 0)) КАК Факт7,
| СУММА(ЕСТЬNULL(ПланФакт.План8, 0)) КАК План8,
| СУММА(ЕСТЬNULL(ПланФакт.Факт8, 0)) КАК Факт8,
| СУММА(ЕСТЬNULL(ПланФакт.План9, 0)) КАК План9,
| СУММА(ЕСТЬNULL(ПланФакт.Факт9, 0)) КАК Факт9,
| СУММА(ЕСТЬNULL(ПланФакт.План10, 0)) КАК План10,
| СУММА(ЕСТЬNULL(ПланФакт.Факт10, 0)) КАК Факт10,
| СУММА(ЕСТЬNULL(ПланФакт.План11, 0)) КАК План11,
| СУММА(ЕСТЬNULL(ПланФакт.Факт11, 0)) КАК Факт11,
| СУММА(ЕСТЬNULL(ПланФакт.План12, 0)) КАК План12,
| СУММА(ЕСТЬNULL(ПланФакт.Факт12, 0)) КАК Факт12,
| СУММА(ЕСТЬNULL(ПланФакт.План13, 0)) КАК План13,
| СУММА(ЕСТЬNULL(ПланФакт.Факт13, 0)) КАК Факт13
|ИЗ
| Справочник.фдСтатьиДвиженийДенежныхСредств КАК СтатьиДоходовРасходов
| ЛЕВОЕ СОЕДИНЕНИЕ ВремТаблПланФакт КАК ПланФакт
| ПО (ПланФакт.СтатьяДР = СтатьиДоходовРасходов.Ссылка)
|
|СГРУППИРОВАТЬ ПО
| СтатьиДоходовРасходов.Ссылка,
| СтатьиДоходовРасходов.ЭтоГруппа
|
|УПОРЯДОЧИТЬ ПО
| СтатьиДоходовРасходов.Код,
| СтатьиДоходовРасходов.Наименование
|ИТОГИ
| СУММА(План1),
| СУММА(Факт1),
| СУММА(План2),
| СУММА(Факт2),
| СУММА(План3),
| СУММА(Факт3),
| СУММА(План4),
| СУММА(Факт4),
| СУММА(План5),
| СУММА(Факт5),
| СУММА(План6),
| СУММА(Факт6),
| СУММА(План7),
| СУММА(Факт7),
| СУММА(План8),
| СУММА(Факт8),
| СУММА(План9),
| СУММА(Факт9),
| СУММА(План10),
| СУММА(Факт10),
| СУММА(План11),
| СУММА(Факт11),
| СУММА(План12),
| СУММА(Факт12),
| СУММА(План13),
| СУММА(Факт13)
|ПО
| СтатьяДР ИЕРАРХИЯ»;
вот здесь может быть: «Стр.ЭтоГруппа»
Процедура СохранитьДеревоБДРвТаблицуДокументаРекурсивноСервер(СтрокиДереваФормы, БюджетПоМесяцам_, _год)
Для Каждого Стр Из СтрокиДереваФормы Цикл
Если Стр.ЭтоГруппа Тогда
У меня это колонка в дереве «ЭтоГруппа». Но можно и так:
Если Стр.СтатьяДР.ЭтоГруппа Тогда
Если оставлять колонку, то надо ее заполнять:
Процедура ЗаполнитьДеревоБДРРекурсивноСервер(Выборка, СтрокаДереваФормы)
Пока Выборка.Следующий() Цикл
Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке И Выборка.ЭтоГруппа Тогда
Продолжить;
КонецЕсли;
НовСтр = СтрокаДереваФормы.Строки.Добавить();
НовСтр.СтатьяДР = Выборка.СтатьяДР;
НовСтр.ЭтоГруппа = Выборка.ЭтоГруппа;
.
Источник
1С сохранить таблицу/дерево значений и другие структуры в файл через хранилище
Время от времени бывает необходимость сохранить сложные структуры данных для последующего восстановления.
Как пример рассмотрим сохранение дерева значений.
Решение
Один из вариантов сохранить данные в файл.
Можно так же использовать сжатие хранилища значений.
Пример кода сохранения данных в файл:
ПутьКФайлу = "D:\. ваш путь. \ИмяФайла.txt"; ДеревоЗначений = Новый ДеревоЗначений; ТекущееХранилище = Новый ХранилищеЗначения(ДеревоЗначений, Новый СжатиеДанных(9)); ЗначениеВФайл(ПутьКФайлу, ТекущееХранилище);
Пример кода восстановления данных из файла:
ПутьКФайлу = "D:\. ваш путь. \ИмяФайла.txt"; ЗначениеХранилища = ЗначениеИзФайла(ПутьКФайлу); ДеревоЗначений = ЗначениеХранилища.Получить();
Вместо дерева значений сохраняемыми данными может быть как отдельные значения, так и структуры, таблицы значений и т.д.
Но если вам нужно сохранить данные табличной части объекта, не забывайте предварительно выгрузить их в таблицу значений, а при восстановлении загрузить обратно в таб. часть:
// сохранение ТекущееХранилище = Новый ХранилищеЗначения(ВашаТабЧасть.Выгрузить(), Новый СжатиеДанных(6)); // восстановление ВашаТабЧасть.Загрузить(ЗначениеХранилища.Получить());
Источник
Сохранить дерево значений в excel или табличный документ
Добрый день,
Подскажите есть ли простой способ вывести в табличный документ сформированное дерево значений на форме или сохранить напрямую это дерево в excel с сохранением иерархии без формирования табличного документа?
Например есть стандартная команда формы в командной панели «Вывести список», можно ли к ней обратится программно и получить на выходе табличный документ? а полученный табличный документ можно сохранить в формате xls.
Перем ТабДок, Секция; Процедура ПечатьДерева (СтрокаДерева,Уровень = 0,Колонки) Для Каждого стр Из СтрокаДерева.Строки Цикл НомерКолонки = 0; отступ = ""; Для н = 1 По Уровень Цикл отступ = отступ + " "; КонецЦикла; Для Каждого КЛ Из Колонки Цикл НомерКолонки = НомерКолонки + 1; Секция.Область(1, НомерКолонки).Текст = ?(НомерКолонки = 1, отступ+стр[КЛ.Имя], стр[КЛ.Имя]); КонецЦикла; ТабДок.Вывести(Секция,Уровень+1); ПечатьДерева(стр,Уровень+1,Колонки); КонецЦикла; КонецПроцедуры Процедура СформироватьТабДок() ТабДок = Новый ТабличныйДокумент; Секция = ТабДок.ПолучитьОбласть("R1"); ТабДок.НачатьАвтогруппировкуСтрок(); ПечатьДерева (Дерево,,Дерево.Колонки); ТабДок.ЗакончитьАвтогруппировкуСтрок(); ВременныйКаталог = КаталогВременныхФайлов(); ИмяФайла = "Журнал выгрузки " + Формат( ТекущаяДата(), "ДФ = 'гггг-ММ-дд_чч-мм-сс'") + ".xls";; ИмяВременногоФайла = ВременныйКаталог + ИмяФайла; ТабДок.Записать(ИмяВременногоФайла , ТипФайлаТабличногоДокумента.XLS); КонецПроцедуры
Prad2002; Kilka_v_Kepke; It-developer; Jenya78; user1474628; hasp_x; nekit_rdx; curdate; bohdan-k; jane_de_rio; orfos; Legin; + 12 – Ответить
Источник