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

Дата: 21.09.2026 09:24:11
Расширение конфигурации
Доработка 1С
Поддержка
Обновление 1С
Комментарий:
0
Платформа:
8.3
Конфигурация:
Любая
Формы:
Управляемые

Расширение конфигурации 1С — отдельный слой доработок, который платформа накладывает на типовую конфигурацию при старте сеанса. Типовая остаётся на поддержке и обновляется штатно, а ваши реквизиты, формы и код живут в расширении и выгружаются в файл .cfe. Механизм появился в платформе 8.3.6, примеры ниже рассчитаны на актуальные релизы 8.3.

Статья построена на одном примере: расширение «Логистика» для документа «Реализация товаров и услуг» — реквизит «Логист» на форме, проверки при записи, история изменений через подписку и диагностика, когда расширение не применяется. Имена типовых объектов взяты из БП 3.0 и УТ 11, в своей конфигурации сверьте их.

Как создать расширение конфигурации 1С

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

Назначение задаёт порядок применения: «Исправление», затем «Адаптация», затем «Дополнение». Доработки под конкретную компанию помечают как «Адаптация».

ЗадачаМожно в расширении
Добавить реквизит или табличную часть в типовой объектДа
Создать свой справочник, документ, регистр, отчёт, обработку, роль, подпискуДа
Добавить поле, команду или обработчик в типовую формуДа, через заимствованную форму
Дополнить, заменить или поправить метод типового модуляДа, аннотациями
Удалить или переименовать типовой реквизит, изменить длину кода или иерархию справочникаНет

Если полю не нужны код и проверки, хватит дополнительных реквизитов — их заводят без конфигуратора.

Аннотации &Перед и &После в модуле объекта

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

// Модуль объекта документа РеализацияТоваровУслуг в расширении «Логистика»
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

&Перед("ПередЗаписью")
Процедура Расш1_ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)

	Если ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

КонецПроцедуры

&После("ОбработкаПроверкиЗаполнения")
Процедура Расш1_ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)

	// Логист обязателен для крупных отгрузок. Проверку и сообщение
	// «Поле "Логист" не заполнено» платформа выполнит сама.
	Если СуммаДокумента >= 100000 Тогда
		ПроверяемыеРеквизиты.Добавить("Расш1_Логист");
	КонецЕсли;

КонецПроцедуры

&После("ОбработкаЗаполнения")
Процедура Расш1_ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)

	// Типовое заполнение уже выполнено — дополняем только пустой реквизит.
	Если Не ЗначениеЗаполнено(Расш1_Логист) Тогда
		Расш1_Логист = Константы.Расш1_ЛогистПоУмолчанию.Получить();
	КонецЕсли;

КонецПроцедуры

#КонецЕсли
  • &Перед("ПередЗаписью") выполняется до типового кода. Отказ = Истина цепочку не прерывает: типовой метод всё равно отработает, а запись отменится после всех обработчиков.
  • В &После("ОбработкаПроверкиЗаполнения") реквизит попадает в ПроверяемыеРеквизиты, проверку и сообщение «Поле "Логист" не заполнено» платформа сделает сама.
  • &После("ОбработкаЗаполнения") срабатывает после типового заполнения нового документа, поэтому заполняем только пустой реквизит. Список параметров повторяет типовой метод: в УТ 11.4 и КА 2.5 у РеализацияТоваровУслуг.ОбработкаЗаполнения их два — ДанныеЗаполнения и СтандартнаяОбработка. Если в вашей конфигурации метод объявлен с ТекстЗаполнения, повторите три параметра, иначе расширение не применится.
  • Аннотация ищет метод по имени: если 1С переименует или удалит его в новом релизе, расширение перестанет применяться.

Реквизит на форме и свой обработчик события

Заимствуйте основную форму документа (в БП и УТ — ФормаДокумента). Поле можно перетащить из Объект в редакторе формы, но программное добавление спокойнее переживает обновления: в заимствованной форме меняется только привязка обработчика. В палитре свойств формы у события ПриСозданииНаСервере создайте обработчик с типом вызова «После».

// Модуль заимствованной формы ФормаДокумента

&НаСервере
Процедура Расш1_ПриСозданииНаСервереПосле(Отказ, СтандартнаяОбработка)

	// Поле могли уже добавить вручную в редакторе заимствованной формы.
	Если Элементы.Найти("Расш1_Логист") = Неопределено Тогда
		Расш1_ДобавитьПолеЛогиста();
	КонецЕсли;

