С переходом на новые форматы отчетности ЕФС-1 в начале 2024 года многие пользователи программы 1С:Зарплата и Управление Персоналом 8 столкнулись с неприятной технической проблемой. При попытке распечатать подразделы 1.2 или 3 формы ЕФС-1 непосредственно из документа Увольнение система выдает критическую ошибку: «Макет "" не существует. Операция прервана». Эта проблема актуальна для релизов 3.1.27.151 и 3.1.28.64.
В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем программный код, вызывающий сбой, и рассмотрим три способа решения: от простых административных обходов до внесения правок в конфигурацию через расширение.
Проанализируем ситуацию с технической точки зрения. Ошибка возникает в общем модуле УправлениеПечатью. Система пытается программно определить имя макета для формирования печатной формы, но из-за некорректной работы запроса в модуле персонифицированного учета переменная, содержащая имя макета, остается пустой. Если мы заглянем в Журнал регистрации, то увидим, что сбой происходит в момент вызова функции ИспользуетсяПользовательскийМакет, куда передается пустая строка вместо пути к макету.
Основная причина кроется в функции ЗапросПоШапкеДляПечатиОДВ_1. В новых релизах при формировании данных для подразделов ЕФС-1 (которые пришли на смену СЗВ-СТАЖ и ДСВ-3) в запрос были добавлены поля, описывающие данные «прежнего страхователя». Однако в структуре документа Увольнение эти поля отсутствуют, что приводит к некорректному выполнению запроса и «вылету» печатной формы.
Фирма «1С» оперативно выпустила исправление для этой ошибки. Если ваша конфигурация находится на поддержке и подключена к интернет-поддержке, это самый правильный путь. Разберем шаги по установке:
Важный момент: если после установки патча некоторые разделы формы (например, сведения о стаже или вредности) заполняются некорректно, рекомендуется обновить конфигурацию до последних актуальных релизов (выше 3.1.27.170 или 3.1.28.84), где данные механизмы были полностью переработаны.
Если у вас нет возможности оперативно установить патч или обновить программу, воспользуемся методикой формирования отчетности через специализированные документы персонифицированного учета. Рассмотрим, как это сделать по шагам:
Этот метод позволяет получить корректный печатный лист, так как специализированные документы содержат все необходимые метаданные, которых не хватает в документе Увольнение.
Для тех, кто предпочитает автоматизировать процесс и исправить печать непосредственно в документе Увольнение, рассмотрим создание расширения. Нам необходимо переопределить функцию ЗапросПоШапкеДляПечатиОДВ_1 в общем модуле ПерсонифицированныйУчет.
Выясним причину ошибки в коде: в запросе фигурируют поля типа ДанныеДокумента.ПрежнийСтраховательНаименованиеПолное. В документе Увольнение таких реквизитов нет. Мы должны программно подменить их пустыми строками в тексте запроса, когда контекстом исполнения является документ увольнения.
Создадим расширение и добавим в него метод с директивой &Вместо (или &ИзменениеИКонтроль, если это позволяет версия платформы). Пример реализации кода:
&НаСервере
&Вместо("ЗапросПоШапкеДляПечатиОДВ_1")
Функция Расш_ЗапросПоШапкеДляПечатиОДВ_1(МассивСсылок, ИмяДокумента)
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("МассивСсылок", МассивСсылок);
// Подготовка стандартного описания источника
ОписаниеИсточникаДанных = ОписаниеИсточникаДанныхДляСоздатьВТСведенияОбОрганизациях();
ОписаниеИсточникаДанных.ИмяТаблицы = "Документ." + ИмяДокумента;
ОписаниеИсточникаДанных.ИмяПоляОрганизация = "Организация";
ОписаниеИсточникаДанных.ИмяПоляПериод = "Дата";
ОписаниеИсточникаДанных.СписокСсылок = МассивСсылок;
СоздатьВТСведенияОбОрганизацияхПоОписаниюДокументаИсточникаДанных(Запрос.МенеджерВременныхТаблиц, ОписаниеИсточникаДанных, Ложь);
// Логика формирования ВТИтоги для разных типов документов
Если ИмяДокумента = "ОписьОДВ_1" Тогда
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 0 0 КАК Количество, ЗНАЧЕНИЕ(Документ.ОписьОДВ_1.ПустаяСсылка) КАК Ссылка ПОМЕСТИТЬ ВТИтоги";
Иначе
// Универсальный шаблон запроса для документов со списком сотрудников
Запрос.Текст = "ВЫБРАТЬ КОЛИЧЕСТВО(Сотрудники.НомерСтроки) КАК Количество, Сотрудники.Ссылка ПОМЕСТИТЬ ВТИтоги ИЗ Документ.СведенияОСтраховомСтажеЗастрахованныхЛицСЗВ_СТАЖ.Сотрудники КАК Сотрудники ГДЕ Сотрудники.Ссылка В(&МассивСсылок) СГРУППИРОВАТЬ ПО Сотрудники.Ссылка";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "СведенияОСтраховомСтажеЗастрахованныхЛицСЗВ_СТАЖ", ИмяДокумента);
Если ИмяДокумента = "Увольнение" Тогда
Запрос.Текст = СтрЗаменить(Запрос.Текст, "Сотрудники.НомерСтроки", "1");
Запрос.Текст = СтрЗаменить(Запрос.Текст, ".Сотрудники", "");
КонецЕсли;
КонецЕсли;
Запрос.Выполнить();
// Основной текст запроса с данными организации и страхователя
ТекстЗапроса = "ВЫБРАТЬ ДанныеДокумента.Ссылка, СведенияОбОрганизациях.НаименованиеПолное... {полный текст запроса из типовой конфигурации}";
// ВСТАВКА: Обработка отсутствующих полей для документа Увольнение
Если ИмяДокумента = "Увольнение" Или ИмяДокумента = "УвольнениеСписком" Тогда
// Заменяем несуществующие поля на пустые значения, чтобы запрос не падал
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.ПрежнийСтраховательНаименованиеПолное", """""");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.ПрежнийСтраховательРегистрационныйНомерПФР", """""");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.ПрежнийСтраховательИНН", """""");
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "ДанныеДокумента.ПрежнийСтраховательКПП", """""");
// ... повторить для всех полей ПрежнийСтрахователь
КонецЕсли;
Запрос.Текст = ТекстЗапроса;
Возврат Запрос.Выполнить();
КонецФункции
Проанализируем этот код. Мы используем СтрЗаменить для динамической корректировки текста запроса. Это позволяет избежать ошибки «Поле объекта не обнаружено» при выполнении запроса к базе данных. Обратите внимание, что при использовании директивы &Вместо в расширении необходимо убедиться, что у расширения отключен безопасный режим, иначе вызов некоторых общих модулей (например, ЗарплатаКадры) может быть заблокирован системой безопасности платформы.
Рассмотрим еще один нюанс, упомянутый пользователями. Иногда после исправления ошибки печати в пункте 4 (условия труда) вместо «вредных» условий труда выводятся «нормальные». Выясним причину.
С 2024 года алгоритм заполнения подраздела 1.2 ЕФС-1 изменился. Теперь данные о стаже и условиях труда подаются в межотчетный период только для определенных категорий сотрудников (имеющих право на досрочную пенсию, работающих в особых климатических условиях и т.д.). Проверьте следующие настройки:
Подведем итог. Ошибка «Макет не существует» является следствием недоработки в коде типовой конфигурации при переходе на новые формы ЕФС-1. Оптимальным решением является установка патча EF_60011947. Если же вы столкнулись с более глубокими проблемами заполнения стажа, рекомендуется использовать полноценный документ СЗВ-СТАЖ вместо печати из Увольнения.