|   |   | 
| 
 | Проверка на имя файла | ☑ | ||
|---|---|---|---|---|
| 0
    
        Shaggart 08.09.15✎ 23:02 | 
        Добрый день. Есть пример кода(ниже), в нем происходит подключение к эксель файлу и загрузка из него данных, но поскольку файлов несколько, хотел сделать так, чтобы в зависимости от имени загружаемого файла, отрабатывал определенный запрос, но не соображу как это сделать, подскажите, люди добрые.
 &НаКлиенте Процедура ФайлЗагрузкиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) ДиалогОткрытие = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогОткрытие.Заголовок = "Сохранить файл"; ДиалогОткрытие.ПолноеИмяФайла = ""; ДиалогОткрытие.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; ДиалогОткрытие.МножественныйВыбор = Ложь; Если ДиалогОткрытие.Выбрать() Тогда Объект.ФайлЗагрузки = ДиалогОткрытие.ПолноеИмяФайла; КонецЕсли; Если Объект.ФайлЗагрузки = Неопределено Тогда Сообщить("Выберите excel файл"); Возврат; КонецЕсли; КонецПроцедуры &НаСервере Процедура НачатьЗагрузку(Команда) Позиция = Найти(Объект.ФайлЗагрузки,"."); ТипФайла = Прав(Объект.ФайлЗагрузки,СтрДлина(Объект.ФайлЗагрузки)-Позиция); Если ТипФайла = "xls" или ТипФайла = "XLS" Тогда Connection = Новый COMОбъект("ADODB.Connection"); СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+Объект.ФайлЗагрузки; СтрокаПодключения = СтрокаПодключения+"; Extended Properties = "+"""Excel 8.0"+";HDR=No;IMEX=1"";"; Попытка Connection.Open(СтрокаПодключения); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; КонецЕсли; Если ТипФайла = "xlsx" или ТипФайла = "XLSX" Тогда Connection = Новый COMОбъект("ADODB.Connection"); СтрокаПодключения = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source = "+Объект.ФайлЗагрузки; СтрокаПодключения = СтрокаПодключения+"; Extended Properties = "+"""Excel 12.0 Xml"+";HDR=No;IMEX=1"";"; Попытка Connection.Open(СтрокаПодключения); Исключение Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; КонецЕсли; Command = Новый COMОбъект("ADODB.Command"); axCatalog = Новый COMОбъект("ADOX.Catalog"); axCatalog.ActiveConnection = Connection; счЛиста = 1; Для каждого Лист ИЗ axCatalog.Tables Цикл Если счЛиста = 1 Тогда ИмяТаблицы = Лист.Name; Прервать; КонецЕсли; счЛиста = счЛиста + 1; КонецЦикла; RecordSet = Новый COMОбъект("ADODB.RecordSet"); Command.ActiveConnection = Connection; Command.CommandText = "SELECT |list.F5, |list.F6, |list.F8, |list.F9, |list.F10, |list.F11, |list.F12 |FROM ["+ИмяТаблицы+"] as list |Where list.F6<>NULL |"; Command.CommandType = 1; RecordSet = Command.Execute(); Если RecordSet.EOF()<>0 Тогда Сообщить("В файле нет записей"); Возврат; КонецЕсли; RecordSet.MoveNext(); Пока RecordSet.EOF() = 0 Цикл СоздатьДокумент(RecordSet.Fields(0).Value,RecordSet.Fields(1).Value,RecordSet.Fields(2).Value,RecordSet.Fields(3).Value, RecordSet.Fields(4).Value,RecordSet.Fields(5).Value,RecordSet.Fields(6).Value); RecordSet.MoveNext(); КонецЦикла; КонецПроцедуры | |||
| 1
    
        palsergeich 08.09.15✎ 23:07 | 
        в 1с есть такой объект - файл, ты туда скармливаешь путь, и можешь получить имя без расширения
 Ф = Новый Файл (Путь) ИмяБезРасширения = Файл.ИмяБезРасширения; и дальше делаешь то что требуется | |||
| 2
    
        palsergeich 08.09.15✎ 23:09 | 
        ИмяБезРасширения (BaseName)
 Использование: Только чтение. Описание: Тип: Строка. Содержит имя файла (без расширения), с которым связан объект. Пример: если Файл.ПолноеИмя = "c:\temp\test.txt", то Файл.ИмяБезРасширения = "test". Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер). | |||
| 3
    
        palsergeich 08.09.15✎ 23:13 | 
        Либо без объекта Файл.
 ДиалогОткрытие = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогОткрытие.Заголовок = "Сохранить файл"; ДиалогОткрытие.ПолноеИмяФайла = ""; ДиалогОткрытие.Фильтр = "Документ Excel (*.xls, *.xlsx)|*.xls;*.xlsx|"; ДиалогОткрытие.МножественныйВыбор = Ложь; Если ДиалогОткрытие.Выбрать() Тогда Объект.ФайлЗагрузки = ДиалогОткрытие.ПолноеИмяФайла; ИмяБезРасширения = СтрЗаменить(ДиалогОткрытие.ПолноеИмяФайла,"."+ДиалогОткрытие.Расширение, "") КонецЕсли; | |||
| 4
    
        palsergeich 08.09.15✎ 23:21 | 
        От имени файла или расширения? 
 В представленном коде идет зависимость от расширения. + Если сервер будет на другом компьютере то этот код может не работать (потому вы в реквизит объекта пишете путь со стороны клиента, а со стороны сервера он может быть недоступен или другой) | |||
| 5
    
        Shaggart 08.09.15✎ 23:23 | 
        (4) именно от имени файла, файл должен храниться на одном компьютере постоянно. Тут зависимость идет для того, чтобы выполнить ADODB подключение.     | |||
| 6
    
        palsergeich 08.09.15✎ 23:28 | 
        я 2 примера вам привел.
 = Новый Файл (Объект.ФайлЗагрузки) ИмяБезРасширения = Файл.ИмяБезРасширения; Если ИмяБезРасширения = " Такое то" тогда ИначеЕсли ИмяБезРасширения = "Другое" Тогда Иначе Конец Тогда этот вариант самое то | |||
| 7
    
        palsergeich 08.09.15✎ 23:30 | 
        В серверной процедуре 
 Позиция = Найти(Объект.ФайлЗагрузки,"."); Файл= Новый Файл (Объект.ФайлЗагрузки) ИмяБезРасширения = Файл.ИмяБезРасширения ТипФайла = Файл.Расширение; Если ИмяБезРасширения = " Такое то" тогда ИначеЕсли ИмяБезРасширения = "Другое" Тогда Иначе Конец Тогда этот вариант самое то, даже чутка оптимизировал. | |||
| 8
    
        Shaggart 08.09.15✎ 23:34 | 
        (7) Спасибо!!     | |||
| 9
    
        Shaggart 09.09.15✎ 00:17 | 
        (1) Подскажите, пожалуйста, еще один момент. В момент загрузки из файла необходимо еще поле Получатель проверять на наличие элемента из файла в справочнике Контрагенты, и если нет такого, тогда создавать его. Как это лучше организовать? Спасибо.     | |||
| 10
    
        palsergeich 09.09.15✎ 00:32 | 
        Предположим что вы ищете контрагента по наименованию.
 Наименование находится RecordSet.Fields(0).Value тут Пока RecordSet.EOF() = 0 Цикл Если КонтрагентНеСуществует(RecordSet.Fields(0).Value) Тогда КОтнрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент(); КОтнрагентОбъект.Наименование = RecordSet.Fields(0).Value; КонтрагентОбъект.Записать(); КонецЕсли СоздатьДокумент(RecordSet.Fields(0).Value,RecordSet.Fields(1).Value,RecordSet.Fields(2).Value,RecordSet.Fields(3).Value, RecordSet.Fields(4).Value,RecordSet.Fields(5).Value,RecordSet.Fields(6).Value); RecordSet.MoveNext(); КонецЦикла; &НаСервереБезКонтекста Процедура КонтрагентНеСуществует(Наименование) Запрос = новый Запрос; Запрос.Текст = "Выбрать Контрагенты.Ссылка Из Справочник.Контрагенты КАК контрагенты ГДЕ Контрагенты.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование",Наименование); Результат = Запрос.Выполнить(); Возврат Результат.Пустой() КонецПроцедуры Не оптимально - Запрос в цикле, но для разовых выгрузок пойдет | |||
| 11
    
        palsergeich 09.09.15✎ 00:34 | 
        Пока RecordSet.EOF() = 0 Цикл
 Если КонтрагентНеСуществует(RecordSet.Fields(0).Value) Тогда КОтнрагентОбъект = Справочники.Контрагенты.СоздатьЭлемент(); КОтнрагентОбъект.Наименование = RecordSet.Fields(0).Value; КонтрагентОбъект.Записать(); КонецЕсли СоздатьДокумент(RecordSet.Fields(0).Value,RecordSet.Fields(1).Value,RecordSet.Fields(2).Value,RecordSet.Fields(3).Value, RecordSet.Fields(4).Value,RecordSet.Fields(5).Value,RecordSet.Fields(6).Value); RecordSet.MoveNext(); КонецЦикла; &НаСервереБезКонтекста Процедура КонтрагентНеСуществует(Наименование) Запрос = новый Запрос; Запрос.Текст = "Выбрать |Контрагенты.Ссылка |Из Справочник.Контрагенты КАК контрагенты |ГДЕ |Контрагенты.Наименование = &Наименование"; Запрос.УстановитьПараметр("Наименование",Наименование); Результат = Запрос.Выполнить(); Возврат Результат.Пустой() КонецПроцедуры Не оптимально - Запрос в цикле, но для разовых выгрузок пойдет Писал в форме ответа форума, мог сделать ошибку в запросе, идея не изменится. | |||
| 12
    
        Shaggart 09.09.15✎ 00:39 | 
        (11) Большое Спасибо! Буду делать!     | |||
| 13
    
        palsergeich 09.09.15✎ 00:42 | 
        а да. И условие лучше поставить
 |Контрагенты.Наименование ПОДОБНО &Наименование"; вместо равенства | |||
| 14
    
        palsergeich 09.09.15✎ 00:49 | 
        А, да досадная ошибка, КонтрагентНеСуществует это функция конечно же. Вот так правильно
 &НаСервереБезКонтекста Функция КонтрагентНеСуществует(Наименование) Запрос = новый Запрос; Запрос.Текст = "ВЫБРАТЬ |Контрагенты.Ссылка |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.Наименование ПОДОБНО &Наименование"; Запрос.УстановитьПараметр("Наименование",Наименование); Результат = Запрос.Выполнить(); Возврат Результат.Пустой() КонецФункции | |||
| 15
    
        Shaggart 09.09.15✎ 00:53 | 
        (14) Понял! Спасибо еще раз!     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |