Top.Mail.Ru

Основы работы с расширениями. Пример создания расширения

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

Практически в каждой современной конфигурации 1С, построенной на Библиотеке стандартных подсистем, есть справочник «Пользователи». Вы сможете воспроизвести аналогичные шаги в любой типовой конфигурации - например УНФ, Бухгалтерия или ЗУП.
Представьте, что руководство поставило вам задачу внедрить систему грейдов. Каждому сотруднику теперь нужно присвоить ранг, а в карточке пользователя этот ранг должен выводиться прямо в заголовке окна. Кроме того, при смене статуса пользователя на недействительного, система должна автоматически очищать присвоенный ранг.

Для реализации этой задачи мы задействуем все основные механизмы расширений: создадим новые сущности, добавим реквизиты в типовой объект, изменим интерфейс и перепишем часть программного кода.

Первые шаги. Создание расширения

Любая работа начинается с подготовки пространства. Заходим в конфигуратор, открываем меню Конфигурация и находим пункт "Расширения конфигурации". В списке расширений может быть пусто, либо уже могут находиться какие-то расширения, как например в демо базе БСП.

 Добавляем новую запись. Платформа предложит указать имя и выбрать назначение.

По умолчанию, платформа предлагает «Адаптация» - его и оставим. Именно назначение "Адаптация" подходит для доработок основной конфигурации.

Сразу привыкаем к правилам хорошего тона. Все наши собственные сущности в расширении обязаны иметь уникальный префикс, который платформа сама предложит задать в свойствах. Уникальный префикс гарантирует, что имена реквизитов, объектов, процедур и функций, и т.п. - не будут пересекаться с именами из основной конфигурации или из других расширений, т.е. у нас будет отдельное пространство имен.

После того как заполнили все поля так как  мы хотим, жмем ок, и в списке появляется строка с нашим расширением. Снимаем флажки "Безопасный режим" и "Защита от опасных действий". Дважды кликаем по нашему свежему расширению. Оно откроется в дереве метаданных. Сейчас оно совершенно пустое, но мы это быстро исправим.

Добавление нового справочника в расширение

Нашей бизнес-задаче требуется место для хранения списка возможных грейдов. Идеальным решением будет создать новый объект прямо внутри расширения. Все точно так же как при обычной разработке. Кликаем правой кнопкой мыши по ветке справочников в нашем пустом дереве и создаем новый справочник.

Платформа автоматически добавит к имени справочника наш префикс. Назовем его «Гр_Грейды». Этот объект будет жить исключительно в нашей доработке, но пользователи увидят его в режиме предприятия как совершенно обычный справочник. Мы сразу сможем наполнить его данными, заведя там грейды вроде «Джун» и «Миддл».

Заимствование объектов из основной конфигурации

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

Здесь кроется самое главное правило безопасной разработки: берем только самое необходимое. 

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

Дальше редактируем так же как в основной конфигурации - добавляем реквизит, назначаем тип - СправочникСсылка.Гр_Грейды

Редактирование форм в расширении

Теперь нужно вывести грейды в форму справочника. И сделать это можно двумя способами - в графическом редакторе отредактировать форму и вытащить наш новый реквизит в виде элемента формы, или вывести элемент формы программно. Сперва добавим форму справочника Пользователи в расширение, а затем разберемся, как лучше поступить.

Обратите внимание, что все реквизиты формы выглядят серыми и не активными. Это из-за того, что платформа заимствует в расширение по сути только оболочку формы, без всего лишнего - опять же, чтобы минимизировать заимствования.

Чтобы добавить наш реквизит, понадобится затянуть в расширение основной реквизит формы "Объект"

Минус такого действия в том, что платформа проанализирует все подчиненные реквизиты объекта, и в случае, если среди реквизитов есть ссылочные типы, затянет и ссылки на нужные справочники - подразделения, физические лица, и т.д.
В результате в расширении разом окажется множество лишнего.

Поэтому гораздо лучше добавлять реквизиты программно. Об этом есть отдельная подробная статья, а пока рассмотрим как вывести наш реквизит на форму.
Мышкой выделим элемент Форма (Расширение) в дереве элементов, и откроем свойства. Найдем секцию "События" и нажмем на кнопку с увеличительным стеклом. Откроется окошко "Тип вызова". Выбираем "Вызывать перед", чтобы наш код отработал перед кодом основной конфигурации.

Пропишем код для программного вывода нашего элемента:

&НаСервере
Процедура Гр_ПриСозданииНаСервереПеред(Отказ, СтандартнаяОбработка)
	
	ЭлементГрейд = Элементы.Добавить("Гр_Грейд", Тип("ПолеФормы"), Элементы.ГруппаДанныеШапки);
	ЭлементГрейд.ПутьКДанным = "Объект.Гр_Грейд";
	ЭлементГрейд.Вид = ВидПоляФормы.ПолеВвода;

	Если ЗначениеЗаполнено(Объект.Гр_Грейд) Тогда
            Заголовок = Заголовок + " (Грейд: " + Объект.Гр_Грейд + ")";
        КонецЕсли;
	
КонецПроцедуры

Мы рассмотрели, как в расширение переопределить код обработчика события. Обратите внимание, что в свойствах формы в списке событий добавится наш обработчик. Это важно.

Следующий пример, который мы рассмотрим - это как изменить типовой код в расширении.

Добавляем свой код

Давайте выделим добавленное поле, изменив ему цвет фона. Для этого в коде формы в основной конфигурации найдем метод НастроитьФорму. Добавим его в расширение, выберем тип вызова "Перед", и уже в расширении напишем:

&НаСервере
&Перед("НастроитьФорму")
Процедура Гр_НастроитьФорму(ТекущийОбъект, ПриСозданииНаСервере, ПараметрыЗаписи)
	Если Элементы.Найти("Гр_Грейд") <> Неопределено Тогда
		Элементы.Гр_Грейд.ЦветФона = WebЦвета.БледноЗеленый;
	КонецЕсли;
КонецПроцедуры

Обратите внимание - у заимствованных методов, которые не являются обработчиками, их порядок выполнения определяется специальными инструкциями - &Перед, &После, &Вместо и &ИзменениеИКонтроль. А вот для обработчиков событий, как мы убедились выше - порядок определяется тем, где в свойствах мы его прописали - перед, после или вместо. И у обработчиков нельзя задать ИзменениеИКонтроль.
Более подробно об этих инструкциях и порядке выполнения кода будет рассказано в отдельной статье.

Заключение

Итак, мы сделали важный шаг в знакомстве с расширениями - создали собственное расширение на базе конфигурации Демо-БСП 3.1.9. Мы добавили свой собственный справочник, заимствовали форму справочника Пользователи из основной конфигурации, изменили обработчик ПриСозданииНаСервере, а также изменили метод НастроитьФорму. В следующих материалах мы разберем подробнее типы вызовов и последовательность выполнения кода, доработку ролей и типов, и многое другое. Следите за материалами, чтобы не пропустить. До новых встреч!

Чувствуете, что застряли в основах 1С?

Информация в интернете кажется обрывочной, а на решение простых задач уходят часы? Вы не одиноки. Я запустил Клуб для 1С разработчиков Alexcode.PRO. Внутри - продвинутые статьи, видео, материалы для скачивания, закрытый чат для резидентов и возможность влиять на контент.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *