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