Последовательность выполнения расширений

07.12.23

Разработка - Механизмы платформы 1С

Вынес в отдельную статью порядок применения нескольких расширений для одного метода

Актуально для 8.3.15

Виды аннотаций

Порядок работы аннотаций:

  1. &Перед
  2. &Вместо
  3. &ИзменениеИКонтроль
  4. &После

Назначение расширения конфигурации

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

  1. Исправление:
  2. Адаптация;
  3. Дополнение.

Взаимодействие расширений

  • Выполняются перед подписками

    Все расширения обработчика события выполняются до выполнения подписок на это событие.
     
  • В прямом или обратном порядке в зависимости от функции &После или &Перед (относительно списка расширений)

    В случае когда колонки "РИБ", "Назначение" и "Область действия" одинаковы - порядок исполнения программных модулей определяется порядком регистрации расширений в информационной базе расширяемой системы: для &Перед первым используется расширение, которое зарегистрировано последним, для &После - наоборот.
    Ещё раз разверну информацию попонятнее:
    
    - для аннотации "&Перед" - расширения одного метода выполняются в обратном порядке (снизу вверх)
    - для аннотации "&После" - в прямом (сверху вниз)
    
    Порядок же в списке расширений определяется по следующим колонкам:
    а) Расширение передано через РИБ (_MasterNode) - когда информационная база является узлом распределенной информационной базы (значение 0) или расширение создано локально (значение 1).
    б) Назначение (_ExtensionUsePurpose): 0 - исправление, 1 - адаптация, 2 - дополнение
    в) Область действия (_ExtensionScope): 1 - ИнформационнаяБаза, 2 - РазделениеДанных. Расширение конфигурации действует для всей информационной базы или только в области, в которой оно подключено (у общего реквизита свойство Разделение данных установлено в значение Разделять)
    г) порядковый номер расширения (_ExtensionOrder) в таблице , при добавлении устанавливается как max + 1

     

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

    Однако, если в «замещающем» методе расширения есть безусловный вызов метода ПродолжитьВызов(), то одновременное существование нескольких расширений с таким способом расширения вполне допустимо.
 
  Порядок по данным sql profiler

 (с) https://stackoverflow.com/questions/4076516/how-to-profile-for-one-table-in-sql-server

You can't set filter to trace specific table directly.

What you can do is specify a filter for Text Data:

File -> Properties -> Event Selection -> Column Filters -> TextData -> Like -> [Table Name]

You may find it important to wrap your table's name with wildcard characters: "%table name%"

Таким образом установив фильтр %_ExtensionsInfo% по полю TextData при обновлении БД увидим запрос:

SELECT
T1._IDRRef,
T1._ExtensionOrder,
T1._ExtName,
T1._UpdateTime,
T1._ExtensionUsePurpose,
T1._ExtensionScope,
T1._ExtensionZippedInfo,
T1._MasterNode,
T1._UsedInDistributedInfoBase,
T1._Version
FROM dbo._ExtensionsInfo T1
ORDER BY CASE WHEN SUBSTRING(T1._MasterNode, CAST(1.0 AS INT), CAST(34.0 AS INT)) = N'0:00000000000000000000000000000000' THEN 0x01 ELSE 0x00 END, T1._ExtensionUsePurpose, T1._ExtensionScope, T1._ExtensionOrder

где

  {
    "_IDRRef": "0xAE5900505699577411ECF2CE66E9F29D",    - гуид расширения
    "_ExtensionOrder": 7,                               - инкрементный номер добавления
    "_ExtName": "ббб",                                  - имя расширения
    "_UpdateTime": "4022-06-23 15:29:05",               - дата обновления
    "_ExtensionUsePurpose": 1,                          - НазначениеРасширенияКонфигурации
    "_ExtensionScope": 1,                               - ОбластьДействияРасширенияКонфигураци 
    "_ExtensionZippedInfo": "0x42C29A14C86...",
    "_MasterNode": "0:00000000000000000000000000000000",- главный узел распределённой ИБ: ПланОбменаСсылка
    "_UsedInDistributedInfoBase": "0x00",               - используется в распределённой ИБ
    "_Version": "0x0000000156FF48FB"
  }

 

из которого вытекает порядок: _    таблица _ExtensionsInfo

а) Расширение передано через РИБ (_MasterNode) - когда информационная база является узлом распределенной информационной базы (значение 0) или расширение создано локально (значение 1).
б) Назначение (_ExtensionUsePurpose): 0 - исправление, 1 - адаптация, 2 - дополнение
в) Область действия (_ExtensionScope): 1 - ИнформационнаяБаза, 2 - РазделениеДанных. Расширение конфигурации действует для всей информационной базы или только в области, в которой оно подключено (у общего реквизита свойство Разделение данных установлено в значение Разделять)
г) порядковый номер расширения (_ExtensionOrder) в таблице , при добавлении устанавливается как max + 1

 

Картинка для пункта В:

Картинка для пункта А:

Поясняющая картинка:

 
Информация с ИТС

 

Вывод: в каком порядке вы видите расширения в конфигураторе, в таком они и применяются :P

(07.12.23) Аннотация ИзменениеИКонтроль

Данный способ расширения позволяет точечно изменять текст расширяемого модуля с помощью директив препроцессора #Вставка … #КонецВставки и #Удаление … #КонецУдаления

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

Последовательность порядок применения выполнения расширений

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4627    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5313    YA_418728146    25    

64

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6441    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18509    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12115    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8852    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6290    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16024    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. ХамитоваРайса 25.06.22 10:40 Сейчас в теме
Классно расписано! Спасибо большое)
2. AndreyCh75 25.06.22 12:07 Сейчас в теме
3. triviumfan 93 28.06.22 09:46 Сейчас в теме
Грамотно оформил. Плюс поставил, хотя до сих пор считаю, что расширения - морок :)
ybatiaev; Sardukar; +2 Ответить
4. Zigor1964 15.07.22 12:15 Сейчас в теме
Спасибо большое.
Только не понял , как номер расширения узнать, если их 4 штуки ?
5. kuzyara 1902 26.07.22 11:47 Сейчас в теме
(4) поле _ExtensionOrder в таблице _ExtensionsInfo
SEL ECT
T1._IDRRef,
T1._ExtensionOrder,
T1._ExtName,
T1._UpdateTime
FR OM dbo._ExtensionsInfo T1
Прикрепленные файлы:
mcgoblin; +1 Ответить
6. Profenix 17 07.12.22 12:38 Сейчас в теме
Странно у меня есть расширение одно с назначением "дополнение" затем идет заплатка с "исправление" и у обоих процедура &Перед но выполняется "дополнение" и все тут.
7. kuzyara 1902 08.12.22 09:56 Сейчас в теме
(6) разобрался. Для "Перед" выполнение идет в обратном порядке(снизу вверх). Дополнил статью.
ybatiaev; ansverrr; Profenix; +3 Ответить
8. ybatiaev 58 31.08.23 16:25 Сейчас в теме
Добрый день! Вот у меня есть вопрос тоже но по ПроцедураФункции ПродолжитьВызов()

&Вместо("СформироватьДвиженияСторноНаСервере")
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
	// ... наш код... // это типа &Перед?
	ПродолжитьВызов();  // затем выполняется типовой код
КонецПроцедуры

&Вместо("СформироватьДвиженияСторноНаСервере")
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
	ПродолжитьВызов();  // сначала выполняется типовой код
	// ... наш код... // это типа &После?
КонецПроцедуры

&Вместо("СформироватьДвиженияСторноНаСервере")
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
	// ... наш код... // это типа &Вместо?  // тут выполняется только наш код
КонецПроцедуры


&Вместо("СформироватьДвиженияСторноНаСервере")
Процедура Расш1_СформироватьДвиженияСторноНаСервере()
	// ... наш код... // это типа &Перед?
	ПродолжитьВызов(); // тут выполняется типовой код
	// ... наш код... // это типа &После?
КонецПроцедуры
Показать

Всё верно понял?
9. kuzyara 1902 07.09.23 06:57 Сейчас в теме
(8) верно, но на практике самый распространённый вариант - 3
ybatiaev; +1 Ответить
10. sulfur17 59 13.10.23 20:45 Сейчас в теме
Хорошая статья, но обойден вниманием ИзменениеИКонтроль.
Я вот выяснил что Вместо приоритетнее чем ИзменениеИКонтроль, независимо от порядка применения расширений
11. kuzyara 1902 07.12.23 20:46 Сейчас в теме
(10) всё верно.

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

Дополнил статью наглядной картинкой.
Student1C; user990914; sulfur17; +3 Ответить
Оставьте свое сообщение