Как сравнить расширение с конфигурацией 1С 8.3 и найти все подписки и движения документа
В 1С:Предприятие 8.3 логика проведения документа распределена по трём точкам: собственный модуль объекта, обработчики в коллекциях Метаданные.ПодпискиНаСобытия (как основной конфигурации, так и расширений) и перехваты процедур в расширениях с аннотациями &Перед, &После, &Вместо и &ИзменениеИКонтроль.
Чтобы увидеть отличия расширения от типовой базы в Конфигураторе, откройте дерево расширения и выполните Конфигурация → Сравнить, объединить с конфигурацией из файла / ИБ либо запустите Проверка возможности применения расширений конфигурации. Программно на сервере список подключённых расширений и ошибки их применения получают через глобальный менеджер РасширенияКонфигурации.Получить() и ПроверитьВозможностьПримененияВсех(), а перечень подписок и регистров конкретного документа — через Метаданные.ПодпискиНаСобытия и Метаданные.Документы.<Имя>.Движения.
Где искать доработки: три места, влияющие на запись и проведение документа
В современных типовых конфигурациях (1С:ERP, КА 2, УТ 11, БП 3.0, ЗУП 3.1) прямое редактирование модуля объекта со снятием с поддержки используется редко. Если при записи или проведении документа меняются реквизиты, добавляются нестандартные движения по регистрам или возникает исключение, точка входа обычно находится в одном из трёх механизмов платформы:
- Заимствованные модули и объекты в расширениях (
.cfe) — процедуры в общих модулях, модуле объекта или модуле менеджера документа, перехваченные директивами&Перед("ИмяПроцедуры"),&После("ИмяПроцедуры"),&Вместо("ИмяПроцедуры")или&ИзменениеИКонтроль("ИмяПроцедуры"). - Подписки на события (
Метаданные.ПодпискиНаСобытия) — обработчики событийПередЗаписью,ПриЗаписи,ОбработкаПроведения,ОбработкаУдаленияПроведенияиОбработкаПроверкиЗаполнения. Подписка может быть настроена как на конкретный документ (например,ДокументОбъект.РеализацияТоваровУслуг), так и на определяемый тип или все документы сразу (типДокументОбъект), а также добавлена собственным объектом внутри расширения. - Подписки на наборы записей регистров — когда сам документ формирует стандартный набор записей в коллекции
Движения, а модификация сумм или субконто происходит в подписке на событиеПередЗаписьюилиПриЗаписиконкретного регистра накопления, сведений или бухгалтерии.
Сравнение и объединение конфигураций в 1С 8.3: как сравнить расширение с основной базой
Штатное окно Сравнение, объединение конфигураций в Конфигураторе применяется в двух разных сценариях: при обновлении доработанной конфигурации и при ревизии расширений (.cfe). Чтобы проанализировать состав расширения и его расхождения с основной конфигурацией:
- Откройте список Конфигурация → Расширения конфигурации, выберите нужное расширение и откройте его дерево метаданных двойным щелчком по колонке «Конфигурация».
- Для быстрой фильтрации дерева расширения включите отбор по подсистеме или фильтр заимствованных объектов: у каждого объекта и реквизита в свойствах заполнено поле
ПринадлежностьОбъекта(значенияСобственныйилиЗаимствованный). - Чтобы сверить заимствованные методы с обновлённым релизом поставщика, выполните в меню окна расширения Конфигурация → Проверка возможности применения расширений конфигурации. Платформа проверит совпадение сигнатур всех процедур с аннотациями
&Перед,&После,&Вместои контролируемые участки кода внутри#Вставка ... #КонецВставкии#Удаление ... #КонецУдалениядля&ИзменениеИКонтроль. - Для построчного сравнения двух версий одного расширения (например, из тестовой и рабочей базы) выгрузите расширение в файл
.cfeи в окне открытого расширения выберите Конфигурация → Сравнить, объединить с конфигурацией из файла....
| Режим сравнения / объединения и директива | Назначение в 1С 8.3 | На что обратить внимание при диагностике и обновлении |
|---|---|---|
&Перед("ИмяМетода") / &После("ИмяМетода") |
Выполняет код расширения до или после штатной процедуры типового модуля без замены её текста | При объединении нескольких расширений порядок вызова зависит от порядка загрузки расширений в базе; не позволяет изменить возвращаемое значение функции. |
&Вместо("ИмяМетода") |
Полностью замещает типовую процедуру или функцию; продолжение штатного кода вызывается инструкцией ПродолжитьВызов(...) |
Самая частая причина «пропавших» типовых движений: если в расширении забыли вызвать ПродолжитьВызов, код основной конфигурации и ранее подключённых расширений не выполнится. |
&ИзменениеИКонтроль("ИмяМетода") |
Копирует текст типового метода в расширение с разметкой правок препроцессором #Вставка и #Удаление |
При обновлении типовой конфигурации платформа сравнивает исходный текст метода вне тегов препроцессора с новым релизом; при любом изменении типового кода расширение перестаёт применяться до актуализации метода. |
| Режим объединения Взять из файла / Объединить | Управляет переносом свойств, форм, макетов и модулей в окне «Сравнение, объединение» | Для модулей и коллекций (подсистемы, роли, источники подписок) режим «Взять из файла» затирает локальные доработки; используйте «Объединить с приоритетом» и проверяйте фильтр «Показывать только дважды изменённые свойства». |
Программная проверка подключённых расширений и ошибок их применения
В рабочей базе 1С (в том числе во фреше или на сервере без доступа к Конфигуратору) список всех установленных расширений, их статус активности, безопасный режим и диагностику проблем применения можно получить программно на сервере через свойство глобального контекста РасширенияКонфигурации (тип МенеджерРасширенийКонфигурации).
У каждого объекта метаданных в платформе 8.3 также есть два встроенных метода для анализа влияния расширений в текущем сеансе:
ОбъектМетаданных.ЕстьИзмененияРасширениямиКонфигурации()— возвращаетИстина, если сам объект (например, документ или общий модуль) или любой его дочерний элемент изменён или дополнен активными расширениями в текущем сеансе.ОбъектМетаданных.РасширениеКонфигурации()— возвращает объектРасширениеКонфигурации, которым данный собственный объект был добавлен в базу, либоНеопределено, если объект принадлежит основной конфигурации.
&НаСервере
Функция ПроверитьРасширенияИИзмененияДокумента(ИмяДокумента)
Результат = Новый Структура;
// 1. Получаем все расширения в информационной базе
МассивРасширений = РасширенияКонфигурации.Получить();
// 2. Проверяем конфликты сигнатур и директив &ИзменениеИКонтроль
ПроблемыПрименения = РасширенияКонфигурации.ПроверитьВозможностьПримененияВсех();
СписокПроблем = Новый Массив;
Для Каждого Проблема Из ПроблемыПрименения Цикл
СписокПроблем.Добавить(Новый Структура(
"Расширение, Важность, Описание",
Проблема.Расширение.Имя,
Строка(Проблема.Важность),
Проблема.Описание
));
КонецЦикла;
// 3. Проверяем, затронут ли целевой документ активными расширениями
МетаДокумента = Метаданные.Документы[ИмяДокумента];
ИзмененРасширением = МетаДокумента.ЕстьИзмененияРасширениямиКонфигурации();
АвторРасширение = МетаДокумента.РасширениеКонфигурации();
Результат.Вставить("ВсегоРасширений", МассивРасширений.Количество());
Результат.Вставить("ПроблемыПрименения", СписокПроблем);
Результат.Вставить("ДокументИзмененРасширениями", ИзмененРасширением);
Результат.Вставить("ДобавленРасширением",
?(АвторРасширение = Неопределено, "", АвторРасширение.Имя));
Возврат Результат;
КонецФункции
Структура с ключами УникальныйИдентификатор или Имя (по умолчанию Неопределено — все расширения)ИсточникРасширенийКонфигурации (по умолчанию БазаДанных)Как найти все подписки на события документа (включая подписки из расширений)
В Конфигураторе сгруппировать подписки по конкретному документу можно через окно Конфигурация → Подписки на события. Однако в крупных конфигурациях на базе БСП таких подписок сотни, причём многие из них привязаны не к одному документу, а к составному списку типов или ко всем документам сразу (через обобщённый тип ДокументОбъект). Кроме того, подписки из расширений лежат в отдельных деревьях метаданных каждого расширения.
При программном обходе коллекции Метаданные.ПодпискиНаСобытия в режиме 1С:Предприятие платформа возвращает единую коллекцию подписок — как из основной конфигурации, так и добавленных активными расширениями. У объекта ОбъектМетаданных: ПодпискаНаСобытие свойство Источник имеет тип ОписаниеТипов. Поэтому для точного отбора нужно проверить два типа через метод ОписаниеТипов.СодержитТип():
- конкретный объектный тип документа —
Тип("ДокументОбъект." + ИмяДокумента); - обобщённый тип всех документов конфигурации —
Тип("ДокументОбъект")(на него в БСП вешаются универсальные подписки версионирования, запрета изменения дат, регистрации в планах обмена и заполнения реквизитов).
&НаСервере
Функция НайтиПодпискиНаСобытияДокумента(ИмяДокумента)
ТаблицаПодписок = Новый ТаблицаЗначений;
ТаблицаПодписок.Колонки.Добавить("ИмяПодписки", Новый ОписаниеТипов("Строка"));
ТаблицаПодписок.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
ТаблицаПодписок.Колонки.Добавить("ВидПривязки", Новый ОписаниеТипов("Строка"));
ТаблицаПодписок.Колонки.Добавить("Расширение", Новый ОписаниеТипов("Строка"));
ТипКонкретногоДокумента = Тип("ДокументОбъект." + ИмяДокумента);
ТипВсехДокументов = Тип("ДокументОбъект");
Для Каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл
ЕстьТочноеСовпадение = Подписка.Источник.СодержитТип(ТипКонкретногоДокумента);
НаВсеДокументы = Подписка.Источник.СодержитТип(ТипВсехДокументов);
Если НЕ ЕстьТочноеСовпадение И НЕ НаВсеДокументы Тогда
Продолжить;
КонецЕсли;
СтрокаТЗ = ТаблицаПодписок.Добавить();
СтрокаТЗ.ИмяПодписки = Подписка.Имя;
СтрокаТЗ.Синоним = Подписка.Синоним;
СтрокаТЗ.ВидПривязки = ?(ЕстьТочноеСовпадение, "По виду документа", "На все документы");
РасширениеАвтор = Подписка.РасширениеКонфигурации();
СтрокаТЗ.Расширение = ?(РасширениеАвтор = Неопределено,
"Основная конфигурация",
РасширениеАвтор.Имя);
КонецЦикла;
Возврат ТаблицаПодписок;
КонецФункции
Тип — проверяемый тип (например, Тип("ДокументОбъект.РеализацияТоваровУслуг"))Обратите внимание на важную особенность платформы 1С 8.3: согласно синтакс-помощнику, у объекта ОбъектМетаданных: ПодпискаНаСобытие свойства Событие и Обработчик имеют примечание «Во встроенном языке не предусмотрена работа со значением данного свойства». Это значит, что во встроенном языке по метаданным можно мгновенно отобрать имена всех срабатывающих подписок и узнать, из какого расширения они пришли, а точное имя общего модуля и процедуры-обработчика смотрят в Конфигураторе или по XML-выгрузке конфигурации (EventSubscriptions/<ИмяПодписки>.xml).
&Перед / &После / &Вместо и что именно в них меняется.
Как найти все регистры движений документа: в метаданных и по конкретной ссылке
При разборе ошибок проведения нужно различать два списка регистров:
- Потенциальные регистры по метаданным (свойство
Метаданные.Документы.<Имя>.Движения, типКоллекцияЗначенийСвойстваОбъектаМетаданных) — все регистры накопления, сведений, бухгалтерии и расчёта, для которых данный вид документа отмечен как регистратор (включая регистры, добавленные в состав движений расширениями). - Фактически заполненные движения конкретного проведённого документа — наборы записей в коллекции
ДокументОбъект.Движения(или проверка непустых таблиц движений запросом с отборомГДЕ Регистратор = &СсылкаНаДокумент).
&НаСервере
Функция НайтиНепустыеДвиженияДокумента(СсылкаНаДокумент)
МетаДокумента = СсылкаНаДокумент.Метаданные();
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
ЗаполненныеРегистры = Новый ТаблицаЗначений;
ЗаполненныеРегистры.Колонки.Добавить("ПолноеИмяРегистра", Новый ОписаниеТипов("Строка"));
ЗаполненныеРегистры.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
ЗаполненныеРегистры.Колонки.Добавить("КоличествоЗаписей", Новый ОписаниеТипов("Число"));
ЗаполненныеРегистры.Колонки.Добавить("ИзмененРасширением", Новый ОписаниеТипов("Булево"));
// Обходим коллекцию ОбъектМетаданных: Документ.Движения
Для Каждого МетаРегистра Из МетаДокумента.Движения Цикл
НаборЗаписей = ДокументОбъект.Движения[МетаРегистра.Имя];
НаборЗаписей.Прочитать();
Если НаборЗаписей.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
СтрокаТЗ = ЗаполненныеРегистры.Добавить();
СтрокаТЗ.ПолноеИмяРегистра = МетаРегистра.ПолноеИмя();
СтрокаТЗ.Синоним = МетаРегистра.Синоним;
СтрокаТЗ.КоличествоЗаписей = НаборЗаписей.Количество();
СтрокаТЗ.ИзмененРасширением = МетаРегистра.ЕстьИзмененияРасширениямиКонфигурации();
КонецЦикла;
Возврат ЗаполненныеРегистры;
КонецФункции
ОбъектМетаданных регистра (РегистрНакопления, РегистрСведений, РегистрБухгалтерии, РегистрРасчета)РегистрНакопления.ТоварыНаСкладахПомимо регистров, по которым документ сам является регистратором, не забудьте проверить подписки на события самих наборов записей регистров. Чтобы найти их программно, в функции обхода Метаданные.ПодпискиНаСобытия достаточно передать в Подписка.Источник.СодержитТип(...) тип набора записей интересующего регистра, например Тип("РегистрНакопленияНаборЗаписей.ТоварыНаСкладах") или общий Тип("РегистрНакопленияНаборЗаписей").
Быстрый поиск всех перехватов расширения по выгрузке конфигурации в файлы
Если конфигурация и расширения выгружены в XML/BSL-файлы (через Конфигурация → Выгрузить конфигурацию в файлы или хранилище Git), найти все точки вмешательства расширения в проведение документа можно за несколько секунд текстовым поиском по директивам компиляции:
// Типовой вид перехвата процедуры проведения в модуле объекта расширения (.bsl):
&После("ОбработкаПроведения")
Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)
// Дополнительные движения или проверки в расширении
Движения.МойРегистрНакопления.Записывать = Истина;
КонецПроцедуры
При аудите чужого расширения проверьте в его каталоге:
- все вхождения аннотаций
&Перед(,&После(,&Вместо(и&ИзменениеИКонтроль(в файлахDocuments/<ИмяДокумента>/Ext/ObjectModule.bslиManagerModule.bsl; - перехваты в общих модулях подсистемы проведения БСП (например,
ОбщегоНазначения,ПроведениеДокументов,УчетНДС,КонтрольОстатков); - каталог
EventSubscriptions/внутри расширения — там лежат собственные подписки расширения с тегами<Source>,<Event>и<Handler>.
Частые ошибки при сравнении расширений и поиске подписок
- Искать подписку только по
Тип("ДокументОбъект.ИмяДокумента")и пропускатьТип("ДокументОбъект"). В конфигурациях на БСП ключевые механизмы проведения и обмена подписаны на общий тип всех документовДокументОбъектили через определяемый тип. Если проверять только точный вид документа, вы пропустите половину реальных обработчиков. - Пытаться прочитать
Подписка.ОбработчикилиПодписка.Событиево встроенном языке. В платформе 1С 8.3 обращение к этим свойствам объекта метаданных из BSL не поддерживается. Имя подписки и её расширение определяют программно, а сам модуль-обработчик смотрят в свойствах подписки в Конфигураторе или в XML-файле метаданных. - Забывать про флаг
БезопасныйРежиму расширения в базе. Если расширение подключено с включённым безопасным режимом или профилем безопасности, часть серверных вызовов или COM/HTTP-обращений внутри подписки на событие может блокироваться только у пользователей без полных прав. - Перехват
&Вместобез вызоваПродолжитьВызов(). Если разработчик расширения перехватил процедуру формирования движений директивой&Вместои не вызвалПродолжитьВызов, документ перестаёт формировать типовые проводки без единого сообщения об ошибке в журнале регистрации. - Проверять только
ОбработкаПроведения, игнорируя подписки на наборы записей регистров. Даже если в модуле документа и его подписках суммы рассчитаны верно, подписка с источникомРегистрНакопленияНаборЗаписейилиРегистрБухгалтерииНаборЗаписейсрабатывает в момент записи каждого набора и может перезаписать измерения или ресурсы.
Частые вопросы
Как быстро понять, влияет ли какое-то расширение на конкретный документ?
На сервере вызовите метод метаданных Метаданные.Документы.ИмяДокумента.ЕстьИзмененияРасширениямиКонфигурации() — он вернёт Истина, если документ или его реквизиты, формы и табличные части заимствованы и изменены активным расширением. Дополнительно проверьте подписки из расширений через Подписка.РасширениеКонфигурации() при обходе Метаданные.ПодпискиНаСобытия.
Почему после обновления типовой конфигурации расширение перестало применяться?
В новом релизе изменилась сигнатура заимствованного метода либо поменялся исходный код внутри процедуры, перехваченной директивой &ИзменениеИКонтроль. Вызовите в Конфигураторе «Проверка возможности применения расширений конфигурации» или программно РасширенияКонфигурации.ПроверитьВозможностьПримененияВсех(), чтобы получить точный список конфликтующих модулей и строк.
Как посмотреть все движения документа по регистрам, если в форме документа нет кнопки «Движения документа»?
В типовых конфигурациях на БСП отчёт по движениям открывается из команды «Движения документа» в меню «Ещё» формы документа либо через стандартную обработку «Универсальный отчёт» по регистратору. Программно все регистры, в которых у документа реально записаны строки, можно получить обходом коллекции СсылкаНаДокумент.Метаданные().Движения с чтением каждого набора записей.
ИИ Консоль кода 1С
Лайт
Для ознакомления с возможностями
- Полный набор инструментов без урезаний
- Без ввода карты
Старт
Для индивидуального использования
- До 5 конфигураций
- Встроенный агент запросов 1С
-
≈ 100 задач Подробнее про лимиты
- Техническая поддержка
Продвинутый
Популярный выборДля интенсивного использования или команд
- До 15 конфигураций
- Встроенный агент запросов 1С
-
≈ 300 задач Подробнее про лимиты
-
Свои подписки Codex, Claude и любые OpenAI-совместимые
-
Внешние обработки без Конфигуратора
- Приоритетная техническая поддержка