Как исправить ошибки в запросе СКД при переносе из обычного отчета в 1С:УПП 1.3

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

Перенос текстов запросов из обычных отчетов на базе Построителя отчетов в Систему компоновки данных (СКД) — частая задача при доработке конфигурации 1С:Управление производственным предприятием 1.3. Однако в процессе адаптации разработчики нередко сталкиваются с синтаксическими ошибками и сбоями выполнения пакетов запросов. Разберем по шагам ключевые проблемы и способы их устранения.

Синтаксическая ошибка пакета запросов: пропущенная точка с запятой

При объединении нескольких запросов в пакет во временные таблицы платформа 1С требует обязательного разделения каждого запроса точкой с запятой ;. Если скопировать запрос из консоли или другого отчета без разделителей, система выдаст ошибку вида Синтаксическая ошибка "<<?>>ВЫБРАТЬ" на начале следующей секции.

Рассмотрим пример ошибочного пакета запросов:


ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиОбороты.Период,
    ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
    ВзаиморасчетыСКонтрагентамиОбороты.Организация,
    ВзаиморасчетыСКонтрагентамиОбороты.Контрагент,
    ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовОборот
ПОМЕСТИТЬ ВтВзаиморасчеты
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&НачалоПериода, &КонецПериода) КАК ВзаиморасчетыСКонтрагентамиОбороты

ВЫБРАТЬ
    ВтВзаиморасчеты.Период КАК Период,
    ВтВзаиморасчеты.Регистратор КАК Регистратор,
    ВтВзаиморасчеты.СуммаВзаиморасчетовОборот КАК СуммаОборот
ИЗ
    ВтВзаиморасчеты КАК ВтВзаиморасчеты

Проанализируем причину ошибки: между первой частью с ПОМЕСТИТЬ ВтВзаиморасчеты и второю частью ВЫБРАТЬ отсутствует разделитель ;. Чтобы запрос корректно отработал в СКД, разделим предложения пакета:


ВЫБРАТЬ
    ВзаиморасчетыСКонтрагентамиОбороты.Период,
    ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
    ВзаиморасчетыСКонтрагентамиОбороты.Организация,
    ВзаиморасчетыСКонтрагентамиОбороты.Контрагент,
    ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
    ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовОборот
ПОМЕСТИТЬ ВтВзаиморасчеты
ИЗ
    РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&НачалоПериода, &КонецПериода) КАК ВзаиморасчетыСКонтрагентамиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВтВзаиморасчеты.Период КАК Период,
    ВтВзаиморасчеты.Регистратор КАК Регистратор,
    ВтВзаиморасчеты.СуммаВзаиморасчетовОборот КАК СуммаОборот
ИЗ
    ВтВзаиморасчеты КАК ВтВзаиморасчеты
;

Перенос конструкций ИТОГИ и УПОРЯДОЧИТЬ ПО в СКД

В обычных отчетах для подсчета группировочных итогов и сортировки используются секции ИТОГИ и УПОРЯДОЧИТЬ ПО прямо в тексте запроса. В запросах схемы компоновки данных эти инструкции не используются и должны быть полностью удалены.

Выясним, как перенести вычисление итогов и сортировку на стандартные механизмы СКД:

  1. Удаление секций из текста запроса: Полностью вырезаем конструкции ИТОГИ СУММА(...) ПО ... и УПОРЯДОЧИТЬ ПО ... из текста запроса в конструкторе набора данных.
  2. Настройка ресурсов: Переходим на вкладку Ресурсы в схеме компоновки данных. Добавляем поля, по которым необходимо вычислять итоги (например, СуммаДокумента, ОстатокДолга), и указываем агрегатные функции: СУММА(СуммаДокумента) или МАКСИМУМ(ДнейДолга).
  3. Настройка группировок и сортировки: Переходим на вкладку Настройки. В иерархической структуре отчета добавляем необходимые группировки по полям (например, Контрагент, ДоговорКонтрагента). На вкладке Сортировка задаем порядок следования полей.

Ошибки при сравнении типов и арифметических операциях в СКД

При переносе запросов в СКД часто возникают runtime-ошибки вида "Неверные параметры в операции сравнения" или "Неверные параметры '-'". Разберем их основные причины и методы исправления.

1. Сравнение несовместимых типов или параметров без явного типа (Организация = &Организация)

Если в схеме компоновки данных у параметра (например, &Организация) на вкладке Параметры не задан конкретный тип данных, платформа 1С присваивает ему составной тип или Неопределено при пустом значении. В результате при сравнении поля таблицы Организация с этим параметром СУБД возвращает ошибку несовместимости типов.

Для исправления перейдите на вкладку Параметры схемы компоновки данных и принудительно укажите доступный тип для параметра — СправочникСсылка.Организации.

2. Арифметика и разность дат с значениями NULL (РАЗНОСТЬДАТ - ДопустимоеЧислоДнейЗадолженности)

Если числовое поле получается в результате ЛЕВОЕ СОЕДИНЕНИЕ, оно может содержать значение NULL. Вычитание NULL из результата функции РАЗНОСТЬДАТ вызовет синтаксическую ошибку выполнения выражения в СУБД.

Решение заключается в обязательном использовании функции ЕСТЬНУЛЛЬ() в запросе:


ВЫБРАТЬ
    ЕСТЬНУЛЛЬ(ВтДолгыПоДокументам.ДопустимоеЧислоДнейЗадолженности, 0) КАК ДопустимоеЧислоДней
ПОМЕСТИТЬ ВтПодготовленныеДанные
ИЗ
    ВтДолгыПоДокументам КАК ВтДолгыПоДокументам
;

Также рекомендуется удалять специфические для Построителя отчета конструкции вида {(Контрагент).* КАК Контрагент} из параметров виртуальных таблиц, так как СКД при включенном автозаполнении управляет отборами самостоятельно.

← На главную