Как конвертировать внешний отчет во внешнюю обработку 1С 8.2 и настроить необязательные параметры запроса

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Способ 1: Конвертация через дерево метаданных конфигурации

Многие начинающие разработчики сталкиваются с тем, что в окне внешнего отчета при выборе команды «Сохранить как...» доступен только один тип файла — .erf (внешний отчет). Платформа не позволяет напрямую «пересохранить» его как .epf (внешняя обработка). Однако мы можем воспользоваться промежуточным шагом через дерево конфигурации.

Разберем этот процесс по шагам:

  1. Откроем информационную базу в режиме Конфигуратор.
  2. Откроем основную конфигурацию (если она закрыта) и найдем ветку Отчеты.
  3. Нажмем правой кнопкой мыши на ветке и выберем пункт «Добавить». В открывшемся окне выберем «Загрузить из файла» и укажем наш внешний отчет .erf.
  4. После того как отчет появился в дереве метаданных, мы просто перетаскиваем его (Drag-and-drop) мышкой из ветки Отчеты в ветку Обработки.
  5. Платформа автоматически преобразует объект в обработку. Теперь нажмем на него правой кнопкой мыши и выберем «Сохранить как внешнюю обработку...».

Важно: При таком переходе стоит помнить, что у отчета есть стандартные реквизиты, связанные с Системой компоновки данных (например, КомпоновщикНастроек), которые могут отсутствовать у обработки или вести себя иначе. Проанализируем модуль объекта после переноса на наличие ошибок компиляции.

Способ 2: Ручной перенос через буфер обмена

Если вы не хотите вносить изменения в основную конфигурацию, можно воспользоваться методом копирования. Рассмотрим, как это сделать эффективно:

  1. Создадим новую пустую внешнюю обработку.
  2. Откроем в конфигураторе одновременно и отчет, и новую обработку.
  3. Поочередно копируем содержимое: реквизиты, табличные части, формы и макеты.
  4. Для переноса кода используем Ctrl+A и Ctrl+C в модуле объекта отчета и вставляем его в модуль объекта обработки.

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

Реализация необязательных параметров в запросах

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

Вариант А: Использование условия «ИЛИ»

Это самый простой способ сделать параметр «ленивым». Мы передаем дополнительный флаг, который сообщает запросу, нужно ли учитывать фильтр.


Запрос.Текст = "ВЫБРАТЬ
               |    Номенклатура.Ссылка КАК Ссылка
               |ИЗ
               |    Справочник.Номенклатура КАК Номенклатура
               |ГДЕ
               |    (&ПараметрПуст ИЛИ Номенклатура.ВидНоменклатуры = &ВидНоменклатуры)";

Запрос.УстановитьПараметр("ВидНоменклатуры", ВыбранныйВид);
Запрос.УстановитьПараметр("ПараметрПуст", Не ЗначениеЗаполнено(ВыбранныйВид));

Вариант Б: Динамическое формирование текста

Если мы работаем в модуле обработки, мы можем полностью контролировать текст запроса перед его выполнением. Посмотрим на пример формирования условия ГДЕ:


ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура";
Условие = "";

Если ЗначениеЗаполнено(ВыбранныйВид) Тогда
    Условие = " ГДЕ Номенклатура.ВидНоменклатуры = &ВидНоменклатуры";
    Запрос.УстановитьПараметр("ВидНоменклатуры", ВыбранныйВид);
КонецЕсли;

Запрос.Текст = ТекстЗапроса + Условие;

Программный вызов внешнего отчета из обработки

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

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


// 1. Подключаем внешний файл
ИмяФайла = "C:\Reports\МойОтчет.erf";
ИмяПодключения = ВнешниеОтчеты.Подключить(ИмяФайла);

// 2. Создаем объект отчета
ОтчетОбъект = ВнешниеОтчеты.Создать(ИмяПодключения);

// 3. Настраиваем параметры (например, через СКД)
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;
ПараметрСКД = Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");
ПараметрСКД.Значение = НачалоМесяца(ТекущаяДата());
ПараметрСКД.Использование = Истина;

// 4. Открываем форму отчета
ОтчетОбъект.ПолучитьФорму().Открыть();

Модификация данных при формировании отчета

Рассмотрим ситуацию, когда при формировании отчета необходимо помечать данные как «обработанные» (например, проставлять флаг в регистре или документе). Технически это можно сделать в процедуре ПриКомпоновкеРезультата (для СКД) или в цикле обхода выборки результата запроса.

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

  1. Сначала формируем отчет (чтение данных).
  2. Затем, по отдельной кнопке на форме (команда «Обработать»), запускаем процедуру записи данных только для тех строк, которые выведены в отчет.

Такой подход делает работу системы более стабильной и предсказуемой. Использование внешней обработки вместо отчета дает здесь преимущество, так как позволяет легче реализовать интерактивные элементы управления (кнопки, флажки в строках), которые не предусмотрены стандартным механизмом компоновки данных.

← На главную