Почему не отображаются добавленные предопределенные элементы справочника видов контактной информации?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия IT и автоматизация бизнеса
← На главную

При разработке и доработке типовых конфигураций на базе Библиотеки стандартных подсистем (включая «Бухгалтерию предприятия 3.0», «Управление торговлей», «ERP») разработчики часто сталкиваются с ситуацией: в конфигураторе в справочник ВидыКонтактнойИнформации добавлены новые предопределенные группы и элементы, обновление базы данных выполнено успешно, однако в режиме «1С:Предприятие» новые строки в списке не отображаются. При этом через универсальные обработки поиска данных видно, что элементы физически присутствуют в базе. Разберем по шагам, почему так происходит и как правильно решить данную проблему.

Анализ причин поведения платформы и подсистемы контактной информации

Выясним причину такого поведения. Когда мы добавляем новый предопределенный элемент в конфигураторе, платформа 1С в процессе реструктуризации базы данных создает соответствующую запись. Однако автоматически платформа инициализирует только системные поля: код, наименование и имя предопределенных данных. Все остальные прикладные реквизиты объекта получают значения по умолчанию. Для реквизитов булевого типа этим значением является Ложь.

В типовых конфигурациях справочник ВидыКонтактнойИнформации содержит реквизит Используется с типом Булево. В динамическом списке формы списка справочника жестко заложен отбор в тексте запроса или в настройках компоновки данных. Посмотрим на фрагмент типового условия запроса динамического списка:


ГДЕ
    СправочникВидыКонтактнойИнформации.Используется
    И ЕСТЬNULL(СправочникВидыКонтактнойИнформации.Родитель.Используется, Истина)

Обратим внимание на критически важный нюанс: проверяется не только сам элемент, но и его родительская папка. Если мы создали новую предопределенную группу, у нее реквизит Используется также автоматически равен Ложь. В результате отбора динамический список скрывает как саму группу, так и все вложенные в нее элементы. Даже если у дочернего элемента флаг взведен, но у родителя установлено Ложь, элемент не появится в интерфейсе.

Почему нельзя просто убирать отборы на форме списка?

Иногда возникает соблазн просто закомментировать условие в запросе динамического списка или изменить программное условное оформление формы. Делать так категорически не рекомендуется, и вот почему:

  1. Реквизит Используется участвует во всей бизнес-логике подсистемы контактной информации БСП. На формах объектов-владельцев (например, в справочниках Контрагенты, Организации, ФизическиеЛица) поля ввода контактной информации строятся динамически программным кодом. Если у вида или у его группы Используется = Ложь, соответствующие поля на форме контрагента просто не будут созданы.
  2. Виды контактной информации с выключенным признаком использования исключаются из механизмов валидации адресов, проверок телефонных номеров, генерации представлений и отчетов.

Следовательно, правильный путь — не ломать типовые фильтры форм, а корректно проинициализировать значения реквизитов созданных элементов в информационной базе.

Способ 1. Программное заполнение реквизитов внешней обработкой

Рассмотрим самый быстрый способ для базы данных разработки или разового исправления. Напишем код внешней обработки, который получит объекты предопределенных элементов и установит требуемые значения. Важно сначала обработать родительские группы, а затем подчиненные элементы.

Посмотрим на пример кода:


// 1. Активируем родительскую группу
ГруппаОбъект = Справочники.ВидыКонтактнойИнформации.МояПредопределеннаяГруппа.ПолучитьОбъект();
Если ГруппаОбъект <> Неопределено Тогда
    ГруппаОбъект.Используется = Истина;
    ГруппаОбъект.Записать();
КонецЕсли;

// 2. Настраиваем сам предопределенный вид контактной информации
ЭлементОбъект = Справочники.ВидыКонтактнойИнформации.МойПредопределенныйЭлемент.ПолучитьОбъект();
Если ЭлементОбъект <> Неопределено Тогда
    ЭлементОбъект.Используется = Истина;
    ЭлементОбъект.Тип = Перечисления.ТипыКонтактнойИнформации.Адрес;
    ЭлементОбъект.РеквизитДопУпорядочивания = 1;
    ЭлементОбъект.Записать();
КонецЕсли;

После выполнения этого кода динамический список сразу отобразит и группу, и вложенные элементы без каких-либо доработок форм.

Способ 2. Использование типовой обработки «Групповое изменение реквизитов»

Если нет возможности запускать внешние обработки с произвольным кодом, используем штатный механизм «1С:Предприятие»:

  1. Откроем обработку Групповое изменение реквизитов (в разделе «Администрирование» — «Обслуживание» — «Корректировка данных»).
  2. Нажмем кнопку Дополнительные параметры и обязательно включим флажки Режим разработчика и Показывать служебные реквизиты. Без этого платформа заблокирует редактирование служебных полей у предопределенных элементов.
  3. В поле выбора элементов выберем справочник Виды контактной информации.
  4. Настроим отбор по нашим новым элементам и папкам.
  5. Установим реквизит Используется в значение Да, а также укажем подходящий Тип контактной информации.
  6. Нажмем кнопку Изменить реквизиты.

Способ 3. Внедрение через обработчики обновления БСП (для тиражных конфигураций)

Если мы разрабатываем функционал, который будет тиражироваться на рабочие базы пользователей через обновление конфигурации, ручные обработки не подходят. Процесс должен проходить автоматически при обновлении информационной базы.

Для этого в общем модуле обновления конфигурации регистрируем процедуру через подсистему ОбновлениеИнформационнойБазы:


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

КонецПроцедуры

Такой подход гарантирует, что на всех узлах и клиентских базах новые элементы контактной информации будут корректно включены и сразу станут доступны пользователям.

Особенности архитектуры БСП и распределенных баз (РИБ)

Проанализируем дополнительные важные моменты, о которых следует помнить при добавлении контактной информации:

  1. Именование родительских групп: В библиотеке БСП действует строгое соглашение: имена предопределенных групп должны формироваться по шаблону СправочникИмяОбъекта (например, СправочникКонтрагенты). По этому имени механизмы подсистемы связывают группу видов КИ с объектом-владельцем.
  2. Связь с метаданными: Если вы создаете контактную информацию для собственного нового справочника, обязательно добавьте этот справочник в состав ОпределяемыйТип.ВладелецКонтактнойИнформации и создайте в нем стандартную табличную часть КонтактнаяИнформация.
  3. Свойство «Обновление предопределенных данных»: Обратите внимание на свойства самого справочника в конфигураторе. Если свойство Обновление предопределенных данных установлено в значение Не обновлять, платформа не создаст элементы автоматически. Потребуется выполнить вызов метода Справочники.ВидыКонтактнойИнформации.ОбновитьПредопределенныеДанные().
  4. Работа в узлах РИБ: В распределенной информационной базе изменения данных предопределенных элементов должны производиться исключительно в главном узле. В подчиненные узлы заполненные реквизиты придут со стандартной миграцией данных.
← На главную