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