В модуле объекта, в управляемой форме, есть процедура, которую мне необходимо использовать в модуле форме. Но вызвать ее никак не получается. Можно, конечно, скопировать ее в модуль формы, но ... зачем ..., если она есть в модуле объекта. При вызове пишет что "..нет такой процедуры или функции".
(10) Дело в том, что в контексте модуля формы реквизит Объект является типом ДанныеФормыСтруктура, такой себе облегчённый вариант для работы с объектом формы. Платформа выполняет имитацию исходных объектов с помощью ДанныхФормы, которые имитируют только структуру исходных объектов.
При этом методы исходных объектов недоступны, как и модуль объекта, так как Объект тоже имитируется через ДанныеФормы. Для того чтобы обратиться к модулю объекта или к методам исходных объектов, необходимо выполнить преобразование объекта из данных формы в исходный объект. Поэтому и нужно сделать, то что написано выше.
Данная операция может быть выполнена только на сервере. После чего с помощью метода формы РеквизитФормыВЗначение(), как показано выше или с помощью глобальной команды ДанныеФормыВЗначение() можно преобразовать ДанныеФормы в исходный объект.
(9)Да, экспортная.
Все с вариантом DevilOTS получилось. Спасибо ему за это!
А то звонил франчам, по этой проблеме, но они сами не знают как решить эту проблему. Просили если найду выход позвонить им. );
Спасибо всем за участие!
Если у Вас разные объект например два документа и надо в форму одного документы вызвать процедуру из другого, то в этом случаи надо процедуру помещать в модуль менеджера и вызывать ее как документы.названиедокумента.названиепроцедура. Соответственно все вызовы на сервере.
(24) Геннадьевич, думаю что нет!!! И ещё раз нет!!!
У вас обращение к БД исполняются на сервере.
Соответственно Клиент делает запрос на Сервер и возвращает данные на клиента.
для такого дела ставят флажки в серверных модулях, где они компилируются: Сервер и ВызовСервера(Для обращения с клиентского компа)
Обратите внимание, что нет в свойствах модулей такого флага, как вызов клиента.
Поучите лекции Евгения Гилёва, даже там вам скажут что на клиенте можно использовать методы обращения на сервер, а вот с сервера вызывать метод обращения на клиент - ну никак))))
А теперь вопрос посложнее, господа эксперты: как вызвать процедуру модуля обработки из формы этой обработки из безконтекстной процедуры (чтобы не таскать на сервер всю форму)? Уверен - никак. И модуля менеджера у внешней обработки не существует. Остается только располагать процедуру в форме? Тоже некрасиво. Подскажите, как сделать красиво?
(27) оказалось, что и из процедуры НаСервере в модуле формы не всегда возможно вызвать функции модуля объекта - начинает сбоить РеквизитФормыВЗначение, ошибка
"Ошибка при вызове метода контекста (РеквизитФормыВЗначение)
ОбъектНаСервере = РеквизитФормыВЗначение("Объект");
по причине:
Тип не определен ''512175c6-8746-4aab-865b-1560c0f52421''".
Т.е., например, при переходе от ПриСозданииНаСервере, где все процедуры модуля объекта видятся, к следующей процедуре НаСервере - процедура перестает "видеть" главный свой реквизит формы Объект, и уже не находит его (ссылка есть, а найти по ней - не может).
В общем, полный мрак и внешние обработки )
Для вызова такой процедуры необходимо прежде всего иметь сам объект документа, но прикладные объекты существуют только на сервере. На клиенте их нет. Поэтому поступим следующим образом.
Выполним контекстный серверный вызов. На сервере преобразуем основной реквизит формы в прикладной объект, выполним экспортируемую функцию этого объекта и преобразуем объект обратно в основной реквизит формы.
Для внешней обработки делаю так:
1. завожу реквизит обработки "Модуль"
2. в модуле объекта определяю экспортную процедуру/функцию "Процедура ПроцЭкспорт Экспорт ..."
3. в теле модуля объекта делаю присваивание: "Модуль = Объект;"
4. в модуле формы делаю вызов "Объект.Модуль.ПроцЭкспорт();"
все работает
(29) slawa, А для внешнего отчета это не работает?
В 29 написано, что делал для внеш обработки. Но у меня не получилось. Не понятно реквизит обработки "Модуль" какого типа? и п.3 не совсем понял.
Может у кого-то получилось?
Что-то с отчетом совсем печально получается. Даже если его в конфигурацию засунуть, то всё равно не работает.
С документом все прошло удачно.
Как же в отчете сделать так, что бы заработало?
Все работает и во внешнем тоже - не заметил директиву #Если Клиент.
Не понятно реквизит обработки "Модуль" какого типа?
Когда речь идти о ссылках (любых) - в УФ 1С всегда используется тип "Произвольный".
Либо - ставить конкретный тип документов/справочников/объектов, что неприемлемо для внешних обработок.
А я вам объясню сейчас, если в 1С опять не наделали вместе с явными "перебросками" РеквизитФормыВЗначение - еще и неявное обновление/чтение объекта на форме с/через помощью обращения к этому самому объекту через реквизит (а все может быть :) ).
Ведь зачем весь этот огород городить - вызывать из модуля формы функции/процедуры модуля объекта (МО)? А так мы, с помощью МО, и за отсутствием модуля менеджера (ММ) - имитируем вызов аналогичных функций из ММ.
А зачем вообще делать функции в модуле менеджера? Они позволяют работать/обращаться к с объекту из Формы, и менять данные.
Так вот, все вот эти бесконечные "РеквизитФормыВЗначение" и "ЗначениеВРеквизитФормы" - они ж не зря используются тут. Происходит чтение актуальных данных объекта, изменение через процедуру МО, а потом - загрузка измененного объекта на форму (при конвертации в реквизит формы), т.е. актуализация для формы данных объекта.
А это как раз именно, то, что и нужно - выполняется имитация функции модуля менеджера.
А вот ваш вариант - лишь получает и выполняет функции, меняя объект, а данные объекта "на форме" - не меняются в соответствии с вашими актуальными изменениями объекта, которые, вроде бы, должны последовать после вызовов и обработки объекта из модуля формы (а иначе зачем все это) - что происходит при обратном вызове "ЗначениеВРеквизитФормы".
Вы ж только один раз читаете Объект и актуализируете данные - в самом начале. И все.
Но это все верно лишь при условии - что при обращении к реквизиту, содержащему ссылку на объект, данные объекта не "обновляются" на форме.
3. в теле модуля объекта делаю присваивание: "Модуль = Объект;"
Присвоение делается не в теле модуля объекта, а в модуле формы, в области автовыполнения кода (это в самом конце модуля).
Или тогда надо делать это присвоение в каждой функции, использующей реквизит "Модуль".
А для УФ в МО реквизит "Объект" формы вы не увидите никак, и, соответственно, не сможете его присвоить реквизиту обработки "Модуль" )
у меня тоже в модуле не видит из формы !
Уже вторые сутки ничего не могу сделать.
1С:Предприятие 8.3 (8.3.6.2152) платформа
УПП 1.3 то что вы пишете - не работает там вообще нет управляемых форм ! как быть ?
(40) а надо. И форму с сервера обновить, и данные достать, которые безответственно выдавили на сервер.
А так - это вообще ни-о-чем, а не программирование.
Добрый день.
Подскажите пожалуйста, такой же вопрос:
во внешней обработке хочу вызвать экспортную процедуру с параметрами Автозаполнение(ПостроительЗапроса = Неопределено,ТабЛС = Неопределено)
из модуля формы документа КУ_НачислениеКоммунальныхУслуг.
Документы новые, только создаются. Табличная часть- заполняется с помощью процедуры Автозаполнение.
Док=Документы.КУ_НачислениеКоммунальныхУслуг.СоздатьДокумент();
Пока Выборка.СледующийПоЗначениюПоля("Здание") Цикл
и как мне дальше обратиться к полученным значения этой процедуры и записать в тч документа?
строкаТч = Док.ВидыНачислений.Добавить();//
СтрокаТЧ.ЛицевойСчет = ?
строкаТч.помещение = ?
СтрокаТЧ.ВидУслуги = ?
Пока Выборка.СледующийПоЗначениюПоля("Здание") Цикл
и как мне дальше обратиться к полученным значения этой процедуры и записать в тч документа?
Что-то не понял ваши намерений. Если у вас в модуле объекта всё заполняется, что вы собираетесь еще на форме заполнять?
И где у вас инициализируется переменная Выборка? Что-то не увидел...
хочу создать программно документы с помощью внешнего отчета.
данные выбираются с помощью запроса во внешнем отчете (выборка- это результат запроса, какие именно создавать документы), а документы хочу заполнить, вызвав из модуля формы документа процедуру. Просто скопировать процедуру в обработку- не вариант, так как частенько меняется алгоритм заполнения документов.
Эти документы бухгалтер создает ежемесячно, поэтому решила немного оптимизировать + разобраться:)
До этого создавала программно документы с помощью отчета, но к сожалению никогда не сталкивалась с вопросом вызова процедуры с параметрами из документа конфигурации. :(
(44) Новичок1с, у вас есть внешняя обработка как я понял, и вы программно создаете документы. Вы процедуру модуля документа пытаетесь вызвать из формы обработки?
Это нужно если вы обращаетесь к экспортной процедуре объекта из формы самого этого объекта. Например, на форме документа у вас есть реквизит "Объект" - вы его конвертируете в настоящий ДокументОбъект, вызываете через менеджер этого объекта экспортную процедуру, она меняет объект, и вы загружаете измененный объект на форму, конвертируя в реквизит формы. В вашем случае это не нужно, по моему.
Помещать процедуру в модуль менеджера это неправильный вариант так как данная процедура типовая
Чаще происходит ровно наоборот - ссылаешься на процедуру в конфе, а она несколько раз уже поменялась, в результате - одни ошибки.
Для внешней обработки пусть уж лучше будет отдельно, но рабочая.