1с форма только просмотр доступность некоторых элементов
Добрый день!
Нужно, чтобы пользователь с определенной ролью не мог редактировать некоторые поля на форме.
Нашел в свойствах документа, вкладка "Права" внизу "Ограничение доступа к данным".
Там нужно выбрать поле и написать некий запрос, вот вопрос в том что в нем писать?
Варианты вроде Если РольДоступна("МояРоль") Тогда или просто РольДоступна("МояРоль") не работают.
- Вопрос задан более трёх лет назад
- 7341 просмотр
"Ограничение доступа к данным" во вкладке "Права" - это реализация механизма RLS (ограничение прав на уровне записей). Там можно настроить доступ к отдельным элементам (записям) таблицы документа или справочника. Т.е. не к отдельным реквизитам документа, а к отдельным документам, отобранным в запросе.
Вам можно просто использовать РольДоступна("МояРоль") в событие формы "При открытии" для управления доступностью отдельных элементов формы, где "МояРоль" - это роль, которой вы хотите дать право доступа к реквизитам.
Запрос писать не обязательно. Для выбранной роли и поля установите галочки требуемых прав. Если вам нужно запретить редактирование, то достаточно поставить чтение и просмотр.
gunsmyth gunsmyth
RLS буду стараться не использовать, чтобы не терять в производительности, ну и архитектурно это не очень правильно.
Вам можно просто использовать РольДоступна("МояРоль") в событие формы "При открытии" для управления доступностью отдельных элементов формы, где "МояРоль" - это роль, которой вы хотите дать право доступа к реквизитам.
>>>Я вот про эту форму говорил:
И я про нее говорил. RLS вам не нужен, в данном случае. Достаточно галочками права отметить.
Как правильно настроить доступ только на просмотр конкретным пользователям, причем у каждого из них может быть доступ к разным совершенно объектам и что делать? может для каждого свою роль Только_На_Просмотр_Иванова, Только_На_Просмотр_Петрова и т.д. - да нет, конечно, это ж бред, не красиво - значит, не правильно! я вам расскажу про одну фичу как это сделать красиво, быстро и удобно! а главное без изменения конфигурации и ролей
Очень часто встречаю одну и ту же просьбу - сделайте права "Только на просмотр" и что только народ не придумывает - самое распространенное создают новую роль, или начинают что-то изобретать в общих модулях и т.д. В общем, насмотрелся, и решил, что раз тема актуальная, а нашего брата по поддержке 1С как селедки и надо делиться своими маленькими фишками. Ну, так вот, все на самом деле как нельзя проще простого:
1. Заходим в справочник "Группы пользователей" создаем группу с именем "Только просмотр" - имя можно придумать свое.
2. У каждого нашего пользователя кому надо "Только просмотр" настраиваем роли по уровню доступа к данным – собственно, что можно смотреть, а что нет. Это тут как у вас жизнь сложилась типовые роли или доработанные не важно.
3. Назначаем группе "Только на просмотр" наших горячо люб пользователей.
4. Заходим в БД в дату запрета редактирования данных и ставим на эту группу дату эдак год 2579 месяц и день по выбору
Готово теперь ваши клиенты будут видеть все, что им положено, а вот редактировать не смогут вот и все! Пользуйтесь! Просто, но не очевидно. Кстати я таким способом еще и аудитов в базе настраиваю.
Как правильно было замечено в коментариях, для справочников доступ останется. Но всетаки частично (не все справочники) можно решить данную проблему, используя механизм доступа к объектам назначив на нашу группу "Только просмотр", доступ на просмотр как показано на скриншоте (пример УПП) по тому или иному справочнику.
Эта статья написана с целью по возможности сократить излишнии доработки и использовать типовые механизмы.
Запускаем два сеанса.
про документы.
1. Открываем в одном сеансе форму, в коде которой отрабатывает Форма.ТолькоПросмотр(1);
Если во втором сеансе открыть форму аналогично - то фиг вам, "объект заблокирован"
2. Если во втором сеансе открыть лупой "просмотр документа" с панели инструментов - то норм, откроется.
.
получается что
в 1 - объект жестко связан с формой, объект блокируется, а форма сама по себе имеет флаг 1/0
в 2 - форма документа "оторвана" от объекта, объект не блокируется.
.
вот.
и еще есть режим ОткрытьФорму(Док,параметр,РежимОткрытия=1) - интересно в этом случае форма откроется по 1 или 2?
.
и как располагая контекстом формы открытой только на просмотр узнать - она открыта с блокировкой объекта или нет?
Стучаться в метод Блокировка().
Вопрос порожден написанием ВПФ, которая модифицирует реквизиты документа, в т.ч. лежащие на форме. ВПФ должна корректно работать в разных режимах, и когда в ВПФ передан ГрупповойКонтекст (и форма доступна и только на просмотр) и когда в ВПФ передан документ. В любом случае -на до изменить реквизиты документа. Если форма открыта - то в результате - показать измененную форму.
Открыта форма, только на просмотр. Как узнать в этом же сеансе - форма открыта с блокировкой или без?
.
вроде вот так работает:
Забодался, не получается.
.
Есть родительская форма документа открытая, только на просмотр
Как сделать так, чтобы открыть из ВПФ другую модальную обработку диалоговую, которая изменяет реквизиты исходного документа и показать форму родительского документа в режиме просмотра с уже измененными реквизитами
Формекс есть, 1С++ есть, можно переоткрывать обработки прочее. Должно по возможности все "прозрачно", без лишних морганий.
.
.
И еще вопрос - как программно открыть форму документа (и соотв.справочника тоже, один механизм наверное) - в таком же режиме, как открывается на просмотр с панели инструментов на просмотр "лупой".
(6) Как я понимаю, ты либо открыл на просмотр (лупой), либо на изменение - и тогда нет разницы есть ТолькоПросмотр() или нет.
Наверное, перехватывать при открытии формы, закрывать ее и после закрытия открывать ВПФ
(8) "ты либо открыл на просмотр (лупой), либо на изменение" - нет, есть еще третий вариант ОткрытьФорму(,,1) или в открытой форме Форма.ТолькоПросмотр(1) - и еть большая разница как открыто на просмотр - лупой или программно.
(8) "как программно открыть форму документа (и соотв.справочника тоже, один механизм наверное) - в таком же режиме, как открывается на просмотр с панели инструментов на просмотр "лупой".." - этот вопрос к проблеме с формадокумента+ВПФ не относится, это отдельный вопрос
а если нужно узнать заблокирован ли объект этой формой или какой-то другой, то да: "Стучаться в метод Блокировка()"
на счет побочного эффекта от Форма.ТолькоПросмотр(0) вот
(20) Вообще не понимаю зубоскальства к Чу.
За себя скажу: за 25 лет в семерке - дофига осталось черных зон, с которыми не разбирался в виду ненужности. Ещё больше серых зон, которые просто обходил стороной, где можно было обойтись: быстро сделал, все довольны. Плюс приобретённые серые зоны - 15 лет назад разобрался, а потом ни разу не пригодилось, вот и стёрлось.
"по лупе" - то же самое что ОткрытьФорму с 1 в параметре ТолькоПросмотр.
"показать измененный" - тупо ОткрытьФорму с 1 в параметре ТолькоПросмотр (если эта форма была открыта ранее - она переоткроется т.е. обновится в соответствии с данными и активизируется)
В результате с божей помощью. АнедейАндреича итд, по сущетсу разобрался. Все ожидаемо и логично.
Но есть один затык..
исходные условия теста.
- документ записан.
- открытая форма документа.
тест
1. ОткрытьФорму(,,0) + Форма.ТолькоПросмотр(1) - Объект заблокирован, только просмотр, ВПФ из контекста формы, изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - все ок, форма только на просмотр и реквизиты изменены. Все как хотелось.
2. ОткрытьФорму(,,0) - Объект заблокирован, форма доступна редактирование, ВПФ из контекста формы, изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - все ок, форма только на доступна на изменение, реквизиты изменены. все как хотелось.
2. ОткрытьФорму(,,1)+Форма.ТолькоПросмотр(1) - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
4. ОткрытьФорму(,,1) - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
5. Лупа "на просмотр" - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
6. Лупа "на просмотр"+Форма.ТолькоПросмотр(1) - Объект свободен (логично), только просмотр, ВПФ из контекста формы изменяем реквизиты контекста. Контекст.Форма.Обновить()+Контекст.Записать() - ничего не ругается, все типа ок, форма только на просмотр и реквизиты НЕ изменены (что как бы тоже логично). Тут как бы понятно, но не то что хотелось.
итого: при изменении реквизитов контекста формы
- обновление реквизитов на форме (и в объекте) ПРОИСХОДИТ когда объект заблокирован, в пп.1,2 - то что надо
- обновление реквизитов на форме (и в объекте) НЕ происходит когда объект свободен, в пп.2-6 - это не устраивает.
Хочется, значит, в пп.2-6 - в ВПФ проверяем свободен ли объект- документ текущего контекста формы (это сумеем), и если объект-документ свободен -
тогда реквизиты объекта меняем не через контекст формы, а через объект (это тоже сумеем). ОК.
. Но после изменения объекта - хочется актуализировать отображение формы, открытой ранее на просмотр, для отображения изменившихся реквизитов.
И тут вот затык - сделать как из ВПФ переоткрыть форму в режиме просмотра?
И что важно - без правки типовой конфы?!
Всем спасибо, кто участвует.
Ёпрсту - по ссылкам знамо вестимо, но у себя не юзаю. Первое - потрому что блокирвоки на документах я уже не помню когда были, в оперативной работе это вообще несущественно. у мняе девки доки открывают на ввод редко, а если и открывают - то непересекающиеся друг с другом по сферам ответсвенности. И быстрый поиск - хотел впилить, даже пробовал, но тоже парктически неактуально ввиду отствуифя значительной ручной работы с ассортиментом
(22) ну, Добропом я по жизни, это на мисте Злопом. А добропом еще на ИС в районе 2008 г. была публикация учета черных бонусов в ppt,в финише слайдов добропом был.. ;-)
(31) что мешает в ПриОткрытии() влепить
Только, на сколько я помню, если в пофигураторе режим редактирования установить только на просмотр (всегда , без лупы) то ты её на редактирование ужо никак не откроешь
(34) ээээ, не втыкаю.
я хочу из DGA - закрыть форму материнского (для ВПФ) контекста (форма документ ана просмотр) и из ВПФ же открыть эту материнскую форму чтобы увидет сделанные изменения.. - как?
(35) не, он тогда по энтеру будет на просмотр открываться, а через шифт+энтер - на редактирование. я так кстати и делаю у ларечников часто. сразу уходить несколько проблем с задним числом.
Да и в 7.7..обычное дело было, для изменения реквизитов дока, открывать тупо форму обработки, которая эммулирует форму самого дока и потом через ссылку дока правит его реквизиты.
Если ты хочешь делать это через контекст открытой формы, то ничто не мешает хранить хоть все значения атрибутов формы где-то еще при открытии впф, потом измененные значения пихай куда угодно, старый контекст закрой, открой новую форму с нужным режимом и перекопируй все атрибуты туда.
(41) "старый контекст закрой, открой новую форму" - ТУТ МНЕ НУЖЕН ТОТ ЖЕ САМЫЙ ОБЪЕКТ-ДОКУМЕНТ-" с нужным режимом " - ну и как это сделать при вызове DGA из "старого контекста". где-то туплю, не получается - потому как форма старого контекста закроется (ДокумКонтекст.Форма.Закрыть()) только тогда, когда ВПФ завершит работу процедуры ПриОткрытии(), а переносить код в после открытия чтобф моргало ченить ненужное на экране - не хочется
(31): ". Но после изменения объекта - хочется актуализировать отображение формы, открытой ранее на просмотр, для отображения изменившихся реквизитов. " -- так уже ж отвечено! см.(28), 2-й абзац.
в сухом остатке:
(46)+: именно так - ничего не надо закрывать, тупо такое же ОткрытьФорму - обновление ранее открытой формы без блыманий и с обновлением.
(0) Бегло прочитал, но так и не понял суть проблемы (может потому что прочитал бегло ;) ).
У меня в ВПФ fr54_ПечатьЧека.ert (у тебя она есть) делается примерно так:
Если передан Контекст, то автоматически обновятся данные на форме документа без всяких "переоткрытий" и "блымканий".
Но в типовой ТИС есть косяк для документа Реализация при передаче данных в ВПФ - вместо Контекст передается ТекущийДокумент() и поэтому возникает блокировка при попытке записать данные через ВПФ в текущий документ.
Решается так (у меня описано в ИзмененияДляКонфигурацииTIS987_54FZ.txt):
Здравствуйте.
Проблема такая , пользователь открывает форму документа у которого "ЭтаФорма.ТолькоПросмотр=Истина". Все элементы формы заблокированы , кроме Табличной части. По-идее , должно блокироваться все и у все остальные документы в базе ведут себя правильно.
Подскажите , в какую сторону копать ?
В синтаксиспомощнике написано что свойство "ТолькоЧтение" формы блокирует запись всех реквизитов формы в не зависимости от значения их свойства "ТолькоЧтение"
Ну как вру . только что получил нагоняй от руководства за эти художества .
В базе (самописная) присутствует механизм утверждения документов. При открытии документа , если он утвержден , форме ставится признак "ТолькоЧтение".
Везде работает , а именно в этом документе ТЧ не блокируется и пользователи нашли это и радостно подправили утвержденные документы.
А я тут сижу и все это вру .
С чего взял что после "ЭтаФорма.ТолькоПросмотр=Истина" нет еще кода который именно ТЧ разблокирует для редактирования?
(11) По двум причинам :
1. В описании (и полазив по форумам) понял что эта настройка игнорит все остальные "ТолькоПросмотр" других реквизитов.
2. Проверил в отладчике эту и другие формы .
ТАк стоп. Что значит пользователи меняли данные? Если в шапке все кнопки должны быть неактивные? У них даже нет возможности перезаписать документ.
Или твоя ТЧ - это записи регистра сведений?
(23) Нет . они меняют ТЧ (она ж доступна)
потом жмут "ESC" и соглашаются что нужно сохранить.
никаких команд и обработчиков.
(30) не можешь, про Форма.ТолькоПросмотр у тебя уже все элементы формы заблокированы.
А в (0) у тебя у формы явно нет этого признака.
Скорее всего, элементам по-отдельности установили ТолькоПросмотр=Истина, оставив твою ТЧ доступной.
Открой ужо отладчик.
(38) Никто там ничего не делал . я сам писал этот блок. и на 99% документов в базе он работает. только два вида дают осечку и именно по табличной части. остальные реквизиты шапки прекрасно блокируются
(45) че 25 ? Воткни кнопку на форму, ей в формулу Сообщить(ЭтаФорма,ТолькоПросмотр) результат в студию. Это, ежелис отладчиком не знаком
(42) Подписки для таких вещей при разработке я старался не использовать.
Но и возвращаясь к началу , при установке форме режима "ТолькоПросмотр" в Истину настройки реквизитов формы которые "изменяют данные" блокируются безоговорочно.
(51) С этим я не спорю .. зато бывают ошибки программистов , незнанию каких-то нюансов и тому подобные вещи.
(54) Нет тут никаких нюансов.
Все эти "Не верю" и "чудес не бывает" от того, что все наблюдали только так: Ставишь ЭтотОбъект.ТолькоПросмотр = Истина; и получаешь желаемый эффект на всех элементах формы, с учетом (8).
Несколько версий подряд наблюдал за багом - если элементы внутри свертываемой группы, то при разворачивании они становятся доступными.
У тебя две формы, табличные части в которых ведут себя по-разному. Тебе и сравнивать чем они отличаются. Перенеси все на одну форму, упрощай, сравнивай, пока не найдёшь что-то что повлияет на таб. часть, которая не хочет становится только просмотром.
Вот это вот скорее всего. Однажды установленная фишка "ТолькоПросмотр = Истина" вполне возможно "перевознемогается" где-то "ТолькоПросмотр = Ложь". Вот и весь перетц до копейки.
Смотреть подписки, код от ПрисозданииНаСервере до ПриОткрытии. Это, конечно долго, не интересно. Но такая СеЛяВа у программиста. Для ускорения можно попытаться заюзать замер производительности.
Автор, сделай как в (46). И нажми на кнопку. Когда твоя форма якобы заблокирована при доступной ТЧ документа
(57) Я ж писал что я так и делал .
Если вы мне не верите на слово , то зачем тогда все это . ведь я могу и скрин зафотошопить .
(56) Переназначения в коде нет . я побежался отладчиком , потом делал как советовал уважаемый ЁПРСТ , правда еще до того как сюда отписаться . у формы признак "ТтолькоПросмотр" установлен в истину .
(62) Реквизит , это "Объект" который какбы "Основной" , у него априори "Изменяет данные" установлен в истину ..
(44) Хочу увидеть, где ты совершил банальную ошибку и чего не понимаешь, потому как чудес не бывает, тебе уже говорили. Но ты упорно продолжаешь верить в правильность своего кода и настроек, поэтому я делаю вывод: ты либо тролль, либо непробиваемо тупой.
(59) > ведь я могу и скрин зафотошопить ..
Вот и сделай, обидчивый ты наш. Покажи нам, например, значение флага "Изменяет данные".
(59) твое слово чего-то стоит? Тебя задело, что требуют доказательств твоей правоты, что ты все сделал правильно, а виновата платформа 1С? Сядь поплачь.
Не могу сделать видимость группы в форме 1с вот так получается с предопределенными данными из справочника.
А по наименованию не могу. Вот так не работает:
Подскажите как написать условие что бы элементы группы стали видны.
Открываем синтакс-помощник, переходим по разделам:
Прикладные объекты - Справочники - СправочникМенеджер. - Методы - НайтиПоНаименованию
Параметры:
(обязательный)
Тип: Строка.
Строка, содержащая искомое наименование.
(необязательный)
Тип: Булево.
Определяет режим поиска по полному соответствию.
Поиск будет успешным, если строка поиска: в случае значения параметра Ложь - будет соответствовать левой части наименования; в случае значения параметра Истина - будет полностью совпадать с наименованием (за исключением "хвостовых" пробелов в наименовании).
Значение по умолчанию: Ложь.
(необязательный)
Тип: СправочникСсылка..
Родитель, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
(необязательный)
Тип: СправочникСсылка..
Владелец, в пределах которого нужно выполнять поиск. Если не указан, то поиск будет проводиться во всем справочнике.
Возвращаемое значение:
Тип: СправочникСсылка.; Неопределено.
Ссылка на найденный элемент справочника.
Если не существует ни одного элемента с требуемым наименованием, то будет возвращена пустая ссылка.
Если для справочника наименование не задано (длина = 0) и поиск выполняется по полному соответствию, то будет возвращено Неопределено.
Описание:
Осуществляет поиск элемента по его наименованию.
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение(сервер).
Примечание:
Если существует несколько элементов с указанным наименованием, то будет найден только один из них.
Читайте также: