Как вывести дополнительные реквизиты справочника при его выборе в документе 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

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


Способ 1. Создание и редактирование формы выбора справочника в Конфигураторе

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

Разберем этот процесс по шагам:

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

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


Способ 2. Динамическое переопределение представления ссылки (Модуль менеджера)

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

Чтобы решить эту проблему глобально во всей системе, мы можем настроить программную генерацию текстового представления объекта. Сделаем так, чтобы везде в интерфейсе (в списках, полях ввода, документах и отчетах) товар отображался в информативном виде: «Труба (Сталь, Круглая, 3 слоя)».

Для реализации этого механизма откроем Модуль менеджера справочника Товары и определим два важных системных обработчика событий:


Процедура ОбраобраткаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
    
    // Отключаем стандартную генерацию полей платформой
    СтандартнаяОбработка = Ложь;
    
    // Явно указываем, какие поля нам потребуются для сборки красивого имени
    Поля.Добавить("Наименование");
    Поля.Добавить("Марка");
    Поля.Добавить("Профиль");
    Поля.Добавить("КоличествоСлоев");
    
КонецПроцедуры

Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
    
    // Отключаем стандартное формирование строкового представления
    СтандартнаяОбработка = Ложь;
    
    // Формируем строковые переменные с проверкой на заполнение
    ТекНаименование = СокрЛП(Данные.Наименование);
    
    ДопПараметры = Новый Массив;
    
    Если ЗначениеЗаполнено(Данные.Марка) Тогда
        ДопПараметры.Добавить("Марка: " + Строка(Данные.Марка));
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Данные.Профиль) Тогда
        ДопПараметры.Добавить("Профиль: " + Строка(Данные.Профиль));
    КонецЕсли;
    
    Если ЗначениеЗаполнено(Данные.КоличествоСлоев) Тогда
        ДопПараметры.Добавить("Слоев: " + Строка(Данные.КоличествоСлоев));
    КонецЕсли;
    
    // Собираем итоговую строку представления
    Если ДопПараметры.Количество() > 0 Тогда
        СтрокаПараметров = СтрСоединить(ДопПараметры, ", ");
        Представление = ТекНаименование + " (" + СтрокаПараметров + ")";
    Иначе
        Представление = ТекНаименование;
    КонецЕсли;
    
КонецПроцедуры

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


Способ 3. Использование произвольного запроса в динамическом списке

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

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

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

Проанализируем пример такого запроса, связывающего товар с регистром сведений цен для оперативного отображения стоимости при выборе:


ВЫБРАТЬ
    СправочникТовары.Ссылка КАК Ссылка,
    СправочникТовары.Код КАК Код,
    СправочникТовары.Наименование КАК Наименование,
    СправочникТовары.Марка КАК Марка,
    СправочникТовары.Профиль КАК Профиль,
    ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ
    Справочник.Товары КАК СправочникТовары
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
    ПО СправочникТовары.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура

После сохранения запроса новое поле Цена появится в списке доступных реквизитов на форме выбора. Нам останется лишь перетащить его в интерфейсную часть формы. Это мощный инструмент для кастомизации процесса подбора элементов.


Способ 4. Оптимизация поиска с помощью настройки «Ввод по строке»

Чтобы ускорить работу пользователей, мы можем сделать так, чтобы им вообще не требовалось открывать форму выбора по кнопке с троеточием. Платформа 1С позволяет осуществлять интеллектуальный поиск и автоподбор прямо при вводе текста в ячейку табличной части документа.

Для настройки быстрого поиска по дополнительным реквизитам выполним следующие действия в Конфигураторе:

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

Теперь при работе в документе пользователю достаточно написать в поле ввода, например, «Труба Сталь», и система автоматически отфильтрует список товаров на лету, предложив только позиции с соответствующей маркой стали.


Способ 5. Индивидуальная настройка формы без Конфигуратора (пользовательский режим)

Что делать, если конфигурация находится на жесткой поддержке поставщика, запрещено вносить изменения в код или вы работаете в облачном сервисе 1С:Фреш? Мы можем решить проблему исключительно силами пользовательского режима, используя встроенные возможности Библиотеки стандартных подсистем (БСП) и платформенные настройки форм.

Разберем алгоритм вывода колонок непосредственно в режиме «1С:Предприятие»:

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

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

← На главную