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