При доработке типовых конфигураций через расширения разработчики часто сталкиваются с ситуацией, когда заимствование и изменение схемы компоновки данных (СКД) приводит к неожиданным ошибкам в режиме предприятия. Разберем типичную проблему: при модификации основной схемы отчета ОтчетыПоСотрудникам в конфигурации «1С:Зарплата и управление персоналом 3» перестает открываться форма настроек, исчезает вкладка Параметры, а при открытии отчета возникает исключение: Значение не является значением объектного типа (Дата) в процедуре ИнициализироватьОтчет().
Проанализируем механизм работы отчета и выясним, почему возникает такое поведение системы:
ВТСотрудники, Представления_КадровыеДанныеСотрудников). В модуле объекта в процедуре ИнициализироватьОтчет() программно выполняется перехват и замена этих шаблонов реальными запросами к регистрам. Алгоритм жестко завязан на состав и структуру параметров компоновки данных.Период, ДатаНачала, ДатаОкончания или ДатаАктуальности) сбрасывается тип с СтандартныйПериод на пустой, очищаются выражения расчета или значение инициализируется как Неопределено, программный код БСП падает при попытке прочитать поля периода:
// Пример проблемного участка в модуле объекта:
ПараметрПериод = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("Период"));
// Если тип или структура параметра повреждены, обращение к датам вызывает исключение:
ДатаСреза = ПараметрПериод.Значение.ДатаОкончания;
ОбновитьЭлементыФормыНастроекНаСервере. Если вызов события ПередЗагрузкойНастроекВКомпоновщик падает с ошибкой, инициализация формы настроек прерывается, и страница параметров вообще не отрисовывается в пользовательском интерфейсе. Также вкладка скрывается, если у всех параметров включено ограничение доступности либо платформа потеряла их привязку к пользовательским настройкам.Разберем прямое решение, которое позволяет быстро восстановить работоспособность отчета, если при ручном редактировании текста запроса в расширении произошел сбой метаданных схемы:
Период типа СтандартныйПериод) и какие выражения были заданы для служебных дат.ДатаНачала и ДатаОкончания (обычно это &Период.ДатаНачала и &Период.ДатаОкончания), а также проверим, что флаги доступности параметров не сбросились.Если откат назад нежелателен, проверим схему компоновки вручную по шагам:
Период: его тип должен быть строго СтандартныйПериод, а не Дата и не составной тип. Проверим, что для него задано корректное стандартное значение (например, «Этот месяц»).ДатаНачала, ДатаОкончания, ДатаАктуальности): убедимся, что для них установлен тип Дата, в колонке Выражение указано получение границы из основного периода, а колонка Ограничение доступности содержит флаг (так как пользователю напрямую эти параметры менять не требуется).Период добавлен в пользовательские настройки (флаг с синей стрелкой «Включать в пользовательские настройки»).Иногда после исправления схемы компоновки данных ошибка продолжает воспроизводиться из-за того, что платформа пытается применить старые некорректные пользовательские настройки, сохраненные в информационной базе:
ОтчетыПоСотрудникам./ClearCache, чтобы обновить структуры метаданных и кэш схемы компоновки данных расширения.Рассмотрим альтернативный вариант решения задачи, если в отчет требуется всего лишь добавить новые кадровые сведения. Заимствование тяжелых типовых СКД отчетов ЗУП 3 часто приводит к проблемам совместимости при последующих обновлениях программы.
Поскольку отчет использует механизм кадровых представлений, предпочтительнее подключиться к процедуре ИнициализироватьОтчет() в модуле объекта через расширение с аннотацией &ИзменениеИКонтроль или перехватить формирование источников данных в общих модулях кадрового учета. Это позволяет добавить необходимые поля в структуру запроса программно, вообще не трогая саму схему компоновки данных в метаданных расширения.