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