Как программно сделать документ доступным только для просмотра в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 8.3 часто возникает задача ограничить редактирование документов. Это может быть связано с закрытием периода, выполнением определенных бизнес-условий или спецификой работы пользователя. Однако простое установление свойства ТолькоПросмотр = Истина в коде не всегда приводит к желаемому результату: форма может оставаться доступной для редактирования или сбрасывать это состояние сразу после открытия. Разберем подробно, как правильно решить эту задачу разными способами.

Метод 1. Передача параметров при открытии формы

Самый правильный и «чистый» способ — это передача намерения открыть форму в режиме чтения еще на этапе её создания. В управляемом приложении 1С при вызове метода ОткрытьФорму() или ПолучитьФорму() можно передать специальную структуру параметров. Рассмотрим пример реализации:


ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Ключ", ДокументСсылка);
ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);

ОткрытьФорму("Документ.НачислениеЗП.Форма.ФормаДокумента", ПараметрыФормы);

Однако важно понимать: чтобы этот параметр сработал автоматически, в самой форме документа (в процедуре ПриСозданииНаСервере) должен быть код, который обрабатывает этот параметр. Проанализируем, как это выглядит внутри модуля формы:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("ТолькоПросмотр") Тогда
        ЭтаФорма.ТолькоПросмотр = Параметры.ТолькоПросмотр;
    КонецЕсли;
КонецПроцедуры

Важный нюанс: если вы используете типовую конфигурацию на базе БСП (Библиотека Стандартных Подсистем), у форм часто есть встроенный параметр ReadOnly. Попробуйте передать его вместо произвольного имени ТолькоПросмотр.

Метод 2. Управление доступностью извне (через объект формы)

Если вам нужно получить форму, настроить её и только потом показать пользователю, используется метод ПолучитьФорму(). Рассмотрим ситуацию, когда мы перебираем документы в журнале и хотим открыть их программно только для чтения:


ПараметрыФормы = Новый Структура("Ключ", ДокументСтруктура.Ссылка);
ФормаДокумента = ПолучитьФорму("Документ.НачислениеЗП.Форма.ФормаДокумента", ПараметрыФормы);
ФормаДокумента.ТолькоПросмотр = Истина;
ФормаДокумента.Открыть();

Выясним причину, почему этот способ часто «не взлетает». Проблема заключается в том, что после выполнения вашего внешнего кода в самой форме могут сработать стандартные обработчики ПриОткрытии (на клиенте) или ПриЧтенииНаСервере. Если в этих процедурах прописана логика проверки прав, даты запрета или статуса документа, платформа может принудительно вернуть ТолькоПросмотр = Ложь.

Метод 3. Использование расширений (для массового изменения)

Если перед вами стоит задача сделать «недоступными» сразу множество документов (как в случае с самописным журналом документов), и вы не хотите менять модуль каждой формы вручную, воспользуйтесь расширениями конфигурации. Это наиболее современный и профессиональный подход.

Рассмотрим алгоритм действий:

  1. Создайте новое расширение.
  2. Добавьте в него формы нужных документов.
  3. Создайте в расширении обработчик &После("ПриСозданииНаСервере").
  4. В этом обработчике пропишите единую логику проверки.

Пример кода в расширении для общего модуля или формы:


&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    // Проверяем условие, например, дату документа
    Если Объект.Дата < ДатаГраницыРедактирования Тогда
        ЭтаФорма.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецПроцедуры

Такой подход позволяет централизованно управлять доступностью всех документов, не внося изменений в основную конфигурацию и не дублируя код в каждом объекте.

Почему свойство «ТолькоПросмотр» может сбрасываться?

Проанализируем основные причины, по которым форма остается доступной для редактирования, несмотря на установленные флаги:

Метод 4. Подписка на событие «ПередЗаписью» (защита данных)

Если ваша цель — не просто визуально «засерить» форму, а гарантированно запретить изменения, используйте Подписку на событие. Визуальное ограничение в форме можно обойти (например, через групповую обработку или программный код), а подписка на уровне модуля объекта сработает всегда.

Создайте общую подписку на событие ПередЗаписью для всех необходимых типов документов:


Процедура ПроверкаДоступностиПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    Если ДокументДолженБытьЗаблокирован(Источник) Тогда
        Отказ = Истина;
        Сообщить("Редактирование документа запрещено по правилам системы!");
    КонецЕсли;
КонецПроцедуры

Метод 5. Ограничение через Роли (RLS)

Если доступность документа зависит от прав пользователя, лучше всего использовать механизм RLS (Row Level Security). В настройках роли для права «Редактирование» можно прописать условие на языке запросов 1С. Например:

ГДЕ Дата >= &ДатаНачалаРедактирования

В этом случае платформа сама, на уровне ядра, сделает форму документа недоступной для изменения, отрисует соответствующие иконки «Замок» и заблокирует кнопку «Записать».

Резюме

Для разового открытия документа используйте передачу параметров в ОткрытьФорму. Для системного решения задачи «без изменения всех форм» лучше всего подходит использование расширений с перехватом события ПриСозданииНаСервере или настройка RLS. Помните, что визуальное свойство ТолькоПросмотр делает работу пользователя комфортной (позволяет копировать текст), в то время как Доступность = Ложь полностью блокирует взаимодействие с элементами формы.

← На главную