Как в отчете СКД вывести продажи по конкретному поставщику, если в 1С:Бухгалтерия 3.0 не ведется партионный учет?

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

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

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

Способ 1. Использование временных таблиц и фильтрации по номенклатуре

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

Разберем реализацию этого метода в запросе СКД по шагам:

  1. Создание временной таблицы номенклатуры: В первом запросе пакета мы выбираем уникальные значения номенклатуры из регистра Хозрасчетный, где контрагент соответствует нашему параметру.
  2. Выборка всех движений: Во втором запросе мы выбираем данные по 41 (или 10) счету, накладывая условие, что номенклатура должна входить в список из первой временной таблицы.

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


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

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

Важный нюанс: Чтобы отчет корректно работал, когда поставщик не выбран (показывал всё), мы добавили в условие проверку на пустую ссылку: ИЛИ &Поставщик = ЗНАЧЕНИЕ(Справочник.Контрагенты.ПустаяСсылка).

Способ 2. Связи наборов данных в СКД

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

Рассмотрим алгоритм настройки:

  1. Создаем НаборДанных_Поступления. Здесь мы выбираем данные по дебету счета 41 и устанавливаем отбор по субконто Контрагент.
  2. Создаем НаборДанных_Продажи. Здесь выбираем данные по кредиту счета 41 (реализации).
  3. На вкладке "Связи наборов данных" связываем их по полю Номенклатура.

Главная хитрость: при такой связи, когда пользователь устанавливает отбор по поставщику в первом наборе, СКД автоматически передаст список полученной номенклатуры во второй набор в качестве параметра связи. Таким образом, в отчет попадут продажи только тех товаров, которые "засветились" в поступлениях от этого поставщика за выбранный период.

Способ 3. Метод "Последней закупки" (Срез последних на минималках)

Если задача стоит более остро — нужно не просто увидеть продажи товара, а попытаться "привязать" каждую конкретную строку реализации к поставщику (даже без партионки) — можно применить логику последнего прихода. Мы предполагаем, что проданный товар — это тот, который пришел последним перед моментом продажи.

Проанализируем, как это реализовать в запросе:

Для каждой записи о реализации мы делаем левое соединение с вложенным запросом, который выбирает максимальную дату документа поступления для этой же номенклатуры, где дата поступления меньше или равна дате реализации.

Это дает определенную погрешность (если на складе остатки от разных поставщиков), но для управленческого анализа в условиях отсутствия партионного учета это часто является приемлемым компромиссом.

Способ 4. Использование "скрытого" партионного учета (НДС)

Мало кто учитывает, что даже если на счетах 41 и 10 в БП 3.0 отключен партионный учет, система может продолжать вести его в других регистрах. Разберем ситуацию: если в базе включен раздельный учет НДС или ведется учет прослеживаемых товаров, программа обязана знать, от какого поставщика пришел товар, для корректного формирования книги покупок и продаж.

Посмотрим на регистры накопления, которые могут нам помочь:

Построение отчета по этим регистрам может дать гораздо более точную картину связей "Поставщик — Продажа", так как там измерение АналитикаУчетаПартий (или аналогичное) присутствует практически всегда, независимо от настроек 41 счета.

Способ 5. Виртуальное восстановление последовательности (ФИФО в коде)

Если требуется абсолютная точность за прошлые периоды, а перепроводить документы нельзя, мы можем реализовать программный алгоритм распределения в модуле отчета. Рассмотрим эту методику, которую иногда называют "аналогом РАУЗ" для исторических данных:

  1. В процедуре ПриКомпоновкеРезультата мы программно выполняем запрос, который выгружает все поступления (с начала времен) и все реализации в таблицу значений.
  2. Сортируем таблицу по хронологии.
  3. Проходим циклом и "распределяем" количества: первая продажа уменьшает остаток первого прихода.
  4. Результат (таблицу, где у каждой продажи заполнен вычисленный поставщик) передаем обратно в СКД через Набор данных - объект.

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

Резюме: Для большинства задач в БП 3.0 достаточно Способа №1 (временные таблицы по номенклатуре). Он прост в поддержке, быстро работает и дает пользователю ожидаемую картинку: "вот что мы купили у Конфетпрома, а вот как эти товары продавались".

← На главную