Разработка и Конфигурация · 12 мин
Как программно запретить редактирование документа в 1С
Способы программно запретить редактирование документа в 1С: дата запрета, подписки на события, блокировка формы, права RLS. Примеры кода и проверка результата.
Запрет редактирования документов — одна из самых частых задач при доработке конфигураций 1С. Закрытый период, согласованный счёт, проведённый документ, который нельзя трогать без отмены проведения, — во всех этих случаях нужен механизм, который не позволит пользователю изменить данные. Важно понимать: «запрет редактирования» может означать разное — блокировку формы, запрет записи объекта в базу или ограничение на уровне прав доступа, и каждый вариант реализуется по-своему.
Надёжный запрет всегда делается на уровне сервера и записи объекта, а не только на форме. Заблокировать элементы формы недостаточно: пользователь сможет изменить документ через групповое изменение, обработку, обмен данными или через COM-соединение. Поэтому правильная схема — комбинация: проверка в событии записи (или через дату запрета) плюс косметическая блокировка формы для удобства пользователя.
Ниже разобраны основные способы: штатная дата запрета изменения данных, подписки на события, блокировка формы, свойство «ТолькоПросмотр», права и RLS, а также типичные ошибки и способы проверить, что запрет реально работает.
Определите, что именно нужно запретить
Прежде чем писать код, зафиксируйте требование. «Запретить редактирование» на практике бывает трёх видов: запрет изменения и перепроведения уже записанного документа, запрет интерактивного редактирования через форму (при этом обмены и загрузки должны проходить) и запрет только для части пользователей по ролям. От этого зависит выбор механизма.
Если нужно закрыть период для всех — используйте дату запрета. Если правило бизнес-логики (например, «согласованный документ менять нельзя») — подписку на событие записи. Если ограничение касается группы пользователей — роли и, при необходимости, RLS. Блокировка формы подходит только как дополнение, потому что обходится любой внешней обработкой.
Как выбрать механизм
Дата запрета изменения данных — штатный способ закрыть период
В конфигурациях на базе Библиотеки стандартных подсистем (УТ, ERP, БП, ЗУП) есть готовый механизм «Даты запрета изменения данных». Он находится в разделе администрирования и позволяет установить дату, раньше которой документы нельзя создавать, изменять и проводить. Механизм работает на уровне записи объектов, то есть срабатывает и при интерактивном вводе, и при обменах.
Дату можно задать общую, по разделам учёта, по организациям и даже индивидуально для пользователей — например, бухгалтеру разрешить править прошлый месяц, а менеджерам запретить. Это самый быстрый способ закрыть период без единой строки кода.
Если конфигурация самописная и БСП нет, аналог реализуется просто: константа с датой запрета и проверка в подписке ПередЗаписи для нужных видов документов.
Процедура ЗапретРедактированияПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения)
ДатаЗапрета = Константы.ДатаЗапретаРедактирования.Получить();
Если ЗначениеЗаполнено(ДатаЗапрета)
И НачалоДня(Источник.Дата) < ДатаЗапрета Тогда
Отказ = Истина;
ВызватьИсключение "Редактирование документов раньше "
+ Формат(ДатаЗапрета, "ДЛФ=D") + " запрещено.";
КонецЕсли;
КонецПроцедурыПодписка на событие — универсальный программный запрет
Подписка на событие ПередЗаписи (или ОбработкаПроверкиЗаполнения) — основной инструмент, когда запрет зависит от логики: статуса документа, признака выгрузки, согласования. Подписка настраивается в конфигураторе: указывается источник (например, «ДокументОбъект» или конкретный вид документа), событие и процедура-обработчик в общем модуле с флагом «Сервер».
Ключевой момент — сравнение с данными базы, а не с формой. Внутри обработчика Источник — это уже изменённый объект. Чтобы понять, что документ был согласован до изменения, нужно прочитать его из базы по ссылке или использовать ДополнительныеСвойства и обмен данными.
Процедура ЗапретИзмененияСогласованныхПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения)
Если Источник.ОбменДанными.Загрузка Тогда
Возврат; // не мешаем обменам и загрузкам
КонецЕсли;
Если Пользователи.ЭтоПолноправныйПользователь() Тогда
Возврат; // администратор может всё
КонецЕсли;
Если Не Источник.ЭтоНовый() Тогда
СтатусВБазе = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(
Источник.Ссылка, "СтатусСогласования");
Если СтатусВБазе = Перечисления.СтатусыСогласования.Согласован Тогда
Отказ = Истина;
ВызватьИсключение "Документ согласован, редактирование запрещено.";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Обратите внимание на первую проверку: ОбменДанными.Загрузка. Если её не сделать, запрет сломает обмены, конвертацию данных и пакетные загрузки — документы просто перестанут записываться, и вы получите ошибки в журнале регистрации без явной причины.
Блокировка формы и режим «Только просмотр»
Чтобы пользователь сразу видел, что документ менять нельзя, форму переводят в режим просмотра. Самый простой способ — установить свойство ТолькоПросмотр у формы в событии ПриОткрытии или ПослеЗаписи. Все элементы формы станут недоступны, а кнопки записи — неактивны.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Объект.Проведен И Объект.СтатусСогласования =
ПредопределенноеЗначение("Перечисление.СтатусыСогласования.Согласован") Тогда
ЭтотОбъект.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Альтернатива — точечно блокировать элементы через Элементы.ИмяПоля.ТолькоПросмотр = Истина или Доступность = Ложь, если нужно оставить доступной часть формы (например, комментарий). Ещё вариант — программно установить блокировку данных объекта через ЗаблокироватьДанныеДляРедактирования, чтобы второй пользователь не смог открыть документ на изменение одновременно.
Ограничение через роли и права доступа
Если запрет должен действовать для группы пользователей, правильнее всего решать задачу ролями. В конфигураторе у роли для нужного вида документов снимаются права «Изменение» и «Интерактивное изменение» — пользователь сможет смотреть документы, но не редактировать. Право «Проведение» и «Отмена проведения» управляется отдельно, что позволяет, например, разрешить ввод документов, но запретить их проведение.
Для более тонких условий («менеджер видит и правит только свои документы») применяется RLS — ограничение доступа на уровне записей через шаблоны в ролях. RLS работает на уровне запросов к базе, поэтому его нельзя обойти обработкой, но сложные шаблоны заметно влияют на производительность запросов.
Сравнение способов запрета
Закрытие периода для всех или по организациям. Быстро, без кода, но только по дате документа.
Любая логика: статус, согласование, признак выгрузки. Требует кода и аккуратности с обменами.
Разграничение по пользователям и данным. Надёжно, но не подходит для условий вида «запретить после согласования».
Только визуальная блокировка. Использовать как дополнение к серверному запрету.
Проверка, что запрет действительно работает
После внедрения проверьте запрет всеми способами, которыми документ реально могут изменить: интерактивно из формы, через групповое изменение реквизитов, через обмен данными и программной записью из консоли кода или обработки. Запрет считается рабочим, только если отказ срабатывает во всех нежелательных сценариях и не срабатывает в разрешённых.
Проверьте также обратную сторону: документы, которые должны изменяться (несогласованные, текущего периода, от администратора), записываются штатно, обмены проходят без ошибок, а в журнале регистрации нет массовых отказов.
Как проверить результат
Форма в режиме просмотра, запись выдаёт понятное сообщение
Документ сохраняется или ошибка выглядит как технический сбой
Обработка завершается с отказом на запрещённых документах
Реквизиты изменились в обход запрета
Загрузка проходит, ОбменДанными.Загрузка учтён
В журнале регистрации ошибки отказа в записи
Полноправный пользователь может исправить документ
Никто не может снять запрет — потребуется правка кода
Типичные ошибки и ограничения
Чаще всего запрет реализуют только на форме — и он обходится первой же внешней обработкой. Вторая частая ошибка — отсутствие проверки ОбменДанными.Загрузка, из-за чего ломаются синхронизации. Третья — сравнение реквизитов объекта в памяти вместо чтения состояния из базы: пользователь может сбросить статус в форме, и проверка «Статус = Согласован» пройдёт мимо.
Отдельно учитывайте пометку удаления и отмену проведения: если запрет на изменение не должен мешать пометить ошибочный документ на удаление, добавьте в обработчик соответствующее условие, иначе «замусоренные» документы окажется невозможно вычистить без отключения подписки.
Что важно запомнить
Настоящий запрет редактирования делается на уровне записи объекта: дата запрета для периода, подписка ПередЗаписи для бизнес-логики, роли и RLS для разграничения по пользователям. Блокировка формы — только удобство. Обязательно учитывайте ОбменДанными.Загрузка, оставляйте обход для администратора и проверяйте запрет всеми способами изменения документа.
Частые вопросы
Можно ли запретить редактирование без доработки конфигурации?
Да, если конфигурация на базе БСП: используйте штатные даты запрета изменения данных в разделе администрирования. Также без кода работает настройка ролей — снятие прав на изменение для конкретных пользователей. Для условий вроде «после согласования» без доработки не обойтись.
Почему запрет срабатывает, но документ всё равно меняется через обработку?
Потому что проверка реализована только в модуле формы. Код формы выполняется только при интерактивной работе. Перенесите логику в подписку на событие ПередЗаписи или в модуль объекта — тогда она будет выполняться при любой записи.
Как разрешить редактирование отдельным пользователям?
Два пути: в коде подписки добавить проверку на полные права или на членство в определённой группе/профиле, либо в штатном механизме дат запрета задать индивидуальную дату для конкретных пользователей. Второй вариант удобнее, когда исключения меняются часто.
Мешает ли запрет редактирования перепроведению документов за закрытый период?
Да. Отмена проведения и перепроведение — это тоже запись документа, поэтому они подпадают под запрет. Чтобы восстановить последовательность за закрытый период, дату запрета временно сдвигают или выполняют операцию под пользователем-исключением, а затем возвращают запрет обратно.
Что лучше: подписка на событие или код в модуле объекта?
Подписка удобнее при поддержке: одна процедура может обслуживать сразу несколько видов документов, и её легко добавить через расширение, не снимая конфигурацию с поддержки. Прямой код в модуле объекта оправдан, если логика уникальна для одного вида документа и конфигурация полностью самописная.
Как запретить редактирование только проведённых документов?
В обработчике записи проверьте, что документ в базе проведён (через запрос к реквизиту «Проведен» по ссылке), и отказывайте в записи, если режим записи — изменение без отмены проведения. Учтите, что для исправления такого документа пользователю придётся сначала распровести его под учётной записью с особыми правами.