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