КонецПроцедуры

&НаСервере
Процедура Расш1_ДобавитьПолеЛогиста()

	// Ставим поле перед комментарием, а если его нет — в конец формы.
	ПолеКомментарий = Элементы.Найти("Комментарий");
	Если ПолеКомментарий = Неопределено Тогда
		Поле = Элементы.Добавить("Расш1_Логист", Тип("ПолеФормы"));
	Иначе
		Поле = Элементы.Вставить("Расш1_Логист", Тип("ПолеФормы"),
			ПолеКомментарий.Родитель, ПолеКомментарий);
	КонецЕсли;

	Поле.Вид = ВидПоляФормы.ПолеВвода;
	Поле.ПутьКДанным = "Объект.Расш1_Логист";
	Поле.АвтоОтметкаНезаполненного = Объект.СуммаДокумента >= 100000;

	// В выборе — только действующие пользователи.
	ПараметрыОтбора = Новый Массив;
	ПараметрыОтбора.Добавить(Новый ПараметрВыбора("Отбор.Недействителен", Ложь));
	Поле.ПараметрыВыбора = Новый ФиксированныйМассив(ПараметрыОтбора);

КонецПроцедуры
  • Обработчик привязан к событию в палитре и сработает, даже если в типовой форме нет своего ПриСозданииНаСервере. Аннотация &После("ПриСозданииНаСервере") в модуле формы тоже допустима, но требует типового метода с таким именем.
  • Элементы.Вставить ставит поле в ту же группу перед «Комментарием», Элементы.Добавить — в конец формы.
  • Параметр выбора Отбор.Недействителен скрывает недействительных пользователей.

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

&Вместо подменяет метод целиком. Исходный метод вызывается через ПродолжитьВызов() с теми же или изменёнными параметрами, а можно не вызывать его вовсе. Так меняют результат типовой функции, не копируя её код. В конфигурациях на БСП функция модуля менеджера РеквизитыРедактируемыеВГрупповойОбработке перечисляет реквизиты для группового изменения, и новый реквизит сам туда не попадёт.

// Модуль менеджера документа РеализацияТоваровУслуг в расширении
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда

&Вместо("РеквизитыРедактируемыеВГрупповойОбработке")
Функция Расш1_РеквизитыРедактируемыеВГрупповойОбработке()

	// Сначала получаем типовой список, затем дополняем его своим реквизитом.
	Реквизиты = ПродолжитьВызов();
	Реквизиты.Добавить("Расш1_Логист");

	Возврат Реквизиты;

КонецФункции

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

&ИзменениеИКонтроль: правка внутри типового метода

Когда нужно изменить строку в середине метода, &Перед и &После не помогут, а &Вместо отрежет будущие исправления. &ИзменениеИКонтроль хранит в расширении копию метода, где правки размечены блоками #Вставка…#КонецВставки и #Удаление…#КонецУдаления. При применении платформа сверяет копию без вставок с текущим методом типовой. Если 1С изменит метод, расширение не применится, и вы узнаете об этом на тестовой базе, а не от пользователей.

Пример: типовая процедура УправлениеФормой прячет дату отгрузки, пока не выбран склад, а логисту поле нужно всегда. Исходный метод — этот же текст без блока #Вставка и строк-инструкций.

// Модуль заимствованной формы ФормаДокумента

&НаКлиентеНаСервереБезКонтекста
&ИзменениеИКонтроль("УправлениеФормой")
Процедура Расш1_УправлениеФормой(Форма)

	Элементы = Форма.Элементы;
	Объект = Форма.Объект;

	Элементы.Контрагент.ТолькоПросмотр = Объект.Проведен;
	Элементы.Склад.ТолькоПросмотр = Объект.Проведен;
	#Удаление
	Элементы.ДатаОтгрузки.Видимость = ЗначениеЗаполнено(Объект.Склад);
	#КонецУдаления
	#Вставка
	// Логисту дата отгрузки нужна всегда, даже без склада.
	Элементы.ДатаОтгрузки.Видимость = Истина;
	ПолеЛогист = Элементы.Найти("Расш1_Логист");
	Если ПолеЛогист <> Неопределено Тогда
		ПолеЛогист.ТолькоПросмотр = Объект.Проведен;
	КонецЕсли;
	#КонецВставки

КонецПроцедуры
  • Директива компиляции перехватчика совпадает с исходной — здесь &НаКлиентеНаСервереБезКонтекста.
  • Строки внутри #Удаление — исходный текст, в итоговом методе их нет.
  • Копируйте метод целиком из актуального релиза. Конфигуратор делает это сам: контекстное меню метода в типовом модуле → «Добавить в расширение» → «ИзменениеИКонтроль».

Подписка на событие в расширении

Подписка не зависит от методов типового модуля: если 1С перепишет ПередЗаписью документа, она продолжит работать, а одна подписка может обслуживать несколько типов объектов. Создайте в расширении общий модуль Расш1_ЛогистикаСервер с флагом «Сервер», периодический регистр сведений Расш1_ИсторияЛогистов (измерение Документ, ресурсы Логист и Автор) и две подписки на события ПередЗаписью и ПриЗаписи с источником ДокументОбъект.РеализацияТоваровУслуг.

// Общий модуль расширения Расш1_ЛогистикаСервер (флаг «Сервер»).
// Подписки с источником ДокументОбъект.РеализацияТоваровУслуг:
// Расш1_ИсторияЛогистаПередЗаписью — событие ПередЗаписью,
// Расш1_ИсторияЛогистаПриЗаписи — событие ПриЗаписи.

Процедура ИсторияЛогистаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

	Если Источник.ОбменДанными.Загрузка Тогда
		Возврат;
	КонецЕсли;

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

КонецПроцедуры

Процедура ИсторияЛогистаПриЗаписи(Источник, Отказ) Экспорт

	Если Отказ Или Источник.ОбменДанными.Загрузка
		Или Не Источник.ДополнительныеСвойства.Свойство("Расш1_ЛогистДоЗаписи") Тогда
		Возврат;
	КонецЕсли;

	Если Источник.ДополнительныеСвойства.Расш1_ЛогистДоЗаписи = Источник.Расш1_Логист Тогда
		Возврат; // логист не менялся
	КонецЕсли;

	// У менеджеров нет прав на регистр истории — пишем в привилегированном режиме.
	УстановитьПривилегированныйРежим(Истина);
	Запись = РегистрыСведений.Расш1_ИсторияЛогистов.СоздатьМенеджерЗаписи();
	Запись.Период = ТекущаяДатаСеанса();
	Запись.Документ = Источник.Ссылка;
	Запись.Логист = Источник.Расш1_Логист;
	Запись.Автор = Пользователи.ТекущийПользователь();
	Запись.Записать();
	УстановитьПривилегированныйРежим(Ложь);

КонецПроцедуры
  • Объект приходит в параметре Источник, остальные параметры — как у события.
  • Старое значение читается в ПередЗаписью и передаётся в ПриЗаписи через ДополнительныеСвойства — история пишется только при реальной смене логиста.
  • Привилегированный режим нужен, чтобы менеджер без прав на регистр мог записать историю. В расширении с включённым безопасным режимом он игнорируется.

Безопасный режим и защита от опасных действий

Оба флага видны в списке расширений в конфигураторе и в форме управления расширениями в 1С:Предприятии.

СвойствоЧто делаетКогда выключать
Безопасный режимПривилегированный режим игнорируется; работа с файлами, COM-объектами, внешними компонентами, запуск программ и обращения к интернет-ресурсам запрещены, если профиль безопасности их не разрешает.Расширению нужны привилегированный режим, файлы или интеграции, а его код вы контролируете.
Защита от опасных действийЕсли расширение работает не в безопасном режиме, пользователь с включённой защитой при входе получает предупреждение безопасности и может отказаться от подключения расширения.Для своих проверенных расширений, чтобы предупреждение не появлялось при каждом запуске.

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

Применение, обновление и «расширение неактивно»

Расширение подключается при старте сеанса: после загрузки новой версии пользователям достаточно перезайти. Загрузить .cfe можно:

  • в конфигураторе — окно «Расширения конфигурации», загрузка из файла, затем F7;
  • в 1С:Предприятии — «Все функции» → «Стандартные» → «Управление расширениями конфигурации», в конфигурациях на БСП — «Администрирование» → «Печатные формы, отчеты и обработки» → «Расширения»;
  • пакетно для многих баз — ключи /LoadCfg Логистика.cfe -Extension Логистика и /UpdateDBCfg -Extension Логистика.

При обновлении типовой сначала обновите копию базы, откройте расширение и выполните синтаксический контроль и проверку возможности применения. Исправьте найденное, увеличьте свойство «Версия» и сохраните .cfe. На рабочей базе обновляется типовая, затем загружается расширение.

Почему расширение неактивно:

  • после обновления типовой оно не проходит проверку: исчез заимствованный объект, реквизит или элемент формы, переименован перехватываемый метод, изменился метод под &ИзменениеИКонтроль;
  • флаг «Активно» снят вручную;
  • пользователь отказался от подключения в предупреждении безопасности;
  • новую версию загрузили, а сеанс не перезапустили.

Состояние удобно проверять из внешней обработки: код внутри неактивного расширения не выполнится.

// Модуль формы внешней обработки. Запускать под пользователем с административными правами.

&НаКлиенте
Процедура Проверить(Команда)
	ПроверитьРасширениеНаСервере("Логистика");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьРасширениеНаСервере(ИмяРасширения)

	Найденные = РасширенияКонфигурации.Получить(Новый Структура("Имя", ИмяРасширения));
	Если Найденные.Количество() = 0 Тогда
		Сообщить(СтрШаблон("Расширение %1 не загружено в базу.", ИмяРасширения));
		Возврат;
	КонецЕсли;

	Расширение = Найденные[0];
	Сообщить(СтрШаблон("%1: активно = %2, безопасный режим = %3",
		Расширение.Имя, Расширение.Активно, Расширение.БезопасныйРежим));

	// Применилось ли расширение в текущем сеансе — видно по метаданным.
	Если Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Найти("Расш1_Логист") = Неопределено Тогда
		Сообщить("В этом сеансе расширение не применено.");
	КонецЕсли;

	Если Расширение.Активно Тогда
		Возврат;
	КонецЕсли;

	Попытка
		Расширение.Активно = Истина;
		Расширение.Записать();
		Сообщить("Расширение включено. Пользователям нужно перезапустить сеансы.");
	Исключение
		// Если расширение не подходит к конфигурации, причина будет в тексте ошибки.
		Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
	КонецПопытки;

КонецПроцедуры
  • РасширенияКонфигурации.Получить читает список из базы, включая неактивные расширения.
  • Реквизит расширения в Метаданные показывает, применилось ли расширение именно в этом сеансе.
  • Если расширение не подходит к конфигурации, запись завершится исключением, и его текст назовёт причину.

Типичные ошибки

  • «Процедура или функция с указанным именем не определена (…)», «Метод объекта не обнаружен (…)» — код расширения вызывает типовой метод, который 1С переименовала или удалила в новом релизе. Найдите замену и поправьте вызов.
  • «Поле объекта не обнаружено (Расш1_Логист)», в запросе — «Поле не найдено "Док.Расш1_Логист"» — отчёт, внешняя обработка или другое расширение обращается к реквизиту, а расширение в этом сеансе не применено.
  • «Нарушение прав доступа!» — нет прав на собственные объекты расширения: константу, регистр, документ. Дайте их в роли расширения или заимствованной типовой роли и назначьте роль пользователям или профилям групп доступа, подробнее — в статье про роли 1С.
  • Предупреждение безопасности при каждом запуске — у расширения без безопасного режима включена «Защита от опасных действий».
  • Отказ в &Перед «не срабатывает» — типовой метод всё равно выполняется, запись отменяется в конце. Если типовой код запускаться не должен, нужен &Вместо.

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

Нужно ли снимать типовую с поддержки, чтобы подключить расширение?

Нет. Расширение хранится отдельно, типовая обновляется штатно, а расширение после каждого обновления проверяют на копии базы.

Когда брать &ИзменениеИКонтроль, а когда &Вместо?

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

Почему у администратора работает, а у пользователя нет?

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

Что будет с данными, если удалить расширение?

Реквизиты и объекты расширения удаляются вместе с данными. Перед удалением сделайте копию базы или перенесите значения в типовые реквизиты.

Когда проще заказать

Если расширение перестало применяться после обновления или доработки нужно перенести в расширение из снятой с поддержки конфигурации, быстрее поручить это программисту, который каждый день работает с типовыми: доработка 1С. Опишите задачу на странице «Разместить задание» — исполнители предложат оценку и сроки.

По теме

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

Станьте частью сообщества!
Войдите или зарегистрируйтесь, и вы сможете участвовать в обсуждениях.


1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.