Консультация № 171800
01.09.2009, 14:44
0.00 руб.
0 12 5
Здравствуйте. 1с 8 Сделал в справочнике так чтобы конкретный элемент справочника мог редактировать только пользователь который создал этот элемент. Все условия прописал в модуле формы в процедурах ПриОткрытии() , НачалоВыбора() и СправочникСписокПередНачаломИзменения(Элемент, Отказ)
.
Проблема вот в чем: Все работает когда открываешь сам справочник и не работает когда выбираешь в поле ввода другого справочника.
т.е. если в элементе справочника номенклатура выбираешь статью затрат, то в форме выбора справочника СтатьиЗатрат можно редактировать любой элемент. событие "ПередНачаломИзменения()" не срабатывает.

Обсуждение

давно
Студент
218854
56
01.09.2009, 15:09
общий
это ответ
Здравствуйте, Феликс Эдмундович.

Если у Вас в конфигураторе для справочника СтатьиЗатрат задана форма выбора, то и в этой форме необходимо подправить процедуры для события "ПередНачаломИзменения()".
Если формы выбора нет, то в качестве формы выбора можно задать форму списка. А в этой форме Вы уже выполнили необходимые доработки.
5
Большое спасибо. Очень оперативно.
Неизвестный
01.09.2009, 15:17
общий
Спасибо большое. "в качестве формы выбора можно задать форму списка". Вот я олень.
Еще вопрос:
SMS #thank 253759 на номер 1151 скока стоит смс?
Неизвестный
01.09.2009, 15:24
общий
это ответ
Здравствуйте, Феликс Эдмундович.

Все правильно в этом случае модуль форы списка не загружается.
и это надо дублировать в модуле элемента (а если их несколько - то во всех)

Я обычно делаю в модуле объекта справочника.
Правда, там это можно обработать только ПередЗаписью(Отказ)
и нельзя отловить начало редактирования а только вывести ошибку и отменить запись при попытке записать.

Но так делали раньше, пока 1с не умела в правах условия ставить.
А теперь - милое дело.
1. Создаем параметр сеанса с пользователем
2. при начале работы его зполняем.
3. Открываем роли.
4. Находим справочник
5. Выбирем право на изменение
6. Там где "Ограничение доступа к данным" добавляем условие
"ГДЕ Создатель = &Юзер"
("Создатель" - имя поля в справочнике а "Юзер" - имя параметра сеанса)


Неизвестный
01.09.2009, 15:34
общий
это ответ
Здравствуйте, Феликс Эдмундович.
Исходя из первого абзаца Вашего вопроса я сделал вывод, что Вы где-то держите информацию о том, какой пользователь создавал тот или иной элемент справочника.

Сделайте так
1. Форма элемента справочника, предопределенное событие ПередОткрытием(Отказ, СтандартнаяОбработка)
Код:

Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
спФормаПередОткрытием(ЭтаФорма, Отказ, СтандартнаяОбработка);
// Это процедура общего модуля
КонецПроцедуры


2. Общий модуль
Код:

Процедура спФормаПередОткрытием(ЭтаФорма, Отказ, СтандартнаяОбработка) Экспорт
спПроверкаПравДоступа(ЭтаФорма, ЭтаФорма.ЭтотОбъект, Отказ, СтандартнаяОбработка);
КонецПроцедуры


3. Тоже общий модуль
Код:

Процедура спПроверкаПравДоступа(ЭтаФорма, ЭтотОбъект, Отказ, СтандартнаяОбработка) Экспорт
ТекущийПользователь = Справочники.Пользователи.НайтиПоНаименованию(ИмяПользователя());
Если згПраво(ЭтотОбъект, ТекущийПользователь) = Перечисления.ВидыПравДляСправочников.НетДоступа Тогда
Сообщить("Нет права доступа");
Отказ = Истина;
ИначеЕсли згПраво(ЭтотОбъект, ТекущийПользователь) = Перечисления.ВидыПравДляСправочников.Чтение Тогда
Сообщить("Форма элемента будет открыта в режиме просмотра");
ЭтаФорма.ТолькоПросмотр = Истина;
ИначеЕсли згПраво(ЭтотОбъект, ТекущийПользователь) = Перечисления.ВидыПравДляСправочников.ПолныйДоступ Тогда
// Нічого не робимо
Иначе
Сообщить("Права доступа неопределены");
Отказ = Истина;
КонецЕсли;
КонецПроцедуры


4. Здесь тоже общий модуль
Код:

Функция згПраво(ЭтотОбъект, ТекущийПользователь) Экспорт
//Здесь проверяете право доступа к элменту конкретного пользователя и возвращаете
//то или иное значение перечисления ВидыПравДляСправочников
КонецФункции


Замечание. Вам нужно будет добавить перечисление ВидыПравДляСправочников, хотя Вы можете обойти это используя сравнение со строкой. Но тогда возможно есть смысл использовать СокрЛП() для сравнения
Неизвестный
01.09.2009, 20:08
общий
это ответ
Здравствуйте, Феликс Эдмундович!
Попробуйте прописать запрет на изменение внутри РОЛИ. Т.е. поставить галочку Изменение, но на эту галочку сделать запрос с условием, что текущий пользователь является тем, кто создал этот элемент.
Неизвестный
01.09.2009, 21:32
общий
это ответ
Здравствуйте, Феликс Эдмундович!

ПередНачаломИзменения() - срабатывает только если вы вносите изменения в значение в элементе управления. Если вы изпользуете кнопки "Открытие", "Выбор" и т.п. то этот обработчик не срабатывает.
давно
Студент
218854
56
02.09.2009, 07:09
общий
Феликс Эдмундович:
Не знаю сколько стоит такое смс, насколько я понимаю это зависит от вашего оператора.
Неизвестный
02.09.2009, 17:56
общий
Много интересных ответов, и каждый эксперт дополняет предыдущие ответы. Мне нравится, когда так работают. Все эксперты отлично сработали! Спасибо!
Неизвестный
02.09.2009, 18:02
общий
Феликс Эдмундович:
Я бы добавил реквизит "Автор" и его сравнивал с текущим пользователем, как это решил Денис.
Неизвестный
02.09.2009, 18:03
общий
Яна:
Яна, Вы можете привести пример, как можно реализовать
запрос с условием, что текущий пользователь является тем, кто создал этот элемент.

Думаю, будет изящное решение.
Неизвестный
02.09.2009, 18:30
общий
Владимир Лазурко:
Текущий пользователь - параметр сеанса, а создатель элемента - реквизит справочника.
Неизвестный
03.09.2009, 08:12
общий
Яна:
Яна, а тип параметра сеанса не совпадает с типом реквизита справочника?
Как правило, в типовых конфигурациях, делается:
ТекущийПользователь - Ссылка: Справочник.Пользователи, а у этой ссылки есть реквизит "Сотрудник" - ссылка: Справочник.Сотрудники. Если делать идеальное решение, то лучше использовать RLS-запрос.
Форма ответа