При разработке на платформе 1С:Предприятие 8.3 программисты часто сталкиваются с архитектурным ограничением: внешний отчет (файл .erf), открытый в конфигураторе, «видит» только метаданные основной конфигурации. Если мы добавили новый реквизит справочника или новый регистр в расширение, конструктор запросов во внешнем отчете просто не покажет эти поля. Это создает существенные неудобства при поддержке систем, которые нельзя снимать с поддержки. В таких случаях полезно провести предварительный анализ расширений и отчетов на наличие ошибок, чтобы убедиться в корректности вызовов метаданных.
В этой статье мы подробно разберем методологию работы в таких условиях, проанализируем несколько проверенных способов решения задачи — от «визуальных костылей» до грамотного программного управления схемой компоновки данных (СКД). Мы научимся обходить ограничения конфигуратора и заставлять отчеты работать с расширенными данными в режиме «1С:Предприятие».
Прежде чем переходить к решениям, выясним причину такого поведения платформы. Когда мы запускаем Конфигуратор и открываем внешний файл отчета, платформа инициализирует контекст метаданных на основе текущей основной конфигурации. Расширения же применяются динамически в момент запуска клиентского приложения. Таким образом, на этапе разработки внешнего отчета расширения для него «не существуют».
Это один из самых популярных и простых способов среди разработчиков. Разберем его по шагам:
.erf).Поскольку в режиме «1С:Предприятие» имя реквизита в расширении полностью совпадает с тем, что мы прописали в отчете, платформа успешно подставит данные из расширения в запрос отчета.
Рассмотрим ситуацию, когда нам не хочется вносить изменения в основную конфигурацию даже временно. Платформа позволяет писать запросы вручную.
Проанализируем алгоритм:
СправочникНоменклатура.ДополнительныйРеквизитИзРасширения.Совет: Чтобы конструктор запросов не «затирал» ваши ручные правки, можно использовать псевдонимы. Сначала выберите любое стандартное поле (например, Код), а затем в тексте запроса замените Код КАК Код на РеальноеИмяИзРасширения КАК НужноеИмяПоля.
Этот метод позволяет работать с актуальными метаданными, так как в режиме пользователя расширения уже применены. Посмотрим, как это сделать:
Этот способ наиболее безопасен и точен, так как исключает ошибки опечаток при ручном вводе имен полей.
Если отчет сложный и должен сохранять универсальность, лучше применить программный подход. В исключительных случаях можно даже использовать две разных схемы в отчете СКД для разных условий. Мы можем модифицировать запрос динамически, проверяя наличие расширения в системе, или, например, программно изменить заголовок группировки, если стандартных средств недостаточно. Рассмотрим пример кода в модуле объекта внешнего отчета:
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
// Получаем основную схему компоновки
Схема = ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
Настройки = КомпоновщикНастроек.ПолучитьНастройки();
// Проверяем, нужно ли нам добавить поле из расширения
// Например, проверим существование реквизита через метаданные
Если Метаданные.Справочники.Номенклатура.Реквизиты.Найти("НовыйРеквизит_Префикс") <> Неопределено Тогда
ТекстЗапроса = Схема.НаборыДанных.НаборДанных1.Запрос;
// Динамически меняем текст запроса, добавляя поле
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "Номенклатура.Наименование", "Номенклатура.Наименование, Номенклатура.НовыйРеквизит_Префикс");
Схема.НаборыДанных.НаборДанных1.Запрос = ТекстЗапроса;
// Также нужно программно добавить поле в список полей набора данных СКД
НовоеПоле = Схема.НаборыДанных.НаборДанных1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных"));
НовоеПоле.Поле = "НовыйРеквизит_Префикс";
НовоеПоле.ПутьКДанным = "НовыйРеквизит_Префикс";
НовоеПоле.Заголовок = "Реквизит из расширения";
КонецЕсли;
// Выполняем компоновку с измененной схемой
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(Схема, Настройки, ДанныеРасшифровки);
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Этот метод позволяет отчету не «падать», если расширение вдруг будет отключено, так как мы проверяем наличие метаданных программно.
Наиболее архитектурно правильным решением для сложных случаев является вынос логики получения данных в само расширение. Разберем эту стратегию:
Вызов сервера.Таблицу Значений.ПриКомпоновкеРезультата вызываем функцию из модуля расширения и передаем полученную таблицу в процессор компоновки.Проанализируем преимущество: внешнему отчету больше не нужно знать о структуре расширения. Он просто ожидает таблицу с определенными именами колонок. Однако при больших объемах данных стоит изучить методы оптимизации отчетов с набором данных - объект, чтобы избежать проблем с производительностью. Это значительно упрощает обновление системы.
Выясним важный нюанс: при добавлении реквизитов в расширение всегда используйте уникальные префиксы (например, ит_СрокГодности). Это защитит вашу базу от критических ошибок при обновлении типовой конфигурации. Если фирма «1С» добавит реквизит с таким же именем, но другим типом, платформа может выдать ошибку при попытке реструктуризации базы данных.
Также помните о вариантах отчетов. Если вы решите перенести внешний отчет внутрь расширения, пользовательские варианты могут «отвалиться», так как изменится путь к объекту метаданных (был ВнешнийОтчет.Имя, станет Отчет.Имя). В этом случае потребуется написать небольшую обработку для исправления ключей объектов в регистре сведений «Сохраненные настройки» или использовать механизмы БСП по переносу настроек.
Мы рассмотрели различные подходы к взаимодействию внешних отчетов и расширений. Для быстрой правки «на коленке» идеально подходит метод заглушек или консоль СКД. Для тиражных и стабильных решений лучше использовать программную модификацию схемы или набор данных - объект. Выбор метода зависит от сложности отчета и требований к стабильности системы при обновлении.