Получить управляемую форму на сервере

Начинающие программисты часто задаются этим вопросом. Но на него нет ответа, т.к. даже программное получение формы на сервере невозможно. Инициировать открытие формы можно только на стороне клиента.

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

  1. Вам необходима на сервере функциональность некоторой формы — в этом случае рекомендую перенести требуемую функциональность из модуля формы в серверный модуль.
  2. Необходимо определить возможность открытия управляемой формы — сделайте это в методе ПриСозданииФормыНаСервере() в модуле формы

Если у вас другие проблемы, опишите их в комментариях. Попытаемся решить вместе)

Изначально было всего 2 строчки:

И эту ересь в УП теперь на кучу строк нужно переписать.

В общих модулях имеется 2 функции, выполняемые — одна на сервере, другая на клиенте.

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

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

2 ответа 2

работает только на Клиенте. На Сервере какие формы? ))

В управляемом приложении при создании формы объект (ДокументОбъект) преобразуется в ДанныеФормыСтруктура и уничтожается. Далее объект можно получить только преобразовав реквизит формы "Объект" в значение (метод РеквизитФормыВЗначение). Тогда получим снова ДокументОбъект. Который можно модифицировать и затем преобразовать обратно в реквизит формы (метод ЗначениеВРеквизитФормы). Если открыть форму по ссылке и отдельно от формы получить объект, модифицировать и записать, то в форме уже ничего изменить не получится, т.к. версия данных объекта формы будет не совпадать с версией объекта в БД. (почитайте про объектные блокировки 1С. https://infostart.ru/public/543218/)

Читайте также  Проверить динамики левый правый

Всё ещё ищете ответ? Посмотрите другие вопросы с метками 1с или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.12.20.35703

Т.к. часто возникают вопросы по программному созданию/копированию/обработке объектов 1С:Предприятие в режиме "Управляемые формы", то решил скомпоновать в данной публикации примеры решения таких задач, с комментариями по каждому действию. Поначалу кажется все достаточно запутанно, но если по шагам все разложить и немного вникнуть, то всё должно встать на свои места.

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

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

ПРИМЕРЫ:

Ниже я приведу пример как создавать/копировать/изменять документы. Данный пример досконально разобран и позволит понять клиент-серверную архитектуру работы и распространить эти знания на другие объекты 1С (справочники, отчеты. ).

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

Читайте также  Программа для диагностики айфона 5s через компьютер

Для этого я создал соответствующие команды и разместил их на форме.

1. "Создать калькуляцию".

В данном варианте все просто: мы создаем на клиенте процедуру и все действия выполняем прямо на клиенте, т.к. ничего требующего вызова сервера не делаем. Создаем/получаем форму объекта, передаем в переменную ДанныеФормы Объект формы, выполняем элементарные действия с ДанныеФормы и открываем уже заполненную форму.

2. "Скопировать калькуляцию".

С данной операцией уже немного сложнее, часть процедур выполняется на клиенте, а часть на сервере.

Порядок действий таков: Мы на клиенте создаем форму нужного нам объекта и сразу открываем её (ОткрытьФорму. ). Далее как и ранее мы передаем в переменную ДанныеФормы Объект открытой формы.

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

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

Функция ДанныеФормыВЗначение() требует указания соответствия (типа получаемого объекта): Тип("ДокументОбъект.Калькуляция").

Далее процедурой ЗначениеВДанныеФормы(Док, ДанныеФормы) выполняем обратную операцию: преобразуем объект Документ в переменную ДанныеФормы — понятную для "клиента".

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

Читайте также  Случайный ник на русском

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

Думаю, начинающим познавать клиент-серверную архитектуру 1С пригодится данная статья )

Ссылка на основную публикацию
Adblock
detector