При работе с расширениями в системе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда новый реквизит, добавленный в объект (например, в документ), упорно отказывается появляться на форме в режиме «Предприятие». Несмотря на то, что в конфигураторе реквизит добавлен в дерево метаданных и даже вручную перенесен на форму, пользователь его просто не видит. Давайте подробно разберем, почему это происходит и как решить данную задачу, не прибегая к радикальному методу пересоздания формы с нуля.
Прежде всего, нам необходимо понять механику взаимодействия расширения с основной конфигурацией. Когда мы создаем документ непосредственно в расширении или заимствуем существующий, платформа формирует определенные связи между объектами метаданных. Ситуация, описанная разработчиками, когда основной реквизит Объект на форме «не разворачивается» (отсутствует плюсик), говорит о том, что редактор формы в расширении не всегда оперативно подхватывает изменения в структуре расширяемого или нового объекта.
Рассмотрим основные причины такого поведения:
Проанализируем пошагово способы решения этой проблемы, от простых к более сложным и надежным.
Как показывает практика и обсуждения экспертов, это самый надежный метод. Если визуальный редактор «глючит», мы можем принудительно заставить платформу отобразить нужные данные в момент запуска формы. Для этого воспользуемся событием ПриСозданииНаСервере.
Разберем пример кода, который позволяет программно добавить поле ввода для нового реквизита. Допустим, мы добавили в документ реквизит ДополнительнаяИнформация.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определим имя нового реквизита, который мы добавили в расширении
ИмяРеквизита = "ДополнительнаяИнформация";
ПутьКДанным = "Объект." + ИмяРеквизита;
// Проверим, нет ли уже такого элемента на форме (чтобы избежать ошибок)
Если Элементы.Найти(ИмяРеквизита) = Неопределено Тогда
// Добавляем новое поле формы.
// В качестве родителя можно указать конкретную группу, например, Элементы.ГруппаШапка
НовыйЭлемент = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), ЭтаФорма);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = ПутьКДанным;
НовыйЭлемент.Заголовок = "Дополнительная информация (из расширения)";
// Установим дополнительные свойства, если нужно
НовыйЭлемент.РастягиватьПоГоризонтали = Истина;
КонецЕсли;
КонецПроцедуры
Использование программного создания гарантирует, что элемент появится на форме независимо от состояния кэша метаданных в конфигураторе. Мы совместно с платформой определяем структуру интерфейса в момент инициализации объекта.
Если программный метод кажется избыточным, попробуем выяснить причину в пользовательском интерфейсе. Часто новый реквизит физически присутствует в структуре, но скрыт настройками. Выполним следующие действия в режиме «Предприятие»:
После этого платформа перечитает структуру формы из расширения, игнорируя старые сохраненные настройки пользователя. Если реквизит был добавлен в редакторе формы в конфигураторе, он должен появиться.
Выясним еще одну важную деталь: иногда помогает «передергивание» основной таблицы или основного реквизита. В редакторе формы (в конфигураторе) на закладке «Реквизиты» найдите основной реквизит (обычно это Объект с типом ДокументОбъект.ИмяВашегоДокумента).
Попробуйте временно изменить тип этого реквизита на ПроизвольноеЗначение, а затем верните его обратно на исходный тип документа из расширения. Это заставляет платформу перестроить дерево доступных полей. Если после этой манипуляции у реквизита Объект появился заветный «плюсик», значит, вы сможете просто перетащить нужный реквизит на форму мышкой.
Если вышеперечисленные методы не помогают, стоит обратить внимание на техническое состояние окружения. Проанализируем версию платформы. В некоторых релизах 8.3.15 - 8.3.18 наблюдались проблемы с обновлением состава заимствованных объектов в расширениях.
Рекомендуется выполнить следующие действия:
%AppData%\1C\1cv8 и %LocalAppData%\1C\1cv8.Существует мнение, что создание новых документов целиком внутри расширения — это «наследие» старых подходов или не совсем корректная практика. Однако современная платформа 1С это полностью поддерживает. Чтобы избежать проблем в будущем, придерживайтесь следующих правил:
Рассмотрев все эти методы, мы видим, что проблема «невидимости» реквизитов чаще всего носит интерфейсный характер или связана с особенностями обновления метаданных платформой. Программный метод добавления элементов Элементы.Добавить() остается самым «бронебойным» решением, которое мы рекомендуем использовать в сложных случаях.