В процессе работы с конфигурациями на платформе 1С:Предприятие 8.3, такими как Управление торговлей 11.5, ERP 2 или Комплексная автоматизация 2, пользователи часто сталкиваются с необходимостью видеть специфические данные о товаре непосредственно в момент оформления документа. Одной из самых популярных задач является вывод дополнительных реквизитов номенклатуры (например, "Код производителя", "Артикул поставщика" или "Код компании") в табличную часть Товары таких документов, как "Заказ клиента" или "Реализация товаров и услуг".
В этой статье мы подробно разберем, почему стандартными средствами "Изменить форму" эту задачу решить невозможно, и проанализируем технические способы реализации данного функционала с помощью механизмов расширений.
Для начала давайте разберем причину возникновения проблемы. В системе 1С дополнительные реквизиты являются так называемыми «виртуальными» полями. В физической структуре базы данных они не хранятся в основной таблице справочника Номенклатура. Вместо этого они располагаются в отдельной табличной части ДополнительныеРеквизиты этого справочника или в специальном плане видов характеристик.
Когда вы открываете форму списка номенклатуры, система позволяет добавить эти поля, так как динамический список умеет «подтягивать» связанные данные через механизмы платформы. Однако табличная часть документа (например, Объект.Товары) жестко связана с метаданными документа. Поскольку дополнительный реквизит не является частью объекта Документ, платформа не предлагает его для добавления через пользовательские настройки интерфейса.
Рассмотрим самый надежный способ — программное добавление колонки в таблицу формы через расширение конфигурации. Этот метод не требует изменения основной конфигурации, что позволяет сохранять систему на поддержке. Для упрощения этого процесса можно воспользоваться инструментом для настройки и добавления реквизитов на управляемые формы без написания кода.
Нам необходимо перехватить событие формы ПриСозданииНаСервере. На этом этапе мы программно создадим элемент формы (колонку) и свяжем его с данными. Проанализируем алгоритм действий:
ФормаДокумента заказа клиента).&После("ПриСозданииНаСервере").Пример программного добавления колонки:
&НаСервере
Процедура ИТ_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
// Определяем имя колонки и путь к данным
ИмяКолонки = "ИТ_КодКомпании";
НоваяКолонка = Элементы.Добавить(ИмяКолонки, Тип("ПолеФормы"), Элементы.Товары);
НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода;
НоваяКолонка.ПутьКДанным = "Объект.Товары.Номенклатура.ДополнительныйРеквизит_КодКомпании";
НоваяКолонка.Заголовок = "Код компании";
НоваяКолонка.ТолькоПросмотр = Истина;
КонецПроцедуры
Важное замечание: Обращение через точку к дополнительным реквизитам в пути к данным (Номенклатура.ДополнительныйРеквизит_Имя) работает только в том случае, если эти реквизиты выведены в состав общих реквизитов или корректно индексированы платформой. В УТ 11.5 чаще требуется другой подход — использование программного заполнения.
Если прямой путь к данным через точку не срабатывает, нам необходимо создать Реквизит формы (не путать с реквизитом объекта) в табличной части Товары. Допустим, мы создали в расширении колонку ИТ_ДопРеквизитКолонка с типом Строка.
Теперь нам нужно обеспечить заполнение этой колонки при открытии документа и при изменении номенклатуры. Для этого целесообразно использовать модуль УправлениеСвойствами, который является стандартным для библиотек стандартных подсистем (БСП) в составе УТ 11.5.
Разберем, как реализовать заполнение при изменении товара в строке:
&НаКлиенте
Процедура ИТ_ТоварыНоменклатураПриИзмененииПосле(Элемент)
ТекущаяСтрока = Элементы.Товары.ТекущиеДанные;
Если ТекущаяСтрока <> Неопределено Тогда
// Вызываем серверную функцию для получения значения доп. реквизита
ТекущаяСтрока.ИТ_ДопРеквизитКолонка = ПолучитьЗначениеДопРеквизита(ТекущаяСтрока.Номенклатура);
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЗначениеДопРеквизита(СсылкаНоменклатура)
// Используем типовой механизм БСП для чтения свойств
ТаблицаСвойств = УправлениеСвойствами.ПрочитатьЗначенияСвойств(СсылкаНоменклатура);
// Ищем нужное нам свойство по имени или ссылке
Для Каждого СтрокаСвойства Из ТаблицаСвойств Цикл
Если СтрокаСвойства.Свойство.Наименование = "Код организации" Тогда
Возврат Строка(СтрокаСвойства.Значение);
КонецЕсли;
КонецЦикла;
Возврат "";
КонецФункции
Проанализируем ситуацию с точки зрения нагрузки на систему. Если в вашем документе 10-20 строк, программное чтение дополнительных реквизитов произойдет мгновенно. Однако, если менеджеры работают с документами по 500-1000 строк, обращение к функции УправлениеСвойствами.ПрочитатьЗначенияСвойств для каждой строки в цикле может привести к существенным задержкам при открытии формы.
Для оптимизации и повышения информативности (например, когда требуется вывод данных ABC/XYZ анализа) рекомендуется следовать правилам:
ПриЧтенииНаСервере) лучше прочитать все дополнительные реквизиты одним запросом для всего массива номенклатуры, присутствующего в документе.Объект.Товары с таблицей значений дополнительных реквизитов.Как упоминалось в обсуждении на форуме, существуют универсальные разработки, которые позволяют настраивать видимость доп. реквизитов в ТЧ через пользовательский интерфейс. Работают они по принципу динамического перехвата событий формы. Если вы планируете внедрять такой функционал во множество документов (Заказы, Счета, Поступления), разработка собственного универсального механизма в расширении будет более оправдана, чем написание кода для каждой формы в отдельности. Для быстрого решения этой задачи без программирования можно использовать готовое расширение для вывода дополнительных реквизитов номенклатуры в табличную часть.
В современных версиях УТ 11.5.8.295 и выше, обратите внимание на то, что расширение может требовать адаптации под новые требования безопасности платформы (например, использование безопасного режима или профилей безопасности).
Выяснив причину отсутствия типового решения, мы приходим к выводу: для вывода дополнительных реквизитов номенклатуры в табличную часть необходимо использовать расширение конфигурации.
Основные шаги реализации:
ПриИзменении и ПриЧтенииНаСервере для актуализации данных.Такой подход позволит менеджеру видеть всю необходимую информацию ("нитку" кода компании, артикулы и т.д.) без необходимости открывать карточку каждой номенклатуры.