Как программно рассчитать рентабельность продаж по конкретным документам в 1С:Бухгалтерия 3.0

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

При разработке собственных отчетов или обработок в конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) часто возникает необходимость получить данные о рентабельности проданных товаров или услуг. В отличие от управленческих конфигураций (таких как «Управление торговлей»), в бухгалтерии нет отдельного регистра «Выручка и продажи», где все данные лежат в готовом виде. Здесь нам приходится работать напрямую с планом счетов и регистрами бухгалтерии. Давайте разберем по шагам, как правильно извлечь данные для расчета рентабельности, какие нюансы учесть и к каким объектам системы обращаться.

Основные формулы и логика расчета

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

Рентабельность = (Валовая прибыль / Выручка чистая) * 100%

Для корректного расчета нам необходимо получить три составляющие:

  1. Сумма продажи (Выручка): Оборот по кредиту счета 90.01.
  2. Сумма НДС: Оборот по дебету счета 90.03 (ее необходимо вычесть из выручки, чтобы получить «чистую» сумму).
  3. Себестоимость: Оборот по дебету счета 90.02.

Проанализируем ситуацию: Валовая прибыль вычисляется как Чистая выручка - Себестоимость. Если мы забудем вычесть НДС, показатель рентабельности будет завышен, что приведет к ошибкам в бизнес-аналитике.

Выбор источника данных: почему «Хозрасчетный»?

В БП 3.0 основным источником информации о финансовых результатах является регистр бухгалтерии Хозрасчетный. Мы можем использовать разные виртуальные таблицы этого регистра, но для решения нашей задачи лучше всего подходят две:

  1. Хозрасчетный.Обороты: Удобна, если нам нужны общие цифры за период в разрезе номенклатуры.
  2. Хозрасчетный.ДвиженияССубконто: Идеальна, когда нужно привязаться к конкретному документу-регистратору (например, «Реализация товаров и услуг»).

Рассмотрим подробнее использование таблицы движений. Именно в ней мы можем четко отследить соответствие между конкретной позицией номенклатуры и документом продажи. Себестоимость в этой таблице будет отражаться по дебету счета 90.02 в корреспонденции со счетами учета ТМЦ (41 «Товары», 43 «Готовая продукция», 45 «Товары отгруженные»).

Реализация запроса для получения данных

Посмотрим на пример построения запроса, который собирает все необходимые данные по конкретному документу реализации. Нам важно сгруппировать данные по номенклатуре, так как в одной реализации может быть несколько строк с одним и тем же товаром или разные партии одного товара.


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

Проанализируем этот запрос. Мы выбираем движения только по нужным нам счетам 90-й группы. Обратите внимание, что Субконто1 на этих счетах — это, как правило, Номенклатурные группы, а не сама Номенклатура. Это распространенная ловушка в БП 3.0.

Важный нюанс: В типовой БП 3.0 аналитика по конкретной Номенклатуре на счете 90.01/90.02 обычно отсутствует (там только Номенклатурные группы). Чтобы получить рентабельность в разрезе товаров, нам нужно смотреть на корреспондирующие счета. Например, для себестоимости это дебет 90.02 и кредит 41.01. Именно в кредите 41.01 будет указана конкретная номенклатура.

Корректный расчет себестоимости и «Закрытие месяца»

Выясним причину, по которой данные в вашем отчете могут не совпадать с реальностью или типовым отчетом «Валовая прибыль». В 1С:Бухгалтерии себестоимость при проведении документа реализации часто рассчитывается предварительно:

Следовательно, если мы запускаем расчет рентабельности за текущий, еще не закрытый месяц, мы увидим лишь предварительные цифры. Для получения точного результата необходимо убедиться, что регламентные операции выполнены.

Использование схемы компоновки данных (СКД) типового отчета

Разберем еще один продвинутый способ. Чтобы не изобретать велосипед и не прописывать вручную все условия (учет возвратов, корректировок реализаций, особенности налогообложения), мы можем программно обратиться к схеме компоновки данных типового отчета «Валовая прибыль».

Этот метод гарантирует, что ваша обработка покажет те же цифры, что и стандартный отчет программы. Мы можем программно сформировать отчет с фильтром по нашему документу и выгрузить результат в таблицу значений для дальнейшей обработки.


ОтчетОбъект = Отчеты.ВаловаяПрибыль.Создать();
СхемаКомпоновки = ОтчетОбъект.СхемаКомпоновкиДанных;

Настройки = ОтчетОбъект.КомпоновщикНастроек.ПолучитьНастройки();

// Устанавливаем период
ПараметрПериод = Настройки.ПараметрыДанных.Элементы.Найти("Период");
ПараметрПериод.Значение = Новый СтандартныйПериод(НачалоМесяца, КонецМесяца);
ПараметрПериод.Использование = Истина;

// Добавляем отбор по документу, если нужно
ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Регистратор");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Объект.ДокументСсылка;
ЭлементОтбора.Использование = Истина;

// Выводим в таблицу
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновки, Настройки);

ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки);

ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ТаблицаРезультат = ПроцессорВывода.Вывести(ПроцессорКомпоновки);

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

Резюме

Подведем итоги нашего исследования. Для расчета рентабельности в 1С:Бухгалтерия 3.0 необходимо:

  1. Использовать данные счета 90.01 для выручки, 90.03 для НДС и 90.02 для себестоимости.
  2. Помнить, что детальная аналитика по номенклатуре на этих счетах доступна только через корреспонденцию со счетами ТМЦ (например, 41-м).
  3. Всегда проверять, выполнено ли закрытие месяца, иначе показатели себестоимости будут неточными.
  4. Для получения максимально достоверных данных лучше использовать программный вызов СКД типового отчета «Валовая прибыль».

Используя предложенные методы, мы сможем построить качественную систему контроля рентабельности и оперативно выявлять сделки с низкой маржинальностью.

← На главную