Управляемые формы. Как программно выполнить процедуры и обработ. событий формы?
Здравствуйте Уважаемые коллеги. Столкнулся с задачей выполнить процедуру управляемой формы, но что-то как-то не получается.
Коротко: в УТ11 создается программно элементы справочника вид цен. И все бы хорошо, только вот этот вид цен работать не будет до тех пор, пока элемент не откроешь в программе вручную, а затем нажмешь «Записать и закрыть».
Объекты создаются на сервере.
Проверял в отладчике, события формы элемента естественно не выполняются(при создании и записи).
Пробывал создовать объекты на сервере, затем по ссылке открывать формы на клиенте, все равно обработчики событий не срабатывают!
&НаКлиенте
Процедура ЗагрузитьНаКлиенте()
Для Каждого Строка Из МассивСсылок Цикл
ПараметрыОткрытия = Новый Структура(«Ключ», Строка);
ФормаОбъекта = ПолучитьФорму(«Справочник.ВидыЦен.Форма.ФормаЭлемента», ПараметрыОткрытия);
ФормаОбъекта.Открыть();
//ОЗ = ДанныеФормыВЗначение(Объект, Тип(«Справочник.ВидыЦен.Форма.ФормаЭлемента»));
ЭтаФорма.ОбновитьОтображениеДанных();
ФормаОбъекта.Закрыть();
На сервере создаются так:
&НаСервере
Процедура СоздатьВидЦен(КоллекцияАтрибутов, БазовыйВидЦен = Неопределено)
НовыйВидЦен.Заполнить(Неопределено);
НовыйВидЦен.Наименование = КоллекцияАтрибутов.ПолучитьИменованныйЭлемент(«Наименование»).Значение;
// недопустимо пустое наименование
Если Не ЗначениеЗаполнено(НовыйВидЦен.Наименование) Тогда
НовыйВидЦен.Наименование = Новый УникальныйИдентификатор();
КонецЕсли;
// не допустимы не уникальные идентификаторо относительно всех видов цен
Запрос = Новый Запрос;
Запрос.УстановитьПараметр(«Идентификатор», НовыйВидЦен.Идентификатор);
Запрос.Текст = «ВЫБРАТЬ
| ВидыЦен.Ссылка
|ИЗ
| Справочник.ВидыЦен КАК ВидыЦен
|ГДЕ
| ВидыЦен.Идентификатор = &Идентификатор»;
РезультатВыполнения = Запрос.Выполнить();
Если Не РезультатВыполнения.Пустой() Тогда
НовоеНаименование = НовыйВидЦен.Наименование + «_» + Новый УникальныйИдентификатор();
Если КоллекцияАтрибутов.ПолучитьИменованныйЭлемент(«ЦенаВключаетНДС»).Значение = «1» Тогда
НовыйВидЦен.ЦенаВключаетНДС = Истина;
КонецЕсли;
НовыйВидЦен.ИспользоватьПриПродаже = Истина;
НовыйВидЦен.ИспользоватьПриПередачеМеждуОрганизациями = Истина;
// проверим, если валюту не нашли отменяем создание вида цены
Если Не ЗначениеЗаполнено(НовыйВидЦен.ВалютаЦены) Тогда
Сообщить («Не удалось создать вид цен: » + НовыйВидЦен.Наименование + «. Причина: не найдена валюта цены с кодом: [» + КоллекцияАтрибутов.ПолучитьИменованныйЭлемент(«Валюта»).Значение + «]»);
Возврат;
КонецЕсли;
// Определимся, вдруг расчитывается на основании базовой цены
Если ЗначениеЗаполнено(БазовыйВидЦен) Тогда
НовыйВидЦен.СпособЗаданияЦены = Перечисления.СпособыЗаданияЦен.РассчитыватьПоДругимВидамЦен;
ПроцентнаяСтавка = КоллекцияАтрибутов.ПолучитьИменованныйЭлемент(«Процент»).Значение;
Если Число(ПроцентнаяСтавка) >= 0 Тогда
НовыйВидЦен.АлгоритмРасчетаЦены = «[» + БазовыйВидЦен.Идентификатор + «] * ((100 + » + Строка(ПроцентнаяСтавка) + «) / 100)»;
Иначе
НовыйВидЦен.АлгоритмРасчетаЦены = «[» + БазовыйВидЦен.Идентификатор + «] * ((100 » + Строка(ПроцентнаяСтавка) + «) / 100)»;
КонецЕсли;
Иначе
НовыйВидЦен.СпособЗаданияЦены = Перечисления.СпособыЗаданияЦен.Вручную;
КонецЕсли;
Вообще это все пишется для обработки переноса данных из писаной-переписанной семерки в УТ11. Так сказать, одноразовая обработка, лишь бы перебросить данные ))))
Вопрос: как программно эмулировать открытие формы и нажатие кнопки «Записать и закрыть» в управляемом приложении, так что бы выполнились все стандартные обработчики соответствующих событий формы? Желательно, что бы пользователь не наблюдал открытия и закрытия формы, но необязательно.
Вызов процедуры модуля формы
Здравствуйте. Заранее спасибо. Программно создается новый документ
НовДок = Документы. СоздатьДокумент();
.
НовДок.Записать(РежимЗаписиДокументов.Проведение);
И вот здесь необходимо вызвать процедуру модуля формы этого документа. Можно ли это сделать вообще?
Если стоит формекс, то можно поступить вот так:
оСистема = СоздатьОбъект(«Система»);
Д = СоздатьОбъект(«Документ.ГТД»);
Пока Запрос.Группировка(1) = 1 Цикл
Д.НайтиДокумент(Запрос.ГТД);
ОткрытьФорму(Д.ТекущийДокумент(), Конт,0);
Конт.СуммаПеревозка = 0;
Сп = СоздатьОбъект(«СписокЗначений»);
Сп.ДобавитьЗначение(2);
Сервис.ВыполнитьПроцедуру(Конт, «ИзмСуммаУслуг», Сп);
оСистема.StartBatch(Конт);
Конт.Провести();
оСистема.EndBatch(Конт);
оСистема.ЗакрытьФорму(Конт);
КонецЦикла;
Если стоит формекс, то можно поступить вот так:
оСистема = СоздатьОбъект(«Система»);
Д = СоздатьОбъект(«Документ.ГТД»);
Пока Запрос.Группировка(1) = 1 Цикл
Д.НайтиДокумент(Запрос.ГТД);
ОткрытьФорму(Д.ТекущийДокумент(), Конт,0);
Конт.СуммаПеревозка = 0;
Сп = СоздатьОбъект(«СписокЗначений»);
Сп.ДобавитьЗначение(2);
Сервис.ВыполнитьПроцедуру(Конт, «ИзмСуммаУслуг», Сп);
оСистема.StartBatch(Конт);
Конт.Провести();
оСистема.EndBatch(Конт);
оСистема.ЗакрытьФорму(Конт);
КонецЦикла;
попробуйте после записи документа:
Однако, можно поступить как описано в (10) и (14), главное чтобы в самой процедуре не было обращения к элементам формы и т.п.
(15) главное чтобы в самой процедуре не было обращения к элементам формы и т.п.
интерес продолжился :), и я засунул код по созданию документа в обработку:
В документе в модуле формы пишу:
В итоге, выполняя обработку, получаю сообщения:
Номер из документа:000000007
Дата из документа: 20.01.2012 20:27:16
Дата из обработки: 20.01.2012 20:27:16
Как выполнить экспортируемую процедуру объекта, находясь в его форме?
Задача, которую будем рассматривать, заключается в вызове экспортируемой процедуры документа. Например, документ имеет процедуру, которая позволяет пересчитать все цены, содержащиеся в табличной части документа, и применить к ним скидку в 10 %. Нужно вызвать эту процедуру, находясь в форме документа.
Для вызова такой процедуры необходимо прежде всего иметь сам объект документа, но прикладные объекты существуют только на сервере. На клиенте их нет. Поэтому поступим следующим образом.
Выполним контекстный серверный вызов. На сервере преобразуем основной реквизит формы в прикладной объект, выполним экспортируемую функцию этого объекта и преобразуем объект обратно в основной реквизит формы.
В результате выполненные на сервере изменения данных формы будут автоматически переданы на клиента, когда на него вернется выполнение программного кода.
Например, локальная команда формы, вызывающая серверную процедуру, будет выглядеть следующим образом:
Контекстная серверная функция ПересчитатьЦеныНаСервере() будет выглядеть следующим образом:
Когда выполнение всех серверных процедур, которые мы вызвали, будет закончено, контекст формы на сервере будет собран, отправлен на клиента и там автоматически обновлен. В результате мы увидим в открытом документе на клиенте уже новые цены в табличной части документа.
v8. Выполнить процедуру из формы документа, вызвав её из модуля документа
|