|
Проверка на имя файла | ☑ | ||
---|---|---|---|---|
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) Понял! Спасибо еще раз!
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |