04.09.14 — 13:47
Вопрос, возможно, туповат, но всё же. Имеется отчет для тонкого клиента. Нужно иметь возможность в контексте серверных процедур хранить структуру, в которой несколько ТЗ, схемы компоновки и прочее. Как это оптимальнее делать?
Общая переменная очищается при каждом выходе из сервера на клиент, поэтому не подходит.
Реквизит не подходит, потому что, насколько я понял, ему нельзя присвоить значение типа, которого нет на клиенте, даже если реквизит не выводится на форму для отображения.
Временное хранилище. Не вижу смысла постоянно поднимать хранилище, чтобы обратиться к моим данным.
Как сделать такую простую вещь правильнее?
1 — 04.09.14 — 13:50
(0) Храни во временном файле или в РС СохраненныеНастройки
2 — 04.09.14 — 13:51
+(1) Или вообще в настройках пользователя, если другим пользователям доступ не нужен
3 — 04.09.14 — 13:52
(1),(2), это стеб такой? легче уже во временном хранилище)
4 — 04.09.14 — 13:53
(0) ЗначениеВСтрокуВнутр?
5 — 04.09.14 — 13:54
(3) Это информация))
6 — 04.09.14 — 13:55
(4), думал об этом, но это же похуже временного хранилища будет. Постоянно преобразовывать из значения в строку и обратно…
Неужели в УФ нельзя хранить такие значения без всяких махинаций?
7 — 04.09.14 — 13:56
Нет альтернативы переменной? Чтобы не очищалась постоянно
8 — 04.09.14 — 13:57
Реквизит формы — альтернатива, другой нет
9 — 04.09.14 — 13:57
а, ну параметр Сеанса можно ещё заюзать)
10 — 04.09.14 — 13:57
(8) По идее это же вызовет перекачку данных клиент-сервер при каждом серверном вызове.. что вряд ли полезно..
11 — 04.09.14 — 13:58
(8), хорошо, можно тогда заставить реквизит хранить типы, которых нет на клиенте? Мне ведь не нужно с ними что-то на клиенте делать. Главное, чтобы на сервере были
12 — 04.09.14 — 13:58
(10), проблема в том, что в реквизит нельзя запихнуть структуру с ТЗшками
13 — 04.09.14 — 13:59
(12) Это не проблема. ЗначениеВСтрокуВнутр.
14 — 04.09.14 — 13:59
(11) ТЗ нет на клиенте, но её можно хранить в реквизите формы.
15 — 04.09.14 — 13:59
(9), ну можно тогда уже и регистр специальный сделать. Гулять так гулять)
16 — 04.09.14 — 13:59
Проблема как раз в том, что использование реквизитов формы вынуждает гонять данные между сервером и клиентом почем зря..
17 — 04.09.14 — 14:00
(14), мне нужно хранить структуру, которая содержит помимо всего прочего ТЗ
18 — 04.09.14 — 14:00
Правильнее логику будет пересмотреть и уйти от необходимости хранить такого рода данные в памяти во время работы с объектом, имхо
19 — 04.09.14 — 14:00
(13), да, но это тоже не выход — постоянно преобразовывать
20 — 04.09.14 — 14:00
(17) Можно использовать параметры формы, там может быть произвольный тип.
21 — 04.09.14 — 14:01
(19) Преобразование дешевле обходится, чем перекачка
22 — 04.09.14 — 14:01
Временное хранилище.
«Не вижу смысла постоянно поднимать хранилище, чтобы обратиться к моим данным.» — что значит поднимать?
можно использовать общий модуль с повторным использованием на время сеанса
23 — 04.09.14 — 14:01
(20), но тогда данные очистятся после создания формы. Если сделаю ключевым, то результат будет как с реквизитами — будет ругаться
24 — 04.09.14 — 14:02
(22) А если структура меняется?:)
25 — 04.09.14 — 14:03
(22), вот! это надо бы обмозговать…
26 — 04.09.14 — 14:03
(24), да, меняется )
27 — 04.09.14 — 14:04
(21), мне бы как раз без перекачки. Просто чтобы только на сервере и было
28 — 04.09.14 — 14:04
гугли ПоместитьВоВременноеХранилище
29 — 04.09.14 — 14:04
(26) Сделай не структуру, а ТЗ. В ТЗ могут содержаться другие ТЗ в реквизитах формы.
30 — 04.09.14 — 14:05
(24) обновлять. делов то
31 — 04.09.14 — 14:05
(30) Так обновляется сразу весь кеш.
32 — 04.09.14 — 14:06
(29), нет это архитектурно не верно. У меня именно структура. Плюс, колонки придется все прописывать на форме, а они могут измениться
33 — 04.09.14 — 14:10
(32) Ну и программно прописать колонки как бы не проблема. Блин, короче есть 100500 способов, тебе все не нравятся.
Используй временное хранилище, это лучший вариант.
34 — 04.09.14 — 14:11
у меня сейчас подобная задачка создал структуру, в которой несколько компоновщиков, таблица и прочие доп.данные. держу все это хозяйство во временном хранилище
35 — 04.09.14 — 14:14
(34) Если бы еще там можно было хранить всё что угодно. Так фигвам.. во временное хранилище можно засунуть лишь то, что сериализуется..
36 — 04.09.14 — 14:14
(33), ну согласись, они ведь реально не удобны)
Почему переменные очищаются? Ну за что такая хрень ? =(
37 — 04.09.14 — 14:15
(35), кстати, да. Что вообще странно. Получается в УФ нельзя хранить, например, настроеный запрос с МВТ
38 — 04.09.14 — 14:15
(0) Реквизит формы произвольного типа — сворачивай свои данные в структуру и туда прячь
39 — 04.09.14 — 14:17
(38), я же написал уже, что нельзя — ругается
40 — 04.09.14 — 14:18
(37) Угу.. вот что мешало фирме 1с сделать «глобальный контекст сеанса», доступный из всех серверных вызовов одного сеанса? Насколько бы это упростило всё..
41 — 04.09.14 — 14:19
(40), пусть бы хотя бы переменные не очищали
42 — 04.09.14 — 14:20
1с сейчас уходит от несериализуемых объектов
учитесь программировать правильно.
43 — 04.09.14 — 14:22
(41) Это то же самое, но другими словами. Контекст сервера каждый раз новый, и переменные соответственно каждый раз новые.. а глобального контекста в 8.2 нет.
(42) На сериализацию уходит время и процессорные ресурсы. Там, где раньше можно было обойтись передачей адреса из нескольких байт, теперь приходится передавать сериализованный буфер..
44 — 04.09.14 — 14:26
(42), и как в данной ситуации будет правильно?
45 — 04.09.14 — 14:33
(44) Использовать временное хранилище. В которое, кстати, начиная с 8.3 тоже только сериализуемые данные нужно помещать. Потому что содержание хранилища может между серверами перекидываться при падении.
46 — 04.09.14 — 14:34
(45), жесть… в погоню за «тонким» клиентом сделали всё намного «толще»
47 — 04.09.14 — 14:37
(46) В угоду «мультисерверности» пожертвовали глобальным контекстом.. «не осилили» прозрачную передачу контекста между серверами..
48 — 04.09.14 — 15:02
Но вот почему вдруг ТЗ оказалась несереализуема это большой вопрос
49 — 04.09.14 — 15:07
(48), эту тайну знает только Он
50 — 04.09.14 — 15:10
(48) ТЗ сериализуется, просто она не поддерживается на клиенте:
Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. Имя типа XDTO: ValueTable.
Зойч
51 — 04.09.14 — 15:29
(50) не нужно словам придираться
+1
Реквизит ~ Как сохранить, восстановить значения всех элементов формы?
Как сохранить Значения элементов при закрытии формы и восстановить их при открытии формы?
Это можно сделать через СохранитьЗначения(), ВосстановитьЗначение():
Код 1C v 8.х
СохранитьЗначение("СрокИсполненияЗаказа", СрокИсполнения);
СохранитьЗначение("СкладПоУмолчанию", МестоХранения);
СрокИсполнения = ВосстановитьЗначение("СрокИсполненияЗаказа"));
Но у этого способа, одно НО — Сохраненые значения будут доступны только на там компьютере, на котором их сохранили!
А чтобы эти значения были доступны с любого компьютера, их нужно хранить в базе, например в константах с типом Хранилище значения:
Перебирая все элементы формы, выбрать только поля ввода и записать их значения в структуру.
Потом структуры записываем в константу:
Код 1C v 8.х
Процедура КнопкаСохранитьНажатие(Кнопка)
ЭлСтр = Новый Структура;
Для Каждого Элем Из ЭлементыФормы Цикл
//Сохранаем только те элементы, у которых можно получить Значение
//Попытка
// ЭлСтр.Вставить(Элем.Имя, Элем.Значение);
//Исключение КонецПопытки; //у элемента нет Значения
//Так лучше
Если ТипЗнч(Элем) = Тип("ПолеВвода") Тогда
ЭлСтр.Вставить(Элем.Имя, Элем.Значение);
КонецЕсли;
КонецЦикла;
Константы.MES_ДопСоглашения.Установить(Новый ХранилищеЗначения(ЭлСтр));
КонецПроцедуры
Процедура ПриОткрытии()
//Заполним значения на форме из структуры полученной из хранилища значений
Попытка
ЭлСтрХранЗнач=Константы.MES_ДопСоглашения.Получить();
ЭлСтр=ЭлСтрХранЗнач.Получить();
Для Каждого Элем из ЭлСтр Цикл
ЭлементыФормы[Элем.Ключ] = Элем.Значение;
КонецЦикла;
Исключение КонецПопытки;
КонецПроцедуры
Как сохранять и восстанавливать значения реквизитов на форме?
На чтение 16 мин Просмотров 1.3к. Опубликовано 07.05.2019
Содержание
- Содержание
- Реквизиты формы
- Типы данных, доступные в управляемой форме
- Преобразование прикладных объектов в данные формы
- Передача данных между клиентской и серверной частями управляемой формы
- Методы для преобразования данных прикладных объектов в данные формы
- Программный интерфейс
- ДанныеФормыДерево (FormDataTree)
- ПолучитьЭлементы (GetItems)
- НайтиПоИдентификатору (FindById)
- ДанныеФормыЭлементДерева (FormDataTreeItem)
- ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)
- Особенности работы с деревом значений
- Обновление дерева
Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:
- ДанныеФормыСтруктура — содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект .
- ДанныеФормыКоллекция — это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
- ДанныеФормыСтруктураСКоллекцией — это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
- ДанныеФормыДерево — объект предназначен для хранения иерархических данных.
Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).
В редакторе формы вместо имен этих типов обычно отображаются те типы, данные которых содержит реквизит. Например, если реквизит Объект содержит данные элемента справочника Клиенты , то в колонке «Тип» отображается ненастоящий тип этого реквизита формы — ДанныеФормыСтруктура , а тип прикладного объекта, данные которого содержатся в этом реквизите — СправочникОбъект.Клиенты . Чтобы было понятно, что это «ненастоящий тип» реквизита, тип прикладного объекта показывается в круглых скобках.
Таким образом форма содержит некоторую «проекцию» данных объектов в виде своих собственных типов данных и автоматически выполняет преобразование между ними при необходимости. Однако, можно и самостоятельно преобразовать объект в данные формы и обратно с использованием глобальных методов:
- ЗначениеВДанныеФормы() — преобразует объект прикладного типа в данные формы;
- ДанныеФормыВЗначение() — преобразует данные формы в объект прикладного типа.
Аналогичные методы, предназначенные для конвертирования значений реквизитов формы в прикладные объекты и обратно, существуют и у самой управляемой формы:
- ЗначениеВРеквизитФормы() — преобразует объект прикладного типа в реквизит управляемой формы;
- РеквизитФормыВЗначение() — преобразует реквизит управляемой формы в значение прикладного типа.
Методы, работающие с прикладными объектами, доступны только в серверных процедурах формы. При выполнении стандартных действий формы с основным реквизитом (открытие формы, выполнение стандартной команды Записать() и т. д.) преобразование выполняется автоматически.
Рассмотрим пример преобразования данных. Пусть у нас есть особенная форма, в которой в качестве одного из реквизитов ( ТоварДляМодификации ) используются данные элемента справочника Товары . При создании формы на сервере мы по некоторому алгоритму определяем, какой именно это товар, и читаем его данные в реквизит формы. При этом используется преобразование данных ЗначениеВДанныеФормы() .
Как уже упоминалось, у формы также есть методы, позволяющие преобразовать прикладные данные в реквизит формы и наоборот. Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме этого, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений.
Приведем пример использования этих методов. В серверной процедуре формы мы получаем прикладной объект из реквизита формы и выполняем метод этого прикладного объекта Пересчитать() . Затем данные объекта, измененные в результате пересчета, преобразуем обратно в реквизит формы.
Знакомство с управляемой формой 1С лучше всего начинать с реквизитов. Что такое реквизит управляемой формы? По своей сути, это данные, которые привязаны именно к форме: они создаются, хранятся, отображаются (по возможности) и редактируются на форме. Вне контекста формы эти данные не могут существовать. Сам по себе реквизит не может отображаться на форме. Для этого служат элементы формы, которые связаны с реквизитами форм.
Научимся создавать простые реквизиты формы и размещать их на форме.
Для этого в конфигураторе 1С создадим пустую форму. Пусть это будет форма некой внешней обработки. В этой форме нас интересует закладка Реквизиты
В этой закладке сейчас только один реквизит – основной. Он нас пока не интересует, работа с основным реквизитом эта тема отдельной статьи. Пока разберемся с простыми реквизитами.
Для того, чтобы добавить реквизит необходимо нажать на кнопку «Добавить реквизит» командной панели закладки «Реквизиты»
После этого будет добавлен реквизит управляемой формы 1С с типом по умолчанию (строка) и справа откроется палитра свойств этого реквизита.
В этой палитре мы можем установить имя, заголовок, а так же тип реквизита управляемой формы.
Для тренировки создадим четыре реквизита с типом строка: Фамилия, Имя, Отчество и ФИО. И один реквизит с типом дата: ДатаРождения.
Разместим реквизиты на форме. Сделать это просто: необходимо нужный реквизит мышкой «перетащить» из закладки «Реквизиты» на закладку «Элементы»
Перетащим все реквизиты на формы, и с помощью кнопок «Вверх», «Вниз» удобно расположим их на форме.
Сейчас мы сделали такую примитивную форму, на которой расположили реквизиты. После того, как мы «перетащили» реквизит в элементы, то на форме был создан элемент формы. В нашем случае это поле формы. Если мы сейчас зайдем в палитру свойств поля ввода, то увидим, что он связан с реквизитом посредством свойства ПутьКДанным.
Если нажать на кнопку «…» свойства ПутьКДанным, то у разработчика есть возможность поменять привязанный к этому элементу реквизит формы.
Сейчас научимся использовать реквизиты в программном коде. Из статьи, посвященной архитектуре управляемой формы 1С 8.3 Вы знаете, что выполнение кода на форме возможно под директивами &НаКлиенте &НаСервере и &НаСервереБезКонтекста. Доступ к реквизитам формы возможен только в процедурах и функциях, которые выполняются на &НаКлиенте и &НаСервере.
Для наглядности выполним небольшую задачу: создадим команду, при выполнении которой Фамилия, Имя, Отчество и дата Рождения будут складываться в ФИО + Дата рождения.
Создадим локальную команду формы. Для этого на закладке «Команды» в подзакладке «Команды формы» необходимо нажать на кнопку «Добавить»
После создания команды, справа откроется палитра свойств новой команды, где мы зададим её название.
Но команда – это выполнение некоторых действий на форме. Чтобы действия осуществились необходимо создать обработчик команды. Для создания обработчика команды нужно нажать на кнопку «Лупа» свойства действия. После этого откроется окно выбора места размещения обработчика.
Мы выберем расположение НаКлиенте, поскольку для тех действий, которые мы хотим осуществить вполне хватит клиентского контекста.
После выбора места расположения обработчика, в модуле формы будет создана процедура под директивой &НаКлиенте, в которой мы напишем несложный код. В этом коде к реквизитам формы мы будем обращаться просто как к переменным. Мы можем это делать в клиентском и серверном контексте.
&НаКлиенте
Процедура СформироватьФИО ( Команда )
ФИО = Фамилия + » » +
Имя + » » +
Отчество + «, д.р. » +
Формат ( ДатаРождения , «ДЛФ=D» );
Обратите внимание, после создание процедуры в палитре свойств команды свойство Действие заполнилось названием нашей новой процедуры.
И последним шагом нам осталось нашу команду разместить на управляемой форме. Просто перетащим её мышкой в закладку Элементы
При этом на форме появится кнопка.
Сохраним обработку и попробуем выполнить нашу команду.
Как видите, к реквизитам формы в модуле формы можно обращаться напрямую, как к переменным, но только если процедура или функция выполняется под директивами &НаКлиенте и &НаСервере.
Подробно вопросы работы с управляемыми формами в частности и с управляемым приложением в целом рассмотрены в книге «Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов». Эта книга станет настоящим подспорьем для тех, кто только начал знакомится с разработкой управляемого приложения.
Книга «Основы разработки в 1С: Такси» отлично подойдёт тем, кто уже начал программировать и испытывает определенные сложности с этой темой и тем, кто уже давно программирует, но ни разу еще не работал с управляемыми формами 1С
- Без сложных технических терминов;
- Более 600 страниц практического материала;
- Каждый пример сопровождается рисунком (скриншот);
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
Промо-код на скидку в 15% — 48PVXHeYu
Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы в соцсетях, и будьте в курсе всех новостей
Содержание
Реквизиты формы
Набор реквизитов формы описывает состав данных, которые отображаются, редактируются или хранятся в форме. При этом реквизиты формы сами по себе не обеспечивают возможности отображения и редактирования данных. Для отображения и редактирования служат элементы формы (смотрите раздел «Элементы формы» данной главы), связанные с реквизитами формы. Совокупность всех реквизитов формы будем называть данными формы.
Важно! Необходимо помнить, что, в отличие от обычных форм, все данные управляемой формы должны быть описаны в виде реквизитов. Не допускается использование переменных модуля формы в качестве источников данных для элементов формы.
Имеется возможность назначить Основной реквизит формы, т. е. реквизит, который будет определять стандартную функциональность формы (расширение формы). Следует помнить, что основной реквизит у формы может быть только один.
Расширение формы – это дополнительные свойства, методы и параметры формы объекта УправляемаяФорма, характерные для объекта, являющегося основным элементом формы.
В процессе разработки формы можно явно задать возможность просмотра и редактирования конкретных реквизитов формы, в разрезе ролей, с помощью свойств Просмотр и Редактирование (подробнее смотрите раздел «Ролевая настройка формы» главы «Редакторы»). Кроме того, доступность того или иного реквизита в самой форме можно настраивать с помощью функциональных опций (подробнее о функциональных опциях можно посмотреть в главе «Управление интерфейсом конфигурации»).
Свойство реквизита формы Сохраняемые данные является признаком того, что интерактивное изменение реквизита будет приводить к попытке блокировки данных формы для редактирования, а также к автоматической установке признака модифицированности формы.
Типы данных, доступные в управляемой форме
Управляемая форма отличается от обычной формы также и типами данных, с которыми она работает. Если обычная форма работает с большинством типов, которые предоставляет 1С:Предприятие (в том числе и вида СправочникОбъект, ДокументОбъект и т. д.), то в управляемой форме можно выделить следующие категории типов:
- типы, которые непосредственно используются в форме – это те типы, которые существуют на стороне тонкого и Веб-клиента (например, Число, СправочникСсылка.Товары, ГрафическаяСхема, ТабличныйДокумент);
- типы, которые будут преобразованы в специальные типы данных – типы данных управляемой формы. Такие типы отображаются в списке реквизитов формы в круглых скобках, например (СправочникОбъект.Товары);
- динамический список (подробнее см. раздел «Динамический список» данной главы).
Преобразование прикладных объектов в данные формы
Некоторые прикладные типы (такие как СправочникОбъект и т. д.) не существуют на стороне тонкого и Веб-клиентов (подробнее см. главу «Концепция управляемого приложения»). Поэтому для представления в форме таких прикладных типов в платформе введены специальные типы данных, предназначенные для работы в управляемых формах. Эта особенность управляемого приложения обуславливает необходимость выполнять преобразование прикладных объектов в данные формы (и обратно).
Используются следующие типы данных:
- ДанныеФормыСтруктура – содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект.
- ДанныеФормыКоллекция – это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
- ДанныеФормыСтруктураСКоллекцией – это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
- ДанныеФормыДерево – объект предназначен для хранения иерархических данных.
Прикладной объект представлен либо одним, либо несколькими элементами данных формы. В общем виде иерархия и состав данных формы зависят от сложности и взаимосвязи прикладных объектов управляемой формы.
Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).
Важно! Во время разработки конфигурации важно помнить, что прикладные объекты доступны только на сервере, в то время как объектами данных форм можно пользоваться и на сервере, и на клиенте.
Передача данных между клиентской и серверной частями управляемой формы
Фактически можно сказать, что данные формы – это унифицированное представление данных различных прикладных объектов, с которыми форма работает единообразно и которые присутствуют и на сервере, и на клиенте. То есть форма содержит некоторую «проекцию» данных прикладных объектов в виде своих собственных типов данных и выполняет преобразование между ними при необходимости. Однако в случае если разработчик конфигурации реализует свой алгоритм обработки данных, то преобразование данных (из специализированных типов в прикладные и обратно) он должен выполнять самостоятельно.
При редактировании реквизитов формы в специализированном редакторе (подробнее см. раздел «Реквизиты формы» главы «Редакторы») имеется возможность влиять на передачу данных между клиентом и сервером во время работы формы. Для этого служит колонка редактора реквизитов Использовать всегда. Действие этого свойства различается для трех типов реквизитов:
- Для реквизита, подчиненного динамическому списку (колонке динамического списка):
- свойство включено – реквизит всегда считывается из базы данных и включается в данные формы;
- свойство выключено – реквизит считывается из базы данных и включается в данные формы только тогда, когда есть видимый в данный момент элемент формы, связанный с реквизитом или его подчиненным реквизитом.
- Для реквизита, подчиненного коллекции движений:
- свойство включено – движения документа считываются из базы данных и будут присутствовать в данных формы;
- свойство выключено – движения документа не будут считываться из базы данных и не попадут в данные формы (если нет элемента формы, ссылающегося на движения документа).
- Остальные реквизиты формы:
- свойство включено – реквизит будет присутствовать в данных формы вне зависимости от того, есть или нет хоть один элемент формы, который связан с реквизитом или его подчиненным реквизитом;
- свойство выключено – реквизит будет присутствовать в данных формы только в том случае, если есть элемент формы, связанный с реквизитом или его подчиненным реквизитом. В отличие от реквизитов динамического списка, здесь не играет роли видимость элемента, связанного с реквизитом.
Примечание. Следует помнить, что свойство, установленное у родительского реквизита, действует на все подчиненные реквизиты. Например, если свойство Использовать всегда снято у табличной части документа, то система считает, что это свойство снято и у всех подчиненных реквизитов (несмотря на фактическое состояние свойства).
Методы для преобразования данных прикладных объектов в данные формы
Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:
- ЗначениеВДанныеФормы(),
- ДанныеФормыВЗначение(),
- КопироватьДанныеФормы().
Важно! Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.
Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.
- ЗначениеВДанныеФормы() – преобразует объект прикладного типа в данные формы;
- ДанныеФормыВЗначение() – преобразует данные формы в объект прикладного типа;
- КопироватьДанныеФормы() – производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.
Примечание. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) формы с основным реквизитом, преобразование выполняется автоматически.
Приведем пример, как использовать преобразование данных в собственных алгоритмах.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
&НаКлиенте Процедура Записать()
&НаСервере Процедура ЗаписатьНаСервере()
Также у объекта УправляемаяФорма существуют методы, доступные на сервере:
- ЗначениеВРеквизитФормы() – выполняет преобразование объекта прикладного типа в заданный реквизит формы.
- РеквизитФормыВЗначение() – преобразует реквизит данных формы в объект прикладного типа.
Использование данных методов обычно удобнее, так как они, имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений. Подробнее об этом можно прочитать в главе «Сервисные возможности навигации».
Приведем пример использования этих методов.
&НаСервере Процедура ПересчитатьНаСервере()
Программный интерфейс
ДанныеФормыДерево (FormDataTree)
- НайтиПоИдентификатору (FindById)
- ПолучитьЭлементы (GetItems)
Предназначен для моделирования дерева в данных управляемой формы.
Доступность: клиент, сервер, тонкий клиент, веб-клиент. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен . Имя типа XDTO:
ПолучитьЭлементы (GetItems)
Получает коллекцию элементов дерева верхнего уровня.
Доступность: клиент, сервер, тонкий клиент, веб-клиент.
НайтиПоИдентификатору (FindById)
Тип: Число. Идентификатор элемента дерева.
Получает элемент коллекции по идентификатору.
Доступность: клиент, сервер, тонкий клиент, веб-клиент.
ДанныеФормыЭлементДерева (FormDataTreeItem)
- ПолучитьИдентификатор (GetId)
- ПолучитьРодителя (GetParent)
- ПолучитьЭлементы (GetItems)
- Свойство (Property)
Элемент дерева данных формы.
Доступность: клиент, сервер, тонкий клиент, веб-клиент. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен . Имя типа XDTO:
ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)
Элементы коллекции: ДанныеФормыЭлементДерева
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции. Возможно обращение к элементу коллекции посредством оператора [. ]. В качестве аргумента передается индекс элемента.
- Вставить (Insert)
- Добавить (Add)
- Индекс (IndexOf)
- Количество (Count)
- Очистить (Clear)
- Получить (Get)
- Сдвинуть (Move)
- Удалить (Delete)
Коллекция элементов дерева.
Доступность: клиент, сервер, тонкий клиент, веб-клиент.
- ДанныеФормыЭлементДерева, метод ПолучитьЭлементы
- ДанныеФормыДерево, метод ПолучитьЭлементы
Особенности работы с деревом значений
Обновление дерева
Существует проблема падения платформы при обновлении дерева.
Если в дереве был развернут какой-либо узел и выбран подчиненный узел, то при обновлении дерева функцией ЗначениеВДанныеФормы происходит падение платформы.
Решение: перед обновлением нужно очищать дерево.
sidrd 0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 7 |
||||||||
1 |
||||||||
1C 8.x (тонкий) Передать структуру из формы в форму управляемые формы20.06.2012, 14:19. Показов 24410. Ответов 14 Метки нет (Все метки)
Нужно передать из произвольной формы у форму документа структуру при закрытии В форме документа, получаю и заполняю произвольную форму:
Теперь из произвольной формы надо обратно отправить данные из запроса
Далее при закрытии этой произвольной формы Надо передать параметры форму документа чтобы заполнить данные из этой структуры.
0 |
900 / 877 / 8 Регистрация: 15.03.2012 Сообщений: 2,680 |
|
20.06.2012, 14:44 |
2 |
Поместите структуру во временное хранилище. Возвращайте адрес в хранилище. Получайте структуру из временного хранилища.
0 |
0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 7 |
|
20.06.2012, 14:47 [ТС] |
3 |
Поместите структуру во временное хранилище. Возвращайте адрес в хранилище. Получайте структуру из временного хранилища. Есть пример или ссылка, я с временным хранилищем не работал
0 |
900 / 877 / 8 Регистрация: 15.03.2012 Сообщений: 2,680 |
|
20.06.2012, 14:54 |
4 |
Да там все просто. Посмотрите в синтаксис помощнике:
0 |
sidrd 0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 7 |
||||
20.06.2012, 15:30 [ТС] |
5 |
|||
Делаю в произвольной форме:
При получении из хранилища пишет о несоответствии типов параметров а1.Форма(1521)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища) Может из-за того что адрес не указан, при записи, получении из временного хранилище в качестве адреса что указывать для структуры?
0 |
Fenomen 900 / 877 / 8 Регистрация: 15.03.2012 Сообщений: 2,680 |
||||||||
20.06.2012, 16:45 |
6 |
|||||||
Передаете адрес в нужную форму и вней
0 |
sidrd 0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 7 |
||||||||
20.06.2012, 17:49 [ТС] |
7 |
|||||||
Передаете адрес в нужную форму и вней
А как Адрес передать в формудокумента, ну в ту первую форму из котороый мы открываем вторую, причем вторая открыта модально.
0 |
Fenomen 900 / 877 / 8 Регистрация: 15.03.2012 Сообщений: 2,680 |
||||||||
20.06.2012, 18:01 |
8 |
|||||||
В первой форме
Во второй
0 |
0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 7 |
|
20.06.2012, 18:15 [ТС] |
9 |
Наоборот, я из первой открываю вторую загоняю туда данные, потом из второй надо как раз таки при закрытии в первую передать данные
0 |
900 / 877 / 8 Регистрация: 15.03.2012 Сообщений: 2,680 |
|
20.06.2012, 18:28 |
10 |
Наоборот Что наоборот?
я из первой открываю вторую загоняю туда данные, потом из второй надо как раз таки при закрытии в первую передать данные Приведенный выше код, как раз для этого случая.
0 |
0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 7 |
|
20.06.2012, 18:44 [ТС] |
11 |
Закрываю я форму на клиенте, сама структура с запросом создается на сервере, Хотя данные в структуру из начальной таблицы выгружаются.
0 |
Fenomen 900 / 877 / 8 Регистрация: 15.03.2012 Сообщений: 2,680 |
||||||||||||
20.06.2012, 18:51 |
12 |
|||||||||||
Используя Ваш код:
После вызова функции ПеренестиСотрудников ()
0 |
sidrd 0 / 0 / 0 Регистрация: 20.06.2012 Сообщений: 7 |
||||||||
20.06.2012, 19:14 [ТС] |
13 |
|||||||
Вернулся в ту же ошибку что и была вначале Основная форма документа
Процедуры из второй произвольной формы, где заполняем рабочее время, и эта форма дожна возратить структуру в основную форму документа
ошибка: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища) ругается он тут на то что из серверной функции передали адрес хранилище для клиентской функции. Кстате, а разве временное хранилище при закрытии формы не очищается?
0 |
900 / 877 / 8 Регистрация: 15.03.2012 Сообщений: 2,680 |
|
20.06.2012, 23:13 |
14 |
Потому, что Вы на клиенте пытаетесь получить таблицу значений. Получение таблицы и ее обработку нужно делать на сервере.
0 |
asmut 0 / 0 / 0 Регистрация: 19.01.2017 Сообщений: 5 |
||||||||||||
24.01.2014, 22:24 |
15 |
|||||||||||
Не буду весь ваш код переписывать, покажу суть (ориентируюсь на управляемые формы 8,2): В форме 1:
Вторая форма (ПриСозданииНаСервере):
//ОПять в первой форме
Это суть. Выложите файл можно пнуть чтобы взлетел))
0 |
Как сохранить Значения элементов при закрытии формы и восстановить их при открытии формы?
Это можно сделать через СохранитьЗначения(), ВосстановитьЗначение():
Код 1C v 8.х
СохранитьЗначение("СрокИсполненияЗаказа", СрокИсполнения);
СохранитьЗначение("СкладПоУмолчанию", МестоХранения);
СрокИсполнения = ВосстановитьЗначение("СрокИсполненияЗаказа"));
Но у этого способа, одно НО — Сохраненые значения будут доступны только на там компьютере, на котором их сохранили!
А чтобы эти значения были доступны с любого компьютера, их нужно хранить в базе, например в константах с типом Хранилище значения:
Перебирая все элементы формы, выбрать только поля ввода и записать их значения в структуру.
Потом структуры записываем в константу:
Код 1C v 8.х
Процедура КнопкаСохранитьНажатие(Кнопка)
ЭлСтр = Новый Структура;
Для Каждого Элем Из ЭлементыФормы Цикл
//Сохранаем только те элементы, у которых можно получить Значение
//Попытка
// ЭлСтр.Вставить(Элем.Имя, Элем.Значение);
//Исключение КонецПопытки; //у элемента нет Значения
//Так лучше
Если ТипЗнч(Элем) = Тип("ПолеВвода") Тогда
ЭлСтр.Вставить(Элем.Имя, Элем.Значение);
КонецЕсли;
КонецЦикла;
Константы.MES_ДопСоглашения.Установить(Новый ХранилищеЗначения(ЭлСтр));
КонецПроцедуры
Процедура ПриОткрытии()
//Заполним значения на форме из структуры полученной из хранилища значений
Попытка
ЭлСтрХранЗнач=Константы.MES_ДопСоглашения.Получить();
ЭлСтр=ЭлСтрХранЗнач.Получить();
Для Каждого Элем из ЭлСтр Цикл
ЭлементыФормы[Элем.Ключ] = Элем.Значение;
КонецЦикла;
Исключение КонецПопытки;
КонецПроцедуры
Как сохранять и восстанавливать значения реквизитов на форме?
Информация взята с сайта http://helpf.pro
Хотите узнать больше по этому вопросу?
Подпишитесь на нашу рассылку новостей
Подписаться
Чтобы задать вопрос или предложить тему статьи, нажмите на кнопку ниже:
Предложить статью