При работе с программой «1С:Зарплата и управление персоналом 3.1» (ЗУП 3.1) технические специалисты часто сталкиваются с нестандартным поведением системы после проведения обновлений. Одним из ярких примеров является ошибка формирования унифицированной печатной формы Т-8 (Приказ об увольнении) непосредственно из документа увольнения. При этом, что примечательно, при печати того же документа непосредственно из специализированного отчета ПечатнаяФормаТ8 всё формируется корректно.
В данной статье мы подробно проанализируем архитектуру механизма печати кадровых приказов в современных редакциях ЗУП, разберем физический смысл ошибки с автопараметром В (&П), выясним причины сбоя и пошагово восстановим работоспособность системы.
Проблема часто локализуется в нетиповых (доработанных) конфигурациях, где при очередном обновлении произошло некорректное трехстороннее объединение программного кода. Давайте вместе разберемся, где именно искать ошибку и как её исправить.
Прежде чем переходить к коду, давайте выясним, как устроена печать кадровых приказов в современных версиях конфигураций на базе Библиотеки зарплаты и кадров (БЗК). Начиная с редакции ЗУП 3.1, разработчики фирмы «1С» ушли от классических табличных макетов, зашитых непосредственно в документы увольнения, приема или перевода.
Теперь большинство кадровых приказов (Т-1, Т-5, Т-6, Т-8, Т-9) генерируются динамически при помощи Системы компоновки данных (СКД). Для этого в системе существуют скрытые служебные отчеты, такие как ПечатнаяФормаТ8. Механизм работает по следующей схеме:
Увольнение.ПечатнаяФормаТ8.Когда вы запускаете печать напрямую из самого отчета ПечатнаяФормаТ8 через панель отчетов, платформа 1С использует стандартный, заложенный разработчиками интерфейс компоновщика. В этом случае сложная программная обработка запроса из общего модуля практически не задействуется, и система отрабатывает штатно. Но при вызове печати из формы документа управление передается специализированному программному коду, где и происходит сбой.
Давайте проанализируем суть сообщения об ошибке. Символ &П (а также подобные ему &П1, &П2) представляет собой внутренний автогенерируемый параметр, который платформа «1С:Предприятие» создает автоматически при добавлении динамических отборов в запросы СКД.
В исходной схеме компоновки отчета ПечатнаяФормаТ8 запрос спроектирован так, чтобы выбирать данные обо всех кадровых изменениях. Программа на лету модифицирует этот запрос, добавляя условие отбора по документам. В нормальном состоянии запрос модифицируется к виду:
ГДЕ
Ссылка В (&П)
Здесь параметр &П должен быть массивом, содержащим ссылки на выбранные документы увольнения. Если в алгоритме передачи параметров происходит сбой, СУБД получает неверную структуру запроса или пустой (неопределенный) параметр. Это происходит по двум основным причинам:
&П передается одиночная ссылка. Оператор В в таком случае может отработать некорректно на уровне генерации SQL-запроса СУБД.
Давайте разберем по шагам, как локализовать и устранить данную неисправность в вашей информационной базе.
Основным «подозреваемым» в возникновении данной проблемы является общий модуль ЗарплатаКадрыОтчеты. Именно в нем сосредоточены процедуры и функции, отвечающие за перехват печати, подготовку макетов компоновки и инициализацию настроек СКД.
Вам необходимо выполнить сравнение данного модуля с полностью типовым модулем из аналогичного релиза конфигурации ЗУП (в нашем примере это релиз 3.1.12.113). Особое внимание обратите на следующие процедуры:
УстановитьПараметрОтбораИнициализироватьНастройкиОтчетаКак показывает практика, при обновлении доработанной конфигурации эти процедуры могут объединиться некорректно (дублирование строк, пропуск ключевых условий или неверная передача параметров компоновщика). Восстановите оригинальный код этих процедур из типовой конфигурации.
Даже после того как вы исправите код в общем модуле ЗарплатаКадрыОтчеты, ошибка может продолжать воспроизводиться. Выясним причину этого явления. Дело в том, что в целях оптимизации производительности ЗУП 3.1 кэширует сгенерированные макеты компоновки данных.
Кэшированные схемы хранятся в специальном регистре сведений. Если в момент совершения ошибки система один раз сохранила «битый» макет с некорректным параметром &П, она будет продолжать считывать его из кэша, игнорируя ваши исправления в общем модуле.
Для сброса кэша выполним следующие действия:
ПечатнаяФормаТ8 (или просто Т8).
Давайте рассмотрим пример кода, который отвечает за правильную программную инициализацию параметров компоновки данных при печати документов. Этот пример поможет вам понять, как логика платформы должна работать в штатном режиме, и позволит проверить корректность процедур в вашем общем модуле ЗарплатаКадрыОтчеты.
// Пример правильной установки параметров компоновщика для печатных форм
Процедура УстановитьПараметрыПечатиТ8(КомпоновщикНастроек, МассивОбъектов) Экспорт
// Проверим, что передан именно массив документов, даже если печатается один документ
Если ТипЗнч(МассивОбъектов) <> Тип("Массив") Тогда
СписокДокументов = Новый Массив;
СписокДокументов.Добавить(МассивОбъектов);
Иначе
СписокДокументов = МассивОбъектов;
КонецЕсли;
// Поиск параметра отбора по ссылке на документ
ПараметрСсылка = КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы.Найти("ПериодИлиДокументСсылка");
Если ПараметрСсылка <> Неопределено Тогда
ПараметрСсылка.Значение = СписокДокументов;
ПараметрСсылка.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Обратите внимание на то, что передаваемый объект обязательно должен приводиться к типу Массив. Если в ваш кастомный или некорректно объединенный общий модуль передается чистая ссылка типа ДокументСсылка.Увольнение вместо массива, СКД построит неверное условие сравнения, что приведет к падению платформы при попытке выполнить запрос.
Подводя итоги нашего анализа, дадим несколько важных рекомендаций для предотвращения подобных ошибок при сопровождении ЗУП 3.1:
ЗарплатаКадры.... Именно они содержат логику интеграции БСП и БЗК.ЗарплатаКадрыОтчеты в месте вызова процессора компоновки и проверьте типы передаваемых параметров.Макеты компоновки данных.Проанализировав данную проблему и выполнив указанные шаги, вы сможете быстро и безболезненно вернуть пользователям возможность печатать кадровые приказы Т-8 непосредственно из документов увольнения.