Имя: Пароль:
1C
1С v8
Проверка на имя файла
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) Понял! Спасибо еще раз!
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший