Программирование в 1С

Как сравнить расширение с конфигурацией 1С 8.3 и найти все подписки и движения документа

Коротко

В 1С:Предприятие 8.3 логика проведения документа распределена по трём точкам: собственный модуль объекта, обработчики в коллекциях Метаданные.ПодпискиНаСобытия (как основной конфигурации, так и расширений) и перехваты процедур в расширениях с аннотациями &Перед, &После, &Вместо и &ИзменениеИКонтроль.

Чтобы увидеть отличия расширения от типовой базы в Конфигураторе, откройте дерево расширения и выполните Конфигурация → Сравнить, объединить с конфигурацией из файла / ИБ либо запустите Проверка возможности применения расширений конфигурации. Программно на сервере список подключённых расширений и ошибки их применения получают через глобальный менеджер РасширенияКонфигурации.Получить() и ПроверитьВозможностьПримененияВсех(), а перечень подписок и регистров конкретного документа — через Метаданные.ПодпискиНаСобытия и Метаданные.Документы.<Имя>.Движения.

Где искать доработки: три места, влияющие на запись и проведение документа

В современных типовых конфигурациях (1С:ERP, КА 2, УТ 11, БП 3.0, ЗУП 3.1) прямое редактирование модуля объекта со снятием с поддержки используется редко. Если при записи или проведении документа меняются реквизиты, добавляются нестандартные движения по регистрам или возникает исключение, точка входа обычно находится в одном из трёх механизмов платформы:

  • Заимствованные модули и объекты в расширениях (.cfe) — процедуры в общих модулях, модуле объекта или модуле менеджера документа, перехваченные директивами &Перед("ИмяПроцедуры"), &После("ИмяПроцедуры"), &Вместо("ИмяПроцедуры") или &ИзменениеИКонтроль("ИмяПроцедуры").
  • Подписки на события (Метаданные.ПодпискиНаСобытия) — обработчики событий ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаУдаленияПроведения и ОбработкаПроверкиЗаполнения. Подписка может быть настроена как на конкретный документ (например, ДокументОбъект.РеализацияТоваровУслуг), так и на определяемый тип или все документы сразу (тип ДокументОбъект), а также добавлена собственным объектом внутри расширения.
  • Подписки на наборы записей регистров — когда сам документ формирует стандартный набор записей в коллекции Движения, а модификация сумм или субконто происходит в подписке на событие ПередЗаписью или ПриЗаписи конкретного регистра накопления, сведений или бухгалтерии.

Сравнение и объединение конфигураций в 1С 8.3: как сравнить расширение с основной базой

Штатное окно Сравнение, объединение конфигураций в Конфигураторе применяется в двух разных сценариях: при обновлении доработанной конфигурации и при ревизии расширений (.cfe). Чтобы проанализировать состав расширения и его расхождения с основной конфигурацией:

  1. Откройте список Конфигурация → Расширения конфигурации, выберите нужное расширение и откройте его дерево метаданных двойным щелчком по колонке «Конфигурация».
  2. Для быстрой фильтрации дерева расширения включите отбор по подсистеме или фильтр заимствованных объектов: у каждого объекта и реквизита в свойствах заполнено поле ПринадлежностьОбъекта (значения Собственный или Заимствованный).
  3. Чтобы сверить заимствованные методы с обновлённым релизом поставщика, выполните в меню окна расширения Конфигурация → Проверка возможности применения расширений конфигурации. Платформа проверит совпадение сигнатур всех процедур с аннотациями &Перед, &После, &Вместо и контролируемые участки кода внутри #Вставка ... #КонецВставки и #Удаление ... #КонецУдаления для &ИзменениеИКонтроль.
  4. Для построчного сравнения двух версий одного расширения (например, из тестовой и рабочей базы) выгрузите расширение в файл .cfe и в окне открытого расширения выберите Конфигурация → Сравнить, объединить с конфигурацией из файла....
