Как программно заменить текст запроса в динамическом списке формы?

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

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

Способ 1. Использование программной замены текста запроса

Основным инструментом для изменения логики динамического списка является свойство ТекстЗапроса. Мы можем обращаться к нему как на чтение, так и на запись. Наиболее подходящим местом для такой модификации является серверный обработчик ПриСозданииНаСервере. Проанализируем, как реализовать замену части текста с помощью стандартной функции СтрЗаменить.

Рассмотрим пример, где нам нужно динамически добавить поле в запрос или изменить имя таблицы:


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

Важный совет: Чтобы замена работала надежно, рекомендуется использовать в тексте запроса специальные комментарии-маркеры. Например, вместо поиска сложной конструкции ГДЕ Таблица.Ссылка = &Параметр, вставьте в запрос в конфигураторе текст //МАРКЕР_УСЛОВИЯ. Тогда в коде будет гораздо проще найти и заменить этот маркер на нужный кусок кода. Это защитит ваш алгоритм от поломок при изменении форматирования запроса конструктором.

Способ 2. Использование конструкции ОБЪЕДИНИТЬ ВСЕ

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


ВЫБРАТЬ
    Рег1.СуммаОстаток КАК Сумма
ИЗ
    РегистрНакопления.Регистр1.Остатки(&Период, ) КАК Рег1
ГДЕ
    &ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОпераций.Вариант1)

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Рег2.СуммаОстаток
ИЗ
    РегистрНакопления.Регистр2.Остатки(&Период, ) КАК Рег2
ГДЕ
    &ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыОпераций.Вариант2)

При таком подходе в ПриСозданииНаСервере достаточно просто установить значение параметра ВидОперации. Однако помните, что использование ОБЪЕДИНИТЬ ВСЕ внутри динамического списка может снизить производительность, так как СУБД будет сложнее оптимизировать выполнение вложенных подзапросов.

Работа с основной таблицей и составом колонок

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

  1. Ключевые поля: Новый текст запроса обязательно должен содержать ключевые поля (например, Ссылка), относящиеся к основной таблице.
  2. Смена таблицы: Если вы меняете источник данных на таблицу другого типа, свойство ОсновнаяТаблица необходимо также изменить программно или очистить: Список.ОсновнаяТаблица = "";. Если этого не сделать, стандартные команды (создать, изменить, пометить на удаление) перестанут работать.
  3. Соответствие псевдонимов: Все поля, которые выведены на форму в элемент «Таблица», должны присутствовать в новом запросе с теми же именами (псевдонимами). Если из запроса исчезнет поле Сумма, которое отображается в колонке формы, платформа выдаст ошибку.

Влияние на пользовательские настройки

Проанализируем ситуацию с настройками пользователя. Динамический список хранит пользовательские отборы, группировки и сортировки. При значительной смене текста запроса (особенно если меняется состав доступных полей) эти настройки могут стать невалидными. В некоторых случаях после изменения ТекстЗапроса требуется программно очистить или скорректировать КомпоновщикНастроек, чтобы старые фильтры не конфликтовали с новыми данными.

Также имейте в виду: если вы меняете запрос «на лету» (не при открытии, а по нажатию кнопки), список будет полностью обновлен, и текущая позиция курсора (активная строка) будет потеряна. Если необходимо сохранить фокус на определенной записи, её нужно запомнить до изменения текста и восстановить после обновления через установку свойства ТекущаяСтрока.

← На главную