При работе с коллекцией Соответствие в платформе 1С:Предприятие разработчики часто сталкиваются с ситуацией, когда метод Получить() возвращает Неопределено, несмотря на то, что нужные данные визуально присутствуют в отладчике. Проанализируем причину этой проблемы и рассмотрим способы её решения.
Коллекция Соответствие позволяет использовать в качестве ключей значения любых типов данных: строки, числа, ссылки на объекты метаданных, а также объекты типа Тип. Главное правило платформы 1С — ключ при поиске должен строго совпадать по типу и значению с ключом, который был использован при заполнении коллекции.
Частая ошибка заключается в том, что разработчик пытается обратиться к элементу соответствия по строковому представлению (например, "Договор"), в то время как при формировании коллекции в качестве ключа был записан системный тип данных, например Тип("СправочникСсылка.ДоговорыКонтрагентов").
Рассмотрим пример ошибочного кода:
// Создаем соответствие и добавляем элемент
Соотв = Новый Соответствие;
Соотв.Вставить(Тип("СправочникСсылка.ДоговорыКонтрагентов"), ЗначениеТаблицы);
// Попытка получить значение по строковому ключу приведет к результату Неопределено:
Результат = Соотв.Получить("Договор"); // Возвращает Неопределено!
Для успешного извлечения данных из коллекции необходимо передавать в метод Получить() или в квадратные скобки [...] объект типа Тип, а не текстовую строку.
Разберем по шагам правильное обращение к элементам соответствия:
Тип с помощью встроенной функции Тип(), передав в нее точное полное имя объекта метаданных с префиксом вида ссылки (например, "СправочникСсылка.ДоговорыКонтрагентов").Получить() или используйте квадратные скобки.Пример корректного кода:
// Способ 1: Использование метода Получить()
ИскомыйТип = Тип("СправочникСсылка.ДоговорыКонтрагентов");
Значение = Соотв.Получить(ИскомыйТип);
// Способ 2: Обращение через квадратные скобки
Значение = Соотв[Тип("СправочникСсылка.ДоговорыКонтрагентов")];
Даже при правильном подходе к обращению через функцию Тип() можно получить Неопределено. Рассмотрим причины, почему это происходит:
Тип() при передаче несуществующего имени типа не вызывает ошибку выполнения, а возвращает значение Null. Если передать Null в метод Получить(), платформа вернет Неопределено. Например, обращение к Тип("СправочникСсылка.Договор") вместо Тип("СправочникСсылка.ДоговорыКонтрагентов") вернет Null.Тип("...") должно строго совпадать с именем в дереве метаданных (во множественном числе, если так задано в конфигурации), а не с его синонимом.СправочникСсылка.Имя, ДокументСсылка.Имя, ПеречислениеСсылка.Имя. Передача строки "ДоговорыКонтрагентов" без префикса приведет к возврату Null.Чтобы избежать ошибок, связанных с опечатками в строковых литералах, можно получать тип через пустую ссылку объекта метаданных с помощью функции ТипЗнч():
// Безопасное получение типа без риска опечатки в строке
ИскомыйТип = ТипЗнч(Справочники.ДоговорыКонтрагентов.ПустаяСсылка());
Значение = Соотв.Получить(ИскомыйТип);
Этот способ позволяет выявить ошибки в имени объекта еще на этапе синтаксического контроля кода платформой.