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