bannndi
Гость
|
|
« : 09-02-2009 08:07 » |
|
Здравствуйте!
Я учусь программировать в 8-ке, такой вопрос - нужно, что бы в данной процедуре отрабатывалась уникальность значений xls файла (по столбцу 1, к примеру), т.е. в справочник два раза не попадала одна и та жа позиция. Процедура ЗаполнитьСпрСервисЦентрыИзЭксельНажатие(Элемент) ConExcel=ПолучитьCOMОбъект("d:\Сервисы.xls"); Спр=Справочники.СервисЦентры; i=2; Пока СтрДлина(ConExcel.Sheets("Сервисы").Cells(i,2).Value)>0 Цикл НовыйЭлемент=Спр.СоздатьЭлемент(); z=ConExcel.Sheets("Сервисы").Cells(i,2).Value; НовыйЭлемент.Наименование=ConExcel.Sheets("Сервисы").Cells(i,2).Value; НовыйЭлемент.НомерСЦ=ConExcel.Sheets("Сервисы").Cells(i,1).Value; НовыйЭлемент.Записать(); i=i+1; КонецЦикла; КонецПроцедуры Или, если есть более грамотное решение по заполнению справочников, тоже интересно узнать профессиональное мнение, спасибо!
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #1 : 10-02-2009 06:52 » |
|
Попробуй так: Пока СтрДлина(ConExcel.Sheets("Сервисы").Cells(i,2).Value)>0 Цикл ПроверяемоеЗначение=ConExcel.Sheets("Сервисы").Cells(i,1).Value; Если Спр.Выбрать(,,Новый Структура("НомерСЦ",ПроверяемоеЗначение)).Следующий() Тогда Продолжить; КонецЕсли; НовыйЭлемент=Спр.СоздатьЭлемент();
|
|
|
Записан
|
|
|
|
bannndi
Гость
|
|
« Ответ #2 : 10-02-2009 17:33 » |
|
Спасибо за ответ,Kivals! Чего-то ругнулась на (,,Новый Структура, где 2 запятые. Может там чего-то определить тоже надо..? (Процедура или функция с указанным именем не определена) Не, ошибку выдает другую {Справочник.СервисЦентры.Форма.ФормаСписка(8)}: Ошибка при вызове метода контекста (Выбрать): Недопустимое значение параметра (параметр номер "3") Если Спр.Выбрать(,,Новый Структура("НомерСЦ",ПроверяемоеЗначение)).Следующий() Тогда Продолжить; Поставил признак индексации на реквизит НомерСЦ, так загрузка первый раз прошла, а во второй раз пошел бесконечный цикл,снял только через диспетчер задач. Пока ничего не придумал больше
|
|
« Последнее редактирование: 10-02-2009 17:34 от Алексей1153++ »
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #3 : 10-02-2009 22:29 » |
|
Сори - такое часто бывает бесконечный цикл из-за того, что я забыл прирастить индекс строки, потому мы крутимся в одной строке файла... Потому я стараюсь прирост писать в начале цикла: i=2-1; // уменьшим на 1, чтобы в цикле увеличить Пока Истина Цикл // бесконечный цикл - прерываем по условию i=i+1; Если СтрДлина(ConExcel.Sheets("Сервисы").Cells(i,2).Value)<=0 Тогда Прервать; КонецЕсли; // заметь - условие обратное ПроверяемоеЗначение=ConExcel.Sheets("Сервисы").Cells(i,1).Value; Если Спр.Выбрать(,,Новый Структура("НомерСЦ",ПроверяемоеЗначение)).Следующий() Тогда Продолжить; КонецЕсли; НовыйЭлемент=Спр.СоздатьЭлемент();
|
|
|
Записан
|
|
|
|
bannndi
Гость
|
|
« Ответ #4 : 11-02-2009 07:52 » |
|
Kivals, спасибо, сейчас поиспытываю! Такая история произошла - заполнились все 999 строк пустыми значениями.Только 2 из 4-х значения занеслись из
таблицы правильно)) Может не так чего-то сделал. Сейчас по другомуы делаю немного: ConExcel=ПолучитьCOMОбъект("d:\Сервисы.xls"); Спр=Справочники.СервисЦентры; i=1; Пока Истина Цикл i=i+1; Если СтрДлина(ConExcel.Sheets("Сервисы").Cells(i,1).Value)=0 Тогда Прервать КонецЕсли; ПроверяемоеЗначение=ConExcel.Sheets("Сервисы").Cells(i,1).Value; Если Спр.Выбрать(,,Новый Структура("НомерСЦ",ПроверяемоеЗначение)).Следующий() Тогда Продолжить; КонецЕсли; НовыйЭлемент=Спр.СоздатьЭлемент(); z=ConExcel.Sheets("Сервисы").Cells(i,2).Value; НовыйЭлемент.Наименование=ConExcel.Sheets("Сервисы").Cells(i,2).Value; НовыйЭлемент.НомерСЦ=ConExcel.Sheets("Сервисы").Cells(i,1).Value; НовыйЭлемент.Записать(); КонецЦикла; Kivals, очень помог, спасибо! Один инкремент оказался лишним)) Еще вопросик: не могу понять как сделать в том же цикле проверку и по второму полю, чтобы наименование если
пустое, то не заносить в справочник?
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #5 : 11-02-2009 09:05 » |
|
не могу понять как сделать в том же цикле проверку и по второму полю, чтобы наименование если пустое, то не заносить в справочник? Точно так же (тем же методом с использованием Продолжить): Если СтрДлина(ConExcel.Sheets("Сервисы").Cells(i,1).Value)=0 Тогда Прервать; КонецЕсли; Наименование=ConExcel.Sheets("Сервисы").Cells(i,2).Value; Если ПустаяСтрока(Наименование) Тогда Продолжить; КонецЕсли; ПроверяемоеЗначение=ConExcel.Sheets("Сервисы").Cells(i,1).Value; Если Спр.Выбрать(,,Новый Структура("НомерСЦ",ПроверяемоеЗначение)).Следующий() Тогда Продолжить; КонецЕсли;
ПустаяСтрока в отличии от СтрДлина "не замечает" пробелов, т.е. если у тебя строка из одних пробелов, табуляций и переносов строк - то ПустаяСтрока() вернет Истина, а СтрДлина() - длину строки в символах (не ноль)
|
|
|
Записан
|
|
|
|
bannndi
Гость
|
|
« Ответ #6 : 11-02-2009 14:41 » |
|
Наименование=ConExcel.Sheets("Сервисы").Cells("i,2").Value; Если ПустаяСтрока(Наименование) Тогда Продолжить; КонецЕсли; ПроверяемоеЗначение=ConExcel.Sheets("Сервисы").Cells(i,1).Value; Чего-то я так сделал, и выдала, вот блин)): {Справочник.СервисЦентры.Форма.ФормаСписка(10)}: Ошибка при вызове метода контекста (Cells): Произошла исключительная ситуация (0x80020005) Наименование=ConExcel.Sheets("Сервисы").Cells("i,2").Value;
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #7 : 11-02-2009 21:46 » |
|
Cells("i,2") и Cells(i,2) - это разные ячейки
|
|
|
Записан
|
|
|
|
bannndi
Гость
|
|
« Ответ #8 : 12-02-2009 06:24 » |
|
Cells("i,2") и Cells(i,2) - это разные ячейки )) Да, проглядел)). Таких наверно и не бывает как Cells("i,2") Все получилось,Kivals! Спасибо огромное! Если не трудно, поясни пож-ста, что делает эта строка? z=ConExcel.Sheets("Сервисы").Cells(i,2).Value;
|
|
|
Записан
|
|
|
|
bannndi
Гость
|
|
« Ответ #9 : 12-02-2009 06:40 » |
|
Я сейчас убрал эту строку, ничего не произошло плохого, видимо просто задается имя для значения Cells(i,2), но потом нигде не используется, ну ладно, разобрались)))
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #10 : 12-02-2009 12:15 » |
|
Если не трудно, поясни пож-ста, что делает эта строка? z=ConExcel.Sheets("Сервисы").Cells(i,2).Value; Присваивает переменной z значение из ячейки колонки "B" (2-й по счету) строки i на листе Сервисы активной книги. Тип значения определяется типом значения в ячейке.
|
|
|
Записан
|
|
|
|
bannndi
Гость
|
|
« Ответ #11 : 15-02-2009 11:04 » |
|
Если не трудно, поясни пож-ста, что делает эта строка? z=ConExcel.Sheets("Сервисы").Cells(i,2).Value; Присваивает переменной z значение из ячейки колонки "B" (2-й по счету) строки i на листе Сервисы активной книги. Тип значения определяется типом значения в ячейке. Ну да, я почти так же сказал, Kivals)) Еще раз спасибо большое))
|
|
|
Записан
|
|
|
|
|