Как исправить ошибку «Несоответствие типов» в срезе последних запроса СКД 1С?

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

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

В этой статье мы подробно разберем, почему возникает ошибка «Несоответствие типов (Параметр номер 1)» при обращении к таблице СрезПоследних, откуда в тексте запроса берется загадочный параметр &П3 (или &П1), которого не было в исходном коде, и как быстро исправить эту проблему несколькими надежными способами.

Анализируем суть проблемы и текст ошибки

Давайте посмотрим на классическое сообщение об ошибке, которое получает программист при попытке сформировать отчет:


Ошибка выполнения отчета по причине:
Ошибка исполнения отчета по причине:
Ошибка получения данных по причине:
Ошибка создания набора данных "НаборДанных1" по причине:
Ошибка при исполнении запроса набора данных по причине:
{(538, 2)}: Ошибка обработки представления "РегистрСведений.ДокументыФизическихЛиц.СрезПоследних:Несоответствие типов (Параметр номер ""1"")"
>РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(&П3, ) КАК ДокументыФизическихЛицСрезПоследних

На первый взгляд это сообщение вызывает недоумение. Разработчик открывает свой запрос в конструкторе схемы компоновки данных и видит там совершенно другую картину:


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

Возникает закономерный вопрос: почему платформа ругается на параметр &П3, если в реальном запросе используется параметр &НачПериод? Выясним причину этого поведения.

Почему в ошибке фигурирует параметр &П3 вместо оригинального имени?

Проанализируем внутренние механизмы работы платформы 1С:Предприятие. Дело в том, что Система компоновки данных не отправляет написанный вами SQL-подобный запрос в базу данных в неизменном виде. Перед выполнением запроса СКД выполняет сложный процесс трансляции, оптимизации и генерации итогового текста запроса.

В ходе этой трансляции платформа:

  1. Анализирует все активные поля, группировки и отборы, выбранные пользователем в настройках отчета.
  2. Исключает неиспользуемые таблицы и соединения (если включена соответствующая оптимизация).
  3. Заменяет пользовательские имена параметров на системные переменные, такие как &П1, &П2, &П3 и так далее.

Поскольку ошибка несоответствия типов возникает непосредственно на уровне СУБД или на этапе подготовки виртуальной таблицы самой платформой, в технологический журнал и в окно ошибки выводится уже трансформированный системный текст запроса. Таким образом, параметр &П3 — это не что иное, как ваш параметр &НачПериод после обработки его компоновщиком данных.

Главные причины возникновения ошибки «Несоответствие типов»

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

Если на момент исполнения запроса в этот параметр передается значение другого типа, СУБД возвращает ошибку несоответствия типов. Рассмотрим две основные причины, почему это происходит на практике.

Причина А: Передача пустого значения (Неопределено)

Это самая частая причина, с которой сталкиваются разработчики. Если параметр (в нашем случае &НачПериод) скрыт от пользователя (настроено ограничение доступности) и при этом никак не заполняется программно или через выражения СКД, его значение по умолчанию будет равно Неопределено.

При попытке передать значение Неопределено в виртуальную таблицу СрезПоследних платформа генерирует ошибку, так как пустое значение не может быть интерпретировано как валидная дата среза.

Причина Б: Конфликт типов при использовании стандартного периода

Очень часто для удобства пользователей в отчетах используется тип данных СтандартныйПериод. Он позволяет выбирать интервалы в удобном интерфейсном виде («Этот месяц», «Прошлый год» и т.д.). Разработчик добавляет параметр с именем Период и типом СтандартныйПериод.

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

Разберем по шагам варианты решения проблемы

Рассмотрим несколько практических и надежных способов устранения данной ошибки в конструкторе схемы компоновки данных.

Способ 1: Использование фигурных скобок для необязательных параметров

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

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


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

Как это работает? Если параметр &НачПериод будет заполнен, СКД подставит его в запрос. Если же параметр останется пустым, компоновщик данных просто проигнорирует его наличие в фигурных скобках и сформирует запрос к актуальному срезу последних без вызова ошибки.

Способ 2: Задание выражения по умолчанию в параметрах СКД

Если параметр скрыт от пользователя, но в запросе он обязательно должен быть заполнен актуальным значением, мы можем настроить его автоматическое вычисление на вкладке «Параметры» в СКД.

Выполним следующие шаги:

  1. Откроем вкладку Параметры в конструкторе схемы компоновки данных.
  2. Найдем строку с нашим параметром (например, НачПериод).
  3. В колонке Выражение напишем формулу, которая гарантированно возвращает корректный тип Дата. Например, для получения среза на текущую дату введем выражение: ТекущаяДата().
  4. Установим флаг Ограничение доступности, чтобы скрыть этот технический параметр от конечного пользователя и не вводить его в заблуждение на форме настроек.

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

Способ 3: Разделение параметров при использовании Стандартного Периода

Если в вашем отчете обязательно нужен выбор периода пользователем, мы рекомендуем использовать разделение параметров, чтобы избежать конфликтов имен типов.

Разберем детально этот алгоритм:

  1. Создадим на вкладке Параметры пользовательский параметр с именем ПериодОтчета и установим для него тип данных СтандартныйПериод. Именно его мы выведем в пользовательские настройки отчета.
  2. Для параметров виртуальных таблиц (таких как НачалоПериода, КонецПериода или Период) настроим автоматический расчет на основе созданного нами пользовательского параметра.
  3. В строке параметра НачПериод в колонке Выражение пропишем: &ПериодОтчета.ДатаНачала.
  4. Если нам нужен срез на конец выбранного периода, мы можем использовать выражение: КонецПериода(&ПериодОтчета.ДатаОкончания, "ДЕНЬ").
  5. Для всех этих технических параметров обязательно взведем флаг Ограничение доступности.

Благодаря этому подходу пользователь будет видеть на форме только один понятный элемент выбора периода, а система автоматически вычленит из него нужные даты и безопасно передаст их в параметры виртуальных таблиц запроса, исключая любые конфликты типов.

Способ 4: Проверка типов данных в параметрах

Посмотрим на настройки типов данных параметров. Перейдем на вкладку Параметры в СКД. Для используемого параметра в колонке Тип должен быть жестко выбран тип Дата.

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

Рассмотренные нами методы позволяют полностью исключить возникновение подобных ошибок при формировании отчетов, делая их работу стабильной и предсказуемой.

← На главную