Почему возникает ошибка «Несоответствие типов (параметр номер 1)» при вызове ФоновыеЗадания.ПолучитьФоновыеЗадания и как ее исправить?

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

При разработке собственных административных панелей, мониторов регламентных процедур или доработке консоли заданий разработчики часто сталкиваются с исключением «Несоответствие типов (параметр номер 1)» при выполнении метода ФоновыеЗадания.ПолучитьФоновыеЗадания(). Зачастую в отладчике видно, что первым параметром передается именно объект Структура, из-за чего ошибка ставит в тупик. Разберем детально механику работы этого метода, выясним скрытые причины ошибки и рассмотрим готовые шаблоны корректного кода.

1. В чем истинная причина ошибки несоответствия типов?

Платформа 1С:Предприятие при вызове метода ПолучитьФоновыеЗадания() проверяет переданную структуру отбора на глубинном уровне. Исключение возникает не только тогда, когда передан объект другого типа (например, Массив или Соответствие), но и в следующих случаях:

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

2. Спецификация допустимых ключей и типов значений структуры отбора

Проанализируем требования синтакс-помощника к ключам структуры отбора для метода ФоновыеЗадания.ПолучитьФоновыеЗадания():

  1. РегламентноеЗадание — тип: РегламентноеЗадание (объект регламентного задания платформы). Частая ошибка: передача наименования задания строкой или ссылки на элемент справочника из БСП. Если известен только идентификатор задания, необходимо предварительно получить сам объект: РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторРЗ).
  2. УникальныйИдентификатор — тип: УникальныйИдентификатор. Частая ошибка: передача строкового представления GUID (например, "5bf8cf20-9988-..."). Строку необходимо явно оборачивать через конструктор Новый УникальныйИдентификатор(СтрокаGUID).
  3. Состояние — тип: СостояниеФоновогоЗадания (системное перечисление) или Массив значений СостояниеФоновогоЗадания. Частая ошибка: передача строки с именем состояния (например, "Активно") или числа.
  4. ИмяМетода — тип: Строка (полное имя экспортной процедуры общего модуля, выполняемой в фоне).
  5. Ключ — тип: Строка (уникальный ключ фонового задания).
  6. Наименование — тип: Строка.
  7. Начало — тип: Дата (отбирает задания, запущенные после указанной даты).
  8. Конец — тип: Дата (отбирает задания, завершенные до указанной даты).

3. Пошаговый разбор типичных ошибок на практике

Рассмотрим, как типичные ошибки выглядят в коде и как их правильно исправить.

Ошибка 1. Передача строкового наименования регламентного задания:


// НЕПРАВИЛЬНО:
Отбор = Новый Структура;
Отбор.Вставить("РегламентноеЗадание", "Обновление индекса ППД"); // Передана строка!
Фоновые = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор); // Вызовет ошибку

// ПРАВИЛЬНО:
Отбор = Новый Структура;
НайденноеРЗ = РегламентныеЗадания.НайтиПоНаименованию("Обновление индекса ППД");
Если НайденноеРЗ <> Неопределено Тогда
    Отбор.Вставить("РегламентноеЗадание", НайденноеРЗ);
    Фоновые = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
КонецЕсли;

Ошибка 2. Использование структуры напрямую из формы диалога отбора:

Формы настроек отбора нередко возвращают структуру со служебными ключами (например, ИспользоватьОтборПоСостоянию, ФлагПериода). Передача такой структуры напрямую в платформенный метод приведет к падению. Необходимо формировать чистую структуру перед запросом.


&НаСервере
Процедура ОбновитьСписокФоновыхЗаданий(ПараметрыОтбораИзДиалога)
    
    Отбор = Новый Структура;
    
    // Проверяем и добавляем только поддерживаемые и заполненные параметры
    Если ПараметрыОтбораИзДиалога.Свойство("Состояние") И ЗначениеЗаполнено(ПараметрыОтбораИзДиалога.Состояние) Тогда
        Отбор.Вставить("Состояние", ПараметрыОтбораИзДиалога.Состояние);
    КонецЕсли;
    
    Если ПараметрыОтбораИзДиалога.Свойство("Начало") И ЗначениеЗаполнено(ПараметрыОтбораИзДиалога.Начало) Тогда
        Отбор.Вставить("Начало", ПараметрыОтбораИзДиалога.Начало);
    КонецЕсли;
    
    Если ПараметрыОтбораИзДиалога.Свойство("ИмяМетода") И Не ПустаяСтрока(ПараметрыОтбораИзДиалога.ИмяМетода) Тогда
        Отбор.Вставить("ИмяМетода", ПараметрыОтбораИзДиалога.ИмяМетода);
    КонецЕсли;
    
    МассивЗаданий = ФоновыеЗадания.ПолучитьФоновыеЗадания(Отбор);
    
    // Обработка полученного массива фоновых заданий
    ТаблицаФоновыеЗадания.Очистить();
    Для Каждого Задание Из МассивЗаданий Цикл
        НоваяСтрока = ТаблицаФоновыеЗадания.Добавить();
        НоваяСтрока.Наименование = Задание.Наименование;
        НоваяСтрока.Ключ         = Задание.Ключ;
        НоваяСтрока.ИмяМетода    = Задание.ИмяМетода;
        НоваяСтрока.Состояние    = Задание.Состояние;
        НоваяСтрока.Начало       = Задание.Начало;
        НоваяСтрока.Конец        = Задание.Конец;
    КонецЦикла;
    
КонецПроцедуры

4. Получение фоновых заданий по конкретному регламентному заданию

Если задача заключается исключительно в получении фоновых заданий, порожденных определенным регламентным заданием, вместо создания структуры отбора для глобального менеджера можно использовать метод самого объекта РегламентноеЗадание:


// Получение фоновых заданий напрямую из объекта регламентного задания
ОбъектРЗ = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(ИдентификаторРЗ);
Если ОбъектРЗ <> Неопределено Тогда
    // Метод возвращает массив объектов ФоновоеЗадание
    МассивФоновых = ОбъектРЗ.ПолучитьФоновыеЗадания();
    
    Для Каждого ФЗ Из МассивФоновых Цикл
        // Обработка фонового задания
    КонецЦикла;
КонецЕсли;

5. Важные особенности прав доступа

Метод ФоновыеЗадания.ПолучитьФоновыеЗадания() чувствителен к правам текущего пользователя сеанса:

  1. Для администратора (с полными правами) возвращаются все фоновые задания информационной базы, подходящие под условия отбора.
  2. Для обычного пользователя метод возвращает только те фоновые задания, которые были запущены непосредственно в рамках его текущего пользовательского сеанса.

Если требуется получить полный список заданий информационной базы под пользователем с ограниченными правами, процедуру следует выполнять в привилегированном режиме с помощью вызова УстановитьПривилегированныйРежим(Истина).

← На главную