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