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