Имя: Пароль:
1C
 
Ключ соответствия структура, не работает почему?
,
0 Elf56
 
23.05.18
07:36
Всем доброго времени суток.

Имеется 1С:Предприятие 8.3 (8.3.11.3034)
И самописная конфигурация на базе БСП

Необходимо реализовать создание документов по критериям

Объект
Период

Строки могут повторяться т.е. могут быть строку с одинаковым периодом и объектом

для того, чтобы не создавать дубли создал новое соответсвие "СозданныеОбъекты" и проверяю если в структуре

СтруктураКлюч = Новый Структура("Объект, Период");

по такому клучу в соответствие есть в значении документ то заново его не создаю

Только вот проблема если скажем заполнить ключ с параметрами
Объект = ДОговор1
Период = 01.01.18

и поместить под этот ключ документ, а потом этой структуре
присвоить значения
Объект = ДОговор1
Период = 03.03.18

То он найдет тот же самый документ а по сути соответсвие должно выдать НЕОПРЕДЕЛЕНО

вот код

СозданныеОбъекты= Новый Соответствие;
СтруктураКлюч = Новый Структура("ОбъектОграничения, Период");

Для Каждого Строка Из Таблица Цикл            
    
    СтруктураКлюч.Объект = Строка.Объект;
    СтруктураКлюч.Период = Строка.Период;
            
    ЗначениеСоответствия = СозданныеОбъекты.Получить(СтруктураКлюч);
            
    Если ЗначениеСоответствия = Неопределено Тогда
           // Создаю документ
        Иначе
           //Провожу действия с уже созданным документом ЗначениеСоответствия
        КонецЕсли;
КонецЦикла;

Почему ищет тот же документ по другому ключу структуре?
Всем заранее спасибо за ответы
1 NWsFF
 
23.05.18
07:45
Потому что структура это  объектный тип, и значение для ключа указатель, а не значения структуры
2 craxx
 
23.05.18
07:46
(0) используй Соответствие для подобного
3 Elf56
 
23.05.18
07:54
ок спасибо
4 Elf56
 
23.05.18
07:54
А соответствие тогда какого типа ?
5 craxx
 
23.05.18
08:01
(4) в соответствии ключ может быть любого тиа
6 NWsFF
 
23.05.18
08:03
(4)Тоже объектного...
Используй соответствие соответствий
Если СозданныеОбъекты[Период] <> Неопределено и СозданныеОбъекты[Период][Объект] <> Неопределено Тогда
//создаешь документ
Если  СозданныеОбъекты[Период] = неопределено Тогда
  СозданныеОбъекты[Период] = Новый Соответствие();
КонецЕсли;
СозданныеОбъекты[Период][Объект] = Новый Док;
Иначе
Док = СозданныеОбъекты[Период][Объект];
КонецЕсли;
7 Ненавижу 1С
 
гуру
23.05.18
08:03
(4) тоже объектного
8 NWsFF
 
23.05.18
08:04
(6) Спутал условие
Если СозданныеОбъекты[Период] = Неопределено или СозданныеОбъекты[Период][Объект] = Неопределено Тогда
9 Elf56
 
23.05.18
08:12
А разве просто вот так не будет работать

Если СозданныеОбъекты[Период] <> Неопределено и СозданныеОбъекты[Период][Объект] <> Неопределено Тогда
//создаешь документ

СозданныеОбъекты[Период][Объект] = Новый Док;
Иначе
Док = СозданныеОбъекты[Период][Объект];
КонецЕсли;


Без

Если  СозданныеОбъекты[Период] = неопределено Тогда
  СозданныеОбъекты[Период] = Новый Соответствие();
КонецЕсли;
10 Elf56
 
23.05.18
08:16
вобще на эту строку

Если СозданныеОбъекты[Период] = Неопределено или СозданныеОбъекты[Период][Объект] = Неопределено Тогда

вот такую ошибку выдает

{Обработка.Выполнение.МодульОбъекта(243)}: Получение элемента по индексу для значения не определено
СозданныеОбъекты[Объект][Период];

Че то совсем перестал понимать?
11 craxx
 
23.05.18
08:18
(10) логику включи и поймешь что тут надо делать вложенное условие
12 Йохохо
 
23.05.18
08:22
(10) надо "И" чтобы заработали ленивые вычисления, да и по логике
13 Elf56
 
23.05.18
08:25
я так понял тут

СозданныеОбъекты[Период][Объект]

Надо сначала задать эти индексы

типо вот так
СозданныеОбъекты.Вставить("Объект", ОбъектОграничения);
СозданныеОбъекты.Вставить("Период", Период);
14 NWsFF
 
23.05.18
08:30
(10) Что это у тебя в ошибке
СозданныеОбъекты[Объект][Период]
а должно быть
СозданныеОбъекты[Период][Объект]
15 Elf56
 
23.05.18
08:31
А разве это имеет значение на каком месте стоит ?
вобще мне важнее чтобы объект был первым
16 Elf56
 
23.05.18
08:32
Честно вобще не понимаю зачем вот это условие

Если СозданныеОбъекты[Период] = Неопределено или
17 NWsFF
 
23.05.18
08:35
(16)
Это условие проверяет, что соответствие соответствия еще не создано
Если СозданныеОбъекты[Период] = Неопределено
то уже не имеет смысла проверять СозданныеОбъекты[Период][Объект] так как будет выдана ошибка из (10)
И только после операции
Если  СозданныеОбъекты[Период] = неопределено Тогда
  СозданныеОбъекты[Период] = Новый Соответствие();
КонецЕсли;
У нас появляется наша искомая структура данных соответствие соответсвий и опреация СозданныеОбъекты[Период][Объект] уже не будет выдавать ошибку
18 Elf56
 
23.05.18
08:52
Все всем спасибо все взлетело, логику понял :)
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.