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

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

При разработке и настройке интерфейсов в системе «1С:Предприятие» разработчики часто сталкиваются с ситуацией, когда поведение элементов формы меняется в зависимости от состояния объекта. Типичный сценарий: при создании нового элемента справочника пользователь может свободно заполнять любые реквизиты (например, поле Цвет), но стоит только записать элемент, как это поле блокируется и становится доступным только для чтения. При этом кнопка выбора блекнет, а сам реквизит нельзя изменить.

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

1. Разница между свойствами «ТолькоПросмотр» и «Доступность»

Для управления возможностью редактирования данных на форме в 1С используются два основных свойства элементов: ТолькоПросмотр (ReadOnly) и Доступность (Enabled). Начинающие разработчики часто путают их или дублируют функционал, однако платформа обрабатывает эти свойства совершенно по-разному. Рассмотрим их подробнее:

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

2. Как реализуется логика «редактирование только для новых»

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

Сценарий А. Прямой программный код в модуле формы

В обычных формах (1С v8.3 и более ранних версиях) разработчики часто прописывают проверку состояния объекта непосредственно в событиях открытия формы. Для этого анализируется метод ЭтоНовый(). Давайте посмотрим на классический пример такого кода:


Процедура ПриОткрытии()
    Если Не ЭтоНовый() Тогда
        ЭлементыФормы.Цвет.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецПроцедуры

Если элемент справочника уже существует в базе данных (то есть метод ЭтоНовый() возвращает значение Ложь), платформа принудительно переводит поле ввода Цвет в режим просмотра.

Сценарий Б. Использование механизмов БСП (Библиотека стандартных подсистем)

Если ваша конфигурация разработана на основе БСП, то ручного кода в форме может и не быть. В БСП за это отвечает подсистема «Запрет редактирования реквизитов объектов». Логика работает следующим образом:

  1. Определенные реквизиты объявляются ключевыми (разработчиком в специальном модуле менеджера или в настройках).
  2. После записи элемента форма автоматически блокирует эти поля.
  3. Разблокировать их для изменения (при наличии соответствующих прав) можно через стандартное меню формы: Еще — Разрешить редактирование реквизитов.

3. Почему глобальный поиск по «Цвет.ТолькоПросмотр» ничего не находит

Часто разработчики пытаются найти место блокировки лобовым методом — через глобальный поиск по тексту Цвет.ТолькоПросмотр — и терпят неудачу. Выясним основные причины, почему система не выдает нужную строку:

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

4. Пошаговое руководство по поиску блокировки через отладчик

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

  1. Запустите конфигуратор и откройте модуль формы вашего справочника.
  2. Найдите предопределенные процедуры ПередОткрытием и ПриОткрытии.
  3. Установите точку останова (клавиша F9) на самую первую строчку кода в процедуре ПередОткрытием.
  4. Запустите систему в режиме «1С:Предприятие» под отладкой и откройте уже записанный элемент справочника. Программа приостановит работу на вашей точке останова.
  5. Откройте окно Табло (меню Отладка — Табло или сочетание клавиш Ctrl + Alt + W).
  6. Введите в Табло выражение: ЭлементыФормы.Цвет.ТолькоПросмотр и нажмите Enter. Вы увидите текущее значение свойства (на старте оно, скорее всего, будет равно Ложь).
  7. Начните пошагово выполнять код с помощью клавиши F10 (шаг без входа в процедуры) или F11 (шаг со входом внутрь процедур и функций).
  8. Внимательно следите за значением в Табло. Как только значение свойства ТолькоПросмотр изменится на Истина, посмотрите на строку кода, которая была выполнена только что. Именно она отвечает за блокировку элемента.

Этот простой и надежный алгоритм отладки позволяет быстро локализовать проблему даже в сильно кастомизированных конфигурациях со сложной архитектурой.

← На главную