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

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

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

Злоп

даже если была бы глобальная ПриОткрытии() - как бы получилось извернуться используя только её?

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

Цитата: Злоп от 07 апреля 2026, 23:01даже если была бы глобальная ПриОткрытии() - как бы получилось извернуться используя только её?
Я подумал - никак.

Наверное, всё уже есть, надо будет проверить
Там выше был кусок кода в глоб.модуле.
Глобальная__ПриОткрытии:
//запоминаем Форма.Параметр, Форма.ТолькоПросмотр() и метку, если есть
ПослеОткрытия:
//анализируем попадание в условия, закрываем открытую форму, если попали
ПослеЗакрытия:
//открываем новую форму с учетом метки и параметра

Наверное так должно сработать.






Злоп


Злоп

Цитата: Харлампий Дымба от 07 апреля 2026, 23:21Я подумал - никак.
Штрилиц подумал.
Ему понравилось и он решил подумать ещё раз.


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

Разрывная - пораскинул мозгами Штирлиц.

Цитата: Злоп от 07 апреля 2026, 23:32Отпишись потом что получилось
Не получилось. Не проканало - ПослеЗакрытия забирает с собой и переоткрытую форму.

Тут ещё вот в чём заковыка: как оказалось, код в некоторых формах предполагает возможность изменения объекта, если Форма.ТолькоПрсомотр(1). Например, "крыж" - то есть рядовой бух может открыть документ из заблокированного периода ( форма открыта в режиме редактирования, но при этом встанет флаг Форма.ТолькоПросмотр(1), сравнить с бумажным оригиналом и поставить "крыж" (нажатием кнопки реквизит "Сверка" Число 1.0 документа) - при этом документ будет записан и закрыт. Так вот, если документ будет открыт/переоткрыт в режиме только чтения, то любые изменения реквизитов будут проигнорированы, поставить "крыж" не получится - надо будет менять подход. Мы недавно тут разбирались с этим.

Т.е. я хотел универсального решения, но если оно будет мешать работать уже работающему, то такое решение не подойдёт. Ну и плюс моргание на переоткрытие, и куча лишнего кода с проверками при открытии любой формы.

То что коллеги расписали, в любом случае пригодится - и для расширения кругозора, и как образец кода / подхода. Спасибо, а эту задачку я пока отложу в ящик.




item

Период закрывают, чтобы не полетели итоги при перепроведении. А что касается второстепенных реквизитов, различных статусов, комментов и прочих, есть смысл реализовать их изменение вне документа, например, в журнале, без перепроведения.

Злоп

Цитата: Харлампий Дымба от 08 апреля 2026, 22:54сравнить с бумажным оригиналом и поставить "крыж" (нажатием кнопки реквизит "Сверка" Число 1.0 документа)
.
такие штуки можно делать по той же кнопке "сверено", только порождать событие, которое сработает (ГМ) после закрытия по этой кнопке, формы уже нет, просто меняешь документ и все.

Злоп


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

Если локально, то
НачатьТранзакцию();
ФормаОткрытаВРежимеРедактирования = Записать();
ОтменитьТранзакцию();

Злоп

Цитата: Харлампий Дымба от 13 апреля 2026, 22:03Если локально, то
НачатьТранзакцию();
ФормаОткрытаВРежимеРедактирования = Записать();
ОтменитьТранзакцию();

Это еще один способ определить режим открытия формы?

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

Цитата: Злоп от 14 апреля 2026, 10:08Это еще один способ определить режим открытия формы?
Нуу, пока единственный мне известный. Не очень красивый, правда. А какие другие?

Есть ещё ПриОткрытииФормыДокумента() из Formex - тот что Эдуард показал. Но он работает только для документов же.

Решение от Александра - показывает как переоткрыть форму, а не как определить режим открытия. Если "Фабрика событий" уже вмонстрячена в конфу - хорошо.




Злоп


sau

Сделал так:

Процедура ОбработкаБлокировкиОбъекта(Объект,Повторить,ДополнительныйТекст)
    Если ТипЗначенияСтр(Объект)="Документ" Тогда
        Сервис.ВнешнееСобытие("Открыть","Объект",ЗначениеВСтрокуВнутр(глЗаблокированныйОбъект));
    КонецЕсли;
КонецПроцедуры

Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
    Если Источник="Открыть" Тогда
        Если Событие="Объект" Тогда
            ОткрытьФорму(ЗначениеИзСтрокиВнутр(Данные),,1);
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Т.е. если документ открыт кем-то в режиме редактирования, то после сообщения о блокировке открывается документ в режиме просмотра (сама идея понравилась, спасибо автору)

Злоп

я проще сделал
по умолчанию - все открывается в режиме просмотра (это штатно настраивается).
кому надо - не заломается нажать шифт+энтер (открыть в режиме редактирования).
блокировки/проблемы - практически ушли.

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

Цитата: Злоп от 15 апреля 2026, 11:54#23 - вроде ж работает...
Что-то я затупил. Да, работает. И в #10 я практически это же показывал:
Процедура Глобальная_ПриОткрытии(Конт) //Formex
    глИзначальныйРежимОткрытияФормы    = Конт.Форма.ТолькоПросмотр();
КонецПроцедуры

Но в целом идея переоткрывать все формы оказалась бесполезной - решение не универсальное, потому что оно может поломать мне код в неожиданных местах. Просто коллеги сделали упор на самом очевидном и частом - блокировке документов по дате запрета. Эта проверка и так почти у всех вынесена в глобальный модуль, вызывается как правило ПриОткрытии(), перехватить и обработать там её не составляет труда. Но есть ещё куча причин (глобальный поиск по Форма.ТолькоПросмотр(1) по своей конфе), когда форма справочника/документа пользователю блокируется на просмотр.
Цитата: item от 09 апреля 2026, 01:03Период закрывают, чтобы не полетели итоги при перепроведении.
- это очень упрощенный подход, факты хозяйственной деятельности состоят не только из количественно-суммовых показателей, но и другой атрибутивной информации. Пример со статусом документа я уже приводил, или вот собственник хочет иметь бухгалтерскую отчетность к 14 числу и период к этому моменту мы окончательно блокируем, фиксируя суммовые показатели, а  Декларация по НДС сдается 27го и есть неделя после подготовки бухотчетности, чтобы спокойно выверить и при необходимости исправить даты и номера входящих документов. Изменение атрибутов можно организовать и из журнала, но из открытого документа удобнее. А для этого надо иметь возможность его записать, даже при Форма.ТолькоПросмотр(1). И, кстати, 1С предоставляет для этого кучу возможностей: ПриЗаписиПерепроводить(0), снятая галка "Автоматическое удаление движений" + ОчиститьДвижения(), возможность программно Записать() объект в обход проверок ПриЗаписи().

Цитата: sau от 15 апреля 2026, 12:36.е. если документ открыт кем-то в режиме редактирования, то после сообщения о блокировке открывается документ в режиме просмотра
В FormExe красиво получилось, здорово. Немного не про мою задачу, "Запись заблокирована!" это когда кто-то уже открыл на редактирование, а второй пытается сделать то же. И чтобы второму не делать лишних телодвижений, стоит предварительно проверить, не заблокирован ли уже объект. Сделал себе когда-то давно такое через типовое "Если Блокировка(1)=1", не так красиво и универсально, но вполне сносно работает.

Цитата: Злоп от 15 апреля 2026, 14:34по умолчанию - все открывается в режиме просмотра (это штатно настраивается).
кому надо - не заломается нажать шифт+энтер (открыть в режиме редактирования).
Жёстко. Но боюсь мои юзеры, тихонько матерясь, будут со временем открывать все формы по shift-enter: так проще чем думать: "понадобится ли мне редактировать эту форму или достаточно будет просмотра". В целом, это же все решено правами доступа, и если на какие-то объекты у юзера есть право "Корректировка", то есть большая вероятность, что эти объекты стоит открывать в режим редактирования. А если права нет - то объект и так будет открываться в режиме просмотра, независимо от того, что у него в Сервис-Параметры стоит.