При обновлении конфигурации 1С:Зарплата и Управление Персоналом (ЗУП) до версии 3.1.8 и выше многие пользователи и разработчики сталкиваются с неприятной проблемой. При попытке распечатать кадровые документы (например, соглашение при увольнении, расписку или любые другие внешние печатные формы, привязанные к документу «Увольнение») система выдает критическую ошибку: «Метод объекта не обнаружен (СформироватьЗапросДляТ8)». При этом типовые кадровые приказы могут продолжать печататься в штатном режиме.
В этой статье мы подробно разберем, почему возникает данная ошибка, какие архитектурные изменения произошли в подсистеме печати 1С:ЗУП, и рассмотрим несколько практических способов решения проблемы для восстановления работоспособности ваших внешних печатных форм.
Для начала проанализируем техническую суть обновлений, внесенных разработчиками фирмы «1С» в релизе 3.1.8. В этой версии подсистема кадрового учета и печати приказов (таких как Т-1, Т-5, Т-6, Т-8 и других) претерпела глобальный рефакторинг. Программная логика формирования печатных форм была полностью переработана.
Основные изменения включают в себя следующие аспекты:
Отчет.ПечатьТ8, за прием — Отчет.ПечатьТ1 и так далее).КадровыйУчет. В число удаленных методов попали СформироватьЗапросДляТ8, ЗаполнитьПараметрыКадровогоПриказа и аналогичные им функции для других приказов.Таким образом, если в вашей базе используются внешние печатные формы (ВПФ), созданные под старые релизы (ЗУП 3.1.5 — 3.1.7), и внутри их кода содержатся обращения к удаленным методам общего модуля КадровыйУчет, они гарантированно перестанут работать и будут вызывать ошибку отсутствия метода.
Рассмотрим подробнее три основных варианта решения этой проблемы, начиная от быстрого временного исправления до полноценной переработки кода.
Если вам необходимо восстановить работоспособность внешней печатной формы в кратчайшие сроки, и у вас нет времени на полное переписывание архитектуры получения данных, можно использовать метод локализации кода. Мы перенесем удаленные функции непосредственно внутрь самой внешней печатной формы, сделав ее независимой от общего модуля.
Разберем этот процесс по шагам:
КадровыйУчет и найдите в нем текст функции СформироватьЗапросДляТ8, а также все сопутствующие функции, к которым она обращается.
// Было в коде внешней печатной формы:
ТаблицаДанных = КадровыйУчет.СформироватьЗапросДляТ8(МассивОбъектов);
// Стало после изменения:
ТаблицаДанных = СформироватьЗапросДляТ8(МассивОбъектов);
Этот способ позволяет вернуть форму в рабочее состояние буквально за 15 минут. Однако помните, что вы копируете устаревший и потенциально неоптимальный код, который не будет использовать преимущества новых механизмов конфигурации.
Чтобы внешняя печатная форма работала стабильно и больше никогда не ломалась при последующих обновлениях конфигурации 1С:ЗУП, лучшим решением будет полный отказ от использования общих кадровых методов для получения данных. Мы напишем собственный прямой запрос к базе данных.
Проанализируем пример построения простого и надежного запроса для получения данных документа «Увольнение» (для формы Т-8):
Функция ПолучитьДанныеДляУвольнения(МассивОбъектов) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Увольнение.Ссылка КАК Ссылка,
| Увольнение.Организация КАК Организация,
| Увольнение.Организация.НаименованиеПолное КАК ОрганизацияНаименованиеПолное,
| Увольнение.Сотрудник КАК Сотрудник,
| Увольнение.Сотрудник.Код КАК ТабельныйНомер,
| Увольнение.ФизическоеЛицо.ФИО КАК ФИОСотрудника,
| Увольнение.ДатаУвольнения КАК ДатаУвольнения,
| Увольнение.СтатьяПФР.ТекстДляПечати КАК ОснованиеУвольнения,
| Увольнение.ДокументОснованиеВыпуска КАК ДокументОснование
|ИЗ
| Документ.Увольнение КАК Увольнение
|ГДЕ
| Увольнение.Ссылка В(&МассивОбъектов)";
Запрос.УстановитьПараметр("МассивОбъектов", МассивОбъектов);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
Используя этот подход, мы выбираем данные напрямую из полей документа Документ.Увольнение и связанных с ним справочников (физические лица, сотрудники, статьи увольнения). На этот запрос не повлияют никакие изменения в общих модулях «1С», так как структура метаданных основных документов практически никогда не меняется настолько кардинально, чтобы удалить базовые реквизиты вроде организации или сотрудника.
Прежде чем приступать к изменению программного кода, имеет смысл проверить, нельзя ли решить задачу стандартными средствами новой подсистемы. Если ваши внешние печатные формы «Соглашение» или «Расписка» представляют собой слегка измененные варианты стандартного приказа Т-8 (например, добавлен дополнительный текст в подвал документа или изменены формулировки шапки), то вы можете полностью отказаться от внешних обработок.
Выполним следующие действия для проверки этой возможности:
Переход на этот механизм существенно упростит дальнейшую поддержку и обновление вашей базы данных, так как у вас не будет «висеть» устаревший кастомный код внешних обработок.
В ходе обсуждения данной проблемы на техническом форуме специалисты также затронули вопрос используемой платформы 1С. Версия платформы 8.3.13.1513, которая упоминается в обращении автора, исторически зарекомендовала себя как крайне нестабильная.
При работе на этой версии платформы пользователи часто сталкивались со следующими критическими проблемами:
Для обеспечения стабильной и производительной работы современных релизов 1С:ЗУП 3.1 мы настоятельно рекомендуем выполнить обновление платформы до актуальных сертифицированных версий поддержки LTS (например, последних релизов веток 8.3.21, 8.3.22 или выше, в зависимости от минимальных системных требований вашего текущего релиза конфигурации).
Мы выяснили, что ошибка выполнения метода СформироватьЗапросДляТ8 вызвана плановым рефакторингом кода в конфигурации 1С:ЗУП версии 3.1.8. Для исправления ошибки вы можете оперативно скопировать старый код процедур в модуль внешней обработки, полностью переписать получение данных на независимые запросы к СУБД, либо задействовать новый типовой функционал настраиваемых печатных форм. Выбор решения зависит от сложности кастомизации ваших печатных бланков и запаса времени на проведение технических работ.