Управляемое приложение: правильное программное открытие форм

12.11.13

Разработка - Работа с интерфейсом

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

23:07:17Для начала небольшое лирическое отступление. Расскажу о том,  как НЕ НАДО открывать формы. 

Нельзя использовать метод ПолучитьФорму(). Это нельзя делать по двум причинам. Первая причина — это то, что этот метод отрабатывает на порядок медленнее, чем методы ОткрытьФорму() или ОткрытьФормуМодально(). Вторая причина кроется в том, почему собственно такой метод используется. Это обычно делается, когда нужно как-то программно обработать форму перед открытием. Например, нужно установить отбор динамического списка в форме выбора. Давайте рассмотрим, как обычно используется метод «ПолучитьФорму()» и чем ошибка использования такого метода. Программный код открытия формы выбора с отбором выглядит примерно так:

Схема использования метода

 

Ошибка здесь заключается в том, что код программной обработки формы вполне может вступить в конфликт с кодом события «ПриСозданииНаСервере» формы. Это может произойти не сразу. Например, в модуль формы внесли изменения гораздо позже. Причем тот разработчик, который вносил изменения в модуль формы окажется прав. Откуда ему знать, что его форма откуда-то вызывается таким образом? 

 

Если вы хотите, чтобы ваше приложение работало в Web-Интерфейсе, то лучше воздержаться от открытия форм в Модальном режиме. В таком режиме они реализованы как всплывающие окна, которые по умолчанию отключены в большинстве браузеров. Вместо Модального режима можно использовать свойство управляемой формы РежимОткрытияОкна = "Блокировать окно владельца".  

 

Про запреты все, расскажу, как правильно открывать формы

1. Как открыть форму объекта имея ссылку на него

 

Если нужно открыть основную форму объекта, то все очень просто


&НаКлиенте
Процедура ОткрытьФорму(Команда)

ОткрытьЗначение(СсылкаНаОбъект); 

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

 

2. Как открыть форму выбора произвольного объекта

 

Простой вариант открытия: никакой дополнительной программной обработки формы не требуется. Нужно просто открыть основную форму выбора и получить выбранное значение. Используем метод «ВвестиЗначение». Синтаксис следующий: 

 

&НаКлиенте
Процедура Команда1(Команда)

    Перем
ВыбЗнач;

   
Массив = Новый Массив;
   
Массив.Добавить(Тип("СправочникСсылка.Контрагенты"));

   
ОписаниеТиповК = Новый ОписаниеТипов(Массив);

    Если
ВвестиЗначение(ВыбЗнач, "Введите значение", ОписаниеТиповК) Тогда

       
Сообщить(ВыбЗнач);

    КонецЕсли;

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


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

 

Использование метода ОткрытьФорму()

 

Сначала нужно разобраться с параметрами метода «ОткрытьФорму». Полный список параметров выглядит так:

ИмяФормы, Параметры, Владелец, Уникальность, Окно

С параметром «ИмяФормы» все более или менее понятно. А вот про то, что за загадочная штука «Параметры» (тип – Структура), в справке 1С написано очень мало. Передать туда можно все, что можно передать с клиента на сервер. Однако этой информации явно недостаточно.  Попробую разобрать все возможные варианты. 

 

3. Как открыть форму существующего объекта ссылочного типа


У формы любого объекта или записи регистра есть так называемый ключевой реквизит. В списке реквизитов формы он выделен полужирным. Чтобы открыть форму объекта, нужно в параметрдобавить элемент с Ключом «Ключ» и значением — ссылкой на нужный объект. Например:


&НаКлиенте
Процедура ОткрытьФормуПроекта(Команда)

   
П = Новый Структура;
   
П.Вставить("Ключ", Проект);

   ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", П);

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

 

4. Открыть форму существующей записи регистра


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


&НаКлиенте
Процедура ОткрытьФормуРегистра(Команда)

   
КлючЗаписи = Новый Структура;
   
КлючЗаписи.Вставить("Период", ТекущаяДата());
   
КлючЗаписи.Вставить("ФизЛицо", Сотрудник);

   МассивКлюча = Новый Массив;

   
МассивКлюча.Добавить(КлючЗаписи);

   
КлючЗаписиРегистра = Новый("РегистрСведенийКлючЗаписи.ФИОФизЛиц", МассивКлюча);

   
П = Новый Структура("Ключ", КлючЗаписиРегистра);

   
ОткрытьФорму("РегистрСведений.ФИОФизЛиц.ФормаЗаписи", П);

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

 

5. Как открыть форму нового объекта с обработкой заполнения

 

Это даже проще, чем открыть форму существующего. Мы просто не указываем в параметрах «Ключ».


&НаКлиенте
Процедура ОткрытьФорму(Команда)


П = Новый Структура;

ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", П);


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

 


В это случае вызывается процедура «ОбработкаЗаполнения» модуля объекта. Эта процедура имеет единственный параметр «Основание».  Если мы в параметры вставим ключ «Основание», то он будет передан в процедуру «ОбработкаЗаполнения». Например, 

