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

v8: Загрузка данных из Excel

Ermak
30.10.2012 22:41Прочитано: 7148
Подскажите что не так?
Существует справочник Групповые, в справочнике есть реквизит наименование, район и табличная часть Улицы (Реквизиты - Улица и Дом). Есть файл excel с колонками Район, Улица, Дом. Пытаюсь закачать файл с проверкой по, загрузить в табличную часть улицы и дома с одинаковым районом.

Код 1C v 8.х
 Процедура КнопкаВыполнитьНажатие(Кнопка)

//проверим что файл существует
ФайлНаДиске = Новый Файл(Файл);
Если Не ФайлНаДиске.Существует() Тогда
Предупреждение("Файл не найден!");
Возврат;
КонецЕсли;

Ex = ПолучитьТаблицуExcel(Файл);


Спр = Справочники.Групповые;

НС = 1;
Пока Истина Цикл
Если Спр.НайтиПоРеквизиту("Район", ) = СокрЛП(Ex.Cells(НС,1).Value) Тогда
Об=Спр.СоздатьЭлемент();
К=Об.Улицы.Добавить();
К.Улица = СокрЛП(Ex.Cells(НС,2).Value);
К.Дом = СокрЛП(Ex.Cells(НС,3).Value);

Об.Записать();
Сообщить("-Создан элемент: "+Об.Наименование);
КонецЕсли;

#Если Клиент Тогда
Состояние("Номер обработанной строки: " + НС);
#КонецЕсли
НС = НС + 1;
КонецЦикла;
Ex.Quit();

КонецПроцедуры
Yandex
Возможно, вас также заинтересует
Реклама на портале
Ermak
31.10.2012 11:40Ответ № 1
????
Ermak
31.10.2012 17:02Ответ № 2
Подскажите!
Mokey
31.10.2012 17:21Ответ № 3
а что Вас не устраивает?
код ни о чём.
сравниваете несравнимые типы, это для начала
потом цикл по ИСТИНА где прерывается?
Изменено 31.10.12 17:24:10
Ermak
31.10.2012 17:27Ответ № 4
*09
Ermak
31.10.2012 17:42Ответ № 5
А как мне поставить условие, если реквизит РУ = значению в Колонка1 тогда заполняем Табличную часть
Mokey
31.10.2012 17:54Ответ № 6
Код 1C v 8.х
 
Если СокрЛП(Ex.Cells(НС,1).Value) = "" Тогда Прервать КонецЕсли; //это выход из цикла
ЗначениеРУ = СокрЛП(Ex.Cells(НС,1).Value); //считываем значение
Если НЕ Спр.НайтиПоРеквизиту("Район", ЗначениеРУ).Пустая() Тогда //ищем по реквизиту
.....
КонецЕсли;
Ermak
31.10.2012 18:42Ответ № 7
че та не добавляет а создает новые пустые документы

Код 1C v 8.х
 //проверим что файл существует
ФайлНаДиске = Новый Файл(Файл);
Если Не ФайлНаДиске.Существует() Тогда
Предупреждение("Файл не найден!");
Возврат;
КонецЕсли;

Ex = ПолучитьТаблицуExcel(Файл);


Спр = Справочники.Групповые;

НС = 1;
Пока Истина Цикл
Если СокрЛП(Ex.Cells(НС,1).Value) = "" Тогда
Прервать
КонецЕсли; //это выход из цикла

ЗначениеРУ = СокрЛП(Ex.Cells(НС,1).Value); //считываем значение

Если НЕ Спр.НайтиПоРеквизиту("РУ", ЗначениеРУ).Пустая() Тогда //ищем по реквизиту
Об=Спр.СоздатьЭлемент();
К=Об.Улицы.Добавить();
К.Улица = СокрЛП(Ex.Cells(НС,2).Value);
К.Дом = СокрЛП(Ex.Cells(НС,3).Value);

Об.Записать();
Сообщить("-Создан элемент: "+Об.Наименование);
КонецЕсли;

#Если Клиент Тогда
Состояние("Номер обработанной строки: " + НС);
#КонецЕсли
НС = НС + 1;
КонецЦикла;
Ex.Quit();

Изменено 31.10.12 18:43:56
Mokey
01.11.2012 10:01Ответ № 8
(7) Ermak, давайте определимся, что Вы хотите получить. В вышеприведённом коде написано, что если нашли элемент с искомым значением, то добавляем новый элемент справочника (создаём) и заполняем его ТЧ.Улицы. Естесственно, что элемент как бы пустой (нет наименования). Я так подозреваю, что Вы хотите отредактировать найденный элемент, тогда надо получить найденный объект, код будет примерно таким:
Код 1C v 8.х
 
ЗначениеРУ = СокрЛП(Ex.Cells(НС,1).Value); //считываем значение
НайденныйЭлемент = Спр.НайтиПоРеквизиту("РУ", ЗначениеРУ); //ищем по реквизиту
Если НЕ НайденныйЭлемент.Пустая() Тогда //проверка, нашли - не нашли
Об=НайденныйЭлемент.ПолучитьОбъект();
Иначе
Об=Спр.СоздатьЭлемент();
Об.РУ=ЗначениеРУ;
КонецЕсли;
//здесь заполняем ТЧ.Улицы объекта
...

Изменено 01.11.12 10:05:06
Ermak
01.11.2012 11:20Ответ № 9
Вы правильно подозреваете )
Я проверил, сначала стала заполнять и создавать еще пустые новые документы, но теперь опять выдает ошибку
{Форма.Форма.Форма(35)}: Значение не является значением объектного типа (Улицы)
ТЧ = Об.Улицы.Добавить();


Код 1C v 8.х
 Процедура КнопкаВыполнитьНажатие(Кнопка)

//проверим что файл существует
ФайлНаДиске = Новый Файл(Файл);
Если Не ФайлНаДиске.Существует() Тогда
Предупреждение("Файл не найден!");
Возврат;
КонецЕсли;

Ex = ПолучитьТаблицуExcel(Файл);

Спр = Справочники.Групповые;

НС = 1;
Пока Истина Цикл
Если СокрЛП(Ex.Cells(НС,1).Value) = "" Тогда
Прервать
КонецЕсли; //это выход из цикла

ЗначениеРУ = СокрЛП(Ex.Cells(НС,1).Value); //считываем значение
ЗначениеРУ2 = СокрЛП(Ex.Cells(НС,2).Value);
ЗначениеРУ3 = СокрЛП(Ex.Cells(НС,3).Value);
ЗначениеРУ4 = СокрЛП(Ex.Cells(НС,4).Value);


НайденныйЭлемент = Спр.НайтиПоРеквизиту("РУ", ЗначениеРУ); //ищем по реквизиту

Если НЕ НайденныйЭлемент.Пустая() Тогда //проверка, нашли - не нашли
Об=НайденныйЭлемент.ПолучитьОбъект();
Иначе
Сообщить ("Все!!!")
КонецЕсли;
ТЧ = Об.Улицы.Добавить();
ТЧ.Улица = ЗначениеРУ2;
ТЧ.Дом = ЗначениеРУ3 ;
ТЧ.Кв = ЗначениеРУ4 ;

Об.Записать();
Сообщить("-Создан элемент: "+Об.Наименование);


#Если Клиент Тогда
Состояние("Номер обработанной строки: " + НС);
#КонецЕсли
НС = НС + 1;
КонецЦикла;
Ex.Quit();
КонецПроцедуры


Ничего вроде не делал, а почему ошибка не пойму. И еще вот ТЧ.Улица имеет тип Строка, а мне надо Тип Справочники , если ставлю тип справочники тогда не заполняет.
Mokey
01.11.2012 11:24Ответ № 10
Ошибку выдаёт потому, что вываливается в ИНАЧЕ, объекта в этом случае нет, допишите тогда выход из процедуры или продолжить цикл.
Код 1C v 8.х
 
Если НЕ НайденныйЭлемент.Пустая() Тогда //проверка, нашли - не нашли
Об=НайденныйЭлемент.ПолучитьОбъект();
Иначе
Сообщить ("Все!!!");
Прервать; // или Продолжить;

КонецЕсли;
Ermak
01.11.2012 11:26Ответ № 11
Все разобрался с ошибкой, подскажите по этому вопросу как быть

