В практике разработки на платформе 1С:Предприятие 8.3 часто возникает задача тесной интеграции документов и аналитической отчетности. Типичный пример: бухгалтер открывает документ Распределение НДС и хочет сразу увидеть отчет, который автоматически подтянет данные именно за тот налоговый период, к которому относится текущий документ. Если отчет построен не на системе компоновки данных (СКД), а с использованием прямого вывода в табличный документ, стандартные механизмы настроек могут не сработать. В этой статье мы подробно разберем, как передать параметры, вычислить границы квартала и запустить формирование отчета программно.
Когда мы вызываем форму отчета из формы документа, нам необходимо передать "контекст". Если просто открыть форму отчета, он откроется с пустыми или стандартными настройками периода. Пользователю придется вручную выбирать даты, что неудобно и повышает риск ошибки. Основная сложность заключается в том, что дата документа (например, 2-е число следующего месяца) и налоговый период (предыдущий квартал) — это разные сущности. Рассмотрим, как правильно связать эти данные.
Первым делом проанализируем, как инициировать открытие отчета из формы документа. Для этого мы будем использовать процедуру ОткрытьФорму, передавая в нее структуру параметров. Важно понимать, что мы не просто открываем окно, а передаем данные для инициализации.
В модуле формы документа, в обработчике нажатия кнопки или гиперссылки, напишем следующий код:
&НаКлиенте
Процедура ОткрытьСвязанныйОтчет(Команда)
// Проверим, записан ли документ, чтобы у него была ссылка и дата
Если Объект.Ссылка.Пустая() Тогда
ПоказатьПредупреждение(, "Сначала необходимо записать документ!");
Возврат;
КонецЕсли;
// Подготовим параметры для передачи
ПараметрыОтчета = Новый Структура;
ПараметрыОтчета.Вставить("ДатаДокумента", Объект.Дата);
// Если в документе есть явный реквизит НалоговыйПериод, лучше использовать его
// ПараметрыОтчета.Вставить("НалоговыйПериод", Объект.НалоговыйПериод);
ПараметрыОтчета.Вставить("СформироватьПриОткрытии", Истина);
// Открываем форму нашего отчета
ОткрытьФорму("Отчет.МойОтчетПоРаспределениюНДС.Форма.ФормаОтчета", ПараметрыОтчета);
КонецПроцедуры
Теперь перейдем к форме отчета. Когда форма создается на сервере, она получает структуру параметров, которую мы отправили из документа. Нам нужно "перехватить" эти данные в процедуре ПриСозданииНаСервере и установить значения реквизитов формы, которые отвечают за период.
Разберем логику вычисления начала и конца квартала. Поскольку документ Распределение НДС работает с квартальными периодами, воспользуемся встроенными функциями НачалоКвартала и КонецКвартала.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, переданы ли параметры из документа
Если Параметры.Свойство("ДатаДокумента") Тогда
ДатаДляРасчета = Параметры.ДатаДокумента;
// Устанавливаем период отчета на основании даты документа
// В форме отчета должны быть реквизиты ДатаНачала и ДатаОкончания
Отчет.ДатаНачала = НачалоКвартала(ДатаДляРасчета);
Отчет.ДатаОкончания = КонецКвартала(ДатаДляРасчета);
// Сохраняем признак автоформирования, если нужно
Если Параметры.Свойство("СформироватьПриОткрытии") Тогда
ЭтаФорма.ДополнительныеСвойства.Вставить("Автостарт", Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Выясним, как заставить отчет сформироваться сразу после открытия, чтобы пользователю не пришлось нажимать кнопку "Сформировать". Поскольку формирование отчета на табличном документе обычно происходит на сервере, нам нужно вызвать соответствующую процедуру в обработчике ПриОткрытии на клиенте.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
// Проверяем наш флаг автостарта
Автостарт = Ложь;
Если ЭтаФорма.ДополнительныеСвойства.Свойство("Автостарт", Автостарт) И Автостарт Тогда
// Вызываем процедуру формирования отчета, которая обычно привязана к кнопке
СформироватьОтчетНаСервере();
КонецЕсли;
КонецПроцедуры
Проанализируем ситуацию, когда отчет строится через ТабличныйДокумент и программный запрос. В этом случае у вас в коде формирования отчета (обычно это экспортная процедура в модуле объекта или процедура в модуле формы) есть запрос. Крайне важно, чтобы параметры этого запроса брались непосредственно из реквизитов отчета, которые мы заполнили на Шаге 2.
Рассмотрим пример кода формирования данных:
&НаСервере
Процедура СформироватьОтчетНаСервере()
// Очищаем табличный документ перед выводом
Результат.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НДСПредъявленныйОстатки.Организация,
| НДСПредъявленныйОстатки.СуммаОстаток
|ИЗ
| РегистрНакопления.НДСПредъявленный.Остатки(&ПериодГраница, ) КАК НДСПредъявленныйОстатки";
// Используем даты, которые мы рассчитали при создании формы
Запрос.УстановитьПараметр("ПериодГраница", Новый Граница(Отчет.ДатаОкончания, ВидГраницы.Включая));
// Дальнейшая логика обхода выборки и вывода в макет...
// ...
КонецПроцедуры
Рассмотрим несколько нюансов, которые сделают ваше решение более профессиональным:
Распределение НДС есть поле НалоговыйПериод. Оно более надежно, чем Дата, так как бухгалтер может создать документ 5 апреля, но за 1-й квартал. Всегда проверяйте наличие этого реквизита перед использованием Объект.Дата.Объект.Ссылка. Это позволит отчету при необходимости "посмотреть" внутрь документа (например, узнать Организацию или список подразделений) и применить соответствующие фильтры автоматически.Подводя итог, мы выяснили, что секрет автоматизации отчета кроется в правильной передаче структуры параметров через ОткрытьФорму и их последующей обработке в ПриСозданииНаСервере. Использование функций НачалоКвартала() и КонецКвартала() гарантирует, что отчет всегда будет соответствовать регламентированным нормам налогового учета, независимо от конкретного дня создания документа.