Структура против (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Сников