Перехваты 1С - контроль расширений после обновления типовой конфигурации
Лицензии
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Обновление типовой прошло успешно. Пользователь заходит в «Обмен электронными документами» — и получает:
Ошибка применения расширения конфигурации. Имя: Расширение3

Никто ничего не менял. Просто поставщик переписал подсистему, а ваши перехваты остались в том виде, в котором их писали год назад. Платформа об этом не сообщает: модули компилируются лениво, ошибка появляется в момент обращения к функциональности.
Решение отвечает на три вопроса до того, как начнутся звонки:
- Какие перехваты устарели после обновления.
- Что именно изменилось в методе.
- Как должен выглядеть перехват под новую версию — готовый текст.
Три выгрузки
Обычное сравнение «расширение против типовой» ломается на доработанных базах: в отчёт попадают ваши же изменения, и непонятно, где поставщик, а где вы.
Поэтому выгрузок три:
| Выгрузка | Что это |
|---|---|
| Исходная | ваша конфигурация до обновления, со всеми доработками |
| Текущая | она же после обновления |
| Расширения | выгрузки расширений, можно указать родительский каталог |

Проверено на практике
Это не «инструмент, который что-то показывает». Мы прогнали полный цикл на реальной базе УНФ 3.0.14:
- Расширения с перехватами, написанными под 3.0.12, установлены в базу 3.0.14 — инструмент показал по ним «Расходится» и «Метод удалён».
- Предложенные файлы перенесены в расширения — без правок руками.
- Расширения пересобраны и загружены в ту же базу.
- Повторный прогон: статус «Совпадает» по всем исправленным перехватам.
Цикл «нашли проблему → получили готовый текст → применили → проверили» замкнут.

Пример А. Один блок: метод переписан целиком
Реальный перехват ПередПериодическойОтправкойДанныхКлиентаНаСервер, написанный под 3.0.12. В 3.0.14 поставщик заменил логику и добавил Экспорт.
До (расширение на 3.0.12):
&ИзменениеИКонтроль("ПередПериодическойОтправкойДанныхКлиентаНаСервер")
Процедура Расш3_ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры)
#Удаление
Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
ПараметрыОжидания = ПараметрыОжидания();
Если ПараметрыОжидания.Включено = Ложь
Или Не ПериодОжиданияЗавершен(ПараметрыОжидания.ДатаПолучения) Тогда
Возврат;
КонецЕсли;
ПараметрыСобытия = НовыеПараметрыСобытияПередПолучением();
Оповестить(ИмяСобытияПередПолучением(), ПараметрыСобытия);
Если Не ПараметрыСобытия.ЕстьОткрытыеФормы Тогда
Возврат;
КонецЕсли;
Если ПараметрыОжидания.Включено = Неопределено
И ИнтеграцияБСПБЭДКлиентСервер.УведомленияКлиентаДоступны() Тогда
МенеджерУведомлений = Вычислить("УведомленияКлиента");
Обработчик = Новый ОписаниеОповещения("ОповеститьОПолученииЭДО", АвтоматическоеПолучениеЭДОКлиент);
//@skip-check dynamic-access-method-not-found
МенеджерУведомлений.ПодключитьОбработчик(
АвтоматическоеПолучениеЭДОКлиентСервер.КлючУведомленийКлиента(), Обработчик);
ПараметрыОжидания.ИспользоватьУведомленияКлиента = Истина;
КонецЕсли;
ПараметрыОжидания.ДатаПолучения = ОбщегоНазначенияКлиент.ДатаСеанса();
ПараметрыОтправки = НовыеПараметрыПериодическойОтправкиДанных();
ПараметрыОтправки.Включено = ПараметрыОжидания.Включено;
ПараметрыОтправки.ИспользоватьУведомленияКлиента = ПараметрыОжидания.ИспользоватьУведомленияКлиента;
Параметры.Вставить(АвтоматическоеПолучениеЭДОКлиентСервер.КлючПараметраПериодическойОтправкиДанных(),
ПараметрыОтправки);
#КонецУдаления
#Вставка
// Доработка расширения: отметка о вызове (клиентский модуль, без серверных вызовов)
ПерехватВыполнен = Истина;
#КонецВставки
КонецПроцедуры
После (сгенерировано инструментом под 3.0.14):
&ИзменениеИКонтроль("ПередПериодическойОтправкойДанныхКлиентаНаСервер")
Процедура Расш3_ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры) Экспорт
#Удаление
Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
ПараметрыОжидания = ПараметрыОжидания();
Если ПараметрыОжидания.Включено = Ложь
Или Не ПериодОжиданияЗавершен(ПараметрыОжидания.ДатаПолучения) Тогда
Возврат;
КонецЕсли;
Если ПараметрыОжидания.Включено = Истина Тогда
ПараметрыСобытия = НовыеПараметрыСобытияПередПолучением();
Оповестить(ИмяСобытияПередПолучением(), ПараметрыСобытия);
Если Не ПараметрыСобытия.ЕстьОткрытыеФормы Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Если ПараметрыОжидания.Включено = Неопределено
И ИнтеграцияБСПБЭДКлиентСервер.УведомленияКлиентаДоступны() Тогда
МенеджерУведомлений = Вычислить("УведомленияКлиента");
Обработчик = Новый ОписаниеОповещения("ОповеститьОПолученииЭДО", АвтоматическоеПолучениеЭДОКлиент);
//@skip-check dynamic-access-method-not-found
МенеджерУведомлений.ПодключитьОбработчик(
АвтоматическоеПолучениеЭДОКлиентСервер.КлючУведомленийКлиента(), Обработчик);
ПараметрыОжидания.ИспользоватьУведомленияКлиента = Истина;
КонецЕсли;
ПараметрыОжидания.ДатаПолучения = ОбщегоНазначенияКлиент.ДатаСеанса();
ПараметрыОтправки = НовыеПараметрыПериодическойОтправкиДанных();
ПараметрыОтправки.Включено = ПараметрыОжидания.Включено;
ПараметрыОтправки.ИспользоватьУведомленияКлиента = ПараметрыОжидания.ИспользоватьУведомленияКлиента;
Параметры.Вставить(АвтоматическоеПолучениеЭДОКлиентСервер.КлючПараметраПериодическойОтправкиДанных(),
ПараметрыОтправки);
#КонецУдаления
#Вставка
// Доработка расширения: отметка о вызове (клиентский модуль, без серверных вызовов)
ПерехватВыполнен = Истина;
#КонецВставки
КонецПроцедуры
Пример Б. Два блока: структура сохраняется
Тот же метод, но перехват разрезан на два фрагмента, и вторая вставка использует переменную из первой. Порядок менять нельзя.
До:
&ИзменениеИКонтроль("ПередПериодическойОтправкойДанныхКлиентаНаСервер")
Процедура Расш7_ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры)
#Удаление
Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
ПараметрыОжидания = ПараметрыОжидания();
Если ПараметрыОжидания.Включено = Ложь
Или Не ПериодОжиданияЗавершен(ПараметрыОжидания.ДатаПолучения) Тогда
Возврат;
КонецЕсли;
#КонецУдаления
#Вставка
ПараметрыДляЛога = "вставка-1";
#КонецВставки
#Удаление
ПараметрыСобытия = НовыеПараметрыСобытияПередПолучением();
Оповестить(ИмяСобытияПередПолучением(), ПараметрыСобытия);
Если Не ПараметрыСобытия.ЕстьОткрытыеФормы Тогда
Возврат;
КонецЕсли;
Если ПараметрыОжидания.Включено = Неопределено
И ИнтеграцияБСПБЭДКлиентСервер.УведомленияКлиентаДоступны() Тогда
МенеджерУведомлений = Вычислить("УведомленияКлиента");
Обработчик = Новый ОписаниеОповещения("ОповеститьОПолученииЭДО", АвтоматическоеПолучениеЭДОКлиент);
//@skip-check dynamic-access-method-not-found
МенеджерУведомлений.ПодключитьОбработчик(
АвтоматическоеПолучениеЭДОКлиентСервер.КлючУведомленийКлиента(), Обработчик);
ПараметрыОжидания.ИспользоватьУведомленияКлиента = Истина;
КонецЕсли;
ПараметрыОжидания.ДатаПолучения = ОбщегоНазначенияКлиент.ДатаСеанса();
ПараметрыОтправки = НовыеПараметрыПериодическойОтправкиДанных();
ПараметрыОтправки.Включено = ПараметрыОжидания.Включено;
ПараметрыОтправки.ИспользоватьУведомленияКлиента = ПараметрыОжидания.ИспользоватьУведомленияКлиента;
Параметры.Вставить(АвтоматическоеПолучениеЭДОКлиентСервер.КлючПараметраПериодическойОтправкиДанных(),
ПараметрыОтправки);
#КонецУдаления
#Вставка
Сообщить("Лог: " + ПараметрыДляЛога);
#КонецВставки
КонецПроцедуры
После:
&ИзменениеИКонтроль("ПередПериодическойОтправкойДанныхКлиентаНаСервер")
Процедура Расш7_ПередПериодическойОтправкойДанныхКлиентаНаСервер(Параметры) Экспорт
#Удаление
Если Не ОбщегоНазначенияКлиент.ДоступноИспользованиеРазделенныхДанных() Тогда
Возврат;
КонецЕсли;
ПараметрыОжидания = ПараметрыОжидания();
Если ПараметрыОжидания.Включено = Ложь
Или Не ПериодОжиданияЗавершен(ПараметрыОжидания.ДатаПолучения) Тогда
Возврат;
КонецЕсли;
#КонецУдаления
#Вставка
ПараметрыДляЛога = "вставка-1";
#КонецВставки
#Удаление
Если ПараметрыОжидания.Включено = Истина Тогда
ПараметрыСобытия = НовыеПараметрыСобытияПередПолучением();
Оповестить(ИмяСобытияПередПолучением(), ПараметрыСобытия);
Если Не ПараметрыСобытия.ЕстьОткрытыеФормы Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Если ПараметрыОжидания.Включено = Неопределено
И ИнтеграцияБСПБЭДКлиентСервер.УведомленияКлиентаДоступны() Тогда
МенеджерУведомлений = Вычислить("УведомленияКлиента");
Обработчик = Новый ОписаниеОповещения("ОповеститьОПолученииЭДО", АвтоматическоеПолучениеЭДОКлиент);
//@skip-check dynamic-access-method-not-found
МенеджерУведомлений.ПодключитьОбработчик(
АвтоматическоеПолучениеЭДОКлиентСервер.КлючУведомленийКлиента(), Обработчик);
ПараметрыОжидания.ИспользоватьУведомленияКлиента = Истина;
КонецЕсли;
ПараметрыОжидания.ДатаПолучения = ОбщегоНазначенияКлиент.ДатаСеанса();
ПараметрыОтправки = НовыеПараметрыПериодическойОтправкиДанных();
ПараметрыОтправки.Включено = ПараметрыОжидания.Включено;
ПараметрыОтправки.ИспользоватьУведомленияКлиента = ПараметрыОжидания.ИспользоватьУведомленияКлиента;
Параметры.Вставить(АвтоматическоеПолучениеЭДОКлиентСервер.КлючПараметраПериодическойОтправкиДанных(),
ПараметрыОтправки);
#КонецУдаления
#Вставка
Сообщить("Лог: " + ПараметрыДляЛога);
#КонецВставки
КонецПроцедуры
Обратите внимание: блоков #Удаление осталось два, вставка ПараметрыДляЛога = "вставка-1"; по-прежнему между фрагментами, а Сообщить(...) — после второго. При этом во втором типовом фрагменте появился новый блок поставщика Если ПараметрыОжидания.Включено = Истина.
Пример В. Доработка, на которую опиралось расширение, исчезла
Расширение вызывает метод, который вы сами добавили в доработанную конфигурацию, а в новой версии доработку не перенесли.
| Расширение | Метод | Директива | Статус | Замечание |
|---|---|---|---|---|
| Расш6_Доработка | АвтоматическоеПолучениеЭДО.ПечатьКомплектаСИЗ | Вызов | Метод исчез | Вызывался в расширении, в текущей конфигурации отсутствует |
Расширение при этом устанавливается и компилируется. Ошибка проявится только в работе.
CLI для CI/CD
В поставку входит консольная утилита PerehvatyCli.exe с исходным кодом — для автоматической проверки расширений в конвейере, а не руками перед релизом.
PerehvatyCli.exe --source C:\dumps\old --current C:\dumps\new ^
--ext "C:\dumps\extensions" --out report.csv
Полный комплект УНФ (две выгрузки, ~3 ГБ, 130 тыс. файлов) — около 30 секунд.
Важно. Утилита предоставляется «как есть», без гарантий, и запускается на ваш страх и риск. Она только читает выгрузки и пишет один CSV, исходный код приложен.
Честно об ограничениях
- Ничего не меняет в базе и расширениях: читает выгрузки, пишет CSV и файлы в папку
Предложено. - Не запускает никаких программ и не пишет во временные каталоги — только средствами 1С.
- Читает только нужные модули (десятки файлов), а не десятки тысяч.
- Только Designer XML, EDT-выгрузки — в планах.
- Не заменяет Конфигуратор: перенести перехват и пересобрать
.cfe— вручную.
Характеристики
| Параметр | Значение |
|---|---|
| Тип | Расширение конфигурации (.cfe) |
| Платформа | 1С 8.3.24 и выше (проверено на 8.5.1 x64) |
| Конфигурации | БСП-совместимые: УНФ 3.0 (проверено), УТ 11, БП 3.0, ERP 2.5, КА 2.5 |
| Выгрузки | три каталога Designer XML |
| Изменения в базе | Нет |
| Лицензия |
Бессрочная, одна организация |
Вопросы и ответы
Нужно ли публиковать базу или давать права администратора?
Нет. Работа идёт с выгрузками в файлы.
Он сам исправит расширение?
Готовит файл перехвата в папке Предложено. Перенос и пересборку .cfe делаете вы — осознанное ограничение.
Что если расширений несколько?
Укажите родительский каталог — обработает все за один прогон.
Есть ли ограничения по числу модулей?
Нет. Полная версия без демо-режимов.
Буду рад любой обратной связи, пишите предложения, обсудим.
Проверено на следующих конфигурациях и релизах:
- 1С:Библиотека стандартных подсистем, редакция 3.1, релизы 3.1.12.362
Вступайте в нашу телеграмм-группу Инфостарт