Помогите с обработкой

1. skiopolitan 20.11.18 07:46 Сейчас в теме
Уже замучился, перерыл весь интернет в поисках решения (Не в прямом смысле). Создает 202 документа в Поступление товаров и услуг, но надо чтобы он одинаковые контрагенты в 1 документ делал, а не несколько и в табличную часть товары, заносил все данные по строчкам Эксель по отбору контрагент (Заносит только 1 строчку, вместо несколько). Вот код:
Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда
	Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
		ТекущееЗначения = Excel.Cells(СтрокаОтсчета, 23).Text;
		Хрень = Excel.Cells (СтрокаОтсчета,23).Text;
		Для каждого СтрокаМассив из МассивКолонок Цикл
			Если Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина) = Excel.Cells (СтрокаОтсчета,23).Text Тогда
				Продолжить;
			Иначе	
				НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
			КонецЕсли;
			НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина);
			НовыйДокумент.Дата = ТекущаяДата();
			НовыйДокумент.Организация = Объект.Организация;
			НовыйДокумент.ВидОперации = Объект.ВидОперации;
			НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад", Истина);
			НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
			НСтрк = НовыйДокумент.Товары.Добавить();
			
			Для каждого СтрокаМассив из МассивКолонок Цикл
				ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;					
				ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;    
				Если ИмяКолонки = "Номенклатура" Тогда
					НСтрк.Номенклатура = Объект.Номенклатура;	
				ИначеЕсли 
					ИмяКолонки = "Количество" Тогда
					НСтрк.Количество = ТекущееЗначение;
				ИначеЕсли
					ИмяКолонки = "Цена" Тогда
					НСтрк.Цена = ТекущееЗначение;
				ИначеЕсли 
					ИмяКолонки = "Сумма" Тогда
					НСтрк.Сумма = НСтрк.Количество*НСтрк.Цена;
				ИначеЕсли 
					ИмяКолонки = "Ставка НДС" Тогда
					НСтрк.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
				КонецЕсли;
			КонецЦикла;
		КонецЦикла;
		НовыйДокумент.Записать(РежимЗаписиДокумента.ОтменаПроведения);
	КонецЦикла;
	Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
Иначе
	Сообщить("В Excel файле не достаточно данных для заполнения документа!");
КонецЕсли;

Excel.DisplayAlerts = 0; 
Excel.Quit();
Excel.DisplayAlerts = 1;		
Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
6. Octopus 337 20.11.18 08:13 Сейчас в теме
(5)
Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда
	ТекущийКонтрагент = Справочники.Контрагенты.ПустаяСсылка();
	ОсновнойСклад = Справочники.Склады.НайтиПоНаименованию("Основной склад", Истина);
	ВалютаДокумента = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
	НовыйДокумент = Неопределено;
	
    Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
        ТекущееЗначения = Excel.Cells(СтрокаОтсчета, 23).Text;
		
		Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина);
		
		Если Контрагент <> ТекущийКонтрагент Тогда
			Если НовыйДокумент <> Неопределено Тогда
				НовыйДокумент.Записать();
				Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
			КонецЕсли;
			
			НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            НовыйДокумент.Контрагент = Контрагент;
            НовыйДокумент.Дата = ТекущаяДата();
            НовыйДокумент.Организация = Объект.Организация;
            НовыйДокумент.ВидОперации = Объект.ВидОперации;
            НовыйДокумент.Склад = ОсновнойСклад;
            НовыйДокумент.ВалютаДокумента = ВалютаДокумента;
			
			ТекущийКонтрагент = Контрагент;
		КонецЕсли;
		
        НСтрк = НовыйДокумент.Товары.Добавить();
        Для каждого СтрокаМассив из МассивКолонок Цикл
            ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;                    
            ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;    
            Если ИмяКолонки = "Номенклатура" Тогда
                НСтрк.Номенклатура = Объект.Номенклатура;    
            ИначеЕсли 
                ИмяКолонки = "Количество" Тогда
                НСтрк.Количество = ТекущееЗначение;
            ИначеЕсли
                ИмяКолонки = "Цена" Тогда
                НСтрк.Цена = ТекущееЗначение;
            ИначеЕсли 
                ИмяКолонки = "Сумма" Тогда
                НСтрк.Сумма = НСтрк.Количество*НСтрк.Цена;
            ИначеЕсли 
                ИмяКолонки = "Ставка НДС" Тогда
                НСтрк.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Если НовыйДокумент <> Неопределено Тогда
		НовыйДокумент.Записать();
		Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
	КонецЕсли;
Иначе
    Сообщить("В Excel файле не достаточно данных для заполнения документа!");
КонецЕсли;

Excel.DisplayAlerts = 0; 
Excel.Quit();
Excel.DisplayAlerts = 1;        
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Octopus 337 20.11.18 07:52 Сейчас в теме
Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина)
возвращает ссылку на контрагента, а вы ее сравниваете с тектовым полем
Excel.Cells (СтрокаОтсчета,23).Text
Естественно, сравнение даст ложь. Сравнивайте вот это
СокрЛП(Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина))
3. Octopus 337 20.11.18 07:55 Сейчас в теме
Ну и вообще неплохо бы оптимизировать код. Зачем вам дважды поиск?
Если Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина)
и
НовыйДокумент.Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина)
если вернется одно и то же значение?

Зачем при обработке каждой строки искать
НовыйДокумент.Склад = Справочники.Склады.НайтиПоНаименованию("Основной склад", Истина);
            НовыйДокумент.ВалютаДокумента = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
