Как заблокировать изменение данных в 1С:Предприятии 8.3
Содержание
Чаще всего под словом «запрет» понимают одно, а настраивать нужно другое. Если задача — не дать менять документы закрытого периода, это делается за минуту в режиме 1С:Предприятие через дату запрета изменения, конфигуратор тут не нужен. Если нужно лишить пользователя права править справочники и документы совсем — это уже роли. А если закрыть одно поле в форме — программная блокировка.
Эти механизмы не взаимозаменяемы: дата запрета режет по периоду, роли — по видам объектов, RLS — по конкретным записям, программный код — по полям и условиям. Ниже — пять рабочих способов сделать запрет редактирования в 1С 8.3 и признак, по которому понятно, какой из них ваш.
1С:Предприятие, без конфигуратора. Самый быстрый способ.ТолькоПросмотр и обработчик ПередЗаписью.Дата запрета изменения: закрыть период без конфигуратора
Это самый частый запрос бухгалтера: отчётность сдана, документы прошлых месяцев трогать нельзя. В типовых конфигурациях на библиотеке стандартных подсистем (Бухгалтерия 3.0, ЗУП 3.1, УТ 11) для этого есть встроенный механизм — настраивается прямо в работающей базе.
Раздел называется одинаково, но лежит в разных местах меню:
| Конфигурация | Путь к настройке |
|---|---|
| Бухгалтерия 3.0 | Администрирование → Настройки пользователей и прав |
| ЗУП 3.1 | Администрирование → Настройки пользователей и прав |
| Управление торговлей 11 | НСИ и администрирование → Настройки пользователей и прав |
В группе «Даты запрета изменения» поставьте флажок Даты запрета изменения данных и перейдите по ссылке «Настроить».
Дату можно задать:
- 🗓️ общую — одна для всех пользователей и всех разделов учёта;
- 👤 по пользователям — для рядовых сотрудников период закрыт, для главбуха открыт;
- 📂 по разделам и организациям — например, бухучёт закрыт по февраль, а кадры открыты.
Удобнее задавать не фиксированную дату, а относительную — «конец прошлого месяца» или «конец прошлого квартала». Тогда граница сдвигается сама, и возвращаться к настройке каждый месяц не нужно.
При попытке записать или перепровести документ раньше установленной даты программа выдаст сообщение о том, что период закрыт, и записать не даст. Отчёты и чтение при этом остаются доступны — запрет касается только изменения.
Дата запрета не защищает от пользователя с полными правами администратора: он снимет флажок за десять секунд. Это инструмент дисциплины и защиты от случайной правки, а не от умышленного вмешательства.
Роли и права: запретить изменение целого вида объектов
Когда нужно, чтобы конкретная категория сотрудников в принципе не могла менять справочник или документ, работают роли. Право на объект в 1С делится на отдельные действия: Чтение, Добавление, Изменение, Удаление, Проведение, Отмена проведения. Чтобы сделать объект доступным только для просмотра, оставляют Чтение и Просмотр, а Изменение, Добавление и Удаление снимают.
Отдельно стоит пара «Изменение» и «Интерактивное изменение». Первое разрешает менять объект вообще (в том числе кодом), второе — именно руками через форму. Иногда объект нужно оставить доступным для программной обработки, но закрыть от ручной правки: тогда снимают только интерактивное право.
В типовой конфигурации роли напрямую не раздают — доступом управляют профили групп доступа:
- Откройте
Администрирование → Настройки пользователей и прав → Профили групп доступа. - Скопируйте подходящий типовой профиль (менять поставляемый нельзя — он перезапишется при обновлении).
- В копии на закладке «Разрешённые действия (роли)» уберите роли, дающие изменение нужного объекта.
- Назначьте профиль через группу доступа тем пользователям, которым он предназначен.
В самописной конфигурации или на доработке роль правят в конфигураторе: ветка Общие → Роли, нужная роль, таблица прав по объектам. Снимаете галочки Изменение и Интерактивное изменение у документа или справочника — и объект открывается только на чтение.
Права складываются по принципу максимума: если пользователю назначены две роли и хотя бы одна даёт изменение, объект будет доступен для правки. Запрет в одной роли не перекрывает разрешение в другой. Проверяйте весь набор ролей пользователя, а не одну.
Роли удобны тем, что действуют на вид объекта целиком и не зависят от периода. Минус — грубая гранулярность: нельзя через роль закрыть «только документы после проведения» или «только чужие записи».
Ограничение на уровне записей (RLS): закрыть не вид, а конкретные записи
RLS (Record Level Security, ограничение доступа на уровне записей) решает задачу, которую роли не берут: разрешить пользователю видеть и менять свои записи и закрыть чужие. Классические примеры — менеджер работает только со своими сделками, бухгалтер — только по своей организации, кладовщик — только по своему складу.
Механизм встроен в роли: для каждого права объекта задаётся шаблон ограничения — по сути условие на языке запросов, которое платформа подставляет при каждом обращении к данным. Запись, не прошедшая условие, для пользователя невидима или недоступна на изменение.
В типовых конфигурациях RLS руками в конфигураторе не пишут — он включён в поставляемые роли, а управляют им через значения в группах доступа. Например, в группе доступа указывают список разрешённых организаций или складов, и RLS сам отсекает остальные.
RLS заметно нагружает запросы: условие подставляется в каждое обращение к таблице. На больших базах с глубокими ограничениями это ощутимо замедляет списки и отчёты. Включайте ограничение по записям только там, где оно действительно нужно, а не «на всякий случай».
Если готового разреза в типовой нет (скажем, нужен запрет по произвольному реквизиту), шаблон ограничения дописывают в конфигураторе — это уже доработка роли и снятие объекта с поддержки или расширение.
RLS не отменяет роли, а уточняет их: сначала роль решает, доступен ли вид объекта вообще, и только потом ограничение по записям отсекает лишние строки. Поэтому запрет по записям имеет смысл, когда вид объекта пользователю в принципе нужен, но не целиком. Если объект не нужен совсем — проще закрыть его ролью, не нагружая базу условиями.
Программная блокировка формы и реквизитов
Когда запрет зависит от состояния документа — например, проведённый документ править нельзя, а черновик можно, — ни роли, ни дата запрета не помогут. Тут работает код в форме.
Самый прямой приём — свойство формы ТолькоПросмотр. Поставили его в Истина — вся форма открывается для просмотра, ввод заблокирован:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект.Проведен Тогда
ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Если нужно закрыть не всю форму, а отдельное поле (скажем, запретить менять склад после первой записи), блокируют конкретный элемент:
Элементы.Склад.ТолькоПросмотр = Истина;
ТолькоПросмотр отключает только интерактивный ввод с клавиатуры и мыши. Программная запись объекта при этом остаётся возможной. Чтобы перехватить и саму запись, ставят условие в обработчике ПередЗаписью и при необходимости отменяют операцию через параметр Отказ:
Процедура ПередЗаписью(Отказ, ПараметрыЗаписи)
Если ЗаписьЗапрещенаУсловием Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры
Блокировка в форме защищает только от ввода через эту форму. Групповая обработка, загрузка из файла или другая форма объект всё равно изменят. Если запрет должен быть жёстким, дублируйте проверку в обработчике ПередЗаписью самого объекта (в модуле объекта), а не только на форме.
Программный способ — самый гибкий: условие любой сложности, вплоть до проверки прав текущего пользователя и статуса документа. Платой идёт то, что это код, который нужно сопровождать и переносить при обновлении. Поэтому в типовых его почти всегда выносят не в саму конфигурацию, а в расширение — об этом ниже.
Отдельный частый случай — закрыть поле в списке, а не в форме элемента. В динамическом списке интерактивную правку из таблицы отключают, сняв у колонки признак редактирования или поставив списку режим только для просмотра. Логика та же, что и с ТолькоПросмотр, но применяется к элементу списка на форме.
Расширения конфигурации вместо правки типовой
Все предыдущие приёмы с кодом и ролями в типовой упираются в одно: править поставляемую конфигурацию — значит снимать её с поддержки и усложнять обновления. Расширения конфигурации
(появились в платформе 8.3.6) снимают эту проблему: они лежат поверх основной конфигурации отдельным файлом .cfe и добавляют поведение, не меняя типовую.
Через расширение запрет редактирования делают так:
- В конфигураторе создают расширение:
Конфигурация → Расширения конфигурации. - Заимствуют в него нужную форму документа или справочника.
- Добавляют в модуль формы обработчик (
ПриОткрытии,ПередЗаписью) с той же логикойТолькоПросмотрилиОтказ. - Сохраняют и загружают
.cfeв рабочую базу черезКонфигурация → Расширения конфигурации → Добавить, затем обновляют конфигурацию базы данных.
Загрузка .cfe и «Обновить конфигурацию базы данных» — два отдельных шага. Пока второй не выполнен, расширение не действует. Для изменений, затрагивающих структуру, нужен монопольный доступ к базе; простое переопределение формы обычно подхватывается без него.
Типовая при этом остаётся на поддержке и спокойно обновляется, а запрет живёт в отдельном файле, который легко включить, выключить или перенести в другую базу. Это рекомендуемый способ, если менять поведение типовой всё же приходится.
Типичные ошибки при настройке запрета
Ошибки здесь однотипны и стоят времени на разбор «почему не сработало».
- ❌ Дату запрета поставили, но забыли флажок. Без установленного флажка «Даты запрета изменения данных» сама дата не действует — она просто хранится как неактивная настройка.
- ❌ Закрыли изменение ролью, а пользователю назначена вторая роль с разрешением. Права суммируются, и объект остаётся доступным. Смотрите весь набор ролей, а не одну.
- ❌ Поставили
ТолькоПросмотрна форме и считают, что объект защищён. Через групповую обработку или загрузку он всё равно изменится. Жёсткий запрет ставят вПередЗаписьюобъекта. - ❌ Правят поставляемый профиль групп доступа или типовую конфигурацию . При следующем обновлении изменения затрутся. Копируйте профиль и используйте расширения.
- ❌ Загрузили расширение, но не обновили конфигурацию базы. Расширение числится в списке, но не работает , пока не выполнен второй шаг.
Прежде чем проверять любой запрет на боевой базе, сделайте резервную копию. Ошибка в шаблоне RLS или в коде ПередЗаписью может незаметно закрыть доступ к данным большему кругу пользователей, чем планировалось.
Частые вопросы
Как сделать документ только для чтения после проведения?
ПриОткрытии проверить Объект.Проведен и при истине поставить ТолькоПросмотр = Истина. Чтобы запрет нельзя было обойти через другую форму — продублировать проверку в обработчике ПередЗаписью модуля объекта.