helpf.pro
Регистрация

v8: Помогите доделать последнюю часть обработки, запутался совсем

Persempre
24.07.2012 21:50Прочитано: 3456
И так есть обработка, которая загружает данные из Excel файла в справочник "Места хранения" (который в свою очередь подчинен справочнику "Склады"). Всё хорошо в обработке она отрабатывает но отрабатывает так, что в коде у меня прописан владелец жестко, а мне хотелось бы добиться того чтоб владелец искался из колонки excel , допустим это будет колонка 2. Значения из этой колонки перебирались, находилось соответствие и оно записывалось как владелец элемента того справочника который добавляется.
обработку приложил, и как пример приложил excel
Код 1C v 8.х
 Процедура ИмяФайлаНачалоВыбора(Элемент, СтандартнаяОбработка)
	 	 // Отключение стандартной обработки
	 СтандартнаяОбработка = Ложь;
	 
	 // Выбор файла Microsoft Excel
	 ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	 ВыборФайла.Фильтр = "Документ Excel (*.xls)|*.xls";
	 ВыборФайла.ПроверятьСуществованиеФайла = Истина;
	 ВыборФайла.ПолноеИмяФайла = ИмяФайла;
	 Выбор = ВыборФайла.Выбрать();
	 Если НЕ Выбор Тогда
		 
		 Возврат;
		 
	 КонецЕсли;
	 
	 ИмяФайла = ВыборФайла.ВыбранныеФайлы[0];

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

Процедура ЧтениеXLSФайла(Элемент)
	
	Если ПустаяСтрока(ИмяФайла) Тогда
		Предупреждение("Для запуска обработки необходимо предварительно выбрать файл Microsoft Excel.");
		Возврат;
	КонецЕсли;
	
	Попытка
	 	// Загрузка Microsoft Excel
	 	Состояние("Загрузка Microsoft Excel...");
	 	ExcelПриложение = Новый COMОбъект("Excel.Application");
	Исключение
	 	Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
	 	Возврат;
	КонецПопытки;
	
	Попытка
		// Открытие файла Microsoft Excel
		Состояние("Открытие файла Microsoft Excel...");
		ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
	Исключение
		Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
	КонецПопытки;
	
	Попытка
		// Обработка файла Microsoft Excel
		Состояние("Обработка файла Microsoft Excel...");
		// Читаем данные первого листа книги
		ExcelЛист = ExcelФайл.Sheets(1);
		
		// Определить количество строк и колонок выбранного листа книги Excel
		xlCellTypeLastCell = 11;
		ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
		ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
	Исключение
		Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		// Закрыть COM соединение для экономии памяти
	 	ExcelПриложение.Quit();
	КонецПопытки;
	
	// Создание описателя типов для таблицы значений
	КЧ = Новый КвалификаторыЧисла(15,2);
	КС = Новый КвалификаторыСтроки(50);
	Массив = Новый Массив;
	Массив.Добавить(Тип("Строка"));
	ОписаниеТиповС = Новый ОписаниеТипов(Массив, , КС);
	Массив.Очистить();
	Массив.Добавить(Тип("Число"));
	ОписаниеТиповЧ = Новый ОписаниеТипов(Массив, , ,КЧ);
	
	// Очистить предыдущие значения
	ТаблицаДокумента.Очистить();
	ТаблицаДокумента.Колонки.Очистить();
	
	// Создать колонки табличного документа
	ТаблицаДокумента.Колонки.Добавить(ExcelЛист.Cells(1, 1).Value,ОписаниеТиповС,ExcelЛист.Cells(1, 1).Value,50);
    ТаблицаДокумента.Колонки.Добавить(ExcelЛист.Cells(1, 2).Value,ОписаниеТиповС,ExcelЛист.Cells(1, 2).Value,50);
    ТаблицаДокумента.Колонки.Добавить(ExcelЛист.Cells(1, 3).Value,ОписаниеТиповС,ExcelЛист.Cells(1, 3).Value,50);
    ТаблицаДокумента.Колонки.Добавить(ExcelЛист.Cells(1, 4).Value,ОписаниеТиповЧ,ExcelЛист.Cells(1, 4).Value,50);
	
	// Последовательное чтение строк с выбранного листа
	Для Строка = 2 По ExcelПоследняяСтрока Цикл
				
		// Обработка нажатия Ctrl + Break
		ОбработкаПрерыванияПользователя();
		
		// Добавить данные в табличную часть экранной формы
		Стр=ТаблицаДокумента.Добавить();
		Попытка
			Стр[0]           = ExcelЛист.Cells(Строка, 1).Value;
            Стр[1]			 = ExcelЛист.Cells(Строка, 2).Value;
            Стр[2]           = ExcelЛист.Cells(Строка, 3).Value;
            Стр[3]           = ExcelЛист.Cells(Строка, 4).Value;
		Исключение
			// Не редко происходит ошибка конвертации отдельной ячейки документа
			Сообщить("Ошибка чтения строки файла Microsoft Excel." + Строка + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
		КонецПопытки;
		// Отобразить информацию о ходе выполнения обработки
		Состояние("Обработка файла Microsoft Excel : "
		 + "строка " + Строка + " из " + ExcelПоследняяСтрока);
		 
	 КонецЦикла;
	 
	 // Закрыть COM соединение для экономии памяти
	 ExcelПриложение.Quit();
	 
	 // Отобразить результаты загрузки в форме элемента
	 ЭлементыФормы.ТаблицаДокумента.Значение = ТаблицаДокумента;
	 ЭлементыФормы.ТаблицаДокумента.СоздатьКолонки();
	 
 КонецПроцедуры // ЧтениеXLSФайла(Элемент)

 Процедура ОсновныеДействияФормыСоздать(Кнопка)
	  //ExcelЛист = ExcelФайл.Sheets(1);
	  //ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
	  //	  Наименование = ExcelЛист.Cells(Строка, "Стр[1]").Value;
	  //  	Элем = Справочники.МестаХранения.НайтиПоНаименованию("Стр[1]");
	  //  	НовЭл.Владелец = ?(Элем = Неопределено, Справочники.МестаХранения.ПустаяСсылка(), Элем);
	 
	 
	  Для Каждого Стр Из ТаблицаДокумента Цикл
	    НовЭл = Справочники.МестаХранения.СоздатьЭлемент();
	    НовЭл.Наименование = Стр[2];
	    НовЭл.Код = Стр[0];
	    НовЭл.Владелец = Стр[0];//Справочники.Склады.НайтиПоКоду("СОС-01000");
	    НовЭл.Записать();
	  КонецЦикла;
	 
	
 КонецПроцедуры
   
Yandex
Возможно, вас также заинтересует
Реклама на портале
alizgo
25.07.2012 03:52Ответ № 1
Так у тебя получается, что ты в ТЧ документа грузишь строки. Лучше сделать так: данные из файла писать в массив, а потом уже работать именно с массивом, тогда можно будет нормально устанавливать соответствия
Mokey
25.07.2012 09:44Ответ № 2
Так а проблема-то в чём?
Справочники.Склады.НайтиПоКоду(Стр[0]) - разве не отрабатывает? Или в чём причина?
Persempre
25.07.2012 11:38Ответ № 3
Когда я ищу по коду то в поле Владелец записывается значение которое соответствует коду из колонки 0, а там может быть и другое значение. И когда сделал код вида
Код 1C v 8.х
 НовЭл.Владелец = Стр[1];   
или
Код 1C v 8.х
 ]НовЭл.Владелец=Справочники.Склады.НайтиПоНаименованию("Стр[1]");   
то ругается на то что поле владелец не заполнено или заполнено неверно ) что с этим делать ума не приложу, вот и помощи прошу.
А по поводу того как писать в массив я вообще не знаю, я совсем недавно начал в 1С что-то делать, совсем зеленый ещё
alizgo
25.07.2012 13:23Ответ № 4
(3) Persempre, зачем ты стр[1] в кавычки включаешь? Убери кавычки, тогда нормально искать будет
Mokey
25.07.2012 13:36Ответ № 5
(4) alizgo, правильно глаголишь, а ещё проверку на нахождение в справочнике элемента, на всякий случай, чтобы была возможность обработать случай, когда элемент не найден по коду.
alizgo
25.07.2012 15:54Ответ № 6
(5) Mokey, это с самого начала надо было сделать. Без проверок в нашем деле вообще никуда)
Подсказка: Для быстрого перемещения к последнему ответу или к вопросу используйте или .
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.
Загрузка... Дождитесь завершения!