Как добавить реквизит в список договоров на форме контрагента в 1С:УПП (Обычные формы)?

Программист 1С v8.3 (Обычные формы)
← На главную

В процессе сопровождения «классических» конфигураций на обычных формах, таких как 1С:Управление производственным предприятием (УПП), программисты часто сталкиваются с необходимостью кастомизации стандартных интерфейсов. Типичная задача — вывести дополнительную информацию о договорах непосредственно в форму элемента контрагента, чтобы пользователю не приходилось открывать каждый договор по отдельности.

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

Разбор механизма отображения договоров на форме контрагента

Для начала проанализируем, как устроена форма элемента контрагента. Список договоров на вкладке «Счета и договоры» представляет собой Табличное поле, данные которого имеют тип СправочникСписок.ДоговорыКонтрагентов. Важно понимать, что этот список автоматически фильтруется по владельцу (текущему контрагенту) благодаря свойству СвязьПоВладельцу.

В коде типовой УПП часто встречается обращение к процедурам общего модуля, таким как мРаботаСДиалогами.глСкрытьНевидимыеЭлементы. Проанализируем, что делает этот код:


ЭлементыФормы[Данные].Значение.Отбор.Невидимый.Использование = Истина;
ЭлементыФормы[Данные].Значение.Отбор.Невидимый.ВидСравнения = ВидСравнения.НеРавно;
ЭлементыФормы[Данные].Значение.Отбор.Невидимый.Значение = Истина;

Эта часть кода отвечает за фильтрацию строк списка. Реквизит Невидимый в УПП — это служебное булево поле, которое позволяет «архивировать» элементы без их удаления. Однако это никак не влияет на состав колонок (реквизитов), отображаемых на форме. Если нам нужно добавить новое поле, мы должны работать с визуальным составом колонок табличного поля.

Решение 1: Использование инструмента «Размещение данных»

Самый простой и правильный способ добавить существующий реквизит справочника ДоговорыКонтрагентов в список на форме контрагента — воспользоваться встроенным конструктором размещения данных. Разберем этот процесс по шагам:

  1. Откроем форму элемента справочника Контрагенты в конфигураторе.
  2. Перейдем на вкладку, где расположено табличное поле со списком договоров (обычно это вкладка «Счета и договоры»).
  3. Нажмем правой кнопкой мыши на табличном поле (имя элемента обычно Договоры).
  4. В контекстном меню выберем пункт «Размещение данных...».
  5. В появившемся окне мы увидим список всех доступных реквизитов справочника ДоговорыКонтрагентов. Найдем нужный нам реквизит и установим напротив него флажок в колонке «Разместить».
  6. Нажмем «ОК». Система автоматически добавит колонку в табличное поле и свяжет её с данными.

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

Решение 2: Программное добавление колонки (для вычисляемых данных)

Иногда возникает задача вывести данные, которых нет в реквизитах договора (например, текущую задолженность или дату последней транзакции). В этом случае «Размещение данных» не поможет, так как данных нет в метаданных. Выясним, как это сделать программно.

Рассмотрим добавление колонки через код в процедуре ПриОткрытии:


НоваяКолонка = ЭлементыФормы.Договоры.Колонки.Вставить(0, "СтатусДолга");
НоваяКолонка.ТекстШапки = "Статус задолженности";
НоваяКолонка.Ширина = 15;

После добавления колонки её необходимо заполнить. В обычных формах для этого используются события ПриВыводеСтроки или ПриПолученииДанных.

Оптимизация отображения данных: ПриПолученииДанных

Проанализируем разницу. Событие ПриВыводеСтроки вызывается для каждой строки отдельно, что может привести к существенным задержкам, если внутри происходит запрос к базе данных. Для работы со списками в УПП крайне рекомендуется использовать ПриПолученииДанных, так как оно позволяет получить данные для всех видимых строк одним пакетом.

Посмотрим на пример реализации:


Процедура ДоговорыПриПолученииДанных(Элемент, ОформленияСтрок)
    // Создаем массив ссылок на договоры, которые сейчас видны на экране
    МассивСсылок = Новый Массив;
    Для Каждого Оформление Из ОформленияСтрок Цикл
        МассивСсылок.Добавить(Оформление.ДанныеСтроки.Ссылка);
    КонецЦикла;

    // Выполняем один запрос для получения всех необходимых доп. данных
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ Ссылка, СрокДействия ИЗ Справочник.ДоговорыКонтрагентов ГДЕ Ссылка В (&МассивСсылок)";
    Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
    
    ТаблицаДанных = Запрос.Выполнить().Выгрузить();
    ТаблицаДанных.Индексы.Добавить("Ссылка");

    // Заполняем колонки в оформлении строк
    Для Каждого Оформление Из ОформленияСтрок Цикл
        СтрокаДанных = ТаблицаДанных.Найти(Оформление.ДанныеСтроки.Ссылка, "Ссылка");
        Если СтрокаДанных <> Неопределено Тогда
            Оформление.Ячейки.СтатусДолга.УстановитьТекст(СтрокаДанных.СрокДействия);
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

Почему новый реквизит может не отображаться?

Бывают ситуации, когда программист добавил реквизит через «Размещение данных», но пользователь его всё равно не видит. Рассмотрим основные причины:

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

Подводя итог, можно сказать, что работа с обычными формами в УПП требует понимания взаимодействия визуального слоя (ЭлементыФормы) и слоя данных (Объект). Для простого вывода реквизитов всегда используйте «Размещение данных», а для сложных вычисляемых полей — событие ПриПолученииДанных с пакетной выборкой в запросе.

← На главную