Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Выполнить в контексте модуля #Закрыть и пр. (число прочтений - 7748 )
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Выполнить в контексте модуля #Закрыть и пр.
04. Сентября 2012 :: 13:55
Печать  
Как можно выполнить в контексте модуля управляющие команды из кнопки типа "#Записать? Провести? Закрыть"?

Только парсить? И вручную вызывать Записать(), Провести() и пр.?

Пробовал через "ВыполняемыйМодуль" - не получается. Ошибка.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #1 - 04. Сентября 2012 :: 14:26
Печать  
ОФФ: ты перехват "Сообщить"/"Статус" прикрутил в итоге?
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #2 - 04. Сентября 2012 :: 14:37
Печать  
ОФФ2: По картинкам для кнопок - вчера посмотрел, вроде можно вытянуть инфу. Завтра попробую, если еще актуально
  
Наверх
 
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #3 - 05. Сентября 2012 :: 02:46
Печать  
alyuev писал(а) 04. Сентября 2012 :: 13:55:
Как можно выполнить в контексте модуля управляющие команды из кнопки типа "#Записать? Провести? Закрыть"?
СтрокаДействийФормы!
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #4 - 05. Сентября 2012 :: 07:23
Печать  
Как бы оно! Но!
Пишу в классе:

Код
Выбрать все
л_Модуль = СоздатьОбъект("ВыполняемыйМодуль");
л_Модуль.НазначитьКонтекст(КонтФормы);
ВыполнитьЗадание = "Форма.СтрокаДействийФормы=""#"+ЗаданиеКоманда+""";";
л_Модуль.УстановитьМодуль(ВыполнитьЗадание);
л_Модуль.КомпилироватьИВыполнитьМодуль();
 


Где ЗаданиеКоманда = , например "Закрыть" и:

Код
Выбрать все
Ошибка выполнения: Attempting to give a value to write-protected variable
<Форма.СтрокаДействийФормы="#Закрыть";>
КрасиваяКнопка::ВыполнитьФормулу() : Ошибка выполнения: Attempting to give a value to write-protected variable
<Форма.СтрокаДействийФормы="#Закрыть";>
л_Модуль.КомпилироватьИВыполнитьМодуль(); 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Dmitry The Wing
God Member
*****
Отсутствует


1C++ rocks!

Сообщений: 839
Местоположение: Где-то в Сибири
Зарегистрирован: 18. Августа 2009
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #5 - 05. Сентября 2012 :: 07:40
Печать  
По-моему, оно работает только при вызове из обработчика события формы. Я как-то обходил, но уже не помню, как именно...
  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #6 - 05. Сентября 2012 :: 07:42
Печать  
Похоже, что нужно писать не "Форма.СтрокаДействийФормы ...", а просто "СтрокаДействийФормы = ". Но и это еще не всё. Такое впечатление, что эта строка срабатывает в формуле, указанной в кнопке. Тогда для этой кнопки и меняются команды.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Kalen
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 185
Зарегистрирован: 29. Марта 2010
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #7 - 05. Сентября 2012 :: 08:55
Печать  
Я вообще только по этому примеру наконец понял как использовать СтрокаДействийФормы Подмигивание
Цитата:
Пример:
* Допустим, что в некоторой форме в свойствах какой-либо кнопки записана следующая формула:

УстКоманд() # Записать? Провести? Закрыть?

В программном модуле можно записать процедуру, которая будет устанавливать значение командной строки действий:

Код
Выбрать все
Процедура УстКоманд()
   Если НазваниеНабораПрав() = "Продавец" Тогда
	СтрокаДействийФормы = "Записать? Закрыть?";
   ИначеЕсли НазваниеНабораПрав() = "Менеджер" Тогда
	СтрокаДействийФормы = "Записать? Провести? Закрыть?";
   Иначе
	СтрокаДействийФормы = "Закрыть?";
   КонецЕсли
КонецПроцедуры 


Меня всегда ставило в тупик, что это не атрибут кнопки, а атрибут всего контекста вцелом.  Круглые глаза
  
Наверх
GTalkICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #8 - 05. Сентября 2012 :: 09:18
Печать  
вообще то, она нужна для получения ИД объекта:

Код
Выбрать все
//***
Функция ПолучаемИДЧегоУгодно(Об)
  СтрокаДействийФормы=Об;
  Возврат СтрокаДействийФормы;
КонецФункции

Процедура Сформировать()
 Док=СоздатьОбъект("Документ.ЗаказНаОтгрузку");
 Док.ВыбратьДокументы();
 Док.ПолучитьДокумент();
 Сообщить(ПолучаемИДЧегоУгодно(Док.ТекущийДокумент()));
 СтрокаДействийФормы=Док.ТекущийДокумент();
 Сообщить(СтрокаДействийФормы);
КонецПроцедуры
©Рупор  

  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #9 - 05. Сентября 2012 :: 10:51
Печать  
В любом случае СтрокаДействийФормы сработает только после физического нажатия кнопки. А я подменяю кнопку на ActiveX и из ActiveX вызываю через ВыполняемыйМодуль  формулу 1С-ной кнопки. Так вот с функциями и процедурами всё ОК. А вот с Командами - фигня. Приходится пока парсить строку.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Kalen
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 185
Зарегистрирован: 29. Марта 2010
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #10 - 05. Сентября 2012 :: 11:13
Печать  
Можно извратиться, создать невидимую кнопку и жать ее через эмуляцию клавиатуры  Класс
  
Наверх
GTalkICQ  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #11 - 05. Сентября 2012 :: 11:29
Печать  
Гораздо веселее будет отрабатывать команды, например #Записать..
там тоже есть тонкости.

Например,
Код
Выбрать все
"#Записать" = ПриЗаписи(); Если СтатусВозврата()=1 Тогда Записать() КонецЕсли; 



именно так выполняется команда на кнопке.

Вот.. нашел тут старые свои посты:
Код
Выбрать все
1.#Записать - системная команда, вызывает предопределенную команду ПриЗаписи
2.#Провести - системная команда, вызывает предопределенную команду ПриЗаписи, + модуль проведения
3.Записать() - метод документа, просто записывает документ
4.Провести() - метод документа, просто проводит документ

5.#Записать Провести - системная команда, вызывает предопределенную команду ПриЗаписи + модуль проведения
6.Записать();Провести() - выполняет п.3 + п.4

При установленном флаге ПриЗаписиПроводить(1) - любая запись проведенного документа приводит к его проведению..хть команда хоть метод

Отсюда п. 5 - это 1 команда - 1 раз перепровод
п.6  - это 2 метода - итого 2 раза перепровод. 

  
Наверх
 
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #12 - 05. Сентября 2012 :: 11:34
Печать  
Например?

Я сейчас сделал так:

Код
Выбрать все
		л_Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		л_Модуль.НазначитьКонтекст(КонтФормы);
		Если Найти(ФормулаКнопки,"#")<>0 Тогда
			ФормулаКнопки = СтрЗаменить(ФормулаКнопки,"#",РазделительСтрок);
			ЗаданиеФункция = СтрПолучитьСтроку(ФормулаКнопки,1);
			л_Модуль.УстановитьМодуль(ЗаданиеФункция);
			л_Модуль.КомпилироватьИВыполнитьМодуль();

			ЗаданиеКоманда = СтрПолучитьСтроку(ФормулаКнопки,2);
			Сообщить("ЗаданиеКоманда="+ЗаданиеКоманда);
			ЗаданиеКоманда = СтрЗаменить(ЗаданиеКоманда," ",РазделительСтрок);
			КолВо = СтрКоличествоСтрок(ЗаданиеКоманда);
			ВыполнитьЗадание = "";
			Для нстр=1 По КолВо Цикл
				Задание = СтрПолучитьСтроку(ЗаданиеКоманда,нстр);
				Если Найти(Задание,"?")<>0 Тогда
					ВыполнитьЗадание = ВыполнитьЗадание+"Если Вопрос("""+Задание+""",""Да+Нет"")=""Да"" Тогда
					|"+СтрЗаменить(Задание,"?","();")+"
					|КонецЕсли;
					|";
				Иначе
					ВыполнитьЗадание = ;
				КонецЕсли;
			КонецЦикла;
			л_Модуль = СоздатьОбъект("ВыполняемыйМодуль");
			л_Модуль.НазначитьКонтекст(КонтФормы);
			л_Модуль.УстановитьМодуль(ВыполнитьЗадание);
			л_Модуль.КомпилироватьИВыполнитьМодуль();
		Иначе
			л_Модуль.УстановитьМодуль(ФормулаКнопки);
			л_Модуль.КомпилироватьИВыполнитьМодуль();
		КонецЕсли;
 

  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 854
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #13 - 05. Сентября 2012 :: 11:36
Печать  
Ага. Понял на счет ПриЗаписиПроводить(1).
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Выполнить в контексте модуля #Закрыть и пр.
Ответ #14 - 05. Сентября 2012 :: 11:39
Печать  
alyuev писал(а) 05. Сентября 2012 :: 11:36:
Ага. Понял на счет ПриЗаписиПроводить(1).

ага
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать