7.7 Загрузка данных из файла

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Necrodamus, 15 сен 2010.

  1. TopicStarter Overlay
    Necrodamus
    Offline

    Necrodamus Опытный в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    57
    Симпатии:
    0
    Баллы:
    26
    Доброго времени суток.
    Подскажите, возможно ли из файла,например .xml, загрузить данные в элемент формы "Список"?
    P.S.Или возможно существует другой способ - мне нужно в "Список"(фильтр по товарам) запихнуть сотню позиций,чтобы не набирать их в ручную.
  2. TopicStarter Overlay
    Necrodamus
    Offline

    Necrodamus Опытный в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    57
    Симпатии:
    0
    Баллы:
    26
    В-принципе,хотя бы просто подскажите как прочитать данные в ТЗ допустим?
  3. TopicStarter Overlay
    Necrodamus
    Offline

    Necrodamus Опытный в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    57
    Симпатии:
    0
    Баллы:
    26
    Вот что получилось наваять:
    Код:
    ТЗ = СоздатьОбъект("СписокЗначений");
    Ном = СоздатьОбъект("Справочник.Номенклатура");
    Если ПустоеЗначение(ИмяФайлаЗагрузки)=1 Тогда 
    Предупреждение("Укажите файл", 5);
    Возврат;
    ИначеЕсли ФС.СуществуетФайл(ИмяФайлаЗагрузки)=0 Тогда
    Предупреждение("Указанный файл не существует!", 5);
    Возврат;
    КонецЕсли; 
    
    Попытка
    XL = СоздатьОбъект("Excel.Application");
    Исключение
    Предупреждение(ОписаниеОшибки()+"; не могу запустить Excel.Application");
    СтатусВозврата(0);
    КонецПопытки; 
    
    Книга = XL.WorkBooks.Open(ИмяФайлаЗагрузки);
    Лист1 = Книга.WorkSheets("Sheet1"); 
    
    RowMax = Лист1.UsedRange.Rows.Count + Лист1.UsedRange.Row - 1;
    For i = 1 To RowMax Do
    а = Лист1.Cells(i, 2).Value;
    Если Ном.НайтиПоНаименованию(а) = 1 Тогда
    тз.ДобавитьЗначение(Ном.ТекущийЭлемент());
    КонецЕсли;
    EndDo; 
    
    XL.Quit();
    XL=""; 
    
    
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Материал = Документ.ПриходнаяНакладная.Материал;
    |Сдатчик = Документ.ПриходнаяНакладная.Сдатчик;
    |Группировка Материал;
    |Условие(Материал в ТЗ);
    |";
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Запр");
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
    Таб.ВывестиСекцию("Материал");
    КонецЦикла;
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Запр", "");
    
    
    
    Чую,что где-то ошибся, но не нахожу...
  4. Time dont wait
    Offline

    Time dont wait Опытный в 1С

    Регистрация:
    20 окт 2009
    Сообщения:
    192
    Симпатии:
    0
    Баллы:
    26
    Кажется xml, или все-таки xls ?
  5. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Ну вроде все верно, ток это не xml, а эксель.
    Что собственно смущает? Таблица пустая? Проверь имя листа книги, проверь длину списка со странным именем "ТЗ". Мне както не нарвится такой способ перебора, предпочтительнее имхо цикл с проверкой пустого значения типа
    Код:
    While EmptyValue(TrimAll(Sheet.Cells(nStr,nColView).Text))=0 Do
    
    ИмяФайлаЗагрузки - это реквизит формы? тогда СокрЛП.
    Что еще.. лучше книгу открывать в фоне
  6. TopicStarter Overlay
    Necrodamus
    Offline

    Necrodamus Опытный в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    57
    Симпатии:
    0
    Баллы:
    26
    Я знаю,что это excel,просто изначально думал,что через xml будет проще и быстрее,но потом передумал.
    Проблема в том,что условие не работает...Запрос возврвщает мне все материалы, а непосредственно чтение из файла происходит замечательно.
    Что подскажите?
  7. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.523
    Симпатии:
    407
    Баллы:
    104
    А если так:
    Код:
    Если Ном.НайтиПоНаименованию(СокрЛП(а)) = 1 Тогда            
    тз.ДобавитьЗначение(Ном.ТекущийЭлемент());        
    КонецЕсли;
    
    
  8. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Ну, давай подумаем сначала что ты собственно хотел сделать своим запросом? Если просто заполнить список ссылками на элементы справочника то документы тут не причем. В общем обрисуй задачу, что за список у тебя имеется и нужно ли его вообще из внешнего файла грузить, и что ты хочешь видеть на выходе.. Ибо что-то сдается мне что результат этого запроса у тебя получится не таким каким ты хотел его видеть.
  9. TopicStarter Overlay
    Necrodamus
    Offline

    Necrodamus Опытный в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    57
    Симпатии:
    0
    Баллы:
    26
    Пробовал конечно...Не катит...
  10. Time dont wait
    Offline

    Time dont wait Опытный в 1С

    Регистрация:
    20 окт 2009
    Сообщения:
    192
    Симпатии:
    0
    Баллы:
    26
    Теперь проверил код, все работает, несчитая маленькие исправления, если не сработает , пробуй сравнивать и по другим колонкам
    Код:
     Ном = СоздатьОбъект("Справочник.Номенклатура");
    Если ПустоеЗначение(ИмяФайлаЗагрузки)=1 Тогда 
    Предупреждение("Укажите файл", 5);
    Возврат;
    ИначеЕсли ФС.СуществуетФайл(ИмяФайлаЗагрузки)=0 Тогда
    Предупреждение("Указанный файл не существует!", 5);
    Возврат;
    КонецЕсли; 
    
    Попытка
    XL = СоздатьОбъект("Excel.Application");
    Исключение
    Предупреждение(ОписаниеОшибки()+"; не могу запустить Excel.Application");
    СтатусВозврата(0);
    КонецПопытки; 
    
    Книга = XL.WorkBooks.Open(СокрЛП(ИмяФайлаЗагрузки));
    Лист1 = Книга.WorkSheets("Sheet1"); 
    
    RowMax = Лист1.UsedRange.Rows.Count + Лист1.UsedRange.Row - 1;
    For i = 1 To RowMax Do
    а = Лист1.Cells(i, 2).Value;
    Если Ном.НайтиПоНаименованию(СокрЛП(а),0,1) = 1 Тогда
    Сообщить("нашли"+а);
    тз.ДобавитьЗначение(Ном.ТекущийЭлемент().наименование);
    Иначе
    Сообщить("нету "+а);
    КонецЕсли;
    EndDo; 
    
    XL.Quit();
    XL="";
    
    
  11. TopicStarter Overlay
    Necrodamus
    Offline

    Necrodamus Опытный в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    57
    Симпатии:
    0
    Баллы:
    26
    Time dont wait
    Спасибо,но не работает...Результат получается пустым...
    Реализовал,пусть и коряво(долго),следующим образом:
    Код:
    ТЗ = СоздатьОбъект("СписокЗначений");
    Ном = СоздатьОбъект("Справочник.Номенклатура");
    Ном.ВыбратьЭлементы();
    Если ПустоеЗначение(ИмяФайлаЗагрузки)=1 Тогда 
    Предупреждение("Укажите файл", 5);
    Возврат;
    ИначеЕсли ФС.СуществуетФайл(ИмяФайлаЗагрузки)=0 Тогда
    Предупреждение("Указанный файл не существует!", 5);
    Возврат;
    КонецЕсли; 
    
    Попытка
    XL = СоздатьОбъект("Excel.Application");
    Исключение
    Предупреждение(ОписаниеОшибки()+"; не могу запустить Excel.Application");
    СтатусВозврата(0);
    КонецПопытки; 
    
    Книга = XL.WorkBooks.Open(ИмяФайлаЗагрузки);
    Лист1 = Книга.WorkSheets("Sheet1"); 
    
    RowMax = Лист1.UsedRange.Rows.Count + Лист1.UsedRange.Row - 1;    // номер последней строки на Листе1
    
    For i = 1 To RowMax Do                
    а = Лист1.Cells(i, 2).Value;        
    Ном.ВыбратьЭлементы();
    Пока Ном.ПолучитьЭлемент() = 1 Цикл
    Если Строка(Ном.Наименование) = а Тогда
    ТЗ.ДобавитьЗначение(Ном.ТекущийЭлемент());                
    КонецЕсли;
    КонецЦикла;
    EndDo; 
    
    XL.Quit();
    XL=""; 
    
    
    
    Получается для каждой позиции пробегаю по всему справочнику - долговато...
    Если кто подскажет более изящный способ, буду благодарен...
  12. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    Весьма странно :) ты кстати забыл обрывать цикл если нашел, но и это не выход.
    Попробуй Ном.НайтиПоНаименованию(СокрЛП(а),0,0)..
    И а = TrimAll(Лист1.Cells(i, 2).Text); - мало ли цифери какие-нибудь встретятся
  13. dianofob
    Offline

    dianofob (-_-)y-.o0O

    Регистрация:
    3 июл 2009
    Сообщения:
    711
    Симпатии:
    0
    Баллы:
    26
    добавлю, что НайтиПоНаименованию(<>,0,1) - не находит потому что длина разная

Поделиться этой страницей