Как исправить ошибку "Несоответствие типов (Параметр номер "1")" в СКД 1С при работе со "СрезомПоследних"?

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

При создании отчетов в Системе Компоновки Данных (СКД) 1С, особенно при использовании виртуальных таблиц, таких как СрезПоследних, разработчики часто сталкиваются с ошибкой "Несоответствие типов (Параметр номер "1")". Эта ошибка указывает на то, что в параметр виртуальной таблицы был передан неверный тип данных. Давайте подробно разберем, почему возникает эта проблема и как ее эффективно устранить.

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


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    КадроваяИсторияСотрудниковСрезПоследних.Сотрудник КАК Сотрудник,
    КадроваяИсторияСотрудниковСрезПоследних.Организация КАК Организация,
    КадроваяИсторияСотрудниковСрезПоследних.Подразделение КАК Подразделение,
    КадроваяИсторияСотрудниковСрезПоследних.Должность КАК Должность,
    ТекущиеКадровыеДанныеСотрудников.ДатаУвольнения КАК ДатаУвольнения,
    ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.Показатель КАК Показатель,
    ЗначенияПедическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.Значение КАК Значение
ИЗ
    РегистрСведений.КадроваяИсторияСотрудников.СрезПоследних КАК КадроваяИсторияСотрудниковСрезПоследних
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
        ПО КадроваяИсторияСотрудниковСрезПоследних.Сотрудник = ТекущиеКадровыеДанныеСотрудников.Сотрудник
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников.СрезПоследних КАК ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних
        ПО КадроваяИсторияСотрудниковСрезПоследних.Сотрудник = ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудниковСрезПоследних.Сотрудник

В этом запросе мы обращаемся к виртуальным таблицам СрезПоследних для регистров КадроваяИсторияСотрудников и ЗначенияПериодическихПоказателейРасчетаЗарплатыСотрудников. Именно работа с этими виртуальными таблицами, которые по своей природе требуют параметра "Период", является источником возникновения ошибки "Несоответствие типов".

Понимание причины ошибки: Некорректный тип параметра

Самая распространенная причина ошибки "Несоответствие типов (Параметр номер "1")" заключается в том, что виртуальная таблица СрезПоследних ожидает параметр типа "Дата" или "МоментВремени", а вместо этого получает значение другого типа – например, строку, число или Неопределено. Разберем основные сценарии, приводящие к этой проблеме.

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

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

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

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

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

Случай 1: Проблема с неявным параметром "Период"

Давайте подробно рассмотрим ситуацию, когда основной причиной ошибки является неявное создание параметра "Период" системой СКД.

Автоматическое создание параметра "Период"

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

Даже если мы не указываем никаких параметров в тексте запроса явно, СКД все равно будет ожидать, что для этого автоматически созданного параметра "Период" будет предоставлено значение. И ключевым моментом является то, что это значение должно быть корректного типа, а именно "Дата" или "МоментВремени".

Проверка заполнения параметра и его типа

Одной из наиболее частых причин ошибки является отсутствие заполнения этого автоматически созданного параметра "Период" или его некорректное заполнение. Чтобы устранить эту проблему, мы должны:

  1. Перейти на вкладку "Параметры" схемы компоновки данных.

  2. Найти параметр с именем "Период". Если мы используем стандартный параметр "Период" отчета, то СКД может использовать его окончание. В противном случае, будет создан отдельный параметр.

  3. Убедиться, что для этого параметра установлен тип "Дата" (или "МоментВремени"). Если тип другой, следует его скорректировать.

  4. Заполнить параметр значением: На вкладке "Настройки" или при формировании отчета в пользовательском режиме, мы должны убедиться, что параметр "Период" имеет осмысленное значение даты. Например, если пользователь случайно ввел строку вроде "сегодня" или "за всю мою жисть" вместо конкретной даты (как было упомянуто в сообщении 6), это приведет к ошибке "Несоответствие типов". Система попытается преобразовать строку в дату и потерпит неудачу.

Случай 2: Конфликт с существующим параметром "Период"

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

Описание проблемы

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

Решение: Переименование и явное указание

Для разрешения этого конфликта мы рекомендуем следующий подход:

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

  2. Явно укажите, какую часть вашего параметра использовать для виртуальной таблицы. Поскольку СрезПоследних обычно требует одну дату (дату окончания периода), мы будем использовать свойство ДатаОкончания нашего параметра. В тексте запроса это будет выглядеть следующим образом:

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

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

Случай 3: Некорректный синтаксис передачи параметров в виртуальные таблицы

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

Важность фигурных скобок для параметров виртуальных таблиц

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

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

Пример правильного синтаксиса

Давайте рассмотрим правильный синтаксис для передачи параметров в виртуальную таблицу СрезПоследних:


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

Разберем этот пример по частям:

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

Дополнительные рекомендации и частые ошибки

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

1. Проверка типа параметра в СКД

Мы всегда должны убеждаться, что на вкладке "Параметры" схемы компоновки данных тип параметра Период (или любого другого параметра, передаваемого в виртуальную таблицу, ожидающую дату) установлен как "Дата" или "МоментВремени". Если по ошибке там указан "Строка", "Число" или любой другой некорректный тип, это неминуемо приведет к ошибке.

2. Использование функций НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА()

Для обеспечения корректной работы с датами и исключения возможных ошибок, связанных со временем в дате (например, пользователь ввел дату без времени, а система ожидает начало или конец дня), рекомендуется использовать функции НАЧАЛОПЕРИОДА() и КОНЕЦПЕРИОДА(). Эти функции позволяют явно указать, что мы хотим получить начало или конец указанного периода (день, месяц, год).

Например, если нам нужен срез на конец дня, соответствующего дате параметра:


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

Здесь КОНЕЦПЕРИОДА(&ДатаОтчета, ДЕНЬ) гарантирует, что в виртуальную таблицу будет передано значение даты, соответствующее концу дня, указанного в параметре ДатаОтчета.

3. Отличие работы в консоли запросов и в СКД

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

4. Установка параметров на вкладках "Параметры" и "Настройки" СКД

Мы должны внимательно настраивать параметры на соответствующих вкладках СКД:

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

Заключение

Ошибка "Несоответствие типов (Параметр номер "1")" в СКД при работе со СрезомПоследних является частой, но, как мы видим, решаемой проблемой. Ее причины кроются в неправильной передаче или определении параметра даты. Мы должны внимательно проверять следующие моменты:

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

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

← На главную