В процессе сопровождения сложных и сильно доработанных систем, таких как 1С:ERP Управление предприятием, программисты часто сталкиваются с задачей поиска конкретного отчета в дереве метаданных. Ситуация осложняется тем, что в интерфейсе пользователь видит лишь наименование варианта отчета, которое может не совпадать с именем самого объекта в конфигураторе. Кроме того, отчет может быть как встроенным в основную конфигурацию, так и подключенным через механизм дополнительных отчетов и обработок или находиться в расширении. Рассмотрим подробнее все доступные методы идентификации таких объектов.
Начиная с современных версий платформы 1С:Предприятие 8.3, в распоряжении разработчика есть мощный встроенный инструмент. Если мы откроем форму нужного отчета в пользовательском режиме, в правом верхнем углу окна (кнопка с тремя точками или "Сервис и настройки") можно выбрать пункт "Информация для технического специалиста". Проанализируем, что это нам дает:
Отчет.ВедомостьПоТоварамНаСкладах.Одним из самых надежных способов является получение навигационной ссылки объекта. Для этого, находясь в форме отчета, нажмем комбинацию клавиш Shift+F11 (или кнопку "Получить ссылку"). Мы получим строку вида e1cib/data/Справочник.ВариантыОтчетов?ref=ab58000c2971d06a11ebe54cee230eda. Разберем по шагам, как превратить эту ссылку в понятное имя объекта.
Поскольку ссылка ведет на элемент справочника ВариантыОтчетов, нам нужно найти этот элемент в базе и посмотреть, на какой именно отчет он ссылается. Мы можем воспользоваться консолью запросов или программным кодом для получения ссылки из внутреннего строкового представления. Проанализируем пример кода, который позволяет преобразовать навигационную ссылку в объект:
// Предположим, НС - это наша навигационная ссылка
ПерваяТочка = Найти(НС, "e1cib/data/");
ВтораяТочка = Найти(НС, "?ref=");
ПредставлениеТипа = Сред(НС, ПерваяТочка + 11, ВтораяТочка - ПерваяТочка - 11);
ШаблонЗначения = ЗначениеВСтрокуВнутр(ПредопределенноеЗначение(ПредставлениеТипа + ".ПустаяСсылка"));
ЗначениеСсылки = СтрЗаменить(ШаблонЗначения, "00000000000000000000000000000000", Сред(НС, ВтораяТочка + 5));
// Теперь получаем реальную ссылку на элемент справочника
СсылкаНаВариант = ЗначениеИзСтрокиВнутр(ЗначениеСсылки);
// Далее через точку обращаемся к реквизиту "Отчет"
ИмяОбъекта = СсылкаНаВариант.Отчет;
В реквизите Отчет справочника ВариантыОтчетов хранится информация, которая однозначно идентифицирует источник данных: встроенный это отчет или внешний из справочника ДополнительныеОтчетыИОбработки. Для автоматического определения ссылки и наименования отчета по его варианту можно использовать обработку для получения наименования отчета в конфигурации с БСП.
Если у нас есть доступ к консоли запросов, мы можем быстро выяснить происхождение отчета, зная его наименование в интерфейсе. Выполним следующий запрос к справочнику ВариантыОтчетов, чтобы выяснить тип и имя родительского объекта:
ВЫБРАТЬ
ВариантыОтчетов.Ссылка КАК Вариант,
ВариантыОтчетов.Отчет КАК ОбъектМетаданных,
ВариантыОтчетов.ТипОтчета КАК ТипОтчета,
ВариантыОтчетов.КлючВарианта КАК Ключ
ИЗ
Справочник.ВариантыОтчетов КАК ВариантыОтчетов
ГДЕ
ВариантыОтчетов.Наименование ПОДОБНО "%ВашеНазваниеОтчета%"
Разберем результаты запроса. Поле ТипОтчета подскажет нам, является ли отчет встроенным или дополнительным. Если отчет встроенный, в поле ОбъектМетаданных будет содержаться ссылка на ИдентификаторОбъектовМетаданных, из которого легко получить имя для поиска в конфигураторе. Если отчет внешний, мы увидим ссылку на элемент справочника дополнительных обработок.
Иногда отчеты вызываются через сложные программные механизмы, и простым поиском их не найти. В этом случае воспользуемся отладчиком. Посмотрим на алгоритм действий:
Проанализируем ситуацию: если отчет внешний, то в стеке вызовов мы часто будем видеть обращения к временным файлам. Платформа 1С при запуске внешнего отчета копирует его во временную директорию. Путь в стеке будет выглядеть примерно так: v8_XXXX_XX.erf. Если же отчет встроенный, в стеке будут фигурировать модули самого отчета или общие модули, в которых передается управление объекту ОтчетОбъект.ИмяВашегоОтчета.
Если отчет встроен в конфигурацию, но его синоним отличается от того, что вы видите в интерфейсе (например, имя переопределено в коде), можно использовать Глобальный поиск (Ctrl+Shift+F). Выясним причину, по которой отчет может не находиться обычным поиском по имени:
В конфигурациях на базе БСП (Библиотека стандартных подсистем), таких как ERP, важную роль играет справочник Идентификаторы объектов метаданных. Все объекты, участвующие в подсистемах (варианты отчетов, права доступа и т.д.), зарегистрированы в нем. Рассмотрим, как его использовать:
Идентификаторы объектов метаданных.Отчет.Продажи), которое мы сможем мгновенно найти в дереве конфигурации.Поскольку ваша ERP "переписана в хвост и в гриву", существует большая вероятность, что отчет добавлен или изменен в расширении. При глобальном поиске в конфигураторе убедитесь, что в области поиска выбраны все расширения. В дереве метаданных такие отчеты помечаются характерной иконкой. Помните, что логика отчета может находиться в основной конфигурации, а его форма или схема компоновки данных (СКД) могут быть полностью замещены в расширении. В этом случае искать нужно именно в модулях расширения, используя аннотации &Вместо или &После. Для быстрого поиска объектов метаданных внутри расширений можно воспользоваться инструментом для поиска по метаданным и управления расширениями.
Если отчет запускается, это событие фиксируется в журнале регистрации. Выясним, какую информацию можно извлечь оттуда:
Используя совокупность этих методов, вы сможете идентифицировать любой отчет в системе, даже если его интерфейсное представление было сильно изменено в ходе кастомизации конфигурации.