В практике разработки на платформе 1С часто встречается ситуация: пользователь открывает справочник напрямую — все элементы на месте, но стоит попытаться выбрать этот же элемент в документе или другом справочнике, как список оказывается пустым. Ситуация осложняется тем, что видимых отборов в режиме "Предприятие" нет, а точки останова в коде формы почему-то не срабатывают. Разберем пошагово, почему это происходит и как найти "невидимый" фильтр.
Первое, что нам необходимо проанализировать, — это какой именно объект открывается при нажатии на кнопку выбора. В 1С справочник может иметь несколько типов форм: форма списка, форма выбора, форма выбора группы. Рассмотрим ситуацию: программист ставит точки останова в ФормеСписка, а система при выборе из документа автоматически открывает ФормуВыбора. Если эта форма не создана явно, платформа генерирует ее автоматически ("автоформа").
В этом случае код в модуле ФормыСписка просто не будет исполняться. Выясним, какая форма назначена основной формой выбора в конфигураторе. Проверим также, не переопределена ли форма программно в событии НачалоВыбора у реквизита документа. Для интерактивного анализа и изменения параметров открытых форм можно использовать обработку для редактирования свойств форм в режиме предприятия.
Если вы уверены, что открывается нужная форма, но точка останова в процедуре ПриСозданииНаСервере игнорируется, проанализируем настройки отладки. Рассмотрим основные причины:
-debug. Без этого серверные процедуры (&НаСервере) не будут останавливаться.&НаКлиенте, например, в ПриОткрытии. Если на клиенте остановка происходит, а на сервере нет — проблема однозначно в настройках сервера.Если программный код не содержит явных условий, проанализируем свойства самого реквизита в метаданных. Платформа 1С позволяет задавать жесткие фильтры без написания кода. Посмотрим на следующие параметры:
Параметры выбора (ChoiceParameters): Здесь может быть установлен статический отбор. Например, Отбор.Статус(Перечисления.Статусы.Активен). В режиме "Предприятие" пользователь этот фильтр не увидит и не сможет его снять.
Связи параметров выбора (ChoiceParameterLinks): Это динамический фильтр, который зависит от других реквизитов формы. Рассмотрим пример: выбор склада в документе ограничен организацией, указанной в шапке. Если организация не выбрана, список складов может оказаться пустым, так как система ищет склады с "пустой" организацией.
Перейдем к самой форме выбора и изучим настройки ДинамическогоСписка. Разберем, как данные попадают на экран:
ГДЕ, ограничивающая выборку (например, ГДЕ ПометкаУдаления = ЛОЖЬ или ГДЕ ТипНоменклатуры = &Тип).Иногда причина кроется глубже — в модуле менеджера объекта. Существует системное событие ОбработкаПолученияДанныхВыбора. Этот обработчик срабатывает еще до открытия формы выбора и позволяет полностью подменить результат поиска или наложить свои фильтры. Рассмотрим пример кода, который может скрывать элементы:
Процедура ОбработкаПолученияДанныхВыбора(ДанныеВыбора, Параметры, СтандартнаяОбработка)
// Если мы хотим ограничить выбор только определенными элементами
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура ГДЕ НЕ ЭтоГруппа И НЕ ПометкаУдаления";
ДанныеВыбора = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
КонецПроцедуры
Если в этом модуле допущена ошибка или логика не учитывает определенные условия, вы получите пустой список. Проанализируем этот метод, поставив точку останова именно в модуле менеджера.
Если все вышеперечисленное не помогло, выясним, не действуют ли системные ограничения прав доступа или настроек интерфейса:
Рассмотрим универсальный алгоритм, если точки останова не помогают:
/ClearCache или удалите базу из списка и добавьте ее снова.Таким образом, отсутствие элементов в списке выбора — это комплексная проблема, требующая проверки как свойств метаданных, так и программных обработчиков на разных уровнях выполнения кода. Последовательный анализ от простого (свойства реквизита) к сложному (модуль менеджера и RLS) всегда позволяет найти причину поведения системы.