Как правильно добавить реквизиты и вывести их на управляемую форму в расширении 1С 8.3

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

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

Выясняем причину: почему очищаются поля при перезапуске формы?

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

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

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

Способ 1. Интерактивное добавление реквизитов через заимствование основного реквизита формы

Это самый простой визуальный способ, который не требует написания программного кода. Главное правило — связать элементы формы напрямую с реквизитами базы данных через основной реквизит формы (обычно это Объект).

Рассмотрим по шагам, как выполнить эту операцию правильно:

  1. Откроем конфигуратор и перейдем в наше расширение.
  2. В дереве объектов расширения найдем нужный нам справочник (например, Контрагенты) и добавим в него наши новые реквизиты (например, Расш_ДополнительныйКод).
  3. Заимствуем необходимую управляемую форму этого справочника в расширение.
  4. Откроем редактор заимствованной формы. Перейдем на вкладку Реквизиты (правое верхнее окно редактора формы).
  5. Найдем основной реквизит формы, который выделен жирным шрифтом — обычно это Объект (с типом СправочникОбъект.Контрагенты).
  6. Нажмем на этот реквизит Объект правой кнопкой мыши и выберем в контекстном меню команду Добавить в расширение.
  7. После этого структура реквизита Объект в расширении обновится, и внутри него появится добавленный нами реквизит Расш_ДополнительныйКод.
  8. Теперь просто перетащим реквизит Расш_ДополнительныйКод из ветки реквизита Объект в левое окно элементов формы.

При таком подходе платформа автоматически установит свойство элемента формы ПутьКДанным в значение Объект.Расш_ДополнительныйКод. Данные будут корректно считываться из базы данных при открытии формы и автоматически записываться в нее при сохранении объекта.

Способ 2. Программное создание элементов на форме (Best Practice)

Заимствование управляемых форм в редактор расширения «как есть» — это не всегда лучшая практика. Дело в том, что при обновлении типовой конфигурации разработчики фирмы «1С» могут кардинально изменить структуру оригинальной формы (удалить или переименовать группы, перенести элементы). Если ваша форма заимствована визуально, расширение может конфликтовать или полностью перестать применяться.

Чтобы избежать подобных проблем и сделать расширение максимально «живучим», рекомендуется добавлять новые поля на форму программно. При этом саму форму заимствовать визуально не нужно, достаточно перехватить событие формы.

Проанализируем пример программного вывода поля на форму при помощи события ПриСозданииНаСервере:


&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Определим группу на форме, в которую мы хотим поместить новое поле.
    // Например, это может быть стандартная панель или шапка формы.
    РодительскаяГруппа = Элементы.Найти("ГруппаШапка");
    
    Если РодительскаяГруппа <> Неопределено Тогда
        
        // Создаем новый элемент формы типа "Поле ввода"
        НовоеПоле = Элементы.Добавить("Расш_ДополнительныйКод", Тип("ПолеФормы"), РодительскаяГруппа);
        НовоеПоле.Вид = ВидПоляФормы.ПолеВвода;
        
        // КРИТИЧЕСКИ ВАЖНО: Связываем элемент формы напрямую с реквизитом объекта базы данных!
        НовоеПоле.ПутьКДанным = "Объект.Расш_ДополнительныйКод";
        
        // Настроим дополнительные визуальные свойства поля
        НовоеПоле.Заголовок = "Дополнительный код (расш.)";
        НовоеПоле.КнопкаОчистки = Истина;
        
    КонецЕсли;
    
EndПроцедуры

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

Способ 3. Настройка ролей и прав доступа в расширении

Иногда возникает ситуация, когда разработчик сделал все правильно: добавил реквизит в расширение, правильно привязал его к объекту, вывел на форму, но под обычным пользователем поле ввода все равно остается невидимым. Это происходит из-за особенностей работы механизма ролей и прав доступа в платформе 1С (начиная с версий 8.3.12 и выше).

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

  1. Создадим новую роль непосредственно внутри нашего расширения (например, назовем ее Расш_ОсновнаяРоль).
  2. В свойствах этой роли найдем наш расширенный справочник и добавленный реквизит Расш_ДополнительныйКод.
  3. Установим для этой роли галочки прав: Чтение, Просмотр, Изменение и Редактирование.
  4. Обратите внимание, что роли из расширения не всегда видны в стандартном списке ролей пользователя в конфигураторе основной базы данных.
  5. Для назначения прав запустим систему в режиме «1С:Предприятие» под учетной записью администратора, перейдем в меню Администрирование — Настройки пользователей и прав — Профили групп доступа. Создадим новый профиль, включим в него нашу роль из расширения и добавим нужных пользователей в созданную группу доступа.

Альтернатива: Использование механизма «Дополнительные реквизиты» БСП

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

В конфигурациях уровня ERP, Комплексная автоматизация или Управление торговлей уже есть мощный механизм дополнительных реквизитов:

  1. Перейдем в режиме «1С:Предприятие» в меню Администрирование — Общие настройки — Дополнительные реквизиты и сведения.
  2. Добавим новый дополнительный реквизит к нашему справочнику. Эти данные будут безопасно храниться в стандартной табличной части объекта ДополнительныеРеквизиты.
  3. Если стандартное размещение этого дополнительного реквизита на форме вас не устраивает, мы можем задействовать наше расширение исключительно для визуального изменения интерфейса. В процедуре ПриСозданииНаСервере программно найдем созданный БСП элемент и перенесем его в нужную нам группу формы. Данные при этом будут надежно храниться в типовой структуре 1С.

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

← На главную