Таблица сравнения построена по версии справки из Конфигуратора:
Структура |
Соответствие |
Элементы коллекции:КлючИЗначение |
|
Свойства: () |
Возможно обращение к значению элемента посредством оператора […]. В качестве аргумента передается значение ключа элемента. |
Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции. |
|
Методы: Вставить (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.
«СтруктураПолей=Новый Структура;» заменить на «СтруктураПолей=Новый Соответствие;»
Последний раз у меня возникла такая ситуация при обновлении 1С:Консолидация ПРОФ с 1.3.3.7 (1.3.4.1) на 2.0.1.4 (2.0.2.6)
Строилась «Структура» по коду справочника «Операнды показателей».
Исправляется 1 строкой в Общих модулях.УправлениеОтчетами строка 3622.
«СтруктураПолей=Новый Структура;» заменить на «СтруктураПолей=Новый Соответствие;»
Практически всегда использую структуру, как более универсальный объект.
(2) Поручик, как ни странно я тоже.
Но надо знать органичения и чем можно заменить!
(0) А почему не сравнить самолет с паровозом? Почему паровоз не летает? А почему самолет столько груза не перевозит?
Сравнивать, так хотя бы относительно алгоритмов в которых используются, а не что есть у структуры чего нет у соответствия и наоборот.
Кстати, попробуй передать соответствие на сервер (в виде параметра метода) — удивишься. По крайней мере вплоть до 8.2.15.310 такое не прокатывало.
Очень чешется влепить минус за такое сравнение.
(4) awk, спасибо за совет надо попробовать.
А если с клиента вызать функцию, которая выполняется на сервере — функция возвращает соответсвие.
Проблем не было.
Да, кстати еще есть «ФиксированноеСоответствие» и «ФиксированнаяСтруктура», я как то про них совсем забыл 🙂
Лучше бы про производительность получения/вставки значения рассказали…
Тоже считаю, что у каждого из этих типов есть свое предназначение. Например, часто использую Соответствие для локального кэширования данных, а также для целей создания массива, состоящего из уникальных элементов (при обработке данных сначала все скидываем в соответствие, а после обработки разворачиваем в массив).
(6) Magister, производительность чтения в виде результатов теста есть здесь:http://infostart.ru/public/105104/
(7) khaoos, позже статью дополню.
Еще не написал, что структура упорядочивает элементы, а соответсвие нет.
Кстати, еще полезно подчеркнуть бы, что только у соответствия ключ может быть произвольным типом.
А у структуры — только строковым.
При разработке как раз этот момент и нужно проанализировать, когда не знаешь что использовать — структуру или соответствие.
(2) Поручик, Структура МЕНЕЕ универсальный объект: Ключ -только строка, смотри(10) .
(1) Согласен c awk, это разные объекты с разным назначением.
Может просто надо было коды поменять, а не конфигурацию менять?
(12) kereo, менять коды не вариант.
Так как на этих кодах справочника построены формулы расчета.
Но и это не самое страшное, видать для повышения скорости работы почти в каждом справочники, есть реквизит типа ХранилищеЗначения, которое в себе хранит копию почти всех реквизитов объекта + какие-то промежуточные расчеты.
Потом эти формулы используются в макетах, где они тоже берутся не из справочников, а из ХранилищеЗначения.
Возможно, где то еще есть ХранилищеЗначения на ХранилищеЗначения на ХранилищеЗначения, но дальше углубляться не стал.
Так как их надо будет обновлять. А это не просто, всё-таки это 1С: Консолидация.
Мне кажется неправильным исследовать структуры данных языка «структура» и «соответствие» как черные ящики. У Шекли, по-моему, был рассказ, как инопланетные ученые исследуют попавшие к ним из
Эффективная обработка данных в оперативной памяти за счет использования коллекции «соответствие» .
от 1Скосмоса артефакты, приходя к самым разнообразным выводам, формируя научные школы и направления. В нашем случае назначение структур данных объяснить проще. Для этого нужно привлечь историю развития языков программирования и рекомендации разработчиков.«Структура» как структура данных появилась очень давно. В PL/1 уже точно была. Тем, кто программировал на PL/1, Pascal, C и тому подобных языках, объяснять назначение «структуры» точно не нужно. Она позволяет манипулировать набором разноименных свойств объектов как единым целым. «Структура» — это прародитель объекта в эпоху до появления ООП. Поэтому, кажется, мыслью разработчиков было просто реализовать в платформе этот механизм универсальных языков программирования. Соответствие — это массив с произвольным типом индекса (hash-map). То есть структура данных, предназначенная для хранения большого количества в принципе однородных данных с возможностью их быстрого извлечения с использованием хеш-таблиц.
Тем, кто заинтересовался темой, рекомендую прочитать также
(2) Поручик,
Структуру — можно пользовать как Структура.ИмяКлюча, Соответствие — в качестве ключа любой тип данных.
И то, и другое — можно пользовать как Структура[ИмяКлюча], Соответствие[ИмяКлюча].
Так что — может быть, кому-то это откроет глаза на Структуру и Соответствие, их сравнения и «универсальности» 🙂
(14) ildarovich,
И струткура, и Соответстиве работают примерно одинаковой скоростью.
какое отношение имеет Структура от 1С к чему либо еще, кроме 1С? И вообще — кто еще при «а мы пойдем своим путем» сравнивает типы данных в 1С с тем, что «появилось очень давно»? 🙂
(14)
Исчерпывающе вполне. Жаль плюсануть можно лишь раз.
(16) Не позорьтесь публично. Или вы наивно полагаете, что 1С изобрела типы Структура и Соответствие?
Добавим масла в огонь Ж-)
Например, в 1С: Консолидации коды справочников заполнялись автоматически при настройки связей с 1С: Бухгалтерия КОРП. Неужели они сами не проверяли, как работает программа?!
А может спецы в 1С менее грамотные?! Или многое делают на скорую руку?!
(18) bomba,
расскажите, раскажите, насколько глубоки корни Структуры в 1С, какие там «хэш-таблицы» применяются, как вообще 1С вовсю применяет мировой опыт в создании СТруктур и Соответствий..
(18) bomba,
не позорьтесь сами натягиванием 1С на «мировой опыт».
Выйдет боком со смещенным центром 🙂
(19) В 1С спецы такие же студенты-быдлокодеры, как и многие, которые здесь вываливают свои поделия. И многое делают на скорую руку, гляньте в типовые.
(22) Поручик,
у них сейчас длаже платформу студенты пишут
(23) frc, (22) Поручик,
Студенты тоже разные бывают.
Есть знакомые у которых 15 лет опыта 1С за плечами, но порой такое кодят, МРАК!!!
Благо дальше контор не уходит.
Скорее всего, делают на скорую руку.
Надо же работу франчайзи оставлять.
А то пользователь наивный думает, купил коробку и случилось счастье.
(24)
МРАК такое не кодит 🙂
(14) ildarovich,
История и развитие языков программирования, а также накопленный опыт построения БД, и все прочие опыты — и близко с 1С не стояли.
Рекомендаций разработчиков (каких? от 1С?), а также разъяснений, что они там понаделали — тоже практически нет.
Зачем написана статья? Не понятно.
Два внешне похожих объекта имеют коренные различия. Кто стукнется о различия тот поймёт их. Кто не стукнется тому они не важны. Из статьи различия трудно понять. ИМХО статья бесполезна.
(27) frc,
Если я правильно понимаю (если не прав поправьте меня):
При использовании в качестве ключа структуры все у чего есть представление будет преобразовано к типу строка со значением этого представления. Все у чего нет представления или строка не удовлетворяет правилам имен переменных, тогда выдаст ошибку!
Пример (можете поставить точку останова и внимательно проверить):
мас = Новый Массив; мас2 = Новый Массив;
Структура.Вставить(мас, «Массив»);
Если Структура.Свойство(мас) И Структура.Свойство(мас2) И Структура.Свойство(«ТаблицаЗначений») Тогда
Сообщить(«Найдено»);
Иначе Сообщить(«Не найдено»);
КонецЕсли;
2-ой пример:
вал = Справочники.Валюты.НайтиПоНаименованию(«Руб»);
Структура.Вставить(вал.ПолучитьОбъект(), «Объект»);
Если Структура.Свойство(вал) И Структура.Свойство(«Руб «) Тогда Сообщить(«Найдено»);
Иначе Сообщить(«Не найдено»);
КонецЕсли;
3-ий пример (добавил новую валюту с именем «1Руб»):
вал = Справочники.Валюты.НайтиПоНаименованию(«1Руб»);
Структура.Вставить(вал.ПолучитьОбъект(), «Объект»);
— выдаст сразу ошибку
(27) frc, так как порой заполнение значений, тем более структур в типовых конфигурациях запускается много разных вложенных процедур/функций в которых в свою очередь запускаются еще процедуры/функции и т.д. и т.п. Можно конечно ставить точки останова по ошибки, анализировать по одной. Мне нравиться больше обернуть попыткой и выводить сообщения понятные для меня. Со временем получилась процедура ВставитьИПроверить. Которую и выложил. А что бы было понятно, зачем она нужна, сделал несколько примеров.
А если у вас возникают вопросы, зачем вообще в структуру пихать данные отличные от типа строка, причем что бы удовлетворяла всем правилам. Надо спросить у тех кто пишет типовые конфигурации!!!
(27) frc, еще пару слов про соответсвие.
Соответствие хранит не значение ключа, а ссылку на него.
Пример:
вал = Справочники.Валюты.НайтиПоКоду(«643»).ПолучитьОбъект();
С = Новый Соответствие;
С.Вставить(вал, «643»);
вал.код = «642»;
вал.Записать();
Сообщить(«Код ключа » + вал.Код + «, код значения » + С.Получить(вал));
То же самое с ключом, где используется переменная, а не константа. То есть в массиве, если добавить элементы или удалить метод Получить будет возвращать значение, которое было присвоено переменной массива, а не его содержимого.
А писал статью так как понятно мне.
Не думал, что будет столько разногласий и непоняток.
В ближайшие время статью дополню сообщениями из комментариев.
Кому нужна эта статья ? Не совсем понял, почему автор взялся сравнивать структуру и соответствие, можно сравнить одномерный массив и список значений и т.д. Практически везде в типовых используется структура, особенно это видно при проведении или сохранении объекта. Порадовали сообщения, что 1с выдумала все сама, а не использовала опыт предыдущих языков программирования. Не удивлюсь, что скоро узнаю что язык запросов (в 8-й версии) это изобретение 1с.
(37) FedorovEvg,
В моей практике часто проблема связанна именно с этим. Как писал выше по разного рода причинам стандартные алгоритмы пытаются в структуру вставить данные, которые вызывают ошибку. А её можно практически безболезненно решить путем замены «структуры» на «соответствие».
Если у вас есть предложение как можно это сделать минимальной кровью, готов выслушать.
(30) artbear,
вы просто не читаете все.
дурацким стандартным «умолчательным» преобразованием 1С.
Еще раз.
Это «преобразование» делает не Структура или Соответствие, а делается везде, где можно, никого не спрашивая.
(29) artbear,
эта «ахинея» как раз тот самый случай, когда визуально данные одни и те же, а типы — разные. Число и строка.
Когда идиотское «умолчательное» преобразование то ли должно сработать (а влдруг?), то ли не сработает (как раз когда типы разные, а ожидают, что сработает «умолчание»).
В этом и суть — что мути много в 1С. Нет прозрачности работы.
Т.е. вы меня критикуете, и сами же себя опровергаете.
Тогда вам с собой надо поспорить вначале 🙂
(34)
вы опять сами себя путаете, да еще и пуатете старожилов вроде артбеар.
Вы присвоили в качетстве ключа ССЫЛКу на элемент справочника (объект в терминах 1С), потом поменяли у ОБЪЕКТА код, потом запросили ВСЕ У ТОГО ЖЕ объекта через соответствие «выдай мне код того объекта, который я вставил вместо ключа!»
Не изменились ни ссылка на объект (не изменился ключ), не изменилось ни значение по ключу.
Но вы начали придумывать про какие-то «не хранит значение, носсылку..»
Ну повесьте на СТРОКОВОЙ ключ «643» значение «642»).
А потом попробуйте ввести строковой ключ «642» (значение — Неопределено), и получить по ключу «642» — значение «642».
Получите разные ключи, и разные значения по ним. Хотя «визуально» — ничего особенного и не сделали, все «похоже и то же самое».
Вот это безобразие в определениях, работе инструкций и псевдомногофункциональность, отстуствие внятной справки и разъяснений по работе платформы от разраблотчиков и позволяет «кто в лес — кто по дрова» — каждый что хочет, то и «видит» в работе 1с-овых механизмов.
(37) FedorovEvg,
по «использовала опыт» — идите в ветку про Си и 1С, шарпы и прочие СУБДы.
Там и развернете свою мысль о том, как 1С использовала опыт по программированию, построению СУБД, и реализацию этого опыта в своих творениях.
А играться на одинаковости терминов «там структура — здесь структура, там объект — и здесь объект», не понимая, видимо, какой «объект «там» (в мировом опыте»), и какая Структура — «здесь» (в 1С) — так для этого 1с и придуманы все эти подмены понятий: путать не желающих думать.
(38)
«стандартные» механизмы не появляются сами по себе, и не пишут сами себя. Если в Структуру функция пытается вернуть не строковой код — так это ошибка программирования, а не поиски «а заменю-ка все на что-нибудь, делов-то, все ранво одно и то же!»
А потом по коду — вместо «Получить» будет «Свойство» — и что, менять по всему коду теперь? Сами же себе такие грабли (разработчики) понаделали с неявностью, вот и расхлебывают программисты.
(40) frc,
Хотел донести мысль о том, что в структуре есть ключ строковый и по его значению можно получить значение.
А в соответствии ссылка, данные на которые она ссылается, могут меняться как угодно.
Пример, который попадался в типовых решениях:
Производился поиск объектов по реквизитам, в соответствии ключ был равен ссылки. Реквизиты обрабатывались (меняли свои значения), после чего выполнялся повторный поиск по реквизитам и по ссылки пытались получить значение по ключу, которого не было в соответствии. Поэтому я привел пример упрощенный с валютой.
(42) frc, не зыбывают про нас 1с.
(37) Уважаемый, боюсь в данной ветке присутствуют исключительно люди для которых книги могут быть только красно-желтого цвета. Боюсь они дожигают на костре последние экземпляры книг «Гради Буч. Объектно-ориентированный анализ и проектирование», а то вдруг мир узнает что понятие объекта изобрело не 1С… и что будет когда 1С изобретет наследование и полиморфизм??? Какойнибдь очкастый выскочка выкрикнет — бойан и это уже было!? Нет уж… Сжечь все книги и стереть интернет )))
ОдинЭсФореваТугеза!!!
(44) bomba,
здравое рассуждение, если с позиций других языков, а не с позиций 1С смотреть на 1С.
жду сравнение массива и таблицы значений.
(46) Usc,
еще — NULL и Неопределено.
ну эта ваще для чайников статья. Ну или для типовописателей, они хуже чайников.
Я бы вставил в текст статьи ЗАМЕЧАНИЕ о сортировке в «Соответствии»
Например, добавляем в Соответствие: Элемент1, 8; Элемент2, 2; Элемент3, 15; Элемент4, 315
И при использовании «Для каждого …» получаем результат:
Элемент1, 8
Элемент3, 15
Элемент4, 315
Элемент2, 2
Например для меня это тайна…
(49) AnryMc,
У меня упорядочились так:
«Элемент1», 8
«Элемент4», 315
«Элемент3», 15
«Элемент2», 2
Если поставить точку останова и посмотреть что в внутри массива, они упорядочены таким же образом.
У меня при нескольких попытках результат выводился одинаково.
Платформа 8.2.16.368
(50)
Пример:
Показать
Результат выполнения:
Элемент1 :: 8
Элемент5 :: 6
Элемент4 :: 315
Элемент3 :: 15
Элемент2 :: 2
Т.е. обход производиться не по порядку ввода, и не в порядке ключей и значений!?!?!?
1 — 5 — 4 — 3 — 2
(Во вложении скриншот.)
(51) AnryMc,
Если смотреть на последние 2 результата впечатление что платформа новое значение всегда вставляет после первого.
Закономерности в принципе НЕТ
смотри рисунок:
Сортируются по порядку только примитивные типы, объектные типы сортируются по внутреннему идентификатору
Всегда волосы дыбом встают от ужаса «Не А = Б» — это же просто дико ненаглядно! Глаз гораздо проще ловит знаки «=» или «<>», поэтому такие бредовые сравнения через «Не» и знак (которыми нередко грешат писатели типовых конф) читаются через пень-колоду: «Ага, равно. Равно?!! Ах, твоюждивизию, НЕ равно!!»
Также моветон не ставить пробел после запятой — потому что автоматически читается как Объект.Свойство.
Ну и вдобавок тысяча безграмотностей — это почему-то обычное дело для современных российских граждан, не только для 1Сников
(55) эта статья была создана давно как эксперимент, что бы определить за что ставят «+».
https://infostart.ru/public/722861/ которые повышают производительность на порядки так не оцениваются.
Статьи вроде
Анекдоты собирают больше «+» чем серьезная статья.
Потому что основная масса пользователей сайта не программисты.