Довольно часто в практике разработчика или консультанта 1С возникает ситуация: пользователь открывает форму выбора справочника или документа, а список оказывается пустым или в нем отсутствуют нужные записи. При этом стандартная проверка через кнопку Настроить список показывает, что никаких пользовательских отборов не установлено. В облачных сервисах (например, 1С:ГРМ) или на рабочих серверах, где отладка запрещена, поиск причины такого поведения становится настоящим квестом. Разберем подробно, как выявить скрытые фильтры в управляемых формах 1С 8.3, используя программные методы и логику работы платформы.
Для начала проанализируем ситуацию: в системе 1С 8.3 "Управляемое приложение" настройки динамического списка (который обычно отображает данные в формах выбора) хранятся не в одном месте, а разделены на несколько уровней. Платформа объединяет их при выводе данных. Рассмотрим основные составляющие КомпоновщикаНастроек:
Выясним причину, почему в типовых решениях (ERP, КА, УТ) часто не видно отборов. Например, для реквизита Сделка может быть задана связь по партнеру. При открытии формы выбора платформа автоматически накладывает фиксированный отбор, который не отображается в интерфейсе настроек, но жестко ограничивает результат.
Если нам нужно "на лету" понять, что происходит в открытой форме выбора, мы можем воспользоваться программным кодом. Рассмотрим пример внешней обработки, которая перебирает все открытые окна приложения, находит нужную форму и считывает элементы отбора динамического списка. Этот метод особенно полезен, когда форма открыта и мы хотим увидеть ее состояние в текущий момент.
Проанализируем следующий алгоритм:
// Определим переменные для поиска
Окна = ПолучитьОкна();
НужноеОкно = Неопределено;
ИмяНужнойФормы = "Сделки с клиентами"; // Заголовок окна, который видит пользователь
// Переберем открытые окна
Для Каждого ОткрытоеОкно Из Окна Цикл
Если ОткрытоеОкно.Заголовок = ИмяНужнойФормы Тогда
НужноеОкно = ОткрытоеОкно;
Прервать;
КонецЕсли;
КонецЦикла;
Если НужноеОкно = Неопределено Тогда
Сообщить("Окно с заголовком '" + ИмяНужнойФормы + "' не найдено!");
Возврат;
КонецЕсли;
// Попытаемся получить доступ к динамическому списку формы
// Обычно основной список формы находится в Содержимое[0]
Попытка
// Важно: Имя 'Список' может отличаться, если разработчик его изменил
НайденныеОтборы = НужноеОкно.Содержимое[0].Список.Отбор.Элементы;
Результат = "Установлены активные отборы:" + Символы.ПС;
ЕстьОтборы = Ложь;
Для Каждого Отбор Из НайденныеОтборы Цикл
Если Отбор.Использование Тогда
Результат = Результат + String(Отбор.ЛевоеЗначение) + " " +
String(Отбор.ВидСравнения) + " " +
String(Отбор.ПравоеЗначение) + Символы.ПС;
ЕстьОтборы = Истина;
КонецЕсли;
КонецЦикла;
Если Не ЕстьОтборы Тогда
Результат = "Активных отборов в коллекции 'Отбор' не обнаружено.";
КонецЕсли;
Предупреждение(Результат);
Исключение
Сообщить("Не удалось получить доступ к структуре списка: " + ОписаниеОшибки());
КонецПопытки;
Обратите внимание, что в данном коде мы обращаемся к свойству Список.Отбор. Однако, как мы выяснили ранее, отбор может быть скрыт в ФиксированныхНастройках. Для более глубокого анализа следует проверять также Список.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.
Если стандартный перебор элементов отбора не дает результата, воспользуемся мощным средством платформы — сериализацией настроек в XML. Это позволит нам увидеть структуру компоновщика "как она есть", включая все скрытые параметры и вложенные группы условий. Рассмотрим, как это реализовать.
Для этого в нашей отладочной обработке выполним выгрузку настроек динамического списка формы выбора:
// Предположим, мы получили объект формы через ПолучитьОкна() или другим способом
НастройкиКомпоновщика = НужноеОкно.Содержимое[0].Список.КомпоновщикНастроек.ПолучитьНастройки();
// Используем СериализаторXDTO для перевода настроек в читаемую строку
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, НастройкиКомпоновщика);
ПолныйТекстНастроек = ЗаписьXML.Закрыть();
// Теперь мы можем проанализировать переменную ПолныйТекстНастроек
// В ней будут видны все узлы <filter>, даже те, что не видны в интерфейсе
Сообщить(ПолныйТекстНастроек);
Этот метод является наиболее надежным, так как СериализаторXDTO выгружает объект целиком. В полученном тексте ищите теги left (поле, по которому идет отбор) и right (значение фильтра).
Если программный код использовать затруднительно, проанализируем ситуацию логически, опираясь на метаданные. Одной из самых частых причин "невидимого" отбора является механизм Связи параметров выбора.
Разберем по шагам, как это работает на примере справочника "Сделки":
Партнер и реквизит Сделка.Сделка разработчик указывает связь: Отбор.Партнер(Партнер).Сделка, платформа автоматически откроет форму выбора сделок и применит фиксированный отбор по тому партнеру, который уже выбран в заказе.Чтобы проверить эту гипотезу без конфигуратора, попробуйте изменить значение в "родительском" поле (например, очистить поле Партнер) и снова открыть выбор. Если состав списка изменился — причина найдена.
Иногда отсутствие данных обусловлено не отборами формы, а более глобальными механизмами системы. Рассмотрим две важные причины:
КомпоновщикеНастроек вы не найдете. Проверить это можно, попробовав открыть форму под пользователем с полными правами.Важно помнить, что поведение динамических списков может отличаться в зависимости от типа клиента. В веб-клиенте настройки формы могут кэшироваться браузером. Если вы уверены, что отборов быть не должно, а список пуст, попробуйте следующее:
Подводя итог, можно сказать: эффективная отладка формы выбора без конфигуратора требует комбинированного подхода. Сначала мы исключаем влияние Связей параметров выбора (путем изменения связанных полей), затем проверяем права доступа, и в финале используем программный скрипт для анализа коллекции Окна и ФиксированныхНастроек компоновщика. Этот системный подход позволит вам быстро ответить пользователю на вопрос, почему он не видит нужную запись в списке.