Как хранить структуру в реквизите формы 1с

   SeiOkami

04.09.14 — 13:47

Вопрос, возможно, туповат, но всё же. Имеется отчет для тонкого клиента. Нужно иметь возможность в контексте серверных процедур хранить структуру, в которой несколько ТЗ, схемы компоновки и прочее. Как это оптимальнее делать?

Общая переменная очищается при каждом выходе из сервера на клиент, поэтому не подходит.

Реквизит не подходит, потому что, насколько я понял, ему нельзя присвоить значение типа, которого нет на клиенте, даже если реквизит не выводится на форму для отображения.

Временное хранилище. Не вижу смысла постоянно поднимать хранилище, чтобы обратиться к моим данным.

Как сделать такую простую вещь правильнее?

  

Партнерская программа EFSOL Oblako

   Cube

1 — 04.09.14 — 13:50

(0) Храни во временном файле или в РС СохраненныеНастройки

   Cube

2 — 04.09.14 — 13:51

+(1) Или вообще в настройках пользователя, если другим пользователям доступ не нужен

   SeiOkami

3 — 04.09.14 — 13:52

(1),(2), это стеб такой? легче уже во временном хранилище)

   MrStomak

4 — 04.09.14 — 13:53

(0) ЗначениеВСтрокуВнутр?

   Cube

5 — 04.09.14 — 13:54

(3) Это информация))

   SeiOkami

6 — 04.09.14 — 13:55

(4), думал об этом, но это же похуже временного хранилища будет. Постоянно преобразовывать из значения в строку и обратно…

Неужели в УФ нельзя хранить такие значения без всяких махинаций?

   SeiOkami

7 — 04.09.14 — 13:56

Нет альтернативы переменной? Чтобы не очищалась постоянно

   Maxus43

8 — 04.09.14 — 13:57

Реквизит формы — альтернатива, другой нет

   Maxus43

9 — 04.09.14 — 13:57

а, ну параметр Сеанса можно ещё заюзать)

   Chai Nic

10 — 04.09.14 — 13:57

(8) По идее это же вызовет перекачку данных клиент-сервер при каждом серверном вызове.. что вряд ли полезно..

   SeiOkami

11 — 04.09.14 — 13:58

(8), хорошо, можно тогда заставить реквизит хранить типы, которых нет на клиенте? Мне ведь не нужно с ними что-то на клиенте делать. Главное, чтобы на сервере были

   SeiOkami

12 — 04.09.14 — 13:58

(10), проблема в том, что в реквизит нельзя запихнуть структуру с ТЗшками

   Chai Nic

13 — 04.09.14 — 13:59

(12) Это не проблема. ЗначениеВСтрокуВнутр.

   MrStomak

14 — 04.09.14 — 13:59

(11) ТЗ нет на клиенте, но её можно хранить в реквизите формы.

   SeiOkami

15 — 04.09.14 — 13:59

(9), ну можно тогда уже и регистр специальный сделать. Гулять так гулять)

   Chai Nic

16 — 04.09.14 — 13:59

Проблема как раз в том, что использование реквизитов формы вынуждает гонять данные между сервером и клиентом почем зря..

   SeiOkami

17 — 04.09.14 — 14:00

(14), мне нужно хранить структуру, которая содержит помимо всего прочего ТЗ

   Maxus43

18 — 04.09.14 — 14:00

Правильнее логику будет пересмотреть и уйти от необходимости хранить такого рода данные в памяти во время работы с объектом, имхо

   SeiOkami

19 — 04.09.14 — 14:00

(13), да, но это тоже не выход — постоянно преобразовывать

   MrStomak

20 — 04.09.14 — 14:00

(17) Можно использовать параметры формы, там может быть произвольный тип.

   Chai Nic

21 — 04.09.14 — 14:01

(19) Преобразование дешевле обходится, чем перекачка

   Локи-13

22 — 04.09.14 — 14:01

Временное хранилище.

«Не вижу смысла постоянно поднимать хранилище, чтобы обратиться к моим данным.» — что значит поднимать?

можно использовать общий модуль с повторным использованием на время сеанса

   SeiOkami

23 — 04.09.14 — 14:01

(20), но тогда данные очистятся после создания формы. Если сделаю ключевым, то результат будет как с реквизитами — будет ругаться

   MrStomak

24 — 04.09.14 — 14:02

(22) А если структура меняется?:)

   SeiOkami

25 — 04.09.14 — 14:03

(22), вот! это надо бы обмозговать…

   SeiOkami

26 — 04.09.14 — 14:03

(24), да, меняется )

   SeiOkami

27 — 04.09.14 — 14:04

(21), мне бы как раз без перекачки. Просто чтобы только на сервере и было

   lxndr

28 — 04.09.14 — 14:04

гугли ПоместитьВоВременноеХранилище

   MrStomak

29 — 04.09.14 — 14:04

(26) Сделай не структуру, а ТЗ. В ТЗ могут содержаться другие ТЗ в реквизитах формы.

   Локи-13

30 — 04.09.14 — 14:05

(24) обновлять. делов то

   MrStomak

31 — 04.09.14 — 14:05

(30) Так обновляется сразу весь кеш.

   SeiOkami

32 — 04.09.14 — 14:06

(29), нет это архитектурно не верно. У меня именно структура. Плюс, колонки придется все прописывать на форме, а они могут измениться

   MrStomak

33 — 04.09.14 — 14:10

(32) Ну и программно прописать колонки как бы не проблема. Блин, короче есть 100500 способов, тебе все не нравятся.

Используй временное хранилище, это лучший вариант.

   famnam

34 — 04.09.14 — 14:11

у меня сейчас подобная задачка :) создал структуру, в которой несколько компоновщиков, таблица и прочие доп.данные. держу все это хозяйство во временном хранилище

   Chai Nic

35 — 04.09.14 — 14:14

(34) Если бы еще там можно было хранить всё что угодно. Так фигвам.. во временное хранилище можно засунуть лишь то, что сериализуется..

   SeiOkami

36 — 04.09.14 — 14:14

(33), ну согласись, они ведь реально не удобны)

Почему переменные очищаются? Ну за что такая хрень ? =(

   SeiOkami

37 — 04.09.14 — 14:15

(35), кстати, да. Что вообще странно. Получается в УФ нельзя хранить, например, настроеный запрос с МВТ

   olegves

38 — 04.09.14 — 14:15

(0) Реквизит формы произвольного типа — сворачивай свои данные в структуру и туда прячь

   SeiOkami

39 — 04.09.14 — 14:17

(38), я же написал уже, что нельзя — ругается

   Chai Nic

40 — 04.09.14 — 14:18

(37) Угу.. вот что мешало фирме 1с сделать «глобальный контекст сеанса», доступный из всех серверных вызовов одного сеанса? Насколько бы это упростило всё..

   SeiOkami

41 — 04.09.14 — 14:19

(40), пусть бы хотя бы переменные не очищали

   Локи-13

42 — 04.09.14 — 14:20

1с сейчас уходит от несериализуемых объектов

учитесь программировать правильно.

   Chai Nic

43 — 04.09.14 — 14:22

(41) Это то же самое, но другими словами. Контекст сервера каждый раз новый, и переменные соответственно каждый раз новые.. а глобального контекста в 8.2 нет.

(42) На сериализацию уходит время и процессорные ресурсы. Там, где раньше можно было обойтись передачей адреса из нескольких байт, теперь приходится передавать сериализованный буфер..

   SeiOkami

44 — 04.09.14 — 14:26

(42), и как в данной ситуации будет правильно?

   MrStomak

45 — 04.09.14 — 14:33

(44) Использовать временное хранилище. В которое, кстати, начиная с 8.3 тоже только сериализуемые данные нужно помещать. Потому что содержание хранилища может между серверами перекидываться при падении.

   SeiOkami

46 — 04.09.14 — 14:34

(45), жесть… в погоню за «тонким» клиентом сделали всё намного «толще»

   Chai Nic

47 — 04.09.14 — 14:37

(46) В угоду «мультисерверности» пожертвовали глобальным контекстом.. «не осилили» прозрачную передачу контекста между серверами..

   Зойч

48 — 04.09.14 — 15:02

Но вот почему вдруг ТЗ оказалась несереализуема это большой вопрос

   SeiOkami

49 — 04.09.14 — 15:07

(48), эту тайну знает только Он

   MrStomak

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

Содержание

  1. Содержание
  2. Реквизиты формы
  3. Типы данных, доступные в управляемой форме
  4. Преобразование прикладных объектов в данные формы
  5. Передача данных между клиентской и серверной частями управляемой формы
  6. Методы для преобразования данных прикладных объектов в данные формы
  7. Программный интерфейс
  8. ДанныеФормыДерево (FormDataTree)
  9. ПолучитьЭлементы (GetItems)
  10. НайтиПоИдентификатору (FindById)
  11. ДанныеФормыЭлементДерева (FormDataTreeItem)
  12. ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)
  13. Особенности работы с деревом значений
  14. Обновление дерева

Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:

  • ДанныеФормыСтруктура — содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект .
  • ДанныеФормыКоллекция — это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
  • ДанныеФормыСтруктураСКоллекцией — это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
  • ДанныеФормыДерево — объект предназначен для хранения иерархических данных.

Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).

В редакторе формы вместо имен этих типов обычно отображаются те типы, данные которых содержит реквизит. Например, если реквизит Объект содержит данные элемента справочника Клиенты , то в колонке «Тип» отображается ненастоящий тип этого реквизита формы — ДанныеФормыСтруктура , а тип прикладного объекта, данные которого содержатся в этом реквизите — СправочникОбъект.Клиенты . Чтобы было понятно, что это «ненастоящий тип» реквизита, тип прикладного объекта показывается в круглых скобках.

