1с 8 запрет открытия формы
Задача: сделать так, чтобы пользователь мог выбрать элемент из списка выбора, но при этом не мог открыть элемент для просмотра.
В старые добрые времена такая задача выполнялась с помощью запрета на открытие формы элемента для пользователя, у которого нет соответствующего разрешения, а разрешения, назначенные пользователям, хранились в в регистре сведений.
Однако, времена меняются, горизонты расширяются, поэтому попробуем получить нужный результат с помощью системы ограничения доступа RLS.
Имеем программу 1С: ERP 2, в которой нас интересует, например, документ "Заявка на расходование денежных средств". Назначим пользователю такие права доступа, чтобы он, создавая заявку на расходование денежных средств с типом операции "Выдача ДС подотчётнику", мог для реквизита "Подотчётное лицо" выбрать физическое лицо из списка выбора, но не мог открыть элемент для просмотра.
В типовой конфигурации ERP есть несколько ролей с правом чтения справочника "Физические лица", но предустановленные в них ограничения доступа не позволяют настроить систему так, как требует задача. Поэтому создадим новую роль и назовём её, к примеру, "ЧтениеФизическихЛицБезПросмотра".
Настроим для созданной роли доступ к справочнику "Физические лица".
Первой приходит мысль установить разрешение "Чтение" и не устанавливать разрешение "Просмотр". Воплощение мысли в жизнь, сохранение конфигурации, запуск в режиме "Предприятие", обновление параметров ограничения доступа, проверка. Увы, при такой настройке система не позволяет даже открыть список выбора. Ошибка "У пользователя недостаточно прав для работы с базой даных".
Следующая мысль – установить права "Чтение", "Просмотр", и для права "Чтение" настроить ограничение доступа RLS таким образом, чтобы поля "Ссылка" и"Наименование" были доступны, а все остальные нет. Делаем:
Условием "Где Истина" предоставляем доступ к полям "Ссылка" и "Наименование", а ко всем остальным закрываем доступ условием "Где Ложь".
Проверяем работу ограничения и видим, что прогресс есть, но не совсем достаточный: форма выбора открывается, однако она пуста.
Переходим к следующей идее. Раз уж не получается скрыть все поля, а показать только разрешённые, то попробуем пойти от противного — запретим только те поля, которые не должны быть доступны пользователю:
Снова проверяем, что получилось. Список выбора открывается, и он заполнен значениями. Пробуем открыть элемент — элемент не открывается, ошибка: "У пользователя недостаточно прав для работы с базой данных". В принципе, такое поведение системы условию задачи удовлетворяет. Разумеется, если нужно ещё как-то ограничивать список физических лиц, например по организации, то соответствующие ограничения доступа нужно добавлять.
ZhenyaYa --> ZhenyaYaНу или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет Kutuzov --> Kutuzov
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет
А надо ли открывать документ или справочник с кодом 33?
если нет, тогда открыть форму модально надо
Чем дальше в лес, тем толще партизаны.
Нельзя недооценивать, не предсказуемость тупизны. ZhenyaYa --> ZhenyaYa
простите, не понял вопрос.
если я открою документ 33 модально, так я тогда вообще ничего открыть не смогу, а мне нужно запрет именно на соответствующий элемент справочника Zaval --> Zaval
Так не пойдет, давайте конкретнее.
Какая связь между доком "32" и справочником "32*. В чем вообще смысл такой блокировки?
Может просто слегка развить много где имеющийся механизм, блокирующий изменение некоторых реквизитов справочника при наличиии в системе документов определенного вида?
В доке есть реквизит, ссылаемый на справочник, и наоборот
При открытии, как и при записи, справочника происходит изменение документа соответствующего ему документа, и наоборот. Может получится неразбериха.
Это уже неразбериха. При открытии ничего меняться не должно в принципе. Давайте реальный пример.
2. Просто наличие проведенных документов.
ZhenyaYa --> ZhenyaYaСогласен, погорячился
Не при открытии, а во время работы, запустили процедуру в доке, в справочнике поменялась информация, плюс при записи дока информация меняется.
Реальный пример очееень долго нужно будет объяснять) Просто подскажите можно ли это сделать каким то способом? Если нет, буду искать как обойти.
Zaval --> Zaval
зробіть скріншоти чи відео
Не при открытии, а во время работы, запустили процедуру в доке, в справочнике поменялась информация, плюс при записи дока информация меняется.тобто двічі при роботі із одним документом інформація змінюється в одному і тому ж елементі довіднику? Zaval --> Zaval
Ну или как переловить, открыта ли форма документа "32", тогда можно будет вписать в справочник ПриОткрытии запрет
Ну, как вариант, завести глобальную переменную - флаг, в которую при открытии документа "32" будет записываться какая-то инфа. А при октрытии элемента справочника - анализировать оную инфу и, в случае необходимости, блокировать открытие формы элемента. Как-то так.
ZhenyaYa --> ZhenyaYaНе получалось у меня это сделать с помощью блокировки. возможно я что то не так делал. можно поподробней?
ZhenyaYa --> ZhenyaYaСделал по совету Faiden
в глоб:
Хотя. Обойти все равно можно : открыть другой документ, и значение в глВозвр поменяется. Придется запрещать вообще открытие всех доков при этом.
Vofka --> VofkaZhenyaYa, храните не просто глобальную переменную, а глобальную переменную в виде таблицы значений с 2 колонками: Документ, Справочник. При открытии документа туда будет добавляться строка какой документ какой элемент справочника блокирует. Так же при открытии проверяйте есть ли в таблице элемент справочника, который в данном документе. Если есть - значит документ не открываем и пишем, что элемент заблокирован таким-то документом. При закрытии, соответственно, удаляем соответствующую строку из таблицы.
ZhenyaYa --> ZhenyaYaСпасибо Работает как надо
Еще один вопрос, я в глобальном переменной глВозвр делаю таблицей значений в процедуре ПриНачалеРаботыСистемы
а значения в нее добавляю в другой процедуре
Cthulhu --> Cthulhuкхм.
а что, если один пользователь открыл документ "ЫЫЫ" (который будет пытаться откорректировать элемент справочника "ыыы") - а другой пользователь в это время открыл элемент справочника "ыыы" (который будет пытаться откорректировать документ "ЫЫЫ", котороый открыт у первого пользователя), ммм.
При открытии, как и при записи, справочника происходит изменение документа соответствующего ему документа, и наоборот. Может получится неразбериха.
Читайте также: