При разработке и настройке прикладных решений на платформе 1С:Предприятие 8.3 часто возникает классическая задача UI/UX: один и тот же справочник необходимо включить в несколько разных разделов (подсистем) интерфейса, но при этом он должен называться по-разному. Например, справочник Контрагенты в разделе закупок логично назвать "Поставщики", а в разделе продаж — "Клиенты".
В рамках этой статьи мы подробно разберем несколько эффективных практических способов реализации этой задачи: от настройки интерфейсных команд в конфигураторе до динамического управления формами и представлениями элементов на встроенном языке 1С.
Это наиболее простой, быстрый и рекомендуемый платформой способ, который не требует написания сложного программного кода и изменения логики работы форм. Мы создадим индивидуальные команды для каждого раздела интерфейса и настроим их видимость.
Разберем этот способ по шагам:
Номенклатура).ОткрытьСписокомПродажи. В свойстве Синоним указываем имя, которое должно отображаться в первом разделе (например, "Каталог товаров").Панель навигации.Обычное (или Важное, в зависимости от требований к интерфейсу).
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
// Открываем стандартную форму списка нашего справочника
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
ОткрытьСпискомЗакупки, укажем синоним "Материалы на складах" и пропишем точно такой же код открытия формы списка в её модуле.Номенклатура и снимаем с неё галочку видимости. Вместо неё включаем видимость для нашей новой команды ОткрытьСписокомПродажи.ОткрытьСпискомЗакупки.МенеджерПоПродажам и МенеджерПоЗакупкам), найти ветку команд нашего справочника и вручную установить галочку "Просмотр" для соответствующих команд.Проанализируем ситуацию, когда нам недостаточно просто изменить имя ссылки в меню разделов. Нам также необходимо, чтобы при открытии формы её заголовок соответствовал выбранному разделу. Для этого мы применим механизм передачи параметров в форму списка при её открытии.
Посмотрим на пример реализации. Сначала изменим код в модуле нашей созданной команды для раздела "Продажи":
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ИмяРаздела", "Продажи");
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
В модуле команды для раздела "Закупки" будем передавать в параметрах значение "Закупки":
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ИмяРаздела", "Закупки");
ОткрытьФорму("Справочник.Номенклатура.ФормаСписка", ПараметрыФормы, ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Теперь перейдем в модуль формы списка самого справочника Номенклатура и обработаем этот параметр в процедуре ПриСозданииНаСервере:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("ИмяРаздела") Тогда
// Отключаем автоматическое формирование заголовка платформой
АвтоЗаголовок = Ложь;
Если Параметры.ИмяРаздела = "Продажи" Тогда
Заголовок = "Каталог продукции (Продажи)";
ИначеЕсли Параметры.ИмяРаздела = "Закупки" Тогда
Заголовок = "Сырье и материалы (Закупки)";
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Использование этого метода позволяет сохранить единую форму списка, не дублируя интерфейсные элементы конфигурации, что существенно упрощает дальнейшую поддержку кода.
В крупных учетных системах часто требуется не только поменять заголовок, но и полностью изменить состав колонок, настроить разные фиксированные отборы или применить уникальное условное оформление для разных разделов учета. В таких случаях лучшим решением будет создание отдельных форм списка.
Рассмотрим подробнее этот подход:
ФормаСпискаПродажи и ФормаСпискаЗакупки.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
ОткрытьФорму("Справочник.Номенклатура.ФормаСпискаПродажи", , ПараметрыВыполненияКоманды.Источник, ПараметрыВыполненияКоманды.Уникальность, ПараметрыВыполненияКоманды.Окно, ПараметрыВыполненияКоманды.НавигационнаяСсылка);
КонецПроцедуры
Этот способ гарантирует максимальную производительность системы и чистоту кода, избавляя разработчика от необходимости писать громоздкие процедуры динамического скрытия полей на клиенте.
Иногда под термином "изменение представления" подразумевают то, как ссылки на элементы справочника отображаются внутри документов и отчетов разных подсистем. Платформа 1С:Предприятие позволяет динамически переопределять представление ссылки с помощью обработчиков в модуле менеджера справочника.
Разберем по шагам, как переопределить стандартное строковое представление элемента (например, выводить для закупок формат "Артикул + Наименование", а для продаж — только "Наименование"):
Процедура ОбработкаПолученияПолейПредставления(Поля, СтандартнаяОбработка)
// Добавляем дополнительные реквизиты, необходимые для формирования строки
Поля.Добавить("Артикул");
Поля.Добавить("Наименование");
СтандартнаяОбработка = Ложь;
КонецПроцедуры
Процедура ОбработкаПолученияПредставления(Данные, Представление, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Определяем контекст работы пользователя на основе доступных ему ролей
Если РольДоступна("МенеджерПоЗакупкам") Тогда
Представление = "[" + Данные.Артикул + "] " + Данные.Наименование;
Иначе
Представление = Данные.Наименование;
КонецЕсли;
КонецПроцедуры
Важное примечание: Поскольку обработчики модуля менеджера выполняются на стороне сервера при получении ссылок базой данных, прямого доступа к открытым формам или клиентскому контексту они не имеют. Определение контекста через проверку ролей (РольДоступна()) или использование предопределенных параметров сеанса — самый надежный способ разделения логики представлений в многопользовательской среде.
Если вы решаете задачу изменения представления в типовой конфигурации 1С (например, 1С:ERP, 1С:Управление торговлей или 1С:Бухгалтерия), которая находится на поддержке, крайне не рекомендуется вносить эти изменения непосредственно в основную конфигурацию. Это усложнит процесс будущих автоматических обновлений базы.
Используйте механизм Расширений конфигурации. Все описанные шаги — добавление новых команд, переопределение командного интерфейса подсистем, переопределение заголовков через форму или создание новых форм — полностью поддерживаются в расширениях и сохранят вашу конфигурацию чистой и легко обновляемой.