Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Дождаться результата программного нажатия на кнопку формы документа и закрыть документ

v7: Дождаться результата программного нажатия на кнопку формы документа и закрыть документ
Я
   АМ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. не посылать сендкей
   АМ2020
 
2 - 19.10.20 - 16:28
Ну да, я понимаю прекрасно что по уму не надо открывать и закрывать форму документа, а надо просто выполнить обработчик нажатия кнопки - с этого и начинал - но почему то не работает этот вариант вообще:
ДокУведомлениеМДЛП.СоздатьСообщениеПротоколаКОтправке();
{Журнал.Маркировка.Форма.ФормаСписка.Модуль(308)}: Поле агрегатного объекта не обнаружено (СоздатьСообщениеПротоколаКОтправке)
   big
 
3 - 19.10.20 - 16:34
Вариант 1. Создавать нужные элементы справочника так же программно, как и сам документ. То есть безо всяких открытий формы. Таким же образом "продублировать" процедуру СоздатьСообщениеПротоколаКОтправке().

Вариант 2. Загрузить внешнюю компоненту 1cpp.dll и тогда станут доступны методы документа "через точку". То есть ДокУведомлениеМДЛП.СоздатьСообщениеПротоколаКОтправке() уже не вызовет ошибки.
   АМ2020
 
4 - 19.10.20 - 16:42
(3) Благодарю за подсказку.
Вариант 1 не очень - так как надо будет много чего переписывать
Вариант 2 не срабатывает 

 ЗагрузитьВнешнююКомпоненту("1cpp.dll") - есть, даже дважды - один раз в глобальном модуле, 
 второй раз прям перед ДокУведомлениеМДЛП.СоздатьСообщениеПротоколаКОтправке() вызвал, все равно та же ошибка 
Может как то по другому надо грузить?
   Ёпрст
 
5 - 19.10.20 - 16:50
у формекса есть метод выпольнитьпроцедуру
   Kigo_Kigo
 
6 - 19.10.20 - 16:55
А модально пробовал?
   Kigo_Kigo
 
7 - 19.10.20 - 16:58
Есть подозрение, что фокус при простом открытии из обработки не передается в документ, по этому WshShell = СоздатьОбъект("WScript.Shell");
     WshShell.SendKeys("{F12}"); отрабатывается в обработке
попробей в документ отправить параметром ("выполнитьНажатие"), сделай процедуру и при открытии анализируй если Форма.Параметр() = "выполнитьНажатие" тогда
Процедура выполнитьНажатие()
WshShell = СоздатьОбъект("WScript.Shell");
     WshShell.SendKeys("{F12}");
   big
 
8 - 19.10.20 - 16:59
(4) Эххх... Что-то я запамятовал как там что конкретно делается... (((
   Kigo_Kigo
 
9 - 19.10.20 - 16:59
Уже в самом документе, а модальное открытие заставвит основную процедуру обработки дождаться выполнение и закрытие формы
   Kigo_Kigo
 
10 - 19.10.20 - 17:05
да и уже не нужно будет" WshShell = СоздатьОбъект("WScript.Shell");
     WshShell.SendKeys("{F12}");",
 при открытии
Если  = выполнитьНажатие , тогда
ПроцедураТоЧтоНамнадо()
Записать()
Форма.Закрыть();
и поехали дальше
   Sserj
 
11 - 19.10.20 - 17:06
ДокУведомлениеМДЛП.Записать();
Конт="СоздатьСообщениеПротоколаКОтправке_Закрыть";
ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); 


В форме документа:

Процедура ПриОткрытии()

...
  Если Форма.Параметр = "СоздатьСообщениеПротоколаКОтправке_Закрыт" Тогда
    СтатусВозврата(0);
    СоздатьСообщениеПротоколаКОтправке();
    Записать();
    Возврат;
  КонецЕсли;
КонецПроцедуры
   Ёпрст
 
12 - 19.10.20 - 17:24
(11) еще и код дока менять ради такой ерунды ?
   АМ2020
 
13 - 19.10.20 - 17:31
Сработало по методу Sserj 

   Конт="СоздатьСообщениеПротоколаКОтправке_Закрыт";
   ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); 
   WshShell = СоздатьОбъект("WScript.Shell"); 
   WshShell.SendKeys("{F12}");  

+ 

Процедура ПриОткрытии()
...
  Если Форма.Параметр = "СоздатьСообщениеПротоколаКОтправке_Закрыт" Тогда
    СтатусВозврата(0);
    СоздатьСообщениеПротоколаКОтправке();
    Записать();
    Возврат;
  КонецЕсли;
КонецПроцедуры

Дальше разбираться - как правильнее, нет времени, задачи горят, всем спасибо!
   Sserj
 
14 - 19.10.20 - 17:33
(13) А зачем тебе еще и сендкеи слать?
WshShell = СоздатьОбъект("WScript.Shell"); 
WshShell.SendKeys("{F12}"); 
Это уже совершенно не нужно, форма документа же теперь не открывается.
   АМ2020
 
15 - 19.10.20 - 17:34
Без них почему то не срабатывает 0-:
   Sserj
 
16 - 19.10.20 - 17:40
(15) Надеюсь ты после открытия формы удалили повторную запись?

Конт="СоздатьСообщениеПротоколаКОтправке_Закрыт";
ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт); 
....
ДокУведомлениеМДЛП.Записать(); - вот такого после открытия ни в коем случае не должно быть.

ДокУведомлениеМДЛП уже станет не валидным как где-то в другом месте выполнится запись объекта с такой ссылкой. А она и выполнится при вызове ОткрытьФормуМодально(....
Если нужно что-то еще делать с этим объектом то после открытия и записи нужно перечитать объект:

ОткрытьФормуМодально(ДокУведомлениеМДЛП.ТекущийДокумент(), Конт);
ДокУведомлениеМДЛП.НайтиДокумент(ДокУведомлениеМДЛП.ТекущийДокумент());
Теперь он опять валидный и можно опять его изменять и записывать.
   АМ2020
 
17 - 19.10.20 - 17:42
Sserj, да, ДокУведомлениеМДЛП.Записать() оставил только до открытия формы, благодарю за помощь!

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.