Как решить проблему с пересечением фиксированных и пользовательских настроек в динамическом списке 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с динамическими списками в платформе 1С:Предприятие часто возникает необходимость установить жесткий отбор (например, ограничить выборку по диапазону сумм или видов документов), который пользователь не должен иметь возможности сбросить. Для этого разработчики задействуют коллекцию ФиксированныеНастройки.

Однако, когда пользователь открывает диалог Настроить список и добавляет собственный отбор по тому же самому полю, платформа вызывает критическую ошибку: «Пересечение настроек». Разберем причину этого поведения и проанализируем проверенные способы решения задачи.

Выясним причину ошибки

Динамический список построен на механизме системы компоновки данных (СКД). Ошибка возникает в момент, когда в коллекции ФиксированныеНастройки.Отбор и в коллекции ПользовательскиеНастройки.Отбор одновременно оказывается одно и то же ПолеКомпоновкиДанных. Платформа 1С не связывает такие отборы по условию «И», а расценивает это как неразрешимый конфликт приоритетов и блокирует работу списка.

При этом штатный поиск через команду Найти не вызывает исключения, так как использует временные фильтры формы, не добавляемые в ПользовательскиеНастройки.

Способ 1. Использование параметров запроса вместо отборов СКД

Наиболее надежный и рекомендуемый подход — вынести нередактируемое условие из системы компоновки данных непосредственно в запрос динамического списка в виде параметра.

Рассмотрим по шагам, как реализовать данный метод:

  1. Включаем флаг Произвольный запрос в настройках динамического списка.
  2. Добавляем в текст запроса условие с параметром в секцию ГДЕ:

ВЫБРАТЬ
	Таблица.Ссылка КАК Ссылка,
	Таблица.Сумма КАК Сумма
ИЗ
	Справочник.ДоговорыКонтрагентов КАК Таблица
ГДЕ
	Таблица.Сумма >= &МинимальнаяСумма

Устанавливаем значение параметра при открытии формы или инициализации списка:

Список.Параметры.УстановитьЗначениеПараметра("МинимальнаяСумма", 1000);

Преимущество метода: параметры запроса не входят в коллекцию отборов СКД и не выводятся пользователю в окне Настроить список. Пользователь сможет свободно добавлять отбор по полю Сумма (например, указать значение «меньше 10 000»), не вызывая пересечения настроек.

Способ 2. Создание псевдонима (дублирование поля в запросе)

Если условие должно быть гибким и накладываться динамически, можно продублировать поле в тексте запроса динамического списка с помощью псевдонима.

Разберем пример кода запроса:


ВЫБРАТЬ
	Таблица.Ссылка КАК Ссылка,
	Таблица.Сумма КАК Сумма,
	Таблица.Сумма КАК СуммаФиксированная
ИЗ
	Справочник.ДоговорыКонтрагентов КАК Таблица

Далее программно накладываем фиксированный отбор на служебное поле СуммаФиксированная:


Настройки = Новый НастройкиКомпоновкиДанных;
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("СуммаФиксированная");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
ЭлементОтбора.ПравоеЗначение = 1000;
ЭлементОтбора.Использование = Истина;

Список.ФиксированныеНастройки = Настройки;

Пользователь в режиме Предприятие будет видеть и настраивать обычное поле Сумма. Для платформы Сумма и СуммаФиксированная — это два разных поля компоновки данных, поэтому ошибка пересечения возникать не будет.

Способ 3. Передача настроек с недоступным режимом отображения

Посмотрим на вариант, когда отбор передается при открытии формы через параметры, но с ограничением видимости для пользователя.

Формируем структуру открываемой формы на клиенте:


&НаКлиенте
Процедура ДоговорНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	ПараметрыОткрываемойФормы = Новый Структура;
	ПараметрыОткрываемойФормы.Вставить("ФиксированныеНастройки", ПолучитьФиксированныеНастройки());
	ОткрытьФорму("Справочник.ДоговорыКонтрагентов.ФормаВыбора", ПараметрыОткрываемойФормы, Элемент);
КонецПроцедуры

&НаКлиенте
Функция ПолучитьФиксированныеНастройки()
	Настройки = Новый НастройкиКомпоновкиДанных;
	ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ВидДоговора");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
	
	ВидыДоговора = Новый СписокЗначений;
	ВидыДоговора.Добавить(ПредопределенноеЗначение("Перечисление.ВидыДоговоровКонтрагентов.СПокупателем"));
	ВидыДоговора.Добавить(ПредопределенноеЗначение("Перечисление.ВидыДоговоровКонтрагентов.Прочее"));
	
	ЭлементОтбора.ПравоеЗначение = ВидыДоговора;
	ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный;
	Возврат Настройки;
КонецФункции

Установка свойства РежимОтображения.Недоступный скрывает отбор из диалога пользовательских настроек, однако при попытке пользователя наложить отбор на то же самое поле через меню «Настроить список» конфликт по-прежнему возможен, если используются ФиксированныеНастройки. Поэтому этот метод рекомендуется комбинировать со Способом 1 или Способом 2.

Важный нюанс при модификации текста запроса (платформа 8.3.9 и выше)

При использовании программного изменения текста запроса через СхемаЗапроса следует помнить об особенности поведения платформы, начиная с версии 8.3.9. Если в произвольном запросе динамического списка поля не имеют явных псевдонимов, платформа связывает элементы управления с англоязычными именами полей (например, Description вместо Наименование).

При переформировании запроса через схему без сохранения явных псевдонимов связи элементов формы с полями списка могут слететь. Чтобы избежать этой проблемы, обязательно задавайте явные псевдонимы для всех полей в тексте запроса динамического списка.

← На главную