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