Версия для печати темы (https://pro1c.org.ua/index.php?s=bd7be0c99ae792c7bbea6c528577e454&showtopic=36736)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Фильтр формы списка документов

Автор: Constantus 20.04.17, 14:04

Приветствую, форумчане!
"Управление торговлей 10.3", (Моби-С 5.5). "ABBYY Ukraine", 2003-2014 (2.3.20.1)

Для ограничения просмотра некоторых документов, например, Реализация, на код при открытии повесил следующее:

    ЭтаФорма.Отбор.Склад.Использование=Истина;
    ЭлементыФормы.Список.Значение.Отбор.Склад.ВидСравнения = ВидСравнения.ВСписке;
    ЭлементыФормы.Список.НастройкаОтбора.Склад.Доступность = Ложь;
............................
    ЭтаФорма.Отбор.Склад.Значение = СписокДокументов;


Где "СписокДокументов", т.е. доступных для просмотра складов...

Код работает исправно. Список открывается с нужными фильтрами, и изменить список доступных складов в форме Отбора и сортировки - невозможно...

Но вот столкнулся с такой ситуацией...
Предположим имеется 10 складов, из них только 3-м складам имеется допуск... В результате я вижу только те Реализации, где присутствуют те 3-и элитных склада.

Но вот теперь пользователю хочется отфильтровать Реализации по одному из этих складов, а доступ к редактированию списка доступных складов закрыт.
Если снять доступность, т.е. сделать её редактируемой, то легким движением руки список превращается в желтую прессу доступной по всем складам.

Можно ли сделать так, чтобы на форме "Отбор и сортировка" поле значения складов осталось редактируемым, несмотря на то, что доступность = ложь?


Автор: Bernet 20.04.17, 14:36

Constantus @ Сегодня, 15:04 * ,
Это извращения, используйте RLS - Record Level Security или ограничение прав на уровне записи

Автор: Flexy 20.04.17, 14:37

Омг...Противоречивая логика...

Цитата(Constantus @ 20.04.17, 14:04) *
Для ограничения просмотра некоторых документов, например, Реализация
...
Код работает исправно. Список открывается с нужными фильтрами, и изменить список доступных складов в форме Отбора и сортировки - невозможно...
....
Можно ли сделать так, чтобы на форме "Отбор и сортировка" поле значения складов осталось редактируемым, несмотря на то, что доступность = ложь?

Конечно можно. Но это костыль... Юзайте RLS или рисуйте свою, произвольную форму и пишите в ней свою логику.
Завтра юзер захочет так же фильтронуть / сортонуть список перемещений или заказов или еще чего...Что будете все формы перепиливать?

Автор: Constantus 20.04.17, 15:09

Flexy @ Сегодня, 17:37 * ,


РЛС это возможно и хорошо, но я пробовал РЛС... у меня доступны ограничения только по Организации и Контрагентам... Подскажите как делать ограничения на уровне складов?
Тем более мне предстоит ограничивать еще и по Кассам...

Где и как в "Группу пользователей" в раздел "Вид объекта доступа" добавить Склад и Касса?

Блин "Вид объекта доступа" оказывается Перечисления... там только 2-а значения стоят

Автор: Flexy 20.04.17, 15:40

Constantus @ Сегодня, 15:09 * ,
Варианты:
1. Делать по аналогии, как реализовано с Контрагентами и Организациями.
2. Сделать свой регистр сведений (Пользователь, ОбъектДоступа, Значение) + свой запрос RLS к этому регистру в нужных таблицах на нужные поля.

Автор: Vofka 20.04.17, 16:02

Попробуйте в форме выбора справочника Склады обработать событие Выбор списка и там проверять есть ли доступ у пользователя к выбираемому складу. Если нету, то СтандартнаяОбработка = Ложь и "хорошего вам настроения". Если это работает, то можно сделать отбор доступным, т.к. пользователь все равно ничего лишнего туда выбрать не сможет.

Автор: Constantus 21.04.17, 10:07

Vofka @ Вчера, 19:02 * ,

Честно сказать не понял как это реализовать. Сделал по-другому. Разместил на форме списка ПолеВыбора, куда в качестве источника прописал все доступные склады + "все доступные"... Вот код

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

    КонецЕсли;    
    
    КонецЕсли;
    

КонецПроцедуры


К сожалению, в код вписался излишек, это еще один запрос...

    ЭтаФорма.Отбор.Склад.Использование=Истина;
    ЭлементыФормы.Список.Значение.Отбор.Склад.ВидСравнения = ВидСравнения.ВСписке;
    ЭлементыФормы.Список.НастройкаОтбора.Склад.Доступность = Ложь;
    Скл = Справочники.Склады.НайтиПоНаименованию(ПолеВыбора1);


По задумке "Скл" это ссылка на склад для подстановки в:

ЭтаФорма.Отбор.Склад.Значение = Скл;


Но выдает ошибку о несоответствии типов...

Как из Полявыбора с произвольным типом можно получить нужный тип, чтобы активировать фильтр по складу:
ЭтаФорма.Отбор.Склад.Значение = Скл;

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua