Имя: Пароль:
1C
1С v8
Помогите свернуть массив (убрать дублирующиеся строки)
0 dft2014
 
15.01.21
14:52
Подскажите, есть массив (МС) с задублированными записями. Ниже код, которым я пытаюсь убрать дубли, но код не срабатывает: СвернутыйМассив всё равно содержит задублированные записи. Помогите!!!


МС = Новый Массив;
Пока ТЗ_Сотрудники.следующий() Цикл
    
    МС.Добавить(новый Структура("Подразделение, Сотрудник", ТЗ_Сотрудники.Подразделение, ТЗ_Сотрудники.Сотрудник));   //здесь задублированные сотрудники, подразделение всегда одинаковое
    
    //добавим вспомогательный массив
    СвернутыйМассив = Новый Массив;
    
    Для каждого Элемент Из МС Цикл
        Если СвернутыйМассив.Найти(Элемент.Сотрудник) = Неопределено Тогда
            
            //если такого значения в массиве еще нет, добавим его
            СвернутыйМассив.Добавить(новый Структура("Подразделение, Сотрудник", Элемент.Подразделение, Элемент.Сотрудник));
            
        КонецЕсли;
    КонецЦикла;
    
    Структ = Новый Структура("Сотрудники, Факторы", СвернутыйМассив, МФ);
    
КонецЦикла;
1 timurhv
 
15.01.21
14:55
(0) Так ищите дубли по ссылке элемента справочника, а добавляете туда структуру.
2 dft2014
 
15.01.21
14:57
(1) Мне надо, чтобы массив был в виде структуры.
3 polosov
 
15.01.21
14:57
ОбщегоНазначенияУТ.УдалитьПовторяющиесяЭлементыМассива()
4 BaZZiL
 
15.01.21
14:58
ТЗ_Сотрудники это таблица? Сверните таблицу. ваш Кэп
5 dft2014
 
15.01.21
14:59
(3) Нет у меня такого модуля в 1С:ЗУП3.
6 Gbpltw
 
15.01.21
15:02
(5) в БСП есть такой модуль. Ищите.
7 dft2014
 
15.01.21
15:02
(4) Там вначале очень сложный запрос, его менять нельзя. Вот откуда ТЗ_Сотрудники берётся:


ПакетЗапрос = Запрос.ВыполнитьПакет();
ТЗ_Сотрудники = ПакетЗапрос[5].Выбрать();

МС = Новый Массив;
Пока ТЗ_Сотрудники.следующий() Цикл
    МС.Добавить(новый Структура("Подразделение, Сотрудник", ТЗ_Сотрудники.Подразделение, ТЗ_Сотрудники.Сотрудник));   //здесь задублированные сотрудники
    //добавим вспомогательный массив
    СвернутыйМассив = Новый Массив;
    Для каждого Элемент Из МС Цикл
        Если СвернутыйМассив.Найти(Элемент.Сотрудник) = Неопределено Тогда
            //если такого значения в массиве еще нет, добавим его
            СвернутыйМассив.Добавить(новый Структура("Подразделение, Сотрудник", Элемент.Подразделение, Элемент.Сотрудник));
        КонецЕсли;
    КонецЦикла;
    Структ = Новый Структура("Сотрудники, Факторы", СвернутыйМассив, МФ);
    Возврат структ;
КонецЦикла;
8 vde69
 
15.01.21
15:04
ТЗ_Сотрудники_Свернутая = ТЗ_Сотрудники.Скопировать(); // или выгрузить, зависит от типа
ТЗ_Сотрудники_Свернутая.Свернуть("Подразделение,Сотрудник","");
9 МихаилМ
 
15.01.21
15:05
если нужно свернуть массив -
1) отсортируйте его с помощью сз
2) пробегитесь по сз и выгрузите уникальные в массив
10 dft2014
 
15.01.21
15:13
(8) Пишет, что "Метод объекта не обнаружен (Скопировать)". Аналогично "Метод объекта не обнаружен (Выгрузить)".
11 dft2014
 
