В практике разработчика 1С часто возникает задача модификации типовых отчетов под специфические требования пользователей. Одной из таких задач является изменение визуальной структуры «Отчета по проводкам», когда стандартное представление в одну строку (где Дебет и Кредит идут вместе) необходимо заменить на двухстрочное: в первой строке отображается информация по Дебету, во второй — по Кредиту. Рассмотрим подробно, как реализовать этот механизм с помощью расширения конфигурации, не снимая основную конфигурацию с поддержки.
Стандартный «Отчет по проводкам» строится на базе системы компоновки данных (СКД). Основная сложность заключается в том, что одна запись регистра бухгалтерии в запросе представлена одной строкой. Чтобы заставить систему вывести две строки в отчете на основании одной записи базы данных, нам необходимо либо изменить сам источник данных в СхемаКомпоновкиДанных, либо программно перехватить процесс формирования отчета.
Разберем основные подходы, которые мы можем использовать:
Проанализируем ситуацию: чтобы получить две строки из одной, нам нужно выполнить «размножение» данных на уровне SQL-запроса. Для этого в основном наборе данных запроса мы будем использовать конструкцию ОБЪЕДИНИТЬ ВСЕ.
Рассмотрим пример логики запроса, который необходимо внедрить в вашу схему в расширении:
// Первый запрос выбирает данные для "Плеча" Дебета
ВЫБРАТЬ
Хозрасчетный.Период КАК Период,
Хозрасчетный.Регистратор КАК Регистратор,
Хозрасчетный.СчетДт КАК Счет,
Хозрасчетный.СубконтоДт1 КАК Субконто1,
Хозрасчетный.Сумма КАК Сумма,
0 КАК ТипПлеча // Искусственное поле: 0 для Дебета
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
ОБЪЕДИНИТЬ ВСЕ
// Второй запрос выбирает данные для "Плеча" Кредита
ВЫБРАТЬ
Хозрасчетный.Период,
Хозрасчетный.Регистратор,
Хозрасчетный.СчетКт,
Хозрасчетный.СубконтоКт1,
Хозрасчетный.Сумма,
1 КАК ТипПлеча // Искусственное поле: 1 для Кредита
ИЗ
РегистрБухгалтерии.Хозрасчетный КАК Хозрасчетный
После такого изменения запроса в настройках СКД мы сможем добавить группировку по полю ТипПлеча или просто выводить детальные записи. Каждая проводка теперь будет представлена двумя строками, которые можно оформлять независимо.
Иногда просто заимствовать типовую схему в расширение недостаточно, так как платформа может продолжать использовать оригинал из основной конфигурации. Выясним, как гарантированно применить вашу измененную схему. Для этого нам нужно перехватить процедуру ПриКомпоновкеРезультата в модуле объекта отчета.
Выполним следующие шаги:
Схема компоновки данных (например, с именем ОсновнаяСхема_Новая).
&ВРасширении
Процедура ПриКомпоновкеРезультата(ДанныеРасшифровки, СтандартнаяОбработка)
// Отключаем стандартный механизм формирования
СтандартнаяОбработка = Ложь;
// Получаем нашу новую схему из расширения
СхемаДляРаботы = ЭтотОбъект.ПолучитьМакет("ОсновнаяСхема_Новая");
// Настраиваем настройки (используем текущие настройки отчета)
Настройки = ЭтотОбъект.КомпоновщикНастроек.ПолучитьНастройки();
// Инициализируем компоновку
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаДляРаботы, Настройки, ДанныеРасшифровки);
// Выводим результат в табличный документ
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(МакетКомпоновки, , ДанныеРасшифровки);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент;
ПроцессорВывода.УстановитьДокумент(Результат);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
КонецПроцедуры
Если задача требует специфической верстки, которую сложно реализовать стандартными группировками СКД, можно воспользоваться методом выгрузки в промежуточную коллекцию. Рассмотрим, как программно перебрать данные перед их окончательным выводом.
Вместо прямого вывода в Результат (Табличный документ), мы можем направить поток данных в дерево значений, обработать его (дублируя строки программно) и затем вывести вручную.
// В процедуре ПриКомпоновкеРезультата
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДеревоРезультата = Новый ДеревоЗначений;
ПроцессорВывода.УстановитьОбъект(ДеревоРезультата);
ПроцессорВывода.Вывести(ПроцессорКомпоновки);
// Теперь в ДеревоРезультата у нас есть все данные.
// Мы можем обойти дерево в цикле и вывести строки в ТабличныйДокумент вручную,
// создавая на каждую строку из дерева две строки в документе.
Рассмотрим ситуацию, когда вы добавили новые поля (например, раздельные субконто), но они не появляются в отчете. Проанализируем основные причины:
ВариантыОтчетов. После внесения изменений в схему через расширение, необходимо зайти в режим 1С:Предприятие и либо обновить отчет через «Настройки - Стандартные настройки», либо программно вызвать ВариантыОтчетов.Обновить().Важный момент: При работе с расширениями всегда проверяйте, чтобы все используемые в запросе объекты (регистры бухгалтерии, справочники субконто) были также заимствованы в расширение. В противном случае запрос может выполняться некорректно или возвращать пустые результаты из-за ограничений прав доступа (RLS).
Таким образом, комбинируя изменение запроса через UNION ALL и программную подмену схемы в процедуре ПриКомпоновкеРезультата, мы получаем полный контроль над формированием «Отчета по проводкам» и можем реализовать любые требования пользователя по детализации строк.