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

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

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

Различие между оплатами и прибылью

Прежде чем приступать к написанию кода, проанализируем разницу в подходах. Часто пользователи и начинающие разработчики путают эти понятия:

  1. Оплаты (Движение денежных средств): Это фактически поступившие деньги на счета или в кассу организации (счета 50, 51, 52) в корреспонденции со счетами расчетов (например, 62).
  2. Прибыль (Финансовый результат): Это разница между выручкой (счет 90.01) и себестоимостью (счет 90.02), за вычетом НДС (счет 90.03).

Рассмотрим по шагам, как реализовать оба варианта запросов максимально оптимально.

Выбор правильной виртуальной таблицы регистра бухгалтерии

Для работы с бухгалтерскими данными в 1С используется РегистрБухгалтерии.Хозрасчетный. Начинающие разработчики часто пытаются использовать таблицу ДвиженияССубконто. Рассмотрим типичный (но ошибочный с точки зрения производительности) пример:


ВЫБРАТЬ
    ХозрасчетныйДвиженияССубконто.Сумма КАК Сумма,
    ХозрасчетныйДвиженияССубконто.СубконтоКт1 КАК Контрагент
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
ГДЕ
    ХозрасчетныйДвиженияССубконто.СубконтоКт1 = &Контрагент

Проанализируем ситуацию: использование ДвиженияССубконто заставляет систему перебирать все физические записи регистра. Это "тяжелая" операция. Вместо этого мы рекомендуем использовать виртуальную таблицу ОборотыДтКт или Обороты. Виртуальные таблицы используют заранее рассчитанные итоги, что значительно ускоряет выполнение запроса.

Получение всех оплат по контрагенту

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

Рассмотрим пример запроса, использующего виртуальную таблицу ОборотыДтКт:


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

Важный момент: Условия на контрагента необходимо передавать именно в параметры виртуальной таблицы, а не в секцию ГДЕ. Это позволяет серверу БД применить индексы на этапе формирования выборки, а не фильтровать уже полученный массив данных.

Как вычислить фактическую прибыль по контрагенту

Вычисление прибыли — более сложная задача. В типовой конфигурации 1С:Бухгалтерия 3.0 на счетах 90-й группы (Продажи) обычно нет аналитики (субконто) "Контрагенты". Там используется аналитика "Номенклатурные группы".

Для получения прибыли в разрезе контрагента программным путем в обработке мы можем использовать связь через регистратор. Разберем этот алгоритм:

  1. Сначала мы находим все документы реализации (регистраторы) по нужному контрагенту через счет 62.
  2. Затем по этим регистраторам получаем обороты по счету 90.

Посмотрим на пример логики построения такого запроса:


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

В данном примере мы используем вложенный запрос для фильтрации регистраторов по конкретному контрагенту. После получения этих данных, "чистая прибыль" вычисляется по формуле: Выручка - Себестоимость - НДС.

Практические советы по оптимизации

Рассмотрим подробнее несколько нюансов, которые помогут сделать вашу обработку быстрее:

Подведем итог. Для получения суммы оплат используйте ОборотыДтКт с фильтром по счетам 50, 51 и субконто контрагента. Для получения прибыли анализируйте обороты по 90-м счетам, связывая их с контрагентом через документы-регистраторы. Такой подход обеспечит точность данных и высокую скорость работы вашей обработки.

← На главную