Хотелка: АтрибутФормы.ВыполнитьФормулу()

Автор Пиит, 23 апреля 2024, 19:17

« назад - далее »

Пиит

Доброго здоровья, Алексей Леонидович!
При использовании глобальных процедур, например ПриНачалеВыбораЗначения и т.п. постоянно упираюсь в проблему формулы атрибута, которая должа быть выполнена при программном изменении значения. Нельзя ли избавиться от необходимости использовать при этом ВыполняемыйМодуль и прочие хитрости?

Злоп

ну так при начале выбора значения - выполни что надо и верни статус 0.
это же не при окончании редактирования...

Пиит

Цитата: Злоп от 23 апреля 2024, 21:11ну так при начале выбора значения - выполни что надо и верни статус 0.
это же не при окончании редактирования...
Нет, дружище, проблема шире. Вот, например КопиПаст, есть у меня свой глБуферОбмена, список значений, шифт+правым кликом я делаю Копи в любом агрегатном атрибуте, и Паст в другом, однотипном. Механизм универсальный, но я не знаю заранее, куда и где юзер сделает этот Паст, а формула должна быть выполнена в любом случае.

АЛьФ

А как это должно выглядеть, если отменяется стандартная обработка? Есть АтрибутФормы::Формула, с его помощью можно получить саму формулу и потом в случае необходимости выполнить ее.

alyuev

Я сделал в Фабрике событий (перехватчике) так:

Процедура ВыполнитьФормулу(Формула)
	// код взят у Arta: http://www.1cpp.ru/forum/YaBB.pl?num=1172047061/122#12
	Если ПустаяСтрока(Формула)=0 Тогда
		л_Модуль = СоздатьОбъект("ВыполняемыйМодуль");
		л_Модуль.УстановитьМодуль(Формула);
		л_Модуль.НазначитьКонтекст(КонтФормы);
		л_Модуль.КомпилироватьИВыполнитьМодуль();
	КонецЕсли;
КонецПроцедуры

Функция Событие_ПриНачалеВыбораЗначения(ИдЭлемента,Флаг) Экспорт
	ФормаРасш = СоздатьОбъект("РасширениеФормы"); 
	ФормаРасш.УстановитьФорму(КонтФормы.Форма);
	Если (Найти(ФормаРасш.ПолныйТипОбъекта(),"Журнал")>0) или 
	     (Найти(ФормаРасш.ПолныйТипОбъекта(),"Документ")>0) или 
	     (Найти(ФормаРасш.ПолныйТипОбъекта(),"Обработка")>0) или 
	     (Найти(ФормаРасш.ПолныйТипОбъекта(),"Отчет")>0) или 
		 (Найти(ФормаРасш.ПолныйТипОбъекта(),"Справочник")>0) Тогда	
		Атр 	= ФормаРасш.ПолучитьАтрибут(ИдЭлемента);
		ТипРекв = Атр.ТипЗначенияСтр();
		ВыбЭл 	= Атр.Значение;
		Формула = СокрЛП(Атр.Формула);
			КАШ=глКАШ();// Статус клавиш;
			Если КАШ=100 Тогда 		//Ctrl+  = последние 15
				Последние(1,ВыбЭл); //меню из списка последних 15ти выбранных ранее значений
				Флаг=0; 
				УстановитьЗначениеРеквизита(КонтФормы,ИдЭлемента,ВыбЭл); 
				ВыполнитьФормулу(Формула);// Атр.Значение = ВыбЭл; 
			ИначеЕсли КАШ=1 Тогда 	//Shift+ = очищаем значение
				Флаг=0; 
				УстановитьЗначениеРеквизита(КонтФормы,ИдЭлемента,""); 
				ВыполнитьФормулу(Формула);// Атр.Значение = ""; 
			ИначеЕсли КАШ=10 Тогда 	//Alt+ = открываем карточку
				Флаг=0; 
				Если ПустоеЗначение(Атр.Значение)=0 Тогда 
					ОткрытьФорму(Атр.Значение);
				КонецЕсли;

Это вырезка из кода. Просто показывает идею как и где я формулу реквизита выполняю.

alyuev

На первом фото - клик на сером фоне формы - вызывает контекстное меню объекта. В нем есть пункт - сохранить в буфер ссылку на объект. Она запоминается в буфер обмена и выводится на экран в Сообщить().
На втором фото - Ctrl + клик на кнопке выбора элемента (код в предыдущем сообщении) - вызывает меню выбора из последних 15 выбранных ранее значений этот типа значения (как у реквизита). В том числе в этом меню сразу можно открыть форму текущего и значение из буфера.

Ссылка на значение из буфера постоянно используется сотрудниками через мессенджеры в ходе разбора каких-то ситуаций. Быстро, оперативно, удобно.

Бирюзовым цветом на форме подсвечиваются периодические реквизиты.

Кстати, перевод всех надписей и перечислений! делается налету при открытии формы согласно выбранному языку интерфейса (пока только 2, но уже есть движение в сторону третьего языка).

Пиит

Цитата: АЛьФ от 24 апреля 2024, 09:59А как это должно выглядеть, если отменяется стандартная обработка? Есть АтрибутФормы::Формула, с его помощью можно получить саму формулу и потом в случае необходимости выполнить ее.
Цитата: alyuev от 24 апреля 2024, 10:46Я сделал в Фабрике событий (перехватчике) так:

Вот, Алексей Леонидович, именно так, как описал здесь коллега Alyuev,
через АтрибутФормы.Значение = и далее ВыполняемыйМодуль.

Вы скажете, вот, бери и радуйся, а мне чего-то всё равно не хватает.
Не достаёт формексу для красоты и полноты  ВыполняемогоМодуля.
Глобальный есть, а Выполняемого нет, непорядок.

Пиит

Цитата: alyuev от 24 апреля 2024, 11:11Бирюзовым цветом на форме подсвечиваются периодические реквизиты.

Коллега, а где Вы накопали себе такие красивые кнопки, неужто заменяли ресурсы?

alyuev

Цитата: Пиит от 24 апреля 2024, 11:17Коллега, а где Вы накопали себе такие красивые кнопки, неужто заменяли ресурсы?

Это ActiveX кнопка. Вот тут выкладывал класс: https://www.1cpp.ru/forum/YaBB.pl?num=1351073387

Злоп

А чем обычные кнопки не удовлетворили. Каким-то финтом вроде можно даже многострочную надпись на кнопке сделать...

alyuev

Цитата: Злоп от 24 апреля 2024, 19:09А чем обычные кнопки не удовлетворили. Каким-то финтом вроде можно даже многострочную надпись на кнопке сделать...
Как минимум - они уже не серые :-). Потом, т.к. это класс - подмена идет автоматом. Главное - наличие у кнопки идентификатора.
Умеет отрабатывать клик правой кнопки. Наверное и на обычной можно сделать, но тут заработало и используется постоянно. Т.е. левой кнопкой обычное действие по формуле, а правой - специфическое, например какая-то менюшка.