1с 8 доступность управляемой формы на сервере

Обновлено: 05.07.2024

Эта публикация посвящена нюансам программного управления клиентским интерфейсом на управляемых формах.

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

  • На Клиенте
  • На Сервере
  • В Запросе

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

НСтр ( "ua = 'Привіт, світ!'; ru = 'Привет, мир!'; en = 'Hello, world!'" ) ;

Проверка значений реквизитов формы

Проверка отсутствия значения в реквизите в модуле формы

Если ПустаяСтрока ( Объект . < РеквизитСтрока > ) Тогда // пустая строка Если Объект . < РеквизитДата > = Дата ( '00010101' ) Тогда // пустое значение даты Если Объект . < Реквизит > = Неопределено Тогда // отсутствие значение и отсутствие типа Если Объект . < РеквизитСсылка > . Пустая ( ) Тогда // пустая ссылка установленного типа

Перечисления

Перечисления полноценно доступны только &НаСервере в коллекции объектов метаданных Перечисления, которое недоступно &НаКлиенте и в запросе непосредственно, а только через

Если Вид = ПредопределенноеЗначение ( "Перечисление.Виды.Основной" ) Тогда

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

В конфигураторе набор отображаемых свойств формы существенно зависит от реквизита с установленным свойством Основной реквизит.

Ограничения при передаче данных в управляемую форму

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

// Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа. Возврат Новый Структура ( "Ссылка,Код,Наименование" , Реквизит . Ссылка , Реквизит . Код , Реквизит . Наименование ) ;

Оптимизация ресурсоемкости передачи данных между Сервером и Клиентом

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

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

При оптимизации серверного вызова для выполнения процедур &НаСервереБезКонтекста используется другая пара процедур:

КомандаЗаполнитьРеквизитДеревоНаСервереБезКонтекста ( Объект . Ссылка , ПараметрДерево , РеквизитДиаграмма ) ; КопироватьДанныеФормы ( ДеревоПараметр , РеквизитДерево ) ; Процедура КомандаЗаполнитьРеквизитДеревоНаСервереБезКонтекста ( Знач ОбъектСсылка , ПараметрДерево , РеквизитДиаграмма )

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

Режим отображения иерархии в динамическом списке

Пример кода открытия формы с установкой необходимого режима отображения списка:

ФормаВыбора = ПолучитьФорму ( "Справочник.Номенклатура.ФормаВыбора" ) ; ФормаВыбора . Элементы . Список . Отображение = ОтображениеТаблицы . Список ;

Это замечание имеет значение не только для управляемых форм. Любая форма с динамическим списком Подчиненного справочника без отбора элементов по владельцу отображает его в режиме Список, независимо от установленного программно или в конфигураторе режима отображения (иерархия групп отображаться корректно не будет)!

Программное управление порядком сортировки динамического списка

Код установки сортировки по ДатаРеализации и Клиент:

элементПорядка = Список . Порядок . Элементы . Добавить ( Тип ( "ЭлементПорядкаКомпоновкиДанных" ) ) ; элементПорядка . Поле = Новый ПолеКомпоновкиДанных ( "ДатаРеализации" ) ; элементПорядка . ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных . Возр ; элементПорядка . РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных . Авто ; элементПорядка = Список . Порядок . Элементы . Добавить ( Тип ( "ЭлементПорядкаКомпоновкиДанных" ) ) ; элементПорядка . Поле = Новый ПолеКомпоновкиДанных ( "Клиент" ) ; элементПорядка . ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных . Возр ; элементПорядка . РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных . Авто ;

Однако если в Настройка списка на закладке Порядок установлено Включать в пользовательские настройки, то программное назначение будет подавляться пользовательскими настройками формы, и в таком случае следует использовать другой код:

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

Отбор данных в динамическом списке

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

Отбор в основной таблице

Для отбора следует добавить элемент отбора в коллекцию .Отбор.Элементы, как показано на примере:

ОтборВладелец = МойДинамическийСписок . Отбор . Элементы . Добавить ( Тип ( "ЭлементОтбораКомпоновкиДанных" ) ) ; ОтборВладелец . ЛевоеЗначение = Новый ПолеКомпоновкиДанных ( "Владелец" ) ; ОтборВладелец . ВидСравнения = ВидСравненияКомпоновкиДанных . Равно ;
Отбор в произвольном запросе

Отбор в произвольном запросе должен использовать параметр запроса, который передается через коллекцию .Параметры.Элементы, как показано в примере:

МойДинамическийСписок . Параметры . УстановитьЗначениеПараметра ( "Владелец" , Объект . Ссылка ) ;

Для отображения в управляемой форме табличных данных, в форме должен быть создан реквизит типа ТаблицаЗначений, который будет доступен и на Клиенте, и на Сервере, при этом функционально будет несколько отличаться.

Элементы.<элемент-таблица>.ОтборСтрок = Новый ФиксированнаяСтруктура(<строка реквизитов>, <значение реквизита>);

Важно! Строковое значение используется для поиска по подстроке

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

При вызове методов формы &НаСервере xdto-преобразование реквизита от типа к типу выполняется прозрачно, но при передаче в возвращаемых параметра серверных вызовов необходимо применять преобразование функциями ЗначениеВРеквизитФормы(), ЗначениеВДанныеФормы(), РеквизитФормыВЗначение(), ДанныеФормыВЗначение().

Типы, свойства и методы для работы с ДеревоЗначений &НаКлиенте и &НаСервере

&НаСервере

Для работы с Деревом значений на Сервере применяется более функциональная иерархия типов работы со строками и колонками:

. Для отображения в управляемой форме иерархической структуры, в форме должен быть создан реквизит типа ДеревоЗначений, который будет доступен и на Клиенте, и на Сервере, при этом функционально будет несколько отличаться.

Форма нового объекта с заполнением

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

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

У многих начинающих программистов, особенно у тех, кто впервые сталкивается с управляемым приложением в 1С, возникает вопрос: как программным способом открыть управляемую форму. Еще больше вопросов возникает с передачей данных, когда одна форма открывается с другой формы. Многих этот момент ставит в тупик.

В этой статье я разберу оба этих момента.

Открытие управляемой формы

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

Управляемые формы обработки

В этой тренировке в форме Данные будем вводить некоторые числовые значения, которые потом используем в форме Расчёт. Сделаем простой пример: решим линейное уравнение тип ax + b = c. Для этого на форме Данные зададим величины a,b и с соответственно, а при открытии формы Расчёт вычислим значение x. Пример больше учебный, нужный для того, чтобы показать, как передавать данные с одной формы на другую. a, b и с – это реквизиты управляемой формы Данные с типом число (10,2). Создадим эти реквизиты и перетащим их на форму.

Реквизиты управляемые формы обработки

Следующим шагом создадим команду на форме Данные, при выполнении которой откроется форма Расчёт, где мы увидим решение линейного уравнения. Назовем команду«Решить уравнение» и поместим её на форму в виде простой кнопки.

Команда на управляемой форме обработки

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

Подробно о клиентском и серверном контексте управляемой формы читайте в статье:

Поэтому создадим обработчик команды «Решить уравнение» на клиенте.

Создание обработчика команды управляемой формы

В процедуре-обработчике этой команды откроем форму Расчёт, для этого необходимо использовать метод глобального контекста ОткрытьФорму.

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

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

Контекстная подсказка метода ОткрытьФорму

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

Контекстная подсказка метода ОткрытьФорму

В нашем случае мы выбираем форму Расчет обработки.

Контекстная подсказка метода ОткрытьФорму

Подготовим форму Расчёт – создадим у этой формы реквизит x, который поместим на форму.

А так же установим у формы в свойство Режим открытия окна значение Блокировать окно владельца. Тогда форма Расчёт будет открываться в отдельном окне.

Свойство управляемой формы Режим открытия окна

Всё! Если мы сейчас сохраним обработку, запустим её и выполним команду «Решить уравнение» формы Данные, то откроется форма Расчёт. На которой, естественно, ни чего пока ещё не рассчитано.

Открытие управляемой формы

И первое что нам бросается в глаза, это заголовок в названии управляемой формы. Переименуем. Для этого в палитре свойств формы нужно снять флаг у свойства Автозаголовок и написать какой-то заголовок в свойстве Заголовок.

Свойство Заголовок управляемой формы

 Свойство Заголовок управляемой формы

Параметры управляемой формы

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

Создадим у управляемой формы Расчёт параметры a,b,c.

Параметры управляемой формы

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

Если Вы хотите, чтобы параметр был доступен все время существования формы, то у него необходимо установить свойство Ключевой параметр.

Свойство ключевой параметр параметра управляемой формы

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

