1с запретить настройку списка
В некоторых случаях необходимо запретить пользователям редактировать табличную часть документов, добавлять, изменять или удалять строки и даже изменять их порядок. Реализовать это в 1С очень просто, например, можно полностью отключить возможность изменения состава строк. В этом случае на форме пропадут соответствующие кнопки «Добавить», «Изменить», «Удалить». Можно отдельно отключить возможность изменения порядка строк в табличной части. Так же есть возможность настройки доступных команд, например, можно разрешить только добавлять строки, или только удалять ну или только изменять.
Кстати у табличной части можно вообще убрать командную панель, на которой расположены кнопки «Добавить», «Изменение порядка» и меню «Еще», но через контекстное меню вызванное кликом ПКМ мышки все же это сделать можно будет.
Как убрать возможность добавления, удаления, изменения строк табличной части документа
Давайте рассмотрим все варианты отключение возможности редактирование табличной части.
Открываем конфигуратор и свойства табличной части у которой хотим заблокировать возможность редактирования.
В свойствах ищем раздел «Использование» в нем пункт «Изменять Состав Строк» и снимаем на против него флаг.
В результате этих действий пропадут кнопки «Добавить», «Изменить», «Удалить».
Они исчезнут из всех меню.
Но возможность изменения порядка строк все же остается, для того чтобы её отключить в свойствах табличной части в разделе «Использование» нужно снять флаг напротив пункта «Изменять порядок строк».
Для того чтобы убрать отдельную команду, например, добавления, изменения, удаления или перемещения строк табличной части, нужно открыть пункт «Состав команд» и отметить только необходимые.
Таким образом можно разрешить пользователю например, только добавлять строки в табличную часть.
Вот таким образом можно запретить редактирование табличных частей, либо частично ограничить возможности пользователей. Так же все это можно запретить программно.
Всем привет!
Необходимо сделать так чтобы пользователь мог видеть только свои ПКО.
Решил попробовать сделать это через настройки форм.
Получилось настроить там отбор по кассиру.Но как сделать так чтобы пользователь не мог снести эту настройку?
(1) rafaiil, Настройками и правами вроде никак.
Только в конфигураторе.
Отключить команды "Настроить список" и "Установить стандартные настройки".
Либо в самой форме галочки снять, либо программно из модуля "МодификацияКонфигурацииПереопределяемый", если нужно одновременно для нескольких форм или не хочется формы с поддержки снимать.
Например, убирать команды у всех, кроме пользователей с полными правами.
(2) ekaruk, спасибо за ответ!а ограничение доступа на уровне записей не поможет реализовать эту задачу?м
(4) ture, нет,так не получится.Пока у меня не получилось.Кассу можно ограничить в роли Кассир и всё вроде бы норм,но у меня пользователь совмещает
в себе и кассира и менеджера по продажам.Там кассу ограничить нельзя.Выходит перекрытие ролей и все кассы пользователю становятся видны.
(3) rafaiil, Поможет.
Но, насколько я помню, типовых настроек для ограничений по кассирам нет, поэтому придется их самостоятельно прописывать во все используюмые пользователем роли.
Думаю, для данной локальной задачи проще обойтись отбором.
(6) ekaruk, простите пожалуйста мне мою необразованность.никак не выходит скрыть команды в ручную.двойное нажатие на выделенные команды не дает толку.
(9) ekaruk, Ещё раз огромное спасибо!код надо доработать.(а для этого надо изучить что откуда берется).
Что интересно по неизвестной мне причине команда Установить стандартные настройки убирается не оттуда откуда вы показали.(хотя там пункт такой есть).
Второй раз что то сложно найти откуда я убрал.:)
(10) rafaiil, Есть настройки формы вцелом. Есть настройки динамического списка.
Т.е. команд "Установить стандартные настройки" там две.
Динамические списки - это один из базовых объектов для разработок на базе 1С.
Однако, долгое время разработчики не имели возможность запрещать пользователям делать отборы по конкретным полям и их реквизитам. Такое бывает необходимо, чтобы не дать возможность "положить" списки со сложными запросами или с большим количеством данных.
И вот с версии 8.3.10 в платформе появился метод УстановитьОграниченияИспользованияВОтборе()
Тип: Массив.
Пути к полям компоновки, на которые требуется установить ограничение.
Запрещает использование указанных полей и всех их дочерних полей в настройках отбора.
Поля, на которые установлено ограничение, не входят в коллекцию доступных полей.
После вызова метода список полей с ограничениями замещается указанным. Вызов метода с пустым списком полей отменяет ранее установленные ограничения.
Использование в версии:
Доступен, начиная с версии 8.3.10.
Здесь нас интересует этот пункт:
Запрещает использование указанных полей и всех их дочерних полей в настройках отбора.
Поля, на которые установлено ограничение, не входят в коллекцию доступных полей.
После вызова метода список полей с ограничениями замещается указанным. Вызов метода с пустым списком полей отменяет ранее установленные ограничения.
Это означает, что метод можно вызывать повторно, настраивая доступность полей в зависимости от каких-то событий. Но нужно понимать нюансы работы.
Обычно метод применяют в одном событии формы - ПриСозданииНаСервере(). Когда платформа ещё не приступила к непосредственному открытию формы и всячески к этому готовится. В такие моменты разработчик отбирает у пользователей возможность фильтрации по каким-то полям. А что если менять состав полей несколько раз?
Приведём такой пример. Есть динамический список с документами. Необходимо запретить пользователям делать фильтры по полям, если в шапке формы пустой параметр "Организация". Возьмём для нашего эксперимента форму журнала документов продажи из демо базы ERP 2.4:
Для этого добавим форму в расширение:
Подключимся к обработчику изменения организации:
И вставим такой простой код:
Обновим базу и откроем форму в режиме предприятия. Сразу видим, что в контекстном меню по полю "Подразделение" нет возможности поиска:
Расширенный поиск не позволяет выбирать подразделение:
Так же отбор недоступен и в форме настройки списка:
А теперь заполним организацию:
И появилась возможность фильтровать в расширенном поиске:
Ну и настройка динамического списка заработала:
А значит теперь мы можем наложить отбор на подразделение. Давайте так и сделаем.
Сейчас в списке доступны три строки с двумя подразделениями:
Установим отбор по подразделению "Дирекция" при помощи Ctrl+Alt+F
Всё хорошо. Но что будет, если мы сейчас очистим организацию в шапке формы, тем самым запретив отбирать по подразделению?
Странно, да? Отбор отключился. Но надпись осталась. Да, её не трудно закрыть крестиком вручную, но пользователю будет непонятно, почему показан отбор, который не работает.
Ну хорошо, допустим мы свыклись с тем, что надпись не обновляется и отключили её. Но что с отбором через "Настроить список" ?
Для начала снова выберем организацию в шапке формы и установим отбор по подразделению:
Хорошо, а теперь очистим организацию в шапке:
Мы установили ограничение на отбор, но существующий при этом не сбросился. А в настройке списка наш отбор помечен красным и более недоступен:
Как же так? Понять это поможет другая статья, в которой рассказывается принцип того, как СКД (на которой и базируются динамические списки) работает с ограничениями полей:
Ограничения полей, или как обмануть СКД?.
Прочитав её, станет понятно, что ограничения полей в отборах полноценно влияют только на пользовательскую доступность полей, но не на логику выборки данных. То есть, пользовательские настройки обходят ограничения полей.
Интересно, что решение, которое было предложено в статье, в данной ситуации не работает. Если использовать КомпоновщикНастроек.Восстановить(), то пользовательские отборы всё равно остаются на месте.
Попробуем же программно отключить использование отборов, если их полей нет в коллекции ДоступныеПоляОтбора.
Теперь когда пользователь очищает поле "Организация", то и наш "неправильный" отбор отключается.
Можно заметить, что при этом поле остаётся. И самое интересное, что если пользователь вручную нажмёт его использование, то и, несмотря на ограничения отборов, фильтрация применится:
Но что же делать? Придётся не отключать использование отбора, а просто удалять его.
Теперь при очистке организации, так же удаляются и "запрещенные" отборы:
Пользователь теперь не может наложить отбор, так как его нет в доступных полях для отбора. А старые отборы почистились автоматически.
Хорошо, мы разобрались с ограничениями отборов в динамическом списке. Но как обстоят дела с другими ограничениями? Добавим запреты на группировку и сортировку:
Открываем форму с пустой организацией и видим, что подразделения нет в доступных к группировке полей. Всё хорошо.
Теперь выберем организацию и добавим группировку:
Всё хорошо применилось:
А теперь очистим организацию. После очистки, наш код запрещает использование поля Подразделение в группировках.
И вот мы видим такую ошибку:
На группировку 1С поругалась. И форма теперь показывает пустой список:
То же самое и с ограничением по сортировке.
Выходит, что платформа позволяет блокировать такие действия. Но с отборами это не работает. Хорошо, что мы написали свой метод по обработке этого?
На первый взгляд, все эти проблемы возникнут только в тех случаях, если разработчик в рамках одного списка производит включение\отключение ограничений. Однако, это не совсем так.
Если изначально форма списка не содержала ограничения по отборам, то при внесении изменений, у пользователей могут остаться сохранённые настройки. Как и те, что подгружаются автоматически при открытии формы, так и те, что пользователь может подгрузить вручную по кнопке "Выбрать настройки".
И это так же нужно обрабатывать кодом. Иначе нет никакой уверенности, что ваши ограничения действительно заработали и пользователи не накладывают "запрещенные" отборы.
А напоследок, давайте вспомним один из хитрых методов обхода ограничений по отборам из статьи Ограничения полей, или как обмануть СКД? .
Он позволяет наложить нехитрый отбор для примитивных типов полей, поэтому немного изменим наш код и ограничим поле "Сумма". И оставим пока только ограничение отборов.
(В нашей обработке два поля "Сумма", поэтому, чтобы избежать путаницы, ограничим оба)
Для этого в форме с пустой организацией зайдём в "Настроить список". Как видим, поля суммы в отборах нет:
А теперь нажмём "Ещё" -> "Изменить форму"
И перенесем доступные к сортировке поля в группу с отборами:
Организация у нас пустая, но поле Сумма теперь доступно. И мы можем сделать своё грязное дело - перенести поле в отбор:
Фильтр применился. Несмотря на ограничения.
Да, этот способ обхода замудрён, но работает. И к сожалению, события по изменению отборов в 1С нет.
Есть простой способ предотвратить это. Если вы отключаете использование в отборах, то и запрещайте использовать в группировках и сортировках. Тогда неоткуда будет подтянуть поле с отбором.
Выводы:
Ограничения отборов в динамическом списке автоматически обрабатываются недостаточно, поэтому:
1. Дополнительно программно обходите настройки
а) при установки ограничений
б) при загрузке пользовательских настроек
2. Если запрещаете отборы, то запрещайте и группировку\сортировку.
3. Если планируете включать\отключать ограничения и у вас платформа меньше 8.3.16, то отключите отображения поля состояния просмотра, чтобы оно не вводило пользователя в заблуждение.
Понравилась статья?
Подайте знак автору =) Поставьте плюс, оставляйте комментарий и переходите к другим публикациям:
Как заполнить табличную часть формы программно? 8
Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их. Форма имеет вид: Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды: // Код заполнения ТЧ НаСервере П 17 правил для составления оптимального ЗАПРОСа к данным базы 1С 44
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C: Enterprise Development Tools 50
И вот случилось долгожданное: Вышел 1C: Enterprise Development Tools - это среда для разработки конфигурации в IDE Eclipse. С сайта 1С: « 1C:Enterprise Development Tools » – это инструмент нового поколения для разработчиков бизнес-приложений систем 1С Предприятие что это? 12
Что такое 1С? 1С — это фирма , у которой одно из направлений деятельности — разработка программного обеспечения для автоматизации бизнес-процессов предприятий. « 1С:Предприятие » - конкретный продукт, который выпускает компания 1С . Что такое COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Посмотреть все результаты поиска похожих
Еще в этой же категории
Как в форме списка реализовать сортировку по своему реквизиту? 12
Если реквизит примитивного типа, то достаточно установить для свойства реквизита «Индексировать» значение «Индексировать» или «Индексировать с доп. упорядочиванием» (не доступно для реквизитов типа ХранилищеЗначения). Если же реквизит ссылочного типа Сортировка списка по произвольной колонке? 7
В процедуру ПриОткрытии или в конец модуля добавить: ЭлементыФормы.РегистрСведенийСписок.НастройкаПорядка.НомерСоглашения.Доступность=Истина; Где НомерСоглашения - Колонка в списке регистра сведений по которой нужно сортировать! Далее щелкнув Оформление строки в ПриПолученииДанных или ПриВыводеСтроки 7
Событие ПриПолученииДанных использется для оформления ячеек строк данных, отображаемых табличным полем. Обработчик данного события вызывается табличным полем в тех же случаях, что и обработчик ПриВыводеСтроки , т.е. при обновлении данных, отображ Табличное поле ~ Как получить строки табличного поля, отобранные отбором? 4
ОтборСтрок = ТабличнаяЧастьИсточник.ОтборСтрок ; ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.ИсточникДанных = Новый ОписаниеИсточникаДанных(ТабличнаяЧастьИсточник); // Добавляются необходимые отборы, такие же как в отбор Отбор по списку значений 3
СозданныйСписок = Новый СписокЗначений; СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.Выполнено); СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.ЗакрытиеЗаявки); СозданныйСписок.Добавить(Перечисления.СтатусЗаявки.ОтклоненаРукОтдЗакупок); Посмотреть все в категории Список Справочника, Документов, Регистров
В 1С можно настроить ограничения по ролям, т.е. запретить пользователям с определенной ролью изменять какие либо реквизиты или объекты конфигурации. Например, при создание или открытии какого либо документа (справочника) можно запретить изменять номер, дату или другие необходимые элементы. На практики подобные задачи встречаются довольно часто, так как некоторые пользователи могут поменять дату документ или его номер, тем самым нарушить учет документооборота. Реализовать все это достаточно просто.
Программное ограничения по ролям в 1С
Допустить у нас в базе есть роль «Пользователь» и нам необходимо всем учетным записям с данной ролью запретить изменять номер и дату документа поступления, а так же указывать в поле «Ответственный» наименование роли.
Для этого в обработчике события «При создании на сервере» пишем вот такой код.
Думаю в нем все понять, если учетная запись под которой создается документ имеет роль «Пользователь» тогда запрещаем редактировать «Номер», «Дату» и в поле «Ответственный» подставляем значение из справочника «Пользователи» которое найдем по коду. Под данным кодом в справочнике находиться «Пользователь».
Запустим 1С и посмотрим что получилось, в итоге ввести что-то с клавиатуры в поля «Номер», «Дата» не получиться.
Но если у данного поля есть возможность выбора, например, как у даты то изменить её все же буде возможно.
Для того чтобы исключить подобную ситуацию можно отключить доступность, без ограничения редактирования.
В этом случае пользователь уже ни чего не сможет сделать.
Вариантов реализации подобных задач очень много, я показал один из, возможно он даже не самый оптимальной. Если Вы знаете другой обязательно поделитесь.
Кстати механизм подставления «Ответственного» тут не совсем корректен, так как в базе может быть много пользователей 10, 20 и если у всех у них есть роль «Пользователь» то она и будет подставляться, тут необходимо подставлять имя пользователя а не роли, с помощью ПользователиИнформационнойБазы.ТекущийПользователь() но об этом в следующей статье.
Читайте также: