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