Всем привет.
Есть такая задачка: для выделенных строк ТЧ сформировать документы. Выделенные строки ТЧ должны быть сгруппированы по конкретному реквизиту ТЧ (например, Док.Ссылка) и должно создаться столько документов, сколько РАЗЛИЧНЫХ значений реквизитов Док.Ссылка есть в выделенных строках.
Пример:
Выделено 10 строк, среди них в пяти строках док.ссылка = Раз, в трех док.ссылка = Два и в двух строках док.ссылка = Три.
Итого должно создаться 3 документа, в каждом из которых данные по конкретным выделенным строкам (5 строк, 3 строки, 2 строки соответственно в каждом документе).
Сделал так: формирую массив из всех выделенных строк, отбираю строки с с одинаковым значением реквизита док.ссылка. Получаю несколько массивов, где отобраны строки с одинаковыми док.ссылка. Далее обходя каждый массив я создаю документы.
Уверен, что есть более оптимальный способ, просто я не знаю о нем в виду не очень высокого уровня знаний в предметной области. Подскажите, пожалуйста, какие еще возможны варианты решения подобной задачи? Т.к. подобные задачи встречаются нередко, хочется прийти к оптимальному решению. Заранее спасибо.
Есть такая задачка: для выделенных строк ТЧ сформировать документы. Выделенные строки ТЧ должны быть сгруппированы по конкретному реквизиту ТЧ (например, Док.Ссылка) и должно создаться столько документов, сколько РАЗЛИЧНЫХ значений реквизитов Док.Ссылка есть в выделенных строках.
Пример:
Выделено 10 строк, среди них в пяти строках док.ссылка = Раз, в трех док.ссылка = Два и в двух строках док.ссылка = Три.
Итого должно создаться 3 документа, в каждом из которых данные по конкретным выделенным строкам (5 строк, 3 строки, 2 строки соответственно в каждом документе).
Сделал так: формирую массив из всех выделенных строк, отбираю строки с с одинаковым значением реквизита док.ссылка. Получаю несколько массивов, где отобраны строки с одинаковыми док.ссылка. Далее обходя каждый массив я создаю документы.
Уверен, что есть более оптимальный способ, просто я не знаю о нем в виду не очень высокого уровня знаний в предметной области. Подскажите, пожалуйста, какие еще возможны варианты решения подобной задачи? Т.к. подобные задачи встречаются нередко, хочется прийти к оптимальному решению. Заранее спасибо.
По теме из базы знаний
Найденные решения
Если у вас типовая то можно попробовать примерно так. На оптимальность не претендую, если что. Так как вы не пишете какая конфигурация и платформа, то предполагаю, что типовая, обычные формы.
Для Каждого Стр Из ТЧ.ВыделенныеСтроки Цикл
МассивСтрок.Добавить(Стр);
УправлениеЗапасами.УдалитьПовторяющиесяЭлементы(МассивСтрок);
//не знаю какая у вас конфа, но в любой типовой есть что-то похожее. Может быть ОбщийМодуль.ЗаполнитьМассивУникальнымиЗначениями или еще что-то.
НовТЗ = ЭлементыФормы.ТЗ.Скопировать(); //Или НовТЗ = ТЧ.Выгрузить(), смотрите сами что у вас.
НовТЗ.Очистить();
Для каждого СтрокаТЗ Из ЭлементыФормы.ТЗ.ВыделенныеСтроки Цикл
НовСтр = НовТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр,СтрокаТЗ);
КонецЦикла;
НовТЗ.Сортировать(Док.Ссылка); //или что там у вас. Обратите только внимание как сортируются ссылки.
ПредДок = Неопределено;
Для Каждого Стр Из НовТЗ Цикл
Если ПредДок <> Стр.Док.Ссылка Тогда
Если ПредДок <> Неопределено Тогда
ПредДок.Записать(РежимЗаписи.Запись, РежимПроведения.Неоперативный);
КонецЕсли;
ПредДок = ДокументНужногоТипа.СоздатьДокумент();
КонецЕсли;
ДобавитьВДокументДанныеПоСтроке(Стр);
КонецЦикла;
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
У меня несколько сложно, потому что я предположил, что в каждой строке с данными есть что-то, что вы добавляете в документ, то есть если выделили три строки с одинаковым Док.Ссылка, то вам все равно надо обойти три этих строки, чтобы корректно заполнить документ данными.
Если нет - то все гораздо проще, как в (2), вместо сортировки таблицы
ТабЗначений.Свернуть("Ссылка")
Цикл ... ТабЗначений
создание документа
КонецЦикла
Если нет - то все гораздо проще, как в (2), вместо сортировки таблицы
ТабЗначений.Свернуть("Ссылка")
Цикл ... ТабЗначений
создание документа
КонецЦикла
Если у вас типовая то можно попробовать примерно так. На оптимальность не претендую, если что. Так как вы не пишете какая конфигурация и платформа, то предполагаю, что типовая, обычные формы.
Для Каждого Стр Из ТЧ.ВыделенныеСтроки Цикл
МассивСтрок.Добавить(Стр);
УправлениеЗапасами.УдалитьПовторяющиесяЭлементы(МассивСтрок);
//не знаю какая у вас конфа, но в любой типовой есть что-то похожее. Может быть ОбщийМодуль.ЗаполнитьМассивУникальнымиЗначениями или еще что-то.
НовТЗ = ЭлементыФормы.ТЗ.Скопировать(); //Или НовТЗ = ТЧ.Выгрузить(), смотрите сами что у вас.
НовТЗ.Очистить();
Для каждого СтрокаТЗ Из ЭлементыФормы.ТЗ.ВыделенныеСтроки Цикл
НовСтр = НовТЗ.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр,СтрокаТЗ);
КонецЦикла;
НовТЗ.Сортировать(Док.Ссылка); //или что там у вас. Обратите только внимание как сортируются ссылки.
ПредДок = Неопределено;
Для Каждого Стр Из НовТЗ Цикл
Если ПредДок <> Стр.Док.Ссылка Тогда
Если ПредДок <> Неопределено Тогда
ПредДок.Записать(РежимЗаписи.Запись, РежимПроведения.Неоперативный);
КонецЕсли;
ПредДок = ДокументНужногоТипа.СоздатьДокумент();
КонецЕсли;
ДобавитьВДокументДанныеПоСтроке(Стр);
КонецЦикла;
Показать
(3) Вернулся к задаче после праздников. Была мысль с ТЗ, сортировкой и далее, но что-то не додумался как выгрузить данные выделенных строк в ТЗ. оказалось все просто. Спасибо за помощь. Получилось так:
МассивВыделенныхСтрок = Новый Массив;
МассивИдентификаторовВыделенныхСтрок = Элементы.ТаблицаОсновная.ВыделенныеСтроки;
Для Каждого ИдентификаторВыделеннойСтроки Из МассивИдентификаторовВыделенныхСтрок Цикл
Строка = ТаблицаОсновная.НайтиПоИдентификатору(ИдентификаторВыделеннойСтроки);
МассивВыделенныхСтрок.Добавить(ТаблицаОсновная.НайтиПоИдентификатору(ИдентификаторВыделеннойСтроки));
КонецЦикла;
ТЗ_ВыделенныеСтроки = ТаблицаОсновная.Выгрузить();
ТЗ_ВыделенныеСтроки.Очистить();
Для Каждого Стр Из МассивВыделенныхСтрок Цикл
НоваяСтрока = ТЗ_ВыделенныеСтроки.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, Стр);
КонецЦикла;
ТЗ_ВыделенныеСтроки.Сортировать("Сделка");
ПредыдущийДокумент = Неопределено;
Для Каждого Стр Из ТЗ_ВыделенныеСтроки Цикл
Если ПредыдущийДокумент <> Стр.Сделка Тогда
ПредыдущийДокумент = Стр.Сделка;
//Записываем предыдущий документ, если он создан
//...
//Создаем новый документ и заполняем по текущей строке
//...
Иначе
//Продолжаем заполнять документ
//...
КонецЕсли;
КонецЦикла;
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот