Как изменить запрос в форме подбора товаров в 1С:Управление торговлей 11.2

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

При разработке и кастомизации конфигураций на базе ERP 2.0 (включая УТ 11.2) программисты часто сталкиваются с тем, что привычное изменение запроса в динамическом списке формы не дает результата. Поле, добавленное в конфигураторе, упорно отказывается выводиться на экран в режиме "1С:Предприятие". Разберем по шагам, почему это происходит и как правильно модифицировать форму подбора товаров.

Анализируем причину проблемы

В современных типовых решениях форма подбора товаров является универсальным инструментом. Ее запрос не статичен — он собирается программно в зависимости от множества условий: включено ли использование характеристик, упаковок, серий, ведется ли учет по нескольким складам и включены ли функциональные опции по налогообложению. Рассмотрим основные причины, по которым внесенные изменения могут "пропадать":

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

Где искать текст запроса: работа с общим модулем ПодборТоваровСервер

Основная логика формирования данных для подбора сосредоточена не в самой форме, а в серверных общих модулях. Проанализируем процедуру ТекстЗапросаСпискаФормыПодбора в модуле ПодборТоваровСервер. Именно она отвечает за генерацию "скелета" запроса.

Рассмотрим пример того, как обычно выглядит механизм модификации текста. Система ищет специальные маркеры-вставки. Чтобы добавить свое поле, нам нужно убедиться, что оно попадает в итоговую строку запроса. Выясним, как это реализовано в коде:


Функция ТекстЗапросаСпискаФормыПодбора(ПараметрыПодбора) Экспорт
    
    ТекстЗапроса = 
    "ВЫБРАТЬ
    |	СправочникНоменклатура.Ссылка КАК Ссылка,
    |	СправочникНоменклатура.Код КАК Код,
    |	СправочникНоменклатура.Артикул КАК Артикул,
    |	{ДополнительныеПоля}
    |ИЗ
    |	Справочник.Номенклатура КАК СправочникНоменклатура";
    
    // Система заменяет маркер {ДополнительныеПоля} на реальные поля из настроек
    Возврат ТекстЗапроса;
    
КонецФункции

Если вы редактируете запрос напрямую в этой функции, помните, что изменения затронут все документы, использующие этот подбор. Проанализируем ситуацию: если ваше поле не является стандартным "дополнительным реквизитом", вам придется вписать его в текст запроса вручную, соблюдая псевдонимы таблиц.

Программное добавление поля в динамический список

После того как мы изменили текст запроса в общем модуле, необходимо гарантировать, что динамический список "знает" о существовании этого поля и готов его отобразить. Разберем, как принудительно добавить поле в выбранные поля списка в процедуре формы ПриСозданииНаСервере или в соответствующем месте модуля ПодборТоваровСервер.


// Пример добавления поля программно
НовоеПоле = Список.ВыбранныеПоля.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
НовоеПоле.Поле = Новый ПолеКомпоновкиДанных("ВашеНовоеПоле");
НовоеПоле.Использование = Истина;
НовоеПоле.Заголовок = "Название колонки";

Важно помнить, что в УТ 11.2 часто используется КомпоновщикНастроек. Если поле добавлено в текст запроса, но не описано в схеме компоновки (если список строится на СКД), оно не будет доступно пользователю для выбора.

Использование расширений для доработки подбора

Поскольку мы работаем с типовой конфигурацией, крайне не рекомендуется менять общие модули напрямую. Правильным подходом будет использование механизма расширений. Рассмотрим, как перехватить формирование запроса с помощью аннотации &Вместо или &После.


&После("ТекстЗапросаСпискаФормыПодбора")
Функция УТ_ТекстЗапросаСпискаФормыПодбора(ПараметрыПодбора, Результат)
    
    // Модифицируем уже полученный результат (строку запроса)
    Результат = СтрЗаменить(Результат, "СправочникНоменклатура.Артикул КАК Артикул,", 
        "СправочникНоменклатура.Артикул КАК Артикул, СправочникНоменклатура.ВашеПоле КАК ВашеПоле,");
    
    Возврат Результат;
    
КонецФункции

Этот метод позволяет сохранить поддержку конфигурации и корректно обновлять программу в будущем. Мы проанализировали ситуацию и выяснили, что использование СтрЗаменить — самый безопасный способ внедрения своих полей в динамически собираемые запросы 1С.

Сброс пользовательских настроек

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

  1. Запустите программу в режиме 1С:Предприятие.
  2. Откройте форму подбора товаров.
  3. Нажмите кнопку "Еще" в верхней части формы.
  4. Выберите пункт "Установить стандартные настройки".

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

Советы по использованию отладчика

Для того чтобы точно выяснить, в какой момент текст запроса принимает окончательный вид, воспользуемся отладчиком. Поставим точку останова в процедуре ПриСозданииНаСервере формы подбора. Нас интересует свойство Список.ТекстЗапроса. Проанализируем его содержимое в момент завершения процедуры. Если вашего поля там нет, значит, оно затирается где-то в недрах модулей ПодборТоваровСервер или ПодборТоваровЛокализация.

Помните, что в УТ 11.2 для разных стран (Россия, Казахстан, Украина) могут вызываться разные функции формирования запроса. Всегда проверяйте, в какой именно контекст попадает исполнение кода в вашем конкретном случае.

← На главную