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