Открытие формы с передачей параметров

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

Посмотрим, как будет работать этот код.

Открытие формы с передачей параметров

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

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


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


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

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

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

2 thoughts on “ Открытие управляемой формы в 1С 8.3 с передачей параметров ”

Открытие форм

Область применения: управляемое приложение, мобильное приложение.

1. Для открытия форм следует применять метод глобального контекста ОткрытьФорму (при использовании версии платформы 1С:Предприятие 8.2 и более ранних версий - также ОткрытьФормуМодально ). Применение альтернативного способа, с получением формы и ее последующим открытием с помощью метода ПолучитьФорму , не рекомендуется.

Рекомендация обусловлена соображениями

  • повышения устойчивости кода, работающего с формой, за счет разделения программного интерфейса для работы с формой и деталей ее внутренней реализации,
  • а также сохранения единой стилистики кода прикладных решений.

Кроме того, применение глобального метода ОткрытьФорму гарантирует выполнение инициализации формы на сервере в обработчике ПриСозданииНаСервере . Этот подход помогает сосредоточить весь код инициализации формы в одном месте и исключает "случайное" обращение к серверу, связанное с инициализацией формы, между строками кода

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

Параметры формы из этого набора могут быть указаны в вызывающем коде при открытии формы ( ОткрытьФорму ).

3. Не следует применять другие способы параметризации формы при открытии. Например, нужно избегать обращения к методам и свойствам формы после ее открытия.
Например, вместо

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

ОткрытьФорму("ОбщаяФорма.ПутеводительПоСистеме", Новый Структура("РежимОткрытия", "Приветствие"));

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

ФормаВопроса = ПолучитьФорму("ОбщаяФорма.ФормаВопроса");
ФормаВопроса.ОткрытьМодально();
Если ФормаВопроса.БольшеНеПоказыватьНапоминание Тогда
// …

следует использовать процедуры-обработчики оповещений, которые будут вызваны при завершении работы пользователя с формой:

Оповещение = Новый ОписаниеОповещения("БольшеНеПоказыватьНапоминаниеЗавершение", ЭтотОбъект);
ОткрытьФорму("ОбщаяФорма.ФормаВопроса". Оповещение, РежимОткрытияОкнаФормы.БлокироватьВеcьИнтерфейс);
.

&НаКлиенте
Процедура БольшеНеПоказыватьНапоминаниеЗавершение(БольшеНеПоказыватьНапоминание, Параметры) Экспорт

Если БольшеНеПоказыватьНапоминание = Неопределено Тогда
Возврат;
КонецЕсли;

Если БольшеНеПоказыватьНапоминание Тогда
// …

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

5. Другие ограничения:

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

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Если Не ПользователиКлиентСервер.ЭтоСеансВнешнегоПользователя() Тогда
Отказ = Истина;
Возврат;
КонецЕсли;

КонецПроцедуры

6. Следующие виды форм должны быть всегда доступны пользователю в режиме 1С:Предприятия из меню "Все функции" вне зависимости от того, размещены ли соответствующие объекты в командном интерфейсе приложения или нет:

Расширение управляемой формы для справочника (Managed form extension for catalogs) - Прочитать (Read)
Синтаксис: Прочитать()
Описание: Обновляет объект управляемой формы.
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент.

Разместил: E_Migachev  Версии: | 8.2 УП |  Дата: 09.04.2014   Прочитано: 33914

Распечатать

Похожие FAQ

Как заполнить табличную часть формы программно?  6
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 10060 (0x0000274C): Попытка установить соединение была безуспешной  18
Установили новый терминальный сервер, на нем подняли 1С, терминальные пользователе неописуемо довольны, все просто летает :) И вот же надо было такому случиться, главному бухгалтеру не понравилось работать через терминал, а еще у нее свой ноутбук и 17 правил для составления оптимального ЗАПРОСа к данным базы 1С  42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps  20
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш 1С Предприятие что это?  11
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое Посмотреть все результаты поиска похожих

Еще в этой же категории

Как обновить динамический список или реквизит на форме клиента?  19
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Динамический список

Как на управляемой форме разместить список регистра сведений с отбором?  18
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Как установить параметр динамического списка?  14
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Форма

Программное создание таблицы значений с условным оформлением  12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора

Заполнение списка значений в элементе поле выбора на форме  10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Посмотреть все в категории Работа с Формой (Диалог) и её элементами

Читайте также: