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