Разработка отчетов на базе Системы компоновки данных (СКД) часто сопровождается ситуациями, когда запрос в консоли работает идеально, но сам отчет выдает пустую форму. Проанализируем типичную ситуацию на примере отчета по больничным листам, разберем ошибки в программном коде и выясним, как правильно взаимодействовать с расширениями конфигурации.
В представленном коде для заполнения параметров &НачислениеЗаСчетРаботодателя и &НачислениеЗаСчетФСС используется метод НайтиПоНаименованию. Рассмотрим пример:
мНачислениеЗаСчетРаботодателя = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Больничный за счет работодателя");
мНачислениеЗаСчетФСС = ПланыВидовРасчета.Начисления.НайтиПоНаименованию("Больничный");
Параметры = КомпоновщикНастроек.Настройки.ПараметрыДанных;
Параметры.УстановитьЗначениеПараметра("НачислениеЗаСчетРаботодателя", мНачислениеЗаСчетРаботодателя);
Параметры.УстановитьЗначениеПараметра("НачислениеЗаСчетФСС", мНачислениеЗаСчетФСС);
Выясним, почему это плохая практика. Метод НайтиПоНаименованию крайне чувствителен к любым изменениям в базе данных. Если пользователь случайно добавит лишний пробел в названии начисления или переименует его, метод вернет Пустую ссылку. В результате запрос в СКД будет искать записи с пустым условием ГДЕ Начисление = &ПустаяСсылка, что приведет к отсутствию данных в отчете.
Рекомендация: Вместо поиска по строковому наименованию лучше использовать предопределенные элементы (если они есть) или выносить выбор конкретных начислений в пользовательские настройки, чтобы пользователь сам выбирал их из справочника. В крайнем случае, можно использовать поиск по коду или уникальному идентификатору, но лучше всего — обращение к данным через Значение(ПланВидовРасчета.Начисления.ИмяПредопределенного) прямо в тексте запроса СКД.
Проанализируем ситуацию, когда параметры устанавливаются в процедуре ПриКомпоновкеРезультата. В 1С существует иерархия настроек компоновщика:
Если параметр &НачислениеЗаСчетФСС вынесен в область пользовательских настроек, то прямое изменение через КомпоновщикНастроек.Настройки.ПараметрыДанных может не сработать, так как значения из пользовательских настроек имеют более высокий приоритет и "перекрывают" основные настройки.
Посмотрим, как правильно устанавливать параметры программно, учитывая пользовательские настройки:
// Поиск параметра в пользовательских настройках
Для Каждого Элемент Из КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(Элемент) = Тип("ЗначениеПараметраКомпоновкиДанных")
И Строка(Элемент.Параметр) = "НачислениеЗаСчетФСС" Тогда
Элемент.Значение = мНачислениеЗаСчетФСС;
Элемент.Использование = Истина;
КонецЕсли;
КонецЦикла;
Обратим внимание на структуру запроса. Автор использует ЛЕВОЕ СОЕДИНЕНИЕ, где основной таблицей выступает ВТЗаСчетФСС:
ИЗ
ВТЗаСчетФСС КАК ВТЗаСчетФСС
ЛЕВОЕ СОЕДИНЕНИЕ ВТЗаСчетРаботодателя КАК ВТЗаСчетРаботодателя
ПО ВТЗаСчетФСС.Ссылка = ВТЗаСчетРаботодателя.Ссылка
Разберем проблему: если в периоде есть больничный лист, который оплачивается только за счет работодателя (например, короткий больничный на 3 дня), то запись о нем попадет в таблицу ВТЗаСчетРаботодателя, но ее не будет в ВТЗаСчетФСС. Так как соединение левое от ФСС, такие записи просто не попадут в финальный результат отчета.
Как исправить: Для получения полной картины лучше использовать ПОЛНОЕ СОЕДИНЕНИЕ или, что более правильно в СКД, использовать одну общую таблицу начислений с условиями или объединение (ОБЪЕДИНЕНИЕ ВСЕХ).
Часто возникает вопрос: почему СКД "не видит" реквизиты, добавленные через расширение конфигурации? Проанализируем механизм работы платформы.
Когда вы создаете отчет в основной конфигурации, его схема компоновки данных "знает" только о тех объектах, которые существуют в основной базе. Реквизиты из расширений для нее невидимы.
Чтобы использовать поля из расширения в СКД, необходимо:
В типовых конфигурациях (ЗУП 3.1, ERP 2.5) часто используется вызов ЗарплатаКадрыОтчеты.ПриКомпоновкеРезультатаВТабличныйДокумент. Важно помнить, что этот общий модуль может переопределять настройки компоновщика. Если вы устанавливаете параметры вручную, делайте это до вызова стандартных процедур, но проверяйте, не очищаются ли они внутри этих процедур.
Посмотрим на пример правильной последовательности действий в ПриКомпоновкеРезультата:
СтандартнаяОбработка = Ложь).КомпоновщикНастроек.Настройки или ПользовательскиеНастройки.Таким образом, основными причинами "пустоты" в СКД являются некорректные ссылки на объекты, приоритет пользовательских настроек над программными и логические ошибки в связях таблиц запроса.