В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача ограничить редактирование документов. Это может быть связано с закрытием периода, выполнением определенных бизнес-условий или спецификой работы пользователя. Однако простое установление свойства ТолькоПросмотр = Истина в коде не всегда приводит к желаемому результату: форма может оставаться доступной для редактирования или сбрасывать это состояние сразу после открытия. Разберем подробно, как правильно решить эту задачу разными способами.
Самый правильный и «чистый» способ — это передача намерения открыть форму в режиме чтения еще на этапе её создания. В управляемом приложении 1С при вызове метода ОткрытьФорму() или ПолучитьФорму() можно передать специальную структуру параметров. Рассмотрим пример реализации:
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", ДокументСсылка);
ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);
ОткрытьФорму("Документ.НачислениеЗП.Форма.ФормаДокумента", ПараметрыФормы);
Однако важно понимать: чтобы этот параметр сработал автоматически, в самой форме документа (в процедуре ПриСозданииНаСервере) должен быть код, который обрабатывает этот параметр. Проанализируем, как это выглядит внутри модуля формы:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ТолькоПросмотр") Тогда
ЭтаФорма.ТолькоПросмотр = Параметры.ТолькоПросмотр;
КонецЕсли;
КонецПроцедуры
Важный нюанс: если вы используете типовую конфигурацию на базе БСП (Библиотека Стандартных Подсистем), у форм часто есть встроенный параметр ReadOnly. Попробуйте передать его вместо произвольного имени ТолькоПросмотр.
Если вам нужно получить форму, настроить её и только потом показать пользователю, используется метод ПолучитьФорму(). Рассмотрим ситуацию, когда мы перебираем документы в журнале и хотим открыть их программно только для чтения:
ПараметрыФормы = Новый Структура("Ключ", ДокументСтруктура.Ссылка);
ФормаДокумента = ПолучитьФорму("Документ.НачислениеЗП.Форма.ФормаДокумента", ПараметрыФормы);
ФормаДокумента.ТолькоПросмотр = Истина;
ФормаДокумента.Открыть();
Выясним причину, почему этот способ часто «не взлетает». Проблема заключается в том, что после выполнения вашего внешнего кода в самой форме могут сработать стандартные обработчики ПриОткрытии (на клиенте) или ПриЧтенииНаСервере. Если в этих процедурах прописана логика проверки прав, даты запрета или статуса документа, платформа может принудительно вернуть ТолькоПросмотр = Ложь.
Если перед вами стоит задача сделать «недоступными» сразу множество документов (как в случае с самописным журналом документов), и вы не хотите менять модуль каждой формы вручную, воспользуйтесь расширениями конфигурации. Это наиболее современный и профессиональный подход.
Рассмотрим алгоритм действий:
&После("ПриСозданииНаСервере").Пример кода в расширении для общего модуля или формы:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем условие, например, дату документа
Если Объект.Дата < ДатаГраницыРедактирования Тогда
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
Такой подход позволяет централизованно управлять доступностью всех документов, не внося изменений в основную конфигурацию и не дублируя код в каждом объекте.
Проанализируем основные причины, по которым форма остается доступной для редактирования, несмотря на установленные флаги:
ТолькоПросмотр или Доступность), оно перекроет программную установку в ПриСозданииНаСервере.ТолькоПросмотр.Если ваша цель — не просто визуально «засерить» форму, а гарантированно запретить изменения, используйте Подписку на событие. Визуальное ограничение в форме можно обойти (например, через групповую обработку или программный код), а подписка на уровне модуля объекта сработает всегда.
Создайте общую подписку на событие ПередЗаписью для всех необходимых типов документов:
Процедура ПроверкаДоступностиПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
Если ДокументДолженБытьЗаблокирован(Источник) Тогда
Отказ = Истина;
Сообщить("Редактирование документа запрещено по правилам системы!");
КонецЕсли;
КонецПроцедуры
Если доступность документа зависит от прав пользователя, лучше всего использовать механизм RLS (Row Level Security). В настройках роли для права «Редактирование» можно прописать условие на языке запросов 1С. Например:
ГДЕ Дата >= &ДатаНачалаРедактирования
В этом случае платформа сама, на уровне ядра, сделает форму документа недоступной для изменения, отрисует соответствующие иконки «Замок» и заблокирует кнопку «Записать».
Для разового открытия документа используйте передачу параметров в ОткрытьФорму. Для системного решения задачи «без изменения всех форм» лучше всего подходит использование расширений с перехватом события ПриСозданииНаСервере или настройка RLS. Помните, что визуальное свойство ТолькоПросмотр делает работу пользователя комфортной (позволяет копировать текст), в то время как Доступность = Ложь полностью блокирует взаимодействие с элементами формы.