Как исправить ошибку несовместимости типов при расчете итогов по периодам в запросе 1С

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

При разработке отчетов и обработок часто возникает задача объединить или соединить две таблицы значений во временных таблицах и рассчитать итоги с детализацией по временной шкале через конструкцию ИТОГИ ПО ... ПЕРИОДАМИ. В ряде случаев платформа 1С возвращает ошибку "несовместимые типы", даже если в исходных таблицах колонкам назначен тип Дата. Проанализируем причины возникновения этой проблемы и разберем способы ее устранения.

Причина 1: Конфликт имени поля с зарезервированным словом

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

Для исправления ситуации выполним следующие шаги:

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

Посмотрим на пример правильного формирования запроса:


Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ТЗ1.ДатаОперации КАК ДатаОперации,
    |	ТЗ1.Сумма КАК Сумма,
    |	ТЗ2.Количество КАК Количество
    |ИЗ
    |	втТаблица1 КАК ТЗ1
    |		ЛЕВОЕ СОЕДИНЕНИЕ втТаблица2 КАК ТЗ2
    |		ПО ТЗ1.Идентификатор = ТЗ2.Идентификатор
    |ИТОГИ
    |	СУММА(Сумма),
    |	СУММА(Количество)
    |ПО
    |	ДатаОперации ПЕРИОДАМИ(ДЕНЬ, , )";

Причина 2: Попадание значений NULL при соединениях таблиц

Если в запросе используется ЛЕВОЕ СОЕДИНЕНИЕ или ПОЛНОЕ СОЕДИНЕНИЕ, то для строк, не нашедших соответствия во второй таблице, значения несовпавших колонок принимают значение NULL. Конструкция ИТОГИ ПО ... ПЕРИОДАМИ требует строгого типа Дата во всех записях выборки. Попадание значения NULL в группировочное поле даты вызывает ошибку несовместимости типов.

Разберем способы защиты от значений NULL:

  1. Используем функцию ЕСТЬNULL для подстановки пустой даты или даты из ведущей таблицы.
  2. Применяем явное приведение типа с помощью функции ВЫРАЗИТЬ.

Рассмотрим пример обработки поля даты в тексте запроса:


ВЫБРАТЬ
	ВЫРАЗИТЬ(ЕСТЬNULL(ТЗ1.ДатаОперации, ДАТАВРЕМЯ(1, 1, 1)) КАК ДАТА) КАК ДатаОперации,
	ЕСТЬNULL(ТЗ1.Сумма, 0) КАК Сумма
ИЗ
	втТаблица1 КАК ТЗ1

Причина 3: Неявная типизация колонки даты в коде 1С

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

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


Квалификатор = Новый КвалификаторыДаты(ЧастиДаты.ДатаВремя);
МассивТипов = Новый Массив;
МассивТипов.Добавить(Тип("Дата"));

ОписаниеТипаДата = Новый ОписаниеТипов(МассивТипов, , , Квалификатор);
ТаблицаДанных.Колонки.Добавить("ДатаОперации", ОписаниеТипаДата);

Ограничения использования итогов по периодам

Разберем важные системные ограничения платформы 1С при работе с секцией ИТОГИ:

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