1. user1004898 4 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 522 12.03.19 20:55 Сейчас в теме
(1) очевидно криво вы скопировали или не передали правильно контекст.
3. user790109 5 12.03.19 21:00 Сейчас в теме
А в Объекте обработки что хранится?) Объект."Документ.Ссылка".Товары ?
4. alxarz 29 12.03.19 21:09 Сейчас в теме
(3)
А в Объекте обработки что хранится?) Объект

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

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


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

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

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

(11)
Создал для обработки Товары вТабличнойЧасти
это лишнее
14. starjevschik 13.03.19 14:20 Сейчас в теме
(8) не ссылка, а объект документ...
9. user1004898 4 12.03.19 22:34 Сейчас в теме
13. Slypower 13.03.19 14:15 Сейчас в теме
А получать документ не нужно? Как же его потом сохранить?
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Нижний Новгород
зарплата до 120 000 руб.
Полный день

Программист 1С
Волгоград
зарплата от 45 000 руб. до 90 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству

Консультант-аналитик 1С
Москва
зарплата от 70 000 руб. до 100 000 руб.
Полный день

Программист 1С
Москва
зарплата от 80 000 руб. до 120 000 руб.
Временный (на проект)