Расширения конфигурации 1С 8.3: от создания до отладки

· 9 мин

Содержание

Чтобы работать с расширением в 1С, откройте Конфигуратор, выберите Конфигурация → Расширения конфигурации, нажмите «Добавить» и откройте конфигурацию расширения. Дальше нужные объекты основной конфигурации переносятся в расширение командой «Добавить в расширение» из контекстного меню. После этого их модули, формы и макеты можно менять, а саму типовую не трогать.

Типичная ситуация: бухгалтеру нужно новое поле в реализации и своя печатная форма акта. Если снять конфигурацию с поддержки, каждое обновление БП превращается в ручное сравнение и объединение. Расширение решает задачу иначе. Типовая остаётся на поддержке и обновляется штатно, а доработка живёт отдельным слоем поверх неё. Механизм есть в платформе с версии 8.3.6, но заметная часть возможностей добавлялась позже. Ниже всё описано для платформы 8.3.2x.

Как устроено расширение и когда оно подходит

Расширение — это отдельная мини-конфигурация, которая при запуске базы накладывается на основную. Платформа собирает их вместе «на лету». В типовой при этом ничего не меняется: её можно обновлять, сравнивать и откатывать как обычно.

В расширении есть два вида объектов:

  • 🔹 заимствованные — копии-ссылки на объекты основной конфигурации (документ, справочник, форма, общий модуль). Через них вы вмешиваетесь в типовое поведение;
  • 🆕 собственные — новые объекты расширения: отчёты, обработки, справочники, регистры, роли, общие модули.

У каждого расширения есть свойство «Назначение» с тремя значениями:

НазначениеДля чегоПример
ИсправлениеБыстрая правка ошибки типовойОбход ошибки в процедуре проведения до выхода релиза
АдаптацияПодстройка под процессы компанииНовый реквизит, своя проверка при записи
ДополнениеНовая функциональностьОтдельный отчёт, обработка, интеграция

Назначение влияет на порядок применения, если расширений несколько: сначала исправления, затем адаптации, затем дополнения.

Расширение или другие способы

СпособКогда выбиратьМинусы
РасширениеНужно менять поведение типовых объектов, формы, добавлять реквизитыТребует контроля после каждого обновления
Внешняя обработка или отчётРазовая печатная форма, загрузка, отчёт без вмешательства в типовую логикуНельзя изменить проведение или форму документа
Снятие с поддержкиГлубокая переработка, которую расширение не тянетКаждое обновление — ручное объединение

Правило практика: всё, что можно сделать внешней обработкой, делайте внешней обработкой. Всё, что нельзя, — расширением. Снятие с поддержки — последний вариант.

Создание расширения и подключение к базе

Создание в Конфигураторе

  1. Откройте базу в Конфигураторе и откройте основную конфигурацию (Конфигурация → Открыть конфигурацию).
  2. Выберите Конфигурация → Расширения конфигурации.
  3. В открывшемся окне нажмите «Добавить». Задайте имя (латиница или кириллица без пробелов), синоним, назначение и префикс.
  4. Префикс платформа предлагает сама, например Расш1_. Лучше заменить его на осмысленный: ак_ или ПечАкт_. Префикс добавляется к именам новых объектов и процедур, чтобы они не пересеклись с типовыми.
  5. Выделите расширение и откройте его конфигурацию кнопкой в командной панели окна. Появится отдельное дерево объектов расширения.

Заимствование объектов

Чтобы изменить типовой объект, его заимствуют. Найдите объект в дереве основной конфигурации, вызовите контекстное меню и выберите «Добавить в расширение». Если расширений несколько, платформа спросит, в какое именно.

При заимствовании формы или модуля платформа подтягивает и сам объект-владелец. Заимствуйте только то, что реально меняете: каждый лишний объект — это ещё одна точка, которая может «сломаться» после обновления типовой.

Сохранение и применение

После правок изменения нужно записать в базу:

  • F7 или «Обновить конфигурацию базы данных» в меню открытого расширения;
  • для переноса в другую базу — сохранить в файл .cfe через меню Конфигурация открытого расширения.

Для пакетных сценариев (обновление нескольких баз скриптом) подходит командная строка:

"C:\Program Files\1cv8\8.3.24.1548\bin\1cv8.exe" DESIGNER /F"D:\Bases\BP" /N"Администратор" /P"" ^
  /LoadCfg "D:\ext\PechatAkt.cfe" -Extension "ПечатьАкта" ^
  /UpdateDBCfg -Extension "ПечатьАкта"

Путь к платформе подставьте свой. Загрузка .cfe и обновление конфигурации базы данных — два отдельных шага. Если выполнить только первый, расширение в базе не заработает.

Установка в режиме 1С:Предприятие

В типовых на БСП расширение можно подключить без Конфигуратора. В БП 3.0, ЗУП 3.1 и УТ 11 путь одинаковый: Администрирование → Печатные формы, отчеты и обработки → Расширения. Там кнопка «Добавить из файла», флажки активности и безопасного режима.

После подключения расширения пользователям нужно перезапустить сеанс. Расширение применяется при старте, а не «на лету» в открытых окнах.

По умолчанию расширение, установленное из режима предприятия, работает в безопасном режиме. В нём запрещена работа с файлами на диске, COM-объектами и внешними компонентами. Если доработка пишет файлы или вызывает внешние программы, безопасный режим придётся отключить. Делайте это только для расширений, код которых вы проверили.

Доработка форм и интерфейса

Формы — самый частый объект доработок. Заимствуйте нужную форму документа (например, ФормаДокумента) и откройте её в редакторе расширения. Видны все типовые элементы, но изменять можно только свои.

Новый реквизит в документе

  1. Заимствуйте документ.
  2. В дереве расширения добавьте ему реквизит с префиксом: ак_НомерДоговораЗаказчика, тип «Строка».
  3. Заимствуйте форму документа и перетащите новый реквизит из списка реквизитов объекта на форму.
  4. Обновите конфигурацию базы данных.

Добавление реквизита к заимствованному объекту меняет структуру данных. Обновление в этом случае идёт дольше, чем для расширения с одним кодом.

Обработчики событий формы

В модуле заимствованной формы нельзя просто переписать типовую процедуру. Обработчик события подключается в палитре свойств формы или элемента. У события есть выбор типа вызова: «Перед», «После» или «Вместо». Платформа создаст процедуру с префиксом и вызовет её в нужный момент относительно типового обработчика.

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

&НаСервере
Процедура ак_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)
	Элементы.ак_НомерДоговораЗаказчика.Видимость = РольДоступна("ак_РаботаСДоговорами");
КонецПроцедуры

Свои элементы на форме называйте с тем же префиксом. Типовые элементы со временем переименовывают, ваши — нет.

Изменение бизнес-логики через аннотации

Код типовых модулей меняется аннотациями над процедурой расширения. Это главный приём работы с расширением.

АннотацияЧто делаетКогда применять
&Перед("Имя")Выполняет ваш код до типовогоДополнительная проверка, подготовка данных
&После("Имя")Выполняет ваш код после типовогоДополнить результат, записать доп. данные
&Вместо("Имя")Полностью заменяет типовую процедуруРедко, когда типовая логика не подходит целиком
&ИзменениеИКонтроль("Имя")Вставляет и удаляет строки внутри типовой процедурыТочечная правка середины процедуры

Перед и После

Пример: запрещаем записывать реализацию без номера договора заказчика. Код кладётся в модуль объекта заимствованного документа.

&Перед("ПередЗаписью")
Процедура ак_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
	Если РежимЗаписи = РежимЗаписиДокумента.Проведение
		И ПустаяСтрока(ак_НомерДоговораЗаказчика) Тогда
		ОбщегоНазначения.СообщитьПользователю("Укажите номер договора заказчика", ЭтотОбъект,
			"ак_НомерДоговораЗаказчика", , Отказ);
	КонецЕсли;
КонецПроцедуры

ОбщегоНазначения.СообщитьПользователю — процедура БСП, она есть во всех современных типовых. Если Отказ станет Истина, документ не запишется.

Вместо и ПродолжитьВызов

&Вместо отключает типовую процедуру. Чтобы в нужном месте всё-таки вызвать оригинал, используйте ПродолжитьВызов():

&Вместо("ЗаполнитьПоОснованию")
Процедура ак_ЗаполнитьПоОснованию(Основание)
	ПродолжитьВызов(Основание);
	Комментарий = "Создан на основании: " + Строка(Основание);
КонецПроцедуры

Без вызова ПродолжитьВызов() типовой код не выполнится вообще. После обновления конфигурации вы не узнаете, что фирма 1С исправила в этой процедуре ошибку: ваша замена её «закроет».

ИзменениеИКонтроль

Аннотация появилась в платформе 8.3.16. Вы копируете типовую процедуру целиком и помечаете правки:

&ИзменениеИКонтроль("ПроверитьЗаполнениеШапки")
Процедура ак_ПроверитьЗаполнениеШапки(Отказ)
	// ... типовой код без изменений ...
	#Вставка
	Если Не ЗначениеЗаполнено(ак_НомерДоговораЗаказчика) Тогда
		Отказ = Истина;
	КонецЕсли;
	#КонецВставки
	#Удаление
	// типовая строка, которую нужно убрать
	#КонецУдаления
КонецПроцедуры

Главный плюс — контроль. Если после обновления типовой текст процедуры изменится, расширение перестанет применяться и платформа укажет, где расхождение. С &Вместо такой защиты нет.

Имя процедуры в аннотации здесь условное. Перед доработкой откройте типовой модуль и возьмите точное имя оттуда: в разных конфигурациях и релизах они отличаются.

Свои отчёты и печатные формы в расширении

Новый отчёт

Отчёт на СКД создаётся в расширении как собственный объект, так же как в обычной конфигурации. Чтобы он появился в панели разделов, заимствуйте нужную подсистему (например, «Продажи») и включите в неё отчёт. Без этого отчёт будет доступен только через Все функции.

Печатная форма через расширение

В типовых на БСП печать документа описана в модуле менеджера. Порядок такой:

  1. Заимствуйте документ и его модуль менеджера.
  2. Создайте в расширении процедуру с &После("ДобавитьКомандыПечати") и добавьте свою команду в таблицу КомандыПечати.
  3. Создайте процедуру с &После("Печать"): если в коллекции печатных форм есть ваш идентификатор, сформируйте табличный документ по своему макету.
  4. Макет положите в документ внутри расширения как собственный.

Если нужно лишь поправить типовой макет (сдвинуть подпись, добавить строку), можно заимствовать сам макет. Учтите: заимствованный макет заменяет типовой целиком. Когда фирма 1С обновит оригинал, ваша копия останется прежней — сравнивайте её с новой версией после каждого релиза.

Для разовой печатной формы, которая не меняет логику документа, проще внешняя печатная форма. Расширение оправдано, когда форма нужна постоянно и всем.

Права на новые объекты

Новые объекты расширения недоступны обычным пользователям, пока на них нет прав. Создайте в расширении роль, отметьте права на свои отчёты, обработки и реквизиты и назначьте её группам доступа. Иначе пользователь получит Нарушение прав доступа! при попытке открыть отчёт.

Отладка и сопровождение после обновлений

Отладка

Точки останова в модулях расширения ставятся так же, как в типовых модулях. Запустите отладку из Конфигуратора (F5), и выполнение остановится в коде расширения. В стеке вызовов видно, в какой момент сработал ваш обработчик относительно типового.

Удобный приём — точка останова одновременно в процедуре &Перед и в типовой процедуре. Так видно порядок вызовов и значения параметров до и после.

Что делать после обновления типовой

После каждого обновления конфигурации:

  1. Откройте расширение в Конфигураторе и запустите проверку применимости из меню Конфигурация открытого расширения.
  2. Проверьте процедуры с &ИзменениеИКонтроль: платформа подсветит расхождения с новым типовым текстом.
  3. Сверьте заимствованные макеты с новыми версиями оригиналов.
  4. Пройдите основной сценарий в тестовой копии базы: запись, проведение, печать.

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

Диагностика: выберите симптом

Порядок в нескольких расширениях

Когда расширений становится пять-десять, начинаются конфликты: два расширения заимствуют одну процедуру, и результат зависит от порядка применения. Держите правило: одно расширение — одна задача. И ведите короткий реестр: имя, назначение, что заимствует, кто автор.

Частые вопросы

Чем расширение лучше доработки снятой с поддержки конфигурации?
Типовая остаётся на поддержке и обновляется автоматически. Доработку не нужно заново переносить при каждом релизе, достаточно проверить её применимость.
Слетит ли расширение при обновлении типовой конфигурации?
Само расширение из базы не удаляется. Но если изменились заимствованные объекты, оно может перестать применяться, пока вы не исправите расхождения.
Можно ли удалить типовой реквизит или документ расширением?
Нет. Расширение добавляет и меняет поведение, но удалять объекты основной конфигурации не умеет. Ненужный реквизит можно скрыть с формы.
Как перенести расширение в другую базу?
Сохраните его в файл .cfe в Конфигураторе и загрузите в другую базу через Конфигуратор или список расширений в режиме предприятия. Конфигурации баз должны совпадать по заимствованным объектам.
Можно ли временно отключить расширение, не удаляя его?
Да. Снимите флажок активности в списке расширений и перезапустите сеансы.