Таким образом форма содержит некоторую «проекцию» данных объектов в виде своих собственных типов данных и автоматически выполняет преобразование между ними при необходимости. Однако, можно и самостоятельно преобразовать объект в данные формы и обратно с использованием глобальных методов:

  • ЗначениеВДанныеФормы() — преобразует объект прикладного типа в данные формы;
  • ДанныеФормыВЗначение() — преобразует данные формы в объект прикладного типа.

Аналогичные методы, предназначенные для конвертирования значений реквизитов формы в прикладные объекты и обратно, существуют и у самой управляемой формы:

  • ЗначениеВРеквизитФормы() — преобразует объект прикладного типа в реквизит управляемой формы;
  • РеквизитФормыВЗначение() — преобразует реквизит управляемой формы в значение прикладного типа.

Методы, работающие с прикладными объектами, доступны только в серверных процедурах формы. При выполнении стандартных действий формы с основным реквизитом (открытие формы, выполнение стандартной команды Записать() и т. д.) преобразование выполняется автоматически.

Рассмотрим пример преобразования данных. Пусть у нас есть особенная форма, в которой в качестве одного из реквизитов ( ТоварДляМодификации ) используются данные элемента справочника Товары . При создании формы на сервере мы по некоторому алгоритму определяем, какой именно это товар, и читаем его данные в реквизит формы. При этом используется преобразование данных ЗначениеВДанныеФормы() .

Как уже упоминалось, у формы также есть методы, позволяющие преобразовать прикладные данные в реквизит формы и наоборот. Использование данных методов обычно удобнее, так как они имеют, например, информацию о типе реквизита формы. Кроме этого, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений.

Приведем пример использования этих методов. В серверной процедуре формы мы получаем прикладной объект из реквизита формы и выполняем метод этого прикладного объекта Пересчитать() . Затем данные объекта, измененные в результате пересчета, преобразуем обратно в реквизит формы.

Знакомство с управляемой формой 1С лучше всего начинать с реквизитов. Что такое реквизит управляемой формы? По своей сути, это данные, которые привязаны именно к форме: они создаются, хранятся, отображаются (по возможности) и редактируются на форме. Вне контекста формы эти данные не могут существовать. Сам по себе реквизит не может отображаться на форме. Для этого служат элементы формы, которые связаны с реквизитами форм.

Научимся создавать простые реквизиты формы и размещать их на форме.

Для этого в конфигураторе 1С создадим пустую форму. Пусть это будет форма некой внешней обработки. В этой форме нас интересует закладка Реквизиты

В этой закладке сейчас только один реквизит – основной. Он нас пока не интересует, работа с основным реквизитом эта тема отдельной статьи. Пока разберемся с простыми реквизитами.

Для того, чтобы добавить реквизит необходимо нажать на кнопку «Добавить реквизит» командной панели закладки «Реквизиты»

После этого будет добавлен реквизит управляемой формы 1С с типом по умолчанию (строка) и справа откроется палитра свойств этого реквизита.

В этой палитре мы можем установить имя, заголовок, а так же тип реквизита управляемой формы.

Для тренировки создадим четыре реквизита с типом строка: Фамилия, Имя, Отчество и ФИО. И один реквизит с типом дата: ДатаРождения.

Разместим реквизиты на форме. Сделать это просто: необходимо нужный реквизит мышкой «перетащить» из закладки «Реквизиты» на закладку «Элементы»

Перетащим все реквизиты на формы, и с помощью кнопок «Вверх», «Вниз» удобно расположим их на форме.

Сейчас мы сделали такую примитивную форму, на которой расположили реквизиты. После того, как мы «перетащили» реквизит в элементы, то на форме был создан элемент формы. В нашем случае это поле формы. Если мы сейчас зайдем в палитру свойств поля ввода, то увидим, что он связан с реквизитом посредством свойства ПутьКДанным.

Если нажать на кнопку «…» свойства ПутьКДанным, то у разработчика есть возможность поменять привязанный к этому элементу реквизит формы.

Сейчас научимся использовать реквизиты в программном коде. Из статьи, посвященной архитектуре управляемой формы 1С 8.3 Вы знаете, что выполнение кода на форме возможно под директивами &НаКлиенте &НаСервере и &НаСервереБезКонтекста. Доступ к реквизитам формы возможен только в процедурах и функциях, которые выполняются на &НаКлиенте и &НаСервере.

Для наглядности выполним небольшую задачу: создадим команду, при выполнении которой Фамилия, Имя, Отчество и дата Рождения будут складываться в ФИО + Дата рождения.

Создадим локальную команду формы. Для этого на закладке «Команды» в подзакладке «Команды формы» необходимо нажать на кнопку «Добавить»

После создания команды, справа откроется палитра свойств новой команды, где мы зададим её название.

Но команда – это выполнение некоторых действий на форме. Чтобы действия осуществились необходимо создать обработчик команды. Для создания обработчика команды нужно нажать на кнопку «Лупа» свойства действия. После этого откроется окно выбора места размещения обработчика.