Режим сравнения / объединения и директива Назначение в 1С 8.3 На что обратить внимание при диагностике и обновлении
&Перед("ИмяМетода") / &После("ИмяМетода") Выполняет код расширения до или после штатной процедуры типового модуля без замены её текста При объединении нескольких расширений порядок вызова зависит от порядка загрузки расширений в базе; не позволяет изменить возвращаемое значение функции.
&Вместо("ИмяМетода") Полностью замещает типовую процедуру или функцию; продолжение штатного кода вызывается инструкцией ПродолжитьВызов(...) Самая частая причина «пропавших» типовых движений: если в расширении забыли вызвать ПродолжитьВызов, код основной конфигурации и ранее подключённых расширений не выполнится.
&ИзменениеИКонтроль("ИмяМетода") Копирует текст типового метода в расширение с разметкой правок препроцессором #Вставка и #Удаление При обновлении типовой конфигурации платформа сравнивает исходный текст метода вне тегов препроцессора с новым релизом; при любом изменении типового кода расширение перестаёт применяться до актуализации метода.
Режим объединения Взять из файла / Объединить Управляет переносом свойств, форм, макетов и модулей в окне «Сравнение, объединение» Для модулей и коллекций (подсистемы, роли, источники подписок) режим «Взять из файла» затирает локальные доработки; используйте «Объединить с приоритетом» и проверяйте фильтр «Показывать только дважды изменённые свойства».

Программная проверка подключённых расширений и ошибок их применения

В рабочей базе 1С (в том числе во фреше или на сервере без доступа к Конфигуратору) список всех установленных расширений, их статус активности, безопасный режим и диагностику проблем применения можно получить программно на сервере через свойство глобального контекста РасширенияКонфигурации (тип МенеджерРасширенийКонфигурации).

У каждого объекта метаданных в платформе 8.3 также есть два встроенных метода для анализа влияния расширений в текущем сеансе:

  • ОбъектМетаданных.ЕстьИзмененияРасширениямиКонфигурации() — возвращает Истина, если сам объект (например, документ или общий модуль) или любой его дочерний элемент изменён или дополнен активными расширениями в текущем сеансе.
  • ОбъектМетаданных.РасширениеКонфигурации() — возвращает объект РасширениеКонфигурации, которым данный собственный объект был добавлен в базу, либо Неопределено, если объект принадлежит основной конфигурации.
&НаСервере
Функция ПроверитьРасширенияИИзмененияДокумента(ИмяДокумента)

    Результат = Новый Структура;

    // 1. Получаем все расширения в информационной базе
    МассивРасширений = РасширенияКонфигурации.Получить();

    // 2. Проверяем конфликты сигнатур и директив &ИзменениеИКонтроль
    ПроблемыПрименения = РасширенияКонфигурации.ПроверитьВозможностьПримененияВсех();
    СписокПроблем = Новый Массив;
    Для Каждого Проблема Из ПроблемыПрименения Цикл
        СписокПроблем.Добавить(Новый Структура(
            "Расширение, Важность, Описание",
            Проблема.Расширение.Имя,
            Строка(Проблема.Важность),
            Проблема.Описание
        ));
    КонецЦикла;

    // 3. Проверяем, затронут ли целевой документ активными расширениями
    МетаДокумента = Метаданные.Документы[ИмяДокумента];
    ИзмененРасширением = МетаДокумента.ЕстьИзмененияРасширениямиКонфигурации();
    АвторРасширение    = МетаДокумента.РасширениеКонфигурации();

    Результат.Вставить("ВсегоРасширений", МассивРасширений.Количество());
    Результат.Вставить("ПроблемыПрименения", СписокПроблем);
    Результат.Вставить("ДокументИзмененРасширениями", ИзмененРасширением);
    Результат.Вставить("ДобавленРасширением",
        ?(АвторРасширение = Неопределено, "", АвторРасширение.Имя));

    Возврат Результат;

КонецФункции
МенеджерРасширенийКонфигурации.Получить
ОтборСтруктура с ключами УникальныйИдентификатор или Имя (по умолчанию Неопределено — все расширения)
ИсточникРасширенийКонфигурацииИсточникРасширенийКонфигурации (по умолчанию БазаДанных)
→ Массив из РасширениеКонфигурации

