Как программно открыть форму документа в режиме «Только просмотр» в 1С?

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

В процессе разработки на платформе 1С:Предприятие часто возникает задача ограничить возможность редактирования документа при его открытии из определенного контекста. Например, когда пользователю нужно просмотреть данные документа через специальную кнопку в списке, не опасаясь случайно изменить важные реквизиты. В данной статье мы подробно разберем, как реализовать механизм открытия формы исключительно для чтения, проанализируем типичные ошибки начинающих разработчиков и рассмотрим современные подходы для различных типов приложений.

Разбор проблемы: Почему не работает стандартный вызов?

Рассмотрим ситуацию, с которой столкнулся автор темы. Попытка получить форму через метод ПолучитьФорму("ФормаДокумента") часто приводит к ошибке «Неизвестное имя формы». Выясним причину: в 1С при получении формы необходимо указывать либо полный путь к метаданным (например, Документ.Продажи.Форма.ФормаОбъекта), либо использовать методы самого объекта. Если мы находимся в форме списка, наиболее эффективным способом будет обращение к данным текущей строки.

Решение для обычных форм (Толстый клиент)

В обычных формах (традиционный интерфейс 1С 8.2 и частично 8.3) управление режимом просмотра осуществляется через свойство формы ТолькоПросмотр. Разберем по шагам, как правильно написать обработчик нажатия кнопки в форме списка.

Сначала нам необходимо получить ссылку на документ из выделенной строки списка. После этого мы получаем объектную форму этого документа и устанавливаем нужный флаг. Проанализируем пример кода:


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

    // Получаем основную форму объекта документа
    НужнаяФорма = ТекСтрока.ПолучитьФорму();
    
    // Устанавливаем режим "Только просмотр"
    НужнаяФорма.ТолькоПросмотр = Истина;
    
    // Открываем форму для пользователя
    НужнаяФорма.Открыть();
            
КонецПроцедуры

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

Решение для управляемых форм (Тонкий и веб-клиент)

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

Посмотрим на пример использования метода ОткрытьФорму() с передачей параметра ТолькоПросмотр:


&НаКлиенте
Процедура ОткрытьНаПросмотр(Команда)

    // Проверяем, выбрана ли строка в списке
    ТекущиеДанные = Элементы.Список.ТекущиеДанные;
    Если ТекущиеДанные = Неопределено Тогда
        Возврат;
    КонецЕсли;

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

    // Открываем основную форму объекта
    ОткрытьФорму("Документ.ИмяВашегоДокумента.ФормаОбъекта", ПараметрыФормы);

КонецПроцедуры

Преимущество этого метода заключается в том, что форма сразу «знает», в каком режиме она открывается. Это позволяет избежать лишних перерисовок интерфейса и правильно отработать событию ПриСозданииНаСервере.

Универсальное разграничение прав доступа

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

Рассмотрим пример кода в модуле формы:


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

КонецПроцедуры

Отличие свойства «ТолькоПросмотр» от «Доступность»

Разберем важный технический момент, который часто путают новички. У элементов формы и самой формы есть два похожих свойства: ТолькоПросмотр (ReadOnly) и Доступность (Enabled).

  1. ТолькоПросмотр: Позволяет пользователю взаимодействовать с формой. Он может выделять текст в полях, копировать его, переключать закладки (страницы), прокручивать списки. При этом кнопки записи (ОК, Записать) автоматически скрываются системой.
  2. Доступность: Если установить Доступность = Ложь, элементы становятся «серыми». С ними невозможно взаимодействовать — нельзя выделить текст или даже нажать на кнопку.

Для комфортной работы пользователя всегда предпочтительнее использовать ТолькоПросмотр, так как это сохраняет информативность интерфейса.

Влияние на блокировки данных

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

Рекомендации по реализации команд печати

При установке свойства ТолькоПросмотр стоит учитывать, что некоторые команды могут стать недоступными. Если на форме есть кнопка печати, созданная программно или вручную, убедитесь, что у её команды в свойстве «Изменяет сохраняемые данные» стоит значение «Ложь». В противном случае, при включении режима «Только просмотр», платформа заблокирует и возможность печати, считая её действием, изменяющим объект.

Подводя итог, можно сказать, что для решения задачи автора достаточно правильно обратиться к методу ПолучитьФорму() от объекта текущей строки и установить флаг ТолькоПросмотр. Однако для долгосрочной поддержки конфигурации лучше использовать механизм параметров управляемых форм или проверку прав доступа в модуле объекта.

← На главную