Как реализовать хранение и оперативный анализ накопленных скидок в 1С:Управление торговлей 11?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

В процессе разработки в среде 1С:Управление торговлей 11 (УТ 11) часто возникает задача анализа эффективности ценовой политики. Одной из таких задач является построение системы отчетов по накопленным скидкам в разрезе клиентов, менеджеров и товаров. При этом ключевым требованием выступает оперативность получения данных и минимальная нагрузка на базу данных. Разберем пошагово, как спроектировать и реализовать такое решение, учитывая архитектурные особенности современных конфигураций на базе 1С:Предприятие 8.3.

Анализ типовых механизмов конфигурации

Перед тем как приступать к созданию новых объектов, проанализируем, что уже предлагает нам типовое решение. В УТ 11 данные о продажах и скидках аккумулируются в регистре накопления ВыручкаИСебестоимостьПродаж. Рассмотрим его структуру:

На первый взгляд, задача решена: данные есть, измерения проиндексированы. Однако, если мы преследуем цель максимально быстрого получения данных, использование этого регистра может быть неоптимальным. ВыручкаИСебестоимостьПродаж — это один из самых «тяжелых» регистров в системе, содержащий десятки измерений и ресурсов. Чтение данных из него для узкоспециализированного отчета по скидкам создаст лишнюю нагрузку на SQL-сервер. Поэтому для выполнения тестового задания или реализации высокопроизводительного блока учета целесообразно создать собственный регистр.

Проектирование специализированного регистра накопления

Создадим новый объект метаданных — РегистрНакопления. Назовем его, например, УдаленныеСкидкиОбороты. Выберем вид регистра — Обороты. Это критически важно, так как нам не нужно хранить остатки (скидка — это свершившийся факт продажи), а расчет итогов по оборотному регистру происходит значительно быстрее.

Разберем структуру измерений в порядке их следования (это напрямую влияет на построение индексов в БД):

  1. АналитикаУчетаПоПартнерам: Это стандартный ключ аналитики в УТ 11, который объединяет Партнера, Контрагента и Организацию. Использование ключа вместо прямой ссылки на справочник Партнеры ускоряет работу.
  2. Менеджер: Ссылка на справочник Пользователи.
  3. АналитикаУчетаНоменклатуры: Ключ аналитики, связывающий Номенклатуру, Характеристику и Склад.

Важный момент: Первое измерение в регистре всегда индексируется автоматически. Если в ТЗ требуется отчетность в разрезе менеджеров так же часто, как и по клиентам, для измерения Менеджер стоит установить свойство Индексировать.

В качестве ресурса добавим СуммаСкидки (тип ОпределяемыйТип.ДенежнаяСуммаЛюбогоЗнака).

Реализация логики накопления данных

Теперь выясним, откуда брать данные. Основным источником информации в УТ 11 является документ РеализацияТоваровУслуг. Нам необходимо внести изменения в процедуру проведения этого документа. Правильным подходом будет использование подписки на событие ОбработкаПроведения, чтобы не изменять модуль менеджера типового документа напрямую.

Рассмотрим пример кода, который собирает данные о скидках из табличных частей документа:


Процедура ПриПроведенииРеализации(Источник, Отказ, РежимПроведения) Экспорт
    
    // Скидки могут быть как ручные (в ТЧ Товары), так и автоматические (в ТЧ СкидкиНаценки)
    // Для простоты примера соберем итоговую сумму из ТЧ Товары
    
    Движения = Источник.Движения.УдаленныеСкидкиОбороты;
    Движения.Записывать = Истина;
    
    Для Каждого СтрокаТовара Из Источник.Товары Цикл
        
        СуммаСкидки = СтрокаТовара.СуммаРучнойСкидки + СтрокаТовара.СуммаАвтоматическойСкидки;
        
        Если СуммаСкидки <> 0 Тогда
            Движение = Движения.Добавить();
            Движение.Период = Источник.Дата;
            Движение.АналитикаУчетаПоПартнерам = Источник.АналитикаУчетаПоПартнерам;
            Движение.Менеджер = Источник.Менеджер;
            Движение.АналитикаУчетаНоменклатуры = СтрокаТовара.КлючАналитикиНоменклатуры;
            Движение.СуммаСкидки = СуммаСкидки;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Обратите внимание, что в УТ 11 поле СуммаАвтоматическойСкидки в ТЧ Товары заполняется при расчете скидок. Если логика вашей конфигурации иная, данные об автоматических скидках следует получать из распределенной таблицы СкидкиНаценки.

Оптимизация получения данных и отчетность

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

Проанализируем преимущества такого подхода:

Учет возвратов — «проверка на профессионализм»

Рассмотрим ситуацию: клиент приобрел товар со скидкой, а затем вернул его. Если мы не отразим возврат в нашем регистре, накопленная скидка по клиенту и менеджеру будет завышена. Настоящий специалист всегда предусмотрит этот момент. Документ ВозвратТоваровОтКлиента также должен делать движения по нашему регистру, но со знаком «минус» (поскольку это оборотный регистр).

Это позволит получать корректное сальдо скидок за период: Предоставленные скидки - Аннулированные скидки (при возврате).

Резюме

Для успешного решения задачи в рамках УТ 11 мы выбрали путь создания легкого специализированного регистра накопления. Мы выяснили, что использование ключей аналитики (АналитикаУчетаПоПартнерам, АналитикаУчетаНоменклатуры) является стандартом для современных систем, обеспечивающим высокую производительность. Настройка отчета через виртуальные таблицы Обороты гарантирует оперативность получения данных даже при огромных объемах продаж. Такой подход демонстрирует не только знание синтаксиса языка 1С, но и глубокое понимание архитектуры УТ 11 и принципов работы баз данных.

← На главную