Мы выберем расположение НаКлиенте, поскольку для тех действий, которые мы хотим осуществить вполне хватит клиентского контекста.

После выбора места расположения обработчика, в модуле формы будет создана процедура под директивой &НаКлиенте, в которой мы напишем несложный код. В этом коде к реквизитам формы мы будем обращаться просто как к переменным. Мы можем это делать в клиентском и серверном контексте.

&НаКлиенте
Процедура СформироватьФИО ( Команда )

ФИО = Фамилия + » » +
Имя + » » +
Отчество + «, д.р. » +
Формат ( ДатаРождения , «ДЛФ=D» );

Обратите внимание, после создание процедуры в палитре свойств команды свойство Действие заполнилось названием нашей новой процедуры.

И последним шагом нам осталось нашу команду разместить на управляемой форме. Просто перетащим её мышкой в закладку Элементы

При этом на форме появится кнопка.

Сохраним обработку и попробуем выполнить нашу команду.

Как видите, к реквизитам формы в модуле формы можно обращаться напрямую, как к переменным, но только если процедура или функция выполняется под директивами &НаКлиенте и &НаСервере.

Подробно вопросы работы с управляемыми формами в частности и с управляемым приложением в целом рассмотрены в книге «Основы разработки в 1С: Такси. Разработка управляемого приложения за 12 шагов». Эта книга станет настоящим подспорьем для тех, кто только начал знакомится с разработкой управляемого приложения.

Книга «Основы разработки в 1С: Такси» отлично подойдёт тем, кто уже начал программировать и испытывает определенные сложности с этой темой и тем, кто уже давно программирует, но ни разу еще не работал с управляемыми формами 1С

  1. Без сложных технических терминов;
  2. Более 600 страниц практического материала;
  3. Каждый пример сопровождается рисунком (скриншот);
  4. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!

Промо-код на скидку в 15% — 48PVXHeYu

Изучайте основы конфигурирования в 1С и учитесь программировать в «1С: Предприятии» с помощью моих книг: «Программировать в 1С за 11 шагов» и «Основы разработки в 1С: Такси»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;


Если Вам понравился этот урок, был полезен или помог решить какую-нибудь проблему, то Вы можете поддержать мой проект, перечислив любую сумму:

можно оплатить вручную:

Яндекс.Деньги — 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

Метки нет (Все метки)


Нужно передать из произвольной формы у форму документа структуру при закрытии

В форме документа, получаю и заполняю произвольную форму:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Если Не Отказ Тогда
        Форма = ПолучитьФорму("Документ.ткТабельУчетаРабочегоВремениУпр.Форма.ВводСотрудникаУпр");
        Форма.ПериодРегистрации = Объект.ПериодРегистрации;
        Форма.Подразделение       = Объект.Подразделение;
        Форма.Бюджет         = Объект.Бюджет;
        Форма.ШтатноеРасписание = Объект.ШтатноеРасписание;
        
        Форма.ДокументТабель = Объект.Ссылка;
        Форма.Сотрудник           = ТекущаяСтрокаСотрудники.ФизЛицо;
        Форма.Должность           = ТекущаяСтрокаСотрудники.Должность;
        Форма.НаборСвойств     = ТекущаяСтрокаСотрудники.НаборСвойств;
        Форма.ГрафикРаботы     = ТекущаяСтрокаСотрудники.ГрафикРаботы;
        
        Форма.УчетПоКатегориямФизЛиц    = ТекущаяСтрокаСотрудники.УчетПоКатегориямФизЛиц;
        Форма.КатегорияФизЛиц              = ТекущаяСтрокаСотрудники.КатегорияФизЛиц;
        Форма.НадбавкиЗаОсобенностиОбъекта = ТекущаяСтрокаСотрудники.НадбавкиЗаОсобенностиОбъекта;
        Форма.ЗПУстановленнаяКлиентом      = ТекущаяСтрокаСотрудники.ЗПУстановленнаяКлиентом;
        
        Форма.ДатаНачалаПериода     = НачалоМесяца(Объект.ПериодРегистрации);
        Форма.ДатаОкончанияПериода = КонецМесяца (Объект.ПериодРегистрации);
                
        Форма.Приказ     = ТекущаяСтрокаСотрудники.Приказ;
        СтруктураПараметров = Форма.ОткрытьМодально();
        Если СтруктураПараметров <> Неопределено Тогда
            ОбработатьРезультатАвтоматическогоЗаполненияСотрудника(СтруктураПараметров);
        Иначе
            Сообщить("Заполнение не произведено.", СтатусСообщения.Информация);
            Отказ = Истина;
//          
        КонецЕсли;
    КонецЕсли;
//  
КонецПроцедуры

