Последние сообщения

#1
7.7 / Re: Понять в каком режиме отк...
Последний ответ от Харлампий Дымба - Сегодня в 00:51
Цитата: item от Сегодня в 00:35Не проверял, но ИД базы должен быть зашит в ИД обьекта.
Проверил, не зашит.
ЗначениеВСтрокуВнутр = {"O","0","0","410","0","0","   1745758МК "}
ИдОбъекта = 1745758
ИдВида = 410
Хвостик базы "МК " - не нашел.
#2
7.7 / Re: Понять в каком режиме отк...
Последний ответ от Харлампий Дымба - Сегодня в 00:45
Цитата: sau от Вчера в 21:48Если база распределенная
Да я вот тоже посмотрел повнимательнее:
Возможно Процедура Глобальная_ПриОткрытии(Контекст) появилось в Formexe позже, чем ПриОткрытииФормыДокумента(), но сейчас использование Глобальная_ПриОткрытии выглядит более удобным.
Я набросал решение для своей задачи, неокончательное, надо будет погонять в разных режимах:

Процедура Глобальная_ПриОткрытии(Конт) //Formex
    глИзначальныйРежимОткрытияФормы    = Конт.Форма.ТолькоПросмотр();
    глИзначальныйПараметрФормы    = Конт.Форма.Параметр;
КонецПроцедуры    
//
Процедура ПослеОткрытия(Конт)        
    ТекущийРежимОткрытияФормы = Конт.Форма.ТолькоПросмотр();
    Если (ТекущийРежимОткрытияФормы = 1) и (глИзначальныйРежимОткрытияФормы = 0) Тогда // форму перевели в режим просмотра
        ТекущийПараметрФормы = Конт.Форма.Параметр;
        Если ТекущийПараметрФормы = глИзначальныйПараметрФормы Тогда //убедимся, что ПриОткрытии не поменял Форма.Параметр()
            Если СтатусВозврата() <> 0 Тогда // не бывает, иначе ПослеОткрытия не сработает, но посдтрахуемся
                ТипКонтекста = глВернутьТипКонтекста(Конт);
                Если (ТипКонтекста = "Справочник") или (ТипКонтекста = "Документ") Тогда
                    Если Конт.Выбран() = 1 Тогда
                        ТекОбъект = ?(ТипКонтекста = "Справочник", Конт.ТекущийЭлемент(), Конт.ТекущийДокумент());
                        ОткрытьФорму(ТекОбъект, глИзначальныйПараметрФормы, 1);
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;    
КонецПроцедуры   

Контролировать флаги ВводНаОСновании, СвязанС, Владелец и тд - мне не надо, так как интересуют открытие форм уже существующих элементов/документов. глВернутьТипКонтекста() легко гуглится.
Простого решения определить режим открытия формы не нашел, но обойдусь и без него.
И спасибо АЛьФу за формекс!
#3
7.7 / Re: Понять в каком режиме отк...
Последний ответ от item - Сегодня в 00:35
Не проверял, но ИД базы должен быть зашит в ИД обьекта.
#4
7.7 / Re: Понять в каком режиме отк...
Последний ответ от sau - Вчера в 21:48
Если база распределенная, то из параметров процедуры ПриОткрытииФормыДокумента создать объект не получится, нужен идентификатор базы данных, в которой создан объект. Или он как-то скрыт, не нашел.
#5
7.7 / Re: Понять в каком режиме отк...
Последний ответ от Харлампий Дымба - 04 апреля 2026, 13:53
Цитата: item от 04 апреля 2026, 12:48Надо работать с ПриОткрытииФормыДокумента
О, хорошо. Возможно что это самый рабочий вариант. Посмотрю в эту сторону. Справочники и форму операции - надо будет подумать.
С другой стороны, ПередОткрытием()-ПослеОткрытия() сделают тоже самое. Ведь ПриОткрытииФормыДокумента я всё равно не знаю, будет ли потом ставиться Форма.ТолькоПросмотр(1), так что пока форма не откроется не знаю, надо ли её переоткрывать. Т.е мне надо как-то запомнить флРежимПросмотра в привязке к конкретной форме, чтобы ПослеОткрытия проанализировать.
А после того как формат открылась - я в ПослеОткрытия() могу сравнить что было и что стало и прниять решение о переоткрытии. И тут ПередОткрытием() более универсальна, чем ПриОткрытииФормыДокумента(), а делает тоже самое. В обоих случаях, правда, есть проблемка - как быть увереннным, что запомненный статус открытия соответствует форрм в ПослеОткрытия и стоит ли вообще на это заморачиваться.

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

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

Код как есть, ненужное удалить
#7
7.7 / Re: Понять в каком режиме отк...
Последний ответ от item - 04 апреля 2026, 12:55
Для формы, открытой в просмотре, Модифицированность всегда 0, и Форма.Обновить(1), и программная модификация любых атрибутов не изменит это признак.
Это для задачи по определению, как была открыта форма.
Блокировка не решение, потому что форма может быть открыта на просмотр, а обьект заблокирован другим пользователем, в результате  неверный ответ.
#8
7.7 / Re: Понять в каком режиме отк...
Последний ответ от item - 04 апреля 2026, 12:48
Надо работать с ПриОткрытииФормыДокумента, там нет записи в журнале регистрации об открытии, и там уже открывать на только просмотр.
С элементами не так красиво.
Возможно, ФормаПослеСоздания (1срр, могу ошибиться) надо ковырять, она срабатывает раньше всех, но здесь надо классы оформлять.
#9
7.7 / Re: Понять в каком режиме отк...
Последний ответ от Харлампий Дымба - 04 апреля 2026, 12:23
Полностью задача:
Форма.ТолькоПросмотр(1) и открытие в режиме просмотра - разные вещи и глобально (блокировка объекта на запись) и в нюансах работы с формой (вот тут интересно, надо будет поковыряться на досуге).
Есть желание сделать что-то универсально, чтобы если в ПриОткрытии было установлено Форма.ТолькоПросмотр(1) (дата запрета редактирования документа, статус сверки, другие проверки) форма просто переоткрывалася в режиме просмотра.

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

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

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

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

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

#10
7.7 / Re: Понять в каком режиме отк...
Последний ответ от item - 04 апреля 2026, 00:34
Форма.ТолькоПросмотр()

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