При создании отчетов по взаиморасчетам с контрагентами разработчики нередко начинают с классического подхода: создают реквизиты на форме, пишут запрос в коде модуля, строят макет вручную и заполняют ячейки табличного документа через области. Однако такой подход быстро приводит к сложностям, когда пользователям требуются динамические отборы, группировки, сортировки и гибкая настройка колонок. В этой статье разберем, как правильно реализовать отчет по задолженности с помощью Системы компоновки данных (СКД) для обычных (толстых) форм 1С:Предприятия.
Рассмотрим распространенную ситуацию: вы сохранили отчет-образец на диск, открыли его в конфигураторе, но в дереве объекта нет ни реквизитов, ни форм, ни программного кода в модуле объекта. Это не ошибка и не повреждение файла. Данная особенность означает, что отчет целиком построен на механизме СКД.
Вся логика выборки, структура полей, отборы и оформления хранятся внутри объекта Основная схема компоновки данных. Платформа 1С умеет генерировать стандартную форму отчета «на лету» в режиме предприятия. В такой автогенерируемой форме уже присутствуют стандартные кнопки управления («Сформировать», «Настройки»), а также панель быстрого доступа к параметрам и отборам. Чтобы отредактировать такой отчет, достаточно нажать кнопку Открыть схему компоновки данных в окне свойств отчета.
Для корректного вывода сумм долга в отдельные колонки («Дебиторская задолженность» и «Кредиторская задолженность») проанализируем структуру запроса к регистру накопления взаиморасчетов или регистру бухгалтерии. Конечный остаток долга может быть как положительным (должны нам), так и отрицательным (должны мы).
Разберем по шагам два основных способа разделения показателей:
ВЫБОР КОГДА.
ВЫБРАТЬ
ВзаиморасчетыОстатки.ДоговорКонтрагента.Владелец КАК Контрагент,
ВзаиморасчетыОстатки.ДоговорКонтрагента КАК Договор,
ВЫБОР
КОГДА ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток > 0
ТОГДА ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток
ИНАЧЕ 0
КОНЕЦ КАК ДебиторскаяЗадолженность,
ВЫБОР
КОГДА ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток < 0
ТОГДА -ВзаиморасчетыОстатки.СуммаВзаиморасчетовОстаток
ИНАЧЕ 0
КОНЕЦ КАК КредиторскаяЗадолженность
ИЗ
РегистрНакопления.ВзаиморасчетыСКонтрагентами.Остатки(&Период, ) КАК ВзаиморасчетыОстатки
СуммаВзаиморасчетовОстаток, а на вкладке Вычисляемые поля создаются два отдельных выражения. Например, для кредиторской задолженности в поле выражения указывается:
Выбор Когда СуммаВзаиморасчетовОстаток < 0 Тогда -СуммаВзаиморасчетовОстаток Иначе 0 Конец
Сумма(ДебиторскаяЗадолженность) и Сумма(КредиторскаяЗадолженность).Выясним причину популярной ошибки при расчете остатков: если пользователь выбирает дату отчета без указания времени (по умолчанию 00:00:00), документы, проведенные в течение выбранного дня, не попадают в расчет остатка. Чтобы избежать этой проблемы, настроим параметры схемы компоновки данных:
КонецПериода установим тип Дата.Период) в колонке Выражение укажем:
КонецПериода(&КонецПериода, "ДЕНЬ")
Период, чтобы скрыть его от пользователя, оставив на форме только понятный параметр КонецПериода.Существует заблуждение, что СКД полноценно работает только на управляемых формах. На самом деле СКД отлично функционирует и на обычных формах конфигураций платформы 8.2 и 8.3.
Рассмотрим два варианта работы с формой:
ПолеТабличногоДокумента (в него будет выводиться результат);КомпоновщикНастроек.Настройки.Отбор для удобного редактирования отборов пользователем прямо на рабочей панели.Для программного формирования отчета на обычной форме не требуется писать сложный код инициализации компоновщика и процессора вывода. Достаточно вызвать встроенный платформенный метод:
Процедура ДействияФормыСформировать(Кнопка)
ЭлементыФормы.ПолеТабличногоДокумента.Очистить();
СкомпоноватьРезультат(ЭлементыФормы.ПолеТабличногоДокумента);
КонецПроцедуры
Метод СкомпоноватьРезультат автоматически берет настройки из компоновщика, выполняет компоновку и заполняет указанное ПолеТабличногоДокумента с сохранением всех группировок, ресурсов и расшифровок.