При разработке собственных административных панелей, мониторов регламентных процедур или доработке консоли заданий разработчики часто сталкиваются с исключением «Несоответствие типов (параметр номер 1)» при выполнении метода ФоновыеЗадания.ПолучитьФоновыеЗадания(). Зачастую в отладчике видно, что первым параметром передается именно объект Структура, из-за чего ошибка ставит в тупик. Разберем детально механику работы этого метода, выясним скрытые причины ошибки и рассмотрим готовые шаблоны корректного кода.
Платформа 1С:Предприятие при вызове метода ПолучитьФоновыеЗадания() проверяет переданную структуру отбора на глубинном уровне. Исключение возникает не только тогда, когда передан объект другого типа (например, Массив или Соответствие), но и в следующих случаях:
Неопределено или пустой строке (для тех полей, где ожидается объект), валидация параметров завершается аварийно.Проанализируем требования синтакс-помощника к ключам структуры отбора для метода ФоновыеЗадания.ПолучитьФоновыеЗадания():
РегламентноеЗадание — тип: РегламентноеЗадание (объект регламентного задания платформы). Частая ошибка: передача наименования задания строкой или ссылки на элемент справочника из БСП. Если известен только идентификатор задания, необходимо предварительно получить сам объект: РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторРЗ).УникальныйИдентификатор — тип: УникальныйИдентификатор. Частая ошибка: передача строкового представления GUID (например, "5bf8cf20-9988-..."). Строку необходимо явно оборачивать через конструктор Новый УникальныйИдентификатор(СтрокаGUID).Состояние — тип: СостояниеФоновогоЗадания (системное перечисление) или Массив значений СостояниеФоновогоЗадания. Частая ошибка: передача строки с именем состояния (например, "Активно") или числа.ИмяМетода — тип: Строка (полное имя экспортной процедуры общего модуля, выполняемой в фоне).Ключ — тип: Строка (уникальный ключ фонового задания).Наименование — тип: Строка.Начало — тип: Дата (отбирает задания, запущенные после указанной даты).Конец — тип: Дата (отбирает задания, завершенные до указанной даты).Рассмотрим, как типичные ошибки выглядят в коде и как их правильно исправить.
Ошибка 1. Передача строкового наименования регламентного задания:
// НЕПРАВИЛЬНО:
Отбор = Новый Структура;
Отбор.Вставить("РегламентноеЗадание", "Обновление индекса ППД"); // Передана строка!
Фоновые = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); // Вызовет ошибку
// ПРАВИЛЬНО:
Отбор = Новый Структура;
НайденноеРЗ = РегламентныеЗадания.НайтиПоНаименованию("Обновление индекса ППД");
Если НайденноеРЗ <> Неопределено Тогда
Отбор.Вставить("РегламентноеЗадание", НайденноеРЗ);
Фоновые = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
КонецЕсли;
Ошибка 2. Использование структуры напрямую из формы диалога отбора:
Формы настроек отбора нередко возвращают структуру со служебными ключами (например, ИспользоватьОтборПоСостоянию, ФлагПериода). Передача такой структуры напрямую в платформенный метод приведет к падению. Необходимо формировать чистую структуру перед запросом.
&НаСервере
Процедура ОбновитьСписокФоновыхЗаданий(ПараметрыОтбораИзДиалога)
Отбор = Новый Структура;
// Проверяем и добавляем только поддерживаемые и заполненные параметры
Если ПараметрыОтбораИзДиалога.Свойство("Состояние") И ЗначениеЗаполнено(ПараметрыОтбораИзДиалога.Состояние) Тогда
Отбор.Вставить("Состояние", ПараметрыОтбораИзДиалога.Состояние);
КонецЕсли;
Если ПараметрыОтбораИзДиалога.Свойство("Начало") И ЗначениеЗаполнено(ПараметрыОтбораИзДиалога.Начало) Тогда
Отбор.Вставить("Начало", ПараметрыОтбораИзДиалога.Начало);
КонецЕсли;
Если ПараметрыОтбораИзДиалога.Свойство("ИмяМетода") И Не ПустаяСтрока(ПараметрыОтбораИзДиалога.ИмяМетода) Тогда
Отбор.Вставить("ИмяМетода", ПараметрыОтбораИзДиалога.ИмяМетода);
КонецЕсли;
МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
// Обработка полученного массива фоновых заданий
ТаблицаФоновыеЗадания.Очистить();
Для Каждого Задание Из МассивЗаданий Цикл
НоваяСтрока = ТаблицаФоновыеЗадания.Добавить();
НоваяСтрока.Наименование = Задание.Наименование;
НоваяСтрока.Ключ = Задание.Ключ;
НоваяСтрока.ИмяМетода = Задание.ИмяМетода;
НоваяСтрока.Состояние = Задание.Состояние;
НоваяСтрока.Начало = Задание.Начало;
НоваяСтрока.Конец = Задание.Конец;
КонецЦикла;
КонецПроцедуры
Если задача заключается исключительно в получении фоновых заданий, порожденных определенным регламентным заданием, вместо создания структуры отбора для глобального менеджера можно использовать метод самого объекта РегламентноеЗадание:
// Получение фоновых заданий напрямую из объекта регламентного задания
ОбъектРЗ = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторРЗ);
Если ОбъектРЗ <> Неопределено Тогда
// Метод возвращает массив объектов ФоновоеЗадание
МассивФоновых = ОбъектРЗ.ПолучитьФоновыеЗадания();
Для Каждого ФЗ Из МассивФоновых Цикл
// Обработка фонового задания
КонецЦикла;
КонецЕсли;
Метод ФоновыеЗадания.ПолучитьФоновыеЗадания() чувствителен к правам текущего пользователя сеанса:
Если требуется получить полный список заданий информационной базы под пользователем с ограниченными правами, процедуру следует выполнять в привилегированном режиме с помощью вызова УстановитьПривилегированныйРежим(Истина).