Как добавить произвольную строку «Прочие покупатели» в отчет СКД для вывода корректировок себестоимости?

Программист 1C:Бухгалтерия Бухгалтерский учет
← На главную

При разработке или модификации отчетов на базе Системы компоновки данных (СКД) часто возникает ситуация, когда типовых данных из учетных регистров недостаточно для формирования полной картины. Типичный пример — отчет по продажам в разрезе контрагентов. В течение месяца себестоимость списывается по документам реализации, где покупатель известен. Однако при закрытии месяца регламентные операции корректируют себестоимость на счете 90.02, и в этих проводках аналитика по контрагенту отсутствует. Чтобы отчет «сходился» с бухгалтерским балансом, программисту необходимо добавить в отчет искусственную строку, например, «Прочие покупатели», куда попадут все суммы корректировок.

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

Разбор архитектуры запроса и постановка задачи

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

Наша задача — принудительно назначить таким записям строковое значение "Прочие покупатели" и объединить их с основным массивом данных. Для этого мы будем использовать конструкцию ОБЪЕДИНИТЬ ВСЕ в языке запросов 1С.

Шаг 1: Подготовка основного набора данных

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

Рассмотрим пример структуры первого запроса (Sales):


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

Шаг 2: Добавление данных по регламентным операциям

Теперь создадим вторую часть запроса, которая будет отвечать за «Прочих покупателей». Мы будем выбирать данные из оборотов счета 41 (или 43) в корреспонденции со счетом 90.02, фильтруя записи по типу регистратора РегламентнаяОперация.

Здесь кроется важный нюанс: чтобы СКД правильно обработала объединение, мы должны «заглушить» (поставить NULL или 0) те поля, которые не относятся к корректировкам, и вписать статичный текст в поле покупателя.

Пример части запроса для корректировок:


ОБЪЕДИНИТЬ ВСЕ

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

Шаг 3: Синхронизация полей (Сопоставление)

При объединении трех и более запросов (как в случае автора темы), крайне важно соблюдать последовательность полей. Если в одном запросе поле Себестоимость стоит на 5-й позиции, а в другом — на 6-й, данные «перепутаются», и в отчете вы увидите пустые ячейки или некорректные цифры. Это именно та проблема, с которой столкнулся автор в сообщении №8, когда у обычных контрагентов пропала себестоимость.

Рассмотрим правильную структуру объединения для СКД:

  1. Первый блок: Реализация (Выручка + Количество). Поле COGS (себестоимость) заполняем как 0.
  2. Второй блок: Прямое списание себестоимости в документах реализации. Поля Сумма и Количество заполняем как 0, заполняем поле COGS. Покупатель берется из документа.
  3. Третий блок: Регламентные операции. Поля выручки и количества — 0. Покупатель — строка "Прочие покупатели".

Важный совет: Чтобы избежать проблем с типами данных в поле Покупатель, лучше в самом запросе привести его к типу ВЫРАЗИТЬ(Покупатель КАК СТРОКА(100)) или использовать возможности СКД по оформлению. Однако, если вы хотите сохранить возможность «расшифровки» (drill-down) до контрагента, лучше оставить тип ссылочным, а строку «Прочие покупатели» добавлять как NULL и обрабатывать на уровне Вычисляемых полей.

Шаг 4: Использование Вычисляемых полей в СКД (Альтернативный метод)

Если вы не хотите «зашивать» текст в запрос, можно поступить профессиональнее:

  1. В запросе для регламентных операций в поле Покупатель передавайте NULL.
  2. В СКД на вкладке «Вычисляемые поля» создайте новое поле ПокупательПредставление.
  3. В выражении напишите: ЕСТЬNULL(Покупатель, "Прочие покупатели").
  4. В настройках группировки используйте это новое поле.

Шаг 5: Настройка сортировки

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

Разберем, как это реализовать:

Шаг 6: Оформление строки в отчете

Для того чтобы бухгалтер сразу видел разницу между обычными продажами и корректировками, воспользуемся Условным оформлением:

  1. Перейдите на вкладку «Настройки» -> «Условное оформление».
  2. Добавьте новое условие.
  3. В условии укажите: Покупатель Равно "Прочие покупатели" (или проверку на NULL, в зависимости от реализации).
  4. В оформлении выберите «Шрифт: Жирный» или «Цвет фона: Светло-серый».

Резюме решения

Мы выяснили причину исчезновения данных при объединении — она кроется в несоблюдении структуры полей в блоках ОБЪЕДИНИТЬ ВСЕ. Для корректной работы отчета необходимо:

  1. Четко сопоставить колонки во всех частях запроса.
  2. Использовать 0 для числовых показателей и NULL для ссылочных полей там, где данные отсутствуют.
  3. Принудительно подставлять строковое литеральное значение для группировки регламентных операций.

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

← На главную