При работе в конфигурациях на обычных формах (например, «Зарплата и кадры бюджетного учреждения, редакция 1.0» или «Зарплата и управление персоналом, редакция 2.5») пользователи нередко сталкиваются с ситуацией: при открытии регистра сведений Контактная информация напрямую из меню список оказывается пустым. В панели отбора флажок напротив поля Объект установлен, но само поле заблокировано, а заголовок окна указывает: «Контактная информация. Объект: не определен».
В этой статье разберем программные и архитектурные причины такого поведения платформы 1С, изучим исходный код формы и рассмотрим варианты решения этой задачи.
Проанализируем программный код обработчика ПриОткрытии() формы списка регистра сведений. Разработчики конфигурации заложили принудительную установку использования отбора по полю Объект при каждом открытии формы:
Процедура ПриОткрытии()
РегистрСведенийСписок.Отбор.Объект.Использование = Истина;
ПредставлениеОбъекта = "";
Если ТипЗнч(РегистрСведенийСписок.Отбор.Объект.Значение) = Тип("СписокЗначений") Тогда
Если РегистрСведенийСписок.Отбор.Объект.ВидСравнения = ВидСравнения.ВСписке ИЛИ РегистрСведенийСписок.Отбор.Объект.ВидСравнения = ВидСравнения.ВСпискеПоИерархии Тогда
ПредставлениеОбъекта = "в списке ";
ИначеЕсли РегистрСведенийСписок.Отбор.Объект.ВидСравнения = ВидСравнения.НеВСписке ИЛИ РегистрСведенийСписок.Отбор.Объект.ВидСравнения = ВидСравнения.НеВСпискеПоИерархии Тогда
ПредставлениеОбъекта = "не в списке ";
КонецЕсли;
ПредставлениеСписка = "";
Для каждого ЭлементСписка Из РегистрСведенийСписок.Отбор.Объект.Значение Цикл
Если Не ПустаяСтрока(ПредставлениеСписка) Тогда
ПредставлениеСписка = ПредставлениеСписка + ", ";
КонецЕсли;
ПредставлениеСписка = ПредставлениеСписка + ?(НЕ ЗначениеЗаполнено(ЭлементСписка.Значение), "<...>", Строка(ЭлементСписка.Значение));
КонецЦикла;
ПредставлениеОбъекта = ПредставлениеОбъекта + ПредставлениеСписка;
ИначеЕсли Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(РегистрСведенийСписок.Отбор.Объект.Значение)) Тогда
Если НЕ ЗначениеЗаполнено(РегистрСведенийСписок.Отбор.Объект.Значение) Тогда
ПредставлениеОбъекта = "не определен";
Иначе
Если РегистрСведенийСписок.Отбор.Объект.ВидСравнения = ВидСравнения.Равно Тогда
ПредставлениеОбъекта = "";
ИначеЕсли РегистрСведенийСписок.Отбор.Объект.ВидСравнения = ВидСравнения.НеРавно Тогда
ПредставлениеОбъекта = "не равно ";
КонецЕсли;
ПредставлениеОбъекта = ПредставлениеОбъекта + Строка(РегистрСведенийСписок.Отбор.Объект.Значение);
КонецЕсли;
КонецЕсли;
ЭтаФорма.Заголовок = "Контактная информация. Объект: " + ПредставлениеОбъекта;
КонецПроцедуры
Как видим из кода, при вызове формы выполняется команда РегистрСведенийСписок.Отбор.Объект.Использование = Истина. Если форма открывается напрямую из главного меню программы, параметры владельца не передаются, и значение отбора остается не заложенным. В результате проверка НЕ ЗначениеЗаполнено(...) формирует представление «не определен», а платформа применяет отбор по пустому объекту, из-за чего список записей остаётся пустым.
Выясним, почему реализован именно такой механизм. Форма списка регистра сведений Контактная информация в типовых решениях не предназначена для прямого открытия и общего просмотра всего массива данных. Она спроектирована как подчиненная форма для работы в контексте конкретного владельца (сотрудника, контрагента или организации).
Основные причины такого ограничения:
Объект установлено значение Доступность = Ложь, что блокирует ручное снятие флажка пользователем в интерфейсе.Рассмотрим доступные способы, позволяющие просмотреть данные регистра или адаптировать систему под свои задачи.
Сотрудники или Организации). В этом случае отбор применится корректно по выбранной ссылке.Контактная информация запросом или выводящую их в новую форму без установки встроенных отборов.ПриОткрытии() и изменить свойства доступности элемента отбора.