Имя: Пароль:
1C
1С v8
УТ 10.2 как запретить редактирование юридического адреса
,
0 pro3ri
 
10.12.15
13:09
Добрый день!
Есть ут 10.2.
В элементе справочника на закладке контакты пользователи не должны изменять Адрес с видом Юридический. https://s.mail.ru/4z6npTCbt9eh/img-2015-12-10-15-07-17.png А остальные контакты менять могут. Как это реализовать?
1 Nuobu
 
10.12.15
13:15
(0) В регистре "Контактная информация контрагентов" в модуле "перезЗаписью" пропиши Отказ  = истина.
2 lxndr
 
10.12.15
13:25
(0) через RLS
3 pro3ri
 
14.12.15
08:01
(1) Для каждого Запись Из ЭтотОбъект Цикл
        
        Если Запись.Вид.Наименование = "Юридический адрес контрагента" И (РольДоступна("ЗаписьКонтактныхДанных") Или РольДоступна("РуководительСбыта")) Тогда
        
            Запрос =Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ
                           |    КонтактнаяИнформация.Представление
                           |ИЗ
                           |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                           |ГДЕ
                           |    КонтактнаяИнформация.Объект = &Объект
                           |    И КонтактнаяИнформация.Вид = &Вид";
            Запрос.УстановитьПараметр("Объект", Запись.КонтрагентДляОграниченияПравДоступа);
            Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00001"));
            
            РезультатЗапроса = Запрос.Выполнить();
            
            Если РезультатЗапроса.Пустой() Тогда
                БылЮрАдрес = "";
                Если БылЮрАдрес<>Запись.Представление Тогда
                    //Отказ = Истина;
                    Запись.Представление = БылЮрАдрес;
                    СтрокаОтказа = "Вам запрещено изменять юридический адрес!!!";
                    Предупреждение("Вам запрещено изменять юридический адрес!!!");
                КонецЕсли;
            Иначе
                
                БылЮрАдрес = РезультатЗапроса.Выгрузить()[0].Представление;
                Если БылЮрАдрес<>Запись.Представление Тогда
                    //Отказ = Истина;
                    Запись.Представление = БылЮрАдрес;
                    СтрокаОтказа = "Вам запрещено изменять юридический адрес!!!";
                    Предупреждение("Вам запрещено изменять юридический адрес!!!");
                КонецЕсли;
                
            КонецЕсли;
            
        КонецЕсли;
    

сделал такой код. Благодарю.
4 Лефмихалыч
 
14.12.15
08:28
(3) а теперь удаляй его
5 pro3ri
 
14.12.15
08:42
(4) а какие тут ошибки?  Запрос.УстановитьПараметр("Вид", Справочники.ВидыКонтактнойИнформации.НайтиПоКоду("00001")); не комильфо, но ведь работает. Как сделать оптимальнее?
6 Лефмихалыч
 
14.12.15
08:51
(5) да там всё не ком иль фо
1. Запросов в цикле, как у доброй собаки блох.
2. Предупреждения в серверном вызове
3. Неиспользуемые переменные

и что за нах - Запись.КонтрагентДляОграниченияПравДоступа. ЭТо что такой и откуда оно взялось?
7 Мэс33
 
14.12.15
08:52
(6) "ком иль фо" - это какое-то запрещенное на форуме слово?
8 Лефмихалыч
 
14.12.15
08:52
ну и ограничивать доступ, если РОльДОступна() - это вообще алес.
При расширении набора прав полномочия должны расширяться, а у тебя сужаются.
9 Лефмихалыч
 
14.12.15
08:53
(7) нет, это я двоечник
10 User_Agronom
 
14.12.15
08:59
(6)
1. Цикла нет ни одного!
2. Формы обычные.
3. Тут невозможно в Вами не согласится!
11 User_Agronom
 
14.12.15
09:00
(10) 1. Отзывается - я невнимателен.
12 Лефмихалыч
 
14.12.15
09:09
(10) при чем тут формы? ПередЗаписью на сервере выполняется
13 User_Agronom
 
