Почему ломается типовой отчет 1С при сохранении через конструктор запроса и как это исправить

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

Многие разработчики при попытке кастомизировать стандартные отчеты в конфигурациях Управление торговлей 11, ERP 2 или Комплексная автоматизация сталкиваются с неприятной ситуацией. Мы берем типовой отчет (например, «Прайс-лист»), сохраняем его как внешний, открываем схему компоновки данных (СКД), заходим в конструктор запроса, нажимаем «ОК» без внесения изменений — и отчет перестает работать. На первый взгляд это кажется магией или багом платформы, но на самом деле у этого поведения есть четкие технические причины.

В этой статье мы подробно разберем, почему визуальный конструктор запросов «портит» текст компоновки, какие элементы языка СКД являются наиболее уязвимыми и как правильно модифицировать сложные отчеты, чтобы они сохраняли свою работоспособность.

Выясняем причину: почему конструктор «ломает» запрос

Основная проблема заключается в том, что визуальный конструктор запросов 1С:Предприятие не является полнофункциональным редактором для языка компоновки данных. Хотя он умеет работать с базовыми конструкциями, многие расширения языка СКД, заключенные в фигурные скобки {}, он интерпретирует по-своему или вовсе отбрасывает при перестроении текста.

Рассмотрим, что именно происходит «под капотом». В сложных типовых отчетах активно используются параметры виртуальных таблиц с вложенными условиями. Проанализируем пример из сообщения №13 в обсуждении. До открытия конструктором текст запроса выглядел так:


{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, 
    {ВидЦены КАК ВидЦеныДиапазон
        ((Номенклатура, Характеристика) В 
            (ВЫБРАТЬ ОтборПоСегментуНоменклатуры.Номенклатура, ОтборПоСегментуНоменклатуры.Характеристика 
             ИЗ ОтборПоСегментуНоменклатуры 
             ГДЕ ОтборПоСегментуНоменклатуры.ИспользуетсяОтборПоСегментуНоменклатуры = &ИспользуетсяОтборПоСегментуНоменклатуры)), 
        ((Номенклатура) В 
            (ВЫБРАТЬ ОтборПоАссортименту.Номенклатура 
             ИЗ ОтборПоАссортименту 
             ГДЕ ОтборПоАссортименту.ИспользуетсяОтборПоАссортименту = &ИспользуетсяОтборПоАссортименту)) 
    }) КАК ЦеныНоменклатурыОтбор

После того как мы нажимаем кнопку «ОК» в конструкторе, система пытается «нормализовать» этот запрос. Поскольку конструкция внутри фигурных скобок содержит сложные вложенные запросы и условия, которые конструктор не может визуализировать в своем интерфейсе, он упрощает их до неузнаваемости:


{ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&Период, 
    {(ВидЦены) КАК ВидЦеныДиапазон}) КАК ЦеныНоменклатурыОтбор

Как мы видим, весь блок с отборами по сегментам и ассортименту был удален. В итоге отчет либо выдает ошибку при исполнении (так как ожидаются определенные данные или параметры), либо начинает выводить некорректные цифры. Это классическая ситуация при работе с СКД в современных типовых решениях.

Решение №1: Отказ от использования визуального конструктора

Самый надежный способ сохранить логику сложного отчета — это редактирование текста запроса вручную. Если вам нужно внести изменения (например, добавить вывод штрихкодов), выполните следующие шаги:

  1. Откройте схему компоновки данных внешнего отчета.
  2. Перейдите на закладку «Наборы данных».
  3. Выделите нужный набор данных (запрос).
  4. Не нажимайте кнопку «Конструктор запроса»! Вместо этого работайте напрямую в текстовом поле «Запрос».
  5. Если вам нужно добавить новое поле, аккуратно допишите его в секцию ВЫБРАТЬ и, если требуется, в секции соединений.
  6. Если вам все же пришлось воспользоваться конструктором для быстрого добавления полей, обязательно сохраните исходный текст запроса в отдельный текстовый файл (Блокнот). После выхода из конструктора сравните тексты и верните вручную те куски в фигурных скобках, которые конструктор удалил.

Решение №2: Использование нескольких наборов данных

Если вам крайне сложно редактировать основной гигантский запрос типового отчета вручную, мы можем пойти по пути наименьшего сопротивления и воспользоваться механизмом связей наборов данных в СКД:

  1. Создайте новый Набор данных - запрос в вашей схеме компоновки.
  2. В этом новом наборе напишите простой запрос, который выбирает только нужные вам дополнительные данные (например, штрихкоды из регистра сведений по ссылке номенклатуры).
  3. Перейдите на закладку «Связи наборов данных».
  4. Установите связь между основным (типовым) набором и вашим новым набором по ключевым полям (например, Номенклатура и Характеристика).
  5. Теперь вы сможете добавить поле штрихкода в настройки отчета, не меняя сложную структуру основного запроса.

Этот метод позволяет избежать риска повреждения «хрупкого» типового кода, который был написан разработчиками 1С вручную без оглядки на ограничения конструктора.

Решение №3: Работа с программным кодом в модуле объекта

Важно помнить, что современные отчеты (особенно «Прайс-лист») — это не только схема СКД. Огромная часть логики скрыта в модуле объекта отчета. Когда мы сохраняем отчет как внешний, нам необходимо проанализировать событие ПриКомпоновкеРезультата.

Рассмотрим основные нюансы:

Для корректной работы внешнего отчета обязательно скопируйте весь код из модуля объекта оригинального отчета в модуль вашего внешнего отчета. Если в коде встречаются обращения к методам типа Отчеты.ПрайсЛист.Создать(), замените их на универсальные методы обращения к текущему объекту.

Решение №4: Очистка кэша и переименование вариантов

Иногда отчет «не работает» не из-за кода, а из-за того, что платформа пытается применить к вашей новой структуре старые пользовательские настройки, сохраненные в базе данных. Проанализируем рекомендации из сообщения №20:

Если вы изменили состав полей в СКД, попробуйте следующее:

  1. Измените Имя отчета в свойствах корня объекта метаданных.
  2. Переименуйте Варианты отчета на закладке «Настройки» в СКД.
  3. При открытии через «Файл — Открыть» система увидит новое имя и не будет пытаться подтянуть кэшированные настройки от типового отчета, что часто спасает от непонятных ошибок типа «Поле не найдено» или «Ошибка инициализации».

Общие рекомендации при работе с СКД в УТ 11/ERP

Для эффективной работы мы рекомендуем придерживаться следующих правил:

1. Изучайте XML-структуру. Иногда проще открыть файл .os (схему) как текстовый документ и увидеть реальный текст запроса там, без искажений интерфейса 1С.

2. Используйте консоль запросов с поддержкой СКД. Обычная консоль запросов не поймет фигурные скобки. Для тестирования таких запросов используйте специализированные инструменты (например, консоль системы компоновки данных), которые умеют имитировать работу отчета.

3. Регистрируйте отчет в системе. Вместо простого открытия через меню «Файл», добавьте ваш отчет в справочник «Дополнительные отчеты и обработки». В этом случае БСП инициализирует все необходимые механизмы, и отчет будет работать в среде, максимально приближенной к «родной» для него конфигурации.

Подводя итог, можно сказать: работоспособность сложного отчета после конструктора — это вопрос контроля за расширениями СКД. Будьте внимательны к тексту в фигурных скобках и не доверяйте визуальному редактору автоматическую переборку кода, написанного вручную профессионалами 1С.

← На главную