И еще вот ТЧ.Улица имеет тип Строка, а мне надо Тип Справочники , если ставлю тип справочники тогда не заполняет.
Mokey
01.11.2012 11:28Ответ № 12
С типом Справочник - да, записывать не будет, потому что надо искать ссылку в справочнике и записывать найденную ссылку.
Код 1C v 8.х
 
УлицаСсылка = Справочники.Улицы.НайтиПоНаименованию(ЗначениеРУ2); //например, я не знаю, как Ваш справочник с улицами называется
ТЧ.Улица = УлицаСсылка;
Ermak
01.11.2012 11:45Ответ № 13
Спасибо получилось.

В форме списка справочника у меня добавлена Табличное поле с колонками Улица, Дом, Квартира , я пытаюсь загрузить данные с формы документа ТЧ.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГрупповыеУлицы.НомерСтроки КАК Колонка4,
| ГрупповыеУлицы.Улица КАК Колонка1,
| ГрупповыеУлицы.Дом КАК Колонка2,
| ГрупповыеУлицы.Кв КАК Колонка3
|ИЗ
| Справочник.Групповые.Улицы КАК ГрупповыеУлицы";
Результат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.Значение = Результат;


Смысл в чем, в форме списка, когда нажимаешь на строчку в ТП показываются улицы которые принадлежат данной улице из списка.
Я в какое событие поставить?
Mokey
01.11.2012 12:07Ответ № 14
(13) Ermak, не понял вопроса, к сожалению
Mokey
01.11.2012 12:08Ответ № 15
вообще есть событие ПриАктивацииСтроки()
Ermak
01.11.2012 12:15Ответ № 16
При этом событии не работает!

Постараюсь еще раз объяснить:
В Форме списка Табличного поля СправочникСписок добавил еще Табличное поле ТабличноеПоле1 в которой будет выводиться информация с Табличной части Формы Элемента. Т.е нажатии на строчку в СправочникСписок выводится информация ТабличноеПоле1
Mokey
01.11.2012 13:45Ответ № 17
(15) Mokey,

Процедура СправочникСписокПриАктивацииСтроки()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ГрупповыеУлицы.НомерСтроки КАК Колонка4,
| ГрупповыеУлицы.Улица КАК Колонка1,
| ГрупповыеУлицы.Дом КАК Колонка2,
| ГрупповыеУлицы.Кв КАК Колонка3
|ИЗ
| Справочник.Групповые.Улицы КАК ГрупповыеУлицы
|ГДЕ //тут условие надо поставить на данные из текущей строки";
Результат = Запрос.Выполнить().Выгрузить();
ЭлементыФормы.ТабличноеПоле1.Значение = Результат;
ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки();
КонецПроцедуры

Изменено 01.11.12 13:49:07
Mokey
01.11.2012 13:51Ответ № 18
а вообще, подумал сейчас, зачем огород городить? это же ТЧ элемента, поэтому надо в значение ТабличноеПоле1 выставить ТЧ.Улицы и связать два поля поля Ссылке.
Всё делается без единой строчки кода.
Изменено 01.11.12 13:53:13
Ermak
01.11.2012 14:35Ответ № 19
Спасибо разобрался! )

Я пытаюсь с Excel загрузить документ там есть колонка с датой, я пытаюсь загрузить в реквиз дата и он выдает ошибку

{Форма.Форма.Форма(22)}: Ошибка при вызове метода контекста (Записать)
Об.Записать();
по причине:
Значение поля "Дата" не может быть пустой датой


Процедура КнопкаВыполнитьНажатие(Кнопка)

//проверим что файл существует
ФайлНаДиске = Новый Файл(Файл);
Если Не ФайлНаДиске.Существует() Тогда
Предупреждение("Файл не найден!");
Возврат;
КонецЕсли;

Ex = ПолучитьТаблицуExcel(Файл);

Док = Документы.Заправка;
НС = 1;
Пока Истина Цикл
Об=Док.СоздатьДокумент();
Об.Дата = СокрЛП(Ex.Cells(НС,1).NumberFormat="ДД.ММ.ГГГГ");
Об.Улица = СокрЛП(Ex.Cells(НС,2).Value);
Об.Дом = СокрЛП(Ex.Cells(НС,3).Value);
Об.Кол = СокрЛП(Ex.Cells(НС,4).Value);
Об.РУ = СокрЛП(Ex.Cells(НС,5).Value);
Об.Записать();
Сообщить("-Создан элемент: "+Об.Улица);

//Если Об.Улица = "" Тогда
// Прервать;
// КонецЕсли;

#Если Клиент Тогда
Состояние("Номер обработанной строки: " + НС);
#КонецЕсли
НС = НС + 1;
КонецЦикла;
Ex.Quit();


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


Что не так?
Mokey
01.11.2012 15:24Ответ № 20
Пытаетесь в реквизит с типом дата вписать строку. Переводите полученную строку из экселя в дату.
Ermak
01.11.2012 15:42Ответ № 21
КАК?
Mokey
01.11.2012 15:50Ответ № 22
Если выложите, что выдаёт выражение Ex.Cells(НС,1).NumberFormat="ДД.ММ.ГГГГ", то смогу Вам помочь, хотя на вопрос "КАК?" посылаются обычно читать синтаксис-помощник. Да, и ещё, в каком виде в экселе дата забита?
Ermak
01.11.2012 15:58Ответ № 23
02.01.2007
Mokey
01.11.2012 16:03Ответ № 24
Тогда надо так:
Дата(СокрЛП(Ex.Cells(НС,1).NumberFormat="ГГГГММДД"))
Ermak
01.11.2012 16:14Ответ № 25
А что за переменная Дата ?

У меня строчка такая

Код 1C v 8.х
 Об.Дата = СокрЛП(Ex.Cells(НС,1).NumberFormat="ДД.ММ.ГГГГ");   
Mokey
01.11.2012 16:26Ответ № 26
Это не переменная, это функция преобразования. Я всё написал.
Ermak
01.11.2012 16:37Ответ № 27
Выдает ошибку

{Форма.Форма.Форма(17)}: Преобразование значения к типу Дата не может быть выполнено
Об.Дата=Дата(СокрЛП(Ex.Cells(НС,1).NumberFormat="ГГГГММДД"));
Mokey
01.11.2012 16:48Ответ № 28
А я Вас просил показать, что на выходе выражения Ex.Cells(НС,1).NumberFormat="ГГГГММДД"
Ermak
01.11.2012 16:52Ответ № 29
Выложил обработку и файл Скачивать файлы может только зарегистрированный пользователь!
Изменено 01.11.12 16:53:54
Mokey
01.11.2012 16:55Ответ № 30
да мне обработка не нужна, данных всё равно нет
Ermak
01.11.2012 17:01Ответ № 31
перезагрузил с данными (Excel)
Mokey
01.11.2012 17:16Ответ № 32
битый архив, не буду качать, проблема плёвая
Ermak
01.11.2012 17:18Ответ № 33
Перегрузил Скачивать файлы может только зарегистрированный пользователь!
Mokey
01.11.2012 17:39Ответ № 34
Вы мне по-порядку напишите значения выражений:
1. Ex.Cells(НС,1)
2. СокрЛП(Ex.Cells(НС,1).NumberFormat="ДД.ММ.ГГГГ")
Изменено 01.11.12 17:40:02
Ermak
01.11.2012 22:19Ответ № 35
Значение в 1 колонки 02.01.2007
Ermak
02.11.2012 09:05Ответ № 36
Тип значения : Дата
Состав даты : Дата и время
Mokey
02.11.2012 09:33Ответ № 37
Тогда Вам надо просто написать:
Об.Дата=Ex.Cells(НС,1);

Пы.Сы. Архив всё равно битый))
Ermak
02.11.2012 09:47Ответ № 38
Ошибку выдает

{Форма.Форма.Форма(27)}: Ошибка при вызове метода контекста (Записать)
Об.Записать();
по причине:
Значение поля "Дата" не может быть пустой датой


Перезалил на обменник http://zalil.ru/33917826
Mokey
02.11.2012 11:57Ответ № 39
я Вас столько раз просил прислать мне то-то и то-то....
1. Ex.Cells(НС,1) - это комобъект
2.Ex.Cells(НС,1).NumberFormat="ДД.ММ.ГГГГ" - это сравнение, соответственно возвращает булево

3. Ex.Cells(НС,1).Value - строка с Вашей датой, именно строка, и чтобы преобразовать её в дату надо функцию написать, например, я такую написал:
Код 1C v 8.х
 
Функция ПреобразоватьВДату(ДатаСтрокой)
Если (ДатаСтрокой="00000000") или (ДатаСтрокой="") тогда
Возврат Дата(0001,01,01);
Иначе
Если СтрДлина(Сред(ДатаСтрокой,7)) > 2 Тогда
ГодСтрокой = Сред(ДатаСтрокой,7);
Иначе
ГодСтрокой = "20"+Сред(ДатаСтрокой,7);
КонецЕсли;
Возврат Дата(Число(ГодСтрокой),Число(Сред(ДатаСтрокой,4,2)),Число(Сред(ДатаСтрокой,1,2)));
КонецЕсли;
КонецФункции //


Тогда применительно в Вашей задаче:
Об.Дата = ПреобразоватьВДату(СтрЗаменить(СокрЛП(Ex.Cells(НС,1).Value),".",""));
Ermak
02.11.2012 12:02Ответ № 40
Спасибо большое, я не знал теперь буду знать!!!!! )
Ermak
02.11.2012 12:03Ответ № 41
Вопрос закрыт!
Ermak
02.11.2012 12:07Ответ № 42
А что может быть такое, загрузка пошла, дошла до 700 строки и выдала ошибку

{Форма.Форма.Форма(83)}: Преобразование значения к типу Дата не может быть выполнено
Возврат Дата(Число(ГодСтрокой),Число(Сред(ДатаСтрокой,4,2)),Число(Сред(ДатаСтрокой,1,2)));
Mokey
02.11.2012 12:21Ответ № 43
Посмотрите в экселе 700-ю строку
Ermak
02.11.2012 12:25Ответ № 44
Смотрел тоже сам что и все
Ermak
02.11.2012 12:38Ответ № 45
вычислил строка 654 последнюю загружает там значение Даты 31.01.2007 а вот на строка следующая 655 значение 01.02.2007 выдает ошибку

{Форма.Форма.Форма(83)}: Преобразование значения к типу Дата не может быть выполнено
Возврат Дата(Число(ГодСтрокой),Число(Сред(ДатаСтрокой,4,2)),Число(Сред(ДатаСтрокой,1,2)));
Mokey
02.11.2012 12:49Ответ № 46
Проанализруйте, что в ячейке в выражении СтрЗаменить(СокрЛП(Ex.Cells(НС,1).Value),".","")
Ermak
02.11.2012 12:54Ответ № 47
В том то и дело что формат ячеек у всех одинаковый и значение у ее 01.02.2007
Ermak
02.11.2012 14:21Ответ № 48
Загружаю данные для документа выдает ошибку

{Форма.Форма.Форма(82)}: Преобразование значения к типу Дата не может быть выполнено
Возврат Дата(Число(ГодСтрокой),Число(Сред(ДатаСтрокой,4,2)),Число(Сред(ДатаСтрокой,1,2)));


Почему опять?
E_Migachev
02.11.2012 14:28Ответ № 49
(48) Ermak, смотри чему равно на момент ошибки значение ДатаСтрокой, видимо в excel файле что-то не то стоит в считываемой ячейке
Ermak
02.11.2012 14:44Ответ № 50
Все там стоит я не понимаю почему опять не грузит *15
Я залил на обменник http://zalil.ru/33918739
Ermak
02.11.2012 15:03Ответ № 51
А может быть проблема из за того что у меня язык стоит EN а не RU, мне надо менять в панели управления????
E_Migachev
02.11.2012 15:07Ответ № 52
язык не причем, проверяй отладчиком входные из екселя данные
Ermak
02.11.2012 16:22Ответ № 53
Я переделал функцию Преобразовать в дату и все пошло

Код 1C v 8.х
  стрДата_ = СокрЛП(СтрЗаменить(стрДата,".",""));
датДата = Сред(стрДата_,5)+Сред(стрДата_,3,2)+Лев(стрДата_,2);
Если СтрДлина(стрДата_)=6 Тогда
датДата = "20"+датДата;
КонецЕсли;
Возврат Дата(датДата);


Подскажите вот я закачиваю информацию в справочник, есть реквизит Тип Справочники.Имя я прописал

Код 1C v 8.х
 УлицаСсылка = Справочники.Адреса.НайтиПоНаименованию(ЗначениеРУ2);   


а если я закачиваю в документ с реквизитом типом Справочники.Имя, как тогда прописать?
E_Migachev
02.11.2012 16:53Ответ № 54
Имя - Это такой справочник? а зачем его в документ?
Ermak
02.11.2012 17:02Ответ № 55
У документа есть реквизит :
Район-Поле ввода Ти Значения - Справочник.Район

Когда загружаю данные то значение пустое
E_Migachev
02.11.2012 17:40Ответ № 56
код загрузки покажи
Ermak
03.11.2012 00:36Ответ № 57
Код 1C v 8.х
 Процедура КнопкаВыполнитьНажатие(Кнопка)

//проверим что файл существует
ФайлНаДиске = Новый Файл(Файл);
Если Не ФайлНаДиске.Существует() Тогда
Предупреждение("Файл не найден!");
Возврат;
КонецЕсли;

Ex = ПолучитьТаблицуExcel(Файл);

Док = Документы.Потери;
НС = 1;

ЗначениеР1 = СокрЛП(Ex.Cells(НС,4).Value);
ЗначениеР2 = СокрЛП(Ex.Cells(НС,4).Value);

Пока Истина Цикл

Об=Док.СоздатьДокумент();
Об.Дата = ИзСтрокиВДату(СокрЛП(Ex.Cells(НС,1).Value2));
Об.Район = ЗначениеР1;
Об.Кол = СокрЛП(Ex.Cells(НС,3).Value);
Об.Вид = ЗначениеР2;
Об.Записать(РежимЗаписиДокумента.Проведение);

Сообщить("-Создан элемент: "+Об.Дата + "---"+"№"+""+ НС);


#Если Клиент Тогда
Состояние("Номер обработанной строки: " + НС);
#КонецЕсли
НС = НС + 1;
КонецЦикла;


Ex.Quit();


КонецПроцедуры
Mokey
06.11.2012 11:16Ответ № 58
По аналогии ищите в справочнике Район элемент с наименованием ЗначениеР1.
Ermak
06.11.2012 11:44Ответ № 59
Спасибо разобрался, все загрузилось

Код 1C v 8.х
 //проверим что файл существует
ФайлНаДиске = Новый Файл(Файл);
Если Не ФайлНаДиске.Существует() Тогда
Предупреждение("Файл не найден!");
Возврат;
КонецЕсли;

Ex = ПолучитьТаблицуExcel(Файл);

Док = Документы.Потери;
НС = 1;

ЗначениеР1 = СокрЛП(Ex.Cells(НС,2).Value);
ЗначениеР2 = СокрЛП(Ex.Cells(НС,4).Value);

Пока Истина Цикл

РайонСслка = Справочники.Район.НайтиПоНаименованию(ЗначениеР1);
ВидСсылка = Справочники.ВидПотери.НайтиПоНаименованию(ЗначениеР2);

Об=Док.СоздатьДокумент();
Об.Дата = ИзСтрокиВДату(СокрЛП(Ex.Cells(НС,1).Value2));
Об.Район = РайонСслка;
Об.Кол = СокрЛП(Ex.Cells(НС,3).Value);
Об.Вид = ВидСсылка;
Об.Записать(РежимЗаписиДокумента.Проведение);

Сообщить("-Создан элемент: "+Об.Дата + "---"+"№"+""+ НС);


#Если Клиент Тогда
Состояние("Номер обработанной строки: " + НС);
#КонецЕсли
НС = НС + 1;
КонецЦикла;


Ex.Quit();


но с данными беда какая та, загрузились одинаковые данные, с одним районом, хотя в файле данные разные
Mokey
06.11.2012 12:07Ответ № 60
Потому что Вы ЗначениеР1 вне цикла вычислили и подсовываете его каждый раз
Ermak
06.11.2012 13:40Ответ № 61
Разобрался спасибо большое!
Подсказка: Для быстрого поиска ответов - используйте 'Поиск'
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.