15.01.21
15:15
(6) А разве есть ещё какие-то модули, которые не видных в Общих?!
12 Гипервизор
 
15.01.21
15:15
(10) Ну так в ТЗ_Сотрудники у вас внезапно Выборка, а она не имеет таких методов.
Тогда замените ТЗ_Сотрудники = ПакетЗапрос[5].Выбрать() на ТЗ_Сотрудники = ПакетЗапрос[5].Выгрузить().
13 dft2014
 
15.01.21
15:16
(9) Я это не осилю ((
14 BaZZiL
 
15.01.21
15:17
Если запрос возвращает "дубли", которые надо обрабатывать в результате запроса, значит это неправильный запрос.

Результат запроса можно выгрузить, тогда это будет таблица, которую можно свернуть.

Хотя правильней составить запрос, который вернет результата без дублей.
15 dft2014
 
15.01.21
15:19
(14) Логично, но по некоторым причинам, запрос решено не трогать.
16 boozin
 
15.01.21
15:22
Можно еще сделать запрос к ТЗ и убрать из нее дубли запросом.
17 dft2014
 
15.01.21
15:27
(12) Исправила, теперь ругается что "Метод объекта не обнаружен (Следующий)":


ПакетЗапрос = Запрос.ВыполнитьПакет();
//ТЗ_Сотрудники = ПакетЗапрос[5].Выбрать();
ТЗ_Сотр = ПакетЗапрос[5].Выгрузить();

ТЗ_Сотрудники = ТЗ_Сотр.Скопировать();
ТЗ_Сотрудники.Свернуть("Подразделение,Сотрудник","");

МС = Новый Массив;
Пока ТЗ_Сотрудники.следующий() Цикл
    МС.Добавить(новый Структура("Подразделение, Сотрудник", ТЗ_Сотрудники.Подразделение, ТЗ_Сотрудники.Сотрудник));   //здесь задублированные сотрудники
    
    ////добавим вспомогательный массив
    //СвернутыйМассив = Новый Массив;
    //Для каждого Элемент Из МС Цикл
    //    Если СвернутыйМассив.Найти(Элемент.Сотрудник) = Неопределено Тогда
    //        //если такого значения в массиве еще нет, добавим его
    //        СвернутыйМассив.Добавить(новый Структура("Подразделение, Сотрудник", Элемент.Подразделение, Элемент.Сотрудник));
    //    КонецЕсли;
    //КонецЦикла;
    
    Структ = Новый Структура("Сотрудники, Факторы", МС, МФ);
    Возврат структ;
КонецЦикла;
18 NWsFF
 
15.01.21
15:30
(17) Пока ТЗ_Сотрудники.следующий() Цикл - > Для Каждого СтрокаТЗ ИЗ ТЗ_Сотрудники Цикл
внутри цикла зменить ТЗ_Сотрудники  - > СтрокаТЗ
19 dka80
 
15.01.21
15:32
Что за ВОЗВРАТ в цикле?
20 Гипервизор
 
15.01.21
15:33
И если я правильно понял что вы хотите изобразить, то создание структуры еще из цикла вынести.
21 Гений 1С
 
гуру
15.01.21
15:38
Хахаха, девушка программистка.
А не проще ли, прежде чем добавлять, глянуть есть ли уже такая запись в кэше?
Кэшем может тупое Соответствие по сотруднику быть.
22 dft2014
 
15.01.21
15:57
(18) Спасибо, всё получилось!
vde69,  Гипервизор - вам тоже СПАСИБО!!!
23 dft2014
 
15.01.21
15:58
(21) А вы, батенька - шовинист!
24 Гений 1С
 
гуру
15.01.21
16:00
(23) так точно, тётенька
25 minsk1s
 
01.06.21
16:21
(17) три способа свернуть массив: https://1cnik.by/svernut_massiv.php
дубли соответственно уйдут
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший