Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Заполнить справочник из xls файла  (Прочитано 8493 раз)
0 Пользователей и 1 Гость смотрят эту тему.
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
Модератор

us
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Модератор

us
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Модератор

us
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Модератор

us
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Модератор

us
Offline Offline
Пол: Мужской

WWW
« Ответ #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))
Еще раз спасибо большое))
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines