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