если можно найти один раз до цикла?
4. skiopolitan 20.11.18 08:03 Сейчас в теме
5. skiopolitan 20.11.18 08:08 Сейчас в теме
(3)Теперь еще контрагенты не показываются
6. Octopus 337 20.11.18 08:13 Сейчас в теме
(5)
Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда
	ТекущийКонтрагент = Справочники.Контрагенты.ПустаяСсылка();
	ОсновнойСклад = Справочники.Склады.НайтиПоНаименованию("Основной склад", Истина);
	ВалютаДокумента = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
	НовыйДокумент = Неопределено;
	
    Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
        ТекущееЗначения = Excel.Cells(СтрокаОтсчета, 23).Text;
		
		Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(ТекущееЗначения, Истина);
		
		Если Контрагент <> ТекущийКонтрагент Тогда
			Если НовыйДокумент <> Неопределено Тогда
				НовыйДокумент.Записать();
				Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
			КонецЕсли;
			
			НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            НовыйДокумент.Контрагент = Контрагент;
            НовыйДокумент.Дата = ТекущаяДата();
            НовыйДокумент.Организация = Объект.Организация;
            НовыйДокумент.ВидОперации = Объект.ВидОперации;
            НовыйДокумент.Склад = ОсновнойСклад;
            НовыйДокумент.ВалютаДокумента = ВалютаДокумента;
			
			ТекущийКонтрагент = Контрагент;
		КонецЕсли;
		
        НСтрк = НовыйДокумент.Товары.Добавить();
        Для каждого СтрокаМассив из МассивКолонок Цикл
            ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;                    
            ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;    
            Если ИмяКолонки = "Номенклатура" Тогда
                НСтрк.Номенклатура = Объект.Номенклатура;    
            ИначеЕсли 
                ИмяКолонки = "Количество" Тогда
                НСтрк.Количество = ТекущееЗначение;
            ИначеЕсли
                ИмяКолонки = "Цена" Тогда
                НСтрк.Цена = ТекущееЗначение;
            ИначеЕсли 
                ИмяКолонки = "Сумма" Тогда
                НСтрк.Сумма = НСтрк.Количество*НСтрк.Цена;
            ИначеЕсли 
                ИмяКолонки = "Ставка НДС" Тогда
                НСтрк.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Если НовыйДокумент <> Неопределено Тогда
		НовыйДокумент.Записать();
		Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
	КонецЕсли;
Иначе
    Сообщить("В Excel файле не достаточно данных для заполнения документа!");
КонецЕсли;

Excel.DisplayAlerts = 0; 
Excel.Quit();
Excel.DisplayAlerts = 1;        
Показать
7. skiopolitan 20.11.18 08:55 Сейчас в теме
(6)Спс тебе огромное, выручил. Кстати я проверил, если в Эксель не стоит сортировка по контрагенту, то создает 81, с сортировкой 53. Это можно как то исправить? Чтобы каждый раз не приходилось сортировку делать.
8. Octopus 337 20.11.18 09:15 Сейчас в теме
(7)
Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда
	ОсновнойСклад = Справочники.Склады.НайтиПоНаименованию("Основной склад", Истина);
	ВалютаДокумента = Справочники.Валюты.НайтиПоНаименованию("руб.", Истина);
	
	СозданныеДокументы = Новый Соответствие;
	
    Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл
		Контрагент = Справочники.Контрагенты.НайтиПоНаименованию(Excel.Cells(СтрокаОтсчета, 23).Text, Истина);
		
		НовыйДокумент = СозданныеДокументы[Контрагент];
		Если НовыйДокумент = Неопределено Тогда
			НовыйДокумент = Документы.ПоступлениеТоваровУслуг.СоздатьДокумент();
            НовыйДокумент.Контрагент = Контрагент;
            НовыйДокумент.Дата = ТекущаяДата();
            НовыйДокумент.Организация = Объект.Организация;
            НовыйДокумент.ВидОперации = Объект.ВидОперации;
            НовыйДокумент.Склад = ОсновнойСклад;
            НовыйДокумент.ВалютаДокумента = ВалютаДокумента;
			
			СозданныеДокументы.Вставить(Контрагент, НовыйДокумент);
		КонецЕсли;
		
        НСтрк = НовыйДокумент.Товары.Добавить();
        Для каждого СтрокаМассив из МассивКолонок Цикл
            ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Value;                    
            ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text;    
            Если ИмяКолонки = "Номенклатура" Тогда
                НСтрк.Номенклатура = Объект.Номенклатура;    
            ИначеЕсли 
                ИмяКолонки = "Количество" Тогда
                НСтрк.Количество = ТекущееЗначение;
            ИначеЕсли
                ИмяКолонки = "Цена" Тогда
                НСтрк.Цена = ТекущееЗначение;
            ИначеЕсли 
                ИмяКолонки = "Сумма" Тогда
                НСтрк.Сумма = НСтрк.Количество*НСтрк.Цена;
            ИначеЕсли 
                ИмяКолонки = "Ставка НДС" Тогда
                НСтрк.СтавкаНДС = Перечисления.СтавкиНДС.БезНДС;
            КонецЕсли;
		КонецЦикла;
	КонецЦикла;
	
	Для каждого КлючИЗначение из СозданныеДокументы Цикл
		НовыйДокумент = КлючИЗначение.Значение;
		НовыйДокумент.Записать();
		Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент));
	КонецЦикла;
Иначе
    Сообщить("В Excel файле не достаточно данных для заполнения документа!");
КонецЕсли;

Excel.DisplayAlerts = 0; 
Excel.Quit();
Excel.DisplayAlerts = 1;        
Показать
Оставьте свое сообщение

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