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