Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Помогите свернуть массив (убрать дублирующиеся строки)

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


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


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

МС = Новый Массив;
Пока ТЗ_Сотрудники.следующий() Цикл
    МС.Добавить(новый Структура("Подразделение, Сотрудник", ТЗ_Сотрудники.Подразделение, ТЗ_Сотрудники.Сотрудник));  //здесь задублированные сотрудники

    //добавим вспомогательный массив

    СвернутыйМассив = Новый Массив;
    Для каждого Элемент Из МС Цикл
        Если СвернутыйМассив.Найти(Элемент.Сотрудник) = Неопределено Тогда
            //если такого значения в массиве еще нет, добавим его

            СвернутыйМассив.Добавить(новый Структура("Подразделение, Сотрудник", Элемент.Подразделение, Элемент.Сотрудник));
        КонецЕсли;
    КонецЦикла;
    Структ = Новый Структура("Сотрудники, Факторы", СвернутыйМассив, МФ);
    Возврат структ;
КонецЦикла;
   vde69
 
8 - 15.01.21 - 15:04
ТЗ_Сотрудники_Свернутая = ТЗ_Сотрудники.Скопировать();// или выгрузить, зависит от типа

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

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

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


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

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

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

МС = Новый Массив;
Пока ТЗ_Сотрудники.следующий() Цикл
    МС.Добавить(новый Структура("Подразделение, Сотрудник", ТЗ_Сотрудники.Подразделение, ТЗ_Сотрудники.Сотрудник));  //здесь задублированные сотрудники

    
    ////добавим вспомогательный массив

    //СвернутыйМассив = Новый Массив;

    //Для каждого Элемент Из МС Цикл

    //    Если СвернутыйМассив.Найти(Элемент.Сотрудник) = Неопределено Тогда

    //        //если такого значения в массиве еще нет, добавим его

    //        СвернутыйМассив.Добавить(новый Структура("Подразделение, Сотрудник", Элемент.Подразделение, Элемент.Сотрудник));

    //    КонецЕсли;

    //КонецЦикла;

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.