Таблица сравнения построена по версии справки из Конфигуратора:
Структура |
Соответствие |
Элементы коллекции:КлючИЗначение |
|
Свойства: () |
Возможно обращение к значению элемента посредством оператора [...]. В качестве аргумента передается значение ключа элемента. |
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции. |
|
Методы: Вставить (Insert) |
|
Конструкторы: |
|
Описание: |
|
Представляет собой коллекцию пар КлючИЗначение. При этом ключ может быть только строковым и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка. |
Представляет доступ к соответствию. |
Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение. Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен {http://v8.1c.ru/8.1/data/core}. |
|
Имя типа XDTO: Structure |
Имя типа XDTO: Map Может использоваться в реквизитах управляемой формы. |
Пример: |
|
Запись = Новый Структура; |
Запись = Новый Соответствие; |
Запись.Вставить("Ключ","Значение"); |
Кроме этого: Структура упорядочивает элементы при добавлении, а соответсвие нет.
Вернемся к теме:
Для «Структура» ключ должен быть введен по всем правилам объявления переменных, а «Соответствие» нет.
Можно просто заменить тип переменной и заменить метод «Свойство» на «Получить». Обычно этого достаточно.
Но бывают и неожиданные результаты при использовании «Соответствие».
Например, платформа даёт добавить значение с ключом = Неопределенно, а вот считать нельзя, так как по факту запись не была добавлена, но и ошибку не выдал.
Предлагаю код для проверки исключительных ситуаций. Код можно добавить на пустой форме, добавив 2 таблицы значений с именами табСтруктура и табСоответствие.
Перем мСтруктура;
Перем мСоответствие;
Процедура КнопкаВыполнитьНажатие(Кнопка)
Тест ="А500";
мСтруктура.Очистить();
тДата = ТекущаяДата();
Для А =1По500000Цикл
Стр ="А"+Формат(А,"ЧГ=");
ВставитьИПроверить(мСтруктура, Стр, Стр);
КонецЦикла;
Сообщить("Структура - "+(ТекущаяДата()- тДата));
ВставитьИПроверить(мСтруктура, Тест, Тест);
мСоответствие.Очистить();
тДата = ТекущаяДата();
Для А =1По500000Цикл
Стр ="А"+Формат(А,"ЧГ=");
ВставитьИПроверить(мСоответствие, Стр, Стр);
КонецЦикла;
Сообщить("Соответствие - "+(ТекущаяДата()- тДата));
ВставитьИПроверить(мСоответствие, Тест, Тест);
ВывестиНаФорму()
КонецПроцедуры
Процедура ВставитьИПроверить(Список, Ключ, Значение);
//получаем тип
мТип = ТипЗнч(Список);
//проверка возможно добавить или нет
Попытка
Список.Вставить(Ключ, Значение);
Исключение
Сообщить(""+ мТип +": Не возможно добавить ключ ["+ Значение +"].");
Возврат;
КонецПопытки;
//проверка чтения
Попытка
ЕслиНЕ((мТип = Тип("Соответствие")ИНЕ Список.Получить(Ключ)=Неопределено)
ИЛИ(мТип = Тип("Структура")ИНЕ Список.Свойство(Ключ)=Неопределено))Тогда
Сообщить(""+ мТип +": Выполнено неявное преобразование типов и/или данных ключа ["+ Значение +"].")
КонецЕсли;
Исключение
Сообщить(""+ мТип +": Невозможно получить значение по ключу ["+ Значение +"].
| Возможно было выполнено неявное преобразование типов и/или данных ключа.")
КонецПопытки;
КонецПроцедуры
Процедура ОсновныеДействияФормыПроверка(Кнопка)
мСсылка = Справочники.Валюты.ПустаяСсылка();
мСтруктура.Очистить();
// добавление новый элементов в Структуру
ВставитьИПроверить(мСтруктура,"Ключ1","Ключ1");
ВставитьИПроверить(мСтруктура,"1Ключ","1Ключ");
ВставитьИПроверить(мСтруктура, мСсылка,"Справочники.Валюты.ПустаяСсылка()");
ВставитьИПроверить(мСтруктура, табСтруктура,"ТаблицаЗначений");
ВставитьИПроверить(мСтруктура,Неопределено,"Неопределено");
ВставитьИПроверить(мСтруктура,null,"null");
мСоответствие.Очистить();
// добавление новый элементов в Соответствие
ВставитьИПроверить(мСоответствие,"Ключ1","Ключ1");
ВставитьИПроверить(мСоответствие,"1Ключ","1Ключ");
ВставитьИПроверить(мСоответствие, мСсылка,"Справочники.Валюты.ПустаяСсылка()");
ВставитьИПроверить(мСоответствие, табСоответствие,"ТаблицаЗначений");
ВставитьИПроверить(мСоответствие,Неопределено,"Неопределено");
ВставитьИПроверить(мСоответствие,null,"null");
ВывестиНаФорму()
КонецПроцедуры
Процедура ВывестиНаФорму()
табСтруктура.Очистить();
// выводим результат на форму
ДляКаждого Стр Из мСтруктура Цикл
нСтр = табСтруктура.Добавить();
нСтр.Ключ = Стр.Ключ;
нСтр.Значение = Стр.Значение;
КонецЦикла;
ЭлементыФормы.табСтруктура.СоздатьКолонки();
табСоответствие.Очистить();
ДляКаждого Стр Из мСоответствие Цикл
нСтр = табСоответствие.Добавить();
нСтр.Ключ = Стр.Ключ;
нСтр.Значение = Стр.Значение;
КонецЦикла;
ЭлементыФормы.табСоответствие.СоздатьКолонки();
КонецПроцедуры;
мСтруктура =Новый Структура;
мСоответствие =Новый Соответствие;
табСтруктура.Колонки.Добавить("Ключ");
табСтруктура.Колонки.Добавить("Значение");
табСоответствие.Колонки.Добавить("Ключ");
табСоответствие.Колонки.Добавить("Значение");
Лог выполнения:
Структура: Не возможно добавить ключ [1Ключ].
Структура: Не возможно добавить ключ [Справочники.Валюты.ПустаяСсылка()].
Структура: Не возможно добавить ключ [Неопределено].
Структура: Не возможно добавить ключ [null].
Соответствие: Выполнено неявное преобразование типов и/или данных ключа [Неопределено].
Прошу обратить внимание: Что ТаблицаЗначений при добавлении в Структуру было преобразовано к строке "ТаблицаЗначений".
Последний раз у меня возникла такая ситуация при обновлении 1С:Консолидация ПРОФ с 1.3.3.7 (1.3.4.1) на 2.0.1.4 (2.0.2.6)
Строилась "Структура" по коду справочника "Операнды показателей".
Исправляется 1 строкой в Общих модулях.УправлениеОтчетами строка 3622.
"СтруктураПолей=Новый Структура;" заменить на "СтруктураПолей=Новый Соответствие;"