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