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