Как изменить запрос динамического списка и форму списка в расширении 1С

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

Работа с расширениями в 1С — это стандартный способ кастомизации типовых конфигураций (таких как 1С:Розница, 1С:Управление торговлей или 1С:ERP) без снятия их с поддержки. Однако начинающие разработчики часто сталкиваются с ситуацией, когда добавленная в расширение форма списка кажется «заблокированной»: конструктор запроса недоступен, а изменения не отображаются. В этой статье мы подробно разберем, как правильно перехватить форму списка, модифицировать ее запрос и вывести новые данные пользователю.

Проблема: Почему запрос динамического списка находится в режиме просмотра?

Когда мы добавляем форму документа (например, ЗаказПокупателя) в расширение, платформа переносит саму структуру формы, но не всегда автоматически подключает все внутренние объекты для редактирования — в качестве практического примера кастомизации списков можно использовать расширение для вывода дополнительных колонок и расчетных показателей в списки документов. Если вы зашли в свойства реквизита Список (тип ДинамическийСписок) и увидели, что поле Настройка списка или Запрос недоступно для редактирования, это означает, что сам объект метаданных динамического списка еще не «освоен» расширением в полной мере.

Для решения этой проблемы разберем первый и самый важный шаг — визуальное включение возможности редактирования.

Способ 1: Разблокировка конструктора запроса в расширении

Чтобы получить возможность менять запрос динамического списка непосредственно в конфигураторе расширения, выполним следующие действия:

  1. Откроем основную конфигурацию и найдем нужную форму списка.
  2. Нажмем правой кнопкой мыши на форму и выберем Добавить в расширение.
  3. В окне расширения перейдем на вкладку Реквизиты.
  4. Найдем основной реквизит формы — обычно он называется Список.
  5. Важный момент: нажмем на него правой кнопкой мыши и выберем Добавить в расширение (даже если форма уже там). Это действие переносит описание свойств динамического списка в контекст расширения.

После этого в свойствах реквизита Список в расширении станет доступна гиперссылка Открыть рядом с надписью Настройка списка. Теперь мы можем использовать стандартный конструктор запросов, добавлять новые таблицы, поля и условия ГДЕ — для быстрой отладки полученного кода запроса пригодится профессиональная консоль запросов и СКД для 1С.

Обратите внимание: при редактировании запроса в расширении следите за тем, чтобы Основная таблица списка оставалась заполненной (например, Документ.ЗаказПокупателя). Если она очистится, стандартные механизмы 1С (поиск, отборы, создание на основании) могут перестать работать корректно — для безопасного добавления фильтров и закладок подойдёт универсальное расширение для настройки панели фильтров-закладок в списках 1С.

Способ 2: Программное изменение текста запроса

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

Для модификации используем аннотации &Вместо или &После для процедуры ПриСозданииНаСервере. Рассмотрим пример с использованием &Вместо, который позволяет полностью контролировать логику инициализации:


&НаСервере
&Вместо("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Вызываем стандартную обработку, чтобы выполнились типовые механизмы
    ПродолжитьВызов(Отказ, СтандартнаяОбработка);
    
    // Теперь модифицируем текст запроса
    // Допустим, нам нужно добавить поле из связанного справочника
    ТекстЗапроса = Список.ТекстЗапроса;
    НовыйТекст = СтрЗаменить(ТекстЗапроса, 
        "ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя", 
        "ИЗ Документ.ЗаказПокупателя КАК ЗаказПокупателя 
        | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты 
        | ПО ЗаказПокупателя.Контрагент = Контрагенты.Ссылка");
    
    Список.ТекстЗапроса = НовыйТекст;
    
КонецПроцедуры

Однако более безопасным методом считается использование &После, так как это минимизирует конфликты при обновлении конфигурации. Если типовой код содержит важные проверки, выполнение которых нельзя прерывать, &После — ваш выбор.

Отображение новых полей на форме

Выясним одну важную деталь: добавление поля в текст запроса (хоть через конструктор, хоть кодом) не приводит к автоматическому появлению колонки в таблице на экране пользователя. Нам нужно добавить элемент управления вручную или программно.

Ручной способ:

  1. В дереве элементов формы в расширении найдем таблицу Список.
  2. Добавим новый элемент типа Поле формы.
  3. В свойстве ПутьКДанным укажем наше новое поле, например: Список.МоеНовоеПоле.

Программный способ:

Если мы хотим добавить колонку динамически, в той же процедуре ПриСозданииНаСервере можно прописать следующий код:


НоваяКолонка = Элементы.Добавить("Список_МоеПоле", Тип("ПолеФормы"), Элементы.Список);
НоваяКолонка.Вид = ВидПоляФормы.ПолеНадписи;
НоваяКолонка.ПутьКДанным = "Список.МоеПоле";
НоваяКолонка.Заголовок = "Дополнительная информация";

Важные технические нюансы

Проанализируем ситуацию, когда поле добавлено в запрос, привязано к форме, но данные в колонке пусты. Это может происходить по нескольким причинам:

  1. Свойство «Использовать всегда»: Платформа 1С оптимизирует запросы. Если она считает, что поле не нужно для отображения или оно скрыто настройками пользователя, она может исключить его из выборки. Чтобы этого избежать, зайдите в настройки реквизита Список, откройте состав полей и установите флаг Использовать всегда для вашего поля.
  2. Конфликты с БСП: В современных конфигурациях текст запроса может переформироваться в модуле менеджера или через процедуры ПриУстановкеПараметровДинамическогоСписка. Если ваше изменение в ПриСозданииНаСервере затирается, попробуйте найти, где вызывается процедура ОбщегоНазначения.УстановитьСвойство... или аналогичные механизмы управления списками.
  3. Права доступа: Проверьте, есть ли у пользователя права на чтение тех таблиц и полей, которые вы добавили в запрос через расширение — для реализации аналогичных доработок без изменения кода подойдёт инструмент гибкой настройки условий и отборов в 1С. Если прав нет, поле будет пустым или вызовет ошибку.

Подводя итог, скажем: для успешного перехвата формы списка в расширении необходимо не просто добавить форму, но и явно включить в расширение реквизит динамического списка. Это откроет доступ к визуальному проектированию и позволит гибко управлять данными через программный код.

← На главную