- Преобразование данных прикладных объектов в данные формы и обратно
- Поделиться ссылкой:
- ДеревоЗначений.Строки
- Дерево значений 1с
- Свойства Дерева Значений 1с
- Свойство Колонки Дерева значений
- Свойство Строки Дерева значений
- Методы Дерева Значений 1с
- метод Скопировать() Дерева значений
- метод ВыбратьСтроку() Дерева значений
- Обработка дерева значений 1с
- Заметки человекообразного админа
Преобразование данных прикладных объектов в данные формы и обратно
Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:
Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.
Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.
- ЗначениеВДанныеФормы() ‑ преобразует объект прикладного типа в данные формы.
- ДанныеФормыВЗначение() ‑ преобразует данные формы в объект прикладного типа.
- КопироватьДанныеФормы() ‑ производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.
При преобразовании данных формы в прикладные объекты и обратно используется кеширование объектов, но при этом выполняется проверка актуальности версии объекта в кеше.
ПРИМЕЧАНИЕ. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) в форме с основным реквизитом преобразование выполняется автоматически.
Приведем пример, как использовать преобразование данных в собственных алгоритмах.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ОбъектТовар = Товары.НайтиПоНаименованию("Кофейник").ПолучитьОбъект(); ЗначениеВДанныеФормы(ОбъектТовар, Объект);
КонецПроцедуры
&НаКлиенте
Процедура Записать()
ЗаписатьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаписатьНаСервере()
ОбъектТовар = ДанныеФормыВЗначение(Объект,Тип("СправочникОбъект.Товары"));
ОбъектТовар.Записать();
КонецПроцедуры
Также у объекта ФормаКлиентскогоПриложения существуют методы, доступные на сервере:
- ЗначениеВРеквизитФормы() ‑ выполняет преобразование объекта прикладного типа в заданный реквизит формы.
- РеквизитФормыВЗначение() ‑ преобразует реквизит данных формы в объект прикладного типа.
Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений .
Также следует помнить, что при преобразовании в данные формы (как с помощью метода ЗначениеВДанныеФормы(), так и с помощью метода ЗначениеВРеквизитФормы()) объектов типа ТаблицаЗначений или ДеревоЗначений нужно учитывать следующую особенность: в преобразуемом объекте должны существовать все колонки, которые существуют в данных формы.
ВНИМАНИЕ! Колонки реквизитов, не связанные с данными , не участвуют в преобразовании значений между данными формы и объектами информационной базы и обратно. Колонки, отсутствующие в данных объекта, очищаются при преобразовании в данные формы.
При переносе объекта в данные формы платформой, или при вызове методов ЗначениеВДанныеФормы(), ЗначениеВРеквизитФормы(), переносятся только данные объекта. Внутренние состояние объекта в данные формы не переносится. Например, значение ссылки нового, которая установлена в объект методом УстановитьСсылкуНового(), будет утеряна в процессе преобразования объекта в данные формы и обратно.
В качестве первого параметра методов РеквизитФормыВЗначение() и ДанныеФормыВЗначение() могут выступать только реквизиты формы следующих типов:
- ДанныеФормыСтруктура,
- ДанныеФормыКоллекция,
- ДанныеФормыСтруктураСКоллекцией,
- ДанныеФормыДерево.
Приведем пример использования этих методов.
&НаСервере
Процедура ПересчитатьНаСервере()
// Преобразует реквизит Объект в прикладной объект. Документ = РеквизитФормыВЗначение("Объект");
// Выполняет пересчет методом, определенным в модуле документа. Документ.Пересчитать();
// Преобразует прикладной объект обратно в реквизит. ЗначениеВРеквизитФормы(Документ, "Объект");
КонецПроцедуры
Поделиться ссылкой:
Источник
ДеревоЗначений.Строки
Пишу обработку, понадобилось отображать на форме иерархический список, генерируемый программно из некоторого массива данных. Создал реквизит типа «ДеревоЗначений», так же и назвал, поместил на форму соответствующее поле. Синтаксис помошник мне ясно указал на то, что у класса ДеревоЗначений присутствует поле «Строки», через которое, собственно, и предполагается работа с ним.
К сожалению, в своем ДеревеЗначений я таковое не обнаружил.
Процедура Тест() ДеревоЗначений.Строки.Добавить(); КонецПроцедуры
Профессионал и ДеревоЗначений
Прошу совета у опытных. На картинке — вопрос и выделенный правильный ответ. Это информация с диска.
8.3 Упр.прил.: ДеревоЗначений и .НайтиСтроки
Ситуация такая, нужно вывести на экран дерево с отбором строк. Делаю это путем полного.
Надо Сделать Деревозначений Из 4 Справочников.
Здравствуйте! Есть 4 справочника: Цеха, Участки(владелец Цеха), Бригады(владелец Участки).
Калькулятор сумма 1с8.3 ДеревоЗначений
Доброго вечера. У меня есть дерево значений. Как сделать так чтобы когда меняешь значение в ячейке.
Процедура Тест() ЭлементыДерева = ДеревоЗначений.ПолучитьЭлементы(); СтрокаДерева = ЭлементыДерева.Строки.Добавить(); КонецПроцедуры
Источник
Дерево значений 1с
Дерево значений 1с относится к универсальным коллекциям значений. Отличие от Таблицы значений в том, что строки Дерева Значений могут быть подчинены друг другу.
ДеревоЗначений — это программный объект встроенного языка, позволяющий строить произвольные иерархические наборы данных в памяти компьютера, отображать их в табличном и\или древовидном виде, а также программно и интерактивно манипулировать ими (добавлять, редактировать, удалять и сортировать строки).
Как и таблица значений, дерево состоит из строк и колонок. Строки располагаются вниз по вертикали, а колонки — вправо по горизонтали. Однако, в отличие от таблицы значений, строки дерева значений могут иметь подчиненные строки любой глубины вложенности.
Строки и колонки имеют индексы, по которым к ним можно обращаться напрямую (начинаются с 0). Кроме этого, к колонкам можно обращаться по идентификатору.
Свойства Дерева Значений 1с
Свойство Колонки Дерева значений
Содержит коллекцию колонок дерева значений.
Свойство Строки Дерева значений
Содержит коллекцию корневых строк дерева значений.
Методы Дерева Значений 1с
метод Скопировать() Дерева значений
Создает новый объект копированием текущего (копируются все колонки и строки).
метод ВыбратьСтроку() Дерева значений
Открывает диалог для интерактивного выбора строки дерева значений.
Дерево значений серверный тип данных, поэтому доступ к нему получаем на стороне сервера.
&НаКлиенте Процедура Дерево(Команда) ДеревоНаСервере(); Конецпроцедуры &НаСервере Процедура ДеревоНаСервере() ДеревоЗнач=Новый ДеревоЗначений; ДеревоЗнач.Колонки.Добавить("Склад"); ДеревоЗнач.Колонки.Добавить("Ячейка"); ДеревоЗнач.Колонки.Добавить("Количество"); Строка=ДеревоЗнач.Строки.Добавить(); Строка.Склад="Оптовый"; Строка.Ячейка="10"; Строка.Количество=150; КонецПроцедуры
Добавим несколько вложенных значений:
СтрокаН=Строка.Строки.Добавить(); СтрокаН.Ячейка="15"; СтрокаН=Строка.Строки.Добавить(); СтрокаН.Ячейка="25";
Создаем реквизит Дерево тип ДеревоЗначений. Для Реквизита указываются колонки:
- Склад;
- Ячейка;
- Количество.
Далее перетаскиваем Реквизит на форму.
В Завершении в модуль процедуры на Сервере добавляем код. Этот код выполняется аналогично выгрузке Таблицей Значений:
ЗначениеВДанныеФормы(ДеревоЗнач,объект.Дерево);
В результате получим следующее Дерево значений:
Полный код работы с Деревом значений 1с:
Обработка дерева значений 1с
Обработка дерева значений в 1с производиться при помощи рекурсивной процедуры, т.е. процедуры вызывающей саму себя. Процесс обработки дерева значений может состоять из трех шагов:
Во-первых команда на клиенте:
Во-вторых процедура на Сервере получающая Дерево значений:
&НаСервере Процедура Команда2НаСервере() ДеревоЗнач=новый ДеревоЗначений; ДеревоЗнач=ДанныеФормыВЗначение(объект.Дерево,Тип("ДеревоЗначений")); Строки=ДеревоЗнач.строки; ОбработатьДерево(Строки); КонецПроцедуры
В третьих рекурсивная процедура обрабатывающая строки Дерева Значений:
&НаСервере Процедура ОбработатьДерево(Строки) Для каждого Строка из Строки цикл Сообщить(Строка(Строка.Склад)+":"+Строка(Строка.Ячейка)+":" +Строка(Строка.Количество)); ОбработатьДерево(Строка.Строки); конеццикла; конецпроцедуры
Полный код обработки Дерева значений:
Источник
Заметки человекообразного админа
Дерево значений представляет структуру с иерархией. У каждой строки дерева значений может быть сколько угодно подчиненных строк. Верхняя строка уровня это Родитель.
Перед тем как использовать этот объект стоит обратить внимание на один нюанс. Даный объект вместе со своей структурой не сохраняется в БД .
Создание
Добавляем на форму новый реквезит с указанием типа и нужных колонок
- Вручную , если вы оставили командный интерфейс то через кнопку добавить
- Программно запросом. В запросе обезательно должны быть итоги и ОбходРезультатаЗапроса ПоГруппировкам или ПоГруппировкамСИерархией
- Программно кодом
&НаСервере Процедура ЗаполнитьИзЗапрос() тДерево = РеквизитФормыВЗначение("Дерево"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Тест.Колонка1 КАК Колонка1, | Тест.Колонка2 КАК Колонка2 |ИЗ | Справочник.Тест КАК Тест
| Итоги по Колонка1 "; Выгрузка = Запрос.Выполнить(). Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам); тДерево = Выгрузка; ЗначениеВРеквизитФормы(тДерево, "Дерево"); КонецПроцедуры
пример заполнения в цикле
_ДеревоЗн = ДанныеФормыВЗначение(ДеревоЗн, Тип("ДеревоЗначений")); Пока ВыборкаМенеджер.Следующий() Цикл НовСтрокаМенеджер = _ДеревоЗн.Строки.Добавить(); НовСтрокаМенеджер.МенеджерКонтрагент= ВыборкаМенеджер.Менеджер; ВыборкаКонтрагент=ВыборкаМенеджер.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаКонтрагент.следующий() Цикл НовСтрокаКонтрагент=НовСтрокаМенеджер.Строки.добавить(); НовСтрокаКонтрагент.МенеджерКонтрагент=ВыборкаКонтрагент.Контрагент; КонецЦикла; КонецЦикла; ЗначениеВДанныеФормы(_ДеревоЗн, ДеревоЗн);
Делаеться с помощь рекрусии
&НаСервере Процедура ОбходНаСервере() тДерево = РеквизитФормыВЗначение("Дерево"); ОбходДерева(тДерево); КонецПроцедуры &НаСервере Процедура ОбходДерева(Дерево) Для Каждого тСтр Из Дерево.Строки Цикл Сообщить(тСтр.Колонка1+", "+тСтр.Колонка2); Если тСтр.Строки.Количество()>0 Тогда ОбходДерева(тСтр); КонецЕсли; КонецЦикла; КонецПроцедуры
Интеркативный расчет по родителю
&НаКлиенте Процедура ДеревоЗнПередОкончаниемРедактирования(Элемент, НоваяСтрока, ОтменаРедактирования, Отказ) СчитатьСуммыДЗ(); КонецПроцедуры &НаСервере Процедура СчитатьСуммыДЗ() ДеревоЗнач = РеквизитФормыВЗначение("ДеревоЗн"); ОбходДереваДетально(ДеревоЗнач); КонецПроцедуры &НаСервере Процедура ОбходДереваДетально(ПереданноеДер) Для Каждого СтрПолученногоДерева Из ПереданноеДер.Строки Цикл Если СтрПолученногоДерева.Строки.Количество() = 0 Тогда продолжить; КонецЕсли; СтрПолученногоДерева.СуммаПремии= СтрПолученногоДерева.Строки.Итог("СуммаПремии"); КонецЦикла; ЗначениеВРеквизитФормы(ПереданноеДер, "ДеревоЗн"); КонецПроцедуры
Как уже писалось выше что бы сохранить Дерево надо проделать рад манипуляци.
1.Создать ТЧ куда будем записывать данные из дерева и от куда мы их потом будем считывать.
В инете есть несклоько решений данной пролемы, но идея с использыванием ГУИДа мне кажется самой красивой. (Искать по ключевым словам Дерево значений в Таблицу значений и наоборот)
ПреобразоватьВТЗРекурсия(_ДеревоЗн, объект.менеджеры, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"));
&НаСервере Процедура ПреобразоватьВТЗРекурсия(тДерево, тТаблица, ГУИД) Для Каждого тСтр Из тДерево.Строки Цикл нСтр = тТаблица.Добавить(); нСтр.Контрагент = тСтр.МенеджерКонтрагент; нСтр.процент = тСтр.процент; нСтр.СуммаПремии = тСтр.СуммаПремии; нСтр.СуммаРеализации = тСтр.СуммаДокумента; нСтр.Родитель = ГУИД; нСтр.ГУИД = Новый УникальныйИдентификатор(); Если тСтр.Строки.Количество()>0 Тогда ПреобразоватьВТЗРекурсия(тСтр, тТаблица, нСтр.ГУИД); КонецЕсли; КонецЦикла; КонецПроцедуры
&НаКлиенте Процедура ПриОткрытии(Отказ) ПолучитьДаныеНаСервер() ; КонецПроцедуры &НаСервере Процедура ПолучитьДаныеНаСервер() тДерево = РеквизитФормыВЗначение("ДеревоЗн"); ПреобразоватьВДЗРекурсия(тДерево, объект.менеджеры, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000")); ЗначениеВРеквизитФормы(тДерево, "ДеревоЗн"); КонецПроцедуры Процедура ПреобразоватьВДЗРекурсия(тДерево, тТаблица, ГУИД) тПоиск = Новый Структура("Родитель", ГУИД); тМассив = тТаблица.НайтиСтроки(тПоиск); Для Каждого тСтр Из тМассив Цикл нСтр = тДерево.Строки.Добавить(); нСтр.МенеджерКонтрагент =тСтр.Контрагент; нСтр.процент = тСтр.процент; нСтр.СуммаПремии = тСтр.СуммаПремии; нСтр.СуммаДокумента = тСтр.СуммаРеализации; ПреобразоватьВДЗРекурсия(нСтр, тТаблица, тСтр.ГУИД); КонецЦикла; КонецПроцедуры
Источник