Сгруппировать строки массива или иное

1. Aftee 28.04.18 16:58 Сейчас в теме
Всем привет.

Есть такая задачка: для выделенных строк ТЧ сформировать документы. Выделенные строки ТЧ должны быть сгруппированы по конкретному реквизиту ТЧ (например, Док.Ссылка) и должно создаться столько документов, сколько РАЗЛИЧНЫХ значений реквизитов Док.Ссылка есть в выделенных строках.
Пример:

Выделено 10 строк, среди них в пяти строках док.ссылка = Раз, в трех док.ссылка = Два и в двух строках док.ссылка = Три.
Итого должно создаться 3 документа, в каждом из которых данные по конкретным выделенным строкам (5 строк, 3 строки, 2 строки соответственно в каждом документе).

Сделал так: формирую массив из всех выделенных строк, отбираю строки с с одинаковым значением реквизита док.ссылка. Получаю несколько массивов, где отобраны строки с одинаковыми док.ссылка. Далее обходя каждый массив я создаю документы.

Уверен, что есть более оптимальный способ, просто я не знаю о нем в виду не очень высокого уровня знаний в предметной области. Подскажите, пожалуйста, какие еще возможны варианты решения подобной задачи? Т.к. подобные задачи встречаются нередко, хочется прийти к оптимальному решению. Заранее спасибо.
По теме из базы знаний
Найденные решения
3. necropunk 9 28.04.18 17:45 Сейчас в теме
Если у вас типовая то можно попробовать примерно так. На оптимальность не претендую, если что. Так как вы не пишете какая конфигурация и платформа, то предполагаю, что типовая, обычные формы.

Для Каждого Стр Из ТЧ.ВыделенныеСтроки Цикл
МассивСтрок.Добавить(Стр);
УправлениеЗапасами.УдалитьПовторяющиесяЭлементы(МассивСтрок);
//не знаю какая у вас конфа, но в любой типовой есть что-то похожее. Может быть ОбщийМодуль.ЗаполнитьМассивУникальнымиЗначениями или еще что-то.

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

НовТЗ.Сортировать(Док.Ссылка); //или что там у вас. Обратите только внимание как сортируются ссылки.

ПредДок = Неопределено;
Для Каждого Стр Из НовТЗ Цикл
   Если ПредДок <> Стр.Док.Ссылка Тогда
       Если ПредДок <>  Неопределено Тогда
             ПредДок.Записать(РежимЗаписи.Запись, РежимПроведения.Неоперативный);
       КонецЕсли;
       ПредДок =  ДокументНужногоТипа.СоздатьДокумент();
    КонецЕсли;
    ДобавитьВДокументДанныеПоСтроке(Стр);
КонецЦикла;
Показать
MPARD; maksa2005; Aftee; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. пользователь 28.04.18 23:36
Сообщение было скрыто модератором.
...
2. RussXXX 28.04.18 17:41 Сейчас в теме
может как то так

ТабЗначений = ТабличнаяЧасть.Выгрузить(ВыделеннынеСтроки, Колонки);
ТабЗначений.Свернуть("Ссылка")
Цикл ... ТабЗначений
создание документа

если что, писал по памяти)
4. necropunk 9 28.04.18 17:50 Сейчас в теме
(2) Не, по-моему так нельзя, там выделенные строки это коллекция какая-то хитрая вроде, а для "Выгрузить" массив должен быть.
6. RussXXX 28.04.18 18:45 Сейчас в теме
(4)ВыделеннынеСтроки - там массив, но массив идентификаторов строк. нельзя. нужен дополнительный цикл.

МассивСтрок.Добавить(Объект.ТЧ.НайтиПоИдентификатору(ИдентификаторСтроки))
5. necropunk 9 28.04.18 17:52 Сейчас в теме
У меня несколько сложно, потому что я предположил, что в каждой строке с данными есть что-то, что вы добавляете в документ, то есть если выделили три строки с одинаковым Док.Ссылка, то вам все равно надо обойти три этих строки, чтобы корректно заполнить документ данными.
Если нет - то все гораздо проще, как в (2), вместо сортировки таблицы
ТабЗначений.Свернуть("Ссылка")
Цикл ... ТабЗначений
создание документа
КонецЦикла
3. necropunk 9 28.04.18 17:45 Сейчас в теме
Если у вас типовая то можно попробовать примерно так. На оптимальность не претендую, если что. Так как вы не пишете какая конфигурация и платформа, то предполагаю, что типовая, обычные формы.

Для Каждого Стр Из ТЧ.ВыделенныеСтроки Цикл
МассивСтрок.Добавить(Стр);
УправлениеЗапасами.УдалитьПовторяющиесяЭлементы(МассивСтрок);
//не знаю какая у вас конфа, но в любой типовой есть что-то похожее. Может быть ОбщийМодуль.ЗаполнитьМассивУникальнымиЗначениями или еще что-то.

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

НовТЗ.Сортировать(Док.Ссылка); //или что там у вас. Обратите только внимание как сортируются ссылки.

ПредДок = Неопределено;
Для Каждого Стр Из НовТЗ Цикл
   Если ПредДок <> Стр.Док.Ссылка Тогда
       Если ПредДок <>  Неопределено Тогда
             ПредДок.Записать(РежимЗаписи.Запись, РежимПроведения.Неоперативный);
       КонецЕсли;
       ПредДок =  ДокументНужногоТипа.СоздатьДокумент();
    КонецЕсли;
    ДобавитьВДокументДанныеПоСтроке(Стр);
КонецЦикла;
Показать
MPARD; maksa2005; Aftee; +3 Ответить
8. Aftee 03.05.18 10:19 Сейчас в теме
(3) Вернулся к задаче после праздников. Была мысль с ТЗ, сортировкой и далее, но что-то не додумался как выгрузить данные выделенных строк в ТЗ. оказалось все просто. Спасибо за помощь. Получилось так:

МассивВыделенныхСтрок = Новый Массив;
	
	МассивИдентификаторовВыделенныхСтрок = Элементы.ТаблицаОсновная.ВыделенныеСтроки;
	
	Для Каждого ИдентификаторВыделеннойСтроки Из МассивИдентификаторовВыделенныхСтрок Цикл
		
		Строка = ТаблицаОсновная.НайтиПоИдентификатору(ИдентификаторВыделеннойСтроки);
		МассивВыделенныхСтрок.Добавить(ТаблицаОсновная.НайтиПоИдентификатору(ИдентификаторВыделеннойСтроки));		
		
	КонецЦикла;
	
	ТЗ_ВыделенныеСтроки = ТаблицаОсновная.Выгрузить();
	ТЗ_ВыделенныеСтроки.Очистить();
	
	Для Каждого Стр Из МассивВыделенныхСтрок Цикл
		
		НоваяСтрока = ТЗ_ВыделенныеСтроки.Добавить();
		ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
		
	КонецЦикла;
	
	ТЗ_ВыделенныеСтроки.Сортировать("Сделка");
	
	ПредыдущийДокумент = Неопределено;
	
	Для Каждого Стр Из ТЗ_ВыделенныеСтроки Цикл
		
		Если ПредыдущийДокумент <> Стр.Сделка Тогда
			
			ПредыдущийДокумент = Стр.Сделка;
			//Записываем предыдущий документ, если он создан
			//...
			
			//Создаем новый документ и заполняем по текущей строке
			//...
		Иначе 
			
			//Продолжаем заполнять документ 
			//...
			
		КонецЕсли;
				
	КонецЦикла;
Показать
necropunk; +1 Ответить
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот