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