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