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