1с запрет редактирования реквизитов объектов
При программном изменении существующих объектов есть правило: сразу после получения объекта из ссылки, необходимо его заблокировать для редактирования. Это позволяет:
- во-первых, проверить, что данный объект не заблокирован в настоящий момент другим пользователем;
- во-вторых, гарантирует, что другой пользователь не сможет изменить объект, пока не будут записаны изменения в текущем сеансе;
Внимание! Данное правило неприменимо при пакетной загрузке данных, когда требуется принятие изменений пакетом, а также при разрешении коллизий, возникающих при загрузке данных из другого источника, обладающего большим приоритетом
Заблокировать произвольный объект можно двумя способами:
- Используя метод Заблокировать() объекта метаданных ссылочного типа (Справочники, Документы и т.п.);
- Используя метод ЗаблокироватьДанныеДляРедактирования() глобального контекста;
Давайте рассмотрим примеры работы с каждым из этих методов
Метод Заблокировать()
Если Ваш алгоритм не взаимодействует с пользователем, перед тем как заблокировать объект, следует проверить, не заблокирован ли этот объект другим пользователем или процессом. Если, все же, взаимодействует, следует исключить код для варианта 1. Тогда в случае заблокированного объекта будет вызвано исключение и пользователь увидит полное описание ошибки.
Недостатки: Метод доступен только в контексте сервера, толстого клиента или внешнего соединения
Метод ЗаблокироватьДанныеДляРедактирования()
Данный метод обладает большим спектром возможностей, чем предыдущий:
- он умеет блокировать записи регистра сведений;
- он умеет блокировать данные в контексте управляемых форм;
- он умеет блокировать данные, если совпадает версия данных;
С учетом этого, перепишем предыдущий пример следующим образом:
В том случае, когда нам необходимо заблокировать некоторые данные на время открытия управляемой формы, можно поступить следующим образом:
Блокировка будет снята неявно при закрытии привязанной формы, либо при завершении сеанса пользователя, либо явно при вызове метода РазблокироватьДанныеДляРедактирования()
Внимание! Методы ЗаблокироватьДанныеДляРедактирования() и РазблокироватьДанныеДляРедактирования() доступны только начиная с версии платформы 1С 8.2.9
В данной статье я привожу пример подключения нового справочника к подсистемам БСП. Статья будет применима как к самописным конфигурациям на базе БСП, так и к типовым УТ, ERP, БП и прочим конфигурациям на базе БСП.
Введение
Описание в дополнение к ранее опубликованной статье Пример создания документа с движениями в ERP 2.5.7. Пример создавал на базе ERP 2.5.7, но не затрагивая какие-либо объекты ERP, в этот раз пример без использования расширения.
В данном примере дано описание, как добавить произвольный справочник к подсистемам:
- Версионирование
- Запрет редактирования реквизитов
- Дополнительные реквизиты и сведения
- Присоединенные файлы
- Подключаемые отчеты и обработки
Всё, что я написал, описано в документации к БСП, но тут живой пример, без лишней информации.
Встраивание справочника в подсистемы
Добавляем условный справочник с именем "Статья_НовыйСправочник".
Состав реквизитов простой, например поля Организация, Дата и Номер.
В соответствии с ранее указанной статьей, можно этот справочник включить в подсистему префиксации, а также не забудьте добавлять роли с RLS, если у вас в реквизитах присутствуют поля, по которым настраиваются ограничения в текущей системе.
Подсистема "Версионирование"
Включаем СправочникСсылка.Статья_НовыйСправочник в определяемый тип "ВерсионируемыеДанные" и СправочникОбъект.Статья_НовыйСправочник в определяемый тип "ВерсионируемыеДанныеОбъект"
В модуле менеджера определяем процедуру
В форме объекта и форме списка в событии "ПриСозданииНаСервере" добавляем вызов
Подсистема "Запрет редактирования реквизитов"
Ищем в конфигурации форму "РазблокированиеРеквизитов" и копируем её в новый справочник.
В модуль менеджера справочника вносим функцию, в которой описываются реквизиты для блокирования
В общий модуль "ЗапретРедактированияРеквизитовОбъектовПереопределяемый" в процедуру "ПриОпределенииОбъектовСЗаблокированнымиРеквизитами" вносим наш справочник
Добавляем реквизит формы "ДоступностьРеквизитов" с типом Булево.
В форму справочника в событие "ПриСозданииНаСервере" вносим вызов
А также в событие "ПослеЗаписиНаСервере"
Подсистема "Дополнительные реквизиты и сведения"
Скопируем в наш справочник табличную часть "ДополнительныеРеквизиты" с любого другого объекта.
Для того, чтобы со справочником и его доп. реквизитами корректно работали отчеты и динамические списки, пропишем в характеристиках справочника необходимые данные:
Виды характеристик | Значения характеристик | |||||
---|---|---|---|---|---|---|
Поле ключа | Поле отбора видов | Значение отбора видов | Поле пути к данным | Поле объекта | Поле вида | Поле значения |
Справочник.НаборыДополнительныхРеквизитовИСведений.ТабличнаяЧасть.ДополнительныеРеквизиты | Справочник.Статья_НовыйСправочник.ТабличнаяЧасть.ДополнительныеРеквизиты | |||||
Свойство | Ссылка | Справочник_Статья_НовыйСправочник | Ссылка | Свойство | Значение | |
Справочник.НаборыДополнительныхРеквизитовИСведений.ТабличнаяЧасть.ДополнительныеРеквизиты | РегистрСведений.ДополнительныеСведения | |||||
Свойство | Ссылка | Справочник_Статья_НовыйСправочник | Объект | Свойство | Значение |
Для подсистемы нужны две подписки на события ОбработкаПроверкиЗаполнения и ПередУдалением. В типовых конфигурациях они уже существуют (ДополнительныеРеквизитыОбработкаПроверкиЗаполнения и СвойстваПередУдалениемСсылочногоОбъекта соответственно), где определен СправочникОбъект. Поэтому необходимости создавать новые нет.
Расширим тип определяемого типа "ВладелецДополнительныхСведений" нашим справочником (СправочникСсылка.Статья_НовыйСправочник).
Необходимо в справочник "НаборыДополнительныхРеквизитовИСведений" добавить новый предопределенный элемент
Имя | Справочник_Статья_НовыйСправочник |
Наименование | Справочник "Новый справочник для статьи" |
и любым способом вызвать служебные процедуры для обновления и заполнения справочника (например через обработку, или повысить версию конфигурации или запустить с ключем "/c ЗапуститьОбновлениеИнформационнойБазы").
Остается только в форму справочника добавить вызовы функционала подсистемы
В событие "ПриСозданииНаСервере"
В событие "ПриЧтенииНаСервере"
В событие "ПередЗаписьюНаСервере"
В событие "ПриОткрытии"
В событие "ОбработкаОповещения"
И добавить служебные процедуры
Не забываем в форме списка в список полей добавлять Ссылку, со снятой галкой пользовательской видимости. Тогда можно будет через изменение формы выводить в список как реквизиты справочника, так и добавленные дополнительные реквизиты.
Подсистема "Присоединенные файлы"
Для работы этой системы нам в первую очередь нужно создать новый справочник "Статья_НовыйСправочникПрисоединенныеФайлы". Функционал подсистемы будет искать справочник с именем "Имя справочника владельца" + "ПрисоединенныеФайлы".
В качестве шаблона для справочника скопируйте любой из существующих с постфиксом "ПрисоединенныеФайлы" и измените тип реквизита ВладелецФайла на свой справочник. В моем случае это будет "СправочникСсылка.Статья_НовыйСправочник".
Если вы создаете свой справочник, то как правило префикс будет совпадать и никаких сложностей нет. Но если вы хотите подключить присоединенные файлы к уже существующему типовому объекту и при этом для нового справочника необходимо ввести префикс, то необходимо дополнительно скорректировать в общем модуле процедуру РаботаСФайламиПереопределяемый.ПриОпределенииСправочниковХраненияФайлов
Например, мы добавляем присоединенные файлы к типовому документу "ЧекККМ", а префикс для добавляемых объектов у нас "Статья_", тогда в этом случае нам нужно прописать следующий код:
Далее необходимо в определяемые типы "ВладелецПрисоединенныхФайлов", "ПрисоединенныйФайл" добавить тип СправочникСсылка на справочник "Статья_НовыйСправочник" и в определяемый тип "ПрисоединенныйФайлОбъект" добавить тип СправочникОбъект.Статья_НовыйСправочник.
Для контроля удаления справочника и подчиненных файлом создадим подписку или отредактируем существующую (УстановитьПометкуУдаленияПрисоединенныхФайлов)
Имя | Статья_УстановитьПометкуУдаленияПрисоединенныхФайлов |
Источник | СправочникОбъект.Статья_НовыйСправочник |
Событие | ПередЗаписью |
Обработчик | РаботаСФайлами.УстановитьПометкуУдаленияПрисоединенныхФайлов |
И остается только доработать форму справочника.
1. Добавить реквизит формы "ПараметрыРаботыСФайлами" с типом Произвольный.
2. Добавить вызовы функционала подсистемы из событий формы.
В событие "ПриСозданииНаСервере"
В событие "ПриОткрытии"
В событие "ОбработкаОповещения"
А также служебные команды
Подсистема "Подключаемые отчеты и обработки" (Подключаемые команды)
Для работы этой подсистемы, необходимо прописать функционал подключаемых команд.
В форме объекта добавляем реквизит формы "ПараметрыПодключаемыхКоманд" с типом Произвольный, а так же вызовы:
В событие "ПриСозданииНаСервере"
В событие "ПриЧтенииНаСервере"
В событие "ПриОткрытии"
В событие "ПослеЗаписи"
И служебные команды
Заключение
Эта статья - компиляция документации БСП (на самом деле, просто для примера реализовал данный пример в ERP 2.5.7, предварительно снятой с поддержки).
Т.к. меняются определяемые типы и предопределенные элементы, то это потребует внимательности при последующих обновлениях конфигурации.
В 1С можно настроить ограничения по ролям, т.е. запретить пользователям с определенной ролью изменять какие либо реквизиты или объекты конфигурации. Например, при создание или открытии какого либо документа (справочника) можно запретить изменять номер, дату или другие необходимые элементы. На практики подобные задачи встречаются довольно часто, так как некоторые пользователи могут поменять дату документ или его номер, тем самым нарушить учет документооборота. Реализовать все это достаточно просто.
Программное ограничения по ролям в 1С
Допустить у нас в базе есть роль «Пользователь» и нам необходимо всем учетным записям с данной ролью запретить изменять номер и дату документа поступления, а так же указывать в поле «Ответственный» наименование роли.
Для этого в обработчике события «При создании на сервере» пишем вот такой код.
Думаю в нем все понять, если учетная запись под которой создается документ имеет роль «Пользователь» тогда запрещаем редактировать «Номер», «Дату» и в поле «Ответственный» подставляем значение из справочника «Пользователи» которое найдем по коду. Под данным кодом в справочнике находиться «Пользователь».
Запустим 1С и посмотрим что получилось, в итоге ввести что-то с клавиатуры в поля «Номер», «Дата» не получиться.
Но если у данного поля есть возможность выбора, например, как у даты то изменить её все же буде возможно.
Для того чтобы исключить подобную ситуацию можно отключить доступность, без ограничения редактирования.
В этом случае пользователь уже ни чего не сможет сделать.
Вариантов реализации подобных задач очень много, я показал один из, возможно он даже не самый оптимальной. Если Вы знаете другой обязательно поделитесь.
Кстати механизм подставления «Ответственного» тут не совсем корректен, так как в базе может быть много пользователей 10, 20 и если у всех у них есть роль «Пользователь» то она и будет подставляться, тут необходимо подставлять имя пользователя а не роли, с помощью ПользователиИнформационнойБазы.ТекущийПользователь() но об этом в следующей статье.
Необходимо запретить редактирование строк табличного поля документа добавленных ранее.
Пример: Пользователи ежедневно добавляют в документ строки с данными, нужно чтобы позже они не могли изменять уже введенные данные.
Для реализации этого, необходимо в ранее добавленных ячейках установить ТолькоПросмотр=Истина
Пример табличного поля:
Похожие FAQ
Еще в этой же категории
Как обновить динамический список или реквизит на форме клиента? 22
Если вы, открыв форму справочника или документа, выполнили некоторое действие, код который должен изменить состояние данных в динамических списках или значение реквизита. Данные изменены, но в открытой форме осталось все как было, можно конечно закр Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором? 18
Решение рассмотрено для элемента справочника (Контрагент и регистр КонтактнаяИнформация) 1. Создание реквизита: Добавляем новый реквизит формы (. не путать с реквизитом справочника . ) с типом " ДинамическийСписок" В поле " Основная табли Как установить параметр динамического списка? 16
Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента Для вывода используется исп Форма ~ Программное создание таблицы значений с условным оформлением 12
Как создать на форме таблицу и сделать для нее подсветку содержимого колонки в строке по условию? Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем ма Поле выбора ~ Заполнение списка значений в элементе поле выбора на форме 10
//Заполнение списка перебором данных // Элемент формы МетаданныеВыбор имеет тип - Произвольный, Использование - Режим выбора из Списка, кнопка списка Для Каждого Метаданное из Метаданные.РегламентныеЗадания Цикл ЭлементыФормы.МетаданныеВыбор.Спи Посмотреть все в категории Работа с Формой (Диалог) и её элементами
В функционале программного комплекса 1С есть важная опция «Дата запрета изменения». В рамках заданного временного отрезка эта функция запрещает редактирование документов. Данный запрет устанавливается в отношении всей программы, индивидуально для каждого пользователя или конкретных организаций. В этой статье рассмотрим возможности установления и снятия «Даты запрета изменений» для конфигурации 1С:Бухгалтерия предприятия ред. 3.0.
Опция «Дата запрета изменения» доступна только пользователю, имеющему права администратора, или пользователю, которому заранее разрешён доступ к этой опции.
Ежемесячно бухгалтеры выполняют закрытие месяца в программном комплексе 1С:Бухгалтерия предприятия 8.3 , осуществляет проверку данных и итогов. Существует опасность, что любой сотрудник после открытия документа прошлого периода может некорректно выйти из него, перепровести или изменить. В такой ситуации произойдёт изменение последовательности документов. После этого бухгалтер будет вынужден осуществить запуск процедуры перепроведения, и цифры закрытого периода уже будут разниться с результатами в налоговых и бухгалтерских отчётах.
Для исключения подобных рисков существует опция «Дата запрета изменений». Благодаря ей 1С не даёт возможности откорректировать документацию закрытого периода.
Чтобы пользователь не смог что-либо отредактировать, в программном комплексе 1С:Бухгалтерия 8.3 следует зайти в раздел «Администрирование», во вкладку «Настройки пользователей и прав».
Далее открываем опцию «Даты запрета изменения». Выполняем установку флажка. Он означает, что запрет на редактирование документов прошлого периода будет включён.
Если нажать на гиперссылку «Настроить», открывается панель, где можно будет отредактировать дату запрета. Затем необходимо выбрать, для кого мы будем устанавливать запрет: для всех либо только для определённых пользователей. Исходя из того, что вам необходимо, перейдите на соответствующую вкладку.
Если выбран флаг «Для всех пользователей», то устанавливается «Общая дата» в поле «Дата запрета». Под ограничение подпадут все объекты, подсистемы и пользователи программы.
Когда требуется задать различные даты для каждого объекта или раздела, это выполняется с помощью опции «Другие способы указания даты запрета». Она находится внизу используемого окна. Возможны три состояния этой настройки: «По разделам и объектам», «Общая дата» и «По разделам».
Если будет выбрано «Указывать дату запрета» − «По разделам», запустится панель, где должна быть выполнена настройка разделов учёта, благодаря которой возможно поставить запрет на выбранный раздел.
Если в пункте «Указывать дату запрета» выбрать «По разделам и объектам», то, используя кнопку «Подобрать», необходимо указать ту организацию, для которой будем устанавливать дату из открывшегося списка.
После подбора необходимых компаний из списка, для каждой из них устанавливается своя дата запрета. Отменить произведённые настройки можно клавишей «Отключить».
Чтобы запретить изменение данных конкретным сотрудникам, пользующимся программой, открываем вкладку «По пользователям». Изначальная установка задана «Для всех пользователей». Выбрать сотрудников из перечня для персональных настроек можно, нажав клавишу «Подобрать».
Также в программном комплексе 1С:Бухгалтерия предприятия ред. 3.0 имеется возможность автоматической установки даты.
При этом 1С предлагает выбрать один из следующих вариантов: конец прошлого года, квартала, месяца, недели или установить дату запрета на предыдущий день. Конкретная дата определится программным комплексом автоматически. Опцией можно воспользоваться в общей или индивидуальной настройке.
Начало действия даты запрета возможно отсрочить. Воспользовавшись функцией, укажите, через сколько дней ограничения вступят в силу.
Итог: в программах 1С предоставляются удобные возможности для работы бухгалтеров в виде функции «Даты запрета редактирования данных». При правильной её настройке обеспечивается сохранность уже проведённых в прошлом периоде документов.
Читайте также: