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