Как исправить ошибку «Несоответствие типов (параметр номер '1')» при вызове НайтиПоУникальномуИдентификатору в 1С

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

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

{ОбщийМодуль.РегламентныеЗаданияСервер.Модуль}: Ошибка при вызове метода контекста (НайтиПоУникальномуИдентификатору) по причине: Несоответствие типов (параметр номер '1')

Проанализируем причину возникновения этой проблемы, разберем механики платформы и рассмотрим способы устранения ошибки.

Причина возникновения ошибки и требования метода

Выясним причину, по которой платформа выдает данное исключение. Метод РегламентныеЗадания.НайтиПоУникальномуИдентификатору() входит в состав менеджера регламентных заданий и имеет строго заданную сигнатуру.

Синтаксис метода платформы:

РегламентныеЗадания.НайтиПоУникальномуИдентификатору(<Идентификатор>)

Параметр Идентификатор является обязательным. В качестве этого параметра платформа принимает исключительно объект типа УникальныйИдентификатор (UUID). Если в функцию передается значение типа Строка, Неопределено, Null или число, исполнение программы прерывается с ошибкой «Несоответствие типов (параметр номер '1')».

Анализ кода общего модуля

Рассмотрим экспортную функцию общего модуля РегламентныеЗаданияСервер, в которой происходит обращение к менеджеру регламентных заданий:


Функция ПолучитьРегламентноеЗадание(Знач Идентификатор) Экспорт
    
    ВызватьИсключениеЕслиНетПраваАдминистрирования();
    
    Если ТипЗнч(Идентификатор) = Тип("РегламентноеЗадание") Тогда
        Идентификатор = Идентификатор.УникальныйИдентификатор;
    КонецЕсли;
    
    Если ТипЗнч(Идентификатор) = Тип("Строка") Тогда
        Идентификатор = Новый УникальныйИдентификатор(Идентификатор);
    КонецЕсли;
    
    Если ТипЗнч(Идентификатор) = Тип("ОбъектМетаданных") Тогда
        РегламентноеЗадание = РегламентныеЗадания.НайтиПредопределенное(Идентификатор);
    Иначе
        РегламентноеЗадание = РегламентныеЗадания.НайтиПоУникальномуИдентификатору(Идентификатор);
    КонецЕсли;
    
    Если РегламентноеЗадание = Неопределено Тогда
        ВызватьИсключение( НСтр("ru = 'Регламентное задание не найдено.
                                     |Возможно, оно удалено другим пользователем.'") );
    КонецЕсли;
    
    Возвращать РегламентноеЗадание;
КонецФункции

Проанализируем логику работы этого кода:

  1. Если в параметр Идентификатор передан сам объект РегламентноеЗадание, из него извлекается его свойство УникальныйИдентификатор.
  2. Если передан строковый идентификатор, код преобразует его в объект типа УникальныйИдентификатор через конструктор Новый УникальныйИдентификатор(Идентификатор). В некоторых релизах Библиотеки Стандартных Подсистем (БСП) встречалась опечатка при проверке типа строки, из-за чего преобразование пропускалось.
  3. Если передано значение Неопределено (например, когда соответствующая константа или настройка фонового задания не заполнена), код сразу переходит к вызову НайтиПоУникальномуИдентификатору() с некорректным типом параметра, что и вызывает исключение.

Способы решения проблемы

Разберем по шагам варианты устранения ошибки в зависимости от условий её возникновения.

Вариант 1. Очистка кэша платформы и перерегистрация базы

Очень часто ошибка возникает из-за неактуального или поврежденного локального кэша платформы «1С:Предприятие» после проведения обновления конфигурации. Посмотрим, как корректно выполнить очистку:

  1. Завершите работу всех сеансов программы 1С.
  2. Удалите временные каталоги кэша пользователя вручную из папок:
    C:\Users\<ИмяПользователя>\AppData\Local\1C\1Cv82
    C:\Users\<ИмяПользователя>\AppData\Roaming\1C\1Cv82
    (папки с длинными буквенно-цифровыми наименованиями).
  3. Удалите информационную базу из списка запуска 1С и добавьте её заново (указав путь к каталогу базы или серверу). Это заставит платформу сформировать новый каталог кэширования.
  4. Запустите сеанс с ключом /ClearCache в дополнительных параметрах запуска.

Вариант 2. Исправление кода через Расширение конфигурации

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

  1. Перейдите в меню Администрирование – Расширения и добавьте новое расширение.
  2. Добавьте в расширение общий модуль РегламентныеЗаданияСервер.
  3. Переопределите функцию ПолучитьРегламентноеЗадание с помощью аннотации &Вместо:

&Вместо("ПолучитьРегламентноеЗадание")
Функция Расш_ПолучитьРегламентноеЗадание(Знач Идентификатор)
    
    Если ТипЗнч(Идентификатор) = Тип("Строка") И ЗначениеЗаполнено(Идентификатор) Тогда
        Идентификатор = Новый УникальныйИдентификатор(Идентификатор);
    ЭлИсли НЕ ЗначениеЗаполнено(Идентификатор) Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    Возврат ПродолжитьВызов(Идентификатор);
КонецФункции

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

Вариант 3. Тестирование и исправление информационной базы

Если ошибка связана с некорректными ссылками на фоновые или регламентные задания в служебных регистрах и константах:

  1. Откройте конфигуратор 1С под пользователем с административными правами.
  2. Сделайте резервную копию базы (выгрузку информационной базы .dt).
  3. Перейдите в меню Администрирование – Тестирование и исправление...
  4. Установите флаги Проверка логической целостности и Реиндексация таблиц базы данных, затем нажмите Выполнить.
← На главную