14.12.15
09:13
(12) Это для  клиент-сервера.
В обычном приложении предупреждение выскочит. Согласен некрасиво, но достаточно работоспособно.
14 Лефмихалыч
 
14.12.15
09:19
(13) да какая разница? Код угрёбищный наглухо.
Попимо уже описанного мной:
2. он не запрещает удаление
3. Если наименование вида поменять на "Юр. адрес", то все перестанет работать.
4. с учетом того, что запись в РС - это сначала очистка, а потом запись, благодаря первому "если", это говнище вообще любую запись в РС запретит
15 Defender aka LINN
 
14.12.15
09:53
(13) А вы для клиент-сервера, получается, код не пишете? У вас этим другой отдел занимается, или как?
16 User_Agronom
 
14.12.15
10:06
(14) С этим тоже невозможно не согласиться.
(15) Всё пишу. И даже на управляемых формах иногда (но мало).
И даже знаю, что в обычном приложении всё выполняется на клиенте. Поэтому директива &НаСевере теряет смысл.
17 Cyberhawk
 
14.12.15
10:09
(16) "в обычном приложении всё выполняется на клиенте" // ошибаешься (общий модуль с одной галкой "Сервер" тебе в помощь)
18 User_Agronom
 
14.12.15
10:45
(17) Мы уходим в offtop.
Напомню ветвь дискуссии: Как оповестить пользователя из подписки в обычном приложеннии о причине отказа ы записи?
Обязательно ли вызывать процедуру из модуля с одной галкой "Сервер"?
19 Defender aka LINN
 
14.12.15
10:52
(18) Для этого есть специально обученное Сообщить. В особо тяжких случаях - ВызватьИсключение.
20 Лефмихалыч
 
14.12.15
11:04
Форма элемента контрагентов записывает набор записей с отбором по контрагенту. Соответственно:
1. RLS на запись приведет к невозможности записать любую контактную информацию, если в наборе есть юр.радрес
2. RLS на чтение приведет к потерям данных - записываться будет успешно, но будет затирать юр адрес, если он был задан, т.к. отбора по видам КИ нет при записи.

Либо вламываться в УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию() и там проверять перед записью.
Либо на форме элемента контрагентов запрещать редактирование кодом.

Оба варианта не многим менее уиопищные, чем код в (3)
21 Лефмихалыч
 
14.12.15
11:05
+(20) можно навесить RLS на чтение И вломиться в УправлениеКонтактнойИнформацией.ЗаписатьКонтактнуюИнформацию(), чтобы она записывала с отбором по объекту и виду.
Тогда, по идее, будет надежнее. Но, если где-то в конфе есть запись набора без отборра по виду, - будет потеря данных.
22 Мэс33
 
14.12.15
11:08
(20) По мне - лучший вариант где-то здесь:
>>>Либо на форме элемента контрагентов

Перехватывать на форме попытку изменить юрадрес - и ругаться матом.
23 Cyberhawk
 
14.12.15
11:09
(18) Я просто решил поделиться - вдруг ты не знал. Ну а в толстых (обычное приложение) типовых сделано через директиву "Если Клиент Тогда" и Предупреждение / Сообщение
24 Лефмихалыч
 
14.12.15
11:10
(22) пожалуй, да, но это во всех формах надо повторять, а потом молиться, чтобы не появилось какой-нибудь новой, в которой редактировать КИ можно. Сложная система палок и веревок, а не автоматизация.
25 Мэс33
 
14.12.15
11:23
(24) <<<<но это во всех формах надо повторять
Форма будет одна - форма элемента.

<<<< а потом молиться
прогер тут один. Так что норм.
26 pro3ri
 
14.12.15
15:00
(6) Добавил в ПВХ https://s.mail.ru/4eTEVZKsNC9g/img-2015-12-14-11-29-58.png галки

Передалал так:

Процедура ПередЗаписью(Отказ, Замещение)
    Для каждого Запись Из ЭтотОбъект Цикл
    
        Если Запись.Вид = ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ЗапретРедактирования") Тогда
        
            ВнестиДопЗапись = Ложь;
            Прервать;
            
        ИначеЕсли Не Запись.Вид = ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ЗапретРедактирования") Тогда
            
            ВнестиДопЗапись = Истина;
            
        КонецЕсли;    
    
    КонецЦикла;
    
    Если ВнестиДопЗапись Тогда
  
        ЮрАдрес = ЭтотОбъект.Добавить();
        ЮрАдрес.Объект = ЭтотОбъект.Отбор.Объект.Значение;
        ЮрАдрес.Вид = ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ЗапретРедактирования");
        ЮрАдрес.КонтрагентДляОграниченияПравДоступа = ЭтотОбъект.Отбор.Объект.Значение;
        ЮрАдрес.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;

      КонецЕсли;
    
    
    Для каждого Запись Из ЭтотОбъект Цикл
        
        Если Запись.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента И (ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ОграничениеНаРедактированиеКонтактов") Или ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "МожетРедактироватьОсновногоМенеджераКлиента")) Тогда
        
            Запрос =Новый Запрос;
            Запрос.Текст = "ВЫБРАТЬ
                           |    КонтактнаяИнформация.Представление,
                           |    КонтактнаяИнформация.Тип
                           |ИЗ
                           |    РегистрСведений.КонтактнаяИнформация КАК КонтактнаяИнформация
                           |ГДЕ
                           |    КонтактнаяИнформация.Объект = &Объект
                           |    И КонтактнаяИнформация.Вид = &Вид";
            Запрос.УстановитьПараметр("Объект", Запись.КонтрагентДляОграниченияПравДоступа);
            Запрос.УстановитьПараметр("Вид", ПолучитьЗначениеПоУмолчанию(глТекущийПользователь, "ЗапретРедактирования"));
            
            РезультатЗапроса = Запрос.Выполнить();
            
            Если РезультатЗапроса.Пустой() Тогда
                Если ""<>Запись.Представление Тогда
                    Запись.Представление = "";
                    СтрокаОтказа = "Вам запрещено изменять юридический адрес!!!";
                    Предупреждение("Вам запрещено изменять юридический адрес!!!");
                КонецЕсли;
            Иначе
                
                Если РезультатЗапроса.Выгрузить()[0].Представление<>Запись.Представление Тогда
                    Запись.Представление = РезультатЗапроса.Выгрузить()[0].Представление;
                    Запись.Тип = РезультатЗапроса.Выгрузить()[0].Тип;
                    СтрокаОтказа = "Вам запрещено изменять юридический адрес!!!";
                    Предупреждение("Вам запрещено изменять юридический адрес!!!");
                КонецЕсли;
                
            КонецЕсли;
            

        КонецЕсли;
        
Благодарю форумчан за поправки.
27 Defender aka LINN
 
14.12.15
16:14
Рукалицо...
28 Мэс33
 
14.12.15
16:43
Жесть
29 Лефмихалыч
 
14.12.15
16:58
(26) где ты видел, чтобы тебе такое советовали?

30 Nuobu
 
14.12.15
18:59
(26) Я один вижу цикл в цикле?
31 Лефмихалыч
 
14.12.15
19:09
(26) добавь обработчик ПриНачалеРедактирования табличного поля с набором записей что-то вроде

Если ТекущиеДанные.Вид = ВидЮрАдрес Тогда
    Отказ = не РольДоступна("РольКоторойМожноРедактировать");
32 pro3ri
 
15.12.15
08:56
(31) сделал Процедура КонтактнаяИнформацияПередНачаломИзменения(Элемент, Отказ)
    
    Если Элемент.ТекущиеДанные.Вид = Справочники.ВидыКонтактнойИнформации.ЮрАдресКонтрагента Тогда
    
        Отказ = Не РольДоступна("МожетРедактироватьЮрАдрес");

    КонецЕсли;

в проц ПриНачалеРедактирования Процедура КонтактнаяИнформацияПриНачалеРедактирования(Элемент, НоваяСтрока) нет отказа
thx
33 Мимохожий Однако
 
15.12.15
09:02
(0)ОФФ:Обычных административных методов не хватило?
34 pro3ri
 
15.12.15
09:08
нет (33)