В процессе разработки на платформе 1С:Предприятие 8.2 часто возникают ситуации, когда стандартный функционал внешнего отчета накладывает определенные ограничения. Например, конструктор отчетов может требовать обязательного заполнения всех параметров запроса, или же бизнес-логика требует не просто вывода данных, но и их модификации (что традиционно является задачей обработок). В этой статье мы подробно разберем, как сменить тип внешнего объекта, обойти жесткие требования к параметрам и организовать взаимодействие между отчетами и обработками.
Многие начинающие разработчики сталкиваются с тем, что в окне внешнего отчета при выборе команды «Сохранить как...» доступен только один тип файла — .erf (внешний отчет). Платформа не позволяет напрямую «пересохранить» его как .epf (внешняя обработка). Однако мы можем воспользоваться промежуточным шагом через дерево конфигурации.
Разберем этот процесс по шагам:
.erf.Важно: При таком переходе стоит помнить, что у отчета есть стандартные реквизиты, связанные с Системой компоновки данных (например, КомпоновщикНастроек), которые могут отсутствовать у обработки или вести себя иначе. Проанализируем модуль объекта после переноса на наличие ошибок компиляции.
Если вы не хотите вносить изменения в основную конфигурацию, можно воспользоваться методом копирования. Рассмотрим, как это сделать эффективно:
Ctrl+A и Ctrl+C в модуле объекта отчета и вставляем его в модуль объекта обработки.Этот метод кажется трудоемким, но он позволяет «по пути» очистить объект от лишнего мусора, который часто накапливается в процессе разработки сложных отчетов.
Одной из причин перехода от отчета к обработке часто является желание сделать параметры запроса необязательными. В стандартном конструкторе отчетов, если параметр указан в тексте запроса, система будет требовать его заполнения. Выясним, как обойти это ограничение программно.
Вариант А: Использование условия «ИЛИ»
Это самый простой способ сделать параметр «ленивым». Мы передаем дополнительный флаг, который сообщает запросу, нужно ли учитывать фильтр.
Запрос.Текст = "ВЫБРАТЬ
| Номенклатура.Ссылка КАК Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| (&ПараметрПуст ИЛИ Номенклатура.ВидНоменклатуры = &ВидНоменклатуры)";
Запрос.УстановитьПараметр("ВидНоменклатуры", ВыбранныйВид);
Запрос.УстановитьПараметр("ПараметрПуст", Не ЗначениеЗаполнено(ВыбранныйВид));
Вариант Б: Динамическое формирование текста
Если мы работаем в модуле обработки, мы можем полностью контролировать текст запроса перед его выполнением. Посмотрим на пример формирования условия ГДЕ:
ТекстЗапроса = "ВЫБРАТЬ Ссылка ИЗ Справочник.Номенклатура КАК Номенклатура";
Условие = "";
Если ЗначениеЗаполнено(ВыбранныйВид) Тогда
Условие = " ГДЕ Номенклатура.ВидНоменклатуры = &ВидНоменклатуры";
Запрос.УстановитьПараметр("ВидНоменклатуры", ВыбранныйВид);
КонецЕсли;
Запрос.Текст = ТекстЗапроса + Условие;
Иногда задача меняется: нам не нужно превращать отчет в обработку, нам нужно вызвать его из обработки, передав в него определенные настройки. В версии 8.2 это реализуется через менеджер внешних отчетов.
Проанализируем алгоритм подключения внешнего файла:
// 1. Подключаем внешний файл
ИмяФайла = "C:\Reports\МойОтчет.erf";
ИмяПодключения = ВнешниеОтчеты.Подключить(ИмяФайла);
// 2. Создаем объект отчета
ОтчетОбъект = ВнешниеОтчеты.Создать(ИмяПодключения);
// 3. Настраиваем параметры (например, через СКД)
Настройки = ОтчетОбъект.КомпоновщикНастроек.Настройки;
ПараметрСКД = Настройки.ПараметрыДанных.Элементы.Найти("ДатаНачала");
ПараметрСКД.Значение = НачалоМесяца(ТекущаяДата());
ПараметрСКД.Использование = Истина;
// 4. Открываем форму отчета
ОтчетОбъект.ПолучитьФорму().Открыть();
Рассмотрим ситуацию, когда при формировании отчета необходимо помечать данные как «обработанные» (например, проставлять флаг в регистре или документе). Технически это можно сделать в процедуре ПриКомпоновкеРезультата (для СКД) или в цикле обхода выборки результата запроса.
Однако помните о транзакционных блокировках. Если отчет формируется долго, и в это время вы начинаете записывать данные в базу, другие пользователи могут столкнуться с ожиданием освобождения ресурсов. Хорошим тоном считается разделение процессов:
Такой подход делает работу системы более стабильной и предсказуемой. Использование внешней обработки вместо отчета дает здесь преимущество, так как позволяет легче реализовать интерактивные элементы управления (кнопки, флажки в строках), которые не предусмотрены стандартным механизмом компоновки данных.