В процессе работы с внешними отчетами и динамическими списками на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с необходимостью программно управлять отборами и другими настройками. Обычная ситуация – желание предоставить пользователям "волшебные кнопки", которые автоматически применяют определенные группы отборов без необходимости вручную настраивать список. Однако, как показывает практика, простое изменение настроек в коде не всегда приводит к немедленному обновлению динамического списка на уже открытой форме, пока не будут установлены "стандартные настройки". Давайте подробно разберем, почему это происходит и как правильно реализовать программное управление настройками.
Настройки против ПользовательскиеНастройкиПрежде всего, давайте выясним принципиальную разницу между свойствами Настройки и ПользовательскиеНастройки объекта КомпоновщикНастроек. Это фундаментальное понимание помогает избежать многих ошибок:
Настройки (Список.КомпоновщикНастроек.Настройки):
ПользовательскиеНастройки (Список.КомпоновщикНастроек.ПользовательскиеНастройки):
Ошибка в использовании Настройки вместо ПользовательскиеНастройки – распространенное заблуждение, которое не дает видимого результата, пока не будет произведен сброс к стандартным настройкам, по сути обнуляющий пользовательские изменения и возвращающий к базовым настройкам.
Многие программисты пытаются решить проблему, удаляя сохраненные настройки из ХранилищеСистемныхНастроек или ХранилищеПользовательскихНастроекОтчетов с помощью метода Удалить(). Давайте проанализируем эту ситуацию:
Удалить():
Удалить() действительно удаляет записи о сохраненных настройках из базы данных 1С.Поэтому, чтобы добиться желаемого эффекта "сброса" или "применения" на уже открытой форме, нам нужны дополнительные действия.
Для того чтобы программно "имитировать" нажатие кнопки "Установить стандартные настройки" и применить новые отборы на уже открытой форме, необходимо выполнить несколько ключевых шагов. Рассмотрим их подробно:
Первый критически важный шаг – это очистка текущих пользовательских настроек, особенно отбора, чтобы обеспечить "чистый лист" для применения новых параметров. Это имитирует часть действия "Установить стандартные настройки", которая отменяет пользовательские изменения.
Для этого мы обращаемся к коллекции элементов пользовательских настроек компоновщика и находим элемент, отвечающий за отбор. Затем очищаем его элементы:
// Получаем коллекцию элементов пользовательских настроек динамического списка
ПеременнаяПользовательскиеНастройки = Список.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы;
// Находим в них элемент, соответствующий пользовательскому отбору
// ИдентификаторПользовательскойНастройки отбора берется из стандартных настроек
ПользовательскийОтбор = ПеременнаяПользовательскиеНастройки.Найти(Список.КомпоновщикНастроек.Настройки.Отбор.ИдентификаторПользовательскойНастройки);
// Если элемент отбора найден, очищаем его, чтобы сбросить все пользовательские отборы
Если ПользовательскийОтбор <> Неопределено Тогда
ПользовательскийОтбор.Элементы.Очистить();
КонецЕсли;
В этом коде Список – это наименование элемента формы типа "Динамический список", а Список.КомпоновщикНастроек – это компоновщик настроек этого списка. Важно использовать ИдентификаторПользовательскойНастройки из базовых Настройки, чтобы точно найти соответствующий элемент в ПользовательскиеНастройки.
После очистки пользовательских настроек у нас есть несколько вариантов действий, в зависимости от нашей цели:
Для этого мы загружаем в компоновщик настроек его же базовые (стандартные) настройки. Это эффективно перезаписывает все текущие настройки на форме на те, что были заданы разработчиком.
Список.КомпоновщикНастроек.ЗагрузитьНастройки(Список.КомпоновщикНастроек.Настройки);
Если ваша задача – не просто сбросить настройки, а установить определенный набор отборов (как в случае с "группой отборов на кнопке"), то после очистки пользовательских отборов (Шаг 1) вы можете добавить новые элементы отбора непосредственно в компоновщик настроек. Эти новые отборы будут применены к текущему состоянию списка.
Рассмотрим пример добавления отбора по реквизиту "Валюта":
// Очищаем текущие отборы компоновщика настроек, чтобы избежать дублирования или конфликтов
// Это делается, если мы хотим полностью заменить отборы на новые, а не дополнять существующие
Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Очистить();
// Создаем новый элемент отбора
НовыйЭлементОтбора = Список.КомпоновщикНастроек.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновщикаНастроек"));
// Устанавливаем левое значение (поле, по которому отбираем)
НовыйЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновщикаНастроек("Валюта");
// Устанавливаем вид сравнения (например, "Равно")
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновщикаНастроек.Равно;
// Устанавливаем правое значение (конкретное значение для отбора)
// Предполагается, что переменная ВалютаОбъект содержит ссылку на нужную валюту
НовыйЭлементОтбора.ПравоеЗначение = ВалютаОбъект;
// Включаем использование данного элемента отбора
НовыйЭлементОтбора.Использование = Истина;
// Пример: если требуется установить отбор по группе значений (например, по списку валют):
// НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновщикаНастроек.ВГруппе;
// НовыйСписокЗначений = Новый СписокЗначений;
// НовыйСписокЗначений.Добавить(Валюта1);
// НовыйСписокЗначений.Добавить(Валюта2);
// НовыйЭлементОтбора.ПравоеЗначение = НовыйСписокЗначений;
Важно помнить, что если вы хотите, чтобы программно добавленные отборы могли быть изменены пользователем и сохранялись как его личные настройки, их следует добавлять не в Список.КомпоновщикНастроек.Настройки.Отбор.Элементы, а в элементы пользовательского отбора, полученного на Шаге 1. Это позволит им стать частью персонализированных настроек пользователя.
// Пример добавления отбора в пользовательские настройки
Если ПользовательскийОтбор <> Неопределено Тогда
НовыйЭлементПользовательскогоОтбора = ПользовательскийОтбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновщикаНастроек"));
НовыйЭлементПользовательскогоОтбора.ЛевоеЗначение = Новый ПолеКомпоновщикаНастроек("ТипНоменклатуры");
НовыйЭлементПользовательскогоОтбора.ВидСравнения = ВидСравненияКомпоновщикаНастроек.Равно;
НовыйЭлементПользовательскогоОтбора.ПравоеЗначение = Справочники.ТипыНоменклатуры.Услуга; // Пример значения
НовыйЭлементПользовательскогоОтбора.Использование = Истина;
КонецЕсли;
После всех манипуляций с настройками компоновщика необходимо дать команду динамическому списку обновить отображаемые данные. Это заставит его перечитать данные из источника с учетом примененных новых или сброшенных настроек.
Для этого используем метод Обновить() у элемента формы, представляющего динамический список:
Элементы.Список.Обновить();
Этот простой, но крайне важный шаг гарантирует, что пользователь увидит актуальные данные в соответствии с примененными вами программными настройками.
Стоит отдельно отметить, что работа с динамическим списком, встроенным во внешний отчет, имеет свои нюансы. Внешние отчеты часто используют собственную Систему Компоновки Данных (СКД) для формирования основного результата. Однако, динамический список, как правило, имеет свой собственный КомпоновщикНастроек, который управляет его отображением. Если динамический список напрямую не связан с результатом СКД отчета, то изменения нужно вносить именно в КомпоновщикНастроек самого динамического списка (как показано в примерах выше), а не в настройки СКД отчета. Это важно учитывать для корректного применения отборов.
Программное управление динамическим списком и его отборами требует понимания взаимодействия между базовыми и пользовательскими настройками, а также осознания того, что изменения в хранилище настроек не влияют на уже открытые формы. Следуя трем основным шагам – очистка пользовательских настроек, применение нужных параметров (стандартных или программно заданных) и обязательное обновление элемента формы динамического списка – вы сможете эффективно реализовать "волшебные кнопки" и другие сценарии управления списками, обеспечивая удобство и оперативность для пользователей.