Как сделать внешний отчет «Книга продаж» на основе встроенного в 1С:Бухгалтерия 3.0?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Налоговый учет
← На главную

Перенос встроенных отчетов во внешние файлы — стандартная задача для разработчика 1С, когда необходимо внести изменения в логику формирования данных, не снимая конфигурацию с поддержки. Однако отчет Книга продаж в БП 3.0 является одним из самых сложных для этой процедуры из-за его глубокой интеграции в механизмы учета НДС и зависимости от контекста метаданных конфигурации.

В этой статье мы подробно разберем, почему внешний отчет может формироваться пустым, как правильно перенести программный код и какие нюансы клиент-серверной архитектуры следует учитывать.

Перенос кода и первичная настройка

Разберем типичный алгоритм действий при создании внешнего отчета на основе встроенного. Обычно мы сохраняем отчет как файл .erf, переносим содержимое модуля менеджера в модуль объекта и пытаемся адаптировать вызовы. Одной из ключевых процедур здесь является ПодготовитьПараметрыКнигиПродаж.

Проанализируем пример кода, который часто используется для перенаправления вызова на локальную логику внешнего отчета:


Процедура ПодготовитьПараметрыКнигиПродаж(ПараметрыОтчета, АдресХранилища)
    ОтчетОбъект = РеквизитФормыВЗначение("Отчет");
    ОтчетОбъект.СформироватьОтчет(ПараметрыОтчета, АдресХранилища);
КонецПроцедуры

На первый взгляд, этого достаточно, однако при запуске внешнего отчета пользователь часто видит только шапку и подвал, в то время как область данных остается пустой. Выясним причину этой ситуации.

Проблема 1: Жесткая привязка к метаданным

Многие процедуры в общих модулях, особенно входящие в блок УчетНДС, содержат прямые ссылки на объекты метаданных. В коде конфигурации можно встретить конструкции, обращающиеся к Метаданные.Отчеты.КнигаПродаж. Когда вы запускаете отчет как внешний, система перестает идентифицировать его как «тот самый» отчет из конфигурации. Внутренние запросы, ответственные за сбор временных таблиц, могут просто не инициализироваться, так как проверка на соответствие типу объекта возвращает Ложь.

Чтобы решить эту проблему, рассмотрим следующие варианты:

  1. Программная подмена: В местах, где код обращается к метаданным, необходимо убедиться, что логика обработки внешнего объекта не отличается от внутреннего.
  2. Использование расширений: Если это допустимо, создание копии отчета в расширении с сохранением имени (или использованием префикса) часто снимает проблему с метаданными, так как объект становится частью дерева конфигурации.

Проблема 2: Фоновые задания и клиент-серверный режим

В современных версиях БП 3.0 формирование Книги продаж часто выполняется в фоновом задании на стороне сервера. Это критически важно для производительности, но создает препятствия для внешних отчетов. Если вы открываете отчет через меню «Файл — Открыть», сервер в клиент-серверном варианте может «не видеть» локальный файл, открытый на компьютере пользователя.

Проанализируем правильный подход к запуску в таких условиях:

Проблема 3: Безопасный режим и привилегированное выполнение

Внешние отчеты по умолчанию запускаются системой в безопасном режиме. В этом режиме накладываются строгие ограничения на доступ к ресурсам. Книга продаж обращается к регистрам накопления НДС напрямую и использует сложные запросы к данным, требующим привилегированного режима доступа.

Посмотрим, как можно обойти это ограничение. В начале процедуры формирования данных в модуле объекта стоит явно включить привилегированный режим:


УстановитьПривилегированныйРежим(Истина);
// Далее идет логика формирования запросов и сборки дерева значений

Также при регистрации отчета в справочнике «Дополнительные отчеты и обработки» следует выбирать режим работы «Без ограничений», если это позволяет политика безопасности вашей организации.

Проблема 4: Особенности SQL-запросов и фильтрация по массивам

Рассмотрим ситуацию, когда отчет работает в файловой базе, но выдает пустой результат или игнорирует фильтры в клиент-серверной версии. Часто это связано с тем, как СУБД (например, MS SQL Server) обрабатывает типы данных в параметрах запроса.

Типичный пример ошибки при установке фильтра:


Запрос.УстановитьПараметр("МассивИсключаемыхНомеров", ИсключаемыеДокументы.ВыгрузитьКолонку("Номер"));
// В тексте запроса:
// ГДЕ НЕ НомерСчетаФактуры В (&МассивИсключаемыхНомеров)

В файловой версии 1С прощает несоответствие длины строк или наличие лишних пробелов в массиве. В SQL-версии, если тип поля в базе Строка(25), а в массиве передаются строки длиной 20 символов, условие В (&Параметр) может не сработать. Перед передачей массива в запрос рекомендуется:

  1. Приводить все элементы массива к точному типу и длине, соответствующей метаданным.
  2. Очищать строки от лишних пробелов функцией СокрЛП().
  3. Проверять наличие пустых элементов в массиве, которые могут исказить логику ГДЕ НЕ....

Рекомендации по отладке

Если отчет по-прежнему пуст, выполним следующие шаги для поиска «узкого места»:

  1. Очистка кэша: Часто старые определения временных таблиц в кэше мешают корректному выполнению запросов внешнего отчета.
  2. Проверка итогов: Убедимся, что итоги по регистрам НДС актуализированы на дату формирования отчета. Попробуем запустить отчет под пользователем с полными правами (Администратор), чтобы исключить влияние RLS (ограничения прав на уровне записей).
  3. Анализ МВТ: Встроенная Книга продаж активно использует Менеджер Временных Таблиц (МВТ), который передается между общими модулями. Проверьте, чтобы при вызове процедур из внешнего отчета экземпляр МенеджерВременныхТаблиц инициализировался корректно и не терялся при переходе между контекстами.

Использование расширений остается наиболее стабильным способом кастомизации Книги продаж, так как позволяет избежать большинства проблем с контекстом и безопасным режимом. Однако, следуя приведенным выше инструкциям по работе с метаданными и регистрацией в дополнительных обработках, вы сможете добиться корректной работы и внешнего файла отчета.

← На главную