1с запустить процедуру формы документа

Управляемые формы. Как программно выполнить процедуры и обработ. событий формы?

Здравствуйте Уважаемые коллеги. Столкнулся с задачей выполнить процедуру управляемой формы, но что-то как-то не получается.
Коротко: в УТ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 %. Нужно вызвать эту процедуру, находясь в форме документа.

image001

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

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

image002

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

Например, локальная команда формы, вызывающая серверную процедуру, будет выглядеть следующим образом:

Контекстная серверная функция ПересчитатьЦеныНаСервере() будет выглядеть следующим образом:

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

Источник

v8. Выполнить процедуру из формы документа, вызвав её из модуля документа

snfr1c 12.11.2010 14:51
Прочитано: 31097
00
snfr1c 12.11.2010 14:51
Прочитано: 31097
00
Здравствуйте!
Подскажите, как выполнить процедуру или функцию из формы документа, вызвав её из модуля этого же документа?
Процедура в форме, например ПриИзмененииКонтрагента() Экспорт
при попытке выполнения ЭтотОбъект.ПриИзмененииКонтрагента() выдаётся ошибка «Метод не обнаружен»
Yandex
Возможно, вас также заинтересует
rekl150103
snfr1c 12.11.2010 15:18
Ответ № 1
00
Поясню. Обратится можно
Согласно 1С: «Можно ли обращаться к переменным, процедурам и функциям модуля снаружи объекта?

В 1С:Предприятии 8 любая переменная, процедура и функция модуля объекта (документа, справочника, обработки, формы и т.д.) может быть объявлена как экспортируемая. Для этого достаточно в ее объявлении указать слово Экспорт.

Например:
Код 1C v 8.х
После этого к таким переменным, процедурам и функциям можно обращаться так же, как и к системным свойствам и методам объектов.

Источник

Запуск процедуры формы из расширения.

Здравствуйте! В ЗУП 3.1 Возникла необходимость пересчитать документы «Разовое начисление» списком. Для этого создал расширение, в расширение добавил форму списка документа «Разовое начисление», в эту форму добавил команду «Пересчитать». В модуле формы вставил код;
&НаКлиенте
Процедура Расш1_ПересчитатьПосле(Команда)
МассивВыделенныхДокументов = Элементы.Список.ВыделенныеСтроки;
Для Каждого ЭлМасДок из МассивВыделенныхДокументов Цикл

ФормаДокумента = ПолучитьФорму(«Документ.РазовоеНачисление.Форма.ФормаДокумента», Новый Структура(«Ключ»,ЭлМасДок), ЭтаФорма);
ИмяТаблицы = «Начисления»;
ВедущееПоле = «Сотрудник»;
ТипВедущегоПоля = Тип(«СправочникСсылка.Сотрудники»);
ФормаДокумента.ПересчитатьДокументНаКлиенте();
ФормаДокумента.Записать();

Элементы.Список.Обновить();
ЭтаФорма.ОбновитьОтображениеДанных();
КонецПроцедуры

При этом придется расширением сделать несколько перехватов чтобы научить. А иначе никак. Либо Экспорт процедуры. Либо то что тебе надо выноси на расширение например в модуль менеджера весь механизм процедуры из формы.

Либо делай ОткрытьФорму, а в расширении формы добавить

Проверяешь если параметр твой вызываешь процедуру пересчета, записываешь текущий документ если такое необходимо по алгоритму я ж не знаю что там у тебя и закрываешь документ

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

Добавить ключевой параметр формы БылПерерасчетПриОткрытии (Булеов) если асинхроники есть то придется в расширении делать методы После где и указывать, что твоя процедура закончила работу и установить значение параметра БылПерерасчетПриОткрытии и вызвать метод Записи объекта и последующего его закрытия

Источник

Понравилась статья? Поделить с друзьями:
Добавить комментарий
  • Как сделать успешный бизнес на ритуальных услугах
  • Выездной кейтеринг в России
  • Риски бизнеса: без чего не обойтись на пути к успеху
  • 1с запустить приложение асинхронно
  • 1с запустить команду формы программно