новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума
Форум

Обсуждение к заданию: Консультация

    • #1
    • 10.08.2013 17:40
    0
    нужна консультация по коду правильно написать цикл, для создание документов желательно удаленно  Подробнее>>
    • #2
    • 10.08.2013 17:42
    0
    есть 3 таблицы на форме, надо выполняя определеные условия создовать документ счет из данных которые находяться в этих таблицах
    загвозка в том что написаный мной код выбирает и создает только 1 документ
    написал такой код
    Для каждого СтрТабЧасти из ТЧ Цикл
    			таб1Контрагент=СтрТабЧасти.Контрагент;
    			таб1СуммаСУСН=СтрТабЧасти.СуммаСусн;
    			//Сообщить(таб1Контрагент);
           КонецЦикла;
    			Для каждого СтрТабЧасти из ТЧ2 Цикл
    			таб2Контрагент=СтрТабЧасти.Контрагент;
    			таб2СуммаСУСН=СтрТабЧасти.СуммаСусн;
    			//Сообщить(таб2Контрагент);
           КонецЦикла;
    	        Для каждого СтрТабЧасти из ТЧ4 Цикл
    			таб4Контрагент=СтрТабЧасти.Контрагент;
    			таб4СуммаСУСН=СтрТабЧасти.СуммаСусн;
    			//Сообщить(таб4Контрагент);
    		КонецЦикла;
    		Для каждого СтрТабЧасти из ТЧ Цикл
    		Если   таб1Контрагент =таб2Контрагент и таб1Контрагент=таб4Контрагент
    			Тогда
    			
    			   //Если  таб1Контрагент =таб2Контрагент и таб1Контрагент=таб4Контрагент
    		   //сравниваем контрагентов для записи в счет если 3  все равны  в счете 3 записи
    		   //************======если не будет моб продумать!!!
    		   Сообщить(таб1Контрагент);	   
    	       //**Создаем счет
    	       НовСчет =  Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
    		   НовСчет.Организация=Справочники.Организации.НайтиПоКоду("000000002");					   
    	       НовСчет.Контрагент = таб1Контрагент;
    
    
    • #3
    • 10.08.2013 18:00
    0
    Так конечно один 1 документ. У Вас в каждом цикле табКонтрагент и табСуммаСУСН последние из ТЧ. Вы "прогоняете" каждый цикл потом только последние элементы сравниваете....
    • #4
    • 10.08.2013 18:03
    0
    Для каждого СтрТабЧасти из ТЧ Цикл
    Для каждого СтрТабЧасти из ТЧ Цикл
    			таб1Контрагент=СтрТабЧасти.Контрагент;
    			таб1СуммаСУСН=СтрТабЧасти.СуммаСусн;
    			//Сообщить(таб1Контрагент);
           КонецЦикла;
    			Для каждого СтрТабЧасти из ТЧ2 Цикл
    			таб2Контрагент=СтрТабЧасти.Контрагент;
    			таб2СуммаСУСН=СтрТабЧасти.СуммаСусн;
    			//Сообщить(таб2Контрагент);
           КонецЦикла;
    	        Для каждого СтрТабЧасти из ТЧ4 Цикл
    			таб4Контрагент=СтрТабЧасти.Контрагент;
    			таб4СуммаСУСН=СтрТабЧасти.СуммаСусн;
    			//Сообщить(таб4Контрагент);
    		КонецЦикла;
    		
    		Если   таб1Контрагент =таб2Контрагент и таб1Контрагент=таб4Контрагент
    			Тогда
    			
    			   //Если  таб1Контрагент =таб2Контрагент и таб1Контрагент=таб4Контрагент
    		   //сравниваем контрагентов для записи в счет если 3  все равны  в счете 3 записи
    		   //************======если не будет моб продумать!!!
    		   Сообщить(таб1Контрагент);	   
    	       //**Создаем счет
    	       НовСчет =  Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
    		   НовСчет.Организация=Справочники.Организации.НайтиПоКоду("000000002");					   
    	       НовСчет.Контрагент = таб1Контрагент;
    КонецЦикла;
    
    • #5
    • 10.08.2013 18:04
    0
    Надо примерно так....
    Но тоже требуется отладка конечно
    У вас количество строк ТЧ одинаковы?
    • #6
    • 10.08.2013 19:08
    0
    Делаешь цикл по ТЧ, затем внутри этого цикла пробегаешь по ТЧ2 если нашел флУсловия= 1 потом бежишь по ТЧ4 если нашел то флУсловия=флУсловия+1 затем Если флУсловия=2 тогда создаешь свой счет, как то так навскидку
    • #7
    • 10.08.2013 19:20
    0
    Вот примерно так:
    	 Для каждого СтрТабЧасти из ТЧ Цикл
    		 таб1Контрагент=СтрТабЧасти.Контрагент;
    		 таб1СуммаСУСН=СтрТабЧасти.СуммаСусн;
    		 
    		 Для каждого СтрТабЧасти из ТЧ2 Цикл
    			 таб2Контрагент=СтрТабЧасти.Контрагент;
    			 таб2СуммаСУСН=СтрТабЧасти.СуммаСусн;
    			 Если таб1Контрагент =таб2Контрагент Тогда
    				 
    				 Для каждого СтрТабЧасти из ТЧ4 Цикл
    					 таб4Контрагент=СтрТабЧасти.Контрагент;
    					 таб4СуммаСУСН=СтрТабЧасти.СуммаСусн;
    					 Если таб2Контрагент=таб4Контрагент Тогда
    						 
    						 НовСчет =  Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
    						 НовСчет.Организация=Справочники.Организации.НайтиПоКоду("000000002");
    						 НовСчет.Контрагент = таб1Контрагент;
    						 
    					 КонецЕсли;
    				 КонецЦикла;
    				 
    			 КонецЕсли; 
    		 КонецЦикла;
    	 КонецЦикла;
    • #8
    • 10.08.2013 19:28
    0
    Для каждого СтрТабЧасти из ТЧ Цикл
    		 флУсл=0;
                     таб1Контрагент=СтрТабЧасти.Контрагент;
    		 таб1СуммаСУСН=СтрТабЧасти.СуммаСусн;
    		 
    		 Для каждого СтрТабЧасти2 из ТЧ2 Цикл
    			 таб2Контрагент=СтрТабЧасти2.Контрагент;
    			 таб2СуммаСУСН=СтрТабЧасти2.СуммаСусн;
    			 Если таб1Контрагент =таб2Контрагент Тогда
    				флУсл=флУсл+1;
                              Иначе
                                    прервать;
                             КонецЕсли;
                    КонецЦикла;
     
    		Для каждого СтрТабЧасти3 из ТЧ4 Цикл
    			 таб4Контрагент=СтрТабЧасти3.Контрагент;
    			 таб4СуммаСУСН=СтрТабЧасти3.СуммаСусн;
    			 Если таб1Контрагент=таб4Контрагент Тогда
                                  флУсл=флУсл+1;
                              Иначе
                                    прервать;
                             КонецЕсли;
    
    		КонецЦикла;				 
    		Если флУсл=2 Тогда			
    
                      	 НовСчет =  Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
    			 НовСчет.Организация=Справочники.Организации.НайтиПоКоду("000000002");
    			 НовСчет.Контрагент = таб1Контрагент;
                    КонецЕсли;
    						 
    				
    	 КонецЦикла;
    
    • #9
    • 10.08.2013 19:31
    0
    Вариант Артура Салаватовича тоже рабочий, но вложеностей циклов много :)
    • #10
    • 10.08.2013 19:37
    0
    Нет ни у Вас, ни у меня не рабочий...
    Если у меня - если в какой то из ТЧ будут одинаковые Контрагенты, то счета начнут дублироваться
    У Вас, наоборот, два одинаковых контрагента в табл части приведут к флУсл > 2, т.е счетов не будет совсем
    • #11
    • 10.08.2013 19:40
    0
    Для каждого СтрТабЧасти из ТЧ Цикл
    флУсл=0;

    тут я обнуляю на каждую новую строку ТЧ , в любом случае отладка поможет :)
    • #12
    • 11.08.2013 14:46
    0
    Добрый день! я может не совсем понимаю задачу. А обязательно все это в цикле делать? Может стоит выгрузить все одну ТаблицуЗначений, добавить в нее колонку КолКонтрагентов с значением 1. Свернуть(Контрагент,КолКонтрагентов), Перебрать строки , Если КолКонтрагентов > 3 Тогда тогда создать Счет. Будет быстрее чем через циклы. Можно, конечно, подумать еще... и сделать еще быстрее через Запрос, актуально если кол строк в таб частях большое.
    • #13
    • 11.08.2013 15:14
    0
    может форму переписать ? какова задача ?
    • #14
    • 12.08.2013 11:16
    0
    А просто через Найти() ? Как я понял, контрагент должен быть во всех 3 ТЗ.

    Поэтому:
    МассивКонтрагентов = Новый Массив; //от задубления, как вариант
    
    Для Каждого СтрокаТЧ Из ТЧ Цикл
       Если МассивКонтрагентов.Найти(СтрокаТЧ.Контрагент) =  Неопределено 
               И  ТЧ2.Найти(СтрокаТЧ.Контрагент) <> Неопределено
               И ТЧ4.Найти(СтрокаТЧ.Контрагент) <> Неопределено
        Тогда
             МассивКонтрагентов.Добавить(СтрокаТЧ.Контрагент);
             НовСчет =  Документы.СчетНаОплатуПокупателю.СоздатьДокумент();
             //...
        КонецЕсли;
    КонецЦикла;
    


    Непонятно, сумма где-то используется из ТЧ?

    Если используется, то можно через НайтиСтроки():

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