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