Имя: Пароль:
1C
 
Как из внешней обработки "нажать" кнопку документа
0 sunrise40
 
28.12.06
04:34
Создаю приказы на увольнение по списку (список гружу из EXCELя, там все что надо для заполнения документа есть), документы создаются,реквизиты все заполняются как надо, но документы не проводятся. Массовое сокращение, массовые переводы из СП1 в СП2 ( в одном увольняем, в другом принимаем). Потому для ускорения процесса кучу народу в одной базе увольняем, в другой кучку поменьше принимаем. Можно ли как-то интерактивно нажать кнопку "провести" в документе или запустить то что там написано на закладке "дополнительно" в поле "Формула" не меняя модуль документа и глобальник, только внешней обработкой?
1 ТелепатБот
 
гуру
28.12.06
04:34
2 sunrise40
 
28.12.06
04:36
Забыла сказать - 1с-Предприятие 7.7, релиз 25, ЗиК, очень сильно переделанная под себя.
(1) - на свой вопрос ответа не нашла
3 sunrise40
 
28.12.06
04:37
база DBF
4 VladZ
 
28.12.06
04:45
(0) Вопрос не понят...
5 VladZ
 
28.12.06
04:46
+4 Если тебе нужно только провести, то для этого не нужно нажимать кнопку документа из обработки. Делай так:
Док.Провести()
6 sunrise40
 
28.12.06
04:55
в том то и дело, что Док.Провести() не проводит документы, они в Жунале докуменов остаются непроведенными. Может быть у Прикзов на увольнение свои тонкости, там же происходит ещё перемещение в папку уводенных и запоминание исходной папки для того чтоб при отмене проведения вернуть все назад. Потому в "формула" запускается процедура, а потом идет #Записать провести. Не хотелось лезть в текст вызываемой процедуры, тк там ещё масса вызываемых. Самый простой путь - "нажать" кнопку программно.
7 VladZ
 
28.12.06
05:04
(6) Поверь мне - это не самый простой путь...
8 Лефмихалыч
 
28.12.06
05:12
(6) там поди надо какой-нить параметр в Провести(<>) передать. Гляди отладчиком, почему не проводятся документы
9 smaharbA
 
28.12.06
06:08
(6) формулу с кнопки сюда давай ?
10 sunrise40
 
28.12.06
06:25
ЗапомнитьГруппу() #Записать Провести

Процедура ЗапомнитьГруппу() вызывает ещё расчет среднего и заполнение табоичной части документа
11 smaharbA
 
28.12.06
06:28
(10) т.е. никаких параметров не передается ? и точна ЗапомнитьГруппу() - это процедура ?
12 sunrise40
 
28.12.06
06:29
да. она в глбальном модуле. на кнопке она без параметров. Тупо скопировала то что там есть и сюда вставила
13 smaharbA
 
28.12.06
06:32
(12) Интересно, если контекст в нее не передают, то как получают текдок с учетом что она в глобальнике? (я конечно умею, но сомнения что в типовой также)
14 smaharbA
 
28.12.06
06:33
+(13) Если хочешь сделать (0) отвечай на все мои тупые вопросы :)
15 sunrise40
 
28.12.06
06:33
попробовала вставить вызов этой процедуры из своей обработки. Пердала как параметр документ. Средний не рассчитывает. Видимо ещё что-то где-то цепляет. В отладчике вижу что не считает, т.к. заблуждается в датах...
Конфигурация не типовая. Очень давно очень сильно , пркатически полностью переписанная под себя
16 sunrise40
 
28.12.06
06:34
(14) - не успеваю..., я ж на работе! Отвлекают... :)
17 smaharbA
 
28.12.06
06:36
(15) процедуру скопи-пастить сложно сюда ? Ну или хотябы строк 10 первых вместе с объявлением
18 sunrise40
 
28.12.06
06:38
Вру. Процедура в модуле формы. Вызывает другую, которая вводит строки в табл. часть, из глобальника и туда передает контекст.
19 sunrise40
 
28.12.06
06:38
Процедура ЗапомнитьГруппу()                
   Если (БезОкладов=1)и(проведен()=1) Тогда            
       предупреждение("Данному пользователю проведение документа запрещено!");        
       Возврат ;        
   КонецЕсли;            
               
   // запишем группу в которой был сотрудник!            
   // это значение пригодится в модуле удаления приказа              
   ВС=ВнутрСовмещение;            
   Если (ВнутрСовмещение.Выбран()=0) И (Проведен()=0) Тогда            
       Группа = Сотрудник.Родитель;        
   КонецЕсли;            
   Если Число(ДатаУвольнения)>0 Тогда            
       Если ДнейКомпОтп<>0 Тогда        
           Если СреднююВручную=0 тогда    
               ВвестиСтроки(Контекст,Месяцев,ГруппаРасчетов.СредняяДляОтп,ВидРасчета.ОтпускОчередной,1);
           КонецЕсли;    
           СредняяКО=СрЗарплата;    
           СредняяКОРайонн=СрЗарплатаРайонн;    
           СредняяКОСеверн=СрЗарплатаСеверн;    
       КонецЕсли;        
       Если ДнейВыхПособия>0 Тогда          
               
               
               
           Если СреднююВручную=0 тогда    
               ВвестиСтроки(Контекст,12,ГруппаРасчетов.СредняяДляОтп,ВидРасчета.ОтпускОчередной,0);
               СредняяВП=СрЗарплата+СрЗарплатаРайонн+СрЗарплатаСеверн;
           КонецЕсли;    
       КонецЕсли;        
       Форма.Обновить();        
   Иначе Сообщить("Введите дату увольнения!");            
   КонецЕсли;            
КонецПроцедуры
20 smaharbA
 
28.12.06
06:48
Все, теперь давай код обхода доков сюда (можна сокращенный) в смысле как ты их отбирать собралась для "нажатия кнопки" ?
21 sunrise40
 
28.12.06
06:56
....
ТабЗагр - табличка в которую загружаем из Экселя информацию для документов    
...........
ЗагрузитьИзФайла(ВыбФайлЗагрузки);            
               
   ТабЗагр.ВыбратьСтроки();        
   Пока ТабЗагр.ПолучитьСтроку()=1 Цикл        
       Сотры.ВыбратьЭлементы();    
       Если Сотры.НайтиПоКоду(ТабЗагр.ТабНом,0) = 0 Тогда    
           Сообщить("Сотрудник с таб номером= "+ТабЗагр.ТабНомБ+" не найден. Расчет для него выполнен не будет!" );
           ТабЗагр.Признак=2;    
       КонецЕсли;    
       состояние("Обрабатывается отрудник "+СокрЛП(Сотры.ТекущийЭлемент()));    
           
       Док.Новый();    
       Док.Сотрудник=Сотры.ТекущийЭлемент();    
           Док.Основание=Перечисление.ОснованияУвольнения.СокращениеШтатов;        
       Док.ТипРасчета=Перечисление.ТипРасчетаОтпуска.ПоКалендарнымДням;    
       Док.ДнейВыхПособия=1;    
       Док.ДатаУвольнения=ТабЗагр.ДатаУв;    
       Док.Начало=ТабЗагр.ДатаУв;    
       Док.ДатаДок=ТабЗагр.ДатаУв;    
       Док.НомерДок= СокрЛП(ТабЗагр.ТабНом)+"-Реорг";  
..........................................    
       ЗапомнитьГруппу(Док);    
       Док.Провести();
//  в загрузочную табличку запишем средние суммы для расчета вых. пособия -
// нужно будет для других целей    
       Если  Док.Проведен()=1  тогда    
           ТабЗагр.СуммаСр=Док.СредняяВП;    
           ТабЗагр.Признак=1;
           ТабЗагр.Сотр=Док.Сотрудник;
           КонецЕсли;        
   КонецЦикла;        

Док.Провести() - то ставлю, то убираю, в последний раз чего-то наменяла и прога ругалась что док. заблокирован...
22 smaharbA
 
28.12.06
06:59
(21) Жди...(просче формексом конечно, но счас дам код без него, спасибо Рупору скажешь)
23 sunrise40
 
28.12.06
07:02
СПАСИБО!!!!!!!!!!!!!!!!!!!!!!!!!!!! и рупору тоже!
24 smaharbA
 
28.12.06
07:55
Перем Конт,ТабЗагр,Док;
Процедура Сформировать() Далее

Процедура Задержка()
   Форма.ОбработкаОжидания("",0);
   Попытка
       конт.Форма.ОбработкаОжидания("",0);
       ШелСкрипт=СоздатьОбъект("WScript.Shell");
       ШелСкрипт.SendKeys("{ENTER}");
       конт.Форма.Закрыть(1);
   Исключение
   КонецПопытки;
   Сформировать();
КонецПроцедуры    // Задержка

Процедура Сформировать()
   
   Если ТабЗагр.ПолучитьСтроку()=0 Тогда
       Форма.ОбработкаОжидания("",0);
       Попытка
           конт.Форма.ОбработкаОжидания("",0);
           конт.Провести();
       Исключение
       КонецПопытки;
       Возврат;
   КонецЕсли;
   
   Сотры.ВыбратьЭлементы();    
   Если Сотры.НайтиПоКоду(ТабЗагр.ТабНом,0) = 0 Тогда    
       Сообщить("Сотрудник с таб номером= "+ТабЗагр.ТабНомБ+" не найден. Расчет для него выполнен не будет!" );
       ТабЗагр.Признак=2;    
       Возврат;
   КонецЕсли;    
   состояние("Обрабатывается отрудник "+СокрЛП(Сотры.ТекущийЭлемент()));    
   
   Док.Новый();    
   Док.Сотрудник=Сотры.ТекущийЭлемент();    
   Док.Основание=Перечисление.ОснованияУвольнения.СокращениеШтатов;        
   Док.ТипРасчета=Перечисление.ТипРасчетаОтпуска.ПоКалендарнымДням;    
   Док.ДнейВыхПособия=1;    
   Док.ДатаУвольнения=ТабЗагр.ДатаУв;    
   Док.Начало=ТабЗагр.ДатаУв;    
   Док.ДатаДок=ТабЗагр.ДатаУв;    
   Док.НомерДок= СокрЛП(ТабЗагр.ТабНом)+"-Реорг";  
   Док.Записать();
   конт="";
   Форма.ОбработкаОжидания("Задержка",2);
   ОткрытьФорму(Док.ТекущийДокумент(),конт);
   конт.Форма.ОбработкаОжидания("ЗапомнитьГруппу",1);
   Если  Док.Проведен()=1  тогда    
       ТабЗагр.СуммаСр=Док.СредняяВП;    
       ТабЗагр.Признак=1;
       ТабЗагр.Сотр=Док.Сотрудник;
   КонецЕсли;        
КонецПроцедуры

Процедура ПриОткрытии()
   Док=СоздатьОбъект("Документ.ХХХ");
   ЗагрузитьИзФайла(ВыбФайлЗагрузки);            
   ТабЗагр.ВыбратьСтроки();        
КонецПроцедуры
///
Не проверено, примерно так, но луччеб переписать эту "ЗапомнитьГруппу"
25 sunrise40
 
28.12.06
08:28
не работает. Надо же ещё выбрать кнопку "провести",на которой висит вызов процедуры. Простое нажатие Enter на форме документа вызывает только его запись, а т.к. мы док уже записали, получаем ошибку - т.к. документ с таким номером уже есть.
26 sunrise40
 
28.12.06
08:28
надо как-то спозиционировать курсор на форме документа на кнопку которая называется "провести"
27 sunrise40
 
28.12.06
08:30
на документе ещё других кнопок много- например "Форма Т-8", "Приказ", "Печать компенсаций" и т.д.
28 smaharbA
 
28.12.06
08:33
(25) Если тупа кнопу жать, то повесь на нее хоткей к примеру Ctrl+F12 и так

   Док.Записать();
   ШелСкрипт=СоздатьОбъект("WScript.Shell");
   ШелСкрипт.SendKeys("^{F12}");
   конт="";
   ОткрытьФорму(Док.ТекущийДокумент());
   Попытка
     конт.Форма.Закрыть(0);
   Исключение
   КонецПопытки;
29 smaharbA
 
28.12.06
08:34
+(28) и без обработкиожидания, а если можна форму/модуль дока править то и таких выеженов ненада
30 Лефмихалыч
 
28.12.06
08:34
а б вот за такие "запомнитьГруппу" ручонки обрывал... Надо переделать эту лабуду так, тчобы документ-таки делал одинаковые действия и при интерактивном и при программном проведении
31 1Сукпун
 
28.12.06
08:34
(27) ну  так  можно еще  и клавешей  TAB  пройтись по кнопкам
типа  ШелСкрипт.SendKeys("{TAB 5}{Enter}")
32 Рэйв
 
28.12.06
08:34
(0)А что если открывать док,передавать ему параметр типа "ЗагрузкаИзЕкселя",запускать эту процедуру,
а в конце процедуры ПриОткрытии():

//--------------
Если Форма.Параметр="ЗагрузкаИзЕкселя" Тогда
  СтатусВозврата(0);
  Возврат;
КонецЕсли;
//--------------
33 smaharbA
 
28.12.06
08:35
+(28) Вернее

   Док.Записать();
   ШелСкрипт=СоздатьОбъект("WScript.Shell");
   конт="";
   ОткрытьФорму(Док.ТекущийДокумент());
   ШелСкрипт.SendKeys("^{F12}");
   Попытка
     конт.Форма.Закрыть(0);
   Исключение
   КонецПопытки;

эх пита не видно, он бы точна мене звание Дятла дал за такие советы :)
34 smaharbA
 
28.12.06
08:36
(30) Прав
(32) так хорошо, но лучче (30)
35 Лефмихалыч
 
28.12.06
08:36
щас насоветуете, умники! а потом мало ли, может кому-то из вас же придецца это гуано разгребать...
36 sunrise40
 
28.12.06
08:48
Так сложились обстоятельства что править конфу нельзя, я не разработчик, только сопровожденец... Разработчики шлют обновления периодически, потому если начну самодеятельность, замордуюсь свои правки каждый раз после обновления вставлять...

Могу только процедуры к себе в обработку взять и пределать. Не хотела, т.к. мало ли чего в следующий раз поправят... надо будет отслеживать, чтоб не пролететь с результатами.
Я могу как-то обратиться к элементу диалога формы документа из внешней обработки?
как-нибудь может так можно?
       СЗ=Док.Форма.Параметр;
       СЗ=СоздатьОбъект("СписокЗначений");
       СЗ.ДобавитьЗначение("Провести","Кнопка");
       ОткрытьФормуМодально(Док.ТекущийДокумент(),СЗ);
и потом
       ШелСкрипт=СоздатьОбъект("WScript.Shell");
       ШелСкрипт.SendKeys("{ENTER}");
       конт.Форма.Закрыть(1);
37 VladZ
 
28.12.06
08:49
(30) +1
38 smaharbA
 
28.12.06
08:50
(36) Тогда давай, снова что в (24) не выходит ?
39 smaharbA
 
28.12.06
08:50
И еще вопрос - это кнопка ОК - кнопка по умолчанию ?
40 Лефмихалыч
 
28.12.06
08:51
(36) бросай это дело - в таких условиях твоя мега-обработина скорее всего после следующего обновления работать перестанет...
41 1Сукпун
 
28.12.06
08:52
(36) я  ж тебе уже говорил  открой форму  жми таб  и считай  количество нажатий  пока не спозиционируешься  на  нужном  элементе  диалога  . затем  
ШелСкрипт.SendKeys("{TAB <кол нажатий>}{Enter}")
42 Лефмихалыч
 