&НаКлиенте
Процедура ОткрытьФорму(Команда)

П = Новый Структура;

П.Вставить("Основание", Проект);

ОткрытьФорму("Справочник.Проекты.ФормаОбъекта", П);

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

 

 

6. Как правильно организовать выбор (подбор) в табличную часть  

 

Стоит знать, что все параметры, указанные в параметреметода открыть форму, доступны в событии «ПриСозданииНаСервере» открываемой формы. Например:

&НаКлиенте
Процедура ОткрытьФорму(Команда)

П = Новый Структура;

П.Вставить("Основание", Проект);

ОткрытьФорму("Справочник.Проекты.ФормаВыбора", П);

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

 

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

 


&НаСервере
Процедура ПриСозданииНаСервере()

Если
Параметры.Свойство("НашПараметр") Тогда

ПереданныйПараметр = Параметры.НашПараметр;

      
//Программная обработка формы

КонецЕсли;

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

Чтобы организовать выбор, нужно знать еще пару моментов. Первое, это параметр метода «ОткрытьФорму». В качестве владельца может выступать другая форма или элемент управления. Этот параметр, во-первых будет доступен в свойстве «ВладелецФормы» открываемой формы, а во-вторых, после совершения пользователем выбора стандартным способом (т.е. через форму выбора, по нажатии кнопки «Выбрать»), у Владельца сработает событие «ОбработкаВыбора». 

 


&НаКлиенте
Процедура ОткрытьФорму(Команда)

П = Новый Структура;

П.Вставить("НашПараметр", Проект);

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


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

 

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


&НаКлиенте
Процедура ОткрытьФорму(Команда)

П = Новый Структура;

П.Вставить("НашПараметр", Склад);
П.Вставить("ЗакрыватьПриВыборе", Истина);
ВладелецФормыПодбора = Элементы.Товары;

ОткрытьФорму("Обработка.ПодборНоменклатуры.Форма", П, ВладелецФормыПодбора);

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

 

В самой форме организуем программно выбор  таким образом: 

&НаКлиенте
Процедура Выбрать(Команда)

   
РезультатВыбора = ПодготовитьРезультатВыбора();
   
ОповеститьОВыборе(РезультатВыбора);

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


&НаСервере
Функция ПодготовитьРезультатВыбора()

//Готовим результат выбора

КонецФункции

В результате выполнения метода ОповеститьОВыборе форма подбора закроется и вызовется событие «ОбработкаВыбора» элемента управления «Товары».

Прочие полезности. В случае подбора в форму можно передать параметры, чьи названия говорят сами за себя: «ЗакрыватьПриВыборе», МножественныйВыбор, ЗакрыватьПриЗакрытииВладельца. Все параметры имеют тип Булево. Их названия говорят сами за себя. 

 

7. Как открыть форму и установить в ней отбор

 

Простая ситуация: простой отбор по одному или нескольким реквизитам. Например, что-то вроде такого

Контрагент = ВыбранныйКонтрагент И Организация = ВыбраннаяОрганизация

 

Для организации такого отбора нужно использовать параметр «Отбор», тип Структура, где Ключ – это Имя поля динамического списока, а значение это собственно то, почему нужно фильтровать данные. Например:


&НаКлиенте
Процедура ОткрытьФорму(Команда)

П = Новый Структура;
Отбор = Новый Структура;
Отбор.Вставить("Владелец", Контрагент);
П.Вставить("Отбор", Отбор);

ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", П);

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

 

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

Первый путь: не самый удачный. Открываем форму, передаем в нее параметр


&НаКлиенте
Процедура ОткрытьФорму(Команда)

П = Новый Структура;

П.Вставить("Подразделение", Подразделение);

ВладелецФормыПодбора = Элементы.Сотрудник;
ОткрытьФорму("Справочник.СотрудникиОрганизаций.ФормаВыбора", П, ВладелецФормыПодбора);

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

 


В самой форме в событии «ПриСозданииНаСервере» задаем отбор списка: 

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

    Если
Параметры.Свойство("Подразделение") Тогда

       
СписокСотрудников = ПодготовитьСписокСотрудниковПодразделения(Параметры.Подразделение);

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

    КонецЕсли;

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

Второй путь - это использование Параметов Выбора и поэтому он лучше. Пример:

&НаКлиенте
Процедура ПриОткрытии(Отказ)

   
Подразделение = Объект.Подразделение;
   
НовыйПараметр = Новый ПараметрВыбора("Подразделение ", Подразделение);

    НовыйМассив = Новый Массив;
   
НовыйМассив.Добавить(НовыйПараметр);

    НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
   
Элементы.Сотрудник.ПараметрыВыбора = НовыеПараметры;

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

Почему параметры выбора использовать лучше:

1)      Мы не отказываемся от стандартной обработки выбора: меньше кода

2)      Параметры выбора будут доступны в процедуре «ОбработкаПолученияДанныхВыбора» модуля менеджера выбираемого объекта. Поэтому мы сможем ограничить список доступных значений выбора при вводе по строке. 

 

Уникальность формы

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

 

ВладелецФормы = Элементы.Сотрудники;

ОткрытьФорму("Справочник.СотрудникиОрганизаций.Форма", , ВладелецФормы, ЭтаФорма.УникальныйИдентификатор);

Платформа будет искать открытые окна с таким ключом уникальности. В том случае, если она их найдет, то будет активировано существующее окно. В противном – открыто новое.

Открыть форму программно открыть управляемую форму как открыть форму документа управляемые формы как открытьформу как открытьформу() как получить форму объекта как получить форму в 8.2

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

Работа с интерфейсом Рабочее место Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61795    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

Работа с интерфейсом Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Механизм «Динамическое управление доступом к элементам форм объектов 1С8» предназначен для обеспечения возможности оперативного управления видимостью и доступностью элементов форм документов и справочников продуктов фирмы «1С» «1С:Предприятие 8». Решение универсальное, встраивается в любую конфигурацию с минимальными доработками, что позволяет без проблем обновлять типовые решения.

5000 руб.

14.01.2016    54402    16    21    

42

Управление дашбордами

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Обработка предназначена для создания и управления дашбордами.

2400 руб.

29.06.2020    16697    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10735    750    elcoan    45    

106

Конструктор HTML, CSS и javascript

Инструментарий разработчика Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

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

2 стартмани

10.04.2023    9611    151    acces969    31    

118

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3665    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12080    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
80. DAnry 8 13.11.13 20:52 Сейчас в теме
Спасибо, очень доступно и познавательно, а главное практично. Плюсую.
83. maxim305 18 15.11.13 06:11 Сейчас в теме
(80) DAnry,
Спасибо, очень доступно и познавательно, а главное практично. Плюсую.

Поддерживаю!
81. webester 26 14.11.13 02:13 Сейчас в теме
Сразу на входе на картинках, подчеркнуты ошибки. Убирать было лень? Или вы намекаете на свою неграмотность? Делаете для людей, делайте нормально. Тем более в данном случае, это несложно.
П2 сокращается раза в три(для того, что бы открыть форму выбора нам нужно описание одного типа, массив здесь лишний):

Выбзнач = "";

Если ВвестиЗначение(ВыбЗнач, "Введите значение", Новый ОписаниеТипов("СправочникСсылка.Контрагенты")) Тогда

Сообщить(ВыбЗнач);

КонецЕсли;

п 3.
У формы любого объекта или записи регистра есть так называемый ключевой реквизит.

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

Или
У формы любого объекта или записи регистра есть ключевой реквизит. Этот реквизит указывает на тип формы(форма списка\объекта и за ее содержание, при открытии формы, мы передаем следующую структру, заполняя этот реквизит)

То есть либо раскрываем мысль, либо говорим строго по существу.

п6
первая процедура тоже сокращается до одной строчки, без потери читабельности. Далее читаем:
Тогда в событии «ПриСозданииНаСервере» формы элемента справочника Проекты можно будет получить «НашПараметр».

Но в примере который приведен выше, нет структуры с таким ключом, вы не тот кусок кода кода скопировали, исправьте.
Так же в п6. после
Этот параметр, во-первых будет доступен в свойстве «ВладелецФормы» открываемой формы, а во-вторых, после совершения пользователем выбора стандартным способом (т.е. через форму выбора, по нажатии кнопки «Выбрать»), у Владельца сработает событие «ОбработкаВыбора».

следует добавить:
В третьих, если владельцем формы выступает реквизит формы и его тип совпадет с типом возвращаемого значения формой подбора, обработку выбора реализовывать нет смысла, этот реквизит, заполнится автоматически.
Получилось немного громоздкое выражение, но я думаю вы поняли мысль и сможете обернуть ее как то по попроще,
если пожелаете конечно.
Это так на беглый взгляд, ибо почти не пишу под УФ. Точнее сказать вообще не пишу.
CratosX; sergio199; v777k; zqzq; kser87; ShantinTD; +6 Ответить
82. kser87 2438 14.11.13 10:41 Сейчас в теме
(81) webester, спасибо, учту ваши замечания
84. KliMich 16.11.13 00:16 Сейчас в теме
Спасибо! Сроду не подозревал, что так может быть...
Возьму себе на заметку.
85. Сисой 87 25.11.13 12:05 Сейчас в теме
Респект, хорошо все собрано в одном месте.
86. bayce 45 25.11.13 22:01 Сейчас в теме
очень интересная статья.
я обычно пользовался методом ПолучитьФорму().
теперь вижу, что не всегда это корректно.
87. kser87 2438 25.11.13 22:05 Сейчас в теме
(86) bayce, (85) Сисой, Спасибо! Приятно осознавать, что твой труд кому-то нужен=)
88. NeSPEC 41 27.11.13 14:24 Сейчас в теме
Спасибо, интересно. Плюс.
89. Scukosan 23.10.14 13:28 Сейчас в теме
спасибо)
в целом интересно)
90. grey_yes 12 26.01.15 08:55 Сейчас в теме
Куда-то исчезла схема использования метода!
91. kser87 2438 26.01.15 10:35 Сейчас в теме
(90) grey_yes, спасибо, что заметили. Верну, когда будет время
92. MK400081 29.01.15 13:47 Сейчас в теме
Второй путь - это использование Параметов Выбора и поэтому он лучше. Пример:

&НаКлиенте
Процедура ПриОткрытии(Отказ)

Подразделение = Объект.Подразделение;
НовыйПараметр = Новый ПараметрВыбора("Подразделение ", Подразделение);


Если это событие открываемой формы справочника , то тогда "Объект" - это что?
93. kser87 2438 29.01.15 18:06 Сейчас в теме
(92) MK400081, это не событие открываемой формы справочника. Это событие формы, из которой открываем. Не очень удачно написал, нужно было давать второй путь сразу после первого. В открываемой форме также отрабатывает
94. volha-77 19 13.03.15 23:21 Сейчас в теме
Такой вопрос: если использовать ОткрытьФормуМодально нежелательно, как тогда будет правильно обработать такую ситуацию: на форме документа Договор есть таблица значений (не табличная часть), в которой отображаются Приложения к договору. Есть кнопка "Добавить приложение". Раньше я использовала ОткрытьФормуМодально и после закрытия созданного приложения таблица перезаполнялась. Как перезаполнить таблицу после закрытия приложения без использования модального открытия формы?
95. kser87 2438 14.03.15 00:46 Сейчас в теме
(94) volha-77, метод ОткрытьФормуМодально подразумевает, что для редактирования будет доступно только открываемое окно. Пользователей это раздражает. Вам нужна модальность? Если да, то установите у формы Приложения свойство "РежимОткрытияОкна" в значение "Блокировать окно владельца" или "Блокировать весь интерфейс". Это аналог модальности.

Оганизация выбора приложения во многом зависит от того, какой тип значения выбирается в результате в таблицу значений. Например, если вам нужно добавить строку и заполнить в ней 1 ячейке примитивным типом (строка, булево, число) или ссылкой, то все очень просто

В форме договора пишите такой код:

П = Новый Структура;
П.Вставить("ЗакрыватьПриВыборе", Истина);
П.Вставить("РежимВыбора", Истина);
ОткрытьФорму("ИмяФормы", П, ЭлементВладелец);

Где ЭлементВладелец это ваша таблица значений.

В Форме приложения добавьте кнопочку. В обработчике команды кнопки вставьте следующий код:

&НаКлиенте
Процедура ЗавершитьИЗакрыть(Команда)

РезультатВыбора = ПолучитьРезультатВыбора();
ОповеститьОВыборе(РезультатВыбора)

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

Этого достаточно.

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


&НаКлиенте
Процедура Таблица1ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
//Заполнение таблицы
КонецПроцедуры

В параметр ВыбранноеЗначение будет передано то, что вы вставили в параметр РезультатВыбора метода ОповеститьОВыборе.

И может быть совсем сложная ситуация. Возникает она когда результат выбора нельзя передать с клиента на сервер. Тогда В Форме приложения, в серверной функции, помещаете ваш результат во временное хранилище:

&НаСервере
Функция ПолучитьРезультатВыбора()
....
Адрес = ПоместитьВоВременноеХранилище(РезультатВыбора);
Возврат Адрес;
КонецФункции


В Форме приложения добавьте кнопочку. В обработчике команды кнопки вставьте следующий код:

&НаКлиенте
Процедура ЗавершитьИЗакрыть(Команда)

РезультатВыбора = ПолучитьРезультатВыбора();
ОповеститьОВыборе(РезультатВыбора)

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

В событии ОбработкаВыбора таблицы:

&НаКлиенте
Процедура Таблица1ОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Таблица1ОбработкаВыбораНаСервере(ВыбранноеЗначение);
КонецПроцедуры

&НаСервере
Процедура Таблица1ОбработкаВыбораНаСервере(ВыбранноеЗначение)

РезультатВыбора = ПолучитьИзВременногоХранилища(ВыбранноеЗначение);
....
КонецПроцедуры
96. volha-77 19 14.03.15 16:24 Сейчас в теме
(95) большое спасибо! Все получилось, в обработке выбора таблицы я вызываю функцию ЗаполнитьПриложения(), которая заново заполняет таблицу существующими приложениями. Однако попутно возник вопрос: если таблицу в обработке выбора не перезаполнять, а добавлять строку, то возникает проблема : почему-то событие обработки выбора возникает 2 раза - и в результате добавляется 2 строки, а не одна. Почему все-таки это событие возникает 2 раза после закрытия приложения (в котором я добавила кнопку и на нее повесила ОповеститьОВыборе)?
97. kser87 2438 14.03.15 19:05 Сейчас в теме
(96) volha-77, Возможно потому, что одна строка уже добавлена платформой. Вы ее можете отловить при помощи свойства "ТекущиеДанные" элемента формы, связанного с таблицей.
102. volha-77 19 20.04.15 15:25 Сейчас в теме
(97) я разобралась, почему добавляется 2 строки. Дело в том, что если одновременно П.Вставить("РежимВыбора", Истина); и в открываемой форме вызывать ОповеститьОВыборе, то процедура ОбработкаВыбора вызывается 2 раза. Надо что-то одно писать. В моем случае буду использовать ОповеститьОВыборе, т.к. нужно возвращать параметр в род. форму.
98. aet 54 01.04.15 12:20 Сейчас в теме
Как открыть форму группы для создания новой, которая не назначена по-умолчанию, не изменяя самого объекта из внешней обработки?
99. kser87 2438 01.04.15 12:32 Сейчас в теме
(98) aet, в методе ОткрытьФорму задайте явно имя формы
103. пользователь 04.05.15 21:02
Сообщение было скрыто модератором.
...
104. Solikamsk 2 02.12.15 14:34 Сейчас в теме
Мои 5 копеек в "5. Как открыть форму нового объекта с обработкой заполнения"

там надо не "Основание" а "ЗначениеЗаполнения", т.е.

ПараметрыОткрытияЗаписиРегистра = Новый Структура();
			ПараметрыОткрытияЗаписиРегистра.Вставить("Подключение",Ключ.Подключение);
			ПараметрыОткрытияЗаписиРегистра.Вставить("Регламент",Ключ.Регламент);
			
			П = Новый Структура("ЗначенияЗаполнения", ПараметрыОткрытияЗаписиРегистра);
			ОткрытьФорму("РегистрСведений.СостоянияЭтапов.ФормаЗаписи", П, ЭтотОбъект,,,,,РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);


по крайней мере в платформе 8.3.6
105. kser87 2438 02.12.15 14:43 Сейчас в теме
(104) Solikamsk, видимо изменилось что-то с версии 8.2
106. Поручик 4670 02.12.15 15:25 Сейчас в теме
(105) Ничего не менялось. Использование "ЗначенияЗаполнения" как было в 8.2, так и осталось.
107. kser87 2438 02.12.15 15:39 Сейчас в теме
(106) Поручик, видимо я ошибся. Нужно перепроверить и статью и поправить косяки.
108. darkfire 16.02.16 20:50 Сейчас в теме
Благодарю за прекрасную и полезную статью
109. darkfire 16.02.16 21:03 Сейчас в теме
Хм то есть предлагаете перелопатить тонну книг, чтоб узнать ответ на конкретный вопрос вместо того чтобы прочитать одну статью :D
110. djolejek 29.03.16 12:53 Сейчас в теме
&НаКлиенте
Процедура ПриходнаяНакладная(Команда)

    СсылкаНаДокумент = СоздатьНовыйДокумент();
    ОткрытьЗначение(СсылкаНаДокумент);

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

&НаСервере
Функция СоздатьНовыйДокумент()

   НовыйДокумент = Документы.ПриходнаяНакладная.СоздатьДокумент();
   НовыйДокумент.Номер = "111";
   НовыйДокумент.Дата = ТекущаяДата();
   НовыйДокумент.Записать();

   Возврат НовыйДокумент.Ссылка;

КонецФункции 
Показать
111. kser87 2438 29.03.16 15:12 Сейчас в теме
(110) djolejek, Это вы к чему написали?
112. djolejek 30.03.16 10:19 Сейчас в теме
(111) Хорошо бы добавить этот код в 1-ый пункт. Так как не всем может быть понятно как с сервера передать ссылку на клиент. Для полноты картины добавил кусочек кода. Если кто-то будет искать что бы все в одном месте.
113. kser87 2438 30.03.16 10:39 Сейчас в теме
(112) djolejek, не очень понятна идея, в чем проблема передать ссылку? И точно пример неправильный. Зачем вы задаете явно номер документа?
114. AntoShiK86 29 15.04.16 14:10 Сейчас в теме
Столкнулся с тем, что Элементы.Сотрудник.ПараметрыВыбора = НовыеПараметры; и в форме выбора открывшейся, создать новый элемент. При его выборе скажет, что параметр не соответствует отбору.
115. kser87 2438 15.04.16 16:22 Сейчас в теме
(114) AntoShiK86, не понял ,что вы хотите в итоге?
116. AntoShiK86 29 18.04.16 07:22 Сейчас в теме
В табличной части документа, хочу заполнять реквизит из справочника, ограничивая вывод справочника. Ограничивать хочу, используя список элементов, получаемых запросом. Если искомого элемента в справочнике нет, то создавать его.
Проще говоря, в документе определяю контрагента, заполняю табличную часть, заношу в регистр сведений. И впреть новые документы фильтруются исходя из того, что было заполнено в табличной части предыдущих и по контрагенту.

Что удобно, пользователь делает документ, выбирает контрагента, сразу фильтр по контрагенту, потом исходя из выбранных в первой колонке табличной части значений, фильр накладывается на выбор для 2й колонки и последующих. Данные для фильтра берутся из среза последних регистра.
117. kser87 2438 18.04.16 15:49 Сейчас в теме
(116) AntoShiK86, видимо у вас не заполняется значение какое-то при создании элемента справочника.
122. artemusII 27.04.16 09:20 Сейчас в теме
Статья отличная! Спасибо автору.
125. progr-2008 118 06.10.16 18:00 Сейчас в теме
126. user598640_moscow1109 04.12.16 01:30 Сейчас в теме
Спасибо большое за статью. Помогает осваивать программирование в 1 с.
128. OksanaSub 53 26.07.17 10:46 Сейчас в теме
129. OksanaSub 53 26.07.17 10:46 Сейчас в теме
Спасибо за статью, помогла при вызове прочих форм для выбора.
130. Team leader 12 02.09.17 03:46 Сейчас в теме
Потратитил время из-з такого синтаксиса:


Провильно:
-----------------------------------------------------------------------------------------------------------------------
П = Новый Структура;
ОткрытьФорму("Отчет.ПечатьЕжедневнойСводки_УАТ_3_0.Форма.ФормаОтчета", П);
------------------------------------------------------------------------------------------------------------------------
Не правильно:
П = Новый Структура;
ОткрытьФорму("Отчет.ПечатьЕжедневнойСводки_УАТ_3_0.ФормаОтчета", П);
------------------------------------------------------------------------------------------------------------------------

(что называется - найдите 10 отличий....)
131. SuhoffGV 15.09.17 18:18 Сейчас в теме
Подскажите пожалуйста, возможно ли решить задачку с помощью ПараметровВыбора:
1. Нужно открыть форму выбора физлица так чтобы были видны только элементы в определенной группе справочника (и как вариант сама эта группа).
2. Было бы отлично если пользователь попытается создать из формы выбора новое физлицо то оно автоматом попало бы в группу, с отбором по которой открыта форма выбора.

Пробовал в коде формы на которой размещено поле выбора физлица писать такой код:
&НаСервере
Процедура гаПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	гаПриСозданииНаСервереПослеУстановкаПараметрыВыбораВодителя();
КонецПроцедуры

&НаСервере
Процедура гаПриСозданииНаСервереПослеУстановкаПараметрыВыбораВодителя()

	Перем НовыеПараметры, НовыйМассив, ПараметрОтборПоРодителю, ПараметрОтборЭтоГруппа;
	
	//Отбор по папке Водители при выборе водителя
	НовыйМассив = Новый Массив();
	ПараметрОтборПоРодителю = Новый ПараметрВыбора("Отбор.Родитель", Константы.ггГруппаФизЛицВодители.Получить());
	ПараметрОтборЭтоГруппа = Новый ПараметрВыбора("Отбор.ЭтоГруппа",Ложь);
	НовыйМассив.Добавить(ПараметрОтборПоРодителю);
	НовыйМассив.Добавить(ПараметрОтборЭтоГруппа);
	НовыеПараметры = Новый ФиксированныйМассив(НовыйМассив);
	Элементы.гаВодитель.ПараметрыВыбора = НовыеПараметры;
	//__________________________________________________________­___
	
КонецПроцедуры

Показать


В итоге форма открывается. Физлиц кроме как в нужной группе не выводится, но видна ещё одна группа.
133. KAV2 156 08.12.17 07:23 Сейчас в теме
Одна из самых полезных статей что видел здесь. Отпад.
134. Darklight 32 11.12.17 15:33 Сейчас в теме
//В статье написано: 
ВыбранноеЗначение = Форма.Открыть();

//А имелось в виду, видимо так:
ВыбранноеЗначение = Форма.ОткрытьМодально();


И, соответственно, не раскрыта тема замены работы без модального режим (т.е. через "Обработку оповещения")
135. vladismi 168 11.12.17 17:39 Сейчас в теме
Хорошо собрано в кучку. Запомним.
136. unichkin 1559 12.12.17 19:15 Сейчас в теме
"П = Новый Структура;"
https://its.1c.ru/db/v8std#content:2149184103:hdoc, п.4: "Имена переменных не должны состоять из одного символа. Использование односимвольных имен переменных допускается только для счетчиков циклов. "
Статья для изучающих, кто-то будет копировать примеры. Нехорошо, что допущены такие отклонения.
137. kser87 2438 12.12.17 21:55 Сейчас в теме
(136) будет время исправлю
138. PopovaNat 29.06.18 15:07 Сейчас в теме
спасибо за статью! пригодилось
139. fxmike 70 07.09.18 14:17 Сейчас в теме
7 пункт про сложный отбор - можно сделать и без изменений в открываемой форме выбора.

ПараметрыОткрытия = Новый Структура("ЗакрыватьПриВыборе,РежимВыбора",Истина,Истина);
// простой отбор
ПараметрыОткрытия.Вставить("Отбор",Новый Структура("Сотрудник",Объект.Сотрудник));

// открываем форму, получаем ее ссылку
ФормаВыбора = ОткрытьФорму("Документ.Отпуск.ФормаВыбора",ПараметрыОткрытия,,ЭтаФорма.УникальныйИдентификатор);

// тут же добавляем в нее нужные отборы
// сложный отбор
ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ИсправленныйДокумент");
ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Документ.Отпуск.ПустаяСсылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеРавно;
ЭлементОтбора.Использование = Истина;
140. AganinEvgeniy 2 24.01.19 15:35 Сейчас в теме
Спасибо! Выручило. Хорошая статья, как памятка.
Единственное, что я не заметил, это открытие общей формы для подбора а-ля подбор номенклатуры в УТ или ТиС, когда выбирался и товар и количество и они потом сразу же переносились в документ. Вот этого нет и обработки входящих данных в форме владельце.
141. pqt 06.06.19 08:52 Сейчас в теме
Как открыть не основную форму?
142. starik-2005 3033 06.06.19 13:48 Сейчас в теме
(141)
ОткрытьФорму("ОбъектКонфы.Форма.ФормаНеОсновная", Новый Структура("Параметры, ...", П1, П2, ..), ...);
144. ks8585 3 21.08.19 18:38 Сейчас в теме
Доброго дня. Подскажите можно ли находить на форме документа и имея ссылку на этот документ - через команду внешней обработки внести изменения в ТЧ формы без записи объекта.
То есть по сути просто поменять значения на форме по определенному алгоритму. А записывать документ или нет решит пользователь.
145. independ 1518 21.08.19 19:08 Сейчас в теме
(144) если форма обработки открыта из формы с передачей владельца, тогда из формы внешней обработки ВладелецФормы.Объект.ВашаТЧ (УФ)
146. ks8585 3 21.08.19 21:21 Сейчас в теме
(145)насколько я понимаю передается массив объектов ( то есть массив ссылок на документ). Если открываешь из документа то массив из одного элемента.
147. independ 1518 21.08.19 22:33 Сейчас в теме
(146) это так, но для решения вашего вопроса можно получить нужные реквизиты через ВладелецФормы. Какая конфигурация? Типовая? Если да, тогда в любой внешней обработке (ВПФ, заполнение, создание связанных объектов и проч.) есть ВладелецФормы, который доступен в клиентских процедурах формы внешней обработки
148. ks8585 3 22.08.19 08:20 Сейчас в теме
(147)я в типовой УТ хочу через "заполнение". А код в экспортной процедуре модуля формы обработки. Туда вроде определенный перечень объектов передается.
149. independ 1518 22.08.19 08:37 Сейчас в теме
150. SlavaKron 22.08.19 08:43 Сейчас в теме
(144) Вам ответ дали в вашей теме https://forum.infostart.ru/forum9/topic224216/ Используйте внешнюю обработку с подключаемой командой ЗаполнениеОбъекта. Только этот тип команды не потребует предварительной или последующей записи объекта.
151. ks8585 3 22.08.19 10:05 Сейчас в теме
(150)но если ты внесешь изменения в объект программно и не сделаешь Объект.Записать(), тодаже если ты перечитаешь форму - данные ведь не поменяются.
152. mike.kondr 23.12.19 15:37 Сейчас в теме
Имеется поле формы типа СправочникСсылка.Партнеры
Справочник имеет три реквизита типа Булево - Клиент, Поставщик, Прочее

Необходимо организовать правильный подбор с условием Клиент ИЛИ Поставщик
По-старинке делаем получение формы, создание группы отбора ИЛИ, добавление двух отборов в группу... Затем открытие формы

При таком подходе может возникать накладка с логикой формы в процедуре ПриОткрытии (если там что-то с отборами делается - самый первый абзац публикации)

Более правильный подход в ответе (139)

Но даже при таком подходе в интерфейсе Такси работает выбор из списка при произвольном вводе строки - в этом случае подбор выполняется без требуемых правил...

