Имя: Пароль:
1C
1С v8
В каком универсальном объекте поискать аналог Вставить() от Соответствия
,
0 Elkin-Palkin
 
23.01.17
21:04
Задача вроде бы проста, но я где-то торможу.
У Соответствия есть отличный (для моих целей) метод Вставить(), который не добавляет новые записи, если уже существует такой ключ в Соответствии.
Т.е. МоёСоответствие.Вставить(МойКлюч, МоеЗначение) гарантирует, что с одинаковым ключом не будет записей. Всё хорошо, но я потом не могу обратиться к первой записи. Т.е. нельзя написать МоёСоответвствие[1].Значение.
Понятно, что я могу запомнить первый ключ и по нему обращаться в Соответствие. Можно использовать СписокЗначений, но тогда перед добавлением обязательно явно надо проверять, есть ли уже то, что я собираюсь добавить. Потому что ни Вставить(), ни Добавить() у Списка значений не делают такую проверку.
Но может я плохо знаю синтаксис и есть объект, который позволяет:
1) Вставить(добавить) без дублирования по какому-то ключу
2) Хранит два значения (значение и представление значения)
3) Обратиться к первому элементу по индексу
А?
1 PR
 
23.01.17
21:05
Нахрена?
2 Elkin-Palkin
 
23.01.17
21:07
В отчёт надо вывести все представления, а в расшифровку только первое значение. А значения могут повторяться. Так нахрена в отчёт лепить лишнее?
3 Cyberhawk
 
23.01.17
21:08
Вставить + Свернуть
4 Elkin-Palkin
 
23.01.17
21:09
ТаблицаЗначений?
5 Cyberhawk
 
23.01.17
21:16
Список значений (выгрузить значения в массив, массив загрузить в ТЗ, ТЗ свернуть, выгрузить колонку ТЗ в массив, загрузить в список значений), бугага
6 Лефмихалыч
 
23.01.17
21:43
(0) начни с ответа на вопрос "зачем" вместо "как"
7 Неверный Параметр И
 
23.01.17
22:53
(0) Ответь сначала, что такое "первый" ключ.
8 Torquader
 
24.01.17
00:20
Во-первых, вызов по индексу доступен для структуры - если ключ строка, то проблема решена.
Во-вторых, если хочется уникальность, то индексированная таблица значений вполне подойдёт:

лтзДанные=Новый ТаблицаЗначений;
лтзДанные.Колонки.Добавить("Ключ");
лтзДанные.Колонки.Добавить("Значение");

// добавление значения лНовоеЗначение с ключом лНовыйКлюч
лстз=лтзДанные.Найти(лНовыйКлюч,"Ключ");
Если лстз=НЕОПРЕДЕЛЕНО Тогда
лстз=лтзДанные.Добавить();
лстз.Ключ=лНовыйКлюч;
КонецЕсли;
лстз.Значение=лНовоеЗначение;
9 Torquader
 
24.01.17
00:23
P.S. забыл самое главное:
// при создании таблицы
лтзДанные.Индексы.Добавить("Ключ");

// Кстати, если сделать так:
лтзДанные.Индексы.Добавить("Значение");
// Можно будет перекодироваться обратно из значения в ключ:
лстз=лтзДанные.Найти(лНовоеЗначение,"Значение");
Если лстз=НЕОПРЕДЕЛЕНО Тогда
лБылКлюч=НЕОПРЕДЕЛЕНО;
Иначе
лБлыКлюч=лстз.Ключ;
КонецЕсли;

Ну и ложка дёгтя: В управляемых формах таблицы значений на клиенте просто нет.
10 Elkin-Palkin
 
24.01.17
10:18
(7) "Первый" ключ - в данном случае "первый попавшийся" :)
11 Elkin-Palkin
 
24.01.17
10:47
Ну, если уж я начал тему, то её и закончу. Чтобы не было неопределённостей. Спасибо (8) и (9), но я, видимо, хотел перфекционизму (излишнего), поэтому этот код длинноват.
Тогда уж лучше СписокЗначений использовать с проверкой перед добавлением - есть ли такое значение в списке.

Я всё-таки использовал соответствие и использовал код:
Для Каждого Стр Из МоёСоответствие Цикл
  НужноеЗначение = Стр.Ключ; //вот и "первое попавшееся" значение
  Прервать;
КонецЦикла;
12 Torquader
 
25.01.17
00:59
(11) Только нет уверенности, что первым будет тот, кого первым добавили - создатели соответствия этого не обещали.
13 Elkin-Palkin
 
25.01.17
09:59
(12) Согласен. Но мне по-фигу. Правильно тогда было бы сказать: "мне нужен только ОДИН ИЗ", вместо "первый попавшийся"