В данной статье рассмотрен синтаксис и применение аннотации ИзменениеИКонтроль в расширениях конфигурации 1С, а также некоторые возможные ошибки и способы их исправления.
Что такое расширения конфигурации 1С?
В технологической платформе 1С предусмотрен механизм расширений конфигурации, который позволяет добавлять новый функционал без изменения исходного кода. Это дает возможность:
- Программно добавлять элементы на форму;
- Изменять текст запросов;
- Разрабатывать собственные алгоритмы и решения.
Расширения конфигурации 1С используются для добавления новых объектов (процедур, функций, реквизитов, документов и справочников) либо изменения уже существующих без затрагивания основной конфигурации.
Тип вызова "Вызывать вместо (с контролем)" в 1С
При добавлении процедуры или функции в расширение появляется диалоговое окно выбора типа вызова. «Вызывать вместо (с контролем)» — это усовершенствованный механизм замены кода, появившийся в версии 1С 8.3.15.1489. Он позволяет минимизировать ошибки при обновлении конфигурации, так как обеспечивает контроль изменений.
Особенно полезно использование этой аннотации, если основная конфигурация обновляется достаточно часто, и исходный код основной конфигурации в какой-то момент может стать отличным от того, что в расширении.
Аннотации #ИзменениеИКонтроль, #Вставка и #Удаление
Для корректной работы механизма «Вызывать вместо (с контролем)» используются специальные аннотации:
#ИзменениеИКонтроль
Эта аннотация помогает управлять изменением кода в расширении. После добавления процедуры в расширение её текст копируется из основной конфигурации, и изменения нужно вносить в строгом соответствии с оригиналом. Рассмотрим пример. Ниже — исходная процедура из основной конфигурации, которая настраивает связи параметров выбора для договора.
&НаСервере Процедура НастроитьСвязиДоговора() Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора; МассивСвязей = Новый Массив; СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент"); Если Не ВсеДоговоры Тогда МассивСвязей.Добавить(СвязьПараметровДоговора); КонецЕсли; НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей); Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи; КонецПроцедуры
Добавим ее в расширение, выберем Вызвать вместо (с контролем):
#Вставка и #КонецВставки в 1С
Эта управляющая конструкция в расширении используется для того чтобы добавлять новые строки кода внутри расширяемого метода. Попытка вставить код без этих аннотаций приведет к ошибке.
Правильно:
&НаСервере &ИзменениеИКонтроль("НастроитьСвязиДоговора") Процедура Расш1_НастроитьСвязиДоговора() Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора; МассивСвязей = Новый Массив; СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент"); Если Не ВсеДоговоры Тогда МассивСвязей.Добавить(СвязьПараметровДоговора); КонецЕсли; НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей); Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи; #Вставка //ВестиЛогирование - служебный реквизит, используется для вывода отладочных сообщений Если ВестиЛогирование Тогда Сообщить("Обновлены связи договора"); КонецЕсли; #КонецВставки КонецПроцедуры
Неправильно (добавленный код находится вне аннотаций #Вставка):
&НаСервере &ИзменениеИКонтроль("НастроитьСвязиДоговора") Процедура Расш1_НастроитьСвязиДоговора() Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора; МассивСвязей = Новый Массив; СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент"); Если Не ВсеДоговоры Тогда МассивСвязей.Добавить(СвязьПараметровДоговора); КонецЕсли; НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей); Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи; //ВестиЛогирование - служебный реквизит, используется для вывода отладочных сообщений ВестиЛогирование = Истина; #Вставка Если ВестиЛогирование Тогда Сообщить("Обновлены связи договора"); КонецЕсли; #КонецВставки КонецПроцедуры
#Удаление и #КонецУдаления в расширении
Эти аннотации используются, если необходимо исключить часть кода из основной конфигурации. Рассмотрим пример — мы хотим отказаться от настройки связей. Правильно — с использованием аннотации #Удаление.
&НаСервере &ИзменениеИКонтроль("НастроитьСвязиДоговора") Процедура Расш1_НастроитьСвязиДоговора() #Удаление Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора; МассивСвязей = Новый Массив; СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент"); Если Не ВсеДоговоры Тогда МассивСвязей.Добавить(СвязьПараметровДоговора); КонецЕсли; НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей); Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи; #КонецУдаления КонецПроцедуры
Неправильно — в модуле под аннотацией #Удалить находится код, которого нет в исходном модуле в основной конфигурации:
&НаСервере &ИзменениеИКонтроль("НастроитьСвязиДоговора") Процедура Расш1_НастроитьСвязиДоговора() Перем МассивСвязей, НовыеСвязи, СвязьПараметровДоговора; МассивСвязей = Новый Массив; СвязьПараметровДоговора = Новый СвязьПараметраВыбора("Отбор.Контрагент", "Объект.Контрагент"); Если Не ВсеДоговоры Тогда МассивСвязей.Добавить(СвязьПараметровДоговора); КонецЕсли; НовыеСвязи = Новый ФиксированныйМассив(МассивСвязей); Элементы.Договор.СвязиПараметровВыбора = НовыеСвязи; #Удаление Сообщить("Этого кода в тексте основной процедуры нет!"); #КонецУдаления КонецПроцедуры
Как проверить работоспособность расширения в 1С
Предположим, что мы добавили метод в расширение, внесли правки — что-то добавили, что-то удалили, и теперь хотим проверить, что наше расширение корректно работает. Для этого нужно сделать следующее:
- Откройте меню «Конфигурация» в конфигураторе.
- Перейдите в раздел «Расширения конфигурации».
- Кликните правой кнопкой мыши в любом месте окна расширений, и выберите «Проверка возможности применения всех расширений».
- В разделе «Служебные сообщения» появится «Проблем применения не обнаружено». Если есть ошибки, придется идти их исправлять, разбираться, и повторно проверять применение расширения. Например, мы неправильно использовали аннотации #Удаление и #КонецУдаления. В окне ошибок увидим примерно такой текст:
Как исправить ошибки при работе с "ИзменениеИКонтроль"
И все же, ошибки случаются. Ниже рассмотрены основные причины:
- Текст процедуры изменен некорректно (лишние пробелы, отступы);
- Не используются аннотации #Вставка и #Удаление;
- Текст не соответствует оригинальной версии из основной конфигурации.
Особый случай - добавление в расширение обработчиков событий
При добавлении процедуры в расширение может появиться диалоговое окно «Метод является обработчиком события». Оно появляется, если процедура из основной конфигурации связана с обработкой событий. В этом случае 1С предлагает три варианта:
- Да — процедура сохраняет статус обработчика события, но можно выбрать только «Вместо», Перед» или «После»;
- Нет — процедура больше не считается обработчиком события, но можно использовать «ИзменениеИКонтроль»;
- Отмена — операция добавления процедуры прерывается.
Важно! Настоятельно рекомендую методы-обработчики событий модифицировать именно как обработчики, иначе последствия могут быть слабо предсказуемыми.
Заключение
Теперь вы знаете, как использовать механизм «Вызывать вместо (с контролем)» в 1С, а также работать с аннотациями #ИзменениеИКонтроль, #Вставка, #Удаление. Эти знания помогут вам избежать ошибок при разработке и успешно вносить изменения в конфигурации 1С.
Если статья была полезной — делитесь ею с коллегами и применяйте полученные знания на практике!
Сэкономь часы на дебаге 1C!
Скачай PDF с топ-11 ошибок начинающих разработчиков + файл с примерами кода!