Ограничение доступа к справочнику склады для конфигурации Управление торговлей 8.1(8.2), редакция 10.3.

Статья для тех, кто только начинает разбираться с 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 — все работает без сбоев.

97 Comments

  1. sanches

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

    А также для тех, кому лень разбираться в тонкостях программирования. Можете взять за основу код приведенный в статье.

    Перейти к публикации

    Reply
  2. iov

    не ну прям вот сразу посл прочтения статьи — как раз это и попросили… вот прям дорогая ложка и прям к обеду

    Reply
  3. sanches

    Рад, что пригодилось 🙂

    Добавил еще ограничение по типу цен, делается все по подобию складов.

    Reply
  4. bsi

    а документы (ПТУ, ОРП, РТУ, …) с НЕразрешенными складами как у ограниченного юзера видятся?

    Reply
  5. sanches

    Вот таким образом пока выглядит реализация 🙁

    Да, и если используются склады в табличной части документа, то тут надо как-то выворачиваться…

    Reply
  6. AlexKoso

    Аналогичное делал несколько месяцев назад. Только в добавок еще номенклатуру, физлиц, подразделения, цены номенклатуры и кассы 🙂

    Вот таким образом пока выглядит реализация

    такое бывает если несколько ролей у пользователя, и под одной из них для нужного документа/регистра и т.д. не прописан RLS

    Reply
  7. sanches

    Изменил 8 пункт. Описал в нем пример ограничений на форму списка документов.

    Чтобы не было строк вида <Объект не найден>

    Вот только код нормально пока не могу опубликовать 🙂

    Reply
  8. AlexKoso

    вот…дело за малым: еще половину регистров так обстругать, чтобы в банальной «Ведомсти по товарам на складах» тоже не выводилось <Объект не найден> 😉

    Reply
  9. AlexKoso

    Аналогичная ситуация если нужно сделать право не только на чтение, но и на запись:

    а) ставите галку на права «Добавление» и «Изменение»;

    б) создаете еще один шаблон (к имени в конце можно приписать «…_Запись» — по аналогии с типовыми).

    в этом новом шаблоне к условию

    И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей

    добавляете еще условие чтобы оно стало вот таким:

    И НастройкиПравДоступаПользователей.Пользователь = ГруппыПользователей.ГруппаПользователей И НастройкиПравДоступаПользователей.Запись = ИСТИНА

    в) получите — распишитесь 🙂

    P.S. жаль что автор не коснулся этой темы раньше и мне не повезло как iov, пришлось самому. На форумах полазить как то в голову не пришло.

    Reply
  10. sanches
    AlexKoso пишет:

    вот…дело за малым: еще половину регистров так обстругать, чтобы в банальной «Ведомсти по товарам на складах» тоже не выводилось <Объект не найден>

    Да, в регистре ТоварыНаСкладах я уже написал ограничение (в статье есть). Просто есть еще и другие регистры.

    Думаю, кому надо, тот по аналогии сможет добавить и в другие регистры.

    Да и сам добавлю 🙂

    Reply
  11. kay05

    Всем привет.

    Делаю для спр.»Виды номенклатуры», в результате выполненных манипуляций получаю предупреждение:

    Обнаружено несоответствие настроек!

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

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

    Возможно, следует скорректировать использование видов объектов доступа в форме группы пользователей.

    Следует проверить следующие группы пользователей:

    — Продажи (Виды номенклатуры)

    Где включить это ограничение?

    Reply
  12. sanches

    Тут

    Reply
  13. Blade Runner

    Фильтр на регистр не сработал, зато удивительно хорошо работает

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

    пока не пойму, отчего, и чем это чревато 😀

    Reply
  14. sanches
    Blade Runner пишет:

    Фильтр на регистр не сработал, зато удивительно хорошо работает

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

    пока не пойму, отчего, и чем это чревато

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

    Reply
  15. Djus

    Спасибо автору за мануал 🙂

    Reply
  16. sanches

    Пожалуйста

    Reply
  17. vis_tmp

    Большое спасибо, очень помогло в работе!

    Часть я уже и сам сделал, но хорошо, что автор описал всё подробно и по порядку.

    Reply
  18. WildDancer

    Большое спасибо автору, отличная работа, в типовой все отлично работает. Жаль мне не помогло… У меня отраслевка, в ней документ основной имеет товары в табличной части со статусами (есть на складе, нет на складе, заказан, и тп), соответственно склады в табличной части. При открытии документа, в котором есть товары, имеющиеся на складе к которому нет доступа — ошибка

    {ВнешняяОбработка.бит_ус_ЗащищенныеФункции.МодульОбъекта(738)}: Ошибка при вызове метода контекста (Выполнить)
    ВыборкаНоменклатура = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
    по причине:
    
    по причине:
    Ошибка выполнения запроса
    по причине:
    У пользователя недостаточно прав на исполнение операции над базой данных.

    До запроса даже не добраться, он в защищенном куске кода(

    Reply
  19. sanches

    Спасибо 🙂

    Reply
  20. PastorNak

    Большое спасибо

    Reply
  21. dtitov

    Написано доступно и понятно. А главное актуально для нашего предприятия. Огромное спасибо! С удовольствием плюсую!!!

    Reply
  22. irinrish

    Добрый день, sanches!

    Спасибо за материал, он очень пригодился, только вот не получается воспроизвести… Сделала все как написано до пункта 5, включительно. Пользователю настроила в регистре доступ, на картинке настройка, и почему то ему не доступен стал ВЕСЬ справочник — при открытии списка, выходит ошибка «Нарушение прав доступа». Как узнать, в чем дело? Как вообще этот механизм отлаживать?

    Reply
  23. sanches

    Здравствуйте, спасибо за отзыв. Проверьте у роли Пользователь права на справочник склады. У меня так сделано

    Reply
  24. irinrish

    точно! не было галочки для просмотра! Спасибо огромное!! Буду дальше ковыряться 🙂

    Reply
  25. sanches

    Удачи в ковыряниях 🙂

    Reply
  26. aochkasov

    Хорошая статья

    Reply
  27. Ankiss

    Спасибо большое все работает

    Reply
  28. ThunderUA

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

    Reply
  29. aleksru24

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

    {Обработка.НастройкаПравДоступа.Форма.НастройкаПравДоступа(522)}: Тип не определен

    Если ТаблицаПравДоступа.Найти(Новый(СтраницаПанели.Значение), «ТипОбъектаДоступа») = Неопределено Тогда

    Что не там сделал?

    Reply
  30. sanches

    (27) ThunderUA,

    Можете сделать ограничения и на табличную часть документа.

    Вот только как быть с доступностью документа если в нем несколько складов и один из них доступен, а второй нет — решать вам.

    Ну и если все-таки давать открывать документ, то части строк в нем видно не будет, что может озадачить пользователя.

    Reply
  31. sanches

    (28) aleksru24,

    Возможно, у вас по какой-то причине не заполнено СтраницаПанели.Значение

    Reply
  32. sai-2010

    Добрый день!

    Отличная статья!

    Все получилось и прекрасно работает!

    У меня вопрос к уважаемому автору и аудитории:

    Как сделать аналогичные ограничения на отчет по «Ведомость товаров на складах»

    Есть необходимость ограничить определенных пользоваптелей информацией ТОЛЬКО по им

    доступным складам.

    Заранее спасибо!

    Всем удачи!

    Reply
  33. sanches

    (31) sai-2010, Спасибо! 🙂

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

    Reply
  34. sai-2010

    Добрый день!

    Спасибо огромное за подсказку, только не очень удалось зажать Ведомость по товарам.

    Всеравно дает отчет по ЛЮБОМУ складу!

    Может еще где что то добавить надо…

    Удачи!

    Reply
  35. sanches

    (33) sai-2010,

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

    Пишет <Объект не найден> для складов не доступных для чтения.

    Надо разобраться. Отпишу позже о рерультатах

    Спасибо за подсказку!

    Reply
  36. sai-2010

    Спасибо за вснимание к моей проблеме!

    С нетерпением буду ждать Вашего решения.

    Очень хочется запустить это ограниченеи по правам.

    Это очень актуальная задача для удаленных пользователей, когда они

    работают в терминале. У них есть свой склад, и зачем им видеть все остальные склады,

    а главное движением! по чужим складам.

    Так что вопрос не надуманный, а реально по жизни.

    Удачи!

    Жду Вашего решенния.

    Reply
  37. leon111

    Спасибо, отличная статья!

    Reply
  38. serq82

    дошел до 7 пункта

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

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

    пишет:

    Шаблон ‘Склад’ не существует(

    все получилось,а никто не подскажет какие регистры надо изменить чтобы все получилось в роли менеджера по продажам и покупкам?

    Reply
  39. sanches

    (35) sai-2010,

    Решение проблемы следующее.

    Заходите в Роль Пользователь, заходите в ветку РегистрыНакопления затем ТоварыНаСкладах.

    Создаете ограничение на чтение, где указываете в поле ограничение доступа текст ГДЕ ЛОЖЬ

    в поле поля автоматически установится значение <Прочие поля>

    После этого «лишние» склады исчезнут из отчета.

    Reply
  40. sanches

    (37) serq82, Для этого нужно для необходимых ролей повторить пункты 5-7. Создать для них ограничение на чтение регистров.

    Reply
  41. sanches

    Лишнее

    Reply
  42. serq82

    (40) большое спасибо,к нужным справочникам я закрыл доступ,ща буду смотреть отчеты

    Reply
  43. OscarTT

    «Рад, что пригодилось

    Добавил еще ограничение по типу цен, делается все по подобию складов.»

    Где же это добавление по типу цен? Ткните носом, надо именно по ценам и выбору их в документе.

    Reply
  44. OscarTT

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

    Пытаюсь сделать по аналогии, но не могу понять где «Жмем кнопку Права на нужной группе пользователей. На закладке склады указываем склады, которые должны быть доступны данной группе пользователей.»

    Куда дальше жать? ))

    Reply
  45. sanches

    (42) OscarTT,

    Добавил в своей конфигурации, но выкладывать не стал, поскольку принцип ограничения схож с тем, что описан в статье. Создаем закладку Типы цен в настройках прав доступа и т.д.

    Но на самом деле с типами цен не все так просто как казалось. При включении ограничения у меня проявились проблемы

    1) В программе есть возможность указать тип цен для каждого пользователя ниже которого нельзя продавать. И получилось так, что я запретил пользователю видеть закупочный тип цен, а он стоял у него в настройках как тип цен ниже которого нельзя продавать в результате при проведении документа(вроде) вываливается ошибка.

    2) При ведении индивидуальных типов цен для контрагентов необходимо каждый раз держать актуальным список типов цен доступных пользователю иначе в подборе будет вываливаться ошибка. Дело в том,что в настройках прав доступа указываются объекты, которые может пользователь видеть, все что не указано будет не доступно. Поэтому может получиться ситуация такая. Был тип цен Розница и он был доступен пользователю. Добавили тип цен Розница-3% и назначили этот тип цен для покупателя, но поскольку этот тип цен не был указан как доступный для пользователя, то про выписке документов в подборе будет выходить ошибка о нарушении прав доступа до тех пор пока не указать новый тип цен как доступный для пользователя. У меня типов цен в базе более сотни и часто добавляют новые (возможно и не правильно) и эта проблема актуальна. Поэтому пока не развиваю тему с ограничением типов цен.

    Reply
  46. sanches

    (43) OscarTT,

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

    К тому же я делал это на 8.1. Сейчас 8.2 но в режиме совместимости с 8.1 — работает все нормально.+ У меня довольно древний релиз 10.3.9.4 и выглядит справочник так

    Reply
  47. VanechkaDiev

    Отличный и простой для понимания материал! только «+»

    Reply
  48. Lenten

    (37) serq82,

    дошел до 7 пункта


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

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

    пишет:

    Шаблон ‘Склад’ не существует(

    А как с этим разобрались?

    Reply
  49. Lenten

    (47) Lenten, Оказалось что если #Cклад(«Склад») не копировать, а написать, то все норм(в чем разница я так и не увидел). Может кому поможет

    Reply
  50. Lenten

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

    Ошибка в ограничении доступа к данным.

    объект: ‘Документ.ПоступлениеТоваровУслуг’, поле: ‘Проведен’; право: ‘Чтение’

    {(59, 50)}: Поле не найдено «ТекущаяТаблица.Склад»

    И ТекущаяТаблица.<<?>>Склад ССЫЛКА Справочник.Склады

    по причине:

    {(59, 50)}: Поле не найдено «ТекущаяТаблица.Склад»

    И ТекущаяТаблица.<<?>>Склад ССЫЛКА Справочник.Склады

    Почему это может быть? Притом что стандартное ограничение по Организации в Поступлении нормально срабатывает

    Оказалось там надо

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

    Reply
  51. 4ur

    как раз то, что просили сделать, только для цен, как раз и попробую, думал, что придется программировать, а тут оказывается и по другому можно…

    Reply
  52. sanches

    (50) 4ur, Если Вы про типы цен, то там посложнее будет реализация, я писал выше некоторые моменты, с которыми мне пришлось столкнуться при введении ограничения по типам цен. В итоге оно работает, но местами — криво.

    Reply
  53. 4ur

    попробую прилепить с УПП, там эти ограничения очень дотошно сделаны, только напильником придется немного обработать…

    Reply
  54. prodv

    Спасибо автору, кучу времени сэкономил.

    Большущий ПЛЮС!

    Reply
  55. ekoelxan

    Автор, ОГРОМНОЕ ВАМ СПАСИБО!

    Reply
  56. sanches

    Пожалуйста, рад, что пользуется спросом!

    Reply
  57. 2791

    А ограничение по учетам кто-то делал? Ограничить группу пользователей к просмотру документов «ОтражатьВ УпрвленческомУчете»(в базе ведутся отдельно документы бух и упр учета)

    Reply
  58. Rad90210

    Плавали знаем… На больших базах притормаживает … а за описание обнозначно +

    Reply
  59. sanches

    (56)Я не делал, но думаю там не сложнее чем с организациями и контрагентами. Даже проще, наверное.

    (57)Да, согласен. В УТ11 еще больше возможностей ограничить доступ к данным через RLS, интересно как там с быстродействием.

    Reply
  60. AlexO

    (0) можно было бы многое написать, начиная от «код скопирован с типового РЛС, но не понят/не разобран» и до ошибок в статье, но — зачем?

    Пусть студенты учатся сами, и сами набивают свои собственные шишки.

    Во, 70 плюсов, рванет, и не раз.

    Reply
  61. 2791

    (58) Разобралась, оказалось намного проще, чем по организации и контрагентам

    Reply
  62. sanches

    (59)Я и не претендовал на оригинальность, код брал из типовой УТ и добавлял то, что нужно. Лично у меня все работает.

    Вы уже либо пишите по существу про ошибки либо не спамьте. Или вам надо заработать на комментариях рейтинг?

    Знающий человек бы написал и указал на ошибки,а смысл вашего комментария мне не понятен. Показать свои знания? Так покажите на деле, укажите на ошибки по существу.

    Хорошо, что у вас всегда получается идеально и с первого раза.

    Reply
  63. AlexO

    (61) 2791,

    Разобралась, оказалось намного проще, чем по организации и контрагентам

    не забудьте вспомнить только впоследствии, что когда-то залезли и наделали RLS вне типовых.

    …чтобы знать, где и откуда начать вычищать авгиевы конюшни…

    Reply
  64. interlamersha

    (58) Насчет БУ и УУ не сложнее чем с контрагентом, эт не так. Пару месяцев назад разруливала RLS в УТ, и обнаружила интересную деталь по ограничениям по регистрам. Ограничение можно поставить только в том случае если оно накладывается на измерение или ресурс регистра. Наложить ограничение по реквизиту документа регистратора фигушки! Признак УУ и БУ в УТ в регистрах нигде не значится, а это значит, что документы из журналов скрыть ноу проблемз, а сделать так чтобы движуха по этим документам не вылазила при открытии регистра на просмотр, при формировании отчетов по регистрам, это как говорил Шарик «Индейская изба, фиг вам называется!».

    Reply
  65. Antimyslitel

    У меня возникла проблема все описанное выше проделал но выдает ошибку Поле Объекта не обнаружено и {Обработка.НастройкаПравДоступа.Форма.НастройкаПравДоступа(148)}: Поле объекта не обнаружено (ТаблицаПравДоступа_Склады)

    Элемент = ЭлементыФормы[«ТаблицаПравДоступа_» + КлючИЗначение.Ключ];

    Что делать как поступить? спасибо!

    Reply
  66. AlexO

    (60)

    Знающий человек бы написал и указал на ошибки

    не-1сник давно бы погугли + поиск по ИС включил бы, и нашел много интересного по RLS + масса моих разъяснений в том числе, тянущих на три статьи по RLS.

    Reply
  67. AlexO

    (63) interlamersha,

    а вы еще больше довепряйте студенческим статьям, еще не такого наворотите…

    Хотите под девизом «RLS — это просто» наподелать ограничений? Флаг в руки, кто вам за это заплатит — заплатит помто вдвойне за разгребание понаделанного и возвращение к исходному состоянию.

    Reply
  68. sanches

    (65)И опять комментарий ни о чем.

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

    Reply
  69. sanches

    Все ясно, тролль у нас завелся.

    Reply
  70. AlexO

    (67)

    оно и понятно, что не нашли — вы даже не знаете, что искать.

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

    Захотите — найдете по моим сообщениям.

    Reply
  71. AlexO

    (68)

    тролли — это вы и подобные вам студенты.

    Reply
  72. sanches

    (69)Вы еще и читать не умеете. Если внимательно посмотреть на дату публикации статьи, то можно увидеть 18.07.2011, что намного раньше чем ваши ссылки, которые непонятно где…

    Reply
  73. AlexO

    (71)

    а причем тут дата? есть статьи в инете от 2004-2006, обсуждения.

    А это как раз вам минус — вы так с той поры и не знаете, чему учите, и призываете также «не знать» и бездумно выполнять механические действия других, хотя что-что, а настройка RLS может обернуться не просто ошибкой в коде.

    Reply
  74. sanches

    (64)Antimyslitel, проверьте, чтобы табличное поле, которое вы добавили на новой закладке склады имело имя ТаблицаПравДоступа_Склады

    Reply
  75. Antimyslitel

    Теперь возникла эта ошибка:

    {ОбщийМодуль.ЗаполнениеДокументов(569)}: Ошибка при получении значения атрибута контекста (ОтражатьВРегламентированномУчете)

    ФлагОтражРеглУчете = ЗначениеЗаполнено(ДокументОбъект.Организация) И ДокументОбъект.Организация.ОтражатьВРегламентированномУчете;

    по причине:

    У пользователя недостаточно прав на исполнение операции над базой данных.

    Вроде в группу пользователей — пользователя добавил!

    и после включение под этим пользователем в документе реализации когда пытаюсь добавить документ выскакивает вышеуказанная ошибка помогите плззз!

    Reply
  76. sanches

    (74)Antimyslitel, попробуйте создать новую роль путем копирования роли Пользователь, и в ней проделать п.5 статьи. Если не хочется править типовые роли, то можете оставить эту новую роль и назначить ее пользователям

    Reply
  77. AlexO

    (75)

    давайте, давайте — множьте роли с RLS, давайте вредные советы.

    Вся статья об этом, неофиты-последователи быстрее по голове получат.

    Reply
  78. interlamersha

    (66) AlexO, Вы по ходу читать не умеете, или не желаете. В моём комменте как раз то обозначено, что RLS это не просто, и приведен один из ярких примеров, где можно лихо сесть в лужу. А троллем вас не зря назвали, все ваши комменты содержат одно «я такой умный, а вы тут все идиоты, я где то там в интернете написал кучу статей по RLS и не одной на инфостате, а вы их даже почитать не удосужились». Ссылки в студию! И пофиг, что на инфостате ваша статья практически перепечатка руководства по администрированию.

    Насчет «а вы еще больше доверяйте студенческим статьям», я не имею привычки тупой бездумной скачки или переписки чужих работ, чужого программного кода. Я не первый год программирую на 1С, в том числе работаю с механизмом RLS, есть несколько клиентов с доработками RLS, работает как часы. Да в этой статье не раскрыт механизм работы с RLS, ни принципы работы, ни способы работы с параметрами, ни плюсы минусы.

    Грабли есть в RLS и не одни, но пишите о них в комментах, пишите о статье по существу, а не тратьте попусту моё время и время посетителей данной статьи на чтение вашего пустого трёпа.

    Reply
  79. interlamersha

    (52) 4ur, Для чего вам в УПП пилить RLS по складам? там и так этот механизм уже написан, зачем изобретать велосипед?

    Reply
  80. 4ur

    (78) interlamersha, как всегда не совсем верно выразился, т.к. этот механизм очень дотошно сделан в УПП, то для примера взял себе как раз реализацию его в УПП, надо было в УТ немного подправить…

    Reply
  81. interlamersha

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

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

    Что касается ордерных складов, то если внимательно посмотреть запрос в настройке документа поступление то можно найти следующий немаловажный кусок:

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

    Думаю тут всё вполне понятно, если нужно будет прокомментить, пишите, будет время отвечу.

    Полностью код приводить не буду, кому нужно будет, думаю посмотрит сам.

    Еще раз обращаю внимание читателей: приведенный код это лишь маленький кусочек запроса, не надо сразу же запихивать его в настройки прав в указанные документы!

    Reply
  82. sanches

    interlamersha, большое спасибо за констуктивный комментарий. Я постараюсь как можно быстрее отредактировать статью.

    Я уже точно не помню откуда взял за основу шаблон, вроде из УТ 11

    Reply
  83. interlamersha

    (27) ThunderUA, можете попробовать посмотреть в типовой УТ шаблон КонтрагентВТабличнойЧасти и КонтрагентВТабличнойЧасти_Запись, этот шаблон в частности используется в документе «Классификация покупателей по стадиям взаимоотношения» в роли «МенеджерПоПродажам». Можно попробовать замутить что-нибудь по аналогии, но со складами, но опять же ОЧЕНЬ ОЧЕНЬ АККУРАТНО!!! В 2х словах о работе данного RLS в типовой УТ, на примере указанного документа. Если создать документ в табличной части которого указан контрагент право доступа к которому пользователь с «ограничениями» не имеет, то документ не будет виден в списке, даже если в этом документе были указаны в том числе разрешенные контрагенты.

    Т.е. если данный механизм перекладывать на Склады, то только при условии, что заказчика, руководство и т.п. устраивает данный вариант. Если же пользователь хочет только скрывать строки в документе с «запрещенными» складами, то тут сложнее. Опять же необходимо оттестить как будет вести себя система при автоматическом заполнении складов в табличной части.

    Еще раз ОЧЕНЬ ОЧЕНЬ АККУРАТНО, чётко осознавая каждую букву и запиточку кода RLS и понимая всю структуру вашей конфигурации.

    Reply
  84. interlamersha

    маленький докоммент к моему предыдущему пОсту:

    Тупо взять и поменять в указанных шаблонах Контрагента на Склад нельзя, т.к. необходимо также учитывать тот факт, что СКЛАД В ДОКУМЕНТАХ И В ШАПКЕ И В ТАБЛИЧНОЙ ЧАСТИ!!! Т.е. моя рекомендация есть ни что иное как подсказка в какую сторону глянуть, где подсмотреть кусочек, а не готовое решение, продумывайте внимательно алгоритм.

    Reply
  85. sanches

    Да, про склады в табличной части я писал, что если используются склады в табличной части, то нужно что-то придумывать… Показывать часть строк в документе как-то не хорошо.

    Reply
  86. interlamersha

    На самом деле в моей практике варианты с использованием складов в табличной части попадаются редко, и тому есть одна немаловажная причина, это стыковка УТ-БП. В бухии нет складов в табличной части, и такие документы будут грузиться на тот склад который указан в шапке документа, или же на склад указанный «Основной по умолчанию». Если в УТ ведется складской учет, а в БП не ведется или же весь товар кидается на единый склад и не заморачиваются с перемещениями, то такая схема прокатывает, а если же этот складской учет есть, то ждите криков бухгалтеров «почему это в торговле реализация прошла, а в бухгалтерии не проводится!». Частенько перепиливаю типовые правила конвертации УТ-БП на работу через обработку, а не через планы обмена, т.е. так как это было в УТ-БП 1.6., на это тоже есть ряд причин, но это другая история, так вот, в типовых правилах данная схема на сколько мне помнится до сих пор не разрулина корректно.

    Reply
  87. AlexO

    (82) interlamersha,

    Если же пользователь хочет только скрывать строки в документе с «запрещенными» складами, то тут сложнее. Опять же необходимо оттестить как будет вести себя система при автоматическом заполнении складов в табличной части.

    так-так, уже и строки в документах решили ограничивать через RLS…

    Молодцы!

    Как у вас тут весело… 🙂

    Reply
  88. sanches

    (86) а я было обрадовался что вы нас покинули, ан нет…

    Только и можете что трепаться, а на деле пусто!

    Свербит видимо в одном месте…

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

    Reply
  89. interlamersha

    (86) AlexO, оставьте ваши шизофренические идеи при себе. В каком именно из моих постов вы увидели фразу

    строки в документах решили ограничивать через RLS… 

    ?

    ЕЩЕ РАЗ, ДЛЯ ОСОБО «ОДАРЁННЫХ», повторю, читайте внимательно посты, прежде чем что-либо писать в ответ, если не умеете читать, сходите в книжный магазин, купите букварь, или в оптику за очками.

    Reply
  90. sanches

    Вы что ли жертва? :))

    Вы жертва окулиста, это да

    Reply
  91. interlamersha

    (90) AlexO, если я студентка с 7ми летним стажем ежедневного программирования на платформе 7.7, 8.1 и 8.2, с наличием профильного высшего образования и с несколькими сертификатами СПЕЦИАЛИСТА 1С в том числе по УТ 10.3, работающая на крупных проектах, в том числе работающая не первый год с RLS, то вы ДАЖЕ НЕ УДОСУЖИЛИСЬ ПОЛУЧИТЬ НАЧАЛЬНОЕ ШКОЛЬНОЕ ОБРАЗОВАНИЕ, ЧИТАТЬ НЕ УМЕЕТЕ.

    КУПИТЕ БУКВАРЬ И НАУЧИТЕСЬ ЧИТАТЬ ДЕТОЧКА!!!

    А то у вас как в том анекдоте, писать умею, читать не умею. Думать, судя по комментам, также как читать, не научили.

    Reply
  92. Балабас

    внимательнее читаем, и все получится

    Reply
  93. Audag

    Добрый день. Спасибо автору за познавательную статью!

    Пытаюсь сделать так как написано, внес все изменения, сохранил конфигурацию.

    Создаю для группы пользователей права. При сохранении ругается на:

    {Обработка.НастройкаПравДоступа.Форма.НастройкаПравДоступа(92)}: Поле объекта не обнаружено (Чтение_)

    СтрокаТаблицыПравДоступа[«Чтение_» + Индекс] = Истина;

    Не подскажете в чем может быть причина?

    Reply
  94. sanches

    (102) Audag,

    Проверьте, что бы на закладке Склады в табличном поле ТаблицаПравДоступа_Склады были поля Чтениеи Запись, по аналогии с организациями и контрагентами

    Reply
  95. Antimyslitel

    (86) AlexO,

    Слушай умный дядя!

    Хочешь подскажу тебе где находится место в котором ты будешь чувствовать себя комфортно?

    Если ты столь умный возьми да и подскажи или наведи или напиши как это правильно тебя за это миллионы поблагодарят, а не умничай! А если еще в придачу ты напишешь все правильно и все будет у всех работать то тогда тебя возможно еще и материально поблагодарят!

    Reply
  96. WWWolfy

    (102) Audag, тут ещё надо прописать:

    НастройкаПравДоступа (общий модуль) -> ПолучитьВидОбъектаДоступа

    это п.4

    Reply
  97. Boudybuilder

    Пригодилась статья. Не надо самому долго придумывать. Взял и скопировал.

    Спасибо.

    Вопрос встал тогда когда понял что ограничивать надо по группе родителю справочника склады. Чтобы пользователь имел доступ к подчиненным. В регистре есть колонка «Вид наследования прав доступа иерархических справочников», которая видимо ни на что не влияет. Так как по запросу ограничения прав доступа вижу что она не используется. Или я ошибаюсь?

    Пришлось дописывать такой текст в шаблоне:

    ГДЕ
    (НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(2)
    ИЛИ НастройкиПравДоступаПользователей.ОбъектДоступа = ТекущаяТаблица.#Параметр(2).Родитель)
    

    Ну, спасает хотя бы на один уровень вложенности.

    И еще вопрос, зачем эти две одинаковые колонки в регистре «Объект доступа» и «Владелец прав доступа»? Ведь они повторяются…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *