Как найти причину блокировки поля на форме в 1С?

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

Часто разработчики сталкиваются с ситуацией: при открытии формы какой-либо реквизит или кнопка оказываются недоступными — отображаются серым цветом или заблокированы для редактирования. При этом быстрая проверка кода в обработчиках событий формы, таких как ПриСозданииНаСервере или ПриОткрытии, не дает результата — отладчик показывает, что свойство доступности элемента установлено в Истина. Однако, как только выполнение кода завершается и форма появляется на экране, элемент оказывается заблокирован.

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

Шаг 1. Разбираемся в свойствах: "Доступность" или "ТолькоПросмотр"?

Первая и самая частая причина безуспешной отладки — это поиск не того свойства. Платформа 1С предоставляет два основных механизма для блокировки элемента на форме, и они работают по-разному.

Элементы.ИмяЭлемента.Доступность = Ложь

Это "жесткая" блокировка. Элемент становится серым и полностью неактивным. Пользователь не может:

Элементы.ИмяЭлемента.ТолькоПросмотр = Истина

Это "мягкая" блокировка, которая чаще всего используется в типовых конфигурациях. Элемент остается визуально активным, но изменять его значение нельзя. Пользователь может:

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

Шаг 2. Эффективные приемы отладки

Если мы уверены, какое свойство искать, но не можем найти строку кода, которая его изменяет, применим более продвинутые инструменты отладчика.

Точка останова с условием

Это самый мощный инструмент для решения нашей задачи. Вместо того чтобы ставить обычную точку останова и по шагам (F10/F11) проходить сотни строк кода, мы можем заставить отладчик остановиться именно в тот момент, когда нужное нам свойство изменится.

Рассмотрим, как это сделать:

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

Анализ стека вызовов

Когда отладчик остановился (особенно если это произошло в общем модуле, а не в модуле формы), важно понять, "как мы сюда попали". Для этого используем окно "Стек вызовов" (Ctrl+Alt+C в Конфигураторе). Оно показывает всю цепочку вызовов процедур и функций, которая привела к текущей точке кода. Это помогает отследить логику программы и понять, почему был вызван тот или иной код, изменяющий свойство элемента.

Шаг 3. Проверяем неочевидные причины блокировки

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

Права доступа (Роли)

Это одна из самых частых причин. Если у текущего пользователя в его роли нет права на редактирование реквизита объекта, то платформа автоматически установит для связанного с ним элемента формы свойство ТолькоПросмотр в значение Истина. Это происходит на уровне платформы еще до выполнения кода в ПриСозданииНаСервере. Что делать: Проверьте права пользователя на редактирование нужного реквизита. Откройте роль пользователя (Администрирование -> Настройки пользователей и прав) и убедитесь, что на нужный объект и его реквизит стоит галочка "Изменение".

Условное оформление

Еще один механизм, который может изменять внешний вид и свойства элементов "в обход" основного кода.

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

Что делать: В режиме предприятия откройте форму, нажмите "Еще" -> "Изменить форму". В открывшемся окне найдите вверху вкладку "Условное оформление" и внимательно изучите все настроенные правила. Возможно, одно из них влияет на ваш элемент.

Функциональные опции

В типовых конфигурациях широко используется механизм функциональных опций для включения или отключения целых разделов учета. Элементы формы могут быть привязаны к таким опциям. Если опция выключена, платформа автоматически скрывает связанные с ней элементы (устанавливает Видимость = Ложь). Хотя это не совсем про доступность, иногда скрытый элемент можно спутать с заблокированным.

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

Шаг 4. Инструменты для сложных и запутанных случаев

Замер производительности

Если предыдущие шаги не помогли, можно прибегнуть к "тяжелой артиллерии". Замер производительности фиксирует абсолютно все вызовы процедур и функций за определенный период.

  1. В Конфигураторе выберите меню "Отладка" -> "Замер производительности".
  2. Нажмите "Старт" (или F5) прямо перед тем, как открыть проблемную форму.
  3. Откройте форму, дождитесь полной загрузки.
  4. Вернитесь в Конфигуратор и нажмите "Стоп" (или F6).

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

Отладка с отключением фоновых заданий

Иногда на открытие формы могут влиять фоновые или регламентные задания, которые выполняются параллельно. Они "засоряют" замер производительности и усложняют отладку. Чтобы этого избежать, можно запустить 1С в специальном режиме.

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

/Debug

В типовых конфигурациях, использующих Библиотеку стандартных подсистем (БСП), этот ключ заставит многие фоновые задания выполняться в основном сеансе последовательно, а не параллельно. Это позволит вам отлаживать их код стандартным отладчиком и сделает замер производительности более чистым.

Итоговый чек-лист для поиска причины блокировки

Итак, подведем итог. Если вы столкнулись с заблокированным полем на форме, действуйте по следующему алгоритму:

  1. Определите тип блокировки: поле серое (Доступность = Ложь) или просто не редактируется (ТолькоПросмотр = Истина)?
  2. Используйте точку останова с условием: установите ее на изменение нужного свойства (например, Элементы.ИмяЭлемента.ТолькоПросмотр = Истина).
  3. Проверьте права доступа: убедитесь, что у пользователя есть права на изменение реквизита.
  4. Изучите условное оформление формы на предмет скрытых правил.
  5. Проверьте свойство ТолькоПросмотр у самой формы: возможно, вся форма открыта в режиме "только для чтения" через ЭтаФорма.ТолькоПросмотр = Истина.
  6. Проанализируйте функциональные опции, если есть подозрение, что элемент скрыт.
  7. Если ничего не помогает, воспользуйтесь замером производительности, предварительно запустив базу с ключом /Debug.

Применение этих методов в комплексе почти наверняка поможет вам найти источник проблемы и понять логику работы программы.

← На главную