Перенос текстов запросов из обычных отчетов на базе Построителя отчетов в Систему компоновки данных (СКД) — частая задача при доработке конфигурации 1С:Управление производственным предприятием 1.3. Однако в процессе адаптации разработчики нередко сталкиваются с синтаксическими ошибками и сбоями выполнения пакетов запросов. Разберем по шагам ключевые проблемы и способы их устранения.
При объединении нескольких запросов в пакет во временные таблицы платформа 1С требует обязательного разделения каждого запроса точкой с запятой ;. Если скопировать запрос из консоли или другого отчета без разделителей, система выдаст ошибку вида Синтаксическая ошибка "<<?>>ВЫБРАТЬ" на начале следующей секции.
Рассмотрим пример ошибочного пакета запросов:
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОбороты.Период,
ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
ВзаиморасчетыСКонтрагентамиОбороты.Организация,
ВзаиморасчетыСКонтрагентамиОбороты.Контрагент,
ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовОборот
ПОМЕСТИТЬ ВтВзаиморасчеты
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&НачалоПериода, &КонецПериода) КАК ВзаиморасчетыСКонтрагентамиОбороты
ВЫБРАТЬ
ВтВзаиморасчеты.Период КАК Период,
ВтВзаиморасчеты.Регистратор КАК Регистратор,
ВтВзаиморасчеты.СуммаВзаиморасчетовОборот КАК СуммаОборот
ИЗ
ВтВзаиморасчеты КАК ВтВзаиморасчеты
Проанализируем причину ошибки: между первой частью с ПОМЕСТИТЬ ВтВзаиморасчеты и второю частью ВЫБРАТЬ отсутствует разделитель ;. Чтобы запрос корректно отработал в СКД, разделим предложения пакета:
ВЫБРАТЬ
ВзаиморасчетыСКонтрагентамиОбороты.Период,
ВзаиморасчетыСКонтрагентамиОбороты.Регистратор,
ВзаиморасчетыСКонтрагентамиОбороты.Организация,
ВзаиморасчетыСКонтрагентамиОбороты.Контрагент,
ВзаиморасчетыСКонтрагентамиОбороты.ДоговорКонтрагента,
ВзаиморасчетыСКонтрагентамиОбороты.СуммаВзаиморасчетовОборот
ПОМЕСТИТЬ ВтВзаиморасчеты
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.Обороты(&НачалоПериода, &КонецПериода) КАК ВзаиморасчетыСКонтрагентамиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВтВзаиморасчеты.Период КАК Период,
ВтВзаиморасчеты.Регистратор КАК Регистратор,
ВтВзаиморасчеты.СуммаВзаиморасчетовОборот КАК СуммаОборот
ИЗ
ВтВзаиморасчеты КАК ВтВзаиморасчеты
;
В обычных отчетах для подсчета группировочных итогов и сортировки используются секции ИТОГИ и УПОРЯДОЧИТЬ ПО прямо в тексте запроса. В запросах схемы компоновки данных эти инструкции не используются и должны быть полностью удалены.
Выясним, как перенести вычисление итогов и сортировку на стандартные механизмы СКД:
ИТОГИ СУММА(...) ПО ... и УПОРЯДОЧИТЬ ПО ... из текста запроса в конструкторе набора данных.СуммаДокумента, ОстатокДолга), и указываем агрегатные функции: СУММА(СуммаДокумента) или МАКСИМУМ(ДнейДолга).Контрагент, ДоговорКонтрагента). На вкладке Сортировка задаем порядок следования полей.При переносе запросов в СКД часто возникают runtime-ошибки вида "Неверные параметры в операции сравнения" или "Неверные параметры '-'". Разберем их основные причины и методы исправления.
1. Сравнение несовместимых типов или параметров без явного типа (Организация = &Организация)
Если в схеме компоновки данных у параметра (например, &Организация) на вкладке Параметры не задан конкретный тип данных, платформа 1С присваивает ему составной тип или Неопределено при пустом значении. В результате при сравнении поля таблицы Организация с этим параметром СУБД возвращает ошибку несовместимости типов.
Для исправления перейдите на вкладку Параметры схемы компоновки данных и принудительно укажите доступный тип для параметра — СправочникСсылка.Организации.
2. Арифметика и разность дат с значениями NULL (РАЗНОСТЬДАТ - ДопустимоеЧислоДнейЗадолженности)
Если числовое поле получается в результате ЛЕВОЕ СОЕДИНЕНИЕ, оно может содержать значение NULL. Вычитание NULL из результата функции РАЗНОСТЬДАТ вызовет синтаксическую ошибку выполнения выражения в СУБД.
Решение заключается в обязательном использовании функции ЕСТЬНУЛЛЬ() в запросе:
ВЫБРАТЬ
ЕСТЬНУЛЛЬ(ВтДолгыПоДокументам.ДопустимоеЧислоДнейЗадолженности, 0) КАК ДопустимоеЧислоДней
ПОМЕСТИТЬ ВтПодготовленныеДанные
ИЗ
ВтДолгыПоДокументам КАК ВтДолгыПоДокументам
;
Также рекомендуется удалять специфические для Построителя отчета конструкции вида {(Контрагент).* КАК Контрагент} из параметров виртуальных таблиц, так как СКД при включенном автозаполнении управляет отборами самостоятельно.