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