Понять в каком режиме открыта форма элемента/документа

Автор Харлампий Дымба, 03 апреля 2026, 20:48

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

Злоп

В ПриОткрытии надо очень осторожно со всякими манипуляциями формы до завешения полной инициализации формы. Я еще когда для ТСД писал пришел к тому что когда в ПриОткрытии надо например запустить другую форму для ввода каких-то промежуточных данных и вернуться обратно, то это в итоге делалось через ОО.

item

ПослеОткрытия точно тупиковая ветка.
Послушайте Злопа, юзайте ПриОткрытии или ПослеСозданияФормы, она то и появилась гораздо позже и для обработок до прорисовки формы.
И нехер думать, будет форма выставлена в просмотр в локальном контексте или нет, надо её по-любому перезапускать, чтобы не допускать лишних блокировок...
... и лазеек в виде кнопок, которыми можно обойти запрет на редактирование.

Злоп

Поставьте в настройках "режим открытия = Просмотр", при энтере или жмаком мышью на документе будет открываться на просмотр. шифт+энтер - на редактирование.
.
Перехват команд меню "открыть на редактирование" сделать глобальными формексовскими

Харлампий Дымба

Цитата: Злоп от Вчера в 09:15то у меня спокойно открываются две формы документа - одна на редактирование и одна в режиме просмотра
Ну да, только требуется ровно обратное - открыть форму в режиме чтения когда в ПриОткрытии Форма.ТолькоПросмотр() = 1.

Если Форма.ТолькоПросмотр() = 1 Тогда
    ОткрытьФорму(ТекущийДокумент(),,1);//портал в бесконечный цикл открытий
КонецЕсли;


Злоп

Если в модуле формы (внизу, после всех процедур/функций самым первым оператором
получаем что Форма.ТолькоПросмотр()=1 - еще ни одна предопределенная процедура не выполнялась.
Этот код отрабатывает самым первым, при инийиализации модуля формы.
Никакие программные установки режима просмотра еще не отрабатывали, форма изначально открыта в режиме просмотра (из меню или программно с передачей параметра режима открытия = просмотр.
.
?

Злоп

// модуль формы
ОткрытВРежимеРедактирования = 1-Форма.ТолькоПросмотр();

а дальше уже смотри в ПриОткрытии() в нужном месте
Если ОткрытВРежимеРедактирования = Форма.ТолькоПросмотр() Тогда
  // был открыт в режиме редактирования, а потом переклбчили в режим просмотра
  СтатусВозврата(0);
  ОткрытьФорму(ТекущийДокумент(),,1);
  Возврат;
КонецЕсли;

???

Харлампий Дымба

Цитата: Злоп от Вчера в 21:27Поставьте в настройках "режим открытия = Просмотр", при энтере или жмаком мышью на документе будет открываться на просмотр. шифт+энтер - на редактирование.
Я не для себя - то для друга) Для 100500 пользователей.
Перехват команд вообще не вариант - куча способов открыть документ/элемент: расшифровка отчетов, меню, мышка, свои кнопки на формах. Это прям очень сильно надо заморочится.


Задача была простая: если после ПриОткрытии у формы ТолькоПросмотр()=1 и она открыта на запись, то закрыть и открыть на чтение.

Замечание: ТолькоПросмотр()=1 может быть по миллиону причин - право доступа "Корректировка" в конфгируторе, программный контроль прав доступа, служебные объекты только для избранных, открыженные документы, дата запрета, форма открыта в режиме просмотра, временный период блокировки для корректировки некоторых данных, принадлежность центр-переферийка и т.д.
Все варианты в глобальной ПриОткрытии не предусмотришь. Поэтому захотелось сделать красиво. Пока не получилось.


Харлампий Дымба

Цитата: Злоп от Вчера в 21:59Никакие программные установки режима просмотра еще не отрабатывали, форма изначально открыта в режиме просмотра (из меню или программно с передачей параметра режима открытия = просмотр.
Да. Осталось малость: положить этот код в локальном ПриОткртыии в 100 документов и 100 справочников и в несколько разных нетленок. Выход - глобальная ПриОткрытии. А её нету. Вот если бы Ёпрст убедил 2 года назад АЛьФа при анонсе формекса 2.0.5.194, что:
  • -перед
  • -вместо
  • -после
для предопределенных процедур это здОрово, то задачу можно было бы легко решить.




Злоп

вот, промоделировал:
.
// модуль формы
ОткрытВРежимеРедактирования = 1-Форма.ТолькоПросмотр();
Сообщить(""+ТекущийДокумент()+", открыт в режиме редактирования = "+ОткрытВРежимеРедактирования);

// в ПриОткрытии()
    глПроверкаРазрешенияРедактирования(Контекст);
    //[+]progadmin 2026-04-07 22:12 добавлено нетиповое
    Если ОткрытВРежимеРедактирования = Форма.ТолькоПросмотр() 
    Тогда // был открыт в режиме редактирования, а потом переклбчили в режим просмотра
      СтатусВозврата(0);
      ОткрытьФорму(ТекущийДокумент(),,1);
      Возврат;
    КонецЕсли;    
    //[+]_progadmin 2026-04-07 22:12 добавлено нетиповое

Дата запрета редактирования = 01.01.2026
Реализация  П000001415 (15.03.2026), открыт в режиме редактирования = 1
Реализация  П000008698 (31.12.2025), открыт в режиме редактирования = 1
Реализация  П000008698 (31.12.2025), открыт в режиме редактирования = 0

Злоп

А глобальная ПриОткрытииФормыДокумента() - не пойдет?
там есть как раз параметр флРежимПросмотра

Злоп


Злоп

все равно непонятно, от чего хотите защититься (?) что не устраивает что Форма.ТолькоПросмотр(1) не подходит?

Харлампий Дымба

Цитата: Злоп от Вчера в 22:41от чего хотите защититься (?)
Самое очевидное - убрать блокировку объекта на запись.

Злоп

да, если просмотр установлен как Форма.ТолькоПросмотр(1) - контекст формы доступен на запись.
но чтобы в таком режиме изменить документ - надо или извне доступ к контексту иметь (ВПФ) или криво форму написанную с доступом к реквизитам/кнопкам редактирования/записи.

Злоп

Цитата: Харлампий Дымба от Вчера в 22:51
Цитата: Злоп от Вчера в 22:41от чего хотите защититься (?)
Самое очевидное - убрать блокировку объекта на запись.
в настройках штатно поставить "Режим открытия = Просмотр".
ибо нефиг.
соотвнетсвенно кому надо будет открыть на изменение - не обломится шифт+энтер или жмакнуть на панели иконку редактирования.
а через перехват команд окон формексом - так и жмакание иконки редактирования зарубить, пусть через шифт+энтер тычут