В процессе работы с конфигурацией 1С:Зарплата и управление персоналом 3.1 (ЗУП) пользователи и разработчики часто сталкиваются с необходимостью кастомизации печатных форм. Один из наиболее частых запросов — вывод показателей начислений и удержаний (например, тарифных ставок, отработанных часов или процентов надбавок) прямо в расчетном листке, который формируется из документа Начисление зарплаты и взносов.
Однако стандартная настройка через пользовательский интерфейс панели отчетов в данном случае не работает. Когда мы открываем расчетный листок непосредственно из документа начисления, система использует предопределенные программные алгоритмы и игнорирует текущие пользовательские настройки отчета. В этой статье мы подробно разберем, почему так происходит, как устроена архитектура этого механизма изнутри и как правильно изменить настройки компоновки данных, чтобы добиться желаемого результата без ошибок кэширования.
Для начала проанализируем поведение системы. Когда мы переходим в раздел Зарплата — Отчеты по зарплате — Расчетный листок (или Анализ начислений и удержаний), программа открывает полноценный отчет. В нем мы можем нажать кнопку «Настройки», включить флаг «Выводить показатели начислений (удержаний)», и отчет послушно выведет все необходимые формулы и тарифные ставки. Эти настройки сохраняются в пользовательском профиле информационной базы.
Совсем иная картина наблюдается, когда бухгалтер открывает документ Начисление зарплаты и взносов и нажимает на кнопку печатных форм «Расчетный листок». В этот момент система не открывает форму отчета для интерактивного взаимодействия. Вместо этого происходит программная генерация табличного документа на сервере.
Проанализируем цепочку вызовов в программном коде. При нажатии на кнопку печати управление передается в общий модуль УчетНачисленнойЗарплаты, а именно в функцию РасчетныйЛистокПоДаннымДокумента. Внутри этой функции происходит следующее:
АнализНачисленийИУдержаний с помощью вызова метода менеджера.РасчетныйЛисток, заложенный разработчиками фирмы 1С на уровне схемы компоновки данных (СКД).Поскольку загружается именно жестко заданный вариант настроек из макета ОсновнаяСхемаКомпоновкиДанных, любые изменения, сделанные пользователем в режиме 1С:Предприятие, просто отбрасываются. Чтобы решить эту задачу, нам придется внести изменения на уровне конфигурации.
Рассмотрим, как правильно настроить параметры вывода показателей начислений непосредственно в схеме компоновки. Для этого нам понадобятся права разработчика и доступ к конфигуратору базы данных.
Выполним следующие шаги по настройке схемы:
АнализНачисленийИУдержаний.ОсновнаяСхемаКомпоновкиДанных).ВыводитьПоказателиНачисленийИУдержаний там. Внимание: это распространенная ошибка! Изменение значения на вкладке «Параметры» задает лишь глобальное значение по умолчанию для всей схемы, которое может переопределяться в конкретных вариантах отчетов.РасчетныйЛисток. Именно этот вариант программно вызывается из документа начисления.ВыводитьПоказателиНачисленийИУдержаний (или аналогичный параметр, отвечающий за показатели).Казалось бы, на этом задача должна быть решена. Но если мы запустим сеанс 1С:Предприятие и попробуем сформировать расчетный листок из документа начисления зарплаты, мы с удивлением обнаружим, что показатели так и не появились. Выясним, почему система игнорирует внесенные изменения.
В современных конфигурациях на платформе 1С:Предприятие 8.3, построенных на базе Библиотеки Стандартных Подсистем (БСП), реализован сложный механизм оптимизации производительности при работе с отчетами. Компиляция схемы компоновки данных и генерация макета компоновки — ресурсоемкие операции. Чтобы не выполнять их при каждом формировании отчета, система кэширует готовые макеты.
Для хранения кэшированных макетов используется специальный служебный регистр сведений — МакетыКомпоновкиДанных.
Когда программа первый раз обращается к варианту отчета РасчетныйЛисток, она компилирует схему из конфигуратора, генерирует готовый двоичный макет и записывает его в регистр МакетыКомпоновкиДанных. При всех последующих вызовах (в том числе при печати из документа) система даже не заглядывает в конфигуратор — она берет готовый макет из этой таблицы кэша.
Поэтому наши изменения, внесенные в конфигураторе, останутся незамеченными до тех пор, пока мы не очистим кэшированную запись в пользовательском режиме. Выполним очистку по шагам:
АнализНачисленийИУдержаний (в колонке «Ключ макета» или «Имя объекта» будет указано имя отчета и вариант настройки РасчетныйЛисток).После удаления записи кэш считается сброшенным. При следующем вызове печатной формы «Расчетный листок» из документа Начисление зарплаты и взносов система обнаружит отсутствие готового макета в регистре, обратится к актуальной схеме СКД из конфигурации, скомпилирует ее с нашими новыми настройками (где параметр вывода показателей равен Истина) и вновь запишет оптимизированный макет в регистр. Показатели начислений успешно отобразятся в печатной форме.
Внесение изменений непосредственно в основную конфигурацию («живую» базу) имеет один существенный недостаток: при последующем обновлении программы 1С:ЗУП на новые релизы измененный отчет АнализНачисленийИУдержаний может быть заменен типовым аналогом, и настройки собьются. Чтобы избежать этого, рекомендуется выполнять доработку с помощью механизма расширений конфигурации.
Рассмотрим, как реализовать эту задачу через расширение:
ДоработкаРасчетногоЛистка), оставив назначение «Адаптация».АнализНачисленийИУдержаний, кликнем по нему правой кнопкой мыши и выберем команду «Добавить в расширение».РасчетныйЛисток установим параметр ВыводитьПоказателиНачисленийИУдержаний в значение Истина.МакетыКомпоновкиДанных, как было описано выше.Использование расширения гарантирует, что при обновлении типовой конфигурации ваши персональные настройки вывода показателей расчетного листка останутся в целости и сохранности.
Для разработчиков, которые хотят полностью контролировать процесс вывода без изменения схем компоновки данных (или хотят реализовать сложную логику, зависящую от условий), существует вариант программного вмешательства.
Посмотрим на пример кода, который вызывается при компоновке макета. В модуле менеджера отчета АнализНачисленийИУдержаний присутствует процедура, инициализирующая параметры перед выводом. Мы можем перехватить этот момент с помощью подписки на событие или через механизм &После в расширении общего модуля ЗарплатаКадрыОтчеты.
Пример изменения параметров компоновки «на лету» перед формированием табличного документа:
// Пример программной установки параметра в расширении общего модуля
&После("УчетНачисленнойЗарплаты.РасчетныйЛистокПоДаннымДокумента")
Процедура ИнициализироватьНастройкиРасчетногоЛистка(ПараметрыПечати, НастройкиОтчета)
// Получаем доступ к параметрам данных компоновщика настроек
ПараметрыДанных = НастройкиОтчета.ПараметрыДанных;
// Находим нужный нам параметр по имени
ПараметрПоказатели = ПараметрыДанных.Элементы.Найти("ВыводитьПоказателиНачисленийИУдержаний");
Если ПараметрПоказатели <> Неопределено Тогда
ПараметрПоказатели.Значение = Истина;
ПараметрПоказатели.Использование = Истина;
КонецЕсли;
КонецПроцедуры
Такой подход требует навыков программирования на встроенном языке 1С, но он предоставляет максимальную гибкость: вы можете выводить показатели только для определенных подразделений, конкретных видов начислений или ограничивать видимость показателей в зависимости от прав текущего пользователя.
Резюмируя все вышесказанное: для изменения настроек расчетного листка из документа начисления необходимо не только правильно изменить параметры внутри структуры варианта СКД в конфигураторе (или расширении), но и не забыть очистить служебный регистр кэша макетов. Понимание этих механизмов позволит вам легко настраивать любые типовые печатные формы, основанные на системе компоновки данных.