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