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