Как получить значение из Соответствия в 1С, если ключом является объект типа Тип?

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

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

В чем заключается проблема

Коллекция Соответствие позволяет использовать в качестве ключей значения любых типов данных: строки, числа, ссылки на объекты метаданных, а также объекты типа Тип. Главное правило платформы 1С — ключ при поиске должен строго совпадать по типу и значению с ключом, который был использован при заполнении коллекции.

Частая ошибка заключается в том, что разработчик пытается обратиться к элементу соответствия по строковому представлению (например, "Договор"), в то время как при формировании коллекции в качестве ключа был записан системный тип данных, например Тип("СправочникСсылка.ДоговорыКонтрагентов").

Рассмотрим пример ошибочного кода:


// Создаем соответствие и добавляем элемент
Соотв = Новый Соответствие;
Соотв.Вставить(Тип("СправочникСсылка.ДоговорыКонтрагентов"), ЗначениеТаблицы);

// Попытка получить значение по строковому ключу приведет к результату Неопределено:
Результат = Соотв.Получить("Договор"); // Возвращает Неопределено!

Правильный способ получения значения по ключу типа Тип

Для успешного извлечения данных из коллекции необходимо передавать в метод Получить() или в квадратные скобки [...] объект типа Тип, а не текстовую строку.

Разберем по шагам правильное обращение к элементам соответствия:

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

Пример корректного кода:


// Способ 1: Использование метода Получить()
ИскомыйТип = Тип("СправочникСсылка.ДоговорыКонтрагентов");
Значение = Соотв.Получить(ИскомыйТип);

// Способ 2: Обращение через квадратные скобки
Значение = Соотв[Тип("СправочникСсылка.ДоговорыКонтрагентов")];

Частые ошибки при работе с функцией Тип()

Даже при правильном подходе к обращению через функцию Тип() можно получить Неопределено. Рассмотрим причины, почему это происходит:

  1. Ошибки и опечатки в имени объекта метаданных: Функция Тип() при передаче несуществующего имени типа не вызывает ошибку выполнения, а возвращает значение Null. Если передать Null в метод Получить(), платформа вернет Неопределено. Например, обращение к Тип("СправочникСсылка.Договор") вместо Тип("СправочникСсылка.ДоговорыКонтрагентов") вернет Null.
  2. Использование синонима вместо имени: Имя объекта внутри функции Тип("...") должно строго совпадать с именем в дереве метаданных (во множественном числе, если так задано в конфигурации), а не с его синонимом.
  3. Отсутствие префикса вида ссылки: Для ссылочных типов обязательно указывается вид объекта: СправочникСсылка.Имя, ДокументСсылка.Имя, ПеречислениеСсылка.Имя. Передача строки "ДоговорыКонтрагентов" без префикса приведет к возврату Null.

Безопасный способ получения типа объекта

Чтобы избежать ошибок, связанных с опечатками в строковых литералах, можно получать тип через пустую ссылку объекта метаданных с помощью функции ТипЗнч():


// Безопасное получение типа без риска опечатки в строке
ИскомыйТип = ТипЗнч(Справочники.ДоговорыКонтрагентов.ПустаяСсылка());
Значение = Соотв.Получить(ИскомыйТип);

Этот способ позволяет выявить ошибки в имени объекта еще на этапе синтаксического контроля кода платформой.

← На главную