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