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