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

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

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

Структура

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

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

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

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

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

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

Возможен обмен с сервером. Сериализуется. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту, определяется в пространстве имен .

Имя типа XDTO: Structure

Имя типа XDTO: Map

Может использоваться в реквизитах управляемой формы.

Запись = Новый Структура ;

Запись = Новый Соответствие ;

Запись . Вставить ( "Ключ" , "Значение" );

Кроме этого: Структура упорядочивает элементы при добавлении, а соответсвие нет.

Вернемся к теме:

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

Можно просто заменить тип переменной и заменить метод «Свойство» на «Получить». Обычно этого достаточно.

Но бывают и неожиданные результаты при использовании «Соответствие».

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

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

Процедура КнопкаВыполнитьНажатие ( Кнопка )

Для А = 1 По 500000 Цикл

Стр = "А" + Формат ( А , "ЧГ font-family: Courier; color: #ff0000; font-size: small;">);

ВставитьИПроверить ( мСтруктура , Стр , Стр );

Сообщить ( "Структура - " + ( ТекущаяДата () - тДата ));

ВставитьИПроверить ( мСтруктура , Тест , Тест );

Для А = 1 По 500000 Цикл

Стр = "А" + Формат ( А , "ЧГ font-family: Courier; color: #ff0000; font-size: small;">);

ВставитьИПроверить ( мСоответствие , Стр , Стр );

Сообщить ( "Соответствие - " + ( ТекущаяДата () - тДата ));

ВставитьИПроверить ( мСоответствие , Тест , Тест );

Процедура ВставитьИПроверить ( Список , Ключ , Значение );

мТип = ТипЗнч ( Список );

//проверка возможно добавить или нет

Список . Вставить ( Ключ , Значение );

Сообщить ( "" + мТип + ": Не возможно добавить ключ [" + Значение + "]." );

Если НЕ (( мТип = Тип ( "Соответствие" ) И НЕ Список . Получить ( Ключ ) = Неопределено)

ИЛИ ( мТип = Тип ( "Структура" ) И НЕ Список . Свойство ( Ключ ) = Неопределено)) Тогда

Сообщить ( "" + мТип + ": Выполнено неявное преобразование типов и/или данных ключа [" + Значение + "]." )

Сообщить ( "" + мТип + ": Невозможно получить значение по ключу [" + Значение + "].

| Возможно было выполнено неявное преобразование типов и/или данных ключа." )

Процедура ОсновныеДействияФормыПроверка ( Кнопка )

мСсылка = Справочники . Валюты . ПустаяСсылка ();

// добавление новый элементов в Структуру

ВставитьИПроверить ( мСтруктура , "Ключ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) Согласен c awk, это разные объекты с разным назначением.

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

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

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

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

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

  • Скопировать ссылку
  • Перейти

(27) frc, так как порой заполнение значений, тем более структур в типовых конфигурациях запускается много разных вложенных процедур/функций в которых в свою очередь запускаются еще процедуры/функции и т.д. и т.п. Можно конечно ставить точки останова по ошибки, анализировать по одной. Мне нравиться больше обернуть попыткой и выводить сообщения понятные для меня. Со временем получилась процедура ВставитьИПроверить. Которую и выложил. А что бы было понятно, зачем она нужна, сделал несколько примеров.

А если у вас возникают вопросы, зачем вообще в структуру пихать данные отличные от типа строка, причем что бы удовлетворяла всем правилам. Надо спросить у тех кто пишет типовые конфигурации.

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

(0) А почему не сравнить самолет с паровозом? Почему паровоз не летает? А почему самолет столько груза не перевозит?

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

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

Очень чешется влепить минус за такое сравнение.

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Добавим масла в огонь Ж-)

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

А может спецы в 1С менее грамотные?! Или многое делают на скорую руку?!

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

(23) frc, (22) Поручик, Студенты тоже разные бывают. Есть знакомые у которых 15 лет опыта 1С за плечами, но порой такое кодят, МРАК. Благо дальше контор не уходит.

Скорее всего, делают на скорую руку. Надо же работу франчайзи оставлять. А то пользователь наивный думает, купил коробку и случилось счастье.

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

А писал статью так как понятно мне. Не думал, что будет столько разногласий и непоняток.

В ближайшие время статью дополню сообщениями из комментариев.

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Я бы вставил в текст статьи ЗАМЕЧАНИЕ о сортировке в "Соответствии"

Например, добавляем в Соответствие: Элемент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

  • Скопировать ссылку
  • Перейти

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

(Во вложении скриншот.)

  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти
  • Скопировать ссылку
  • Перейти

Всегда волосы дыбом встают от ужаса "Не А = Б" - это же просто дико ненаглядно! Глаз гораздо проще ловит знаки "=" или "<>", поэтому такие бредовые сравнения через "Не" и знак (которыми нередко грешат писатели типовых конф) читаются через пень-колоду: "Ага, равно. Равно. Ах, твоюждивизию, НЕ равно!!"

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

Ну и вдобавок тысяча безграмотностей - это почему-то обычное дело для современных российских граждан, не только для 1Сников

📎📎📎📎📎📎📎📎📎📎