28.12.06
08:54
Абрахамс праильно намякивает - проще Ctrl+Enter послать, ежели это умолчательная кнопица
43 sunrise40
 
28.12.06
08:55
(39) не знаю какая кнопка по умолчанию. где посмотреть? Сейчас ещё раз все переделаю и скажу что получилось. Ругательство шло не дубликат номера документа. заблудилась в вызовах Сформировать(). Надо все заново сделать и ещё раз посмотреть.
(41) как проверить когда я нужную кнопку попаду? отладчиком шлепать таб и считать? или можно как-то программно определить?
44 Лефмихалыч
 
28.12.06
08:58
(43) руками таб шлёпать надо (41) в этом случае, хотя, если ты сумеешь каким-то макаром для этого отладчик приспособить, то выложи в КЗ методу
45 1Сукпун
 
28.12.06
08:58
(43) так ты  интерактивно  в  режиме предпричтия  можешь открыть   эту  форму и  вот если б у  тебя не было мышки  как бы  ты  с помощью клавы  нажала  нужную кнопку  ?
46 smaharbA
 
28.12.06
08:59
+(42)

//*******************************************
Процедура Сформировать()
   Док=СоздатьОбъект("Документ.ЗаказНаОтгрузку");
   Док.Выбрать("","");
   конт="";
   ОткрытьФорму(Док.ТекущийДокумент(),конт);
   ШелСкрипт=СоздатьОбъект("WScript.Shell");
   ШелСкрипт.SendKeys("^{ENTER}");
   Попытка
       конт.Форма.Закрыть(0);
   Исключение
   КонецПопытки;
КонецПроцедуры
47 smaharbA
 
28.12.06
09:02
И еще, если ругается на номер, то уж извини - надо делать УстановитьНовыйНомер(
вовремя
48 sunrise40
 
28.12.06
09:04
я и устанавливаю, каждому сотруднику документ с носером=его таб. номеру. Просто получается что на 1 сотрудника 2 раза создается документ. Цикл по списку вызывает ещё раз СФормировать() где опять цикл по списку. Надо с порядком разобраться. Сделаю, скажу что получилось.
49 sunrise40
 
28.12.06
09:05
на бегу направила, вот  бардак и получился...Попробую все посторить заново.
50 smaharbA
 
28.12.06
09:06
А, ну да, тока цикл в (24) невооруженным взглядом не виден ;)
51 sunrise40
 
28.12.06
09:51
не попадает ни разу внутрь Попытки, создаются непроведенные документы, средний для выплаты компенсации не рассчитывается. До нажатия кнопки дело не дошло
Если убрать Попытка то получается ошибка
конт.Форма.ОбработкаОжидания("",0);
...\УВОЛЬНЕНИЯПОСПИСКУ4.ERT(106)}: Значение не представляет агрегатный объект (Форма)

:(
52 sunrise40
 
28.12.06
09:53
в контекстах я не сильна... очень редко с ними сталкивалась... похоже надо разбираться... и отладчиком не видно что там в нем сидит...
53 Лефмихалыч
 
28.12.06
10:00
а что такое конт?
54 sunrise40
 
28.12.06
10:03
контекст вероятно
55 sunrise40
 
28.12.06
10:05
+54 - по тексту в (24)
56 sunrise40
 
28.12.06
10:19
вообще все повесилось... наверное пора домой. Рабочий день закончился, комп работать отказывается... Завтра на свежую голову ещё раз посмотрю, а то уже похоже вижу то что хочется а не то что есть не самом деле. Утро вечера мудренее.. Огромное спасибо за содействие. Если удастся победить, обязательно скажу как выкрутилась.
57 Лефмихалыч
 
28.12.06
10:21
до НГ двое суток, пора завязывать с работой 8)
58 smaharbA
 
28.12.06
10:21
(56) посмотри просче вариант - (46) может этого достаточно
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший