Как из модуля объекта обратиться к форме 1с
(10) Дело в том, что в контексте модуля формы реквизит Объект является типом ДанныеФормыСтруктура, такой себе облегчённый вариант для работы с объектом формы. Платформа выполняет имитацию исходных объектов с помощью ДанныхФормы, которые имитируют только структуру исходных объектов.
При этом методы исходных объектов недоступны, как и модуль объекта, так как Объект тоже имитируется через ДанныеФормы. Для того чтобы обратиться к модулю объекта или к методам исходных объектов, необходимо выполнить преобразование объекта из данных формы в исходный объект. Поэтому и нужно сделать, то что написано выше.
Данная операция может быть выполнена только на сервере. После чего с помощью метода формы РеквизитФормыВЗначение(), как показано выше или с помощью глобальной команды ДанныеФормыВЗначение() можно преобразовать ДанныеФормы в исходный объект.
(64) А что тема клиент-серверного взаимодействия управляемых форм в 1C уже неактуальна? (5)DevilOTSЯ так понял, что ты имеешь ввиду вообще с различного рода модулей объектов?
(7) Ответ неверный. Модуль объекта и так исполняется на сервере, а директивы компиляции там не действуют.
(6) Сама Процедура в модуле объекта Экспорт 'ная?
(9)Да, экспортная.Все с вариантом DevilOTS получилось. Спасибо ему за это!
А то звонил франчам, по этой проблеме, но они сами не знают как решить эту проблему. Просили если найду выход позвонить им. );
Спасибо всем за участие! Если у Вас разные объект например два документа и надо в форму одного документы вызвать процедуру из другого, то в этом случаи надо процедуру помещать в модуль менеджера и вызывать ее как документы.названиедокумента.названиепроцедура. Соответственно все вызовы на сервере. Volfreel; user1027191; YanTsys; perpleks; bird21; Insanity; + 6 – Ответить
Такой же вопрос возник по Отчету (а не по документу). Выяснил что нужно параметром указывать "Отчет".
13-ый ответ используется в типовых решениях от 1С. Думаю так правильнее делать да, а как быть если это внешняя обработка?там нет такого "поставьте компиляцию процедуры модуля объекта НаСервере." как быть?Модуль объекта (внешняя обработка):
Процедура ЗаполнитьТЧ() Экспорт
// твой код
КонецПроцедуры
Сколько читаю все советуют так а вот у меня че то не выходит. В чем ошибка помогите.
Возможна ли обратная операция? Вызвать процедуру формы из модуля документа? (24) Геннадьевич, думаю что нет. И ещё раз нет.У вас обращение к БД исполняются на сервере.
Соответственно Клиент делает запрос на Сервер и возвращает данные на клиента.
для такого дела ставят флажки в серверных модулях, где они компилируются: Сервер и ВызовСервера(Для обращения с клиентского компа)
Обратите внимание, что нет в свойствах модулей такого флага, как вызов клиента.
Поучите лекции Евгения Гилёва, даже там вам скажут что на клиенте можно использовать методы обращения на сервер, а вот с сервера вызывать метод обращения на клиент - ну никак)))) (25) Bukaska, Спасибо за развернутый ответ. Лекции обязательно посмотрю. (59)Уверены! На какой клиент должен уйти вызов с сервера? Возможен только возврат после вызова сервера с клиента. А теперь вопрос посложнее, господа эксперты: как вызвать процедуру модуля обработки из формы этой обработки из безконтекстной процедуры (чтобы не таскать на сервер всю форму)? Уверен - никак. И модуля менеджера у внешней обработки не существует. Остается только располагать процедуру в форме? Тоже некрасиво. Подскажите, как сделать красиво? (27) оказалось, что и из процедуры НаСервере в модуле формы не всегда возможно вызвать функции модуля объекта - начинает сбоить РеквизитФормыВЗначение, ошибка
Т.е., например, при переходе от ПриСозданииНаСервере, где все процедуры модуля объекта видятся, к следующей процедуре НаСервере - процедура перестает "видеть" главный свой реквизит формы Объект, и уже не находит его (ссылка есть, а найти по ней - не может).
В общем, полный мрак и внешние обработки )
Для вызова такой процедуры необходимо прежде всего иметь сам объект документа, но прикладные объекты существуют только на сервере. На клиенте их нет. Поэтому поступим следующим образом.
Выполним контекстный серверный вызов. На сервере преобразуем основной реквизит формы в прикладной объект, выполним экспортируемую функцию этого объекта и преобразуем объект обратно в основной реквизит формы.
Для внешней обработки делаю так:
1. завожу реквизит обработки "Модуль"
2. в модуле объекта определяю экспортную процедуру/функцию "Процедура ПроцЭкспорт Экспорт . "
3. в теле модуля объекта делаю присваивание: "Модуль = Объект;"
4. в модуле формы делаю вызов "Объект.Модуль.ПроцЭкспорт();"
все работает
(29) slawa, А для внешнего отчета это не работает?
В 29 написано, что делал для внеш обработки. Но у меня не получилось. Не понятно реквизит обработки "Модуль" какого типа? и п.3 не совсем понял.
Может у кого-то получилось?
Что-то с отчетом совсем печально получается. Даже если его в конфигурацию засунуть, то всё равно не работает.
С документом все прошло удачно.
Как же в отчете сделать так, что бы заработало?
Когда речь идти о ссылках (любых) - в УФ 1С всегда используется тип "Произвольный".Либо - ставить конкретный тип документов/справочников/объектов, что неприемлемо для внешних обработок. А я вам объясню сейчас, если в 1С опять не наделали вместе с явными "перебросками" РеквизитФормыВЗначение - еще и неявное обновление/чтение объекта на форме с/через помощью обращения к этому самому объекту через реквизит (а все может быть :) ).
Ведь зачем весь этот огород городить - вызывать из модуля формы функции/процедуры модуля объекта (МО)? А так мы, с помощью МО, и за отсутствием модуля менеджера (ММ) - имитируем вызов аналогичных функций из ММ.
А зачем вообще делать функции в модуле менеджера? Они позволяют работать/обращаться к с объекту из Формы, и менять данные.
Так вот, все вот эти бесконечные "РеквизитФормыВЗначение" и "ЗначениеВРеквизитФормы" - они ж не зря используются тут. Происходит чтение актуальных данных объекта, изменение через процедуру МО, а потом - загрузка измененного объекта на форму (при конвертации в реквизит формы), т.е. актуализация для формы данных объекта.
А это как раз именно, то, что и нужно - выполняется имитация функции модуля менеджера.
А вот ваш вариант - лишь получает и выполняет функции, меняя объект, а данные объекта "на форме" - не меняются в соответствии с вашими актуальными изменениями объекта, которые, вроде бы, должны последовать после вызовов и обработки объекта из модуля формы (а иначе зачем все это) - что происходит при обратном вызове "ЗначениеВРеквизитФормы".
Вы ж только один раз читаете Объект и актуализируете данные - в самом начале. И все.
Но это все верно лишь при условии - что при обращении к реквизиту, содержащему ссылку на объект, данные объекта не "обновляются" на форме.
3. в теле модуля объекта делаю присваивание: "Модуль = Объект;" Присвоение делается не в теле модуля объекта, а в модуле формы, в области автовыполнения кода (это в самом конце модуля).
Или тогда надо делать это присвоение в каждой функции, использующей реквизит "Модуль".
А для УФ в МО реквизит "Объект" формы вы не увидите никак, и, соответственно, не сможете его присвоить реквизиту обработки "Модуль" ) выглядят убого, они не могли автоматически неявно транслировать код между клиентом и сервером? Slypower; Stivens; zhivoglot; adhocprog; nnn123; Gendelf; Gang031; egorcheg1; COMPER; mad375; uri1978; ---Oleg---; softgarant; An-Aleksey; pavlo; alk; + 16 – Ответить у меня тоже в модуле не видит из формы !
Уже вторые сутки ничего не могу сделать.
1С:Предприятие 8.3 (8.3.6.2152) платформа
УПП 1.3 то что вы пишете - не работает там вообще нет управляемых форм ! как быть ? Вопрос: а как обновить форму УФ из модуля объекта?
Также РеквизитФормыВЗначение() использовать, а в процеддуре формы метод Прочитать() ?? (39) Всё, что находится в модуле объекта, относится к серверу. Форму на сервере вы не обновите. (40) а надо. И форму с сервера обновить, и данные достать, которые безответственно выдавили на сервер.
А так - это вообще ни-о-чем, а не программирование.
Добрый день.
Подскажите пожалуйста, такой же вопрос:
во внешней обработке хочу вызвать экспортную процедуру с параметрами Автозаполнение(ПостроительЗапроса = Неопределено,ТабЛС = Неопределено)
из модуля формы документа КУ_НачислениеКоммунальныхУслуг.
Документы новые, только создаются. Табличная часть- заполняется с помощью процедуры Автозаполнение.
Док=Документы.КУ_НачислениеКоммунальныхУслуг.СоздатьДокумент();
ОбъектНачислениеКомУслуг =ДанныеФормыВЗначение(Док,Тип("ДокументОбъект.КУ_НачислениеКоммунальныхУслуг"));
ОбъектНачислениеКомУслуг.Автозаполнение(ПараметрыОтбораЛицевыхСчетов,ЗаполнитьСписком);
ЗначениеВДанныеФормы(ОбъектНачислениеКомУслуг,Док);
Пока Выборка.СледующийПоЗначениюПоля("Здание") Цикл
и как мне дальше обратиться к полученным значения этой процедуры и записать в тч документа?
строкаТч = Док.ВидыНачислений.Добавить();//
СтрокаТЧ.ЛицевойСчет = ?
строкаТч.помещение = ?
СтрокаТЧ.ВидУслуги = ?
Благодарю за помощь :)
Пока Выборка.СледующийПоЗначениюПоля("Здание") Цикл
и как мне дальше обратиться к полученным значения этой процедуры и записать в тч документа?
Что-то не понял ваши намерений. Если у вас в модуле объекта всё заполняется, что вы собираетесь еще на форме заполнять?
И где у вас инициализируется переменная Выборка? Что-то не увидел.
хочу создать программно документы с помощью внешнего отчета.
данные выбираются с помощью запроса во внешнем отчете (выборка- это результат запроса, какие именно создавать документы), а документы хочу заполнить, вызвав из модуля формы документа процедуру. Просто скопировать процедуру в обработку- не вариант, так как частенько меняется алгоритм заполнения документов.
Эти документы бухгалтер создает ежемесячно, поэтому решила немного оптимизировать + разобраться:)
До этого создавала программно документы с помощью отчета, но к сожалению никогда не сталкивалась с вопросом вызова процедуры с параметрами из документа конфигурации. :(
Модуль объекта есть почти у всех основных прикладных объектов конфигурации в 1С.
Также модуль объекта можно открыть из контекстного меню объекта:
Или из меню Действия:
Модуль объекта выполняется при создании объекта. В нем можно объявлять переменные модуля. Экспортные процедуры и функции можно вызывать у созданных программных объектов. К экспортным переменным можно обращаться как к свойствам программных объектов. В модуле есть прямой доступ к реквизитам и табличным частям объекта.
Вызов методов модуля объекта
В модуле объекта напишем следующий код:
Теперь создадим обработку с одной формой и в модуле обработки в событии ПриСозданииНаСервере напишем следующий код:
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //заполняем экспортную переменную модуля объекта вызвав экспортную функцию ОбъектНоменклатура . ОбщийОстаток = ОбъектНоменклатура . ОбщийОстаток ( ) ;Здесь мы сначала создаем новый программный объект справочника Номенклатура вызвав встроенный метод Справочники.Номенклатура.СоздатьЭлемент(). Потом через ссылку на этот объект обращаемся к экспортным переменной и функции объекта.
Теперь поменяем код в модуле формы обработки на следующий:
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //пытаемся заполнить переменную модуля объекта вызвав функцию модуля объекта ОбъектНоменклатура . ПолноеНаименование = ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименование ) ; //ошибкаЗдесь мы делаем все то же самое, но обращаемся к не экспортным переменной и функции.
Так как переменная ПолноеНаименование не является экспортной, то к ней нет доступа из других модулей.
Теперь попробуем обратиться к не экспортной функции модуля объекта. Вставим в модуль формы следующий код и откроем обработку:
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ) ; //опять ошибка
Теперь вставим в форму обработки такой код и откроем обработку:
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ;Здесь мы вызываем экспорную процедуру модуля объекта, а потом встроенным методом Записать записываем объект в базу данных.
В результате в базе данных будет создан новый элемент, у которого заполнен артикул и добавлены 2 строки в табличную часть:
В методе ЗаполнитьРеквизиты() мы обращались напрямую к реквизитам объекта, после чего записали его методом Записать(). Значения реквизитов сохранились в базе данных.
Обработчики событий
В результате откроется список возможных событий:
Рассмотрим основные события модуля объекта:
Для примера создадим в модуле объекта 3 обработчика события и вставим в них следующий код:
Откроется конструктор формы. В нем можно выбрать тип формы, указать имя и синоним:
Добавим в модуль формы код:
Директивы компиляции
Для того чтобы определить где будет выполняться процедура или функция модуля формы можно использовать директивы компиляции:
- &НаКлиенте
- &НаСервере
- &НаСервереБезКонтекста
- &НаКлиентеНаСервереБезКонтекста
Что такое контекст будет рассмотрено позже, пока можно сказать, что это доступность реквизитов, элементов и параметров формы.
Добавим в модуль формы две процедуры:
С помощью директив компиляции вверху процедуры мы указали где они будут скомпилированы. Клиентские процедуры недоступны на сервере. Серверные процедуры можно вызывать с клиента. Если директива компиляции не указана, то по умолчанию используется &НаСервере.
Для переменных модуля тоже можно использовать директивы компиляции:
При этом нужно учитывать, что серверная переменная формы будет инициализироваться при каждом вызове сервера. То есть если мы вызовем с клиента серверную процедуру, в ней изменим серверную переменную, то при следующем серверном вызове значение переменной будет инициализироваться заново, предыдущее значение будет потеряно.
Обработчики событий модуля формы
В модуле формы тоже есть события, для которых можно создавать обработчики:
У обработчиков событий формы нельзя изменить директиву компиляции. Часть из них доступны на клиенте, часть на сервере.
Рассмотрим основные из них:
Для примера добавим в модуль формы 2 обработки событий: ПриСозданииНаСервере и ПередЗакрытием и добавим туда следующий код:
Читайте также: