В чем разница структур и соответствий в 1С и как достигается отличие в реализации
Что проверяют
Понимаете ли вы, чем коллекции отличаются по ключам и поведению, а не только то, что «обе хранят пары». Следом спрашивают, что будет при обращении к отсутствующему ключу и что выбрать для кэша.
Как отвечать
Обе коллекции хранят пары КлючИЗначение и обходятся через Для Каждого, но устроены под разные задачи:
- ключи структуры: только строки, которые годятся как идентификатор языка: буквы, цифры, подчёркивание, первым символом не цифра. Регистр не важен,
Имяиимяэто один ключ. Поэтому работает обращение через точку:Параметры.Имя; - ключи соответствия: значение почти любого типа: число, дата, ссылка, строка с пробелами или дефисом. Строки сравниваются с учётом регистра, ссылки по значению;
- отсутствующий ключ: у структуры обращение через точку падает с ошибкой «Поле объекта не обнаружено», поэтому проверяют
Свойство(Ключ, Значение). Соответствие черезПолучить()или индекс вернётНеопределенобез ошибки; - создание:
Новый Структура("Имя, Возраст", "Иван", 30), первый параметр это строка ключей через запятую, дальше значения. Соответствие заполняют черезВставить().
Где что уместно: структура для заранее известного набора полей (параметры процедуры, возврат нескольких значений). Соответствие для поиска по произвольному ключу: кэш «ссылка → данные» вместо повторного запроса в цикле. Из общего модуля с повторным использованием возвращаемых значений отдают ФиксированнаяСтруктура или ФиксированноеСоответствие, чтобы вызывающий код не испортил закэшированный объект. При разборе JSON ПрочитатьJSON(Чтение, Истина) читает в соответствие: ключ вида user-id в структуру не ляжет.
Где спотыкаются
Пишут конструктор структуры как чередование ключей и значений: Новый Структура("Имя", "Иван", "Возраст", 30). Ключи задаются только первым параметром, поэтому поля Возраст в такой структуре не будет.
Говорят о «строгой типизации» структуры. Типы значений в ней не фиксируются, в Возраст можно положить и строку.
Полагаются на Получить() и не отличают отсутствующий ключ от ключа, в котором лежит Неопределено. Если различие важно, не храните Неопределено как осмысленное значение.