Как же правильно реализовать логику отбора ИЛИ для любого подбора?
(догадываюсь, что необходимо использовать ПараметрыВыбора и ОбработкаПолученияДанныхВыбора модуля менеджера... но как наиболее универсально реализовать?)
153. starik-2005 3033 25.12.19 11:57 Сейчас в теме
(152)
Имеется поле формы типа СправочникСсылка.Партнеры
Мы в свое время сделали справочник отдельный для того, чтобы подбирать нужного партнера/клиента. В справочнике тупо табличная часть с индексируемой строкой, по которой осуществляется поиск по вхождению. Типа пишешь "альфа", а там все альфа-банки и прочее с этим словом. Ну и от трех символов начинается поиск, отображаются первые 50 строк.
154. user1194102 10.02.20 16:57 Сейчас в теме
Спасибо за статью все интересно, но на обычных формах нет процедуры ПриСозданииНаСервере. Как на обычных формах принимать переданный параметр?
155. SeregaYagel 16.03.20 23:41 Сейчас в теме
Спасибо за статью и труд!)
156. 7OH 69 10.06.20 13:04 Сейчас в теме
Подскажите, а открыть форму списка документов с нужным периодом без постобработки не выйдет ?
159. kser87 2438 16.06.21 13:32 Сейчас в теме
160. SlavaKron 16.06.21 14:32 Сейчас в теме
(159) Почему же? Отбор можно установить с помощью параметра ФиксированныеНастройки или ПользовательскиеНастройки.
Настройки = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Дата.ДатыНачала.НачалоМесяца");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = НачалоМесяца(ТекущаяДата());
Параметры.Вставить("ФиксированныеНастройки", Настройки);
Прикрепленные файлы:
SergeySol-82; +1 Ответить
157. doom2good 136 16.06.21 13:12 Сейчас в теме
А как открыть форму списка регистра сведений так, чтобы в ней выделились нужные строки (или строка)? Или форму списка любого другого объекта
158. kser87 2438 16.06.21 13:31 Сейчас в теме
(157) создайте объект РегистрСведенийКлючЗаписи и передавайте его в качестве ключа вместо ссылки.
161. Pro_Gramist 20.07.21 10:39 Сейчас в теме
Спасибо за статью, интересная информация!
162. frkbvfnjh 785 01.09.21 08:29 Сейчас в теме
А как мне получить объект ссылки справочника, добавить строку в табличную часть и открыть форму этого измененного объекта?
163. kser87 2438 01.09.21 23:07 Сейчас в теме
(162) также, как и открываете существующий элемент справочника. В параметры передайте данные для заполнения строки и добавляйте ее ПриСозданииНаСервере
173. pyrkin_vanya 488 24.01.22 09:36 Сейчас в теме
Как можно открыть форму нового объекта и заполнить нужные реквизиты? Не меняя никаких других форм, модулей и прочего и не записывая ссылку на этот объект. Просто открыть форму и заполнить по принципу ввода на основании?
174. kser87 2438 24.01.22 10:04 Сейчас в теме
(173) если нет нужного кода и настроек конфигурации, то никак
175. pyrkin_vanya 488 24.01.22 10:18 Сейчас в теме
(174)Можно. Только через ПолучитьФорму. Но обработкаОповещения не запустить потом. Ну и вы пишите что так нельзя. Типа дольше открывается. Хотя я разницы не особо заметил.
176. nature2002 14 10.03.22 00:45 Сейчас в теме
А как открыть произвольную форму внешней обработки, как открытой из файла, так и из справочника доп.обработок?)
177. Vasilius_Infernius 12.12.22 05:09 Сейчас в теме
Спасибо автору, хорошая статья, дам своим юным падаванам :)
Немного критики. Перед первым пунктом вы пишете, что лучше отказаться от модальных окон. Но первый и второй пункт и есть открытие модальных окон. Логичнее тогда вместо ОткрытьЗначение и ВвестиЗначение использовать ОткрытьЗначениеАсинх и ВвестиЗначениеАсинх. Ну, или чтобы не сильно пугать новичков, хотя бы упомянуть, что такие методы есть.
Baturskii; kser87; +2 Ответить
178. kser87 2438 12.12.22 09:24 Сейчас в теме
(177) спасибо. Статья писалась тогда, когда ОткрытьЗначениеАсинх и Показать... еще не придумали=) ее пора бы конечно обновить
179. vika64 75 08.02.23 16:18 Сейчас в теме
Спасибо, очень помогла статья!!
180. frkbvfnjh 785 24.07.23 11:37 Сейчас в теме
Не нашел примера как открыть форму нового, еще не записанного объекта. Мне например нужно загрузить объект из XML и открыть форму объекта без записи в базу. Можете подсказать как такое провернуть?
181. frkbvfnjh 785 24.07.23 11:48 Сейчас в теме
(180) Мне помог вот этот способ https://infostart.ru/1c/articles/118784/
На сколько он верный в данном случае?
182. kser87 2438 24.07.23 11:50 Сейчас в теме
(180) через обработку заполнения.
183. Baturskii 16.11.23 10:47 Сейчас в теме
Друзья, есть вопрос по теме. Может кто подскажет:

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

Так вот вопрос - можно ли как-то провернуть такой же финт для поля строки таблицы? У меня есть ТЗ на форме и я хочу программно добавлять в него строку и сразу запрашивать у пользователя доп. информацию и писать в нужные колонки. Если бы это были обычные реквизиты формы - то без проблем, а вот с таблицей не получается

Может кто сталкивался. Заранее благодарен за ответ!
184. kser87 2438 16.11.23 17:46 Сейчас в теме
(183)не совсем понятно. пишите:
такой же финт для поля строки таблицы
а потом
запрашивать у пользователя доп. информацию и писать в нужные колонки
так колонкА или колонкИ?
185. Baturskii 17.11.23 15:58 Сейчас в теме
(184)Считан ШК. В нем может быть зашита серия, а может и нет. Если не зашита - нужно ее сразу же запросить и заполнить в соответствующую колонку
Оставьте свое сообщение