Как изменить типовой отчет по проводкам в расширении: разделение одной строки на две (Дебет и Кредит)

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

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

Анализ задачи и выбор стратегии реализации

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

Разберем основные подходы, которые мы можем использовать:

  1. Модификация запроса в СКД (Метод UNION ALL). Это наиболее правильный и производительный метод. Мы переписываем запрос так, чтобы на каждую проводку приходилось две записи в выборке.
  2. Программная подмена схемы в расширении. Мы создаем свою схему в расширении и подставляем ее вместо типовой в момент формирования.
  3. Ручная обработка табличного документа. Если возможностей СКД недостаточно для сложной визуализации, мы можем программно перебрать сформированный результат и перестроить его.

Метод 1: Использование объединения (UNION ALL) в запросе СКД

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

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


// Первый запрос выбирает данные для "Плеча" Дебета
ВЫБРАТЬ
    Хозрасчетный.Период КАК Период,
    Хозрасчетный.Регистратор КАК Регистратор,
    Хозрасчетный.СчетДт КАК Счет,
    Хозрасчетный.СубконтоДт1 КАК Субконто1,
    Хозрасчетный.Сумма КАК Сумма,
    0 КАК ТипПлеча // Искусственное поле: 0 для Дебета
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный

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

// Второй запрос выбирает данные для "Плеча" Кредита
ВЫБРАТЬ
    Хозрасчетный.Период,
    Хозрасчетный.Регистратор,
    Хозрасчетный.СчетКт,
    Хозрасчетный.СубконтоКт1,
    Хозрасчетный.Сумма,
    1 КАК ТипПлеча // Искусственное поле: 1 для Кредита
ИЗ
    РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный

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

Метод 2: Программная подмена схемы в расширении

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

Выполним следующие шаги:

  1. Добавим отчет «ОтчетПоПроводкам» в расширение.
  2. В расширении создадим новый макет типа Схема компоновки данных (например, с именем ОсновнаяСхема_Новая).
  3. В модуле объекта отчета в расширении добавим следующий код:

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

Метод 3: Обработка данных через Табличный Документ

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

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


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

// Теперь в ДеревоРезультата у нас есть все данные.
// Мы можем обойти дерево в цикле и вывести строки в ТабличныйДокумент вручную, 
// создавая на каждую строку из дерева две строки в документе.

Решение проблем с отображением полей и вариантов

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

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

Таким образом, комбинируя изменение запроса через UNION ALL и программную подмену схемы в процедуре ПриКомпоновкеРезультата, мы получаем полный контроль над формированием «Отчета по проводкам» и можем реализовать любые требования пользователя по детализации строк.

← На главную