Теперь из произвольной формы надо обратно отправить данные из запроса
записанные в структуру, вот из этой функции которую написал в произвольной форме:

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
&НаСервере
Функция ПеренестиСотрудников ()
    
    
    Отказ = Ложь;
    
    // Проверим правильность заполнения
    Для Каждого СтрокаТЗ Из ДанныеДляДокумента Цикл
        Если Не ЗначениеЗаполнено(СтрокаТЗ.ВремяОкончанияРаботы) И Не ЗначениеЗаполнено(СтрокаТЗ.ВремяНачалаРаботы) Тогда  
            Сообщить("Время начала и окончания работы одновременно не могут быть 00:00:00.", СтатусСообщения.ОченьВажное);
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
    
    
    // передадим данные
    Если Не Отказ Тогда
        
        ЗапросОтбор = Новый Запрос;
        ЗапросОтбор.УстановитьПараметр("ТЗДанные", ДанныеДляДокумента.Выгрузить());
        ЗапросОтбор.Текст = 
        "ВЫБРАТЬ
        |   ТЗДанные.Дата КАК Дата,
        |   ТЗДанные.Приказ КАК Приказ,
        |   ТЗДанные.ФизЛицо КАК ФизЛицо,
        |   ТЗДанные.Должность КАК Должность,
        |   ТЗДанные.НаборСвойств КАК НаборСвойств,
        |   ТЗДанные.ГрафикРаботы КАК ГрафикРаботы,
        |   ТЗДанные.УчетПоКатегориямФизЛиц КАК УчетПоКатегориямФизЛиц,
        |   ТЗДанные.КатегорияФизЛиц КАК КатегорияФизЛиц,
        |   ТЗДанные.НадбавкиЗаОсобенностиОбъекта КАК НадбавкиЗаОсобенностиОбъекта,
        |   ТЗДанные.ЗПУстановленнаяКлиентом КАК ЗПУстановленнаяКлиентом,
        |   ТЗДанные.ВремяНачалаРаботы КАК ВремяНачалаРаботы,
        |   ТЗДанные.ВремяОкончанияРаботы КАК ВремяОкончанияРаботы,
        |   ТЗДанные.КоличествоЧасов КАК КоличествоЧасов,
        |   ТЗДанные.Перенести КАК Перенести
        |ПОМЕСТИТЬ ВТДанные
        |ИЗ
        |   &ТЗДанные КАК ТЗДанные
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТДанные.Дата,
        |   ВТДанные.Приказ,
        |   ВТДанные.ФизЛицо,
        |   ВТДанные.Должность,
        |   ВТДанные.НаборСвойств,
        |   ВТДанные.ГрафикРаботы,
        |   ВТДанные.УчетПоКатегориямФизЛиц,
        |   ВТДанные.КатегорияФизЛиц,
        |   ВТДанные.НадбавкиЗаОсобенностиОбъекта,
        |   ВТДанные.ЗПУстановленнаяКлиентом,
        |   ВТДанные.ВремяНачалаРаботы,
        |   ВТДанные.ВремяОкончанияРаботы,
        |   ВТДанные.КоличествоЧасов,
        |   ВТДанные.Перенести
        |ИЗ
        |   ВТДанные КАК ВТДанные
        |ГДЕ
        |   ВТДанные.Перенести";
        ТЗДляПередачи = ЗапросОтбор.Выполнить().Выгрузить();
        
                СтруктураПараметров = Новый Структура;
                СтруктураПараметров.Вставить("ТЗДляПередачи", ТЗДляПередачи);
                
        Возврат СтруктураПараметров;
        
        
    КонецЕсли;
        
КонецФункции

Далее при закрытии этой произвольной формы

Надо передать параметры форму документа чтобы заполнить данные из этой структуры.
Как это можно лучше сделать?



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

Цитата
Сообщение от Fenomen
Посмотреть сообщение

Поместите структуру во временное хранилище. Возвращайте адрес в хранилище. Получайте структуру из временного хранилища.

Есть пример или ссылка, я с временным хранилищем не работал



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

Делаю в произвольной форме:

1C
1
2
3
    СтруктураПараметров = Новый Структура;
        СтруктураПараметров.Вставить("ТЗДляПередачи", ТЗДляПередачи);
    ПоместитьВоВременноеХранилище(СтруктураПараметров);

При получении из хранилища пишет о несоответствии типов параметров

а1.Форма(1521)}: Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
ОбработатьРезультатАвтоматическогоЗаполненияСотруд ника(ПолучитьИзВременногоХранилища(СтруктураПараме тров));
по причине:
Несоответствие типов (параметр номер ‘1’)

Может из-за того что адрес не указан, при записи, получении из временного хранилище в качестве адреса что указывать для структуры?



0



Fenomen

900 / 877 / 8

Регистрация: 15.03.2012

Сообщений: 2,680

20.06.2012, 16:45

6

1C
1
Адрес = ПоместитьВоВременноеХранилище(СтруктураПараметров);

Передаете адрес в нужную форму и вней

1C
1
СтруктураПараметров = ПолучитьИзВременногоХрани(Адрес);



0



sidrd

0 / 0 / 0

Регистрация: 20.06.2012

Сообщений: 7

20.06.2012, 17:49

 [ТС]

7

Цитата
Сообщение от Fenomen
Посмотреть сообщение

1C
1
Адрес = ПоместитьВоВременноеХранилище(СтруктураПараметров);

Передаете адрес в нужную форму и вней

1C
1
СтруктураПараметров = ПолучитьИзВременногоХрани(Адрес);

А как Адрес передать в формудокумента, ну в ту первую форму из котороый мы открываем вторую, причем вторая открыта модально.



0



Fenomen

900 / 877 / 8

Регистрация: 15.03.2012

Сообщений: 2,680

20.06.2012, 18:01

8

В первой форме

1C
1
Адрес = Форма.ОткрытьМодально();

Во второй
Закрывайте ее из кода:

1C
1
Закрыть(Адрес);



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

Цитата
Сообщение от sidrd
Посмотреть сообщение

Наоборот

Что наоборот?

Цитата
Сообщение от sidrd
Посмотреть сообщение

я из первой открываю вторую загоняю туда данные, потом из второй надо как раз таки при закрытии в первую передать данные

Приведенный выше код, как раз для этого случая.



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

Используя Ваш код:

1C
1
2
3
4
5
6
7
8
9
10
Форма.Приказ        = ТекущаяСтрокаСотрудники.Приказ;
        АдресВХранилище = Форма.ОткрытьМодально();
        СтруктураПараметров = ПолучитьИзВременногоХранилища(АдресВХранилище );
        Если СтруктураПараметров <> Неопределено Тогда
            ОбработатьРезультатАвтоматическогоЗаполненияСотрудника(СтруктураПараметров);
        Иначе
            Сообщить("Заполнение не произведено.", СтатусСообщения.Информация);
            Отказ = Истина;
//          
        КонецЕсли;
1C
1
2
3
4
СтруктураПараметров = Новый Структура;
                СтруктураПараметров.Вставить("ТЗДляПередачи", ТЗДляПередачи);
                Адрес = ПоместитьВоВременноеХранилище(СтруктураПараметров);
                Возврат Адрес;

После вызова функции ПеренестиСотрудников ()

1C
1
Форма.Закрыть(Адрес);



0



sidrd

0 / 0 / 0

Регистрация: 20.06.2012

Сообщений: 7

20.06.2012, 19:14

 [ТС]

13

Вернулся в ту же ошибку что и была вначале

Основная форма документа

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 &НаКлиенте
Процедура ЗаполнитьАвтоматическиСотрудникаВУчетРабочегоВремени()
//  
    Отказ = Ложь;
//  
    ТекущаяСтрокаСотрудники = Неопределено;
    Если Элементы.Страницы.ТекущаяСтраница.Имя = "ГруппаУчетРабочегоВремени" Тогда
        ТекущаяСтрокаСотрудники = Элементы.Сотрудники.ТекущиеДанные;
    ИначеЕсли Элементы.Страницы.ТекущаяСтраница.Имя = "ГруппаФактРаботыПерсонала" Тогда
        ТекущаяСтрокаСотрудники = Элементы.Сотрудники1.ТекущиеДанные;
    КонецЕсли;
 
   Если Не Отказ Тогда
    
      
        Форма = ПолучитьФорму("Документ.ткТабельУчетаРабочегоВремениУпр.Форма.ВводСотрудникаУпр");
        Форма.ВладелецФормы = ЭтаФорма;
        Форма.ПериодРегистрации = Объект.ПериодРегистрации;
        Форма.Подразделение       = Объект.Подразделение;
        Форма.Бюджет         = Объект.Бюджет;
        Форма.ШтатноеРасписание = Объект.ШтатноеРасписание;
        
        Форма.ДокументТабель = Объект.Ссылка;
        Форма.Сотрудник           = ТекущаяСтрокаСотрудники.ФизЛицо;
        Форма.Должность           = ТекущаяСтрокаСотрудники.Должность;
        Форма.НаборСвойств     = ТекущаяСтрокаСотрудники.НаборСвойств;
        Форма.ГрафикРаботы     = ТекущаяСтрокаСотрудники.ГрафикРаботы;
        
        Форма.УчетПоКатегориямФизЛиц    = ТекущаяСтрокаСотрудники.УчетПоКатегориямФизЛиц;
        Форма.КатегорияФизЛиц              = ТекущаяСтрокаСотрудники.КатегорияФизЛиц;
        Форма.НадбавкиЗаОсобенностиОбъекта = ТекущаяСтрокаСотрудники.НадбавкиЗаОсобенностиОбъекта;
        Форма.ЗПУстановленнаяКлиентом      = ТекущаяСтрокаСотрудники.ЗПУстановленнаяКлиентом;
        
        Форма.ДатаНачалаПериода     = НачалоМесяца(Объект.ПериодРегистрации);
        Форма.ДатаОкончанияПериода  = КонецМесяца (Объект.ПериодРегистрации);
                
        Форма.Приказ     = ТекущаяСтрокаСотрудники.Приказ;
                
        
        АдресВХранилище = Форма.ОткрытьМодально();
                          СтруктураПараметров = ПолучитьИзВременногоХранилища(АдресВХранилище);
    
        
        
        Если СтруктураПараметров <> Неопределено Тогда
 
    ОбработатьРезультатАвтоматическогоЗаполненияСотрудника (СтруктураПараметров);
 
        Иначе
            
    ОбработатьРезультатАвтоматическогоЗаполненияСотрудника(СтруктураПараметров);
                                        
              Сообщить("Заполнение не произведено.", СтатусСообщения.Информация);
    
     Отказ = Истина;
