Есть ли простой способ (можно с Formex) из формы элемента/документа понять в каком режиме она открыта - на просмотр или на изменение?
СоздатьОбъект
НайтиДокумент
Блокировка(1)
Так не получится?
Форма.ТолькоПросмотр()
Если 1, можно изменить любой реквизит, если получилось, значит не в просмотре
Полностью задача:
Форма.ТолькоПросмотр(1) и открытие в режиме просмотра - разные вещи и глобально (блокировка объекта на запись) и в нюансах работы с формой (вот тут интересно, надо будет поковыряться на досуге).
Есть желание сделать что-то универсально, чтобы если в ПриОткрытии было установлено Форма.ТолькоПросмотр(1) (дата запрета редактирования документа, статус сверки, другие проверки) форма просто переоткрывалася в режиме просмотра.
Т.е. при работающем формексе
Процедура ПослеОткрытия(Контекст)
Если Контекст - существующий элемент/группа справочника или документ или операция, открыт в режиме редактирования, а Контекст.Форма.ТолькоПросмотр() = 1, то закрыть и заново ОткрытьФорму(,,1) с учетом модальности и метки формы (идентификатора).
Все остальное вроде простое, и хотелось также что-то простое для определения режима открытия.
Варианты чуть посложнее есть:
Анализировать изменение Форма.ТолькоПросмотр() ПередОткрытием и ПослеОткрытия выглядит самым простым (если не считать необходимости контролить, а один и тот же контекст в обоих этих вызовах?)
Цитата: trad от 03 апреля 2026, 21:58Блокировка(1)
Блокировка(1) - там будут нюансы, связанные с тем, что открытую форму операции она считает блокировкой документа и наоборот. Плюс открытия форм с меткой (несколько к одному объекту). В целом, возможно рабочий вариант.
Думал ещё про Записать() в транзакции - мне не нравится. И сомневаюсь, что работает.
Цитата: item от 04 апреля 2026, 00:34Форма.ТолькоПросмотр()
Форма.ТолькоПросмотр() будет давать 1 в обоих случаях и если форма изначально была открыта в режиме просмотра и если ПриОткрытии для формы был установлен флаг Форма.ТолькПросмотр(1), а это, как я писал выше, может быть 2 большие разницы.
Надо работать с ПриОткрытииФормыДокумента, там нет записи в журнале регистрации об открытии, и там уже открывать на только просмотр.
С элементами не так красиво.
Возможно, ФормаПослеСоздания (1срр, могу ошибиться) надо ковырять, она срабатывает раньше всех, но здесь надо классы оформлять.
Для формы, открытой в просмотре, Модифицированность всегда 0, и Форма.Обновить(1), и программная модификация любых атрибутов не изменит это признак.
Это для задачи по определению, как была открыта форма.
Блокировка не решение, потому что форма может быть открыта на просмотр, а обьект заблокирован другим пользователем, в результате неверный ответ.
Процедура ПриОткрытииФормыДокумента(ФСО, ИдВида, ИдОбъекта, ИдЖурнала, п4, ИдКопии, ИтТекущего, ВводНаОсновании, ИдВидаОснования, ТолькоПросмотр, п10, п11, п12, п13, ПараметрФормы) // предопределенная формекс
Перем Объект, ВидОбъекта, МетаТип, ДатаЗапретаРедактирования, Заголовок;
глОтладка("ПриОткрытииФормыДокумента:" + ИдВида + ":" + ИдОбъекта);
Если ИдВида = 0 Тогда // хз, но вдруг
Возврат;
ИначеЕсли ИдОбъекта = 0 Тогда // новый объект
Возврат;
ИначеЕсли ТолькоПросмотр = 1 Тогда
Возврат;
КонецЕсли;
// определение объекта
СписокВнутр = ЗначениеИзСтроки("{""СписокЗначений"",{}}");
СписокВнутр.ДобавитьЗначение("O"); // O - метка документа
СписокВнутр.ДобавитьЗначение("0");
СписокВнутр.ДобавитьЗначение("0");
СписокВнутр.ДобавитьЗначение("0");
СписокВнутр.ДобавитьЗначение("0");
СписокВнутр.ДобавитьЗначение("0");
СписокВнутр.ДобавитьЗначение(Формат(ИдВида, "Ч10") + Формат(ИдОбъекта, "Ч10") + " ");
ЗначениеВнутр = "{" + СписокВнутр.ВСтрокуСРазделителями() + "}";
Объект = ЗначениеИзСтрокиВнутр(ЗначениеВнутр);
Если ТипЗначенияСтр(Объект) <> "Документ" Тогда
глОтладка("ПриОткрытииФормыДокумента: не определён объект! <" + Объект + ">", "!");
Возврат;
КонецЕсли;
ВидОбъекта = Объект.Вид();
Заголовок = "";
ДатаЗапретаРедактирования = глДатаЗапретаРедактирования(ВидОбъекта, Заголовок);
Если Объект.ДатаДок <= ДатаЗапретаРедактирования Тогда
КонтПросмотра = ПараметрФормы;
ОткрытьФорму(Объект, КонтПросмотра, 1);
//Сообщить("Документ открыт только для просмотра!!!");
Если ТипЗначенияСтр(КонтПросмотра) = "ГрупповойКонтекст" Тогда
КонтПросмотра.Форма.Заголовок("[" + Заголовок + " по " + ДатаЗапретаРедактирования + "]", 1);
КонецЕсли;
ФСО = 0;
КонецЕсли;
// не оставляет записей в журнале регистрации
КонецПроцедуры //ПриОткрытииФормыДокумента
Код как есть, ненужное удалить
Цитата: item от 04 апреля 2026, 12:48Надо работать с ПриОткрытииФормыДокумента
О, хорошо. Возможно что это самый рабочий вариант. Посмотрю в эту сторону. Справочники и форму операции - надо будет подумать.
С другой стороны, ПередОткрытием()-ПослеОткрытия() сделают тоже самое. Ведь ПриОткрытииФормыДокумента я всё равно не знаю, будет ли потом ставиться Форма.ТолькоПросмотр(1), так что пока форма не откроется не знаю, надо ли её переоткрывать. Т.е мне надо как-то запомнить флРежимПросмотра в привязке к конкретной форме, чтобы ПослеОткрытия проанализировать.
А после того как формат открылась - я в ПослеОткрытия() могу сравнить что было и что стало и прниять решение о переоткрытии. И тут ПередОткрытием() более универсальна, чем ПриОткрытииФормыДокумента(), а делает тоже самое. В обоих случаях, правда, есть проблемка - как быть увереннным, что запомненный статус открытия соответствует форрм в ПослеОткрытия и стоит ли вообще на это заморачиваться.
Программное ОткрытьФорму не делает запись в журнал регистрации, на это и надо. Запись сделало исходное открытие, а переоткрытие - не сделает.
В исходный алгоритм надо будет добавить ещё и анализ СтатусВозврата() - чтобы не дёргать переоткрытие без надобности.
Если база распределенная, то из параметров процедуры ПриОткрытииФормыДокумента создать объект не получится, нужен идентификатор базы данных, в которой создан объект. Или он как-то скрыт, не нашел.
Не проверял, но ИД базы должен быть зашит в ИД обьекта.
Цитата: sau от 05 апреля 2026, 21:48Если база распределенная
Да я вот тоже посмотрел повнимательнее:
Возможно Процедура Глобальная_ПриОткрытии(Контекст) появилось в Formexe позже, чем ПриОткрытииФормыДокумента(), но сейчас использование Глобальная_ПриОткрытии выглядит более удобным.
Я набросал решение для своей задачи, неокончательное, надо будет погонять в разных режимах:
Процедура Глобальная_ПриОткрытии(Конт) //Formex
глИзначальныйРежимОткрытияФормы = Конт.Форма.ТолькоПросмотр();
глИзначальныйПараметрФормы = Конт.Форма.Параметр;
КонецПроцедуры
//
Процедура ПослеОткрытия(Конт)
ТекущийРежимОткрытияФормы = Конт.Форма.ТолькоПросмотр();
Если (ТекущийРежимОткрытияФормы = 1) и (глИзначальныйРежимОткрытияФормы = 0) Тогда // форму перевели в режим просмотра
ТекущийПараметрФормы = Конт.Форма.Параметр;
Если ТекущийПараметрФормы = глИзначальныйПараметрФормы Тогда //убедимся, что ПриОткрытии не поменял Форма.Параметр()
Если СтатусВозврата() <> 0 Тогда // не бывает, иначе ПослеОткрытия не сработает, но посдтрахуемся
ТипКонтекста = глВернутьТипКонтекста(Конт);
Если (ТипКонтекста = "Справочник") или (ТипКонтекста = "Документ") Тогда
Если Конт.Выбран() = 1 Тогда
ТекОбъект = ?(ТипКонтекста = "Справочник", Конт.ТекущийЭлемент(), Конт.ТекущийДокумент());
ОткрытьФорму(ТекОбъект, глИзначальныйПараметрФормы, 1);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Контролировать флаги ВводНаОСновании, СвязанС, Владелец и тд - мне не надо, так как интересуют открытие форм уже существующих элементов/документов. глВернутьТипКонтекста() легко гуглится.
Простого решения определить режим открытия формы не нашел, но обойдусь и без него.
И спасибо АЛьФу за формекс!
Цитата: item от 06 апреля 2026, 00:35Не проверял, но ИД базы должен быть зашит в ИД обьекта.
Проверил, не зашит.
ЗначениеВСтрокуВнутр = {"O","0","0","410","0","0"," 1745758МК "}
ИдОбъекта = 1745758
ИдВида = 410
Хвостик базы "МК " - не нашел.
Мы через класс ФабрикуСобытий так сделали.
Функция СобытиеГМ_ПриОткрытии(Конт, ФлагЧтенияНастройки) Экспорт
......
Рез=ПроверкаРазрешенияРедактирования(КонтФормы);
Если Рез=0 Тогда
......
ИначеЕсли Рез=-1 Тогда
ДокИнв=КонтФормы.ТекущийДокумент(); //Переменная для внешнего события
Сервис.ВнешнееСобытие("Фабрика","ПриОткрытии","ОткрытьТолькоНаПросмотр"); //Открываем повторно форму в режиме ТолькоПросмотр только через ВнешнееСобытие, т.к. иначе глюки с открытием
Возврат 0;
ИначеЕсли Рез=-10 Тогда
СообщитьВОтладке(""+ТекущееВремя()+" КОНЕЦ "+л_ИмяСобытия+" НЕ разрешаем открывать форму");
Возврат 0;
КонецЕсли;
Функция Событие_ОбработкаВнешнегоСобытия(Источник,Событие,Данные) Экспорт //+Al 2016-04-13 16:53:09 глобальная (СобытиеГМ_) перехватывается при вызове Сервис.ВнешнееСобытие из глМодуля
//!!! При открытии форм из ПриНачалеРаботыСистемы теряется контекст откуда вызывалось ВнешнееСобытие. КонтФормы будет = последней открытой форме. Это, по всей видимости, глюк перехватчика из ВК 1с++
Перем л_ИмяСобытия,ЕстьМетод,ИмяМетода;
л_ИмяСобытия = ""+ID+" ФабрикаСобытий Событие_ОбработкаВнешнегоСобытия() ";
СообщитьВОтладке(""+ТекущееВремя()+" НАЧАЛО "+л_ИмяСобытия+" Источник="+Источник+" Событие="+Событие+" Данные="+Данные);
СообщитьВФайл("НАЧАЛО "+л_ИмяСобытия+" Источник="+Источник+" Событие="+Событие+" Данные="+Данные,"ФабрикаСобытий"); //+Al 2024-06-13 11:54
Если Данные="ОткрытьТолькоНаПросмотр" Тогда
ОткрытьФорму(ДокИнв,,1);
ДокИнв=0;Рез=0;
ИначеЕсли Данные="ОткрытьНаРедактирование" Тогда
ОткрытьФорму(ДокИнв,,0);
ДокИнв=0;Рез=0;
......
Что-то я разочаровался в своем решении. Идея-то была не вынести контроль ПриОткртыии (типа даты запрета редактирования) в единое место, а сделать переоткрытия для любых форм, которым в локальной ПриОткрытии был установлен Форма.ТолькоПросмотр(1). То есть контроль идет уже ПОСЛЕ локальной ПриОткрытии. А тут есть только формексовская Глобальная_ПослеОткрытия, которая вызывается когда форма уже открыта. И тут затык с закрытием формы: пока форма открыта - её не переоткроешь, как только закрыл - выполнение Глобальная_ПослеОткрытия завершилось, форму неоткуда открывать. И начинатся огород - через Сервис.ВнешнееСобытие делать, через ПослеЗакрытия? ну и как-то пока не понравилось, красоты не получилось.
Бонус: код
Процедура ПриОткрытии()
ОткрытьФорму(ТекущийДокумент(),,1);
КонецПроцедуры // ПриОткрытии()валит 1С напрочь при открытии существующего документа.
Если в модуле формы документа в самом низу написать
Если Форма.ТолькоПросмотр() = 0 Тогда
// тут еще можно флаг взвести чтобы в ПриОткрытии() сделать СтатусВозврата(ФлагКоторыйНоль)
ОткрытьФорму(ТекущийДокумент(),,1);
КонецЕсли;
то у меня спокойно открываются две формы документа - одна на редактирование и одна в режиме просмотра
В ПриОткрытии надо очень осторожно со всякими манипуляциями формы до завешения полной инициализации формы. Я еще когда для ТСД писал пришел к тому что когда в ПриОткрытии надо например запустить другую форму для ввода каких-то промежуточных данных и вернуться обратно, то это в итоге делалось через ОО.
ПослеОткрытия точно тупиковая ветка.
Послушайте Злопа, юзайте ПриОткрытии или ПослеСозданияФормы, она то и появилась гораздо позже и для обработок до прорисовки формы.
И нехер думать, будет форма выставлена в просмотр в локальном контексте или нет, надо её по-любому перезапускать, чтобы не допускать лишних блокировок...
... и лазеек в виде кнопок, которыми можно обойти запрет на редактирование.
Поставьте в настройках "режим открытия = Просмотр", при энтере или жмаком мышью на документе будет открываться на просмотр. шифт+энтер - на редактирование.
.
Перехват команд меню "открыть на редактирование" сделать глобальными формексовскими
Цитата: Злоп от 07 апреля 2026, 09:15то у меня спокойно открываются две формы документа - одна на редактирование и одна в режиме просмотра
Ну да, только требуется ровно обратное - открыть форму в режиме чтения когда в ПриОткрытии Форма.ТолькоПросмотр() = 1.
Если Форма.ТолькоПросмотр() = 1 Тогда
ОткрытьФорму(ТекущийДокумент(),,1);//портал в бесконечный цикл открытий
КонецЕсли;
Если в модуле формы (внизу, после всех процедур/функций самым первым оператором
получаем что Форма.ТолькоПросмотр()=1 - еще ни одна предопределенная процедура не выполнялась.
Этот код отрабатывает самым первым, при инийиализации модуля формы.
Никакие программные установки режима просмотра еще не отрабатывали, форма изначально открыта в режиме просмотра (из меню или программно с передачей параметра режима открытия = просмотр.
.
?
// модуль формы
ОткрытВРежимеРедактирования = 1-Форма.ТолькоПросмотр();
а дальше уже смотри в ПриОткрытии() в нужном месте
Если ОткрытВРежимеРедактирования = Форма.ТолькоПросмотр() Тогда
// был открыт в режиме редактирования, а потом переклбчили в режим просмотра
СтатусВозврата(0);
ОткрытьФорму(ТекущийДокумент(),,1);
Возврат;
КонецЕсли;
???
Цитата: Злоп от 07 апреля 2026, 21:27Поставьте в настройках "режим открытия = Просмотр", при энтере или жмаком мышью на документе будет открываться на просмотр. шифт+энтер - на редактирование.
Я не для себя - то для друга) Для 100500 пользователей.
Перехват команд вообще не вариант - куча способов открыть документ/элемент: расшифровка отчетов, меню, мышка, свои кнопки на формах. Это прям очень сильно надо заморочится.
Задача была простая: если после ПриОткрытии у формы ТолькоПросмотр()=1 и она открыта на запись, то закрыть и открыть на чтение.
Замечание: ТолькоПросмотр()=1 может быть по миллиону причин - право доступа "Корректировка" в конфгируторе, программный контроль прав доступа, служебные объекты только для избранных, открыженные документы, дата запрета, форма открыта в режиме просмотра, временный период блокировки для корректировки некоторых данных, принадлежность центр-переферийка и т.д.
Все варианты в глобальной ПриОткрытии не предусмотришь. Поэтому захотелось сделать красиво. Пока не получилось.
Цитата: Злоп от 07 апреля 2026, 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) не подходит?
Цитата: Злоп от 07 апреля 2026, 22:41от чего хотите защититься (?)
Самое очевидное - убрать блокировку объекта на запись.
да, если просмотр установлен как Форма.ТолькоПросмотр(1) - контекст формы доступен на запись.
но чтобы в таком режиме изменить документ - надо или извне доступ к контексту иметь (ВПФ) или криво форму написанную с доступом к реквизитам/кнопкам редактирования/записи.
Цитата: Харлампий Дымба от 07 апреля 2026, 22:51Цитата: Злоп от 07 апреля 2026, 22:41от чего хотите защититься (?)
Самое очевидное - убрать блокировку объекта на запись.
в настройках штатно поставить "Режим открытия = Просмотр".
ибо нефиг.
соотвнетсвенно кому надо будет открыть на изменение - не обломится шифт+энтер или жмакнуть на панели иконку редактирования.
а через перехват команд окон формексом - так и жмакание иконки редактирования зарубить, пусть через шифт+энтер тычут
даже если была бы глобальная ПриОткрытии() - как бы получилось извернуться используя только её?
Цитата: Злоп от 07 апреля 2026, 23:01даже если была бы глобальная ПриОткрытии() - как бы получилось извернуться используя только её?
Я подумал - никак.
Наверное, всё уже есть, надо будет проверить
Там выше был кусок кода в глоб.модуле.
Глобальная__ПриОткрытии:
//запоминаем Форма.Параметр, Форма.ТолькоПросмотр() и метку, если есть
ПослеОткрытия:
//анализируем попадание в условия, закрываем открытую форму, если попали
ПослеЗакрытия:
//открываем новую форму с учетом метки и параметра
Наверное так должно сработать.
Отпишись потом что получилось
Цитата: Харлампий Дымба от 07 апреля 2026, 23:21Я подумал - никак.
Штрилиц подумал.
Ему понравилось и он решил подумать ещё раз.
Разрывная - пораскинул мозгами Штирлиц.
Цитата: Злоп от 07 апреля 2026, 23:32Отпишись потом что получилось
Не получилось. Не проканало - ПослеЗакрытия забирает с собой и переоткрытую форму.
Тут ещё вот в чём заковыка: как оказалось, код в некоторых формах предполагает возможность изменения объекта, если Форма.ТолькоПрсомотр(1). Например, "крыж" - то есть рядовой бух может открыть документ из заблокированного периода ( форма открыта в режиме редактирования, но при этом встанет флаг Форма.ТолькоПросмотр(1), сравнить с бумажным оригиналом и поставить "крыж" (нажатием кнопки реквизит "Сверка" Число 1.0 документа) - при этом документ будет записан и закрыт. Так вот, если документ будет открыт/переоткрыт в режиме только чтения, то любые изменения реквизитов будут проигнорированы, поставить "крыж" не получится - надо будет менять подход. Мы недавно тут разбирались с этим.
Т.е. я хотел универсального решения, но если оно будет мешать работать уже работающему, то такое решение не подойдёт. Ну и плюс моргание на переоткрытие, и куча лишнего кода с проверками при открытии
любой формы.
То что коллеги расписали, в любом случае пригодится - и для расширения кругозора, и как образец кода / подхода. Спасибо, а эту задачку я пока отложу в ящик.
Период закрывают, чтобы не полетели итоги при перепроведении. А что касается второстепенных реквизитов, различных статусов, комментов и прочих, есть смысл реализовать их изменение вне документа, например, в журнале, без перепроведения.
Цитата: Харлампий Дымба от 08 апреля 2026, 22:54сравнить с бумажным оригиналом и поставить "крыж" (нажатием кнопки реквизит "Сверка" Число 1.0 документа)
.
такие штуки можно делать по той же кнопке "сверено", только порождать событие, которое сработает (ГМ) после закрытия по этой кнопке, формы уже нет, просто меняешь документ и все.
Цитата: Харлампий Дымба от 08 апреля 2026, 22:54ПослеЗакрытия забирает с собой и переоткрытую форму.
вот это не понял...
Если локально, то
НачатьТранзакцию();
ФормаОткрытаВРежимеРедактирования = Записать();
ОтменитьТранзакцию();
Цитата: Харлампий Дымба от 13 апреля 2026, 22:03Если локально, то
НачатьТранзакцию();
ФормаОткрытаВРежимеРедактирования = Записать();
ОтменитьТранзакцию();
Это еще один способ определить режим открытия формы?
Цитата: Злоп от 14 апреля 2026, 10:08Это еще один способ определить режим открытия формы?
Нуу, пока единственный мне известный. Не очень красивый, правда. А какие другие?
Есть ещё ПриОткрытииФормыДокумента() из Formex - тот что Эдуард показал. Но он работает только для документов же.
Решение от Александра - показывает как переоткрыть форму, а не как определить режим открытия. Если "Фабрика событий" уже вмонстрячена в конфу - хорошо.
#23 - вроде ж работает...
Сделал так:
Процедура ОбработкаБлокировкиОбъекта(Объект,Повторить,ДополнительныйТекст)
Если ТипЗначенияСтр(Объект)="Документ" Тогда
Сервис.ВнешнееСобытие("Открыть","Объект",ЗначениеВСтрокуВнутр(глЗаблокированныйОбъект));
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)
Если Источник="Открыть" Тогда
Если Событие="Объект" Тогда
ОткрытьФорму(ЗначениеИзСтрокиВнутр(Данные),,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: так проще чем думать: "понадобится ли мне редактировать эту форму или достаточно будет просмотра". В целом, это же все решено правами доступа, и если на какие-то объекты у юзера есть право "Корректировка", то есть большая вероятность, что эти объекты стоит открывать в режим редактирования. А если права нет - то объект и так будет открываться в режиме просмотра, независимо от того, что у него в Сервис-Параметры стоит.
Цитата: Харлампий Дымба от 16 апреля 2026, 02:11мои юзеры, тихонько матерясь, будут со временем открывать все формы по shift-enter: так проще чем думать: "понадобится ли мне редактировать эту форму или достаточно будет просмотра
да заради бога. у меня во многих местах для таких упорных функция на форме, и если Модифицированность = 0,то "Ок" и "Записать" неактивны. Прибегают с воплем "АААА!", "а что вы хотите" получить нажав "ОК"...? "эээ..мээээ." - Посмотрели? - "Посмотрела!" - ну и жмет "закрыть", хренг ли вы в другие кнопки лезете? ;-)
.
а так-то да, все верно, вариациями богат мир юзверей...
Ежели платыт деньги за всякую хрень - ну и норм, буду и хрень делать... (если не совсем уже муть адская), сейчас я к этому проще отношусь... Выстраивать процессы и регламенты работы - "это другое" и стоит других тугриков ;-)
.
Короче - разброд и шатание.
А Альф ушел в 8-ку...
Фиг нам дождаться доработок в формексе ;-)
Все кто переходит на 8-ку - куда-то пропадают с горизонтов... выныриывают изредка, наверное чтобы воздуха хлебнуть...