Как найти код создания связанного документа в 1С:ЕРП 2.1, если он не указан в структуре подчиненности?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

При работе со старыми, сильно доработанными конфигурациями 1С, такими как ЕРП 2.1 с десятилетней историей изменений, мы часто сталкиваемся с ситуациями, когда функционал работает, но его источник остаётся загадкой. Одна из таких распространённых проблем — автоматическое создание связанного документа, например, РасходныйОрдерНаТовары на основании ПередачаТоваровХранителю, при отсутствии явной связи в метаданных или в очевидных местах кода. Мы не можем найти код создания документа поиском по строке "СоздатьДокумент()", ни в обработчиках события, ни через замер производительности. Давайте вместе разберёмся, как эффективно искать такой "скрытый" функционал.

Начинаем с отладки: Точки останова и стек вызовов

Самый прямой и эффективный способ для начала поиска — использование отладчика. Несмотря на то, что замер производительности может не показать непосредственное создание документа, трассировка кода в реальном времени часто даёт нужные сведения.

  1. Установите точки останова. Мы рекомендуем начать с установки точки останова в процедуре ПередЗаписью или ПослеЗаписи модуля объекта документа ПередачаТоваровХранителю. Эти события происходят непосредственно перед или сразу после сохранения документа в базу данных, и именно в этот момент чаще всего инициируются действия по созданию связанных объектов.
  2. Анализируйте стек вызовов. Когда отладчик остановится на точке, внимательно изучите стек вызовов. Стек покажет всю цепочку процедур и функций, которые привели к текущему моменту выполнения. Это поможет нам проследить, откуда был вызван код, который в конечном итоге инициирует создание нового документа. Если создание происходит асинхронно, текущий стек может не дать полного ответа, но он покажет, где было запущено фоновое задание.
  3. Отладка фоновых заданий. Если мы подозреваем, что создание происходит в фоне (а это очень вероятно в сложных конфигурациях), нам нужно подготовить отладчик для работы с фоновыми заданиями.
    1. В конфигураторе перейдите в меню "Отладка" -> "Подключение..." -> "Автоматическое подключение". Установите флажок "Фоновые задания".
    2. Если мы работаем в клиент-серверном режиме, убедимся, что сервер 1С запущен с ключом -debug. Это критически важно для возможности отладки на стороне сервера.
    3. Запустите выполнение документа ПередачаТоваровХранителю и дождитесь, пока фоновое задание начнётся. Отладчик автоматически подключится, и мы сможем пошагово пройтись по коду фонового задания, установив точки останова внутри него.

Анализ фоновых заданий: Асинхронное создание документов

В современных и доработанных конфигурациях 1С, особенно в ЕРП, длительные операции часто выносятся в фоновые задания. Это позволяет не блокировать работу пользователя и повышает общую производительность системы.

  1. Различие между регламентными и фоновыми заданиями. Важно понимать, что регламентное задание — это лишь расписание, по которому запускается определённая процедура. Само выполнение кода происходит в фоновом задании. Автор темы правильно отметил, что тексты регламентных заданий лежат в общих модулях, но их поиск напрямую может не дать результата, если создание документа инициируется косвенно или через другие механизмы.
  2. Поиск в общих модулях ДлительныеОперации*. В БСП и, соответственно, в ЕРП, для асинхронных вызовов часто используются общие модули, названия которых начинаются с ДлительныеОперации (например, ДлительныеОперацииКлиент, ДлительныеОперацииСервер и т.д.). Мы должны просмотреть код этих модулей, а также связанных с ними процедур, так как именно там может находиться вызов фонового задания с передачей всех необходимых параметров.
  3. Просмотр активных фоновых заданий. Непосредственно после проведения документа ПередачаТоваровХранителю, мы можем выполнить небольшой фрагмент кода в консоли или временной обработке, чтобы увидеть, какие фоновые задания были запущены. Это поможет нам сузить круг поиска.
    
    ФЗ = ФоновыеЗадания.ПолучитьФоновыеЗадания();
    Для Каждого ФоновоеЗ ИЗ ФЗ Цикл
        Если ФоновоеЗ.ДатаНачала > ТекущаяДата() - 600 Тогда // За последние 10 минут
            Сообщить("Имя метода: " + ФоновоеЗ.ИмяМетода);
            Сообщить("Состояние: " + ФоновоеЗ.Состояние);
            Сообщить("Описание: " + ФоновоеЗ.Описание);
        КонецЕсли;
    КонецЦикла;
    

    Этот код выведет имена методов, которые были вызваны в фоновых заданиях за последние 10 минут. Мы можем использовать эти имена методов для дальнейшего поиска в конфигураторе.

Проверка внешних обработок: "Скрытый" функционал

Внешние обработки — это мощный инструмент для расширения функционала конфигурации без её изменения. Их код хранится отдельно от основной конфигурации и не всегда сразу виден в конфигураторе.

  1. Где искать внешние обработки. Мы должны проверить справочник "Дополнительные отчеты и обработки" в режиме 1С:Предприятия. Если там есть подключенные обработки, которые запускаются автоматически или по определённым событиям, то их код может быть источником создания документа.
  2. Виды внешних обработок. Существуют специализированные внешние обработки, предназначенные для создания связанных объектов. Например, обработка с видом "СозданиеСвязанныхОбъектов" в БСП как раз предоставляет механизмы для добавления нового функционала по созданию документов на основании других. Нам нужно открыть эти обработки и проанализировать их код.

Изучение подписок на события: Расширение стандартной функциональности

Подписки на события — это ещё один механизм, позволяющий встраивать дополнительный код в типовые процессы без прямого изменения модулей объектов.

  1. Как работают подписки. Подписка на событие связывает определённое событие (например, ПриЗаписи или ПередЗаписью документа) с процедурой в общем модуле. Эта процедура будет вызываться всякий раз, когда происходит соответствующее событие.
  2. Какие события могут быть задействованы. Мы должны искать подписки, которые реагируют на события документа ПередачаТоваровХранителю. Особое внимание уделим событиям ПриЗаписи, ПередЗаписью, ОбработкаПроведения или даже событиям менеджера документа, таким как ОбработкаЗаполненияДокумента, если не на самом документе, то в его связанном общем модуле.
  3. Где искать подписки в конфигураторе. Откройте конфигуратор и перейдите в ветку "Общие" -> "Подписки на события". Отфильтруйте список по источнику (документу ПередачаТоваровХранителю) или по имени события. Открыв каждую подходящую подписку, мы увидим имя общего модуля и процедуру, которая будет вызвана. Затем нам останется лишь перейти в этот общий модуль и проанализировать его код.

Глобальный поиск и другие методы: Детализированный анализ кода

Если предыдущие методы не дали результата, мы должны углубить наш поиск, используя глобальные инструменты конфигуратора и дополнительные механизмы системы.

  1. Поиск специфичных вызовов. Вместо прямого "СоздатьДокумент()", код может использовать более сложные конструкции:
    • МенеджерДокумента.СоздатьДокумент(): Этот метод создаёт новый экземпляр объекта документа. Мы можем искать вызовы типа Документы.РасходныйОрдерНаТовары.СоздатьДокумент().
    • Механизмы БСП: В Библиотеке Стандартных Подсистем (БСП), на которой основана ЕРП, существуют механизмы для создания связанных объектов, которые не всегда очевидны. Например, общий модуль СозданиеСвязанныхОбъектов или ФормированиеДвижений может содержать вспомогательные функции для этой цели.
  2. Глобальный поиск в конфигураторе. Используем функцию "Поиск во всех текстах" (Ctrl+Shift+F или Ctrl+F с галочкой "Искать во всех модулях"). Искать стоит не только "СоздатьДокумент()", но и части имени документа, например "РасходныйОрдерНаТовары", в контексте создания или записи. Мы также можем искать имена процедур и функций, которые были обнаружены в стеке вызовов или в списке фоновых заданий.
  3. Журнал регистрации. Проанализируем журнал регистрации в режиме 1С:Предприятия. В нём регистрируются различные действия, включая создание документов. Иногда в журнале может быть информация о контексте выполнения, которая поможет нам выйти на след.
  4. Замер производительности. Хотя автор уже пробовал его, важно использовать замер производительности в сочетании с пониманием асинхронных процессов. Если документ создаётся в фоне, замер производительности, запущенный только для клиентского сеанса, не покажет серверные или фоновые операции. Убедитесь, что мы собираем данные со всех сеансов, включая фоновые, или используйте отладчик, как было описано выше.
  5. Поиск общих модулей с привилегированными правами. В доработанных конфигурациях часто встречаются общие модули с постфиксом "ПолныеПрава" (например, МойОбщийМодульПолныеПрава). Код в таких модулях выполняется с полными правами и может быть использован для выполнения операций, которые обычный пользователь не может инициировать напрямую. Их также стоит тщательно изучить.

Разгадывание таких "загадок" в старых и сложных конфигурациях требует терпения и систематического подхода. Последовательно исключая каждый из возможных вариантов, мы неизбежно выйдем на источник создания документа. Удачи в поиске!

← На главную