Форум Кладовочки АЛьФ`а

Обсуждение проектов => FormEx => Тема начата: Пиит от 23 апреля 2024, 19:17

Название: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: Пиит от 23 апреля 2024, 19:17
Доброго здоровья, Алексей Леонидович!
При использовании глобальных процедур, например ПриНачалеВыбораЗначения и т.п. постоянно упираюсь в проблему формулы атрибута, которая должа быть выполнена при программном изменении значения. Нельзя ли избавиться от необходимости использовать при этом ВыполняемыйМодуль и прочие хитрости?
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: Злоп от 23 апреля 2024, 21:11
ну так при начале выбора значения - выполни что надо и верни статус 0.
это же не при окончании редактирования...
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: Пиит от 24 апреля 2024, 09:15
Цитата: Злоп от 23 апреля 2024, 21:11ну так при начале выбора значения - выполни что надо и верни статус 0.
это же не при окончании редактирования...
Нет, дружище, проблема шире. Вот, например КопиПаст, есть у меня свой глБуферОбмена, список значений, шифт+правым кликом я делаю Копи в любом агрегатном атрибуте, и Паст в другом, однотипном. Механизм универсальный, но я не знаю заранее, куда и где юзер сделает этот Паст, а формула должна быть выполнена в любом случае.
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: АЛьФ от 24 апреля 2024, 09:59
А как это должно выглядеть, если отменяется стандартная обработка? Есть АтрибутФормы::Формула, с его помощью можно получить саму формулу и потом в случае необходимости выполнить ее.
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: alyuev от 24 апреля 2024, 10:46
Я сделал в Фабрике событий (перехватчике) так:

Процедура ВыполнитьФормулу(Формула)
// код взят у 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 Тогда
ОткрытьФорму(Атр.Значение);
КонецЕсли;

Это вырезка из кода. Просто показывает идею как и где я формулу реквизита выполняю.
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: alyuev от 24 апреля 2024, 11:11
На первом фото - клик на сером фоне формы - вызывает контекстное меню объекта. В нем есть пункт - сохранить в буфер ссылку на объект. Она запоминается в буфер обмена и выводится на экран в Сообщить().
На втором фото - Ctrl + клик на кнопке выбора элемента (код в предыдущем сообщении) - вызывает меню выбора из последних 15 выбранных ранее значений этот типа значения (как у реквизита). В том числе в этом меню сразу можно открыть форму текущего и значение из буфера.

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

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

Кстати, перевод всех надписей и перечислений! делается налету при открытии формы согласно выбранному языку интерфейса (пока только 2, но уже есть движение в сторону третьего языка).
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: Пиит от 24 апреля 2024, 11:13
Цитата: АЛьФ от 24 апреля 2024, 09:59А как это должно выглядеть, если отменяется стандартная обработка? Есть АтрибутФормы::Формула, с его помощью можно получить саму формулу и потом в случае необходимости выполнить ее.
Цитата: alyuev от 24 апреля 2024, 10:46Я сделал в Фабрике событий (перехватчике) так:

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

Вы скажете, вот, бери и радуйся, а мне чего-то всё равно не хватает.
Не достаёт формексу для красоты и полноты  ВыполняемогоМодуля.
Глобальный есть, а Выполняемого нет, непорядок.
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: Пиит от 24 апреля 2024, 11:17
Цитата: alyuev от 24 апреля 2024, 11:11Бирюзовым цветом на форме подсвечиваются периодические реквизиты.

Коллега, а где Вы накопали себе такие красивые кнопки, неужто заменяли ресурсы?
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: alyuev от 24 апреля 2024, 13:14
Цитата: Пиит от 24 апреля 2024, 11:17Коллега, а где Вы накопали себе такие красивые кнопки, неужто заменяли ресурсы?

Это ActiveX кнопка. Вот тут выкладывал класс: https://www.1cpp.ru/forum/YaBB.pl?num=1351073387
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: Злоп от 24 апреля 2024, 19:09
А чем обычные кнопки не удовлетворили. Каким-то финтом вроде можно даже многострочную надпись на кнопке сделать...
Название: Re: Хотелка: АтрибутФормы.ВыполнитьФормулу()
Отправлено: alyuev от 24 апреля 2024, 20:15
Цитата: Злоп от 24 апреля 2024, 19:09А чем обычные кнопки не удовлетворили. Каким-то финтом вроде можно даже многострочную надпись на кнопке сделать...
Как минимум - они уже не серые :-). Потом, т.к. это класс - подмена идет автоматом. Главное - наличие у кнопки идентификатора.
Умеет отрабатывать клик правой кнопки. Наверное и на обычной можно сделать, но тут заработало и используется постоянно. Т.е. левой кнопкой обычное действие по формуле, а правой - специфическое, например какая-то менюшка.