Разработка в расширениях конфигурации — это современный стандарт адаптации типовых решений 1С под нужды конкретного бизнеса. Однако разработчики часто сталкиваются с неприятной проблемой: новый реквизит, успешно созданный в расширении и добавленный на заимствованную форму в конфигураторе, упорно отказывается отображаться в режиме «1С:Предприятие».
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем внутренние механизмы платформы 1С:Предприятие 8.3 и рассмотрим два основных способа решения задачи: классический интерактивный (с исправлением типичных ошибок) и профессиональный программный метод, который является индустриальным стандартом.
Если вы заимствовали форму, добавили в расширение реквизит объекта (например, документа или справочника), перетащили его визуально в редакторе формы, но в режиме предприятия поле не появилось, дело может быть в одном из следующих факторов:
Объект формы в расширение на релизах платформы ниже 8.3.14, система принудительно затягивала за собой огромное количество связанных объектов конфигурации. Это перегружало расширение и приводило к непредсказуемому поведению интерфейса.Если вы хотите пойти по пути визуального проектирования интерфейса, необходимо строго соблюдать последовательность действий для предотвращения конфликтов метаданных.
Выполним следующие шаги в Конфигураторе:
Расш_ДополнительнаяИнформация).Объект. Нам нужно добавить наш созданный реквизит в структуру этого объекта внутри формы. Для этого встанем на строку Объект и нажмем кнопку Добавить в расширение на командной панели дерева реквизитов. Наш новый реквизит появится в списке подчиненных элементов Объект.Теперь, чтобы элемент гарантированно отобразился у пользователей, выполним следующие действия по устранению системных конфликтов:
Шаг 1. Обновление сохраненной формы. В конфигураторе, находясь в редакторе формы расширения, выберем в главном меню пункт Форма -> Обновить сохраненную форму (или воспользуемся аналогичным пунктом в контекстном меню). Это синхронизирует структуру заимствованной формы с актуальным состоянием основной конфигурации.
Шаг 2. Настройка прав доступа. В расширении необходимо создать собственную роль (например, Расш_ОсновнаяРоль), установить для нее признак Устанавливать права для новых объектов или вручную отметить права на «Чтение» и «Просмотр» для нашего нового реквизита. Не забудьте назначить эту роль пользователям через профили групп доступа в режиме предприятия.
Шаг 3. Сброс кэша формы в режиме предприятия. Запустим сеанс «1С:Предприятие». Откроем проблемную форму. Нажмем на кнопку Еще в правом верхнем углу формы и выберем команду Изменить форму.... В открывшемся окне настройки перейдем в меню Еще -> Установить стандартные настройки. Нажмем «ОК».
Если индивидуальные настройки мешают глобально, сбросить их для конкретного пользователя можно через административный раздел программы: Администрирование -> Настройки пользователей и прав -> Очистка настроек.
Профессиональные разработчики 1С стараются избегать интерактивного изменения заимствованных форм в расширениях. Почему? Потому что при любом обновлении типовой конфигурации от фирмы «1С» (или другого вендора) структура заимствованной формы может кардинально измениться. Если вы изменили форму визуально в расширении, при обновлении вы рискуете получить критическую ошибку, которая заблокирует работу пользователей.
Программное добавление элементов полностью решает эту проблему. Мы заимствуем только саму форму (причем исключительно ее модуль, не трогая визуальную структуру) и пишем код, который динамически создает поле на форме в момент ее открытия.
Рассмотрим по шагам, как это реализовать:
Расш_УчетныйНомер).Объект или перетаскивать элементы визуально. Оставим дерево элементов формы нетронутым.ПриСозданииНаСервере. Мы будем использовать аннотацию &После, чтобы наш код выполнился сразу после стандартной инициализации формы системой.Проанализируем и применим следующий шаблон кода в модуле формы расширения:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Определим уникальное имя для нашего нового элемента формы
ИмяЭлемента = "Расш_УчетныйНомерПоле";
// Обязательно проверяем, не был ли элемент уже создан ранее.
// Это предотвратит ошибки при повторном вызове серверного кода формы.
Если Элементы.Найти(ИмяЭлемента) = Неопределено Тогда
// Шаг 1. Определяем родительскую группу на форме, куда поместим элемент.
// Рекомендуется искать стандартные группы, такие как "ГруппаШапка", "Шапка" или "ГруппаРеквизитов".
// Если группа не найдена, в качестве родителя можно использовать саму форму (Элементы).
РодительскаяГруппа = Элементы.Найти("ГруппаШапка");
Если РодительскаяГруппа = Неопределено Тогда
РодительскаяГруппа = Элементы.Найти("Шапка");
КонецЕсли;
// Если стандартные группы не найдены, добавим элемент в корень формы
Если РодительскаяГруппа = Неопределено Тогда
Родитель = Элементы;
Иначе
Родитель = РодительскаяГруппа;
КонецЕсли;
// Шаг 2. Создаем элемент формы типа "ПолеФормы"
НовыйЭлемент = Элементы.Добавить(ИмяЭлемента, Тип("ПолеФормы"), Родитель);
// Шаг 3. Настраиваем вид поля (ПолеВвода, ПолеФлажка, ПолеНадписи и т.д.)
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
// Шаг 4. Связываем элемент с данными реквизита объекта, добавленного в расширении.
// Обратите внимание на синтаксис: ПутьКДанным должен указывать на реквизит через точку от Объект.
НовыйЭлемент.ПутьКДанным = "Объект.Расш_УчетныйНомер";
// Шаг 5. Задаем пользовательские свойства отображения
НовыйЭлемент.Заголовок = "Учетный номер (Расширение)";
НовыйЭлемент.Подсказка = "Введите уникальный учетный номер документа";
НовыйЭлемент.РастягиватьПоГоризонтали = Истина;
// При необходимости можно настроить положение заголовка
НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Лево;
КонецЕсли;
КонецПроцедуры
Давайте подробно разберем, какие преимущества дает этот программный метод:
ГруппаШапка, ваша база не упадет с критической ошибкой при запуске. Код проверит условие РодительскаяГруппа = Неопределено и безопасно поместит элемент в корень формы.Начиная с версии платформы 8.3.14, фирма «1С» существенно переработала внутренние алгоритмы работы с расширениями. Были внедрены механизмы оптимизированного («ленивого») заимствования и концепция контролируемого изменения форм.
В старых версиях платформы попытка заимствовать форму приводила к тому, что система тащила в расширение все связанные типы данных реквизитов формы. Сейчас этот процесс изолирован: платформа контролирует изменения точечно. Тем не менее, даже на самых современных версиях платформы (8.3.20 и выше) визуальное редактирование форм в расширениях может давать сбои в процессе динамического обновления конфигурации базы данных («демонского» обновления).
Поэтому программное добавление элементов через обработчик ПриСозданииНаСервере с аннотацией &После остается признанным «золотым стандартом» среди разработчиков крупных корпоративных систем на базе 1С:ERP, 1С:КА и 1С:ЗУП.