//          
        КонецЕсли;
    КонецЕсли;
//  
КонецПроцедуры

Процедуры из второй произвольной формы, где заполняем рабочее время, и эта форма дожна возратить структуру в основную форму документа

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
&НаСервере
Функция  ПеренестиСотрудников ()
    
    
    Отказ = Ложь;
    
    // Проверим правильность заполнения
    Для Каждого СтрокаТЗ Из ДанныеДляДокумента Цикл
        Если Не ЗначениеЗаполнено(СтрокаТЗ.ВремяОкончанияРаботы) И Не ЗначениеЗаполнено(СтрокаТЗ.ВремяНачалаРаботы) Тогда  
Сообщить("Время начала и окончания работы одновременно не могут быть 00:00:00.", СтатусСообщения.ОченьВажное);
            Отказ = Истина;
        КонецЕсли;
    КонецЦикла;
    
    
    // передадим данные
    Если Не Отказ Тогда
        
        ЗапросОтбор = Новый Запрос;
        ЗапросОтбор.УстановитьПараметр("ТЗДанные", ДанныеДляДокумента.Выгрузить());
        ЗапросОтбор.Текст = 
        "ВЫБРАТЬ
        |   ТЗДанные.Дата КАК Дата,
        |   ТЗДанные.Приказ КАК Приказ,
        |   ТЗДанные.ФизЛицо КАК ФизЛицо,
        |   ТЗДанные.Должность КАК Должность,
        |   ТЗДанные.НаборСвойств КАК НаборСвойств,
        |   ТЗДанные.ГрафикРаботы КАК ГрафикРаботы,
        |   ТЗДанные.УчетПоКатегориямФизЛиц КАК УчетПоКатегориямФизЛиц,
        |   ТЗДанные.КатегорияФизЛиц КАК КатегорияФизЛиц,
        |   ТЗДанные.НадбавкиЗаОсобенностиОбъекта КАК НадбавкиЗаОсобенностиОбъекта,
        |   ТЗДанные.ЗПУстановленнаяКлиентом КАК ЗПУстановленнаяКлиентом,
        |   ТЗДанные.ВремяНачалаРаботы КАК ВремяНачалаРаботы,
        |   ТЗДанные.ВремяОкончанияРаботы КАК ВремяОкончанияРаботы,
        |   ТЗДанные.КоличествоЧасов КАК КоличествоЧасов,
        |   ТЗДанные.Перенести КАК Перенести
        |ПОМЕСТИТЬ ВТДанные
        |ИЗ
        |   &ТЗДанные КАК ТЗДанные
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВТДанные.Дата,
        |   ВТДанные.Приказ,
        |   ВТДанные.ФизЛицо,
        |   ВТДанные.Должность,
        |   ВТДанные.НаборСвойств,
        |   ВТДанные.ГрафикРаботы,
        |   ВТДанные.УчетПоКатегориямФизЛиц,
        |   ВТДанные.КатегорияФизЛиц,
        |   ВТДанные.НадбавкиЗаОсобенностиОбъекта,
        |   ВТДанные.ЗПУстановленнаяКлиентом,
        |   ВТДанные.ВремяНачалаРаботы,
        |   ВТДанные.ВремяОкончанияРаботы,
        |   ВТДанные.КоличествоЧасов,
        |   ВТДанные.Перенести
        |ИЗ
        |   ВТДанные КАК ВТДанные
        |ГДЕ
        |   ВТДанные.Перенести";
        ТЗДляПередачи = ЗапросОтбор.Выполнить().Выгрузить();
        
        СтруктураПараметров = Новый Структура;
        СтруктураПараметров.Вставить("ТЗДляПередачи", ТЗДляПередачи);
        
        Адрес = ПоместитьВоВременноеХранилище(СтруктураПараметров);
        
        Возврат Адрес;
        
    КонецЕсли;
    
  
    
КонецФункции
 
 
// закрываю форму и передаю параметры из функции с адресом временного хранилище, как
// Вы и сказали:
// только я сделал по кнопке, сразу закрывается форма и данные приходят в основную форму
 
&НаКлиенте
Процедура Перенести(Команда)
 Закрыть (ПеренестиСотрудников());
КонецПроцедуры

ошибка:

