При разработке и настройке конфигураций на платформе 1С:Предприятие разработчики часто сталкиваются с типовой проблемой: стандартного представления справочника (код и наименование) недостаточно для того, чтобы пользователь мог сделать однозначный выбор. Например, в базе данных может быть зарегистрировано множество товаров с одинаковым наименованием «Труба» или «Кабель», но с совершенно разными техническими характеристиками — маркой, профилем, диаметром или количеством слоев. Если при выборе товара в табличную часть документа пользователь видит только стандартное наименование, это неизбежно приводит к ошибкам учета.
В этой статье мы подробно рассмотрим, как решить эту проблему с помощью различных подходов — от классического редактирования формы выбора в Конфигураторе до программного изменения представления объектов и использования встроенных инструментов Библиотеки стандартных подсистем (БСП) без снятия конфигурации с поддержки.
Это самый очевидный и классический путь решения задачи, который подходит в тех случаях, когда мы можем вносить изменения в конфигурацию. Если у справочника отсутствует явная форма выбора, платформа генерирует ее автоматически «на лету», выводя только базовые поля — Код и Наименование. Наша задача — спроектировать собственную форму выбора и добавить на нее необходимые колонки.
Разберем этот процесс по шагам:
Товары).Список, имеющий тип ДинамическийСписок.Список. Внутри него мы увидим все доступные поля основной таблицы справочника, включая наши пользовательские реквизиты: Марка, Профиль, КоличествоСлоев.Список или ТаблицаСписка).Теперь при нажатии кнопки выбора (три точки) в табличной части документа откроется созданная нами форма, где пользователь увидит полноценную таблицу со всеми необходимыми техническими характеристиками товара.
Предыдущий способ отлично решает задачу в момент непосредственного интерактивного выбора. Однако у него есть существенный недостаток: как только пользователь выберет нужную строку, в поле табличной части документа подставится ссылка на элемент справочника. Платформа по умолчанию отобразит эту ссылку в виде стандартного наименования (например, просто «Труба»). Если в документе несколько строк с одинаковым наименованием, пользователь снова запутается, так как визуально строки будут казаться абсолютно идентичными.
Чтобы решить эту проблему глобально во всей системе, мы можем настроить программную генерацию текстового представления объекта. Сделаем так, чтобы везде в интерфейсе (в списках, полях ввода, документах и отчетах) товар отображался в информативном виде: «Труба (Сталь, Круглая, 3 слоя)».
Для реализации этого механизма откроем Модуль менеджера справочника Товары и определим два важных системных обработчика событий:
Процедура ОбраобраткаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Отключаем стандартную генерацию полей платформой
СтандартнаяОбработка = Ложь;
// Явно указываем, какие поля нам потребуются для сборки красивого имени
Поля.Добавить("Наименование");
Поля.Добавить("Марка");
Поля.Добавить("Профиль");
Поля.Добавить("КоличествоСлоев");
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
// Отключаем стандартное формирование строкового представления
СтандартнаяОбработка = Ложь;
// Формируем строковые переменные с проверкой на заполнение
ТекНаименование = СокрЛП(Данные.Наименование);
ДопПараметры = Новый Массив;
Если ЗначениеЗаполнено(Данные.Марка) Тогда
ДопПараметры.Добавить("Марка: " + Строка(Данные.Марка));
КонецЕсли;
Если ЗначениеЗаполнено(Данные.Профиль) Тогда
ДопПараметры.Добавить("Профиль: " + Строка(Данные.Профиль));
КонецЕсли;
Если ЗначениеЗаполнено(Данные.КоличествоСлоев) Тогда
ДопПараметры.Добавить("Слоев: " + Строка(Данные.КоличествоСлоев));
КонецЕсли;
// Собираем итоговую строку представления
Если ДопПараметры.Количество() > 0 Тогда
СтрокаПараметров = СтрСоединить(ДопПараметры, ", ");
Представление = ТекНаименование + " (" + СтрокаПараметров + ")";
Иначе
Представление = ТекНаименование;
КонецЕсли;
КонецПроцедуры
Рассмотрим подробнее работу этих обработчиков. В процедуре ОбработкаПолученияПолейПредставления мы сообщаем СУБД, что при выборке данных для отображения ссылок необходимо получить не только стандартное наименование, но и значения дополнительных реквизитов. В процедуре ОбработкаПолученияПредставления мы пишем алгоритм склейки этих данных в красивую строку. Теперь пользователь будет безошибочно ориентироваться в данных на любых этапах работы с документами.
Иногда возникают ситуации, когда нужные для выбора данные физически отсутствуют непосредственно в реквизитах самого справочника. Например, количество слоев или марка могут храниться в подчиненных справочниках, периодических регистрах сведений или вообще рассчитываться на основании других аналитик. Простое перетаскивание реквизитов на форму здесь не поможет.
В таких сценариях нам необходимо перевести динамический список формы выбора в режим произвольного запроса:
Товары в Конфигураторе.Список и перейдем в его свойства.Проанализируем пример такого запроса, связывающего товар с регистром сведений цен для оперативного отображения стоимости при выборе:
ВЫБРАТЬ
СправочникТовары.Ссылка КАК Ссылка,
СправочникТовары.Код КАК Код,
СправочникТовары.Наименование КАК Наименование,
СправочникТовары.Марка КАК Марка,
СправочникТовары.Профиль КАК Профиль,
ЕСТЬNULL(ЦеныНоменклатурыСрезПоследних.Цена, 0) КАК Цена
ИЗ
Справочник.Товары КАК СправочникТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, ) КАК ЦеныНоменклатурыСрезПоследних
ПО СправочникТовары.Ссылка = ЦеныНоменклатурыСрезПоследних.Номенклатура
После сохранения запроса новое поле Цена появится в списке доступных реквизитов на форме выбора. Нам останется лишь перетащить его в интерфейсную часть формы. Это мощный инструмент для кастомизации процесса подбора элементов.
Чтобы ускорить работу пользователей, мы можем сделать так, чтобы им вообще не требовалось открывать форму выбора по кнопке с троеточием. Платформа 1С позволяет осуществлять интеллектуальный поиск и автоподбор прямо при вводе текста в ячейку табличной части документа.
Для настройки быстрого поиска по дополнительным реквизитам выполним следующие действия в Конфигураторе:
Товары на вкладке «Данные».Марка и Профиль). Чтобы они могли участвовать в автоподборе, они должны быть проиндексированы. Откроем свойства каждого из этих реквизитов и установим свойство «Индексировать» в значение «Индексировать».Теперь при работе в документе пользователю достаточно написать в поле ввода, например, «Труба Сталь», и система автоматически отфильтрует список товаров на лету, предложив только позиции с соответствующей маркой стали.
Что делать, если конфигурация находится на жесткой поддержке поставщика, запрещено вносить изменения в код или вы работаете в облачном сервисе 1С:Фреш? Мы можем решить проблему исключительно силами пользовательского режима, используя встроенные возможности Библиотеки стандартных подсистем (БСП) и платформенные настройки форм.
Разберем алгоритм вывода колонок непосредственно в режиме «1С:Предприятие»:
Список (или Таблица).Марка, Профиль, Количество слоев. Нажмем «ОК».Этот способ уникален тем, что изменения сохраняются индивидуально для каждого пользователя информационной базы и не требуют вмешательства программистов или обновления конфигурации. Если у вас используются механизмы «Дополнительных реквизитов и сведений» БСП, эти реквизиты точно так же будут доступны для вывода на форму через конструктор изменения формы внутри родительского объекта Ссылка.