Как сделать документ доступным только для просмотра при изменении значения реквизита типа "Перечисление" в 1С:Предприятии?

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

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

Определяем цель и основные подходы

Наша задача заключается в том, чтобы при изменении реквизита документа, который ссылается на перечисление (например, "Активность" со значениями "Активный" и "Деактив"), весь документ либо был открыт для редактирования, либо становился доступен только для просмотра. Для решения этой проблемы мы можем использовать следующие подходы:

  1. Управление доступностью всей формы: Использование свойства ЭтаФорма.ТолькоПросмотр для управления доступностью всей формы документа. Это наиболее простой и эффективный способ полной блокировки.
  2. Управление доступностью отдельных элементов: Использование свойства Доступность или ТолькоПросмотр для каждого отдельного элемента формы (полей ввода, табличных частей и т.д.). Этот подход обеспечивает более гранулированный контроль, но требует больше кода.
  3. Отладка как основной инструмент: Ключевым инструментом для отладки и проверки нашего кода будет Отладчик 1С, без которого найти ошибки и понять поведение кода практически невозможно.

Подход 1: Управление доступностью всей формы через ЭтаФорма.ТолькоПросмотр

Наиболее эффективный и рекомендуемый способ сделать весь документ доступным только для просмотра — это использовать свойство формы ЭтаФорма.ТолькоПросмотр. Это свойство, доступное из встроенного языка 1С, позволяет перевести всю форму в режим просмотра, тем самым блокируя большинство элементов управления и стандартных действий, таких как кнопки "Записать", "ЗаписатьИЗакрыть" и "Провести", которые связаны с предопределенными действиями расширения формы.

Когда вы устанавливаете ЭтаФорма.ТолькоПросмотр = Истина, большинство элементов формы становятся недоступными для изменения. Их поведение аналогично тому, как если бы у них был сброшен признак "Доступность". При этом сам признак "Доступность" элемента может быть установлен, но элемент все равно будет недоступен для редактирования. Для некоторых элементов, таких как поля ввода и табличные поля, это свойство переводит их в состояние, когда данные изменять нельзя, но просматривать и, например, открывать связанные объекты по кнопке выбора — можно.

Где разместить код для ЭтаФорма.ТолькоПросмотр

Код для установки свойства ЭтаФорма.ТолькоПросмотр следует размещать в процедуре-обработчике события ПриИзменении для того реквизита документа, который будет контролировать доступность формы. В нашем случае это реквизит "Активность".

Также очень важно учесть начальное состояние формы. Если документ открывается, и реквизит "Активность" уже имеет определенное значение, режим просмотра должен быть установлен сразу же. Для этого логику можно продублировать или вызвать из обработчика события формы ПриСозданииНаСервере.

Пример кода для реквизита документа "Активность"

Предположим, у нас есть реквизит документа Активность с типом "Перечисление.Активность", которое имеет значения "Активный" и "Деактив". Мы хотим, чтобы при выборе "Активный" документ был открыт для редактирования (ЭтаФорма.ТолькоПросмотр = Ложь), а при выборе "Деактив" — становился доступен только для просмотра (ЭтаФорма.ТолькоПросмотр = Истина).

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


&НаКлиенте
Процедура АктивностьПриИзменении(Элемент)
    // При изменении реквизита на клиенте вызываем серверную процедуру
    // для установки режима просмотра, так как она будет работать с Объект.Активность.
    УстановитьРежимПросмотраДокумента();
КонецПроцедуры

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

Важный момент: Мы обращаемся к реквизиту документа через Объект.Активность. Это необходимо, поскольку Активность является реквизитом самого объекта (документа), а не просто реквизитом формы, который хранится только в контексте формы. Если бы это был реквизит формы, то обращение было бы напрямую к Активность.

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


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    УстановитьРежимПросмотраДокумента(); // Устанавливаем режим просмотра сразу при открытии формы
КонецПроцедуры

Распространенные ошибки и их исправление

Одна из наиболее частых причин, по которой код может "не работать", — это опечатки. Убедитесь, что вы правильно написали свойство ТолькоПросмотр. Как было замечено в одном из сообщений форума, пользователь допустил опечатку, написав ТолькоПрасмотр, что, конечно же, приведет к ошибке во время исполнения или на этапе проверки синтаксиса.

Всегда внимательно проверяйте синтаксис, названия свойств и методов. Платформа 1С очень чувствительна к таким ошибкам. Используйте механизм автоподстановки кода (Ctrl+Пробел), чтобы избежать опечаток.

Подход 2: Управление доступностью отдельных элементов формы

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

Пример кода для управления доступностью отдельных элементов

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

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


&НаКлиенте
Процедура АктивностьПриИзменении(Элемент)
    УстановитьДоступностьЭлементов();
КонецПроцедуры

&НаСервере
Процедура УстановитьДоступностьЭлементов()
    Если Объект.Активность = Перечисления.Активность.Деактив Тогда
        // Если активность "Деактив", делаем элементы недоступными или только для просмотра
        Элементы.ПолеВводаРеквизита1.Доступность = Ложь;
        Элементы.ПолеВводаРеквизита2.Доступность = Ложь;
        Элементы.ТабличнаяЧастьДокумента.ТолькоПросмотр = Истина;
        Элементы.ГруппаРеквизитов.Доступность = Ложь;
        // ... и так далее для всех нужных элементов формы
    Иначе
        // Если активность "Активный", делаем элементы доступными для редактирования
        Элементы.ПолеВводаРеквизита1.Доступность = Истина;
        Элементы.ПолеВводаРеквизита2.Доступность = Истина;
        Элементы.ТабличнаяЧастьДокумента.ТолькоПросмотр = Ложь;
        Элементы.ГруппаРеквизитов.Доступность = Истина;
        // ... и так далее
    КонецЕсли;
КонецПроцедуры

В одном из сообщений форума была предложена более короткая форма для установки свойства Доступность, что может быть удобно для отдельного элемента:


Процедура ТвойРеквизитПриИзменении(Элемент)
    // Устанавливаем свойство Доступность для текущего элемента,
    // если оно является полем ввода и управляется напрямую
    Элемент.Доступность = Объект.Активность = Перечисления.Активность.Деактив;
КонецПроцедуры

Эта строка устанавливает Доступность элемента в Истина, если активность "Деактив", и в Ложь, если активность "Актив". Однако, чтобы логика соответствовала исходной задаче (Деактив = ТолькоПросмотр/Недоступно), ее нужно инвертировать, если Доступность означает возможность редактирования, или использовать ЭтаФорма.ТолькоПросмотр для всего документа.

Важно: При использовании этого подхода вам придется вручную управлять доступностью каждого элемента, что может быть очень трудоемко для сложных форм с большим количеством реквизитов и табличных частей. Механизм ЭтаФорма.ТолькоПросмотр гораздо более удобен для полной блокировки всего документа.

Критическая важность отладки

Когда ваш код "не работает" или ведет себя не так, как ожидается, первое, что необходимо сделать, это воспользоваться Отладчиком 1С. Это самый мощный инструмент для диагностики проблем, и его использование неоднократно подчеркивалось участниками форума. Без отладки поиск причины может занять неоправданно много времени и усилий.

Как эффективно использовать отладчик

  1. Установите точки останова (breakpoints): Поместите точки останова на ключевых строках вашего кода. Например, на строке, где вы проверяете условие (Если Объект.Активность = Перечисления.Активность.Деактив Тогда) и на строке, где устанавливается свойство формы (ЭтаФорма.ТолькоПросмотр = Истина;).
  2. Запустите режим отладки: Откройте конфигуратор, затем запустите 1С:Предприятие в режиме отладки (обычно через F5). Откройте форму документа и измените значение реквизита "Активность".
  3. Пошаговое выполнение кода: Программа остановится на вашей точке останова. Вы сможете пошагово выполнять код, используя клавиши F10 (шаг через) и F11 (шаг в).
  4. Анализируйте значения переменных: В окне "Табло" или при наведении курсора на переменные, проверьте:
    • Какое фактическое значение имеет Объект.Активность в момент проверки условия.
    • Какое значение имеет константа Перечисления.Активность.Деактив.
    • Выполняется ли условие Объект.Активность = Перечисления.Активность.Деактив (т.е., является ли оно Истина или Ложь).
    • Доходит ли выполнение кода до строки, которая устанавливает ЭтаФорма.ТолькоПросмотр = Истина;.

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

Дополнительные аспекты и советы

При работе с режимом "только просмотр" и программным управлением доступностью в 1С:Предприятии, важно помнить о нескольких дополнительных моментах, которые могут повлиять на поведение вашей формы:

  1. Приоритет прав доступа платформы: Платформа 1С имеет встроенные механизмы прав доступа, которые имеют высокий приоритет. Если у пользователя нет прав на изменение объекта (например, документа), форма автоматически будет открыта в режиме только для просмотра, независимо от вашего программного кода. Ваш код лишь добавляет дополнительную логику поверх этих базовых ограничений.
  2. Блокировка проведенных документов: Очень часто требуется запрещать изменение документов после их проведения. Это можно настроить через роли и права пользователей (запрещая изменение объектов в состоянии "Проведен") или программно, проверяя статус проведения документа в обработчиках формы (например, в ПриСозданииНаСервере или ПередЗаписьюНаСервере).
  3. Механизм "Разрешить редактирование реквизитов": Для администраторов или пользователей с полными правами в типовых конфигурациях может существовать специальная команда "Разрешить редактирование реквизитов". Эта команда позволяет снять программные или системные запреты на изменение объекта. Важно понимать, что ваш код может быть обойден этим механизмом, если он используется.
  4. Визуальное обозначение режима: Используйте условное оформление формы для визуального обозначения того, что документ находится в режиме "только просмотр". Например, можно изменить цвет фона полей, сделать текст серым или применить другое форматирование, чтобы пользователь сразу понимал, что редактирование невозможно.
  5. Различие между реквизитами формы и реквизитами объекта: Всегда четко различайте реквизиты формы и реквизиты объекта. Реквизиты объекта (например, документа) доступны через свойство Объект формы (например, Объект.ИмяРеквизита). Реквизиты формы, которые не связаны напрямую с объектом базы данных, доступны напрямую (ИмяРеквизита). Это критично для правильной работы кода, особенно при обращении к значениям из базы данных.
  6. Изменение реквизитов формы программно: Если вы программно создаете или изменяете реквизиты формы, используйте метод ИзменитьРеквизиты(). Однако учитывайте, что эта операция является ресурсоемкой, и ее следует использовать осторожно. В нашем случае для работы с ТолькоПросмотр это не требуется.

Заключение

Управление доступностью формы документа в 1С:Предприятии — стандартная, но важная задача, которая позволяет повысить юзабилити и контролировать бизнес-процессы. Использование свойства ЭтаФорма.ТолькоПросмотр в обработчике события ПриИзменении реквизита документа является наиболее прямым и эффективным способом сделать весь документ доступным только для просмотра. Не забывайте о важности отладки для быстрого выявления и устранения проблем, а также о проверке синтаксиса и правильном обращении к реквизитам объекта. Внимательное следование этим рекомендациям поможет вам успешно реализовать требуемую логику.

← На главную