|
v7: Дождаться результата программного нажатия на кнопку формы документа и закрыть документ | ☑ | ||
---|---|---|---|---|
0
АМ2020
19.10.20
✎
16:20
|
Добрый вечер, подскажите пжл, а то голову уже сломал
В цикле создаю и заполняю доки. После создания и заполнения дока открываю его, хочу нажать программно кнопку на его форме, дождаться обработки нажатия (создается элемент справочника и соответственно изменяется поле ввода на форме дока), а потом также программного его закрыть Если делаю так // Создание и заполнение шапки и ТЧ дока ДокУведомлениеМДЛП.Записать(); Конт=""; ОткрытьФорму(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); WshShell = СоздатьОбъект("WScript.Shell"); WshShell.SendKeys("{F12}"); Конт.Форма.Закрыть(); То не обрабатывается нажатия кнопки на форме - так она закрывается до того, как выполнится обработчик нажатия кнопки То есть не создается элемент справочника и соответственно не изменяется поле ввода на форме дока А если делаю так: ДокУведомлениеМДЛП.Записать(); ОткрытьФорму(ДокУведомлениеМДЛП.ТекущийДокумент()); WshShell = СоздатьОбъект("WScript.Shell"); WshShell.SendKeys("{F12}"); Тоже не отрабатывает, так как пока обработчик нажатия кнопки на форме первого дока еще не выполнился, уже создается второй док и открывается его форма Работает только так ДокУведомлениеМДЛП.Записать(); ОткрытьФорму(ДокУведомлениеМДЛП.ТекущийДокумент()); WshShell = СоздатьОбъект("WScript.Shell"); WshShell.SendKeys("{F12}"); ДокУведомлениеМДЛП.Записать(); В таком случае естестественно вываливатся ошибка: ДокУведомлениеМДЛП.Записать(); {Журнал.Маркировка.Форма.ФормаСписка.Модуль(314)}: Объект заблокирован: Уведомление МДЛП 000000000187 И цикл стопорится после первого же документа. Но в таком случае хотя бы выполняется обработчик нажатия кнопки - создается нужный мне элемент справочника и соответственно изменяется поле ввода на форме дока Программный вызов события кнопки (которое прописано на вкладке Дополнителеьно в поле Формула) без открытия самой формы документа и эмуляции нажатия кнопки ДокУведомлениеМДЛП.СоздатьСообщениеПротоколаКОтправке(); ДокУведомлениеМДЛП.Записать(); также ничего не дает - вываливается ошибка что не найдено такой агрегатной функции или что-то в этом роде Подскажите пожалуйста, как решить эту проблему! |
|||
1
Ёпрст
19.10.20
✎
16:27
|
(0)
1.не открывать форму 2. не посылать сендкей |
|||
2
АМ2020
19.10.20
✎
16:28
|
Ну да, я понимаю прекрасно что по уму не надо открывать и закрывать форму документа, а надо просто выполнить обработчик нажатия кнопки - с этого и начинал - но почему то не работает этот вариант вообще:
ДокУведомлениеМДЛП.СоздатьСообщениеПротоколаКОтправке(); {Журнал.Маркировка.Форма.ФормаСписка.Модуль(308)}: Поле агрегатного объекта не обнаружено (СоздатьСообщениеПротоколаКОтправке) |
|||
3
big
19.10.20
✎
16:34
|
Вариант 1. Создавать нужные элементы справочника так же программно, как и сам документ. То есть безо всяких открытий формы. Таким же образом "продублировать" процедуру СоздатьСообщениеПротоколаКОтправке().
Вариант 2. Загрузить внешнюю компоненту 1cpp.dll и тогда станут доступны методы документа "через точку". То есть ДокУведомлениеМДЛП.СоздатьСообщениеПротоколаКОтправке() уже не вызовет ошибки. |
|||
4
АМ2020
19.10.20
✎
16:42
|
(3) Благодарю за подсказку.
Вариант 1 не очень - так как надо будет много чего переписывать Вариант 2 не срабатывает ЗагрузитьВнешнююКомпоненту("1cpp.dll") - есть, даже дважды - один раз в глобальном модуле, второй раз прям перед ДокУведомлениеМДЛП.СоздатьСообщениеПротоколаКОтправке() вызвал, все равно та же ошибка Может как то по другому надо грузить? |
|||
5
Ёпрст
19.10.20
✎
16:50
|
у формекса есть метод выпольнитьпроцедуру
|
|||
6
Kigo_Kigo
19.10.20
✎
16:55
|
А модально пробовал?
|
|||
7
Kigo_Kigo
19.10.20
✎
16:58
|
Есть подозрение, что фокус при простом открытии из обработки не передается в документ, по этому WshShell = СоздатьОбъект("WScript.Shell");
WshShell.SendKeys("{F12}"); отрабатывается в обработке попробей в документ отправить параметром ("выполнитьНажатие"), сделай процедуру и при открытии анализируй если Форма.Параметр() = "выполнитьНажатие" тогда Процедура выполнитьНажатие() WshShell = СоздатьОбъект("WScript.Shell"); WshShell.SendKeys("{F12}"); |
|||
8
big
19.10.20
✎
16:59
|
(4) Эххх... Что-то я запамятовал как там что конкретно делается... (((
|
|||
9
Kigo_Kigo
19.10.20
✎
16:59
|
Уже в самом документе, а модальное открытие заставвит основную процедуру обработки дождаться выполнение и закрытие формы
|
|||
10
Kigo_Kigo
19.10.20
✎
17:05
|
да и уже не нужно будет" WshShell = СоздатьОбъект("WScript.Shell");
WshShell.SendKeys("{F12}");", при открытии Если = выполнитьНажатие , тогда ПроцедураТоЧтоНамнадо() Записать() Форма.Закрыть(); и поехали дальше |
|||
11
Sserj
19.10.20
✎
17:06
|
ДокУведомлениеМДЛП.Записать();
Конт="СоздатьСообщениеПротоколаКОтправке_Закрыть"; ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); В форме документа: Процедура ПриОткрытии() ... Если Форма.Параметр = "СоздатьСообщениеПротоколаКОтправке_Закрыт" Тогда СтатусВозврата(0); СоздатьСообщениеПротоколаКОтправке(); Записать(); Возврат; КонецЕсли; КонецПроцедуры |
|||
12
Ёпрст
19.10.20
✎
17:24
|
(11) еще и код дока менять ради такой ерунды ?
|
|||
13
АМ2020
19.10.20
✎
17:31
|
Сработало по методу Sserj
Конт="СоздатьСообщениеПротоколаКОтправке_Закрыт"; ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); WshShell = СоздатьОбъект("WScript.Shell"); WshShell.SendKeys("{F12}"); + Процедура ПриОткрытии() ... Если Форма.Параметр = "СоздатьСообщениеПротоколаКОтправке_Закрыт" Тогда СтатусВозврата(0); СоздатьСообщениеПротоколаКОтправке(); Записать(); Возврат; КонецЕсли; КонецПроцедуры Дальше разбираться - как правильнее, нет времени, задачи горят, всем спасибо! |
|||
14
Sserj
19.10.20
✎
17:33
|
(13) А зачем тебе еще и сендкеи слать?
WshShell = СоздатьОбъект("WScript.Shell"); WshShell.SendKeys("{F12}"); Это уже совершенно не нужно, форма документа же теперь не открывается. |
|||
15
АМ2020
19.10.20
✎
17:34
|
Без них почему то не срабатывает 0-:
|
|||
16
Sserj
19.10.20
✎
17:40
|
(15) Надеюсь ты после открытия формы удалили повторную запись?
Конт="СоздатьСообщениеПротоколаКОтправке_Закрыт"; ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); .... ДокУведомлениеМДЛП.Записать(); - вот такого после открытия ни в коем случае не должно быть. ДокУведомлениеМДЛП уже станет не валидным как где-то в другом месте выполнится запись объекта с такой ссылкой. А она и выполнится при вызове ОткрытьФормуМодально(.... Если нужно что-то еще делать с этим объектом то после открытия и записи нужно перечитать объект: ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); ДокУведомлениеМДЛП.НайтиДокумент(ДокУведомлениеМДЛП.ТекущийДокумент()); Теперь он опять валидный и можно опять его изменять и записывать. |
|||
17
АМ2020
19.10.20
✎
17:42
|
Sserj, да, ДокУведомлениеМДЛП.Записать() оставил только до открытия формы, благодарю за помощь!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |