Как скрыть справочник в 1с
Возникла задача добавить в интерфейс БП 3.0 новые разделы, причем видно их должно быть только тем пользователям, которым это дозволено.
Вариантов много, но, в рамках задачи, всё укладывалось в расширение в режиме совместимости 8.3.10 (действующей на сегодня). Конфигурацию остаётся на поддержке, а с разделами поступим, как водится , с использованием ролей…
Внезапно, выяснилось, что управлять ролями, созданными в режиме расширения, «традиционными» способами не представляется возможным (ежели кто умеет, прошу покорно рассказать, как это делается). Это есть повод для драки размышлений, пришла идея использовать для установки пользователю роли из расширения программно, по значению дополнительного сведения пользователя.
В общем, по итогам вышло так:
1. Создаём дополнительное сведение для справочника «Пользователи», например «Доступный раздел», с типом значения «Дополнительное значение». Значениями которого сделаем «Вот такой раздел» и «Совсем другой раздел».
Как сделать? Администрирование – Общие настройки – «Дополнительные реквизиты и сведения» устанавливаем одноимённый флаг, затем гиперссылка «Дополнительные сведения». Ищем справочник «Пользователи», жмём «Создать», в поле наименование пишем «Доступный раздел», жмём «Записать», потом на закладке «Значения» создаём две, поименованные выше, строки.
2. Создаем расширение «СкрытьПоказатьРазделыПользователям»
Как сделать? В конфигураторе «Конфигурация» - «Расширения конфигурации» жмём «Добавить». В имени пишем «СкрытьПоказатьРазделыПользователям», Префикс «_еаю», назначение «Дополнение»:
Галки делаем как на картинке.
3. В модуле управляемого приложения расширения создаём процедуру:
Как сделать? ПКМ на первой строке расширения «Открыть модуль управляемого приложения». Туда копируем приведённый выше текст.
4. Добавляем в расширение все измерения и ресурс регистра сведений «ДополнительныеСведения»
Как сделать? В дереве конфигурации ветка «Регистры сведений» находим «ДополнительныеСведения», открываем вету «Измерения», и на каждом измерении» ПКМ выбираем «Добавить в расширение», затем это же делаем с ресурсом, получим:
5. Добавляем в расширение два справочника, например «Контрагенты» и «Номенклатура». Добавление аналогично п.4, только никаких реквизитов не добавляем, для примера нам достаточно только справочников.
6. Создаем две подсистемы в расширении «еаю_ВотТакаяПодсистема» и «еаю_СовсемДругаяПодсистема». В состав первой добавляем справочник «Контрагенты», с состав второй «Номенклатура». В обеих подсистемах устанавливаем флаг «Включать в командный интерфейс».
7. Добавляем две роли в расширение «еаю_ВТР» и «еаю_СДР», в ревой делаем доступной подсистему «еаю_ВотТакаяПодсистема», во второй «еаю_СовсемДругаяПодсистема»
Как сделать? В конфигураторе в ветке «Роли» открываем нужную роль, и с дереве прав в ветке подсистемы устанавливаем флаг «Просмотр» для соответствующей подсистемы:
8. Создаем два общих модуля еаю_ОбработчикиКлиент (галка «Клиент (Управляемое приложение)») и еаю_ОбработчикиСервер (галки «Сервер» и «Вызов сервера»)
Затем нужным пользователем выбираем в дополнительных сведениях нужный ему раздел, и после перезапуска наслаждаемся его наличием в панели разделов))))
Для другого(их) пользователя(ей) можно установить другой раздел, если в доп.сведении ничего не выбрано, панель разделов останется типовой.
Думаю, эта разработка понравится тем, кто имеет подобную задачу.
У нас она звучала так: некоторые элементы справочников потеряли свою актуальность, но удалять их из базы нельзя, т.к. будет нарушена целостность данных. Как бы сделать так, чтобы они не отображались в списках? При этом изменения конфигурации должны быть минимальны.
Для этих целей я создал эту тестовую обработку, которая содержит две процедуры, нужные для реализации задуманного. Все остальные реквизиты и прочее служат только для отладки.
Итак, минимальное изменение конфигурации - это максимальное использование стандартных возможностей. Далее самый безболезненный путь - создание своего общего модуля с необходимым набором процедур. И по возможности минимальные изменения объектов базы - в идеале только незначительная корректировка кода модулей форм или объектов
Поэтому было решено использовать механизм дополнительных сведений и вызовы из форм списков нужных справочников процедур общего модуля, накладывающих отбор на отображаемые списки. Для того чтобы минимизировать количество доп сведений, я решил создать одно свойство "Не используется" (рис.1)
Далее для нужного набора свойств добавляем свойство из другого набора (рис.2-5).
Всё! Подготовка произведена. теперь при нажатии кнопки доп сведений увидим (рис.6). (не совсем удачно выбрал справочник, у него есть свой реквизит Действует, но это не важно).
Теперь в модуль формы списка справочника в процедуру ПриСозданииНаСервере() добавляем вызов.
Для функции в условии аргументом является основной реквизит формы - список справочника (реквизит д.б. типа динамический список, при другом типе работать не будет), для процедуры - ссылка на форму и имя того же самого реквизита.
После этого при открытии формы элементы, которые имеют свойство Не используется, не будут отображаться в форме списка.
При этом отбор, установленный в форме, можно снять, нажав на кнопку Настроить список (рис. 7)
Решение тестировалось на конфигурации УТ 11.4.5.143 платформа 8.3.12.1714, однако скорее всего будет работать на всех конфигурациях с управляемыми формами, где есть подсистема дополнительных реквизитов и сведений.
Сегодня мы поработаем с формой и научимся на ней прятать элементы - устанавливать видимость их (Рисунок 1).
На рисунке 1 изображена форма элемента, на которой есть элементы на форме в отображении списка - это синий прямоугольник, а на самой форме их нет - это жёлтый прямоугольник. То есть они есть, но они там не отображаются.
Это называется пользовательская видимость.
Делается она следующим образом: выделяется элемент на форме, открывается палитра свойств этого элемента и на свойстве "Видимость" снять галочку (Рисунок 2).
Снять/поставить галочку - это значит, что будет виден элемент или не будет виден. А если сказать иначе, то это Истина - галочка стоит и элемент виден, Ложь - галочка снята и элемент не виден.
Сохраните все изменения и увидите, что в пользовательском режиме они у вас теперь не будут отображаться, однако есть интересный момент: для поля "Наименование" установлено свойство "Проверка заполнения со значением Выдавать ошибку". Это свойство означает, что это поле обязательно должно быть заполнено и платформа выдаст ошибку, если оно будет пусто и не даст записать в базу. Запустите и нажмите кнопку "Записать и закрыть" и получите уведомление (Рисунок 3).
Как же так получается, что поля на форме нет, но платформа предупреждает нас, что это поле не заполнено?
Все дело в том, что поле есть на форме, но он просто невидимый для пользователя, но платформа его воспринимает полноценно. Это необходимо учитывать. Поэтому и называется - пользовательская видимость.
А теперь мы попробуем сделать так, чтобы поле появлялось и исчезало в зависимости от какого-либо условия.
Проще всего это сделать с полем, у которого отображение будет в виде галочки. То есть если галочка будет стоять, то поле будет видно, а иначе поле будет спрятано. Давайте попробуем сделать это. Для этого необходимо добавить на форму еще один реквизит с типом "Булево" (Рисунок 3).
После этого необходимо перейти на форму и переместить его на форму (Рисунок 4).
Обратите внимание на рисунок 4, у поля "Видимость" галочка не стоит, а значит по умолчанию стоит значение Ложь!
Теперь необходимо прописать процедуру. Чтобы прописать, необходимо понять как это будет работать!
А работать это будет следующим образом: как только мы меняем значение поля "Показать/Скрыть", так сразу исчезает/появляется поле "Число". Все происходит именно в таком порядке. Чтобы это работало у платформы есть специальные события, а в данном случае нужно событие "ПриИзменении".
ПриИзменении - это событие означает то, что как только вы начинаете менять значение поля, то есть ставить галочку или убирать ее, так сразу начинает меняться и значение поля. А если не трогать, то ничего и не будет происходить, именно поэтому событие и называется, при изменении чего-то в этом поле.
Создадим на форме группу (папку) и поместим в нее элемент, который будем прятать (убирать видимость) - поле "Число" (Рисунок 5).
Выделим поле "Показать/Скрыть" и найдем свойство и оно же событие "ПриИзменении" (Рисунок 5).
Нажмем на значок увеличительного стекла и создадим процедуру на клиенте (Рисунок 6).
В создавшейся процедуре убираем закомментированную строку и вместо нее прописываем нашу (Рисунок 7).
Этот код означает следующее:
1. Если - начало условия;
2. Объект.ПоказатьСкрыть - обращение к элементу формы;
3. Объект.ПоказатьСкрыть = Истина - само условие;
4. Элементы.Группа1 - обращение в элементу "Группа1";
5. Видимость - пользовательская видимость;
6. Элементы.Группа1.Видимость = Истина - папка с находящимися в ней элементами будет видна;
7. Элементы.Группа1.Видимость = Ложь- папка с находящимися в ней элементами будет не видна. КонецЕсли - окончание выполнения условия.
Запустите пользовательский режим и проверьте изменения. Как только поставите галочку, ничего не изменится. Снимете галочку, поле "Число" исчезнет, а как поставите галочку, так сразу же оно и появится.
Так и только так работает это событие - при изменении значения, то есть ставишь галочку или убираешь, начинает срабатывать событие и выполняться условие.
На этом статья урока подходит к концу. Попробуйте выполнить все действия, которые описаны в этом уроке. Если что-то не получается, то вы всегда сможете написать вопрос о том, что вам непонятно или вернуться к предыдущим урокам и посмотреть их - ссылки внизу!
Ссылка для вступления телеграм-канал - t.me.Apiscourses
Подписаться в группу ВКонтакте
Прошлые уроки:
На этом все. Жду Вас на следующем занятии.
P.S. Подписывайтесь на мой канал :-)
программирование программирование 1с 1с предприятие обучение онлайн обучение 1с
Наверняка, у вас есть много вопросов относительно оплаты (как оплатить, как получить разработку, не возникнут ли проблемы и т.п.).
Ответы на самые распространенные вопросы, относящиеся к процессу покупки моих разработок, приведены на странице заказа. Для перехода к ней нажмите Оплатить картой или Заказать счет .
Там же вы найдете мои контакты, на случай если останутся вопросы.
Эта разработка позволяет настроить выборочную блокировку (открытия или изменения) справочников и документов для разных пользователей (или групп пользователей).
Тут вы можете спросить - А не проще ли обойтись установкой нужных ролей для пользователей?
Отвечаю - не всегда. Нередко типовые роли являются избыточными, и в придачу к установке нужных прав для пользователей предоставляют им дополнительные ненужные полномочия. К тому же иногда бывает нужно ограничить возможность редактирования уже проведенных документов - такую задачу типовыми средствами не решить.
Расширение позволяет дополнить функциональность типовых ролей конфигурации и в пользовательском режиме ограничить доступ конкретных пользователей (или групп) к конкретным типам объектов системы (документам или справочникам).
Для примера, ограничим группе пользователей доступ к документу Заказ клиента:
Откроем форму настройки прав доступа:
На форме настроек расположена таблица, в разных строках которой мы можем добавить настройки доступа для разных пользователей /групп. Добавляем новую строку и выбираем в ней:
- тип объекта - документ или справочник,
- имя объекта - в данном случае выбираем из выпадающего списка нужный тип документов информационной базы,
- настраиваем адресата ограничения - можно выбрать конкретного пользователя или группу пользователей (в таком случае ограничение будет срабатывать для всех пользователей, принадлежащих этой группе),
- тип запрета - запрет открытия или запрет изменения (в последнем случае форма будет открываться только на просмотр, таким образом пользователь не сможет редактировать старый документ).
Если включен запрет изменения, пользователь также не сможет перепровести/распровести документ, пометить объект на удаление или снять пометку (из журнала документов или в списке элементов какого-то справочника).
Применительно к документам запрет изменения имеет место только для проведенных документов.
Теперь попытка пользователя открыть заказ заканчивается ничем:
Ограничение не распространяется на пользователей с полными правами.
Несмотря на запрет доступа к заказам, пользователь без проблем может просматривать список заказов, ограничение касается только просмотра формы конкретного документа.
Для корректной работы расширения необходимо отключить Безопасный режим .
Вас может заинтересовать
В данной статье показано, как производится загрузка курсов валют в 1С:Предприятие 8 на примере конфигурации Бухгалтерия предприятия 3.0
В данном видео даются разъяснения, необходимые для понимания того, что такое права, роли и профили групп доступа. Затем создается пользователь и происходит базовая настройка прав него.
В данной статье описывается зачем делать свертку базы и на конкретном примере показано, как выполнить свертку информационной базы 1С:Бухгалтерия 3.0 штатными средствами.
Довольно часто при открытии формы выбора накладываются определенные условия на элементы справочника, которые необходимо показать пользователю (наличие на остатке, отбор по значению реквизита и др). И если с выводом элементов справочника проблем не возникает, то группы выводятся все. В статье описан несложный способ как можно скрыть "пустые" группы справочника при открытии формы выбора.
Форма выбора ДО | Форма выбора ПОСЛЕ |
(видны "пустые" группы справочника, хотя выводятся только элементы с типом "Услуга") | ("пустых" групп справочника не видно) |
Для того чтобы получить вышеуказанный указанный результат необходимо:
1. Определяем элементы справочника, которые необходимо показать пользователю.
2. При открытии формы выбора устанавливаем отбор по элементам из п.п.1
3. Определяем ГРУППЫ СПРАВОЧНИКА, которые НЕ ЯВЛЯЮТСЯ РОДИТЕЛЕМ для элементов из п.п.1
4. При открытии формы ч ерез условное оформление убираем видимость групп справочника из п.п. 3
Самым "толстым" моментов в этой схеме является п.п.3 "Определяем ГРУППЫ СПРАВОЧНИКА, которые НЕ ЯВЛЯЮТСЯ РОДИТЕЛЕМ". Но для решения этой задачи был использован способ описанный ildarovich в статье Транзитивное замыкание запросом. После небольшой доработки ф-ии из этой статьи c легкостью можно получить группы справочника, которые не имеют никакого отношения к показываемым элементам справочника:
Стоит отметить что приведенная функция работает достаточно шустро. Приведенная в статье функция не учитывает одну ситуацию - наличие в списке справочника ПУСТЫХ ГРУПП т.е. групп, у которых нет ни одного элемента. Но эту ситуацию легко обыграть, но при этом будет одно лишнее ображение к Справочнику для получения всех групп.
В статье находтся выгрузка базы, в которой на примере одного справочника показан принцип работы вышеописанного способа.
Специальные предложения
(1) shevelyov,
Главное отличие видно даже из постановки задачи: у вас "Когда требуется открыть список справочника с отбором, например,ПО ОПРЕДЕЛЕННО ГРУППЕ", а у меня "при открытии формы выбора накладываются определенные УСЛОВИЯ НА ЭЛЕМЕНТЫ СПРАВОЧНИКА". Т.е. вы сразу знаете какие группы д.б. видны, а я их еще определяю исходя из иерархии справочника и накладываемых условия отбора на элементы справочника.
Кроме того если вам надо показать огурцы, которые будут находиться в
-Группа "Овощи и фрукты"
-- Группа "Овощи"
--- Группа "Огурцы"
В вашем случаем пользователь будет видеть ТОЛЬКО группу "Огурцы", а в моем случаем будет видна вся иерархиям полностью вплоть до группы "Огурцы".
Очень сложно. Зачем?
Вся фишка заключается в том, что отбор компоновки дин списка и даже прямое условие дин списка в условии ГДЕ не справляется со скрытием ненужных групп.
То есть такой код динамического списка не работает
Чтобы скрыть группы надо перетащить условие фильтрации из ГДЕ в JOIN
Переданный в форму отбор достаточно превратить в параметры дин списка.
Каменный цветок сразу получится.
(7) ваше предложение это работающее решение или это концепция?
У меня при использовании
форма выбора в режиме просмотра "Дерево" ничего не показывает, а вот в режиме просмотра "Список" показывает ТОЛЬКО элементы (группы справочника не видны) по условию
(8) не концепция. вполне себе работает для верхнего уровня иерархии. Насчет старта с промежуточного - не было такой задачи :-)
По поводу только элементов - это решение для тех, кому не страшно разрешить реквизит фильтрации для группы, и далее заполнить его нужными данными. Иначе, как вы заметили, групп не будет видно. Тут, как говорится, "Вам шашечки или ехать".
Согласен, что такое вмешательство в конфигурацию не всем понравится, для кого-то вообще жирный минус, но тут как раз можно вашу транзитивность попробовать сюда доцепить и отпадет необходимость в условном оформлении. UPD 1: или просто добавить непосредственных родителей фильтрованных элементов в фильтр соединения. Необязательно вложенный запрос же, наверное можно же и врем таблицу в соединение пихнуть. В каком то релизе временные таблице в дин списке уже сделали кажись.
Дальше останется превратить отбор в процедуре создания на сервере в параметры динамического списка.
Вариант с видимостью я пробовал, но он себя забавно ведет иногда. Попробуйте нажать кнопку пометки удаления когда условным оформлением скрыты все элементы.
А вообще, конечно, 1с подвела так подвела. Издевательство над людьми.
(7) как? как ты до этого допер.
я прям в ступоре был
в запросе указываю жестко условие. а оно не работает.
а так вот срабатывает. гениально
Нужно просто в динамическом списке > Настройки > Группировка выбрать группировку по "Родитель" и будет счастье
Коллеги, очень нужна помощь. Воспользовался подсказками из данной статьи в реализации задачи, за что огромное спасибо автору. Но у меня справочник с 4 уровнями и кол-вом записей 300К+. При накладывании "отборов" на форму выбора - база замирает минут на 5, ничего не могу придумать. Может кто подсказать как можно оптимизировать запросы и/или код?
(14) вы используете прием со скрытием пустых групп справочников?
Или форма подбора сама по себе работает медленно?
Читайте также: