При работе в программе 1С:Зарплата и управление персоналом 3.1 пользователи могут столкнуться с досадной проблемой: при попытке открыть стандартный отчет по воинскому учету, например, «Извещение о приеме или увольнении», программа выдает критическую ошибку. В тексте ошибки указывается: Поле объекта не обнаружено (РасчетныйЛисток), а отладка ведет в ОбщийМодуль.ЗарплатаКадрыОтчеты.Модуль(7019).
Рассмотрим подробнее, почему отчетность для военкоматов внезапно начинает искать настройки «Расчетного листка», и проанализируем ситуацию с точки зрения кода и административных настроек. Мы разберем по шагам несколько способов решения: от быстрого «костыля» в пользовательском режиме до полноценного исправления через механизм расширений.
Проанализируем программный код общего модуля ЗарплатаКадрыОтчеты. Проблема кроется в процедуре ПрименитьНастройкиКОтчету. Разработчики типового решения применили механизм «копипаста» и жестко прописали в коде обращение к варианту отчета РасчетныйЛисток, вместо того чтобы использовать переданный в функцию параметр КлючВариантаНастроек.
В результате, когда система пытается инициализировать любой отчет, использующий данную общую процедуру (а это практически все отчеты воинского учета, такие как «Извещение о приеме или увольнении», «Карточка гражданина (10)» и др.), она ищет внутри схемы компоновки данных (СКД) вариант с именем «РасчетныйЛисток». Поскольку в отчетах по воинскому учету такого варианта нет, программа закономерно аварийно завершает работу.
Данная ошибка официально зарегистрирована в реестре под номером 10239634 и встречается в релизах ветки 3.1.23 (например, 3.1.23.357) и ранних сборках 3.1.24.
Это самый надежный способ, который устраняет саму причину возникновения ошибки. Нам необходимо создать расширение и перехватить процедуру ПрименитьНастройкиКОтчету в режиме &ИзменениеИКонтроль. Наша задача — заменить жесткую привязку к строке РасчетныйЛисток на использование переменной.
Посмотрим на пример правильного кода. В процедуре нужно найти и заменить два фрагмента. Первый касается параметров данных:
// Было:
ПараметрВарианта = ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.РасчетныйЛисток.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ЭлементНастройкиВарианта.Параметр);
// Стало (правильно):
ПараметрВарианта = ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек[КлючВариантаНастроек].Настройки.ПараметрыДанных.НайтиЗначениеПараметра(ЭлементНастройкиВарианта.Параметр);
Второй фрагмент кода находится чуть ниже и отвечает за элементы отбора. Его также необходимо исправить, иначе ошибка может повториться при определенных настройках фильтров:
// Было:
ЭлементВарианта = НайтиЭлементНастройкиПоИдентификаторПользовательскойНастройки(
ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек.РасчетныйЛисток.Настройки.Отбор.Элементы,
ЭлементНастройкиВарианта.ИдентификаторПользовательскойНастройки);
// Стало (правильно):
ЭлементВарианта = НайтиЭлементНастройкиПоИдентификаторПользовательскойНастройки(
ОтчетОбъект.СхемаКомпоновкиДанных.ВариантыНастроек[КлючВариантаНастроек].Настройки.Отбор.Элементы,
ЭлементНастройкиВарианта.ИдентификаторПользовательскойНастройки);
После применения такого расширения все отчеты начнут открываться корректно, так как система будет обращаться к тому варианту настроек, который актуален для конкретного открываемого отчета.
Если вы не хотите вносить изменения в код или база находится на строгом контроле, можно воспользоваться обходным путем. Ошибка часто инициируется наличием «битых» или некорректно сохранившихся настроек в справочнике ВариантыОтчетов.
Рассмотрим, как «сбросить» эти настройки программно. Вы можете создать внешнюю обработку или воспользоваться консолью кода, чтобы выполнить следующий скрипт для проблемного отчета:
ОбъектВарианта = Справочники.ВариантыОтчетов.НайтиПоНаименованию("Извещение о приеме или увольнении").ПолучитьОбъект();
Если ОбъектВарианта <> Неопределено Тогда
ОбъектВарианта.Настройки = Неопределено;
ОбъектВарианта.Записать();
Сообщить("Настройки отчета успешно сброшены.");
КонецЕсли;
Важный момент: после выполнения этого кода пользователю придется заново настроить отчет (выбрать организацию, период и т.д.), но форма начнет открываться без ошибок. Этот метод помогает «разорвать» связь между текущим отчетом и ошибочно подтянутыми данными от «Расчетного листка».
Иногда программная очистка справочника не помогает, если настройки закэшированы в пользовательском профиле. В этом случае выполним следующие действия в режиме «1С:Предприятие»:
Проанализируем эффективность этого метода: он помогает в 80% случаев, если ошибка вызвана именно пользовательским кэшем. Однако, если проблема сидит глубоко в идентификаторах метаданных, потребуется более радикальное вмешательство.
Если ни один из вышеперечисленных способов не помог, проверьте следующие моменты:
Идентификаторы объектов метаданных. Попробуйте запустить программу с параметром /C ЗапуститьОбновлениеИнформационнойБазы. Это принудительно обновит справочник идентификаторов, что может помочь, если отчет перестал «узнаваться» системой.
Установка патчей. Фирма 1С оперативно выпускает исправления (патчи) для подобных критических ошибок. Зайдите в раздел Администрирование — Обслуживание — Обновление программы и проверьте наличие установленного патча EF_10239634. Если его нет, загрузите актуальные исправления через интернет.
Внешний отчет как временная мера. Как показывает практика, если сохранить типовой отчет «Извещение о приеме или увольнении» как внешний файл (через конфигуратор), он открывается без ошибок, так как при открытии внешнего файла не срабатывают механизмы подсистемы «Варианты отчетов» БСП, приводящие к сбою.
Подведем итог: мы выяснили, что ошибка носит чисто технический характер и связана с некорректным кодом в общем модуле. Самым правильным решением будет обновление конфигурации до релизов 3.1.23.458 / 3.1.24.212 или выше, где этот баг исправлен официально. Если обновление невозможно, используйте исправление через расширение или точечную очистку реквизита Настройки в справочнике вариантов отчетов.