1с параметры формы в модуле объекта

Обновлено: 06.07.2024

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

1. Задача передачи параметров 1С

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

2. Реализация с модулем объекта документа 1С

В самом начале модуля объекта документа 1С необходимо определить переменную, в которую будут передаваться выбранные настройки. Также необходимо ей присвоить признак «экспорт», чтобы переменная была доступна в любом месте документа.



В модуле основной формы документа в обработчике события 1С кнопки, открывающей форму с выбором настроек, необходимо указать процедуру Новый ОписаниеОповещения(). Это определяет результат после закрытия формы настроек в 1С 8.3.



В форме настроек для сохранении и передачи параметров 1С (в нашем случаи это структура) необходимо указывать процедуру ОповеститьОВыборе()


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



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



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


Модуль объекта есть почти у всех основных прикладных объектов конфигурации в 1С.


Также модуль объекта можно открыть из контекстного меню объекта:


Или из меню Действия:


Модуль объекта выполняется при создании объекта. В нем можно объявлять переменные модуля. Экспортные процедуры и функции можно вызывать у созданных программных объектов. К экспортным переменным можно обращаться как к свойствам программных объектов. В модуле есть прямой доступ к реквизитам и табличным частям объекта.

Вызов методов модуля объекта


В модуле объекта напишем следующий код:

Теперь создадим обработку с одной формой и в модуле обработки в событии ПриСозданииНаСервере напишем следующий код:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //заполняем экспортную переменную модуля объекта вызвав экспортную функцию ОбъектНоменклатура . ОбщийОстаток = ОбъектНоменклатура . ОбщийОстаток ( ) ;

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

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

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //пытаемся заполнить переменную модуля объекта вызвав функцию модуля объекта ОбъектНоменклатура . ПолноеНаименование = ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименование ) ; //ошибка

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


Так как переменная ПолноеНаименование не является экспортной, то к ней нет доступа из других модулей.

Теперь попробуем обратиться к не экспортной функции модуля объекта. Вставим в модуль формы следующий код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ) ; //опять ошибка


Теперь вставим в форму обработки такой код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ;

Здесь мы вызываем экспорную процедуру модуля объекта, а потом встроенным методом Записать записываем объект в базу данных.

В результате в базе данных будет создан новый элемент, у которого заполнен артикул и добавлены 2 строки в табличную часть:


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

Обработчики событий


В результате откроется список возможных событий:


Рассмотрим основные события модуля объекта:

Для примера создадим в модуле объекта 3 обработчика события и вставим в них следующий код:

В обычных формах для передачи параметра было 2 возможности:

  1. менее распространенный способ: в форме объекта на вкладке «Реквизиты» добавлялся реквизит, при необходимости определялся доступ визуальными средствами
  2. более распространенный способ: в модуле формы объявлялась экспортная переменная и в обработчике « ПередОткрытием » значение обрабатывалось

в обоих случаях вызов формы выглядел примерно так:

Форма = Объект . ПолучитьФорму ( "ФормаВыбора" , ВладелецФормы , КлючУникальности );
Форма . Параметр = ЗначениеПараметра ;
Форма . Открыть ();

Как передаются параметры в управляемых формах

В управляемых формах теперь есть возможность сразу передавать параметры при получении формы. Параметры передаются в виде структуры:

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

Также у управляемой формы появились «расширения формы» (объект, справочник, документ, отчет). В зависимости от типа объекта определяется состав доступных параметров. Например, если в форме выбора справочника нужно позиционироваться на определенном элементе, то используется параметр «ТекущееЗначение». Большим плюсом является, что в самой форме не требуется писать обработчиков для предопределенных параметров, сокращает количество кода.

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

Для передачи специфического параметра манипуляций требуется сделать немного больше:

В обработчике ПриСозданииНаСервере определить обработку данного параметра (обращение к переданным параметрам через свойство « Параметры », имеющее тип ДанныеФормыСтруктура )

  1. Описать получение формы и передать значение нового параметра в параметрах функции ПолучитьФорму.

Таким образом код будет иметь вид:

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

&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Если Параметры . Свойство ( "НовыйПараметр" ) Тогда
// здесь код обработки параметра
КонецЕсли;
КонецПроцедуры

Заключение

Возможно данная статья кому-то пригодится, с экономит время и убережет от лишнего кода. Для более детальной информации о полном списке параметров управляемой формы рекомендуется посмотреть справку «Интерфейс управляемый \ Управляемая форма».

Элемент формы - это просто поле ввода\вывода и один из реквизитов.

ATOM_MAN пишет:
Форма=ЭтотОбъект.ПолучитьФорму("ФормаЭлемента");
Форма.ЭлементыФормы.ТвойРеквизит Форма=ЭтотОбъект.ПолучитьФорму("ФормаЭлемента");
Форма.ЭлементыФормы.ТвойРеквизит Интересно, а если у меня уже открыта форма и мне не нужна новая форма ? 5. Alex_Japanese_Student 443 04.10.11 11:31 Сейчас в теме Slon1c пишет:
Интересно, а если у меня уже открыта форма и мне не нужна новая форма ? Это Имя формы. Например, в справочниках форма обычно называется ФормаЭлемента, в документах это ФормаДокумента и т.д. и т.п.

Поскольку в модуле объекта нет прямого доступа к элементам формы, необходимо передавать форму (или ее элемент) в качестве параметра. Например, если в модуле объекта есть процедура СформироватьОтчет, необходимо добавить в его спецификацию параметр ФормаОтчета и далее использовать любые ее свойства:
Процедура ОбновитьОтчет(ФормаОтчета)
ФормаОтчета.ЭлементыФормы["ИмяЭлемента"] = ЗначениеЭлемента;
КонецПроцедуры
То есть любые процедуры (например, обработчик кнопки Сформировать) должен будет передать в процедуру СформироватьОтчет ссылку на форму:
Процедура КоманднаяПанельФормыСформировать(Элемент)
СформироватьОтчет(ЭтаФорма);
КонецПроцедуры

Другим "плохим" вариантом является объявление в модуле объекта экспортной переменной ФормаОтчета, которую можно заполнить в обработчике ПередОткрытием самой формы отчета:
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
ФормаОтчета = ЭтаФорма; // Форма отчета должна быть объявлена в модуле объекта со словом Экспорт! Не в модуле формы.
КонецПроцедуры

Спасибо, помогло . Работает в таком виде.
Форма=ЭтотОбъект.ПолучитьФорму("ОсновнаяФормаОтчета");
// Форма=ЭтотОбъект.ПолучитьФорму(); // Поскольку форма одна-то работает и так..
Сообщить(Форма.ЭлементыФормы.ТекущиеДО.значение); // ТекущиеДО - название реквизита и имя этого поля
Форма.ЭлементыФормы.ТекущиеДО.значение = "йцукен";
Предупреждение ("2");
2Harver :
Спасибо, попробую обе возвожности. Учитывайте, что код
Форма=ЭтотОбъект.ПолучитьФорму("ОсновнаяФормаОтчета");
получит ИМЕННО ВАШУ форму отчета только в случае, если у формы не установлен владелец формы или ключ уникальности.
С отчетами обычно так и бывает, поэтому работать будет, но например, для форм выбора справочников, документов эта конструкция может привести к логическим ошибкам. Возможно не стоит заниматься такими задачами.
На мой взгляд необходимо изменить местонахождение процедур или добавить реквизит в отчет и подключить реквизит к элементу формы.

Соглашусь с (11) - обращение к форме из модуля объекта чаще всего указывает на некорректность решения в целом.

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

romansun пишет:
Соглашусь с (11) - обращение к форме из модуля объекта чаще всего указывает на некорректность решения в целом.

Возможно, что и так, но это не ко мне - стандартный отчет так написан.

romansun пишет:
По поводу реквизита - просто делаете реквизит, выставляете его в нужном элементе формы в свойство "Данные" и обращаетесь из модуля объекта просто по имени реквизита. Как в каком-нить документе или справочнике.
Да вот не работет оно так, не видит реквизит формы из модуля объекта.
Вверху уже написали в разных видах, что прежде нужно получить ссылку на форму, ну и так далее.
IvanSusanin пишет:
. или добавить реквизит в отчет и подключить реквизит к элементу формы.
Так что по поводу пояснения второго варианта ? Чуть подробней ?

собственно Вы немножко не поняли romansun.

я (и думаю он) имели в виду реквизит объекта а не формы, реквизит формы видимо уже существует.
1. Добавить реквизит необходимого типа в объект.
2. Установить свойство "Данные" у реквизита формы на созданный реквизит объекта.
3. Использовать добавленный реквизит объекта в запросах или изменять его значение любым доступным способом. )

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

IvanSusanin пишет:
Возможно не стоит заниматься такими задачами.
На мой взгляд необходимо изменить местонахождение процедур или добавить реквизит в отчет и подключить реквизит к элементу формы.
Вопрос не идет о разработке с нуля, а о модификации уже имеющегося отчета(скажем). Основная функция вынесена в модуль объекта, а нужно, по мере выполнения задачи, кое что изменять на форме, откуда она вызвана. ( это по поводу изменения местонахождения процедур). А вот по второй возможности - поподробней,если можно, что то не понимаю как это ?

А если форма открыта, можно и так получить её.

Форма = ссылка.ПолучитьФорму("НазваниеФормы");
Если Форма.Открыта() Тогда
.
Иначе
Форма.Открыть();
КонецЕсли;
//Не обязательно её передавать через параметр, просто получить реквизит
Форма.ЭлементыФормы.Реквизит

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