Как правильно обработать выделеные строки

1. Raideres 7 14.09.20 12:30 Сейчас в теме
Есть ТЗ на форме в ней список документов и есть кнопка создать документы
Нужно при нажатие на кнопку создать документ по выделенным строкам но проблема в том что нужно сначала проверить что выделенные строки принадлежат одному контрагенту а потом только уже создавать документ.
Прикрепленные файлы:
Найденные решения
7. SlavaKron 14.09.20 13:45 Сейчас в теме
(4) Я бы сделал через колонку пометки, но если делать через выделенные, то как-то так:
&НаКлиенте
Процедура Команда1(Команда)
	
	Команда1НаСервере();
	
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()
	
	ВыделенныеСтроки = Элементы.РаспоряженияНаОтгрузку.ВыделенныеСтроки;
	МассивСтрок = Новый Массив;
	Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
		МассивСтрок.Добавить(РаспоряженияНаОтгрузку.НайтиПоИдентификатору(ВыделеннаяСтрока));
	КонецЦикла;
	
	ТЗ = РаспоряженияНаОтгрузку.Выгрузить(МассивСтрок);
	
	Получатели = ТЗ.Скопировать(, "Получатель");
	Получатели.Свернуть("Получатель");
	Получатели = Получатели.ВыгрузитьКолонку(0);
	
	ТЗ.Индексы.Добавить("Получатель");
	
	Для Каждого Получатель Из Получатели Цикл
		
		СтрокиПолучателя = ТЗ.НайтиСтроки(Новый Структура("Получатель", Получатель));
		
		// создаете документ по текущему получателю и строкам ТЗ
		
	КонецЦикла;
	
КонецПроцедуры
Показать
Остальные ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
2. malikov_pro 495 14.09.20 13:11 Сейчас в теме
(1) Найти контрагента по ИНН или наименованию, проверить через ЗначениеЗаполнено() что найден, после в цикле
Если СтрокаТЗ.Контрагент = Найденный контрагент Тогда
...
3. SlavaKron 14.09.20 13:21 Сейчас в теме
На клиенте проверку можно сделать через Соответствие.
Соответствие = Новый Соответствие;
Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
	СтрокаТЗ = РаспоряженияНаОтгрузку.НайтиПоИдентификатору(ВыделеннаяСтрока);
	Соответствие.Вставить(СтрокаТЗ.Получатель);
КонецЦикла;

Если Соответствие.Количество() > 1 Тогда
	
Иначе
	
КонецЕсли;
Показать
4. Raideres 7 14.09.20 13:32 Сейчас в теме
(3)
Соответствие = Новый Соответствие;
Для Каждого ВыделеннаяСтрока Из ВыделенныеСтроки Цикл
СтрокаТЗ = РаспоряженияНаОтгрузку.НайтиПоИдентификатору(ВыделеннаяСтрока);
Соответствие.Вставить(СтрокаТЗ.Получатель);
КонецЦикла;

Если Соответствие.Количество() > 1 Тогда

Иначе

КонецЕсли;


а можете подсказать как сделать если например я выделел строки в тз и мне нужно наоборот создать


для каждого контрагента свой документ. например
ТЗ выделеных
Документ 1 иванов
Документ 2 Петрова
документ 3 иванов


по выделеным строкам должно создаться 2 документ 1 с получателем ивановым а второй с получателем петровым
ТЗ = Новый ТаблицаЗначений; 
	ТЗ.Колонки.Добавить("Распоряжение",	Новый ОписаниеТипов("ДокументСсылка.РасходнаяНакладная"));
	ТЗ.Колонки.Добавить("Получатель",	Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
	
	Для Каждого СтрИД Из Элементы.РаспоряженияНаОтгрузку.ВыделенныеСтроки Цикл
		СтрТабл = РаспоряженияНаОтгрузку.НайтиПоИдентификатору(СтрИД);
		
		Если СтрТабл = Неопределено Тогда
			ТекстПредупреждения = НСтр("ru = 'Выберите распоряжение на отгрузку товаров.'");
			ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстПредупреждения);
			Возврат;
		КонецЕсли;
	КонецЦикла
	
	
	
	    НовыйДокумент = Документы.АМ_ОтгрузкаТоваров.СоздатьДокумент();
		НовыйДокумент.Дата 			= ТекущаяДатаСеанса();
		НовыйДокумент.ДатаОтгрузки 	= ТекущаяДатаСеанса();
		НовыйДокумент.Получатель 	= ДокументОснование.Контрагент;		
		НовыйДокумент = ПараметрыСеанса.ТекущийПользователь();
		
		Запрос = Новый Запрос;
		Запрос.Текст ="ВЫБРАТЬ
		|	АМ_ТоварыКОтгрузкеОстатки.Номенклатура КАК Номенклатура,
		|	АМ_ТоварыКОтгрузкеОстатки.Характеристика КАК Характеристика,
		|	АМ_ТоварыКОтгрузкеОстатки.Упаковка КАК Упаковка,
		|	АМ_ТоварыКОтгрузкеОстатки.КОтгрузкеОстаток КАК Количество,
		|	АМ_ТоварыКОтгрузкеОстатки.ДокументОтгрузки КАК Распоряжение
		|ИЗ
		|	РегистрНакопления.АМ_ТоварыКОтгрузке.Остатки КАК АМ_ТоварыКОтгрузкеОстатки
		|ГДЕ
		|	АМ_ТоварыКОтгрузкеОстатки.ДокументОтгрузки В (&ДокументОтгрузки)";  
		
		Запрос.УстановитьПараметр("ДокументОтгрузки", ДанныеЗаполнения.Ссылка);
		ТаблицаАМТоварыКОтгрузке = Запрос.Выполнить().Выгрузить();

		Если  ТаблицаАМТоварыКОтгрузке.Количество() <> 0 Тогда
			ТоварыПоРаспоряжениям.Загрузить(ТаблицаАМТоварыКОтгрузке);
			ОтгружаемыеТовары.Загрузить(ТаблицаАМТоварыКОтгрузке);
			ОтгружаемыеТовары.Свернуть("Номенклатура,Характеристика,Упаковка","Количество");
		КонецЕсли;
Показать


пытаюсь по что то так изобрести
5. FatPanzer_Job 5 14.09.20 13:38 Сейчас в теме
(4) Для Каждого Контрагент Из Соответствие Цикл... (это продолжение предыдущего автора)
6. FatPanzer_Job 5 14.09.20 13:43 Сейчас в теме
(4) Продолжим ваш экзерсис:
1. Создаем ТЗ по вашему образцу. Перебором выделенных строк добавляем в неё информацию из выделенных строк и параллельно заполняем массив или соответствие контрагентов (как указал предыдущий коллега).
2. В цикле для каждого контрагента из массива или соответствия отбираем в ТЗ строки с распоряжениями.
3. Найденные распоряжения и контрагента отправляем на создание нового документа.
7. SlavaKron 14.09.20 13:45 Сейчас в теме
(4) Я бы сделал через колонку пометки, но если делать через выделенные, то как-то так:
&НаКлиенте
Процедура Команда1(Команда)
	
	Команда1НаСервере();
	
КонецПроцедуры

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