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