Почему программно добавленные реквизиты на форму 1С 8.3 остаются недоступными для редактирования?

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

При программном расширении функциональности типовых конфигураций 1С, например, добавлением новых реквизитов на форму, мы можем столкнуться с ситуацией, когда эти реквизиты видны, но не доступны для редактирования. Это распространённая проблема, которая может ввести в заблуждение, особенно когда мы явно устанавливаем свойства доступности элементов формы. Рассмотрим, как мы можем диагностировать и решить эту проблему на примере конфигурации 1С:ERP 2.5.

Анализируем исходную ситуацию и код

Предположим, мы добавили в типовой справочник два новых нетиповых реквизита: "Использовать" (Булево) и "Новая характеристика" (Строка). Далее, мы программно добавили их на типовую форму элемента справочника, поместив в новую группу. При этом, при создании элементов формы, мы установили явные свойства доступности:


СтруктураСвойств = Новый Структура("ТолькоПросмотр", Ложь);
СтруктураСвойств.Вставить("Доступность", Истина);
СтруктураСвойств.Вставить("Видимость", Истина);

Несмотря на эти настройки, реквизиты остаются недоступными для редактирования. Для добавления элементов и группы использовались вспомогательные функции, например, ПС.СздГруппаОбычная и ПС.СздПоле. Пути к данным реквизитов были указаны как Объект.ПС_Использовать и Объект.ПС_НоваяХарактеристика. Рассмотрим, как мы создавали группу, в которую были помещены эти реквизиты:


группа = Новый Структура;
группа.Вставить("Видимость", Истина);
группа.Вставить("ТолькоПросмотр", Истина); // <-- Ключевой момент
группа.Вставить("ВажностьПриОтображении", ВажностьПриОтображении.Высокая);
группа.Вставить("Отображение", ОтображениеОбычнойГруппы.СлабоеВыделение);
группа.Вставить("Поведение", ПоведениеОбычнойГруппы.Свертываемая);
группа.Вставить("ОтображатьЗаголовок", Истина);
группа.Вставить("Объединенная", Истина);
группа.Вставить("ОтображатьОтступСлева", Истина);
группа.Вставить("ОтображениеУправления", ОтображениеУправленияОбычнойГруппы.Картинка);
группа.Вставить("Группировка", ГруппировкаПодчиненныхЭлементовФормы.Вертикальная);

// Пример вызова вспомогательной функции для создания группы
ГруппаЭлементаФормы = ПС.СздГруппаОбычная(Форма, "ПС_НоваяГруппа", Форма, "Новая группа", , , , группа);

// Пример вызова вспомогательной функции для создания полей
ПС.СздПоле(Форма, "ПС_Использовать", ГруппаЭлементаФормы, "Использовать", 2, "Объект.ПС_Использовать", СтруктураСвойств);
ПС.СздПоле(Форма, "ПС_НоваяХарактеристика", ГруппаЭлементаФормы, "Новая характеристика", 1, "Объект.ПС_НоваяХарактеристика", СтруктураСвойств);

Выявляем основную причину недоступности реквизитов

Внимательно изучая свойства группы, мы сразу обращаем внимание на строку: группа.Вставить("ТолькоПросмотр", Истина);. Это является Полезна: критически важной причиной того, что все элементы, помещенные в эту группу, будут недоступны для редактирования, независимо от их индивидуальных настроек. Свойство ТолькоПросмотр у родительского элемента (в данном случае, у группы) имеет более высокий приоритет и переопределяет аналогичные свойства у его дочерних элементов.

Для решения этой проблемы нам необходимо изменить свойство ТолькоПросмотр для создаваемой группы на Ложь. Пересмотрим код создания группы:


группа = Новый Структура;
группа.Вставить("Видимость", Истина);
группа.Вставить("ТолькоПросмотр", Ложь); // <-- Изменено на Ложь!
группа.Вставить("ВажностьПриОтображении", ВажностьПриОтображении.Высокая);
группа.Вставить("Отображение", ОтображениеОбычнойГруппы.СлабоеВыделение);
группа.Вставить("Поведение", ПоведениеОбычнойГруппы.Свертываемая);
группа.Вставить("ОтображатьЗаголовок", Истина);
группа.Вставить("Объединенная", Истина);
группа.Вставить("ОтображатьОтступСлева", Истина);
группа.Вставить("ОтображениеУправления", ОтображениеУправленияОбычнойГруппы.Картинка);
группа.Вставить("Группировка", ГруппировкаПодчиненныхЭлементовФормы.Вертикальная);

После этого изменения, реквизиты "Использовать" и "Новая характеристика" станут доступными для редактирования, если нет других блокирующих факторов, которые мы рассмотрим далее.

Проверяем связь реквизитов с данными формы

Помимо свойств доступности, критически важно убедиться, что элементы формы корректно связаны с реквизитами формы через свойство ПутьКДанным. В нашем случае, мы видим, что путь указан как "Объект.ПС_Использовать" и "Объект.ПС_НоваяХарактеристика". Это означает, что:

  1. На форме должен существовать реквизит формы с именем Объект. Как правило, это основной реквизит формы, ссылающийся на объект базы данных (например, справочник или документ).
  2. В метаданных объекта, на который ссылается реквизит формы Объект, должны быть добавлены реквизиты с именами ПС_Использовать и ПС_НоваяХарактеристика.

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

Дополнительные факторы, влияющие на доступность элементов формы

Даже если мы правильно настроили свойства группы и отдельных элементов, а также указали корректный ПутьКДанным, могут существовать другие причины, по которым программно добавленные реквизиты остаются недоступными. Рассмотрим эти сценарии:

  1. Наследование свойств от родительских элементов:

    Свойства ТолькоПросмотр, Доступность и Видимость элементов формы наследуются от их родителей. Если сама форма или вышестоящая группа (например, не наша "НоваяГруппа", а та, в которую мы поместили "НовуюГруппу") имеет свойство ТолькоПросмотр = Истина или Доступность = Ложь, это переопределит индивидуальные настройки дочерних элементов. Всегда проверяйте всю иерархию элементов формы.

  2. Отсутствие связи с данными или неверный путь к данным:

    Мы уже упоминали об этом. Убедитесь, что ПутьКДанным (например, Объект.ПС_Использовать) указывает на существующий реквизит формы, который в свою очередь ссылается на действительный реквизит объекта метаданных. Если реквизит формы Объект отсутствует, или в нем не существует поля ПС_Использовать, поле на форме не будет работать корректно.

  3. Свойство "СохраняемыеДанные" для реквизитов формы:

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

    
    НовыйРеквизит = Форма.Реквизиты.Добавить("МойНовыйРеквизит", Новый ОписаниеТипов("Строка"), "Объект");
    НовыйРеквизит.СохраняемыеДанные = Истина; // Это важно для сохранения изменений
    
  4. Права пользователя:

    Даже работая с правами администратора, мы можем столкнуться со специфическими ограничениями. В типовых конфигурациях 1С:ERP используются сложные ролевые модели и механизмы ограничения доступа на уровне записей (РЛС). Убедитесь, что для текущего пользователя (даже администратора, если его права были как-то сужены или он не входит в группу 'Полные права') есть явное разрешение на изменение данных объекта, к которому относится реквизит. Это могут быть права на запись для справочника/документа, а также права на изменение конкретного реквизита, если они были настроены.

  5. Условное оформление:

    Доступность поля может быть динамически изменена с помощью условного оформления. Оно может быть настроено как непосредственно в конфигураторе (в ветке "Условное оформление" формы), так и программно (с помощью коллекции ЭлементыФормы.УсловноеОформление). Проверьте, нет ли правил условного оформления, которые устанавливают Доступность = Ложь для наших реквизитов или их родительских групп при определенных условиях.

  6. Режим формы "ТолькоПросмотр":

    Сама форма может быть открыта в режиме "ТолькоПросмотр". Это может быть задано при ее вызове (например, параметр РежимПросмотра или ТолькоПросмотр) или установлено в одном из обработчиков формы, например, ПриСозданииНаСервере или ПриОткрытии, путем установки свойства Форма.ТолькоПросмотр = Истина.

  7. Особенности типовой конфигурации ERP:

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

  8. Ошибки в функциях-помощниках:

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

  9. Контекст выполнения кода:

    Код, который управляет доступностью элементов формы, должен выполняться в правильном контексте. Например, изменения, которые должны быть применены при создании формы, должны выполняться на сервере в обработчике ПриСозданииНаСервере. Интерактивные изменения доступности, реагирующие на действия пользователя, могут выполняться на клиенте.

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

← На главную