Доброго здоровья, Алексей Леонидович!
При использовании глобальных процедур, например ПриНачалеВыбораЗначения и т.п. постоянно упираюсь в проблему формулы атрибута, которая должа быть выполнена при программном изменении значения. Нельзя ли избавиться от необходимости использовать при этом ВыполняемыйМодуль и прочие хитрости?
ну так при начале выбора значения - выполни что надо и верни статус 0.
это же не при окончании редактирования...
Цитата: Злоп от 23 апреля 2024, 21:11ну так при начале выбора значения - выполни что надо и верни статус 0.
это же не при окончании редактирования...
Нет, дружище, проблема шире. Вот, например КопиПаст, есть у меня свой глБуферОбмена, список значений, шифт+правым кликом я делаю Копи в любом агрегатном атрибуте, и Паст в другом, однотипном. Механизм универсальный, но я не знаю заранее, куда и где юзер сделает этот Паст, а формула должна быть выполнена в любом случае.
А как это должно выглядеть, если отменяется стандартная обработка? Есть АтрибутФормы::Формула, с его помощью можно получить саму формулу и потом в случае необходимости выполнить ее.
Я сделал в Фабрике событий (перехватчике) так:
Процедура ВыполнитьФормулу(Формула)
// код взят у 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 Тогда
ОткрытьФорму(Атр.Значение);
КонецЕсли;
Это вырезка из кода. Просто показывает идею как и где я формулу реквизита выполняю.
На первом фото - клик на сером фоне формы - вызывает контекстное меню объекта. В нем есть пункт - сохранить в буфер ссылку на объект. Она запоминается в буфер обмена и выводится на экран в Сообщить().
На втором фото - Ctrl + клик на кнопке выбора элемента (код в предыдущем сообщении) - вызывает меню выбора из последних 15 выбранных ранее значений этот типа значения (как у реквизита). В том числе в этом меню сразу можно открыть форму текущего и значение из буфера.
Ссылка на значение из буфера постоянно используется сотрудниками через мессенджеры в ходе разбора каких-то ситуаций. Быстро, оперативно, удобно.
Бирюзовым цветом на форме подсвечиваются периодические реквизиты.
Кстати, перевод всех надписей и перечислений! делается налету при открытии формы согласно выбранному языку интерфейса (пока только 2, но уже есть движение в сторону третьего языка).
Цитата: АЛьФ от 24 апреля 2024, 09:59А как это должно выглядеть, если отменяется стандартная обработка? Есть АтрибутФормы::Формула, с его помощью можно получить саму формулу и потом в случае необходимости выполнить ее.
Цитата: alyuev от 24 апреля 2024, 10:46Я сделал в Фабрике событий (перехватчике) так:
Вот, Алексей Леонидович, именно так, как описал здесь коллега Alyuev,
через АтрибутФормы.Значение = и далее ВыполняемыйМодуль.
Вы скажете, вот, бери и радуйся, а мне чего-то всё равно не хватает.
Не достаёт формексу для красоты и полноты ВыполняемогоМодуля.
Глобальный есть, а Выполняемого нет, непорядок.
Цитата: alyuev от 24 апреля 2024, 11:11Бирюзовым цветом на форме подсвечиваются периодические реквизиты.
Коллега, а где Вы накопали себе такие красивые кнопки, неужто заменяли ресурсы?
Цитата: Пиит от 24 апреля 2024, 11:17Коллега, а где Вы накопали себе такие красивые кнопки, неужто заменяли ресурсы?
Это ActiveX кнопка. Вот тут выкладывал класс: https://www.1cpp.ru/forum/YaBB.pl?num=1351073387
А чем обычные кнопки не удовлетворили. Каким-то финтом вроде можно даже многострочную надпись на кнопке сделать...
Цитата: Злоп от 24 апреля 2024, 19:09А чем обычные кнопки не удовлетворили. Каким-то финтом вроде можно даже многострочную надпись на кнопке сделать...
Как минимум - они уже не серые :-). Потом, т.к. это класс - подмена идет автоматом. Главное - наличие у кнопки идентификатора.
Умеет отрабатывать клик правой кнопки. Наверное и на обычной можно сделать, но тут заработало и используется постоянно. Т.е. левой кнопкой обычное действие по формуле, а правой - специфическое, например какая-то менюшка.