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

06.07.12

Разработка - Механизмы платформы 1С

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Обработка (демонстрация примера из публикации)
.epf 7,27Kb
19
19 Скачать (1 SM) Купить за 1 850 руб.
Публикация в формате Word
.docx 27,17Kb
8
8 Скачать (1 SM) Купить за 1 850 руб.

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

Структура

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

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

Свойства: ()

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

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

Методы:

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

См. также

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

23.06.2024    7435    bayselonarrend    20    

154

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Пример использования «Сервисов интеграции» без подключения к Шине и без обменов.

13.03.2024    5942    dsdred    16    

80

Механизмы платформы 1С Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    17660    YA_418728146    26    

71

Перенос данных 1C Механизмы платформы 1С Системный администратор Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    11220    dsdred    44    

130

Механизмы платформы 1С Программист Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    23755    SeiOkami    48    

135

Механизмы платформы 1С Системный администратор Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    18828    human_new    27    

80

WEB-интеграция Универсальные функции Механизмы платформы 1С Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    14729    YA_418728146    7    

166
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Iaskeliainen 385 05.07.12 17:25 Сейчас в теме
Последний раз у меня возникла такая ситуация при обновлении 1С:Консолидация ПРОФ с 1.3.3.7 (1.3.4.1) на 2.0.1.4 (2.0.2.6)
Строилась "Структура" по коду справочника "Операнды показателей".
Исправляется 1 строкой в Общих модулях.УправлениеОтчетами строка 3622.
"СтруктураПолей=Новый Структура;" заменить на "СтруктураПолей=Новый Соответствие;"
12. kereo 57 11.07.12 11:22 Сейчас в теме
(1) Согласен c awk, это разные объекты с разным назначением.

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

Может просто надо было коды поменять, а не конфигурацию менять?
13. Iaskeliainen 385 11.07.12 13:09 Сейчас в теме
(12) kereo, менять коды не вариант.
Так как на этих кодах справочника построены формулы расчета.
Но и это не самое страшное, видать для повышения скорости работы почти в каждом справочники, есть реквизит типа ХранилищеЗначения, которое в себе хранит копию почти всех реквизитов объекта + какие-то промежуточные расчеты.
Потом эти формулы используются в макетах, где они тоже берутся не из справочников, а из ХранилищеЗначения.
Возможно, где то еще есть ХранилищеЗначения на ХранилищеЗначения на ХранилищеЗначения, но дальше углубляться не стал.
Так как их надо будет обновлять. А это не просто, всё-таки это 1С: Консолидация.
27. frc 12.07.12 16:41 Сейчас в теме
(1)
вы непонятно что проверяете своим кодом. Лучше уберите его совсем.
В очередной раз доказали, что в ключ структуры ничего, кроме "правильной" строки, внести нельзя?
Доказали, что Соответствие может принимать любые ключи и любые значения?
И кому, кроме Вас, взбредет в голову давать ключу (ключу!) значение Неопределено (и Соответствие правильно ничего показывает - это же значение Непопределено) или Null?
Самое главное - что для получения значения Соответствия у запрашиваемого ключа должен быть обязательно тот же самый тип данных, что и при создании ключа - у автора ни слова (видимо, не знает).
Прошу обратить внимание: Что ТаблицаЗначений при добавлении в Структуру было преобразовано к строке "ТаблицаЗначений".

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

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

и то, упорядочивает не "значения", а строковые ключи, и, естественно, Соответствие не сможет никогда упорядочить ссылку на объект и число с Неопределено - т.е. все, что взбредет туда засунуть в Ключ.
Так что и по этому вопросу - у автора нет понятия.
user622095_admin; pvsm; +2 2 Ответить
29. Модератор раздела 12.07.12 19:35 Сейчас в теме
(27)
Самое главное - что для получения значения Соответствия у запрашиваемого ключа должен быть обязательно тот же самый тип данных, что и при создании ключа - у автора ни слова (видимо, не знает).

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

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

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

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

:(
39. frc 16.07.12 11:39 Сейчас в теме
(30) artbear,
вы просто не читаете все.
И никаких преобразований ни Структура, ни Соответствие не делают - разве что преобразуются в строковой ключ (Структура) таким образом:...

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

эта "ахинея" как раз тот самый случай, когда визуально данные одни и те же, а типы - разные. Число и строка.
Когда идиотское "умолчательное" преобразование то ли должно сработать (а влдруг?), то ли не сработает (как раз когда типы разные, а ожидают, что сработает "умолчание").
В этом и суть - что мути много в 1С. Нет прозрачности работы.
Т.е. вы меня критикуете, и сами же себя опровергаете.
Тогда вам с собой надо поспорить вначале :)
31. Модератор раздела 12.07.12 19:45 Сейчас в теме
(27) Единственное, с чем могу согласиться, это с
(1) вы непонятно что проверяете своим кодом. Лучше уберите его совсем.

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

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

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

Это 1С, тут везде такое поведение!
40. frc 16.07.12 12:09 Сейчас в теме
(34)
Соответствие хранит не значение ключа, а ссылку на него.

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

Хотел донести мысль о том, что в структуре есть ключ строковый и по его значению можно получить значение.
А в соответствии ссылка, данные на которые она ссылается, могут меняться как угодно.
Пример, который попадался в типовых решениях:
Производился поиск объектов по реквизитам, в соответствии ключ был равен ссылки. Реквизиты обрабатывались (меняли свои значения), после чего выполнялся повторный поиск по реквизитам и по ссылки пытались получить значение по ключу, которого не было в соответствии. Поэтому я привел пример упрощенный с валютой.
(42) frc, не зыбывают про нас 1с.
2. Поручик 4692 05.07.12 21:44 Сейчас в теме
Практически всегда использую структуру, как более универсальный объект.
Риник; sandr13; +2 Ответить
3. Iaskeliainen 385 05.07.12 21:58 Сейчас в теме
(2) Поручик, как ни странно я тоже.
Но надо знать органичения и чем можно заменить!
11. vladismi 168 10.07.12 12:25 Сейчас в теме
(2) Поручик, Структура МЕНЕЕ универсальный объект: Ключ -только строка, смотри (10).
MrFlanker; sandr13; Basil_Kudinov; +3 Ответить
15. frc 11.07.12 16:40 Сейчас в теме
(2) Поручик,
Структуру - можно пользовать как Структура.ИмяКлюча, Соответствие - в качестве ключа любой тип данных.
И то, и другое - можно пользовать как Структура[ИмяКлюча], Соответствие[ИмяКлюча].
Так что - может быть, кому-то это откроет глаза на Структуру и Соответствие, их сравнения и "универсальности" :)
60. DELOVOYDOM 15.12.23 23:51 Сейчас в теме
(2) И правильно делаете. 1С развивается путем совместимости со старыми разработками под крупных клиентов в том числе. И где то треть структур языка 1с вообще вредно использовать, они устарели, опасны с точки зрения багов, но зачем то их тянут многие разработчики в новый код.
Прекратите тянуть старье. Есть структура и ее везде можно использовать с помощью разных приемов. И статью можно было не писать. Все это выглядит так - а давайте сравним SSD диски с CD дисками))) ведь CD до сих пор какие то госорганы используют при выдаче сдачи техпланов и тд) Это делается для совместимости. И статья не стоит свеч вообще никаких.
Старый шлак нужен только для обслуживания старых конф, и все.
В 1С много такого, что не стоит мучить и забыть лучше как о страшном сне, но оно есть! и даже работает)
62. AlexO 135 28.01.24 09:57 Сейчас в теме
(60) Зачем вы напридумывали за 1С чего-то? Выдаете свои мысли - как тренд развития 1С. Что 1С куда-то там, а треть 1С (а что ж у не половина сразу?!) вообще устарела.
Соответствие в первую очередь используется для привязки конкретного объекта (почему и используется Ссылка как Ключ) - к каким-то связанным с ним данным (параметрам этого объекта, набора других ссылок, привязанных к этому объекту, и т.д.).
Да, это можно сделать и через Структуру - через усложнение структуры в два раза: сначала найти Ссылку в значении структуры (не будете же вы Ссылку превращать в строку и делать из неё Ключ структуры - или будете?!), а потом - уже нужные связанные данные во вложенной структуре.

(60)
В 1С много такого, что не стоит мучить и забыть лучше как о страшном сне

что вы предлагаете забыть в 1С и не использовать, при том, что полных альтернатив каких-либо своих собственных внутренних механизмов - там нет и не было никогда?
65. b0wer 14.08.24 22:16 Сейчас в теме
(62) Раз уж объясняете, то давайте не вводить людей в заблуждение с понятием ссылки в ключе.
Ссылка в 1С - это по сути идентификатор, который можно преобразовать в строку, по которой ищем запись в БД.
В более низкоуровневых языках есть такое понятие, как "Указатель", который указывает на адрес в оперативной памяти, где лежит значение.
Типы данных бывают примитивные (число, строка, булево, дата) и сложные (таблица значений, массив, объект справочника...).

При установке ключа в соответствие происходит по сути так, что для примитивов в ключ подставляется значение, а для сложный встает указатель на ячейки оперативной памяти.

В следствии чего такая картина:

// Примитивное значение
КакоеТоЧисло = 6;
Соответствие = Новый Соответствие;
Соответствие.Вставить(КакоеТоЧисло, "рандомный текст");

КакоеТоЧисло = 5;

Для Каждого Элемент из Соответствие Цикл
ЗначениеОдинаково = Элемент.Ключ = КакоеТоЧисло; // Ложь
КонецЦикла;


// Сложное
МойМассив = Новый Массив;
МойМассив.Добавить(6);

Соответствие = Новый Соответствие;
Соответствие.Вставить(МойМассив, "рандомный текст");

МойМассив.Добавить(6);

Для Каждого Элемент из СоответствиеЦикл
ЗначениеОдинаково = Элемент.Ключ = МойМассив; // Истина
КонецЦикла;
4. awk 744 05.07.12 22:54 Сейчас в теме
(0) А почему не сравнить самолет с паровозом? Почему паровоз не летает? А почему самолет столько груза не перевозит?

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

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

Очень чешется влепить минус за такое сравнение.
LordKim; Трактор; xzorkiix; kereo; khaoos; Magister; +6 Ответить
5. Iaskeliainen 385 06.07.12 00:15 Сейчас в теме
(4) awk, спасибо за совет надо попробовать.
А если с клиента вызать функцию, которая выполняется на сервере - функция возвращает соответсвие.
Проблем не было.
Да, кстати еще есть "ФиксированноеСоответствие" и "ФиксированнаяСтруктура", я как то про них совсем забыл :-)
61. AlexO 135 28.01.24 09:47 Сейчас в теме
(5)
Да, кстати еще есть "ФиксированноеСоответствие" и "ФиксированнаяСтруктура", я как то про них совсем забыл

Все тоже самое, только фиксированные по элементам Соответствие и Структура. И нельзя добавлять новые элементы к ним.
6. Magister 134 06.07.12 02:30 Сейчас в теме
Лучше бы про производительность получения/вставки значения рассказали...
imischenko; nixel; ixijixi; +3 Ответить
8. khaoos 239 06.07.12 05:05 Сейчас в теме
(6) Magister, производительность чтения в виде результатов теста есть здесь: http://infostart.ru/public/105104/
7. khaoos 239 06.07.12 05:02 Сейчас в теме
Тоже считаю, что у каждого из этих типов есть свое предназначение. Например, часто использую Соответствие для локального кэширования данных, а также для целей создания массива, состоящего из уникальных элементов (при обработке данных сначала все скидываем в соответствие, а после обработки разворачиваем в массив).
9. Iaskeliainen 385 06.07.12 09:41 Сейчас в теме
(7) khaoos, позже статью дополню.
Еще не написал, что структура упорядочивает элементы, а соответсвие нет.
57. hobi 616 19.02.20 10:51 Сейчас в теме
(9) Не совсем упорядочивает. Корректнее можно сформулировать так:
Обход в цикле "Для каждого ..." для структуры будет в том же порядке, в котором добавляли элементы.
Для соответствия порядок элементов при обходе не соответствует порядку добавления в коллекцию.
Lapitskiy; +1 Ответить
10. Hany 06.07.12 18:13 Сейчас в теме
Кстати, еще полезно подчеркнуть бы, что только у соответствия ключ может быть произвольным типом.
А у структуры - только строковым.
При разработке как раз этот момент и нужно проанализировать, когда не знаешь что использовать - структуру или соответствие.
Lapitskiy; manu; Stamper; +3 Ответить
14. ildarovich 7930 11.07.12 16:22 Сейчас в теме
Мне кажется неправильным исследовать структуры данных языка "структура" и "соответствие" как черные ящики. У Шекли, по-моему, был рассказ, как инопланетные ученые исследуют попавшие к ним из от 1С космоса артефакты, приходя к самым разнообразным выводам, формируя научные школы и направления. В нашем случае назначение структур данных объяснить проще. Для этого нужно привлечь историю развития языков программирования и рекомендации разработчиков.
"Структура" как структура данных появилась очень давно. В PL/1 уже точно была. Тем, кто программировал на PL/1, Pascal, C и тому подобных языках, объяснять назначение "структуры" точно не нужно. Она позволяет манипулировать набором разноименных свойств объектов как единым целым. "Структура" - это прародитель объекта в эпоху до появления ООП. Поэтому, кажется, мыслью разработчиков было просто реализовать в платформе этот механизм универсальных языков программирования. Соответствие - это массив с произвольным типом индекса (hash-map). То есть структура данных, предназначенная для хранения большого количества в принципе однородных данных с возможностью их быстрого извлечения с использованием хеш-таблиц.
Тем, кто заинтересовался темой, рекомендую прочитать такжеЭффективная обработка данных в оперативной памяти за счет использования коллекции "соответствие".
AndrewKop; cosmo2004; It-developer; abasovit; sur0g; user753815; KazanKokos; LordKim; slavia-tech; miavolas; swiss-garant; zqzq; CratosX; RuslanZ; Serjeo; artbear; MaxDavid; hogik; bomba; +19 Ответить
16. frc 11.07.12 16:43 Сейчас в теме
(14) ildarovich,
Соответствие - это ... есть структура данных, предназначенная для хранения большого количества в принципе однородных данных с возможностью их быстрого извлечения с использованием хеш-таблиц.

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

какое отношение имеет Структура от 1С к чему либо еще, кроме 1С? И вообще - кто еще при "а мы пойдем своим путем" сравнивает типы данных в 1С с тем, что "появилось очень давно"? :)
18. пользователь 11.07.12 16:47
(16) Не позорьтесь публично. Или вы наивно полагаете, что 1С изобрела типы Структура и Соответствие?
20. frc 11.07.12 17:42 Сейчас в теме
(18) bomba,
Или вы наивно полагаете

расскажите, раскажите, насколько глубоки корни Структуры в 1С, какие там "хэш-таблицы" применяются, как вообще 1С вовсю применяет мировой опыт в создании СТруктур и Соответствий..
21. frc 11.07.12 17:43 Сейчас в теме
(18) bomba,
не позорьтесь сами натягиванием 1С на "мировой опыт".
Выйдет боком со смещенным центром :)
17. пользователь 11.07.12 16:46
(14)
Исчерпывающе вполне. Жаль плюсануть можно лишь раз.
26. frc 12.07.12 09:39 Сейчас в теме
(14) ildarovich,
Для этого нужно привлечь историю развития языков программирования и рекомендации разработчиков.

История и развитие языков программирования, а также накопленный опыт построения БД, и все прочие опыты - и близко с 1С не стояли.
Рекомендаций разработчиков (каких? от 1С?), а также разъяснений, что они там понаделали - тоже практически нет.
d4rkmesa; +1 Ответить
19. Iaskeliainen 385 11.07.12 17:35 Сейчас в теме
Добавим масла в огонь Ж-)

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

А может спецы в 1С менее грамотные?! Или многое делают на скорую руку?!
22. Поручик 4692 11.07.12 17:55 Сейчас в теме
(19) В 1С спецы такие же студенты-быдлокодеры, как и многие, которые здесь вываливают свои поделия. И многое делают на скорую руку, гляньте в типовые.
23. frc 11.07.12 17:59 Сейчас в теме
(22) Поручик,
у них сейчас длаже платформу студенты пишут
Поручик; +1 Ответить
24. Iaskeliainen 385 11.07.12 18:07 Сейчас в теме
(23) frc, (22) Поручик,
Студенты тоже разные бывают.
Есть знакомые у которых 15 лет опыта 1С за плечами, но порой такое кодят, МРАК!!!
Благо дальше контор не уходит.

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

МРАК такое не кодит :)
28. Трактор 1254 12.07.12 17:39 Сейчас в теме
Зачем написана статья? Не понятно.
Два внешне похожих объекта имеют коренные различия. Кто стукнется о различия тот поймёт их. Кто не стукнется тому они не важны. Из статьи различия трудно понять. ИМХО статья бесполезна.
Demetry2000; LordKim; odin-7610; dour-dead; frc; +5 2 Ответить
35. Iaskeliainen 385 12.07.12 22:56 Сейчас в теме
А писал статью так как понятно мне.
Не думал, что будет столько разногласий и непоняток.

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

В моей практике часто проблема связанна именно с этим. Как писал выше по разного рода причинам стандартные алгоритмы пытаются в структуру вставить данные, которые вызывают ошибку. А её можно практически безболезненно решить путем замены «структуры» на «соответствие».
Если у вас есть предложение как можно это сделать минимальной кровью, готов выслушать.
42. frc 16.07.12 12:22 Сейчас в теме
(38)
стандартные алгоритмы пытаются в структуру вставить данные, которые вызывают ошибку.

"стандартные" механизмы не появляются сами по себе, и не пишут сами себя. Если в Структуру функция пытается вернуть не строковой код - так это ошибка программирования, а не поиски "а заменю-ка все на что-нибудь, делов-то, все ранво одно и то же!"
А потом по коду - вместо "Получить" будет "Свойство" - и что, менять по всему коду теперь? Сами же себе такие грабли (разработчики) понаделали с неявностью, вот и расхлебывают программисты.
41. frc 16.07.12 12:17 Сейчас в теме
(37) FedorovEvg,
что 1с выдумала все сама, а не использовала опыт предыдущих языков программирования.

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

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

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

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

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

Пример:
Функция ИгрыССоответствием() Экспорт
	
	ТестовоеСоответствие=Новый Соответствие;
	
	ТестовоеСоответствие.Вставить("Элемент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

(Во вложении скриншот.)
Прикрепленные файлы:
MrFlanker; +1 Ответить
52. Iaskeliainen 385 28.11.12 12:33 Сейчас в теме
(51) AnryMc,
Если смотреть на последние 2 результата впечатление что платформа новое значение всегда вставляет после первого.
58. Serg2000mr 670 30.10.22 14:57 Сейчас в теме
(52) Первое значение попадает на первое место
Второе - на второе
Каждое последующее вставляется перед предыдущим добавленным
Iaskeliainen; +1 Ответить
53. AnryMc 848 28.11.12 12:53 Сейчас в теме
Закономерности в принципе НЕТ
смотри рисунок:
Прикрепленные файлы:
54. signum2009 1039 15.11.13 11:42 Сейчас в теме
Сортируются по порядку только примитивные типы, объектные типы сортируются по внутреннему идентификатору
55. WarAn 17.08.18 16:10 Сейчас в теме
Всегда волосы дыбом встают от ужаса "Не А = Б" - это же просто дико ненаглядно! Глаз гораздо проще ловит знаки "=" или "<>", поэтому такие бредовые сравнения через "Не" и знак (которыми нередко грешат писатели типовых конф) читаются через пень-колоду: "Ага, равно. Равно?!! Ах, твоюждивизию, НЕ равно!!"

Также моветон не ставить пробел после запятой - потому что автоматически читается как Объект.Свойство.

Ну и вдобавок тысяча безграмотностей - это почему-то обычное дело для современных российских граждан, не только для 1Сников
AlexO; Irwin; +2 Ответить
56. Iaskeliainen 385 17.08.18 20:08 Сейчас в теме
(55) эта статья была создана давно как эксперимент, что бы определить за что ставят "+".
Статьи вроде https://infostart.ru/public/722861/ которые повышают производительность на порядки так не оцениваются.
Анекдоты собирают больше "+" чем серьезная статья.
Потому что основная масса пользователей сайта не программисты.
59. gemini76 49 12.12.22 21:59 Сейчас в теме
Может, я что-то пропустил?! А ключевое различие, в чём? Подскажите пожалуйста низжему уму. Хрен и Редька, однака жуются по-своему. Это как?
63. AlexO 135 28.01.24 10:19 Сейчас в теме
(59) Ключевое различие - как раз в самом типе "Ключ": в Структуре он может быть только строковым (отсюда и ограничения "в ключе Структуры первый символ не может быть цифрой..", которые автор статьи почему-то пытается выдать за различия с Соответствием), а Значение - произвольным.
В Соответствии же - и Ключ, и Значение могут быть произвольными, т.е. ЛЮБЫМ типом данных (Число, Строка, Ссылка и т.д.).
Вот в этом и главное отличие Структуры от Соответствия. Далее программист в меру фантазии выбирает, что использовать.
64. AlexO 135 28.01.24 10:35 Сейчас в теме
(0)
Кроме этого: Структура упорядочивает элементы при добавлении, а соответсвие нет.

Это по какому признаку Соответствие должно упорядочить данные с изначально разными типами? Имея в качестве Ключа произвольный тип.

Для «Структура» ключ должен быть введен по всем правилам объявления переменных, а «Соответствие» нет.

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

Например, платформа даёт добавить значение с ключом = Неопределенно

НЕОПРЕДЕЛЕНО - это не тип данных, а отсутствие Ссылки/значения. Что вы пытаетесь сохранить по ключу "Неопределено"? Значение "неопределено"? Так оно сразу уже готово, "А = НЕОПРЕДЕЛЕНО". И всегда по НЕОПРЕДЕЛЕНО получаем единственное и однозначное значение - "неопределено".
Или вы пытаетесь к "пустому месту" присоединить какие-то данные?
Вы б еще NULL попытались в качестве ключа задать, еще больше бы "удивились"))
Оставьте свое сообщение