Что такое расширения конфигурации 1С?
В технологической платформе 1С предусмотрен механизм расширений конфигурации, который позволяет добавлять новый функционал без изменения исходного кода. Это дает возможность:
- Программно добавлять элементы на форму;
- Изменять текст запросов;
- Разрабатывать собственные алгоритмы и решения.
Расширения конфигурации 1С используются для добавления новых объектов (процедур, функций, реквизитов, документов и справочников) либо изменения уже существующих без затрагивания основной конфигурации.
Тип вызова "Вызывать вместо (с контролем)" в 1С
При добавлении процедуры или функции в расширение появляется диалоговое окно выбора типа вызова. “Вызывать вместо (с контролем)” — это усовершенствованный механизм замены кода, появившийся в версии 1С 8.3.15.1489. Он позволяет минимизировать ошибки при обновлении конфигурации, так как обеспечивает контроль изменений.
Особенно полезно использование этой аннотации, если основная конфигурация обновляется достаточно часто, и исходный код основной конфигурации в какой-то момент может стать отличным от того, что в расширении.

Аннотации #ИзменениеИКонтроль, #Вставка и #Удаление
Для корректной работы механизма “Вызывать вместо (с контролем)” используются специальные аннотации:
#ИзменениеИКонтроль
Эта аннотация помогает управлять изменением кода в расширении. После добавления процедуры в расширение её текст копируется из основной конфигурации, и изменения нужно вносить в строгом соответствии с оригиналом. Рассмотрим пример. Ниже – исходная процедура из основной конфигурации, которая настраивает связи параметров выбора для договора.
&НаСервере Процедура НастроитьСвязиДоговора() Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора; МассивСвязей = Новый Массив; СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент"); Если Не ВсеДоговоры Тогда МассивСвязей.Добавить(СвязьПараметровДоговора); КонецЕсли; НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей); Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи; КонецПроцедуры
Добавим ее в расширение, выберем Вызвать вместо (с контролем):


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

Как исправить ошибки при работе с "ИзменениеИКонтроль"
И все же, ошибки случаются. Ниже рассмотрены основные причины:
- Текст процедуры изменен некорректно (лишние пробелы, отступы);
- Не используются аннотации #Вставка и #Удаление;
- Текст не соответствует оригинальной версии из основной конфигурации.
Особый случай - добавление в расширение обработчиков событий

При добавлении процедуры в расширение может появиться диалоговое окно “Метод является обработчиком события”. Оно появляется, если процедура из основной конфигурации связана с обработкой событий. В этом случае 1С предлагает три варианта:
- Да — процедура сохраняет статус обработчика события, но можно выбрать только “Вместо”, Перед” или “После”;
- Нет — процедура больше не считается обработчиком события, но можно использовать “ИзменениеИКонтроль”;
- Отмена — операция добавления процедуры прерывается.
Важно! Настоятельно рекомендую методы-обработчики событий модифицировать именно как обработчики, иначе последствия могут быть слабо предсказуемыми.
Заключение
Теперь вы знаете, как использовать механизм “Вызывать вместо (с контролем)” в 1С, а также работать с аннотациями #ИзменениеИКонтроль, #Вставка, #Удаление. Эти знания помогут вам избежать ошибок при разработке и успешно вносить изменения в конфигурации 1С.
Если статья была полезной — делитесь ею с коллегами и применяйте полученные знания на практике!