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