Часто при разработке отчетов в 1С перед разработчиком встает задача вывести данные, которые хранятся в разных документах, в рамках одного общего списка или сводной таблицы. Попытки просто «сложить» результаты запросов или использовать арифметические операции к объектам 1С приводят к ошибкам. Давайте разберем, как правильно организовать такой отчет.
В языке запросов 1С попытка написать Документ1.Ссылка + Документ2.Ссылка является грубой ошибкой. Запрос — это инструмент выборки данных из базы, он работает с типами данных и структурами таблиц. Объекты 1С (ссылки на документы) нельзя складывать математически, как числа. Более того, если вы просто перечислите две таблицы в блоке ИЗ, платформа создаст так называемое «декартово произведение», что приведет к неверным цифрам и многократному дублированию строк.
Чтобы собрать данные из документов «Прочие расходы» и «Зарплата» в один отчет, мы должны рассматривать каждый документ как отдельный источник данных, а затем «склеить» их вертикально. Для этого существует конструкция ОБЪЕДИНИТЬ ВСЕ.
Разберем по шагам, как подготовить такой запрос:
ОБЪЕДИНИТЬ ВСЕ.Рассмотрим, как должен выглядеть программный код построения такого запроса. Мы берем нужные поля из табличных частей обоих документов и приводим их к общему знаменателю:
ВЫБРАТЬ
ПрочиеРасходыТЧ.Ссылка КАК Регистратор,
ПрочиеРасходыТЧ.Заметка КАК Комментарий,
ПрочиеРасходыТЧ.Сумма КАК СуммаРасход
ИЗ
Документ.ПрочиеРасходы.ТЧ КАК ПрочиеРасходыТЧ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ЗарплатаТЧ.Ссылка КАК Регистратор,
ЗарплатаТЧ.Заметка КАК Комментарий,
ЗарплатаТЧ.Сумма КАК СуммаРасход
ИЗ
Документ.Зарплата.ТЧ КАК ЗарплатаТЧ
Чтобы ваш отчет работал стабильно и не вызывал ошибок при формировании, соблюдайте следующие требования:
ОБЪЕДИНИТЬ ВСЕ) должно быть строго одинаковое количество выбираемых колонок.КАК) определяются первой частью запроса. Если во второй части вы укажете другое имя, система проигнорирует его в пользу первого варианта.Если ваши документы делают движения по одному и тому же регистру накопления (например, «Касса»), зачастую проще и эффективнее вообще не обращаться к табличным частям документов напрямую. Вы можете сделать запрос к виртуальной таблице регистра:
ВЫБРАТЬ
КассаДвижения.Регистратор,
КассаДвижения.СуммаРасход
ИЗ
РегистрНакопления.Касса.Обороты(&ДатаНачала, &ДатаКонца) КАК КассаДвижения
В этом случае платформа сама объединит все движения документов в рамках периода, что избавит вас от необходимости вручную прописывать ОБЪЕДИНИТЬ ВСЕ для каждого нового вида документа. Использование ВЫРАЗИТЬ(Регистратор КАК Документ.ИмяДокумента) позволит вам получать доступ к специфичным реквизитам документов, если это потребуется в процессе формирования отчета.
Используйте этот метод, и ваш код станет чище, а работа с отчетами — надежнее!