Всем привет.

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

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

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

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

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

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

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

    ПредДок = Неопределено;
    Для Каждого Стр Из НовТЗ Цикл
    Если ПредДок <> Стр.Док.Ссылка Тогда
    Если ПредДок <> Неопределено Тогда
    ПредДок.Записать(РежимЗаписи.Запись, РежимПроведения.Неоперативный);
    КонецЕсли;
    ПредДок = ДокументНужногоТипа.СоздатьДокумент();
    КонецЕсли;
    ДобавитьВДокументДанныеПоСтроке(Стр);
    КонецЦикла;
```
---
Сообщение было скрыто модератором.
---
может как то так

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

если что, писал по памяти)
---
Не, по-моему так нельзя, там выделенные строки это коллекция какая-то хитрая вроде, а для "Выгрузить" массив должен быть.
---
ВыделеннынеСтроки - там массив, но массив идентификаторов строк. нельзя. нужен дополнительный цикл.

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

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

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

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

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

```1c
    МассивВыделенныхСтрок = Новый Массив;

    МассивИдентификаторовВыделенныхСтрок = Элементы.ТаблицаОсновная.ВыделенныеСтроки;

    Для Каждого ИдентификаторВыделеннойСтроки Из МассивИдентификаторовВыделенныхСтрок Цикл

    Строка = ТаблицаОсновная.НайтиПоИдентификатору(ИдентификаторВыделеннойСтроки);
    МассивВыделенныхСтрок.Добавить(ТаблицаОсновная.НайтиПоИдентификатору(ИдентификаторВыделеннойСтроки));

    КонецЦикла;

    ТЗ_ВыделенныеСтроки = ТаблицаОсновная.Выгрузить();
    ТЗ_ВыделенныеСтроки.Очистить();

    Для Каждого Стр Из МассивВыделенныхСтрок Цикл

    НоваяСтрока = ТЗ_ВыделенныеСтроки.Добавить();
    ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);

    КонецЦикла;

    ТЗ_ВыделенныеСтроки.Сортировать("Сделка");

    ПредыдущийДокумент = Неопределено;

    Для Каждого Стр Из ТЗ_ВыделенныеСтроки Цикл

    Если ПредыдущийДокумент <> Стр.Сделка Тогда

    ПредыдущийДокумент = Стр.Сделка;
    //Записываем предыдущий документ, если он создан
    //...

    //Создаем новый документ и заполняем по текущей строке
    //...
    Иначе

    //Продолжаем заполнять документ
    //...

    КонецЕсли;

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