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