Имя: Пароль:
1C
1C 7.7
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, да, ДокУведомлениеМДЛП.Записать() оставил только до открытия формы, благодарю за помощь!
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший