Многие разработчики при попытке кастомизировать стандартные отчеты в конфигурациях Управление торговлей 11, ERP 2 или Комплексная автоматизация сталкиваются с неприятной ситуацией. Мы берем типовой отчет (например, «Прайс-лист»), сохраняем его как внешний, открываем схему компоновки данных (СКД), заходим в конструктор запроса, нажимаем «ОК» без внесения изменений — и отчет перестает работать. На первый взгляд это кажется магией или багом платформы, но на самом деле у этого поведения есть четкие технические причины.
В этой статье мы подробно разберем, почему визуальный конструктор запросов «портит» текст компоновки, какие элементы языка СКД являются наиболее уязвимыми и как правильно модифицировать сложные отчеты, чтобы они сохраняли свою работоспособность.
Основная проблема заключается в том, что визуальный конструктор запросов 1С:Предприятие не является полнофункциональным редактором для языка компоновки данных. Хотя он умеет работать с базовыми конструкциями, многие расширения языка СКД, заключенные в фигурные скобки {}, он интерпретирует по-своему или вовсе отбрасывает при перестроении текста.
Рассмотрим, что именно происходит «под капотом». В сложных типовых отчетах активно используются параметры виртуальных таблиц с вложенными условиями. Проанализируем пример из сообщения №13 в обсуждении. До открытия конструктором текст запроса выглядел так:
{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период,
{ВидЦены КАК ВидЦеныДиапазон
((Номенклатура, Характеристика) В
(ВЫБРАТЬ ОтборПоСегментуНоменклатуры.Номенклатура, ОтборПоСегментуНоменклатуры.Характеристика
ИЗ ОтборПоСегментуНоменклатуры
ГДЕ ОтборПоСегментуНоменклатуры.ИспользуетсяОтборПоСегментуНоменклатуры = &ИспользуетсяОтборПоСегментуНоменклатуры)),
((Номенклатура) В
(ВЫБРАТЬ ОтборПоАссортименту.Номенклатура
ИЗ ОтборПоАссортименту
ГДЕ ОтборПоАссортименту.ИспользуетсяОтборПоАссортименту = &ИспользуетсяОтборПоАссортименту))
}) КАК ЦеныНоменклатурыОтбор
После того как мы нажимаем кнопку «ОК» в конструкторе, система пытается «нормализовать» этот запрос. Поскольку конструкция внутри фигурных скобок содержит сложные вложенные запросы и условия, которые конструктор не может визуализировать в своем интерфейсе, он упрощает их до неузнаваемости:
{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период,
{(ВидЦены) КАК ВидЦеныДиапазон}) КАК ЦеныНоменклатурыОтбор
Как мы видим, весь блок с отборами по сегментам и ассортименту был удален. В итоге отчет либо выдает ошибку при исполнении (так как ожидаются определенные данные или параметры), либо начинает выводить некорректные цифры. Это классическая ситуация при работе с СКД в современных типовых решениях.
Самый надежный способ сохранить логику сложного отчета — это редактирование текста запроса вручную. Если вам нужно внести изменения (например, добавить вывод штрихкодов), выполните следующие шаги:
ВЫБРАТЬ и, если требуется, в секции соединений.Если вам крайне сложно редактировать основной гигантский запрос типового отчета вручную, мы можем пойти по пути наименьшего сопротивления и воспользоваться механизмом связей наборов данных в СКД:
Набор данных - запрос в вашей схеме компоновки.Номенклатура и Характеристика).Этот метод позволяет избежать риска повреждения «хрупкого» типового кода, который был написан разработчиками 1С вручную без оглядки на ограничения конструктора.
Важно помнить, что современные отчеты (особенно «Прайс-лист») — это не только схема СКД. Огромная часть логики скрыта в модуле объекта отчета. Когда мы сохраняем отчет как внешний, нам необходимо проанализировать событие ПриКомпоновкеРезультата.
Рассмотрим основные нюансы:
ИдентификаторыОбъектовМетаданных. Внешний отчет не имеет записи в этом справочнике, что может приводить к сбоям.Для корректной работы внешнего отчета обязательно скопируйте весь код из модуля объекта оригинального отчета в модуль вашего внешнего отчета. Если в коде встречаются обращения к методам типа Отчеты.ПрайсЛист.Создать(), замените их на универсальные методы обращения к текущему объекту.
Иногда отчет «не работает» не из-за кода, а из-за того, что платформа пытается применить к вашей новой структуре старые пользовательские настройки, сохраненные в базе данных. Проанализируем рекомендации из сообщения №20:
Если вы изменили состав полей в СКД, попробуйте следующее:
Для эффективной работы мы рекомендуем придерживаться следующих правил:
1. Изучайте XML-структуру. Иногда проще открыть файл .os (схему) как текстовый документ и увидеть реальный текст запроса там, без искажений интерфейса 1С.
2. Используйте консоль запросов с поддержкой СКД. Обычная консоль запросов не поймет фигурные скобки. Для тестирования таких запросов используйте специализированные инструменты (например, консоль системы компоновки данных), которые умеют имитировать работу отчета.
3. Регистрируйте отчет в системе. Вместо простого открытия через меню «Файл», добавьте ваш отчет в справочник «Дополнительные отчеты и обработки». В этом случае БСП инициализирует все необходимые механизмы, и отчет будет работать в среде, максимально приближенной к «родной» для него конфигурации.
Подводя итог, можно сказать: работоспособность сложного отчета после конструктора — это вопрос контроля за расширениями СКД. Будьте внимательны к тексту в фигурных скобках и не доверяйте визуальному редактору автоматическую переборку кода, написанного вручную профессионалами 1С.