Как вывести разные виды документов в отдельные колонки отчета СКД?

Программист Управленческий учет Торговля и дистрибуция
← На главную

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

Метод 1. Использование кросс-таблицы в настройках СКД

Рассмотрим самый гибкий и динамичный способ, который позволяет избежать ручного прописывания каждого типа документа в запросе. Этот метод основан на использовании структуры «Таблица» в настройках компоновки.

Для начала проанализируем настройки запроса. Нам необходимо получить данные из виртуальной таблицы ОстаткиИОбороты регистра накопления (например, ТоварыНаСкладах). Чтобы отчет «видел» документы, в параметрах виртуальной таблицы обязательно указываем периодичность Регистратор. Разберем по шагам, как настроить поля:

  1. В схеме компоновки данных в наборе данных - запрос выберем поля Склад, Номенклатура, Регистратор, а также ресурсы: ВторойОстаток, Приход, Расход.
  2. Добавим вычисляемое поле или прямо в запросе создадим поле, определяющее тип документа. Используем конструкцию ТИПЗНАЧЕНИЯ(Регистратор). Для того чтобы в шапке отчета выводилось понятное название, применим функцию ПРЕДСТАВЛЕНИЕ.

Пример выражения в запросе:


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

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

Метод 2. Распределение через «ВЫБОР КОГДА» в запросе

Этот метод подходит, если список документов строго ограничен (например, 2-3 вида) и их названия не меняются. Посмотрим на пример кода:


ВЫБРАТЬ
    Склад,
    Номенклатура,
    СУММА(ВЫБОР
            КОГДА Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
                ТОГДА КоличествоРасход
            ИНАЧЕ 0
        КОНЕЦ) КАК РасходРеализация,
    СУММА(ВЫБОР
            КОГДА Регистратор ССЫЛКА Документ.СписаниеТоваров
                ТОГДА КоличествоРасход
            ИНАЧЕ 0
        КОНЕЦ) КАК РасходСписание
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК ТоварыНаСкладахОбороты
СГРУППИРОВАТЬ ПО
    Склад,
    Номенклатура

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

Особенности работы с остатками и ролями полей

Важно помнить, что при использовании периодичности Регистратор в виртуальных таблицах остатков и оборотов, СКД может начать «дублировать» начальные и конечные остатки в каждой строке с регистратором. Чтобы этого избежать и получить корректные итоги, необходимо правильно настроить Роли полей на вкладке «Наборы данных»:

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

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

Выясним причину возможного замедления отчета. Когда мы запрашиваем ОстаткиИОбороты с детализацией до Регистратора за большой период, система выполняет тяжелое соединение таблиц движений и итогов. Для ускорения работы рекомендуем:

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

Таким образом, мы проанализировали основные инструменты 1С для решения задачи. Использование кросс-таблиц совместно с функцией ТИПЗНАЧЕНИЯ является наиболее универсальным и "чистым" способом реализации отчета с динамическими колонками по видам регистраторов.

← На главную