Ошибка при получении значения атрибута контекста отражатьврегламентированномучете

Содержание:

1.       Ошибка при установке значения атрибута контекста

2.       Ошибка при получении значения атрибута контекста

Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.  

1.    Ошибка при установке значения атрибута контекста

Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута. 

Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.  

2.    Ошибка при получении значения атрибута контекста

Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.

При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).  

Специалист компании «Кодерлайн»

Александр Суворов

Помогите плз! Не могу понять в чем дело. 1. Создаю в пустой УТ пользователя Петров с ролями Пользователь+МенПоПродажам. Захожу — создаю док ЗакзПокупателя без вопросов. (Установлено: «Ограничивать права на ур записей») 2. Переношу из ТиС справочники с пользователями и остатки по складам. Создаю пользователя из перенесенных, например, Иванов — Пользователь+МенПоПродажам. 3. При входе Петрова ЗаказПокупателч создается, а для Иванова — нет, с ошибкой: «{ОбщийМодуль.ЗаполнениеДокументов}: Ошибка при получении значения атрибута контекста (ОтражатьВРегламентированномУчете): У пользователя недостаточно прав на исполнение операции над базой данных.» При этом все галки в Настройках и Доп правах одинаковые. 4. Провожу документы остатков ПеремешениеТоваров. В отчетах появились остатки. 5. При попытке создания документа и Иванов и Петров вылетают по вышеназванной ошибке. Рядом база с такими же настройками без переноса — все работают нормально. Что может происходить при переносе?

убери «Ограничивать права на ур записей»

