Ermak |
|
||
---|---|---|---|
Подскажите что я не так делаю, выдает ошибку
{Документ.Подписаный.Форма.ФормаДокумента.Форма(20)}: Поле объекта не обнаружено (Доступность) Код 1C v 8.х
Ответственный тип Справочник |
Yandex |
|
||
---|---|---|---|
E_Migachev |
|
||
---|---|---|---|
так ты же это перебираешь результат запроса — в нем только выборка и нет ни какой доступности! |
Ermak |
|
||
---|---|---|---|
А как тогда можно сделать через запрос? |
E_Migachev |
|
||
---|---|---|---|
(2) Ermak, ни как… запрос служит только для получения данных… |
Ermak |
|
||
---|---|---|---|
я хочу при нажатии на кнопку в документе Подпись, в документе Документы.Форма1 реквизит Ответственный был не доступен для редактирования |
DJ_Serega |
|
||
---|---|---|---|
(4) Ermak, я так понял, если нажали на ПОДПИСЬ, то редактировать ответственного вообще нельзя? |
Ermak |
|
||
---|---|---|---|
Да вы правильно поняли, при нажатии вообще редактировать нельзя. |
E_Migachev |
|
||
---|---|---|---|
В модуле кнопки подпись напиши:
Код 1C v 8.х
создай РеквизитХраненияДоступностиБулево |
Ermak |
|
||
---|---|---|---|
а как обратиться к документу Документы.Форма1 так как кнопка подписи находится в Документы.Подпись |
DJ_Serega |
|
||
---|---|---|---|
Код 1C v 8.х
На корректность кода (если что) не обращайте внимания. Писал «от руки» *09 Но смысл думаю будет доставлен *17 Изменено 13.03.13 22:10:49 |
Ermak |
|
||
---|---|---|---|
Не много код не понял, создал реквизит РеквизитХраненияДоступности в документе Форма1 и добавил код в документ Подпись, после нажатия на кнопку все равно можно редактировать документ Форма1.
Изменено 14.03.13 09:02:52 |
DJ_Serega |
|
||
---|---|---|---|
|
(10) Ermak, а при открытии не забыл доступность устанавливать исходя из зна чения нового реквизита? |
Ermak |
|
||
---|---|---|---|
(11) DJ_Serega, Я не понимаю, реквизит Ответственный находится в документе Форма1, а кнопка Подпись находится в документе Подпись, если я напиши он не поймет что за реквизит Ответственный. |
DJ_Serega |
|
||
---|---|---|---|
Приду домой напишу. А то с телефона сижу *07 |
E_Migachev |
|
||
---|---|---|---|
(12) Ermak, Форма1 и Подпись это формы одного документа??? |
DJ_Serega |
|
||
---|---|---|---|
(14) E_Migachev, та походу разные это документы |
Ermak |
|
||
---|---|---|---|
Если вы имеет это объединение то у них есть два одинаковый реквизита, это Квартал и Организация, по этим реквизитам я делал отбор в документе Форма1Код 1C v 8.х
смысл такой, устанавливаю данные в документе подпись для организации и квартал, он ищет в документ Форма1 такие же данные когда находит документы с этими же данными то делает реквизит ответственный не доступным. |
Ermak |
|
||
---|---|---|---|
Всем спасибо я разобрался!
Кому нужно вот код В Документы.Подпись Код 1C v 8.х
Документы.Форма1 Код 1C v 8.х
|
Ermak |
|
||
---|---|---|---|
А можно как нибудь через запрос сделать это действие
ЭлементыФорым…..Доступность = РеквизитХраненияДоступности; чтобы каждый реквизит не прописывать. |
Ermak |
|
||
---|---|---|---|
Подскажите, тут я обращаюсь к документуКод 1C v 8.х
и использую ссылку а если я буду обращаться к регистру накопления там же не ссылки как мне быть тогда? Код 1C v 8.х
мне это нужно для это, что у меня будет 20 документов к которым нужно будет одновременно закрывать доступность при нажатии кнопки подпись. |
DJ_Serega |
|
||
---|---|---|---|
(19) Ermak, через регистр можно либо через ссылку в измерении или реквизите либо через регистратор. |
DJ_Serega |
|
||
---|---|---|---|
(17) Ermak, у тебя нюансик. По умолчанию реквизит доступности = ложь. А значит изменение всегда заблокировано. Лучше установить блокировку если реквизит приобретет истину. А то получается что в новых документах у тебя уже изменять нельзя. |
Ermak |
|
||
---|---|---|---|
(20) DJ_Serega, можно пример а то плохо понятно. |
DJ_Serega |
|
||
---|---|---|---|
|
(22) Ermak, по 21му теперь исправили и оно корректно? *17
(22) Ermak, с (20) DJ_Serega это по поводу (19) Ermak? Если «истина» *17 тогда где-то так: Код 1C v 8.х
*09 Изменено 19.03.13 00:37:20 по причине: Очепятки ) |
Ermak |
|
||
---|---|---|---|
(23) DJ_Serega, по 21 я не исправил, не могу додумать как это сделать, можете подсказать |
DJ_Serega |
|
||
---|---|---|---|
(24) Ermak, вот ответ (7) E_Migachev |
Ermak |
|
||
---|---|---|---|
(25) DJ_Serega, я не понимаю этот кодКод 1C v 8.х
Вы имеете ввиду поставить любое измерение и ресурс и реквизит? Мне нужно заблокировать полностью документ, чтобы его можно было только смотреть. Изменено 22.03.13 10:18:51 |
DJ_Serega |
|
||
---|---|---|---|
Ссылка на документ может быть там где ДокументБлокировки. Вы его таким образом получите для того что бы заблокировать. |
Ermak |
|
||
---|---|---|---|
че та я не много не понимаю, можете лучше примером показать |
DJ_Serega |
|
||
---|---|---|---|
(28) Ermak, я ж писал в (23) DJ_Serega.
Если нужный документ находится в измерении тогда «Это измерение», если в реквизите тогда «Это реквизит». Допустим нужный документ для блокировки это Регистратор регистра. Тогда код по блокировке будет: Код 1C v 8.х
|
Ermak |
|
||
---|---|---|---|
(29) DJ_Serega, Большое спасибо разобрался! Сделал не много по другому. |
DJ_Serega |
|
||
---|---|---|---|
(30) Ermak, Главное что разобрался и сделал *02
Наша задача «помочь» выполнена *12 з.ы.: темку то можно и закрыть *17 |
Ermak |
|
||
---|---|---|---|
Хорошо |
Ermak |
|
||
---|---|---|---|
Вопрос закрыт! |
Подсказка: Для выделения Кода используйте (в редакторе). |
Ограничение на изменение реквизита документа на уровне ролей |
Я |
14.02.11 — 19:54
Создаю новую роль, в ней необходимо установить ограничение на редактирование документа — пользователь с этой ролью должен иметь право изменять в этом документе только один конкретный реквизит, для остальных реквизитов доступ только на чтение. Т.е. он может сохранить/провести документ только если не пытался изменить любой реквизит документа, кроме одного разрешенного.
В книге знаний статья этого не описывает.
1 — 14.02.11 — 19:59
(0) Может я и не прав… Но RLS, например, тебе не поможет. Поскольку он отрабатывает в момент чтения данных, т.е. при открытии. А тебе надо при записи документа — пилить и пилить.
2 — 14.02.11 — 20:05
В RLS есть право «Изменение», думаю можно наложить ограничение на него и запросом сравнить реквизиты до изменения и после, если все реквизиты, кроме указанного, остались без изменений то разрешить изменение иначе запретить, вот только как получить значения реквизитов до изменения и после изменения.
Да и топорный это способ.
3 — 14.02.11 — 20:30
(2) Ну, расскажи, как ты получишь «реквизиты до изменения и после» в запросе RLS.
4 — 14.02.11 — 21:13
О если б я знал как это сделать, в SQLPlus это сделать легко, а вот в запросе RLS… наверно надо дополнительный регистр с неким подобием версионирования — но это тот еще изврат… Наверно таки ПриЗаписи() или доступность на форме менять…
5 — 14.02.11 — 21:15
(4) Наверно таки ПередЗаписью()
6 — 14.02.11 — 21:16
(0) переходи на 8.2…
7 — 14.02.11 — 21:18
наверно таки ПриОткрытии
8 — 14.02.11 — 21:20
(7) Проверку ПриОткрытии(), или доступность реквизитов?
9 — 14.02.11 — 21:26
(8)проверку роли или права и управление доступностью реквизитов и поведением стандартных кнопок
(6)а там что, разьве легче?
10 — 14.02.11 — 21:29
(9) ну там как бы вплоть до реквизитов можно права устанавливать…
11 — 14.02.11 — 21:35
(10)тока на просмотр ведь, пишется-то все равно весь объект.
12 — 14.02.11 — 21:38
(11) «пользователь с этой ролью должен иметь право изменять в этом документе только один конкретный реквизит, для остальных реквизитов доступ только на чтение»
я как-то неправильно понял эту фразу из сабжа?
13 — 14.02.11 — 21:44
Все реквизиты документа из однго месте? А если наложить запрет на регистр, в котором хранятся этот самый реквизит, например?
14 — 14.02.11 — 21:46
Эх, почему наши доблестные молодые коллеги любят решать всё шашкой, на козе, в валенках, по уши в г…не?
Какую роль вы создаете? Для одного реквизита? А для другого другую роль? Вы случайно не функцию согласования или утверждения реализуете?
Пилите БП и задачи пользователя. На Задачу делайте форму — пусть правит реквизит, и толкает процесс дальше.
Господи, ну когда они наконец-то изучат 1С?
15 — 14.02.11 — 21:49
На краяйняк, добавьте этот реквизит в форме, как переменную нужного типа. И перед закрытием пишите в свой объект.
16 — 14.02.11 — 21:55
господи, сколько же болтунов на мисте
17 — 14.02.11 — 23:39
(14) Нет, не функция согласования и нет, роль не на один реквизит, и еще раз нет — тут БП городить нецелесообразно.
Роль существенно ограничивает права, по сути для большинства объектов доступ только на чтение, но есть документ в котором необходимо менять статус, при этом надо исключить возможность умышленного/неумышленного изменения других реквизитов. Да, я думаю было бы удобно (и логично) реализовать это ограничениями RLS, но так как RLS не позволяет это сделать без костылей, то останавливаюсь на изменении доступности полей.
18 — 15.02.11 — 01:38
Если РольДоступна(Метаданные.Роли.НужныеПрава) Тогда
Для каждого тек из ЭлементыФормы Цикл
Если (ТипЗнч(тек)= Тип(«ПолеВвода»)) Тогда
тек.ТолькоПросмотр = Истина;
КонецЕсли;
Если (ТипЗнч(тек)= Тип(«Флажок»))или(ТипЗнч(тек)= Тип(«ТабличноеПоле»)) Тогда
тек.Доступность = Ложь;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.НужныйРеквизит.ТолькоПросмотр = Ложь;
КонецЕсли;
19 — 15.02.11 — 10:17
(18) Спасибо, примерно так и думал.
20 — 15.02.11 — 10:27
(18) Как я понял это только на форме ограничение…
Остается дырка программного изменения, так же обработка группового изменения (Геморно, но если «вредителю» нужно, он это сделает)…
drdroid
21 — 15.02.11 — 12:38
(19) Это уже через RLS закрою возможность открытия внешних обработок/отчетов и некоторых внутренних.
В 1С можно настроить ограничения по ролям, т.е. запретить пользователям с определенной ролью изменять какие либо реквизиты или объекты конфигурации. Например, при создание или открытии какого либо документа (справочника) можно запретить изменять номер, дату или другие необходимые элементы. На практики подобные задачи встречаются довольно часто, так как некоторые пользователи могут поменять дату документ или его номер, тем самым нарушить учет документооборота. Реализовать все это достаточно просто.
Программное ограничения по ролям в 1С
Допустить у нас в базе есть роль «Пользователь» и нам необходимо всем учетным записям с данной ролью запретить изменять номер и дату документа поступления, а так же указывать в поле «Ответственный» наименование роли.
Для этого в обработчике события «При создании на сервере» пишем вот такой код.
Если РольДоступна("Пользователь") Тогда
Элементы.Номер.РедактированиеТекста = Ложь;
Элементы.Дата.РедактированиеТекста = Ложь;
Объект.Отвественный = Справочники.Пользователи.НайтиПоКоду("000000002");
Сообщить("У Вас не хватает прав для редактирования реквизитов документа!!!");
КонецЕсли;
Думаю в нем все понять, если учетная запись под которой создается документ имеет роль «Пользователь» тогда запрещаем редактировать «Номер», «Дату» и в поле «Ответственный» подставляем значение из справочника «Пользователи» которое найдем по коду. Под данным кодом в справочнике находиться «Пользователь».
Запустим 1С и посмотрим что получилось, в итоге ввести что-то с клавиатуры в поля «Номер», «Дата» не получиться.
Но если у данного поля есть возможность выбора, например, как у даты то изменить её все же буде возможно.
Для того чтобы исключить подобную ситуацию можно отключить доступность, без ограничения редактирования.
Элементы.Дата.Доступность = Ложь;
Элементы.Номер.Доступность = Ложь;
Элементы.Отвественный.Доступность = Ложь;
В этом случае пользователь уже ни чего не сможет сделать.
Вариантов реализации подобных задач очень много, я показал один из, возможно он даже не самый оптимальной. Если Вы знаете другой обязательно поделитесь!!!
Кстати механизм подставления «Ответственного» тут не совсем корректен, так как в базе может быть много пользователей 10, 20 и если у всех у них есть роль «Пользователь» то она и будет подставляться, тут необходимо подставлять имя пользователя а не роли, с помощью ПользователиИнформационнойБазы.ТекущийПользователь() но об этом в следующей статье.
В одном из занятий курса Настройка и доработка прав доступа, профилей пользователей и RLS в типовых конфигурациях рассматривается работа с подсистемой БСП “Запрет редактирования реквизитов объектов”. На конкретном примере тренер реализовывает запрет редактирования ряда полей и табличной части “Товары” на форме документа “План продаж”.
Напомним, что для реализации запрета редактирования данных формы нужно выполнить ряд действий, среди которых:
- Подключение документа к подсистеме БСП
Общий модуль ЗапретРедактированияРеквизитовОбъектовПереопределяемый
Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами()
Процедура ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты) Экспорт //++ НЕ ГОСИС ОбменДаннымиУТУП.ПриОпределенииОбъектовСЗаблокированнымиРеквизитами(Объекты); Объекты.Вставить(Метаданные.ПланыВидовХарактеристик.ДополнительныеРеквизитыИСведения.ПолноеИмя(), "ПолучитьБлокируемыеРеквизитыОбъекта"); … //-- НЕ ГОСИС //++ изменения Объекты.Вставить(Метаданные.Документы.ПланПродаж.ПолноеИмя(), "ПолучитьБлокируемыеРеквизитыОбъекта"); //-- изменения КонецПроцедуры
- Добавление в модуле менеджера документа функции ПолучитьБлокируемыеРеквизитыОбъекта(), где следует перечислить имена реквизитов формы, объекта и табличных частей, которые предполагается запретить для редактирования.
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт Результат = Новый Массив; Результат.Добавить("Статус;ФормаПровестиИЗакрыть,ФормаЗаписать,ФормаПровести"); Результат.Добавить("НачалоПериода;УстановитьИнтервал"); Результат.Добавить("ОкончаниеПериода"); Результат.Добавить("Сценарий"); Результат.Добавить("ВидПлана"); Результат.Добавить("Товары;ТоварыПоПериодам"); Возврат Результат; КонецФункции
Вопрос
Добрый день! Как заблокировать доступ не к табличной части целиком, а к отдельной колонке табличной части? Например: Товары.Номенклатура.
Ответ тренера
Добрый день! Для блокировки редактирования отдельной колонки табличной части, например, колонки “Номенклатура”, нужно исправить код функции ПолучитьБлокируемыеРеквизитыОбъекта() на следующий:
Функция ПолучитьБлокируемыеРеквизитыОбъекта() Экспорт Результат = Новый Массив; Результат.Добавить("Статус;ФормаПровестиИЗакрыть,ФормаЗаписать,ФормаПровести"); Результат.Добавить("НачалоПериода;УстановитьИнтервал"); Результат.Добавить("ОкончаниеПериода"); Результат.Добавить("Сценарий"); Результат.Добавить("ВидПлана"); Результат.Добавить("Товары.Номенклатура; ТоварыНоменклатура, ТоварыПоПериодамНоменклатура"); Возврат Результат; КонецФункции
Разрешение пользователям редактировать отдельные реквизиты документа без перепроведения или просто одни реквизиты разрешать, а другие запрещать.
Разрешение пользователям редактировать отдельные реквизиты документа без перепроведения или просто одни реквизиты разрешать, а другие запрещать.
Иногда необходимо разрешить редактирование некоторых реквизитов документа без перепроведения. Например: Комментарий, АдресКонтрагента, КонтактноеЛицо. Ещё бывает необходимым разрешить изменение отдельных реквизитов в закрытых документах. Например, поставить отметку о состоянии доставки и написать комментарий.
В модуле менеджера документа пишем функцию, которая определяет массив допустимых к редактированию реквизитов
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Возвращает массив имён реквизитов, разрешённых для изменнения без перепроведения. // Если получен параметр типа Массив, то имена реквизитов добавляются в него Функция ПолучитьМассивРеквизитовИзменяемыхБезПерепроведения(МассивРеквизитовДопустимыхКИзменению = Неопределено) Экспорт Если Не ТипЗнч(МассивРеквизитовДопустимыхКИзменению) = Тип(«Массив») Тогда МассивРеквизитовДопустимыхКИзменению = Новый Массив; КонецЕсли; //Типовые реквизиты МассивРеквизитовДопустимыхКИзменению.Добавить(«Грузополучатель»); МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьНомер»); МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьДата»); МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьНомер»); МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьВыдана»); МассивРеквизитовДопустимыхКИзменению.Добавить(«ДоверенностьЧерезКого»); МассивРеквизитовДопустимыхКИзменению.Добавить(«Комментарий»); МассивРеквизитовДопустимыхКИзменению.Добавить(«АдресДоставки»); //Добавленные реквизиты Возврат МассивРеквизитовДопустимыхКИзменению; КонецФункции |
В модуле ОбщегоНазначения пишем функции общие для всех документов.
// сравниваем реквизиты документа из базы данных с записываемым объектом // имена изменённых реквизитов запихываем в массив Функция ПолучитьСписокИзменённыхРеквизитов(ДокОбъект) Экспорт СписокИзменённыхРеквизитов = Новый Массив; Ссылка = ДокОбъект.Ссылка; мдОбъекта = ДокОбъект.Метаданные(); // сравниваем стандартные реквизиты Для Каждого Реквизит из мдОбъекта.СтандартныеРеквизиты Цикл Если ДокОбъект[Реквизит.Имя] <> Ссылка[Реквизит.Имя] Тогда СписокИзменённыхРеквизитов.Добавить(Реквизит.Имя); КонецЕсли; КонецЦикла; |
В модуле документа ПредЗаписью разрешаем запись без пререпроведения в случае, если были изменены только реквизиты, не вызывающие перепроведение.
РедактированиеЗаднимЧислом = Ложь; МассивРеквизитовДопустимыхКИзменению = Документы.РеализацияТоваровУслуг.ПолучитьМассивРеквизитовИзменяемыхБезПерепроведения(); СписокИзменённыхРеквизитов = ОбщегоНазначения.ПолучитьСписокИзменённыхРеквизитов(ЭтотОбъект); СписокИзменённыхРеквизитовВызывающихПерепроведение = ОбщегоНазначения.МожноЗаписыватьБезПерепроведения(ЭтотОбъект, МассивРеквизитовДопустимыхКИзменению, СписокИзменённыхРеквизитов); Если СписокИзменённыхРеквизитовВызывающихПерепроведение = «» И Проведен И СписокИзменённыхРеквизитов.Количество() > 0 Тогда РежимЗаписи = РежимЗаписиДокумента.Запись; ИначеЕсли НЕ РедактированиеЗаднимЧислом и Дата < НачалоДня(ТекущаяДата()) И Не РольДоступна(«ПравоАдминистрирования») Тогда Сообщить(«Недостаточно прав для проведения реализации « + Номер + » « + Строка(Дата) + » задним числом. Изменены реквизиты: « + СписокИзменённыхРеквизитовВызывающихПерепроведение); Отказ = Истина; КонецЕсли; |
Оцените статью:
Загрузка…
Если Вы заметили ошибку, то выделите ее мышью и нажмите Ctrl+Enter