gifts2017

Структура против (VS) Соответствие

Опубликовал Матти Нюкянен (Nykyanen) в раздел Программирование - Практика программирования

Иногда встает вопрос, что лучше использовать, а чаще всего в стандартных конфигурациях 1С и их партнеров при обновлении может, происходит преобразование данных в другие объекты метаданных и почему то они строят структуру, где ключом является код объекта?! А там же может быть значение, которое начинается на цифру и сразу же выходит ошибка.

Таблица сравнения построена по версии справки из Конфигуратора:

Структура

Соответствие

Элементы коллекции:КлючИЗначение

Свойства: ()

Возможно обращение к значению элемента посредством оператора [...]. В качестве аргумента передается значение ключа элемента.

Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.

Методы:

Вставить (Insert)
Количество (Count)
Очистить (Clear)
Удалить (Delete)

Свойство (Property)

Получить (Get)

Конструкторы:

По ключам и значениям

По умолчанию

Описание:

Представляет собой коллекцию пар КлючИЗначение. При этом ключ может быть только строковым и должен удовлетворять требованиям, предъявляемым к именованию переменных встроенного языка.
К значениям структуры можно обращаться как к свойствам объекта. При этом ключ используется как имя свойства.
Структура используется обычно для хранения небольшого количества значений, каждое из которым имеет некоторое имя.

Представляет доступ к соответствию.

Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.

Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из 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.
"СтруктураПолей=Новый Структура;" заменить на "СтруктураПолей=Новый Соответствие;"

Скачать файлы

Наименование Файл Версия Размер
Обработка (демонстрация примера из публикации) 17
.epf 7,27Kb
06.07.12
17
.epf 7,27Kb Скачать
Публикация в формате Word 7
.docx 27,17Kb
06.07.12
7
.docx 27,17Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
1. Матти Нюкянен (Nykyanen) 05.07.12 17:25
Последний раз у меня возникла такая ситуация при обновлении 1С:Консолидация ПРОФ с 1.3.3.7 (1.3.4.1) на 2.0.1.4 (2.0.2.6)
Строилась "Структура" по коду справочника "Операнды показателей".
Исправляется 1 строкой в Общих модулях.УправлениеОтчетами строка 3622.
"СтруктураПолей=Новый Структура;" заменить на "СтруктураПолей=Новый Соответствие;"
2. Сергей Ожерельев (Поручик) 05.07.12 21:44
Практически всегда использую структуру, как более универсальный объект.
3. Матти Нюкянен (Nykyanen) 05.07.12 21:58
(2) Поручик, как ни странно я тоже.
Но надо знать органичения и чем можно заменить!
4. Василий Казьмин (awk) 05.07.12 22:54
(0) А почему не сравнить самолет с паровозом? Почему паровоз не летает? А почему самолет столько груза не перевозит?

Сравнивать, так хотя бы относительно алгоритмов в которых используются, а не что есть у структуры чего нет у соответствия и наоборот.

Кстати, попробуй передать соответствие на сервер (в виде параметра метода) - удивишься. По крайней мере вплоть до 8.2.15.310 такое не прокатывало.

Очень чешется влепить минус за такое сравнение.
Трактор; xzorkiix; kereo; khaoos; Magister; +5 Ответить 1
5. Матти Нюкянен (Nykyanen) 06.07.12 00:15
(4) awk, спасибо за совет надо попробовать.
А если с клиента вызать функцию, которая выполняется на сервере - функция возвращает соответсвие.
Проблем не было.
Да, кстати еще есть "ФиксированноеСоответствие" и "ФиксированнаяСтруктура", я как то про них совсем забыл :-)
6. Misha ⁠ (Magister) 06.07.12 02:30
Лучше бы про производительность получения/вставки значения рассказали...
nixel; the1; +2 Ответить 1
7. Василий Антонов (khaoos) 06.07.12 05:02
Тоже считаю, что у каждого из этих типов есть свое предназначение. Например, часто использую Соответствие для локального кэширования данных, а также для целей создания массива, состоящего из уникальных элементов (при обработке данных сначала все скидываем в соответствие, а после обработки разворачиваем в массив).
8. Василий Антонов (khaoos) 06.07.12 05:05
(6) Magister, производительность чтения в виде результатов теста есть здесь: http://infostart.ru/public/105104/
9. Матти Нюкянен (Nykyanen) 06.07.12 09:41
(7) khaoos, позже статью дополню.
Еще не написал, что структура упорядочивает элементы, а соответсвие нет.
10. Hany (Hany) 06.07.12 18:13
Кстати, еще полезно подчеркнуть бы, что только у соответствия ключ может быть произвольным типом.
А у структуры - только строковым.
При разработке как раз этот момент и нужно проанализировать, когда не знаешь что использовать - структуру или соответствие.
11. Владимир (vladismi) 10.07.12 12:25
(2) Поручик, Структура МЕНЕЕ универсальный объект: Ключ -только строка, смотри (10).
12. Игорь Юндин (kereo) 11.07.12 11:22
(1) Nykyanen, Согласен c awk, это разные объекты с разным назначением.

Строилась "Структура" по коду справочника "Операнды показателей".

Может просто надо было коды поменять, а не конфигурацию менять?
13. Матти Нюкянен (Nykyanen) 11.07.12 13:09
(12) kereo, менять коды не вариант.
Так как на этих кодах справочника построены формулы расчета.
Но и это не самое страшное, видать для повышения скорости работы почти в каждом справочники, есть реквизит типа ХранилищеЗначения, которое в себе хранит копию почти всех реквизитов объекта + какие-то промежуточные расчеты.
Потом эти формулы используются в макетах, где они тоже берутся не из справочников, а из ХранилищеЗначения.
Возможно, где то еще есть ХранилищеЗначения на ХранилищеЗначения на ХранилищеЗначения, но дальше углубляться не стал.
Так как их надо будет обновлять. А это не просто, всё-таки это 1С: Консолидация.
14. Сергей (ildarovich) 11.07.12 16:22
Мне кажется неправильным исследовать структуры данных языка "структура" и "соответствие" как черные ящики. У Шекли, по-моему, был рассказ, как инопланетные ученые исследуют попавшие к ним из от 1С космоса артефакты, приходя к самым разнообразным выводам, формируя научные школы и направления. В нашем случае назначение структур данных объяснить проще. Для этого нужно привлечь историю развития языков программирования и рекомендации разработчиков.
"Структура" как структура данных появилась очень давно. В PL/1 уже точно была. Тем, кто программировал на PL/1, Pascal, C и тому подобных языках, объяснять назначение "структуры" точно не нужно. Она позволяет манипулировать набором разноименных свойств объектов как единым целым. "Структура" - это прародитель объекта в эпоху до появления ООП. Поэтому, кажется, мыслью разработчиков было просто реализовать в платформе этот механизм универсальных языков программирования. Соответствие - это массив с произвольным типом индекса (hash-map). То есть структура данных, предназначенная для хранения большого количества в принципе однородных данных с возможностью их быстрого извлечения с использованием хеш-таблиц.
Тем, кто заинтересовался темой, рекомендую прочитать такжеЭффективная обработка данных в оперативной памяти за счет использования коллекции "соответствие".
slavia-tech; miavolas; swiss-garant; zqzq; CratosX; RaketaSoft; Serjeo; artbear; MaxDavid; hogik; bomba; +11 Ответить 3
15. Ak A (frc) 11.07.12 16:40
(2) Поручик,
Структуру - можно пользовать как Структура.ИмяКлюча, Соответствие - в качестве ключа любой тип данных.
И то, и другое - можно пользовать как Структура[ИмяКлюча], Соответствие[ИмяКлюча].
Так что - может быть, кому-то это откроет глаза на Структуру и Соответствие, их сравнения и "универсальности" :)
16. Ak A (frc) 11.07.12 16:43
(14) ildarovich,
Соответствие - это ... есть структура данных, предназначенная для хранения большого количества в принципе однородных данных с возможностью их быстрого извлечения с использованием хеш-таблиц.

И струткура, и Соответстиве работают примерно одинаковой скоростью.
"Структура" как структура данных появилась очень давно

какое отношение имеет Структура от 1С к чему либо еще, кроме 1С? И вообще - кто еще при "а мы пойдем своим путем" сравнивает типы данных в 1С с тем, что "появилось очень давно"? :)
17. Владимир Луньков (bomba) 11.07.12 16:46
(14)
Исчерпывающе вполне. Жаль плюсануть можно лишь раз.
18. Владимир Луньков (bomba) 11.07.12 16:47
(16) Не позорьтесь публично. Или вы наивно полагаете, что 1С изобрела типы Структура и Соответствие?
19. Матти Нюкянен (Nykyanen) 11.07.12 17:35
Добавим масла в огонь Ж-)

Например, в 1С: Консолидации коды справочников заполнялись автоматически при настройки связей с 1С: Бухгалтерия КОРП. Неужели они сами не проверяли, как работает программа?!

А может спецы в 1С менее грамотные?! Или многое делают на скорую руку?!
20. Ak A (frc) 11.07.12 17:42
(18) bomba,
Или вы наивно полагаете

расскажите, раскажите, насколько глубоки корни Структуры в 1С, какие там "хэш-таблицы" применяются, как вообще 1С вовсю применяет мировой опыт в создании СТруктур и Соответствий..
21. Ak A (frc) 11.07.12 17:43
(18) bomba,
не позорьтесь сами натягиванием 1С на "мировой опыт".
Выйдет боком со смещенным центром :)
22. Сергей Ожерельев (Поручик) 11.07.12 17:55
(19) В 1С спецы такие же студенты-быдлокодеры, как и многие, которые здесь вываливают свои поделия. И многое делают на скорую руку, гляньте в типовые.
23. Ak A (frc) 11.07.12 17:59
(22) Поручик,
у них сейчас длаже платформу студенты пишут
24. Матти Нюкянен (Nykyanen) 11.07.12 18:07
(23) frc, (22) Поручик,
Студенты тоже разные бывают.
Есть знакомые у которых 15 лет опыта 1С за плечами, но порой такое кодят, МРАК!!!
Благо дальше контор не уходит.

Скорее всего, делают на скорую руку.
Надо же работу франчайзи оставлять.
А то пользователь наивный думает, купил коробку и случилось счастье.
25. Ak A (frc) 11.07.12 18:19
(24) Nykyanen,
но порой такое кодят, МРАК!!!

МРАК такое не кодит :)
26. Ak A (frc) 12.07.12 09:39
(14) ildarovich,
Для этого нужно привлечь историю развития языков программирования и рекомендации разработчиков.

История и развитие языков программирования, а также накопленный опыт построения БД, и все прочие опыты - и близко с 1С не стояли.
Рекомендаций разработчиков (каких? от 1С?), а также разъяснений, что они там понаделали - тоже практически нет.
27. Ak A (frc) 12.07.12 16:41
(1) Nykyanen,
вы непонятно что проверяете своим кодом. Лучше уберите его совсем.
В очередной раз доказали, что в ключ структуры ничего, кроме "правильной" строки, внести нельзя?
Доказали, что Соответствие может принимать любые ключи и любые значения?
И кому, кроме Вас, взбредет в голову давать ключу (ключу!) значение Неопределено (и Соответствие правильно ничего показывает - это же значение Непопределено) или Null?
Самое главное - что для получения значения Соответствия у запрашиваемого ключа должен быть обязательно тот же самый тип данных, что и при создании ключа - у автора ни слова (видимо, не знает).
Прошу обратить внимание: Что ТаблицаЗначений при добавлении в Структуру было преобразовано к строке "ТаблицаЗначений".

И никаких преобразований ни Структура, ни Соответствие не делают - разве что преобразуются в строковой ключ (Структура) таким образом:
				Список.Вставить(Ключ + 1, "Справочники.Валюты.ПустаяСсылка()");
				Список.Вставить(Ключ + "2", "Неопределено");
				Список.Вставить(Ключ + "3", "null");

где Ключ - строка, либо для Соответствия - по правилу преобразования 1С последовательности значений: все следующие значения - принимают тип данных (если это возможно) первого из слагаемых, иначе - ошибка.
ТаблицаЗначений как была ТЗ, так ей и остается. Разве что Вы сами себя там запутали, и превратили на каком-то этапе в строку (даже ковырять не хочется столь бестолковый код).
Так что лучше разберитесь по-настоящему, что и как, а пока статья - ни о чем, и никак никому не поможет, а только запутает.
Единственно верное замечание -
Структура упорядочивает элементы при добавлении, а соответствие нет.

и то, упорядочивает не "значения", а строковые ключи, и, естественно, Соответствие не сможет никогда упорядочить ссылку на объект и число с Неопределено - т.е. все, что взбредет туда засунуть в Ключ.
Так что и по этому вопросу - у автора нет понятия.
28. Трактор Трактор (Трактор) 12.07.12 17:39
Зачем написана статья? Не понятно.
Два внешне похожих объекта имеют коренные различия. Кто стукнется о различия тот поймёт их. Кто не стукнется тому они не важны. Из статьи различия трудно понять. ИМХО статья бесполезна.
odin-7610; dour-dead; frc; +3 Ответить
29. Модератор раздела Артур Аюханов (artbear) 12.07.12 19:35
(27)
Самое главное - что для получения значения Соответствия у запрашиваемого ключа должен быть обязательно тот же самый тип данных, что и при создании ключа - у автора ни слова (видимо, не знает).

что за ахинея ? :(
если у двух значений разные типы, это разные данные изначально.
и если мы у Соответствия мы запрашиваем эти разные данные как ключи, то и результирующие значения из Соответствия придут разные, если вообще есть такие ключи в Соответствии.
30. Модератор раздела Артур Аюханов (artbear) 12.07.12 19:40
(27) Читаем далее и ужасаемся :(
И никаких преобразований ни Структура, ни Соответствие не делают - разве что преобразуются в строковой ключ (Структура) таким образом:
Код
Список.Вставить(Ключ + 1, "Справочники.Валюты.ПустаяСсылка()");
Список.Вставить(Ключ + "2", "Неопределено");
Список.Вставить(Ключ + "3", "null");

где Ключ - строка, либо для Соответствия - по правилу преобразования 1С последовательности значений: все следующие значения - принимают тип данных (если это возможно) первого из слагаемых, иначе - ошибка.
ТаблицаЗначений как была ТЗ, так ей и остается. Разве что Вы сами себя там запутали, и превратили на каком-то этапе в строку (даже ковырять не хочется столь бестолковый код).

Запусти код и наслаждайся
таб = Новый ТаблицаЗначений;
таб.Добавить();
Структура = Новый Структура;
Структура.Вставить(таб, 1); // явно ничего не преобразую, как видно
для каждого КлючЗначение из Структура Цикл
	Сообщить(ТипЗнч(КлючЗначение.Ключ)); // получаем Строка, а не то, что написано по цитате выше :( , что и требовалось доказать
	Сообщить(ТипЗнч(КлючЗначение.Значение)); // получаем число
КонецЦикла;
Сообщить(Структура["ТаблицаЗначений"]); // получаем 1, что и требовалось доказать
...Показать Скрыть

Ну и хочу подытожить цитатой оттуда же
Так что лучше разберитесь по-настоящему, что и как, а пока коммент (статья) - ни о чем, и никак никому не поможет, а только запутает.

:(
31. Модератор раздела Артур Аюханов (artbear) 12.07.12 19:45
(27) Единственное, с чем могу согласиться, это с
(1) Nykyanen, вы непонятно что проверяете своим кодом. Лучше уберите его совсем.

код в статье вообще никакой :(
(0) Автор, убери свой код из статьи.
добавь упомянутые в комментах плюсы и минусы, плюс по скорости из ссылки в комментах также отпишись
тогда будет нормально.
32. Матти Нюкянен (Nykyanen) 12.07.12 22:28
(27) frc,

Если я правильно понимаю (если не прав поправьте меня):
При использовании в качестве ключа структуры все у чего есть представление будет преобразовано к типу строка со значением этого представления. Все у чего нет представления или строка не удовлетворяет правилам имен переменных, тогда выдаст ошибку!
Пример (можете поставить точку останова и внимательно проверить):
мас = Новый Массив; мас2 = Новый Массив;
Структура.Вставить(мас, "Массив");
Если Структура.Свойство(мас) И Структура.Свойство(мас2) И Структура.Свойство("ТаблицаЗначений") Тогда
Сообщить("Найдено");
Иначе Сообщить("Не найдено");
КонецЕсли;
2-ой пример:
вал = Справочники.Валюты.НайтиПоНаименованию("Руб");
Структура.Вставить(вал.ПолучитьОбъект(), "Объект");
Если Структура.Свойство(вал) И Структура.Свойство("Руб ") Тогда Сообщить("Найдено");
Иначе Сообщить("Не найдено");
КонецЕсли;
3-ий пример (добавил новую валюту с именем «1Руб»):
вал = Справочники.Валюты.НайтиПоНаименованию("1Руб");
Структура.Вставить(вал.ПолучитьОбъект(), "Объект");
--- выдаст сразу ошибку
33. Матти Нюкянен (Nykyanen) 12.07.12 22:40
(27) frc, так как порой заполнение значений, тем более структур в типовых конфигурациях запускается много разных вложенных процедур/функций в которых в свою очередь запускаются еще процедуры/функции и т.д. и т.п. Можно конечно ставить точки останова по ошибки, анализировать по одной. Мне нравиться больше обернуть попыткой и выводить сообщения понятные для меня. Со временем получилась процедура ВставитьИПроверить. Которую и выложил. А что бы было понятно, зачем она нужна, сделал несколько примеров.

А если у вас возникают вопросы, зачем вообще в структуру пихать данные отличные от типа строка, причем что бы удовлетворяла всем правилам. Надо спросить у тех кто пишет типовые конфигурации!!!
34. Матти Нюкянен (Nykyanen) 12.07.12 22:52
(27) frc, еще пару слов про соответсвие.
Соответствие хранит не значение ключа, а ссылку на него.
Пример:
вал = Справочники.Валюты.НайтиПоКоду("643").ПолучитьОбъект();
С = Новый Соответствие;
С.Вставить(вал, "643");
вал.код = "642";
вал.Записать();
Сообщить("Код ключа " + вал.Код + ", код значения " + С.Получить(вал));
То же самое с ключом, где используется переменная, а не константа. То есть в массиве, если добавить элементы или удалить метод Получить будет возвращать значение, которое было присвоено переменной массива, а не его содержимого.
35. Матти Нюкянен (Nykyanen) 12.07.12 22:56
А писал статью так как понятно мне.
Не думал, что будет столько разногласий и непоняток.

В ближайшие время статью дополню сообщениями из комментариев.
36. Модератор раздела Артур Аюханов (artbear) 14.07.12 08:05
(34)
Соответствие хранит не значение ключа, а ссылку на него.

Это 1С, тут везде такое поведение!
37. Евгений Федоров (FedorovEvg) 14.07.12 17:03
Кому нужна эта статья ? Не совсем понял, почему автор взялся сравнивать структуру и соответствие, можно сравнить одномерный массив и список значений и т.д. Практически везде в типовых используется структура, особенно это видно при проведении или сохранении объекта. Порадовали сообщения, что 1с выдумала все сама, а не использовала опыт предыдущих языков программирования. Не удивлюсь, что скоро узнаю что язык запросов (в 8-й версии) это изобретение 1с.
38. Матти Нюкянен (Nykyanen) 16.07.12 08:59
(37) FedorovEvg,
Практически везде в типовых используется структура, особенно это видно при проведении или сохранении объекта.

В моей практике часто проблема связанна именно с этим. Как писал выше по разного рода причинам стандартные алгоритмы пытаются в структуру вставить данные, которые вызывают ошибку. А её можно практически безболезненно решить путем замены «структуры» на «соответствие».
Если у вас есть предложение как можно это сделать минимальной кровью, готов выслушать.
39. Ak A (frc) 16.07.12 11:39
(30) artbear,
вы просто не читаете все.
И никаких преобразований ни Структура, ни Соответствие не делают - разве что преобразуются в строковой ключ (Структура) таким образом:...

дурацким стандартным "умолчательным" преобразованием 1С.
Еще раз.
Это "преобразование" делает не Структура или Соответствие, а делается везде, где можно, никого не спрашивая.
(29) artbear,
что за ахинея ? :(

эта "ахинея" как раз тот самый случай, когда визуально данные одни и те же, а типы - разные. Число и строка.
Когда идиотское "умолчательное" преобразование то ли должно сработать (а влдруг?), то ли не сработает (как раз когда типы разные, а ожидают, что сработает "умолчание").
В этом и суть - что мути много в 1С. Нет прозрачности работы.
Т.е. вы меня критикуете, и сами же себя опровергаете.
Тогда вам с собой надо поспорить вначале :)
40. Ak A (frc) 16.07.12 12:09
(34) Nykyanen,
Соответствие хранит не значение ключа, а ссылку на него.

вы опять сами себя путаете, да еще и пуатете старожилов вроде артбеар.
Вы присвоили в качетстве ключа ССЫЛКу на элемент справочника (объект в терминах 1С), потом поменяли у ОБЪЕКТА код, потом запросили ВСЕ У ТОГО ЖЕ объекта через соответствие "выдай мне код того объекта, который я вставил вместо ключа!"
Не изменились ни ссылка на объект (не изменился ключ), не изменилось ни значение по ключу.
Но вы начали придумывать про какие-то "не хранит значение, носсылку.."
Ну повесьте на СТРОКОВОЙ ключ "643" значение "642").
А потом попробуйте ввести строковой ключ "642" (значение - Неопределено), и получить по ключу "642" - значение "642".
Получите разные ключи, и разные значения по ним. Хотя "визуально" - ничего особенного и не сделали, все "похоже и то же самое".
Вот это безобразие в определениях, работе инструкций и псевдомногофункциональность, отстуствие внятной справки и разъяснений по работе платформы от разраблотчиков и позволяет "кто в лес - кто по дрова" - каждый что хочет, то и "видит" в работе 1с-овых механизмов.
41. Ak A (frc) 16.07.12 12:17
(37) FedorovEvg,
что 1с выдумала все сама, а не использовала опыт предыдущих языков программирования.

по "использовала опыт" - идите в ветку про Си и 1С, шарпы и прочие СУБДы.
Там и развернете свою мысль о том, как 1С использовала опыт по программированию, построению СУБД, и реализацию этого опыта в своих творениях.
А играться на одинаковости терминов "там структура - здесь структура, там объект - и здесь объект", не понимая, видимо, какой "объект "там" (в мировом опыте"), и какая Структура - "здесь" (в 1С) - так для этого 1с и придуманы все эти подмены понятий: путать не желающих думать.
42. Ak A (frc) 16.07.12 12:22
(38) Nykyanen,
стандартные алгоритмы пытаются в структуру вставить данные, которые вызывают ошибку.

"стандартные" механизмы не появляются сами по себе, и не пишут сами себя. Если в Структуру функция пытается вернуть не строковой код - так это ошибка программирования, а не поиски "а заменю-ка все на что-нибудь, делов-то, все ранво одно и то же!"
А потом по коду - вместо "Получить" будет "Свойство" - и что, менять по всему коду теперь? Сами же себе такие грабли (разработчики) понаделали с неявностью, вот и расхлебывают программисты.
43. Матти Нюкянен (Nykyanen) 16.07.12 13:04
(40) frc,
Соответствие хранит не значение ключа, а ссылку на него.

Хотел донести мысль о том, что в структуре есть ключ строковый и по его значению можно получить значение.
А в соответствии ссылка, данные на которые она ссылается, могут меняться как угодно.
Пример, который попадался в типовых решениях:
Производился поиск объектов по реквизитам, в соответствии ключ был равен ссылки. Реквизиты обрабатывались (меняли свои значения), после чего выполнялся повторный поиск по реквизитам и по ссылки пытались получить значение по ключу, которого не было в соответствии. Поэтому я привел пример упрощенный с валютой.
(42) frc, не зыбывают про нас 1с.
44. Владимир Луньков (bomba) 16.07.12 14:05
(37) Уважаемый, боюсь в данной ветке присутствуют исключительно люди для которых книги могут быть только красно-желтого цвета. Боюсь они дожигают на костре последние экземпляры книг "Гради Буч. Объектно-ориентированный анализ и проектирование", а то вдруг мир узнает что понятие объекта изобрело не 1С... и что будет когда 1С изобретет наследование и полиморфизм??? Какойнибдь очкастый выскочка выкрикнет - бойан и это уже было!? Нет уж... Сжечь все книги и стереть интернет )))
ОдинЭсФореваТугеза!!!
45. Ak A (frc) 16.07.12 14:19
(44) bomba,
здравое рассуждение, если с позиций других языков, а не с позиций 1С смотреть на 1С.
46. Usc (Uscolegy) 24.07.12 09:40
жду сравнение массива и таблицы значений.
47. Ak A (frc) 24.07.12 10:02
(46) Usc,
еще - NULL и Неопределено.
Uscolegy; +1 Ответить
48. Осипов Сергей (fixin) 24.07.12 18:20
ну эта ваще для чайников статья. Ну или для типовописателей, они хуже чайников.
49. anry mc (AnryMc) 27.11.12 19:18
Я бы вставил в текст статьи ЗАМЕЧАНИЕ о сортировке в "Соответствии"

Например, добавляем в Соответствие: Элемент1, 8; Элемент2, 2; Элемент3, 15; Элемент4, 315
И при использовании "Для каждого ..." получаем результат:

Элемент1, 8
Элемент3, 15
Элемент4, 315
Элемент2, 2

Например для меня это тайна...
50. Матти Нюкянен (Nykyanen) 28.11.12 11:25
(49) AnryMc,
У меня упорядочились так:
"Элемент1", 8
"Элемент4", 315
"Элемент3", 15
"Элемент2", 2

Если поставить точку останова и посмотреть что в внутри массива, они упорядочены таким же образом.
У меня при нескольких попытках результат выводился одинаково.
Платформа 8.2.16.368
51. anry mc (AnryMc) 28.11.12 11:51
(50) Nykyanen,

Пример:
Функция ИгрыССоответствием() Экспорт
	
	ТестовоеСоответствие=Новый Соответствие;
	
	ТестовоеСоответствие.Вставить("Элемент1", 8);
	ТестовоеСоответствие.Вставить("Элемент2", 2);
	ТестовоеСоответствие.Вставить("Элемент3", 15);
	ТестовоеСоответствие.Вставить("Элемент4", 315);
	ТестовоеСоответствие.Вставить("Элемент5", 6);
	
	Для КАЖДОГО текЭл ИЗ ТестовоеСоответствие Цикл
		
		Сообщить(текЭл.Ключ+" :: "+текЭл.Значение);
		
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции
...Показать Скрыть


Результат выполнения:

Элемент1 :: 8
Элемент5 :: 6
Элемент4 :: 315
Элемент3 :: 15
Элемент2 :: 2


Т.е. обход производиться не по порядку ввода, и не в порядке ключей и значений!?!?!?
1 - 5 - 4 - 3 - 2

(Во вложении скриншот.)
Прикрепленные файлы:
52. Матти Нюкянен (Nykyanen) 28.11.12 12:33
(51) AnryMc,
Если смотреть на последние 2 результата впечатление что платформа новое значение всегда вставляет после первого.
53. anry mc (AnryMc) 28.11.12 12:53
Закономерности в принципе НЕТ
смотри рисунок:
Прикрепленные файлы:
54. Ильяс Низамутдинов (signum2009) 15.11.13 11:42
Сортируются по порядку только примитивные типы, объектные типы сортируются по внутреннему идентификатору