При работе с типовыми конфигурациями, такими как Зарплата и управление персоналом 3.1, программисты часто сталкиваются с ситуацией, когда после обновления системы внешние отчеты перестают работать. Типичный сценарий: поле в регистре сведений было удалено или переименовано (например, ВидЗанятости стал УдалитьВидЗанятости), вы добросовестно правите запрос в схеме компоновки данных (СКД), но система упрямо выдает ошибку, ссылаясь на старое имя поля. Разберем детально, почему это происходит и как полностью очистить «фантомные» связи в отчете.
Когда мы получаем сообщение об ошибке вида Ошибка получения информации набора данных: Поле не найдено "КадроваяИсторияСотрудников.ВидЗанятости", хотя в тексте запроса это поле уже заменено, проблема кроется в многослойности настроек СКД. Платформа 1С хранит ссылки на поля не только в тексте SQL-подобного запроса, но и в метаданных самой схемы, а также в кэшированных настройках вариантов отчетов в базе данных.
Проанализируем ситуацию: если отчет подключен как внешний через механизм Библиотеки стандартных подсистем (БСП), он перестает быть просто файлом .erf. Его настройки «прорастают» в систему, фиксируясь в справочниках и хранилищах настроек.
Первым делом нам необходимо убедиться, что поле не осталось в «скрытых» разделах СКД. Рассмотрим основные места, где оно может прятаться:
ВидЗанятости.Для быстрой проверки воспользуемся поиском (Ctrl+F) по всему тексту схемы (если выгрузить её в XML) или просто внимательно просмотрим все вкладки настроек варианта в нижней части конструктора СКД.
Разберем важный технический нюанс. В ЗУП 3.1 сложные запросы часто строятся на временных таблицах. Рассмотрим ситуацию, когда поле ВидЗанятости выбиралось в одной из первых временных таблиц, но не использовалось в финальной выборке. Ошибка все равно возникнет, так как СКД проверяет валидность всей структуры запроса.
Рекомендация: Удалим упоминание ВидЗанятости из всех временных таблиц внутри запроса. Если нам нужно получить актуальный вид занятости, мы должны соединять данные с новым регистром сведений ВидыЗанятостиСотрудников только в самом конце, в финальном пакете запроса.
Это самая коварная причина. Когда мы загружаем внешний отчет в справочник Дополнительные отчеты и обработки, БСП автоматически создает записи в справочнике Варианты отчетов. В этих записях сохраняются настройки (отборы, группировки, выбранные поля), актуальные на момент первой загрузки.
Даже если мы заменим файл .erf на новый, старые настройки в базе данных могут продолжать ссылаться на несуществующее поле. Выясним, как это лечится:
КадроваяИсторияСотрудников.ВидЗанятости в настройках отбора по умолчанию.Если проблема сохраняется у конкретных пользователей, значит, старое поле «застряло» в их персональных настройках. Платформа 1С сохраняет состояние формы отчета для каждого пользователя индивидуально.
Проанализируем алгоритм очистки:
Администрирование — Настройки пользователей и прав — Очистка настроек. Выберем нашего пользователя и удалим настройки для проблемного отчета.Современные версии ЗУП используют механизм виртуальных таблиц-представлений для получения кадровых данных. Вместо прямого обращения к РегистрСведений.КадроваяИсторияСотрудников, рекомендуется использовать временную таблицу ВТКадровыеДанныеСотрудников, которая заполняется программно через вызов процедур общего модуля.
Если вы пишете отчет «с нуля» или проводите глубокую модернизацию старого, рассмотрим пример того, как правильно объявить поля в СКД для работы с программным заполнением:
// В тексте запроса СКД создаем пустую временную таблицу
ВЫБРАТЬ
ЗНАЧЕНИЕ(Справочник.Сотрудники.ПустаяСсылка) КАК Сотрудник,
ДАТАВРЕМЯ(1, 1, 1) КАК Период,
"" КАК ВидЗанятости
ПОМЕСТИТЬ Представления_КадровыеДанныеСотрудников
ГДЕ
Ложь
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Т.Сотрудник,
Т.ВидЗанятости
ИЗ
Представления_КадровыеДанныеСотрудников КАК Т
При использовании такого подхода система сама подменит эту «заглушку» на оптимизированный запрос, учитывающий все изменения метаданных в текущем релизе. Это избавит вас от необходимости вручную менять запросы при каждом обновлении конфигурации, когда разработчики 1С решат переименовать очередное поле.
Подводя итог, если вы столкнулись с «невидимым» полем ВидЗанятости, выполните следующие действия:
ВидЗанятости на корректный путь к новому регистру во всей схеме.Соблюдение этой последовательности гарантирует, что старые метаданные будут вытеснены из всех кэшей и хранилищ системы, и ваш отчет снова начнет радовать пользователей актуальными данными.