Когда убераю — все конечно работает, но у меня потом предполагается разграничение прав пользователей, т.е. опция нужная. А что такое всетаки может происходить. Может еще какие настройки есть? Два раза с нуля переносил — результат один (см. выше):-(

[но у меня потом предполагается разграничение прав пользователей, т.е. опция нужная] так настрой что бы работало, не чмори Иванова

Дык как только я ставлю галку ни Иванов ни Петров ничего не могут сделать, и все это после переноса и проведения остатков. Так что и разганичивать уже нечего.

Тэги:

Комментарии доступны только авторизированным пользователям

Ошибка в 1С 8. Ошибка при получении значения атрибута контекста (ОсновнаяРоль), Недопустимо использование свойства ОсновнаяРоль

Описание ошибки:
Проблема стала возникать после того, как в серверную базу УТ 10.3 был добавлен функционал Библиотеки МДЛП. Ошибка не проявляла себя явно при работе в режиме 1С: Предприятие, но негативно влияла на выполнение некоторых регламентных заданий, так что они аварийно прерывались.

Найденные решения:

{ОбщийМодуль.Пользователи.Модуль(116)}: Ошибка при получении значения атрибута контекста (ОсновнаяРоль)
по причине:
Недопустимо использование свойства «ОсновнаяРоль»

Проблема стала заметна случайно лишь тогда, когда в частности регламентное фоновое задание «Наличие новых ЭД» стало прерываться в процессе своего выполнения из за ошибки.

1С 8 как исправить ошибку при получении значения атрибута контекста ОсновнаяРоль
Рис. 1. Пример ошибки «Ошибка при получении значения атрибута контекста (ОсновнаяРоль)» в регламентном задании «Наличие новых эд в сервисе ЭДО« 

Так же и в другом регламентном задании стала проявляться ошибка «Ошибка при получении значения атрибута контекста (ОсновнаяРоль) по причине: Недопустимо использование свойства «ОсновнаяРоль».


Рис. 2. Пример ошибки «Недопустимо использование свойства «ОсновнаяРоль» в регламентном задании «Выполнение обмена по сценарию…»

Удивителен тот факт, что код «Метаданные.ОсновнаяРоль» вполне нормальный. Т.е. конструкция вызывается в конфигураторе при конфигурировании как свойство объекта «Метаданные». Так же не возникает ошибок при проверка кода при сохранении изменений конфигурации. 

Нажатие на изображении увеличит его

Рис. 3. Причина ошибки в коде, конструкция «Метаданные.ОсновнаяРоль = Неопределено».

Релиз используемой платформы 1С в базе, в которой возникла проблема — 8.3.18.1741


Рис. 4. Сведения о конфигурации, версии платформы и параметры конфигурации.

Удивительно, что описание данного свойства «ОсновнаяРоль» отсутствует в Синтакс-помощнике. Хотя, как уже было коротко упомянуто, свойство «ОсновнаяРоль» глобального свойства «Метеданные» используется в библиотеке МДЛП. Исходно основное назначение библиотеки — для конфигураций, работающих в режиме управляемого приложения. Конфигурация 1С: Управление торговлей 10.3 работает в другом режиме — обычного приложения. Поэтому получается, что конструкция кода эксплуатируется в редко используемой библиотеке и ее работоспособность не совсем понятна в текущем релизе платформы.

В сети оказалось достаточно мало вспомогательной информации об этой ошибке. Из найденного, что может кому-то помочь — это обсуждение на форуме forum.1c.ru «После обновления на 2.0.15.8 выпадает ошибка: Недопустимо использование свойства «ОсновнаяРоль».

Поэтому возможно, но это только неподтвержденное предположение, что метод работает только в конфигурациях, работающих в режиме управляемого приложения, т.к. о нем отсутствует какая-либо информация в официальной методике — «Синтакс-помощнике». Поскольку упоминание проблемы с «ОсновнаяРоль» и ее актуальное решение по приведенной выше ссылке действует для конфигурации 1С: Деньги, которая работает исключительно в режиме обычного приложения (интерфейса).

1С 8 свойство метода метаданные конфигурации ОсновнаяРоль
Рис. 5. Отсутствие в «Синтакс-помощнике» описания метода «ОсновнаяРоль»

Поэтому решением данной проблемы стало изменение кода на конструкцию: Метаданные.ОсновныеРоли.Количество()

Нажатие на изображении увеличит его

Рис. 6. Устранение ошибки «Ошибка при получении значения атрибута контекста (ОсновнаяРоль)» заменой текста кода.

Таким образом код стал актуальным для исполнения и в дальнейшем не вызывал ошибку.

Оцените, помогло ли Вам предоставленное описание решения ошибки?




© www.azhur-c.ru 2014-2020. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

21-07-2022

Журавлев А.С.
(Сайт azhur-c.ru)

Konstantan

1 / 1 / 1

Регистрация: 11.05.2015

Сообщений: 74

1

Ошибка при получении атрибута значения контекста (Номенклатура)

11.10.2018, 12:33. Показов 5662. Ответов 3

Метки нет (Все метки)


1C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Процедура УдалениеСтрокНажатие(Элемент)
    
    Запрос = Новый Запрос;  
    Запрос.УстановитьПараметр("Номенклатура",Номенклатура);
    Запрос.Текст =
    "ВЫБРАТЬ
    |   РеализацияТоваровУслугТовары.Ссылка
    |ИЗ
    |   Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
    |ГДЕ
    |   РеализацияТоваровУслугТовары.Номенклатура = &Номенклатура";
    
    Выборка = Запрос.Выполнить();
    МассивТоваров=новый Массив; 
    Значения= Выборка.Выбрать();
    Пока Значения.Следующий() Цикл
        ссылка = Значения.ссылка ;
        ДокументОбъект = ссылка.ПолучитьОбъект();
        i=0;
        Для каждого ТекСтрока Из ДокументОбъект.Товары Цикл
            Если ТекСтрока.Номенклатура = Номенклатура Тогда
                МассивТоваров.Добавить(ТекСтрока);
                Сообщить("Значение: "+ ТекСтрока.Номенклатура +" подходит!"); 
                i=i+1
            Иначе
                Сообщить("Значение: "+ТекСтрока.Номенклатура+ " не подходит!");
            КонецЕсли
        КонецЦикла;
        Для  каждого ТекСтрокаМас Из    МассивТоваров Цикл
            Если Вопрос("Удалить строку со значением  " + ТекСтрокаМас.Номенклатура + "?" ,РежимДиалогаВопрос.ДаНет,15)=КодВозвратаДиалога.Да Тогда
                
                
                ДокументОбъект.Товары.Удалить(ТекСтрокаМас);
                
                
                Сообщить("Строка удалена!");
            Иначе
                Сообщить("Отмена удаления!");
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    
    
КонецПроцедуры

Сначала выполняется удалет строки из первого документа потом на втором документе вылетает ошибка,что это значит помогите плиииз ничего не пойму

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

0

Тест

Эксперт 1С

383 / 162 / 56

Регистрация: 26.02.2010

Сообщений: 1,241

11.10.2018, 12:44

2

В каком месте то ошибка происходит?

0

856 / 655 / 111

Регистрация: 01.11.2012

Сообщений: 2,410

11.10.2018, 13:36

3

Полный текст ошибки выложите

0

Эксперт 1С

841 / 604 / 211

Регистрация: 24.07.2013

Сообщений: 2,101

11.10.2018, 20:10

4

Лучший ответ Сообщение было отмечено GreenkA как решение

Решение

Konstantan, МассивТоваров не очищается перед обработкой следующего документа.

2

Ошибка при получении значения атрибута контекста (ТекущийПользователь)

bless18
06.04.2010 09:32 Прочитано: 49814

Ошибка при получении значения атрибута контекста (ТекущийПользователь): Попытка получения неинициализированного значения параметра сеанса
Пользователь = ПараметрыСеанса.ТекущийПользователь;
по причине:
Попытка получения неинициализированного значения параметра сеансаКод 1C v 8.х

 Процедура ПриНачалеРаботыСистемы()
Пользователь = ПараметрыСеанса.ТекущийПользователь;
Если обЗначениеНеЗаполнено(Пользователь.Сотрудник) Тогда
ИмяПользователя = СокрЛП(Пользователь.Наименование);
Иначе
ИмяПользователя = СокрЛП(Пользователь.Сотрудник.Наименование);
КонецЕсли;
Предупреждение("Здравствуйте уважаемый пользователь """+ИмяПользователя+"""
|Система готова к работе.", 3);
КонецПроцедуры

Где происходит их инициализация?

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
06.04.2010 09:48 Ответ № 1

Когда в Общие — Параметры сеанса добавил ТекущийПользователь, то его нужно определять при загрузке:
так же в процедуре ПриНачалеРаботыСистемы пишешь что то типо:
Код 1C v 8.х

 ИмяПользователя = ИмяПользователя();
Если Не ПустаяСтрока(ИмяПользователя) Тогда
ТекущийПользователь = Справочники.Пользователи.НайтиПоКоду(ИмяПользователя);
КонецЕсли;
ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;

Это работает при условии, что ИмяПользователя заданное в конфигураторе, равно Имени введенному в справочнике Пользователей в реквизит Код

bless18
06.04.2010 09:56 Ответ № 2

А если не совпадают, можно как-нибудб привязать пользователя к сотруднику?

E_Migachev
06.04.2010 09:57 Ответ № 3

А лучше добавить процедуру в Модуль сеанса(Правой клавишей щелкаещь на названии конфигурации и выбираешь Открыть модуль сеанса)

В ней создаешь Процедура УстановкаПараметровСеанса () и в ней пишешь код который я предложил выше или так, Если не совпадают:

Код 1C v 8.х

 Процедура УстановкаПараметровСеанса()
Спр = Справочники.Сотрудники;
ПараметрыСеанса.ТекущийПользователь=Спр.НайтиПоРеквизиту("Пользователь1С", ИмяПользователя());
КонецПроцедуры
//где Пользователь1С, это реквизит справочника сотрудники, и именем как вбито в конфигураторе

Эта процедура вызывается раньше чем ПриНачалеРаботыСистемы.

Ну а дальше подставлять сопоставленное значение при создании соответствующего документа:

Код 1C v 8.х

  Док.Пользователь=ПараметрыСеанса.Пользователь;   

События модуля сеанса:
Глобальный контекст
УстановкаПараметровСеанса (SessionParametersSetting)
Синтаксис:
УстановкаПараметровСеанса(<Требуемые параметры>)
Параметры:
<Требуемые параметры>
Тип: Массив; Неопределено. Массив устанавливаемых идентификаторов параметров сеанса, которые нужно инициализировать, если обработчик вызывается перед использованием неинициализированных параметров сеанса.
Неопределено, если обработчик события вызывается системой при начале сеанса или при захвате соединения из пула.
Описание:
Событие предназначено для инициализации параметров сеанса.
Вызывается системой:
при установке соединения с информационной базой или при захвате соединения с информационной базой из пула до вызова всех остальных обработчиков. Значение параметра «Параметры сеанса» — Неопределено;
перед фактическим использованием значений параметров сеанса, которые не были инициализированы ранее. В этом случае значением параметра «Параметры сеанса» является массив идентификаторов неинициализированных параметров сеанса, значения которых используются. Если после выполнения обработчика хотя бы один из перечисленных параметров сеанса остается неинициализированным, то возникает исключение.

bless18
06.04.2010 12:13 Ответ № 4

Спасибо вам огромное! Вы мне очень помогли!

bless18
06.04.2010 12:15 Ответ № 5

Спасибо вам огромное! Вы мне очень помогли!

E_Migachev
06.04.2010 15:44 Ответ № 6

Пожалуйста )

Подсказка: Для быстрого поиска ответов — используйте ‘Поиск’

Статья для тех, кто только начинает разбираться с RLS (Record Level Security — доступ на уровне записей)
А также для тех, кому лень разбираться в тонкостях программирования. Можете взять за основу код приведенный в статье.

Появилась у меня необходимость в конфигурации «Управление торговлей» определенным группам пользователей ограничить доступ к списку складов. Поскольку в типовой конфигурации не предусмотрено такой возможности, я порылся в интернете и понял, что у многих возникал этот вопрос. Находил ответы на свой вопрос с примерами кода, но отрывками. Вот, решил оформить то, что у меня в результате получилось. Сразу оговорюсь, что с 8.X я недавно стал работать поэтому не пинайте сильно. В основном публикация предназначена для новичков.

Исходная конфигурация: Управление торговлей 10.3.8.9.

1) Добавляем новое значение в перечисление ВидыОбъектовДоступа —  Склады.

2) Вносим изменения в регистр сведений НастройкиПравДоступаПользователей. В измерениях ОбъектДоступа и ВладелецПравДоступа  отмечаем флажком  тип данных  СправочникСсылка.Склад.

3) Вносим изменения в обработку НастройкаПравДоступа:

  • Добавляем новую страницу, на которой будет происходить настройка доступа к складам. Я назвал её Склады.
  • Размещаем табличное поле на новой странице и настраиваем его по аналогии с табличными полями расположенными на закладках Организации и Контрагенты.

3.1) Добавляем строчки кода в модуль формы  НастройкаПравДоступа:

  •  Изменим функцию ПолучитьСписокОбластейДанных

Функция ПолучитьСписокОбластейДанных(ТипДанных)
   
СписокОбластей = Новый СписокЗначений;
    Если
ТипДанных = Тип(«СправочникСсылка.Организации») Тогда
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Организации);
    ИначеЕсли
ТипДанных = Тип(«СправочникСсылка.ГруппыДоступаККонтрагентам») Тогда
       
СписокОбластей.Добавить(Перечисления.ОбластиДанныхОбъектовДоступа.КонтрагентыСписок);
    ИначеЕсли
ТипДанных = Тип(«СправочникСсылка.ГруппыПользователей») Тогда
       
// Добавим только те виды объектов доступа, для которых нет областей данных
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Организации);
       
// Добавим все области данных
       
Для каждого Перечисление Из Перечисления.ОбластиДанныхОбъектовДоступа Цикл
           
СписокОбластей.Добавить(Перечисление);
        КонецЦикла;
       
// Для ограничения доступности по складам. Начало
   
ИначеЕсли ТипДанных = Тип(«СправочникСсылка.Склады») Тогда
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Склады);
       
// Для ограничения доступности по складам. Конец
   
КонецЕсли;
    Возврат
СписокОбластей;
КонецФункции

  •    Добавим код в  функцию ПередОткрытием:

ТипыОбъектовДоступа.Вставить(«Склады»     , Тип(«СправочникСсылка.Склады»));

4) Вносим изменения в ОбщийМодуль  НастройкаПравДоступа

Функция ПолучитьВидОбъектаДоступа(ОбъектДоступа) Экспорт
    Если
ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.Организации») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Организации;
    ИначеЕсли
ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.ГруппыДоступаККонтрагентам») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Контрагенты;
       
// Для ограничения доступности по складам. Начало
   
ИначеЕсли ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.Склады») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Склады;
       
// Для ограничения доступности по складам. Конец
   
Иначе
        Возврат
Перечисления.ВидыОбъектовДоступа.ПустаяСсылка();
    КонецЕсли;
КонецФункции
 

5) Добавляем ограничение доступа к данным на чтение у роли Пользователь для объекта Справочники Склады. В поле Ограничение доступа пишем следующий код: 
#ТаблицаОсновогоВидаОбъектаДоступа(«Склады», «Ссылка», «»)

1.png

Поскольку шаблон ограничений ТаблицаОсновогоВидаОбъектаДоступа уже есть, то здесь больше ничего не делаем. Теперь доступ на видимость складов в справочнике склады настроен. Далее нам нужно чтобы в отчеты попадали только те склады, которые доступны группе пользователей.

 6) Для роли, которую надо ограничить в доступе добавляем шаблон ограничений (закладка шаблоны ограничений). Назовем ограничение Склад, а  в тексте шаблона напишем код:

#Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда
ТекущаяТаблица
ИЗ
   
#ТекущаяТаблица КАК ТекущаяТаблица
       
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СоставГруппы.Ссылка КАК ГруппаПользователей
        ИЗ
           
Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
        ГДЕ
            СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
        ПО (ИСТИНА)
ГДЕ
НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL
И
    (НЕ
1 В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    1
               
ИЗ
                   
РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа

                    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                        ПО
                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(1)
                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа
                                И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка)

                                И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей
                ГДЕ
                     НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                           И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады))

                    И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL))
#КонецЕсли 

7) Затем, возвращаемся на закладку Права и находим в дереве объект Регистр накопления —  ТоварыНаСкладах и добавляем ограничение доступа к данным на чтение. В поле Ограничение доступа пишем следующий код:

#Cклад(«Склад») 

Далее, для этого регистра для роли Пользователь создаем ограничение доступа к данным на чтение. Для этого добавляем ограничение следующего содержания ГДЕ ЛОЖЬ

9) Теперь нам нужно настроить форму списка документов таким образом, чтобы пользователь видел только те документы: реализация, заказ и т.д., где указан доступный для чтения склад. Я сделал ограничение в документе РеализацияТоваровУслуг. По аналогии с этим можно ограничить и другие формы списков документов.
Открываем роль, которой мы хотим назначить ограничение и переходим на закладку Шаблоны ограничений. Добавляем новый шаблон ОрганизацияВШапкеКонтрагентВШапкеСкладВШапке,в тексте шаблона пишем следующий код:

##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
   
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
        СоставГруппы.Ссылка КАК ГруппаПользователей
    ИЗ
       
Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
    ГДЕ
        СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
    ПО (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей)
ГДЕ (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = ЛОЖЬ
            ИЛИ (НЕ
1 В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        1
КАК ПолеОтбора
                    ИЗ
                       
РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
                    ГДЕ
                        НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                        И ВЫБОР
                            КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                И
ТекущаяТаблица.#Параметр(1) ССЫЛКА Справочник.Организации
                               
И НЕ ТекущаяТаблица.#Параметр(1) = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                    (
ВЫБРАТЬ
                                                        1 КАК ПолеОтбора
                                                    ) КАК Оптмизация ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(1)
                                                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                            ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                            КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
                                И
ТекущаяТаблица.#Параметр(2) ССЫЛКА Справочник.Контрагенты
                               
И НЕ ТекущаяТаблица.#Параметр(2) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                   
Справочник.Контрагенты КАК Контрагенты ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = Контрагенты.ГруппаДоступаККонтрагенту
                                                                И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи))
                                               
ГДЕ
                                                    Контрагенты.Ссылка = ТекущаяТаблица.#Параметр(2))
                                           
ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                            // Для контроля доступности по складам. Начало
                           
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                И
ТекущаяТаблица.#Параметр(3) ССЫЛКА Справочник.Склады
                               
И НЕ ТекущаяТаблица.#Параметр(3) = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                    (
ВЫБРАТЬ
                                                        1 КАК ПолеОтбора
                                                    ) КАК Оптмизация ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(3)
                                                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                            ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                             // Для контроля доступности по складам. Конец
                            
ИНАЧЕ ИСТИНА
                       
КОНЕЦ = ЛОЖЬ))
                        И НЕ
ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL)
##КонецЕсли

Далее, переходим на закладку права, находим в ней Документ РеализацияТоваровиУслуг.
Если у вас уже есть ограничение вида:

#ОрганизацияВШапкеКонтрагентВШапке(«Организация», «Контрагент»)

то заменяем его нашим кодом:

#ОрганизацияВШапкеКонтрагентВШапкеСкладВШапке(«Организация», «Контрагент»,»Склад»)

 
Если такового нет, то добавляем новое ограничение прав и указываем текст нашего ограничения.

10) Сохраняем все. Заходим в предприятие и открываем справочник Группы пользователей. Жмем кнопку Права на нужной группе пользователей. На закладке склады указываем склады, которые должны быть доступны данной группе пользователей. После этого пользователи в справочнике складов смогут увидеть только указанные склады и отчеты, которые используют регистр ТоварыНаСкладах будут выводить ограниченный список складов.

 Следует заметить, что если у пользователя есть несколько ролей и хотя бы одна из них разрешает доступ к справочнику складов, то ограничение не будет срабатывать. В этом случае следует ограничение прописать для нескольких ролей по аналогии.

Я не стал ограничивать другие регистры на доступ по складам, например:ТоварыВРезервеНаСкладах, ЗаказыПоставщикам… Думаю по аналогии можно и в них добавить ограничения. В журнале реализаций (да и в других журналах, где есть поле склад) также не настраивал ограничений, поэтому в поле склад будет выводиться, но это все можно по аналогии с регистрами доработать.

Обновлено 22.02.12. Изменен пункт 8 статьи. Не было ограничения на чтение регистра для прав Пользователь. В связи с этим при формировании без выбора склада отчетов используемых данный регист приводило к выводу в отчет строк вида.

P.S Проверял работоспособность на 8.2- работает. Правда в режиме совместимости с 8.1 Smile

Спасибо пользователю Sai-2010 за замечание.

После данной доработки обновился на 8.2, прошел несколько релизов, сейчас остановился на 10.3.15.9 — все работает без сбоев.

Помогите плз! Не могу понять в чем дело. 1. Создаю в пустой УТ пользователя Петров с ролями Пользователь+МенПоПродажам. Захожу — создаю док ЗакзПокупателя без вопросов. (Установлено: «Ограничивать права на ур записей») 2. Переношу из ТиС справочники с пользователями и остатки по складам. Создаю пользователя из перенесенных, например, Иванов — Пользователь+МенПоПродажам. 3. При входе Петрова ЗаказПокупателч создается, а для Иванова — нет, с ошибкой: «{ОбщийМодуль.ЗаполнениеДокументов}: Ошибка при получении значения атрибута контекста (ОтражатьВРегламентированномУчете): У пользователя недостаточно прав на исполнение операции над базой данных.» При этом все галки в Настройках и Доп правах одинаковые. 4. Провожу документы остатков ПеремешениеТоваров. В отчетах появились остатки. 5. При попытке создания документа и Иванов и Петров вылетают по вышеназванной ошибке. Рядом база с такими же настройками без переноса — все работают нормально. Что может происходить при переносе?

убери «Ограничивать права на ур записей»

Когда убераю — все конечно работает, но у меня потом предполагается разграничение прав пользователей, т.е. опция нужная. А что такое всетаки может происходить. Может еще какие настройки есть? Два раза с нуля переносил — результат один (см. выше):-(

[но у меня потом предполагается разграничение прав пользователей, т.е. опция нужная] так настрой что бы работало, не чмори Иванова

Дык как только я ставлю галку ни Иванов ни Петров ничего не могут сделать, и все это после переноса и проведения остатков. Так что и разганичивать уже нечего.

Тэги:

Комментарии доступны только авторизированным пользователям

Содержание:

1.       Ошибка при установке значения атрибута контекста

2.       Ошибка при получении значения атрибута контекста

Одной из наиболее частых ошибок исполнения кода 1С являются ошибки, связанные с установкой реквизита либо получением реквизита через точку, либо ошибка при вызове функции или процедуры через точку. Все данные объекты являются атрибутами информационных объектов-владельцев, к которым они принадлежат. Рассмотрим примеры таких ошибок и причины их возникновения.  

1.    Ошибка при установке значения атрибута контекста

Ошибка при установке значения атрибута контекста говорит нам о невозможности присвоить выбранное значение определенному атрибуту информационного объекта. Вызвано это либо несовпадением типа атрибута и присваиваемого ей значения, отсутствием возможности присвоить значение выбранному атрибуту, так как его можно только читать, но не записывать в него, отсутствием прав у текущего пользователя на запись значений в данный атрибут. Например, в реквизит «ДатаДокумента» с типом «Дата» пытаемся записать строку, в реквизит с типом данных ссылки на документ пытаемся записать не ссылку, а объект, полученный по ссылке, что невозможно из-за несоответствия типов, что приводит к ошибке установки значения атрибута. 

Другой пример – проходя циклом выборку запроса, пытаемся в колонку выборки записать значение, что невозможно, так как значения выборки запроса можно только считывать, а для того, чтобы можно было полученные из запроса данные изменять в коде, нужно пользоваться не выборкой, а выгружать результат запроса в таблицу значений, в таком случае в цикле по ней можно будет менять значения в колонках, но только на значения, соответствующие типу колонки. Либо у пользователя, под которым выполняется код, нет прав на изменение даты документа, при попытке записать в данный реквизит новую дату, будет выведено сообщение об ошибке установке значения, но в причине будет указано отсутствие прав у пользователя.  

2.    Ошибка при получении значения атрибута контекста

Ошибка при получении значения атрибута контекста указывает на невозможность прочитать значение атрибута объекта в силу его отсутствия, либо отсутствия прав на его чтение. Например, обращение к несуществующему реквизиту объекта, несуществующему полю выборки из запроса, несуществующему свойству элемента формы и т.п. Так же как пример можно рассмотреть получение текущего пользователя из параметров сеанса — если данный параметр сеанса не установлен, то тоже будет выведена ошибка получения значения атрибута контекста, но в причине будет указана попытка получения неинициализированного значения параметра сеанса.

При возникновении данных ошибок значения атрибута в 1Св первую очередь следует проверить существование атрибута, к которому обращаются, затем проверить совпадение типов значений атрибута и присваиваемого ему значения, затем уже проверить права на установку либо чтение значения. Проверить, является ли дело в правах либо дать права на действия с атрибутом, можно, установив привилегированный режим для совершения действия с данным атрибутом, прописав перед строчкой с ошибкой УстановитьПривилегированныйРежим(Истина), после строчки — УстановитьПривилегированныйРежим(Ложь).  

Специалист компании «Кодерлайн»

Александр Суворов

Помогите плз! Не могу понять в чем дело. 1. Создаю в пустой УТ пользователя Петров с ролями Пользователь+МенПоПродажам. Захожу — создаю док ЗакзПокупателя без вопросов. (Установлено: «Ограничивать права на ур записей») 2. Переношу из ТиС справочники с пользователями и остатки по складам. Создаю пользователя из перенесенных, например, Иванов — Пользователь+МенПоПродажам. 3. При входе Петрова ЗаказПокупателч создается, а для Иванова — нет, с ошибкой: «{ОбщийМодуль.ЗаполнениеДокументов}: Ошибка при получении значения атрибута контекста (ОтражатьВРегламентированномУчете): У пользователя недостаточно прав на исполнение операции над базой данных.» При этом все галки в Настройках и Доп правах одинаковые. 4. Провожу документы остатков ПеремешениеТоваров. В отчетах появились остатки. 5. При попытке создания документа и Иванов и Петров вылетают по вышеназванной ошибке. Рядом база с такими же настройками без переноса — все работают нормально. Что может происходить при переносе?

убери «Ограничивать права на ур записей»

Когда убераю — все конечно работает, но у меня потом предполагается разграничение прав пользователей, т.е. опция нужная. А что такое всетаки может происходить. Может еще какие настройки есть? Два раза с нуля переносил — результат один (см. выше):-(

[но у меня потом предполагается разграничение прав пользователей, т.е. опция нужная] так настрой что бы работало, не чмори Иванова

Дык как только я ставлю галку ни Иванов ни Петров ничего не могут сделать, и все это после переноса и проведения остатков. Так что и разганичивать уже нечего.

Тэги:

Комментарии доступны только авторизированным пользователям

Ошибка при получении значения атрибута контекста (ТекущийПользователь)

bless18
06.04.2010 09:32 Прочитано: 52569

Ошибка при получении значения атрибута контекста (ТекущийПользователь): Попытка получения неинициализированного значения параметра сеанса
Пользователь = ПараметрыСеанса.ТекущийПользователь;
по причине:
Попытка получения неинициализированного значения параметра сеансаКод 1C v 8.х

 Процедура ПриНачалеРаботыСистемы()
Пользователь = ПараметрыСеанса.ТекущийПользователь;
Если обЗначениеНеЗаполнено(Пользователь.Сотрудник) Тогда
ИмяПользователя = СокрЛП(Пользователь.Наименование);
Иначе
ИмяПользователя = СокрЛП(Пользователь.Сотрудник.Наименование);
КонецЕсли;
Предупреждение("Здравствуйте уважаемый пользователь """+ИмяПользователя+"""
|Система готова к работе.", 3);
КонецПроцедуры

Где происходит их инициализация?

Yandex
Возможно, вас также заинтересует

Реклама на портале

E_Migachev
06.04.2010 09:48 Ответ № 1

Когда в Общие — Параметры сеанса добавил ТекущийПользователь, то его нужно определять при загрузке:
так же в процедуре ПриНачалеРаботыСистемы пишешь что то типо:
Код 1C v 8.х

 ИмяПользователя = ИмяПользователя();
Если Не ПустаяСтрока(ИмяПользователя) Тогда
ТекущийПользователь = Справочники.Пользователи.НайтиПоКоду(ИмяПользователя);
КонецЕсли;
ПараметрыСеанса.ТекущийПользователь = ТекущийПользователь;

Это работает при условии, что ИмяПользователя заданное в конфигураторе, равно Имени введенному в справочнике Пользователей в реквизит Код

bless18
06.04.2010 09:56 Ответ № 2

А если не совпадают, можно как-нибудб привязать пользователя к сотруднику?

E_Migachev
06.04.2010 09:57 Ответ № 3

А лучше добавить процедуру в Модуль сеанса(Правой клавишей щелкаещь на названии конфигурации и выбираешь Открыть модуль сеанса)

В ней создаешь Процедура УстановкаПараметровСеанса () и в ней пишешь код который я предложил выше или так, Если не совпадают:

Код 1C v 8.х

 Процедура УстановкаПараметровСеанса()
Спр = Справочники.Сотрудники;
ПараметрыСеанса.ТекущийПользователь=Спр.НайтиПоРеквизиту("Пользователь1С", ИмяПользователя());
КонецПроцедуры
//где Пользователь1С, это реквизит справочника сотрудники, и именем как вбито в конфигураторе

Эта процедура вызывается раньше чем ПриНачалеРаботыСистемы.

Ну а дальше подставлять сопоставленное значение при создании соответствующего документа:

Код 1C v 8.х

  Док.Пользователь=ПараметрыСеанса.Пользователь;   

События модуля сеанса:
Глобальный контекст
УстановкаПараметровСеанса (SessionParametersSetting)
Синтаксис:
УстановкаПараметровСеанса(<Требуемые параметры>)
Параметры:
<Требуемые параметры>
Тип: Массив; Неопределено. Массив устанавливаемых идентификаторов параметров сеанса, которые нужно инициализировать, если обработчик вызывается перед использованием неинициализированных параметров сеанса.
Неопределено, если обработчик события вызывается системой при начале сеанса или при захвате соединения из пула.
Описание:
Событие предназначено для инициализации параметров сеанса.
Вызывается системой:
при установке соединения с информационной базой или при захвате соединения с информационной базой из пула до вызова всех остальных обработчиков. Значение параметра «Параметры сеанса» — Неопределено;
перед фактическим использованием значений параметров сеанса, которые не были инициализированы ранее. В этом случае значением параметра «Параметры сеанса» является массив идентификаторов неинициализированных параметров сеанса, значения которых используются. Если после выполнения обработчика хотя бы один из перечисленных параметров сеанса остается неинициализированным, то возникает исключение.

bless18
06.04.2010 12:13 Ответ № 4

Спасибо вам огромное! Вы мне очень помогли!

bless18
06.04.2010 12:15 Ответ № 5

Спасибо вам огромное! Вы мне очень помогли!

E_Migachev
06.04.2010 15:44 Ответ № 6

Пожалуйста )

Подсказка: Щелкнув по значку (справа от названия вопроса), вы получите список ответов на похожие вопросы!

Статья для тех, кто только начинает разбираться с RLS (Record Level Security — доступ на уровне записей)
А также для тех, кому лень разбираться в тонкостях программирования. Можете взять за основу код приведенный в статье.

Появилась у меня необходимость в конфигурации «Управление торговлей» определенным группам пользователей ограничить доступ к списку складов. Поскольку в типовой конфигурации не предусмотрено такой возможности, я порылся в интернете и понял, что у многих возникал этот вопрос. Находил ответы на свой вопрос с примерами кода, но отрывками. Вот, решил оформить то, что у меня в результате получилось. Сразу оговорюсь, что с 8.X я недавно стал работать поэтому не пинайте сильно. В основном публикация предназначена для новичков.

Исходная конфигурация: Управление торговлей 10.3.8.9.

1) Добавляем новое значение в перечисление ВидыОбъектовДоступа —  Склады.

2) Вносим изменения в регистр сведений НастройкиПравДоступаПользователей. В измерениях ОбъектДоступа и ВладелецПравДоступа  отмечаем флажком  тип данных  СправочникСсылка.Склад.

3) Вносим изменения в обработку НастройкаПравДоступа:

  • Добавляем новую страницу, на которой будет происходить настройка доступа к складам. Я назвал её Склады.
  • Размещаем табличное поле на новой странице и настраиваем его по аналогии с табличными полями расположенными на закладках Организации и Контрагенты.

3.1) Добавляем строчки кода в модуль формы  НастройкаПравДоступа:

  •  Изменим функцию ПолучитьСписокОбластейДанных

Функция ПолучитьСписокОбластейДанных(ТипДанных)
   
СписокОбластей = Новый СписокЗначений;
    Если
ТипДанных = Тип(«СправочникСсылка.Организации») Тогда
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Организации);
    ИначеЕсли
ТипДанных = Тип(«СправочникСсылка.ГруппыДоступаККонтрагентам») Тогда
       
СписокОбластей.Добавить(Перечисления.ОбластиДанныхОбъектовДоступа.КонтрагентыСписок);
    ИначеЕсли
ТипДанных = Тип(«СправочникСсылка.ГруппыПользователей») Тогда
       
// Добавим только те виды объектов доступа, для которых нет областей данных
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Организации);
       
// Добавим все области данных
       
Для каждого Перечисление Из Перечисления.ОбластиДанныхОбъектовДоступа Цикл
           
СписокОбластей.Добавить(Перечисление);
        КонецЦикла;
       
// Для ограничения доступности по складам. Начало
   
ИначеЕсли ТипДанных = Тип(«СправочникСсылка.Склады») Тогда
       
СписокОбластей.Добавить(Перечисления.ВидыОбъектовДоступа.Склады);
       
// Для ограничения доступности по складам. Конец
   
КонецЕсли;
    Возврат
СписокОбластей;
КонецФункции

  •    Добавим код в  функцию ПередОткрытием:

ТипыОбъектовДоступа.Вставить(«Склады»     , Тип(«СправочникСсылка.Склады»));

4) Вносим изменения в ОбщийМодуль  НастройкаПравДоступа

Функция ПолучитьВидОбъектаДоступа(ОбъектДоступа) Экспорт
    Если
ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.Организации») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Организации;
    ИначеЕсли
ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.ГруппыДоступаККонтрагентам») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Контрагенты;
       
// Для ограничения доступности по складам. Начало
   
ИначеЕсли ТипЗнч(ОбъектДоступа) = Тип(«СправочникСсылка.Склады») Тогда
        Возврат
Перечисления.ВидыОбъектовДоступа.Склады;
       
// Для ограничения доступности по складам. Конец
   
Иначе
        Возврат
Перечисления.ВидыОбъектовДоступа.ПустаяСсылка();
    КонецЕсли;
КонецФункции
 

5) Добавляем ограничение доступа к данным на чтение у роли Пользователь для объекта Справочники Склады. В поле Ограничение доступа пишем следующий код: 
#ТаблицаОсновогоВидаОбъектаДоступа(«Склады», «Ссылка», «»)

1.png

Поскольку шаблон ограничений ТаблицаОсновогоВидаОбъектаДоступа уже есть, то здесь больше ничего не делаем. Теперь доступ на видимость складов в справочнике склады настроен. Далее нам нужно чтобы в отчеты попадали только те склады, которые доступны группе пользователей.

 6) Для роли, которую надо ограничить в доступе добавляем шаблон ограничений (закладка шаблоны ограничений). Назовем ограничение Склад, а  в тексте шаблона напишем код:

#Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей #Тогда
ТекущаяТаблица
ИЗ
   
#ТекущаяТаблица КАК ТекущаяТаблица
       
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
            СоставГруппы.Ссылка КАК ГруппаПользователей
        ИЗ
           
Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
        ГДЕ
            СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
        ПО (ИСТИНА)
ГДЕ
НЕ ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL
И
    (НЕ
1 В
                (ВЫБРАТЬ ПЕРВЫЕ 1
                    1
               
ИЗ
                   
РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа

                    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                        ПО
                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(1)
                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа
                                И НастройкиПравДоступаПользователей.ОбластьДанных = ЗНАЧЕНИЕ(Перечисление.ОбластиДанныхОбъектовДоступа.ПустаяСсылка)

                                И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей
                ГДЕ
                     НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                           И НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа В (ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады))

                    И НастройкиПравДоступаПользователей.ОбъектДоступа ЕСТЬ NULL))
#КонецЕсли 

7) Затем, возвращаемся на закладку Права и находим в дереве объект Регистр накопления —  ТоварыНаСкладах и добавляем ограничение доступа к данным на чтение. В поле Ограничение доступа пишем следующий код:

#Cклад(«Склад») 

8) Далее, для этого регистра для роли Пользователь создаем ограничение доступа к данным на чтение. Для этого добавляем ограничение следующего содержания ГДЕ ЛОЖЬ

9) Теперь нам нужно настроить форму списка документов таким образом, чтобы пользователь видел только те документы: реализация, заказ и т.д., где указан доступный для чтения склад. Я сделал ограничение в документе РеализацияТоваровУслуг. По аналогии с этим можно ограничить и другие формы списков документов.
Открываем роль, которой мы хотим назначить ограничение и переходим на закладку Шаблоны ограничений. Добавляем новый шаблон ОрганизацияВШапкеКонтрагентВШапкеСкладВШапке,в тексте шаблона пишем следующий код:

##Если &ИспользоватьОграниченияПравДоступаНаУровнеЗаписей ##Тогда
ТекущаяТаблица ИЗ #ТекущаяТаблица КАК ТекущаяТаблица
   
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
        СоставГруппы.Ссылка КАК ГруппаПользователей
    ИЗ
       
Справочник.ГруппыПользователей.ПользователиГруппы КАК СоставГруппы
    ГДЕ
        СоставГруппы.Пользователь = &ТекущийПользователь) КАК ГруппыПользователей
    ПО (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей)
ГДЕ (&ИспользоватьОграниченияПравДоступаНаУровнеЗаписей = ЛОЖЬ
            ИЛИ (НЕ
1 В
                    (ВЫБРАТЬ ПЕРВЫЕ 1
                        1
КАК ПолеОтбора
                    ИЗ
                       
РегистрСведений.НазначениеВидовОбъектовДоступа КАК НазначениеВидовОбъектовДоступа
                    ГДЕ
                        НазначениеВидовОбъектовДоступа.ГруппаПользователей = ГруппыПользователей.ГруппаПользователей
                        И ВЫБОР
                            КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                И
ТекущаяТаблица.#Параметр(1) ССЫЛКА Справочник.Организации
                               
И НЕ ТекущаяТаблица.#Параметр(1) = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                    (
ВЫБРАТЬ
                                                        1 КАК ПолеОтбора
                                                    ) КАК Оптмизация ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(1)
                                                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Организации)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                            ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                            КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
                                И
ТекущаяТаблица.#Параметр(2) ССЫЛКА Справочник.Контрагенты
                               
И НЕ ТекущаяТаблица.#Параметр(2) = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                   
Справочник.Контрагенты КАК Контрагенты ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = Контрагенты.ГруппаДоступаККонтрагенту
                                                                И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Контрагенты)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи))
                                               
ГДЕ
                                                    Контрагенты.Ссылка = ТекущаяТаблица.#Параметр(2))
                                           
ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                            // Для контроля доступности по складам. Начало
                           
КОГДА НазначениеВидовОбъектовДоступа.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                И
ТекущаяТаблица.#Параметр(3) ССЫЛКА Справочник.Склады
                               
И НЕ ТекущаяТаблица.#Параметр(3) = ЗНАЧЕНИЕ(Справочник.Склады.ПустаяСсылка)
                               
ТОГДА ВЫБОР
                                        КОГДА 1 В
                                                (ВЫБРАТЬ ПЕРВЫЕ 1
                                                    1
                                               
ИЗ
                                                    (
ВЫБРАТЬ
                                                        1 КАК ПолеОтбора
                                                    ) КАК Оптмизация ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.НастройкиПравДоступаПользователей КАК НастройкиПравДоступаПользователей
                                                        ПО
                                                           
НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(3)
                                                               
И НастройкиПравДоступаПользователей.ВидОбъектаДоступа = ЗНАЧЕНИЕ(Перечисление.ВидыОбъектовДоступа.Склады)
                                                                И (
НастройкиПравДоступаПользователей.Пользователь = НазначениеВидовОбъектовДоступа.ГруппаПользователей
                                                                    ИЛИ НастройкиПравДоступаПользователей.Пользователь = ЗНАЧЕНИЕ(Справочник.ГруппыПользователей.ВсеПользователи)))
                                            ТОГДА ИСТИНА
                                        ИНАЧЕ ЛОЖЬ
                                   
КОНЕЦ
                             // Для контроля доступности по складам. Конец
                            
ИНАЧЕ ИСТИНА
                       
КОНЕЦ = ЛОЖЬ))
                        И НЕ
ГруппыПользователей.ГруппаПользователей ЕСТЬ NULL)
##КонецЕсли

Далее, переходим на закладку права, находим в ней Документ РеализацияТоваровиУслуг.
Если у вас уже есть ограничение вида:

#ОрганизацияВШапкеКонтрагентВШапке(«Организация», «Контрагент»)

то заменяем его нашим кодом:

#ОрганизацияВШапкеКонтрагентВШапкеСкладВШапке(«Организация», «Контрагент»,»Склад»)

 
Если такового нет, то добавляем новое ограничение прав и указываем текст нашего ограничения.

10) Сохраняем все. Заходим в предприятие и открываем справочник Группы пользователей. Жмем кнопку Права на нужной группе пользователей. На закладке склады указываем склады, которые должны быть доступны данной группе пользователей. После этого пользователи в справочнике складов смогут увидеть только указанные склады и отчеты, которые используют регистр ТоварыНаСкладах будут выводить ограниченный список складов.

 Следует заметить, что если у пользователя есть несколько ролей и хотя бы одна из них разрешает доступ к справочнику складов, то ограничение не будет срабатывать. В этом случае следует ограничение прописать для нескольких ролей по аналогии.

Я не стал ограничивать другие регистры на доступ по складам, например:ТоварыВРезервеНаСкладах, ЗаказыПоставщикам… Думаю по аналогии можно и в них добавить ограничения. В журнале реализаций (да и в других журналах, где есть поле склад) также не настраивал ограничений, поэтому в поле склад будет выводиться, но это все можно по аналогии с регистрами доработать.

Обновлено 22.02.12. Изменен пункт 8 статьи. Не было ограничения на чтение регистра для прав Пользователь. В связи с этим при формировании без выбора склада отчетов используемых данный регист приводило к выводу в отчет строк вида.

P.S Проверял работоспособность на 8.2- работает. Правда в режиме совместимости с 8.1 Smile

Спасибо пользователю Sai-2010 за замечание.

После данной доработки обновился на 8.2, прошел несколько релизов, сейчас остановился на 10.3.15.9 — все работает без сбоев.

Понравилась статья? Поделить с друзьями:
  • Ошибка при перенаправлении команды приложению excel 2007
  • Ошибка при получении значения атрибута контекста историяработыпользователя
  • Ошибка при подключении к базе материалов mdm db1
  • Ошибка при подключении openvpn
  • Ошибка при подключении к сети интернет 651