Как вывести дополнительный реквизит на форму списка справочника, если нет поля Ссылка?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия
← На главную

Всем привет! Разберем частую ситуацию, с которой сталкиваются пользователи и разработчики в типовых конфигурациях на платформе 1С, например, в конфигурации «Бухгалтерия предприятия». Предположим, мы добавили дополнительный реквизит КодПроизводителя (тип строка) к справочнику «Номенклатура». Далее нам нужно вывести этот реквизит в виде колонки на форму списка. Мы заходим в меню «Изменить форму», но обнаруживаем, что в дереве доступных реквизитов отсутствует поле Ссылка, через которое обычно вытаскиваются дополнительные реквизиты. Давайте проанализируем ситуацию и выясним причину, а также рассмотрим по шагам, как решить эту задачу.

Почему в окне настроек отсутствует поле Ссылка?

Для начала выясним причину такого поведения системы. Отсутствие реквизита в пользовательских настройках формы не является багом. Это следствие механизмов оптимизации производительности платформы 1С и типовых конфигураций:

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

Способ 1. Настройка отображения в пользовательском режиме

Посмотрим, что можно сделать без привлечения программиста и изменения конфигурации. Если база типовая, иногда достаточно сбросить настройки или изменить режим просмотра.

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

Способ 2. Решение проблемы через расширение конфигурации

Если пользовательские методы не помогли, нам потребуется создать расширение. Разберем по шагам, как это сделать, не переписывая сам запрос динамического списка (чтобы не усложнять поддержку базы).

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

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

Способ 3. Оптимальный программный вывод (чтобы список не тормозил)

Если мы решаем задачу программно через расширение, важно сделать это правильно. Не рекомендуется добавлять левое соединение (JOIN) к таблице дополнительных реквизитов прямо в запросе динамического списка. Справочник Номенклатуры обычно содержит десятки тысяч элементов. Усложнение запроса приведет к долгим загрузкам и зависаниям при скроллинге.

Современный стандарт разработки в 1С предписывает использовать обработчик события формы ПриПолученииДанныхНаСервере. Этот метод позволяет получать данные только для тех строк (обычно 30-40 штук), которые в данный момент видит пользователь на экране. Посмотрим на пример реализации.

Для начала создадим строковый реквизит формы, например КодПроизводителяДоп, и выведем его в элементы формы. Затем в модуле формы напишем следующий код:


&НаСервереБезКонтекста
Процедура ПриПолученииДанныхНаСервере(ИмяЭлемента, Настройки, Строки)
    
    // Проверяем, что событие вызвано для нужного динамического списка
    Если ИмяЭлемента <> "Список" Тогда
        Возврат;
    КонецЕсли;

    // Собираем массив ссылок видимых строк
    МассивНоменклатуры = Новый Массив;
    Для Каждого КлючИЗначение Из Строки Цикл
        МассивНоменклатуры.Добавить(КлючИЗначение.Ключ);
    КонецЦикла;
    
    // Если список пуст - выходим
    Если МассивНоменклатуры.Количество() = 0 Тогда
        Возврат;
    КонецЕсли;

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

КонецПроцедуры

Такой подход полностью исключает потерю производительности, так как запрос к базе данных выполняется порциями и только для небольшой группы элементов. Используя событие ПриПолученииДанныхНаСервере, вы обеспечите быструю и стабильную работу системы, а пользователи смогут комфортно видеть нужный им дополнительный реквизит прямо в списке. Для ознакомления с другими вариантами реализации подойдёт руководство по методам доработки динамических списков.

← На главную