Ошибка при вызове метода контекста (ПолучитьИзВременногоХранилища)
СтруктураПараметров = ПолучитьИзВременногоХранилища(АдресВХранилище);
по причине:
Ошибка получения значение из временного хранилища
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: {http://v8.1c.ru/8.2/mngsrv/ws}response Форма: Элемент Тип: {http://v8.1c.ru/8.1/data/core}Structure
по причине:
Ошибка преобразования данных XDTO:
НачалоСвойства: Value Форма: Элемент Тип: {http://www.w3.org/2001/XMLSchema}anyType
по причине:
Ошибка отображения типов:
Отсутствует отображение для типа ‘{http://v8.1c.ru/8.1/data/core}ValueTable’

ругается он тут на то что из серверной функции передали адрес хранилище для клиентской функции.

Кстате, а разве временное хранилище при закрытии формы не очищается?



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:

1C
1
2
3
4
5
6
7
&НаКлиенте
//Необходимо чтобы данные были записаны и форма сохранена
Структура=Новый Структура;
Структура.Вставить("СсылкаНаДок", Объект.Ссылка);
 
Форма=ПолучитьФорму("Документ.Документ2.Форма.ФД", Структура);
Форма.Открыть();

Вторая форма (ПриСозданииНаСервере):

1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
&НаСервере //если жмет можете попробовать БезКонтекста
СсылкаДок1=Параметры.СсылкаНаДок; //СсылкаНаДок это ключ параметра мы передали из формы 1
Объект.Р1=СсылкаДок1.Реквизит1; // присваиваем данные и ваш обсчет идет я так понял в форме
Объект.Р2=СсылкаДок1.Реквизит2;
Номер=СсылкаДок1.Номер;
 
 
 
//Сохраняем документ
Записать();
 
//По ссылке получаем форму1 и передаем в нее ссылку данного документа
Структура=Новый Структура;
Структура.Вставить("СсылкаНаДок2", Объект.Ссылка);
Док=Документы.Документ1.НайтиПоНомеру(Номер);
Док.ПолучитьФорму("НазваниеФормы",Структура);

//ОПять в первой форме

1C
1
2
СсылкаДок2=Параметры.СсылкаНаДок2;
Реквизит1=СсылкаДок2.Реквизит1;

Это суть. Выложите файл можно пнуть чтобы взлетел))



0



Как сохранить Значения элементов при закрытии формы и восстановить их при открытии формы?

Это можно сделать через СохранитьЗначения(), ВосстановитьЗначение():

Код 1C v 8.х

 СохранитьЗначение("СрокИсполненияЗаказа", СрокИсполнения);
      
СохранитьЗначение("СкладПоУмолчанию", МестоХранения);

СрокИсполнения = ВосстановитьЗначение("СрокИсполненияЗаказа"));

Но у этого способа, одно НО — Сохраненые значения будут доступны только на там компьютере, на котором их сохранили!

А чтобы эти значения были доступны с любого компьютера, их нужно хранить в базе, например в константах с типом Хранилище значения:

Перебирая все элементы формы, выбрать только поля ввода и записать их значения в структуру.

Потом структуры записываем в константу:

Код 1C v 8.х

 Процедура КнопкаСохранитьНажатие(Кнопка)
      
ЭлСтр = Новый Структура;
Для Каждого Элем Из ЭлементыФормы Цикл
//Сохранаем только те элементы, у которых можно получить Значение
//Попытка
// ЭлСтр.Вставить(Элем.Имя, Элем.Значение);
//Исключение КонецПопытки; //у элемента нет Значения
//Так лучше
Если ТипЗнч(Элем) = Тип("ПолеВвода") Тогда
ЭлСтр.Вставить(Элем.Имя, Элем.Значение);
КонецЕсли;
КонецЦикла;
Константы.MES_ДопСоглашения.Установить(Новый ХранилищеЗначения(ЭлСтр));
КонецПроцедуры

Процедура ПриОткрытии()
//Заполним значения на форме из структуры полученной из хранилища значений
Попытка
ЭлСтрХранЗнач=Константы.MES_ДопСоглашения.Получить();
ЭлСтр=ЭлСтрХранЗнач.Получить();
Для Каждого Элем из ЭлСтр Цикл
ЭлементыФормы[Элем.Ключ] = Элем.Значение;
КонецЦикла;
Исключение КонецПопытки;
КонецПроцедуры


Виртуальный 1С помощник


Как сохранять и восстанавливать значения реквизитов на форме?

Информация взята с сайта http://helpf.pro

Подпишитесь на нашу рассылку новостей

Хотите узнать больше по этому вопросу?

Подпишитесь на нашу рассылку новостей

Подписаться

Чтобы задать вопрос или предложить тему статьи, нажмите на кнопку ниже:

Предложить статью

Понравилась статья? Поделить с друзьями:
  • Какие транспортные компании есть в якутске
  • Какой бывает имидж компании прилагательные
  • Как я начинал свой бизнес реальные истории
  • Какие транспортные компании самые надежные
  • Какой вид бизнеса сейчас актуален в россии