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

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

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

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

Есть ли простой способ (можно с  Formex) из формы элемента/документа понять в каком режиме она открыта - на просмотр или на изменение?

trad

СоздатьОбъект
НайтиДокумент
Блокировка(1)
Так не получится?

item

Форма.ТолькоПросмотр()

Если 1, можно изменить любой реквизит, если получилось, значит не в просмотре

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

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

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

Варианты чуть посложнее есть:
Анализировать изменение Форма.ТолькоПросмотр() ПередОткрытием и ПослеОткрытия выглядит самым простым (если не считать необходимости контролить, а один и тот же контекст в обоих этих вызовах?)

Цитата: trad от 03 апреля 2026, 21:58Блокировка(1)
Блокировка(1) - там будут нюансы, связанные с тем, что открытую форму операции она считает блокировкой документа и наоборот. Плюс открытия форм с меткой (несколько к одному объекту). В целом, возможно рабочий вариант.

Думал ещё про Записать() в транзакции - мне не нравится. И сомневаюсь, что работает.

Цитата: item от Вчера в 00:34Форма.ТолькоПросмотр()
Форма.ТолькоПросмотр() будет давать 1 в обоих случаях и если форма изначально была открыта в режиме просмотра и если ПриОткрытии для формы был установлен флаг Форма.ТолькПросмотр(1), а это, как я писал выше, может быть 2 большие разницы.


item

Надо работать с ПриОткрытииФормыДокумента, там нет записи в журнале регистрации об открытии, и там уже открывать на только просмотр.
С элементами не так красиво.
Возможно, ФормаПослеСоздания (1срр, могу ошибиться) надо ковырять, она срабатывает раньше всех, но здесь надо классы оформлять.

item

Для формы, открытой в просмотре, Модифицированность всегда 0, и Форма.Обновить(1), и программная модификация любых атрибутов не изменит это признак.
Это для задачи по определению, как была открыта форма.
Блокировка не решение, потому что форма может быть открыта на просмотр, а обьект заблокирован другим пользователем, в результате  неверный ответ.

item

Процедура ПриОткрытииФормыДокумента(ФСО, ИдВида, ИдОбъекта, ИдЖурнала, п4, ИдКопии, ИтТекущего, ВводНаОсновании, ИдВидаОснования, ТолькоПросмотр, п10, п11, п12, п13, ПараметрФормы) // предопределенная формекс
	Перем Объект, ВидОбъекта, МетаТип, ДатаЗапретаРедактирования, Заголовок;
	глОтладка("ПриОткрытииФормыДокумента:" + ИдВида + ":" + ИдОбъекта);
	
	Если ИдВида = 0 Тогда // хз, но вдруг
		Возврат;
	ИначеЕсли ИдОбъекта = 0 Тогда // новый объект
		Возврат;
	ИначеЕсли ТолькоПросмотр = 1 Тогда
		Возврат;
	КонецЕсли;
	
	// определение объекта
	СписокВнутр = ЗначениеИзСтроки("{""СписокЗначений"",{}}");
	СписокВнутр.ДобавитьЗначение("O"); // O - метка документа
	СписокВнутр.ДобавитьЗначение("0");
	СписокВнутр.ДобавитьЗначение("0");
	СписокВнутр.ДобавитьЗначение("0");
	СписокВнутр.ДобавитьЗначение("0");
	СписокВнутр.ДобавитьЗначение("0");
	СписокВнутр.ДобавитьЗначение(Формат(ИдВида, "Ч10") + Формат(ИдОбъекта, "Ч10") + "   ");
	ЗначениеВнутр = "{" + СписокВнутр.ВСтрокуСРазделителями() + "}";
	
	Объект = ЗначениеИзСтрокиВнутр(ЗначениеВнутр);
	
	Если ТипЗначенияСтр(Объект) <> "Документ" Тогда
		глОтладка("ПриОткрытииФормыДокумента: не определён объект!  <" + Объект + ">", "!");
		Возврат;
	КонецЕсли; 
	
	ВидОбъекта = Объект.Вид();
	Заголовок = "";
	ДатаЗапретаРедактирования = глДатаЗапретаРедактирования(ВидОбъекта, Заголовок);
	
	Если Объект.ДатаДок <= ДатаЗапретаРедактирования Тогда
		КонтПросмотра = ПараметрФормы;
		ОткрытьФорму(Объект, КонтПросмотра, 1);
		//Сообщить("Документ открыт только для просмотра!!!");
		Если ТипЗначенияСтр(КонтПросмотра) = "ГрупповойКонтекст" Тогда
			КонтПросмотра.Форма.Заголовок("[" + Заголовок + " по " + ДатаЗапретаРедактирования + "]", 1);
		КонецЕсли;
		ФСО = 0;
	КонецЕсли;	
	// не оставляет записей в журнале регистрации
КонецПроцедуры //ПриОткрытииФормыДокумента

Код как есть, ненужное удалить

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

Цитата: item от Вчера в 12:48Надо работать с ПриОткрытииФормыДокумента
О, хорошо. Возможно что это самый рабочий вариант. Посмотрю в эту сторону. Справочники и форму операции - надо будет подумать.
С другой стороны, ПередОткрытием()-ПослеОткрытия() сделают тоже самое. Ведь ПриОткрытииФормыДокумента я всё равно не знаю, будет ли потом ставиться Форма.ТолькоПросмотр(1), так что пока форма не откроется не знаю, надо ли её переоткрывать. Т.е мне надо как-то запомнить флРежимПросмотра в привязке к конкретной форме, чтобы ПослеОткрытия проанализировать.
А после того как формат открылась - я в ПослеОткрытия() могу сравнить что было и что стало и прниять решение о переоткрытии. И тут ПередОткрытием() более универсальна, чем ПриОткрытииФормыДокумента(), а делает тоже самое. В обоих случаях, правда, есть проблемка - как быть увереннным, что запомненный статус открытия соответствует форрм в ПослеОткрытия и стоит ли вообще на это заморачиваться.

Программное ОткрытьФорму не делает запись в журнал регистрации, на это и надо. Запись сделало исходное открытие, а переоткрытие - не сделает.

В исходный алгоритм надо будет добавить ещё и анализ СтатусВозврата() - чтобы не дёргать переоткрытие без надобности.