Как найти процедуру печати, если поиск по имени макета в 1С не дает результатов?

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

В процессе доработки или анализа конфигурации 1С разработчики часто сталкиваются с ситуацией: есть макет печатной формы, например, ПФ_MXL_УниверсальныйКорректировочныйДокумент982, но стандартный глобальный поиск по этому имени в конфигураторе не находит ни одного места его использования. Это может поставить в тупик, особенно если нужно внести изменения в логику формирования печатной формы. Давайте разберем, почему так происходит и какие существуют способы найти нужный код.

Основная причина, по которой поиск не срабатывает, — динамическое формирование имени макета. В коде имя может собираться из нескольких частей, например, из префикса, названия документа и какого-либо суффикса (версии, кода формы). В таких случаях прямой поиск по полной строке бесполезен. Рассмотрим несколько эффективных методов, которые помогут нам отследить вызов нужного макета.

Метод 1: Поиск по частичному имени и ключевым словам

Самый простой и быстрый способ начать расследование — это предположить, что имя макета собирается из частей. Проанализируем наше имя ПФ_MXL_УниверсальныйКорректировочныйДокумент982. Явно выделяются смысловые блоки.

  1. Поиск по основной части. Выполним глобальный поиск (Ctrl+Shift+F) по наиболее уникальной части имени, например, УниверсальныйКорректировочныйДокумент. Велика вероятность, что мы найдем строки кода, где эта часть используется для конструирования полного имени макета.
  2. Поиск по функциям получения макета. В коде для получения макета чаще всего используются стандартные функции, такие как ПолучитьМакет(). Мы можем выполнить глобальный поиск по этой строке. Результатов будет много, но просматривая их в контексте нужного нам документа или обработки, можно быстро найти место, где имя макета передается в эту функцию в виде переменной.

Этот метод хорошо работает, когда логика формирования имени не слишком сложна и части имени присутствуют в коде в явном виде.

Метод 2: Отладка с использованием преднамеренной ошибки

Это один из самых надежных, хотя и "силовых" методов. Его суть — заставить программу "споткнуться" именно в тот момент, когда она обращается к нашему макету. Разберем по шагам, как это сделать.

  1. Вносим ошибку в макет. Откроем искомый макет в конфигураторе. Нам нужно его "сломать". Самый простой способ — найти любую ячейку, в свойстве "Текст" которой написать что-то бессмысленное, что не может быть вычислено, например, =ААА. Или просто вписать в текстовую ячейку какой-нибудь некорректный символ. Главное — чтобы при попытке обработать макет система гарантированно выдала ошибку.
  2. Настраиваем отладчик. В режиме 1С:Предприятие перейдем в меню "Сервис и настройки" -> "Параметры". На вкладке "Системные" установим флажок "Останавливаться по ошибке". Это заставит отладчик активироваться в момент возникновения любой ошибки в системе.
  3. Запускаем печать. Сохраним конфигурацию, обновим базу данных и запустим систему в пользовательском режиме. Теперь попробуем выполнить действие, которое, по нашему предположению, должно вызывать печать этого макета (например, нажать кнопку "Печать" в документе "Корректировка реализации").
  4. Анализируем результат. В момент, когда программа попытается обратиться к нашему "сломанному" макету, выполнение прервется, и откроется окно отладчика с сообщением об ошибке. Самое ценное для нас в этот момент — это стек вызовов. Он покажет всю цепочку процедур и функций, которая привела к ошибке. Пройдя по стеку снизу вверх, мы точно найдем ту самую процедуру, которая инициировала получение и обработку нашего макета.

Этот метод практически всегда дает стопроцентный результат, если макет действительно используется в системе.

Метод 3: Поиск по именам областей макета

Этот элегантный способ основан на том, как программа работает с макетом. Любой табличный макет состоит из именованных областей (например, "Шапка", "Строка", "Подвал"). Процедура печати не просто получает макет целиком, она обращается к его областям по имени, чтобы заполнить их данными.

  1. Изучаем макет. Откроем наш макет в конфигураторе и посмотрим, какие именованные области в нем есть. Обычно это легко сделать, просматривая строки или ячейки и их свойства. Запишем несколько уникальных имен областей, например, ШапкаДокумента, СтрокаТовары, ИтогиНДС.
  2. Выполняем глобальный поиск. Теперь сделаем глобальный поиск (Ctrl+Shift+F) по этим именам областей. В коде мы найдем строки вида:
    
    ОбластьШапка = Макет.ПолучитьОбласть("ШапкаДокумента");
    // ...
    ТабДокумент.Вывести(ОбластьШапка);
    

Такой поиск с очень высокой вероятностью приведет нас прямо в процедуру формирования печатной формы, так как обращение к областям — неотъемлемая часть работы с макетом. Этот метод особенно хорош, когда имя самого макета формируется очень сложно, а имена областей остаются статичными.

Метод 4: Анализ типовых механизмов печати (БСП)

Современные конфигурации, особенно отраслевые (как "Ювелирный торговый дом", основанный на "Рознице"), используют Библиотеку стандартных подсистем (БСП). В БСП механизмы печати унифицированы и вынесены в общие модули.

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

  1. Откройте объект конфигурации, к которому относится печатная форма (например, документ "КорректировкаРеализации").
  2. Перейдите в его модуль менеджера.
  3. Найдите процедуру с названием ДобавитьКомандыПечати. Именно она отвечает за формирование списка доступных печатных форм.
  4. Внутри этой процедуры вы, скорее всего, увидите вызовы функций из общего модуля УправлениеПечатью. Проанализировав параметры, передаваемые в эти функции, вы найдете идентификатор печатной формы и имя макета, которое ей соответствует.

Этот подход требует понимания архитектуры БСП, но позволяет быстро находить нужные места в типовых и основанных на них конфигурациях.

Что делать, если ничего не помогло?

Если ни один из перечисленных методов не дал результата, стоит рассмотреть гипотезу, что макет не используется. В процессе разработки часто создаются копии макетов для экспериментов, сохраняются старые версии (например, `...981` — старая форма, а `...982` — новая, которая так и не была внедрена). Такой "мусор" может оставаться в конфигурации годами.

В этом случае ваша задача меняется: нужно не найти, где используется именно этот макет, а понять, какой макет используется вместо него. Поищите макеты с похожими именами (например, поиском по `УниверсальныйКорректировочныйДокумент`). Возможно, вы найдете актуальную версию и сможете внести изменения уже в нее или использовать ее как основу для вашей задачи.

← На главную