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