Как найти все подписки на события документа (включая подписки из расширений)

В Конфигураторе сгруппировать подписки по конкретному документу можно через окно Конфигурация → Подписки на события. Однако в крупных конфигурациях на базе БСП таких подписок сотни, причём многие из них привязаны не к одному документу, а к составному списку типов или ко всем документам сразу (через обобщённый тип ДокументОбъект). Кроме того, подписки из расширений лежат в отдельных деревьях метаданных каждого расширения.

При программном обходе коллекции Метаданные.ПодпискиНаСобытия в режиме 1С:Предприятие платформа возвращает единую коллекцию подписок — как из основной конфигурации, так и добавленных активными расширениями. У объекта ОбъектМетаданных: ПодпискаНаСобытие свойство Источник имеет тип ОписаниеТипов. Поэтому для точного отбора нужно проверить два типа через метод ОписаниеТипов.СодержитТип():

  • конкретный объектный тип документа — Тип("ДокументОбъект." + ИмяДокумента);
  • обобщённый тип всех документов конфигурации — Тип("ДокументОбъект") (на него в БСП вешаются универсальные подписки версионирования, запрета изменения дат, регистрации в планах обмена и заполнения реквизитов).
&НаСервере
Функция НайтиПодпискиНаСобытияДокумента(ИмяДокумента)

    ТаблицаПодписок = Новый ТаблицаЗначений;
    ТаблицаПодписок.Колонки.Добавить("ИмяПодписки", Новый ОписаниеТипов("Строка"));
    ТаблицаПодписок.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
    ТаблицаПодписок.Колонки.Добавить("ВидПривязки", Новый ОписаниеТипов("Строка"));
    ТаблицаПодписок.Колонки.Добавить("Расширение", Новый ОписаниеТипов("Строка"));

    ТипКонкретногоДокумента = Тип("ДокументОбъект." + ИмяДокумента);
    ТипВсехДокументов       = Тип("ДокументОбъект");

    Для Каждого Подписка Из Метаданные.ПодпискиНаСобытия Цикл

        ЕстьТочноеСовпадение = Подписка.Источник.СодержитТип(ТипКонкретногоДокумента);
        НаВсеДокументы       = Подписка.Источник.СодержитТип(ТипВсехДокументов);

        Если НЕ ЕстьТочноеСовпадение И НЕ НаВсеДокументы Тогда
            Продолжить;
        КонецЕсли;

        СтрокаТЗ = ТаблицаПодписок.Добавить();
        СтрокаТЗ.ИмяПодписки = Подписка.Имя;
        СтрокаТЗ.Синоним     = Подписка.Синоним;
        СтрокаТЗ.ВидПривязки = ?(ЕстьТочноеСовпадение, "По виду документа", "На все документы");

        РасширениеАвтор = Подписка.РасширениеКонфигурации();
        СтрокаТЗ.Расширение = ?(РасширениеАвтор = Неопределено,
            "Основная конфигурация",
            РасширениеАвтор.Имя);

    КонецЦикла;

    Возврат ТаблицаПодписок;

КонецФункции
ОписаниеТипов.СодержитТип
ТипТип — проверяемый тип (например, Тип("ДокументОбъект.РеализацияТоваровУслуг"))
→ Булево (Истина — тип входит в Источник подписки)

Обратите внимание на важную особенность платформы 1С 8.3: согласно синтакс-помощнику, у объекта ОбъектМетаданных: ПодпискаНаСобытие свойства Событие и Обработчик имеют примечание «Во встроенном языке не предусмотрена работа со значением данного свойства». Это значит, что во встроенном языке по метаданным можно мгновенно отобрать имена всех срабатывающих подписок и узнать, из какого расширения они пришли, а точное имя общего модуля и процедуры-обработчика смотрят в Конфигураторе или по XML-выгрузке конфигурации (EventSubscriptions/<ИмяПодписки>.xml).

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

Как найти все регистры движений документа: в метаданных и по конкретной ссылке

При разборе ошибок проведения нужно различать два списка регистров:

  1. Потенциальные регистры по метаданным (свойство Метаданные.Документы.<Имя>.Движения, тип КоллекцияЗначенийСвойстваОбъектаМетаданных) — все регистры накопления, сведений, бухгалтерии и расчёта, для которых данный вид документа отмечен как регистратор (включая регистры, добавленные в состав движений расширениями).
  2. Фактически заполненные движения конкретного проведённого документа — наборы записей в коллекции ДокументОбъект.Движения (или проверка непустых таблиц движений запросом с отбором ГДЕ Регистратор = &СсылкаНаДокумент).
&НаСервере
Функция НайтиНепустыеДвиженияДокумента(СсылкаНаДокумент)

    МетаДокумента = СсылкаНаДокумент.Метаданные();
    ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

    ЗаполненныеРегистры = Новый ТаблицаЗначений;
    ЗаполненныеРегистры.Колонки.Добавить("ПолноеИмяРегистра", Новый ОписаниеТипов("Строка"));
    ЗаполненныеРегистры.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
    ЗаполненныеРегистры.Колонки.Добавить("КоличествоЗаписей", Новый ОписаниеТипов("Число"));
    ЗаполненныеРегистры.Колонки.Добавить("ИзмененРасширением", Новый ОписаниеТипов("Булево"));

    // Обходим коллекцию ОбъектМетаданных: Документ.Движения
    Для Каждого МетаРегистра Из МетаДокумента.Движения Цикл

        НаборЗаписей = ДокументОбъект.Движения[МетаРегистра.Имя];
        НаборЗаписей.Прочитать();

        Если НаборЗаписей.Количество() = 0 Тогда
            Продолжить;
        КонецЕсли;

        СтрокаТЗ = ЗаполненныеРегистры.Добавить();
        СтрокаТЗ.ПолноеИмяРегистра  = МетаРегистра.ПолноеИмя();
        СтрокаТЗ.Синоним            = МетаРегистра.Синоним;
        СтрокаТЗ.КоличествоЗаписей  = НаборЗаписей.Количество();
        СтрокаТЗ.ИзмененРасширением = МетаРегистра.ЕстьИзмененияРасширениямиКонфигурации();

    КонецЦикла;

    Возврат ЗаполненныеРегистры;

КонецФункции
ОбъектМетаданных: Документ.Движения
Элемент коллекцииОбъектМетаданных регистра (РегистрНакопления, РегистрСведений, РегистрБухгалтерии, РегистрРасчета)
ПолноеИмя()возвращает строку вида РегистрНакопления.ТоварыНаСкладах
→ КоллекцияЗначенийСвойстваОбъектаМетаданных

Помимо регистров, по которым документ сам является регистратором, не забудьте проверить подписки на события самих наборов записей регистров. Чтобы найти их программно, в функции обхода Метаданные.ПодпискиНаСобытия достаточно передать в Подписка.Источник.СодержитТип(...) тип набора записей интересующего регистра, например Тип("РегистрНакопленияНаборЗаписей.ТоварыНаСкладах") или общий Тип("РегистрНакопленияНаборЗаписей").

Если нужно проверить движения конкретного документа в рабочей базе и понять, почему не сходится себестоимость, НДС или остатки по складу, откройте ИИ Консоль аналитика 1С: агент сам прочитает все движения документа по регистрам, сопоставит их с отчётами и объяснит причину расхождения на языке учёта.

Быстрый поиск всех перехватов расширения по выгрузке конфигурации в файлы

Если конфигурация и расширения выгружены в XML/BSL-файлы (через Конфигурация → Выгрузить конфигурацию в файлы или хранилище Git), найти все точки вмешательства расширения в проведение документа можно за несколько секунд текстовым поиском по директивам компиляции:

// Типовой вид перехвата процедуры проведения в модуле объекта расширения (.bsl):
&После("ОбработкаПроведения")
Процедура МоеРасширение_ОбработкаПроведения(Отказ, РежимПроведения)

    // Дополнительные движения или проверки в расширении
    Движения.МойРегистрНакопления.Записывать = Истина;

КонецПроцедуры

При аудите чужого расширения проверьте в его каталоге:

  • все вхождения аннотаций &Перед(, &После(, &Вместо( и &ИзменениеИКонтроль( в файлах Documents/<ИмяДокумента>/Ext/ObjectModule.bsl и ManagerModule.bsl;
  • перехваты в общих модулях подсистемы проведения БСП (например, ОбщегоНазначения, ПроведениеДокументов, УчетНДС, КонтрольОстатков);
  • каталог EventSubscriptions/ внутри расширения — там лежат собственные подписки расширения с тегами <Source>, <Event> и <Handler>.

Частые ошибки при сравнении расширений и поиске подписок

  • Искать подписку только по Тип("ДокументОбъект.ИмяДокумента") и пропускать Тип("ДокументОбъект"). В конфигурациях на БСП ключевые механизмы проведения и обмена подписаны на общий тип всех документов ДокументОбъект или через определяемый тип. Если проверять только точный вид документа, вы пропустите половину реальных обработчиков.
  • Пытаться прочитать Подписка.Обработчик или Подписка.Событие во встроенном языке. В платформе 1С 8.3 обращение к этим свойствам объекта метаданных из BSL не поддерживается. Имя подписки и её расширение определяют программно, а сам модуль-обработчик смотрят в свойствах подписки в Конфигураторе или в XML-файле метаданных.
  • Забывать про флаг БезопасныйРежим у расширения в базе. Если расширение подключено с включённым безопасным режимом или профилем безопасности, часть серверных вызовов или COM/HTTP-обращений внутри подписки на событие может блокироваться только у пользователей без полных прав.
  • Перехват &Вместо без вызова ПродолжитьВызов(). Если разработчик расширения перехватил процедуру формирования движений директивой &Вместо и не вызвал ПродолжитьВызов, документ перестаёт формировать типовые проводки без единого сообщения об ошибке в журнале регистрации.
  • Проверять только ОбработкаПроведения, игнорируя подписки на наборы записей регистров. Даже если в модуле документа и его подписках суммы рассчитаны верно, подписка с источником РегистрНакопленияНаборЗаписей или РегистрБухгалтерииНаборЗаписей срабатывает в момент записи каждого набора и может перезаписать измерения или ресурсы.

Частые вопросы

Как быстро понять, влияет ли какое-то расширение на конкретный документ?

На сервере вызовите метод метаданных Метаданные.Документы.ИмяДокумента.ЕстьИзмененияРасширениямиКонфигурации() — он вернёт Истина, если документ или его реквизиты, формы и табличные части заимствованы и изменены активным расширением. Дополнительно проверьте подписки из расширений через Подписка.РасширениеКонфигурации() при обходе Метаданные.ПодпискиНаСобытия.

Почему после обновления типовой конфигурации расширение перестало применяться?

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

Как посмотреть все движения документа по регистрам, если в форме документа нет кнопки «Движения документа»?

В типовых конфигурациях на БСП отчёт по движениям открывается из команды «Движения документа» в меню «Ещё» формы документа либо через стандартную обработку «Универсальный отчёт» по регистратору. Программно все регистры, в которых у документа реально записаны строки, можно получить обходом коллекции СсылкаНаДокумент.Метаданные().Движения с чтением каждого набора записей.

Тарифы

ИИ Консоль кода 1С

Лайт

Бесплатно
≈ 0,1 млн токенов на 2 дн.

Для ознакомления с возможностями

  • Все функции бесплатно на 2 дня +2 дня за подписку на Telegram или Max
  • Полный набор инструментов без урезаний
  • Без ввода карты

Старт

1990 руб. в месяц
≈ 10 млн токенов

Для индивидуального использования

Продвинутый

Популярный выбор
3990 руб. в месяц
≈ 25 млн токенов

Для интенсивного использования или команд

  • До 15 конфигураций
  • Встроенный агент запросов 1С
  • Свои подписки Codex, Claude и любые OpenAI-совместимые
  • Внешние обработки без Конфигуратора
  • Приоритетная техническая поддержка