При работе в современных конфигурациях 1С, построенных на базе Библиотеки стандартных подсистем (БСП), таких как Бухгалтерия предприятия 3.0, ERP или ЗУП, программисты часто сталкиваются с внезапной ошибкой: «Несоответствие типов (параметр номер '1')». Эта ошибка обычно возникает в общем модуле УправлениеКонтактнойИнформациейСлужебный при вызове метода КонтактнаяИнформацияИзXML.
Проанализируем ситуацию: ошибка проявляется при создании контрагентов, партнеров, физических лиц или платежных поручений. В технологическом журнале это фиксируется как неудачная попытка вызова метода Создать() у объекта ФабрикаXDTO. Давайте разберем по шагам, почему это происходит и как восстановить работоспособность системы.
Проблема кроется в строке кода:
Результат = ФабрикаXDTO.Создать(ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация"));
При анализе в отладчике выясняется, что метод ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация") возвращает значение Неопределено. Это происходит потому, что в текущем сеансе пользователя глобальная фабрика XDTO по какой-то причине «не видит» нужный пакет метаданных. Интересно, что количество пакетов в ФабрикаXDTO у проблемного пользователя может быть значительно меньше (например, 200 вместо положенных 300+), чем у пользователя, у которого ошибка не воспроизводится.
Основными причинами такого поведения являются:
Как показывает практика, в большинстве случаев виноваты расширения конфигурации. Даже если расширение напрямую не затрагивает контактную информацию, оно может влиять на инициализацию всей фабрики XDTO.
Разберем алгоритм действий:
http://www.v8.1c.ru/ssl/contactinfo).Если расширение необходимо для работы, но оно «ломает» фабрику, применим метод принудительной реструктуризации. Это заставит платформу пересобрать внутренние таблицы метаданных и обновить кэш XDTO.
Рассмотрим пошагово этот метод:
Контрагенты) новый реквизит с произвольным названием, например, ФиктивныйРеквизитДляОбновления.Этот простой прием часто помогает «протолкнуть» зависшие изменения в структуре XDTO, которые не подхватились при обычном обновлении.
Если манипуляции с расширениями не помогают, а кластер 1С состоит из нескольких серверов, проблема наверняка кроется в серверном кэше. Обычная очистка папки %AppData% на компьютере пользователя здесь не поможет.
Проанализируем, что нужно сделать на сервере:
1C:Enterprise 8.3.C:\Program Files\1cv8\srvinfo или C:\Program Data\1cv8).reg_1541) и удалите внутри нее папки snaccache. Также рекомендуется очистить содержимое папки temp внутри рабочего каталога сервера.1cv8lst.lst) и файлы журналов регистрации, если они вам нужны.После этой процедуры первый запуск базы будет долгим, так как сервер будет заново формировать кэш метаданных и фабрику XDTO, но это гарантирует чистоту структуры типов.
В исключительных случаях, когда ошибку нужно устранить «здесь и сейчас», а перезагружать сервер нет возможности, можно внести изменения в код общего модуля. Это не исправит причину, но позволит пользователям продолжить работу.
Посмотрим на пример модификации кода в модуле УправлениеКонтактнойИнформациейСлужебный:
// Вместо прямого вызова:
// Результат = ФабрикаXDTO.Создать(ТипКИ);
ТипКИ = ФабрикаXDTO.Тип(ПространствоИмен, "КонтактнаяИнформация");
Если ТипКИ = Неопределено Тогда
// Если тип не найден в глобальной фабрике, пробуем инициализировать
// пустую структуру или вызываем исключение с подробным описанием для админа
ЗаписьЖурналаРегистрации("ОшибкиXDTO", УровеньЖурналаРегистрации.Ошибка,,,
"Не удалось найти тип КонтактнаяИнформация в Фабрике XDTO");
// Возвращаем пустую структуру, чтобы избежать падения интерфейса
Результат = Новый Структура("Данные, Представление", "", "");
Иначе
Результат = ФабрикаXDTO.Создать(ТипКИ);
КонецЕсли;
Такой подход позволит системе не «вылетать» с критической ошибкой, хотя функциональность работы с адресами может быть временно ограничена до момента исправления кэша.
Чтобы избежать подобных ситуаций в будущем, придерживайтесь следующих правил:
Подводя итог, можно сказать, что ошибка «Несоответствие типов» в контексте ФабрикаXDTO — это почти всегда следствие «замусоренного» кэша или конфликта метаданных. Последовательное выполнение предложенных выше действий позволяет решить проблему в 99% случаев.