Перепись стандартной обработки во внешнюю. Ошибка

1. user1004898 28 12.03.19 20:27 Сейчас в теме
Есть "вшитая" обработка загрузки данных из Excel, которая подключена к документу ПеремещениеТоваров.

&НаКлиенте
Процедура ВыполнитьЗагрузкуИзФайла(Команда)
Если не ЗначениеЗаполнено(Объект.ПутьКФайлу) ТОгда
		предупреждение("Не указан файл для загрузки.");
		возврат;
	КонецЕсли;
	Файл = Новый Файл(Объект.ПутьКФайлу);
	Если не Файл.Существует() ТОгда
		Предупреждение("Указанный файл не существет. Выберите другой файл.");
		возврат;
	КонецЕсли;
	
	Попытка
		
		Эксель = ИнициализироватьExcel(Объект.ПутьКФайлу);
		
		Если Эксель = Неопределено Тогда
			
			Сообщить("Не удалось открыть файл Excel для получения данных об отгрузке. Проверьте путь к файлу данных: " + Объект.ПутьКФайлу, СтатусСообщения.Важное);		
			Возврат;
			
		КонецЕсли;
		
		МассивДанных = ПолучитьТаблицуДанныхИзExcel(Эксель);
		
		Эксель.Workbooks.Close();
		Эксель.Quit();
		
	Исключение
		
		Сообщить("Возникла ошибка при считывании документа Excel", СтатусСообщения.Важное);
		Сообщить(ОписаниеОшибки());
		
		Эксель.Workbooks.Close();
		Эксель.Quit();
		
		Возврат;
		
	КонецПопытки;
	
	Если МассивДанных = Неопределено Тогда
		возврат;	
	КонецЕсли;
	
	ЗагрузитьДанныеВДокумент(МассивДанных);
	//СтруктураВыбора = Новый Структура();
	//СтруктураВыбора.Вставить("АдресТоваровВХранилище", ПоместитьТоварыВХранилище(МассивДанных));
	//ОповеститьОВыборе(СтруктураВыбора);

		
КонецПроцедуры

&НаКлиенте
Функция ИнициализироватьExcel(ПутьКФайлуДанных)
	
	Состояние("Инициализация Excel...");
	
	Эксель = Неопределено;
	
	Попытка	
		Эксель = Новый COMОбъект("Excel.Application");
		Эксель.Workbooks.Open(ПутьКФайлуДанных);
	Исключение
		Сообщить(ОписаниеОшибки());
	КонецПопытки;
	
	Состояние("");
	
	Возврат Эксель;
	
КонецФункции

&НаКлиенте
Функция ПолучитьТаблицуДанныхИзExcel(Эксель)
	
	МассивДанных = Новый Массив;

    КоличествоСтрокВФайле = Эксель.Sheets(1).Cells.SpecialCells(11).Row();
	Индексы = ПолучитьИндексыExcel(Эксель, КоличествоСтрокВФайле);
	Если Индексы = неопределено Тогда
		Предупреждение("Файл не содержит данных.");
		Возврат Неопределено;	
	КонецЕсли;
	
	КолНоменклатура = Индексы.КолНоменклатура;
	КолКоличество = Индексы.КолКоличество;
	КолЦена = Индексы.КолЦена;
	КолНомер = Индексы.КолНомер;
	КолДата = Индексы.КолДата;
	Индекс = Индексы.Индекс;
	
	Пока Индекс < КоличествоСтрокВФайле + 1000 Цикл
			
		Индекс = Индекс + 1;
		
		Артикул = СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолНоменклатура).Text);
		Если ПустаяСтрока(Артикул) Тогда
			прервать;
		КонецЕсли;
		НоваяСтрока = Новый Структура;
		НоваяСтрока.Вставить("Номенклатура", ПолучитьНоменклатуру(Артикул));
		Попытка
			НоваяСтрока.Вставить("Количество", Число(СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолКоличество).Text)));
		Исключение
			НоваяСтрока.Вставить("Количество", 0);
		КонецПопытки;
	    Попытка
			НоваяСтрока.Вставить("Цена",Число(СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолЦена).Text)))
		Исключение
			НоваяСтрока.Вставить("Цена", 0);	
		КонецПопытки;
		Попытка
			НоваяСтрока.Вставить("Номер",СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолНомер).Text));
		Исключение
			НоваяСтрока.Вставить("Номер", "");
		КонецПопытки;
		
		Попытка
			ДатаПолная = Лев(СокрЛП(Эксель.Sheets(1).Cells(Индекс, КолДата).Text),10);
			Год = Прав(ДатаПолная, 4);
			День = Лев(ДатаПолная, 2);
			Месяц = Сред(ДатаПолная, 4,2);
			Дата = Дата("" + Год + Месяц + День);
			
			НоваяСтрока.Вставить("Дата",Дата);
		Исключение
			НоваяСтрока.Вставить("Дата", Дата("00010101"));
		КонецПопытки;
		МассивДанных.Добавить(НоваяСтрока);
	КонецЦикла;	
	
	Возврат МассивДанных;
КонецФункции

&НаКлиенте
Функция ПолучитьИндексыExcel(Эксель, КоличествоСтрокВФайле)
	
	//Если КоличествоСтрокВФайле > 20 Тогда
	//	КоличествоСтрокВФайле = 20;
	//КонецЕсли;
	индекс = 0;
	Пока Индекс < КоличествоСтрокВФайле Цикл
		Индекс = Индекс + 1;
		Для й = 1 по 10 Цикл
			Данные     = СокрЛП(Эксель.Sheets(1).Cells(Индекс, й).Text);
			Если ВРег(Данные) = "АРТИКУЛ" Тогда
				Индексы = Новый Структура;
				Индексы.Вставить("КолНоменклатура", й);
				Индексы.Вставить("КолКоличество", й + 1);
				Индексы.Вставить("КолЦена", й + 2);
				Индексы.Вставить("КолНомер", й + 3);
				Индексы.Вставить("КолДата", й + 4);
				Индексы.Вставить("Индекс", Индекс);
				Возврат Индексы;
			ИначеЕсли ЭтоЧисло(Данные) Тогда
				Индексы = Новый Структура;
				Индексы.Вставить("КолНоменклатура", й - 1);
				Индексы.Вставить("КолКоличество", й);
				Индексы.Вставить("КолЦена", й + 1);
				Индексы.Вставить("КолНомер", й + 2);
				Индексы.Вставить("КолДата", й + 3);
				Индексы.Вставить("Индекс", Индекс - 1);
				Возврат Индексы;
			КонецЕсли;
		КонецЦикла
	КонецЦикла;

	Возврат неопределено;
	
КонецФункции

&НаСервере
Функция ПолучитьНоменклатуру(Артикул)
	
	Номенклатура = Справочники.Номенклатура.ПустаяСсылка();
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Номенклатура.Ссылка
		|ИЗ
		|	Справочник.Номенклатура КАК Номенклатура
		|ГДЕ
		|	Номенклатура.ПометкаУдаления = ЛОЖЬ
		|	И Номенклатура.Артикул = &Артикул";
	Запрос.Параметры.Вставить("Артикул", Артикул);
	Результат = Запрос.Выполнить().Выбрать();
	Если Результат.Количество() > 1 Тогда
		сообщить("Найдено несколько позиций номенклатуры по артикулу: " + Артикул, СтатусСообщения.Важное);		
	ИначеЕсли Результат.Следующий() Тогда
		Номенклатура = Результат.Ссылка;			
	Иначе
		сообщить("Номенклатура по артикулу: " + Артикул + ", не найдена.", СтатусСообщения.Важное);	
	КонецЕсли;
	
	возврат Номенклатура;
	
КонецФункции

&НаКлиенте
Функция ЭтоЧисло(Данные)
	
	Попытка 
		Число = Число(Данные);
		возврат истина;
	Исключение
		возврат ложь;
	КонецПопытки;
	
КонецФункции

&НаКлиенте
Процедура ПутьКФайлуНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
		// Вставить содержимое обработчика.
	Режим = РежимДиалогаВыбораФайла.Открытие;
	ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим);
	ДиалогОткрытияФайла.ПолноеИмяФайла = "";
	Фильтр = "Документы Excel(*.xls; *.xlsx)|*.xls;*.xlsx";
	ДиалогОткрытияФайла.Фильтр = Фильтр;
	ДиалогОткрытияФайла.МножественныйВыбор = Ложь;
	ДиалогОткрытияФайла.Заголовок = "Выберите файл";
	Если ДиалогОткрытияФайла.Выбрать() Тогда
	    Объект.ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла;
	Иначе
	    Текст = "ru = ""Файл(ы) не выбран!""; en = ""File(s) not selected!""";
	    Предупреждение(НСтр(Текст));
	КонецЕсли; 

КонецПроцедуры

&НаКлиенте
Процедура ЗагрузитьДанныеВДокумент(ТаблицаДанных)
	
	Режим = РежимДиалогаВопрос.ДаНет;
	Если Объект.Товары.Количество() > 0 Тогда
		
		Ответ = Вопрос(НСтр("ru='Список ""Товары"" содержит данные. Очистить табличную часть?'"), Режим, 0, КодВозвратаДиалога.Да,);
		
		
		Если Ответ = КодВозвратаДиалога.Да Тогда
			Объект.Товары.Очистить();
		КонецЕсли;
	КонецЕсли;
	
	Для Каждого Строка из ТаблицаДанных Цикл   		
		
		НоваяСтрока = Объект.Товары.Добавить();
		
		НоваяСтрока.Номенклатура = Строка.Номенклатура;
		НоваяСтрока.КоличествоУпаковок = Строка.Количество;
		//НоваяСтрока.Цена = Строка.Цена;
		//НоваяСтрока.ДатаПоступления = Строка.Дата;
		ЗаполнитьСтроку(НоваяСтрока);
		                                                   		
	КонецЦикла;

	
	

КонецПроцедуры

Процедура ЗаполнитьСтроку(ТекущаяСтрока)
КонецПроцедуры	

Показать


Во время выполнения процедуры
Процедура ЗагрузитьДанныеВДокумент(ТаблицаДанных)
	
	Режим = РежимДиалогаВопрос.ДаНет;
	Если Объект.Товары.Количество() > 0 Тогда
		
		Ответ = Вопрос(НСтр("ru='Список ""Товары"" содержит данные. Очистить табличную часть?'"), Режим, 0, КодВозвратаДиалога.Да,);
		
		
		Если Ответ = КодВозвратаДиалога.Да Тогда
			Объект.Товары.Очистить();
		КонецЕсли;
	КонецЕсли;
	
	Для Каждого Строка из ТаблицаДанных Цикл   		
		
		НоваяСтрока = Объект.Товары.Добавить();
		
		НоваяСтрока.Номенклатура = Строка.Номенклатура;
		НоваяСтрока.КоличествоУпаковок = Строка.Количество;
		//НоваяСтрока.Цена = Строка.Цена;
		//НоваяСтрока.ДатаПоступления = Строка.Дата;
		ЗаполнитьСтроку(НоваяСтрока);
		                                                   		
	КонецЦикла;
КонецПроцедуры
Показать


В Товары попадают именно строки загружаемого документа Excel (ДанныеКоллекции).

Когда делаю внешней обработкой, то уже ругается на то, что Товары не определены

"{Обработка.ЗагрузкаНоменклатурыИзExcel.Форма.Форма.Форма(247)}: Поле объекта не обнаружено (Товары)
НоваяСтрока = Объект.Товары.Добавить();"

Как правильно инициализировать загрузку строк?
Прикрепленные файлы:
+
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1484 12.03.19 20:55 Сейчас в теме
(1) очевидно криво вы скопировали или не передали правильно контекст.
+
3. user790109 9 12.03.19 21:00 Сейчас в теме
А в Объекте обработки что хранится?) Объект."Документ.Ссылка".Товары ?
+
4. alxarz 31 12.03.19 21:09 Сейчас в теме
(3)
А в Объекте обработки что хранится?) Объект

раз внешняя, значит уже объект."внешняяобработка" )
+
5. user790109 9 12.03.19 21:25 Сейчас в теме
(4)у вас товары это табличная часть документа?
+
6. alxarz 31 12.03.19 21:32 Сейчас в теме
(5) если вопрос топикстартеру, то полагаю что да...
+
7. user790109 9 12.03.19 21:34 Сейчас в теме
(6) я уже и не обратил внимание кому отвечаю).. Есть вероятность что обработку он сделал внешней, но обращение к документу нет)
+
8. alxarz 31 12.03.19 21:36 Сейчас в теме
(7) вероятность 100% ))
надо бы заменить "объект", на "ссылкаНаДокумент"...
+
10. user1004898 28 12.03.19 22:35 Сейчас в теме
(8)
не очень, ругаесмя, что "Переменная не определена (СсылкаНаДокумент)"
+
11. user1004898 28 12.03.19 23:54 Сейчас в теме
(8)
переписал так:
Режим = РежимДиалогаВопрос.ДаНет;
	Если Объект.СсылкаНаОбъект.Товары.Количество() > 0 Тогда
		
		Ответ = Вопрос(НСтр("ru='Список ""Товары"" содержит данные. Очистить табличную часть?'"), Режим, 0, КодВозвратаДиалога.Да,);
		
		
		Если Ответ = КодВозвратаДиалога.Да Тогда
			Объект.СсылкаНаОбъект.Товары.Очистить();
		КонецЕсли;
	КонецЕсли;
	
	Для Каждого Строка из ТаблицаДанных Цикл   		
		
		НоваяСтрока = Объект.СсылкаНаОбъект.Товары.Добавить();
		
		НоваяСтрока.Номенклатура = Строка.Номенклатура;
		НоваяСтрока.Количество = Строка.Количество;
		//НоваяСтрока.Цена = Строка.Цена;
		//НоваяСтрока.ДатаПоступления = Строка.Дата;
		ЗаполнитьСтроку(НоваяСтрока);

		                                                   		
	КонецЦикла;
Показать


Создал для обработки Товары вТабличнойЧасти

Теперь получаю Поле объекта не обнаружено (Товары)

Такой реквизит в табличной части документа есть. Что не так теперь?
+
12. alxarz 31 13.03.19 03:46 Сейчас в теме
(11)
акой реквизит в табличной части документа есть. Что не так теперь?
ссылканаобъект должна указывать на документ, а не куда-то ещё

(11)
Создал для обработки Товары вТабличнойЧасти
это лишнее
+
15. bimy22 01.04.19 15:06 Сейчас в теме
(11) Что за конструкция "Объект.СсылкаНаОбъект"?
Просто СсылкаНаОбъект и в значениях прописать, на какой объект ссылаемся. Не совсем вас понимаю.
+
14. starjevschik 13.03.19 14:20 Сейчас в теме
(8) не ссылка, а объект документ...
+
9. user1004898 28 12.03.19 22:34 Сейчас в теме
13. Slypower 2 13.03.19 14:15 Сейчас в теме
А получать документ не нужно? Как же его потом сохранить?
+
Внимание! Тема сдана в архив

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