Имя: Пароль:
1C
1С v8
Обращение к таблице в клиент серверном режиме
0 jour
 
02.12.13
12:35
Всем доброе время суток. Есть обработка, нормально работающая с файлами в файл серверном варианте и совсем не работающая в клиент серверном.
Путь к файлам прописан в обработке в функции наСервере поэтому предполагал что проблем быть не должно.
Вот код:

&НаКлиенте
Процедура Команда1(Команда)
    ПолучитьДанные();
КонецПроцедуры

Функция ПолучитьСтрокуПодключения(Источник)
    Если Источник = "LogFile" Тогда
        СтрокаПодключения = "DSN=LogFile;DBQ=\\AVTOPROKAT\Dat\LogFile.tps\!;PWD=LogFile;Description=LogFile;Extension=tps;Oem=N;NullEmptyStr=Y;";    
    Иначе
        Сообщить("Источник указан не верно");
    КонецЕсли;
    Возврат СтрокаПодключения;    
КонецФункции

/// Для каждой таблицы своя структура.
Функция ПолучитьСтруктуруИсточника(Источник)
    Структура = Новый Структура;
    
    Если Источник = "LogFile" Тогда
        Структура.Вставить("Таблица",        0);
        Структура.Вставить("Дата",            1);
        Структура.Вставить("Время",            2);
        Структура.Вставить("ОбъектИд",        3);
        Структура.Вставить("Наименование",    4);
        Структура.Вставить("Операция",        5);
        Структура.Вставить("Код",            6);
        Структура.Вставить("Примечание",    7);
    КонецЕсли;
    
    Возврат Структура;
    
КонецФункции

Функция ПолучитьТаблицу(Источник,CommandText)
    
    Структура = ПолучитьСтруктуруИсточника(Источник);
    Таблица = Новый ТаблицаЗначений();
    Для Каждого Строка Из Структура Цикл
        Таблица.Колонки.Добавить(Строка.Ключ,Новый ОписаниеТипов("Строка"),Строка.Ключ);
    КонецЦикла;
        
    Connection = Новый COMОбъект("ADODB.Connection");
    Command  = Новый COMОбъект("ADODB.Command");
    RecordSet  = Новый COMОбъект("ADODB.RecordSet");
    
    Попытка
        Connection.Open(СокрЛП(ПолучитьСтрокуПодключения(Источник)));
        Command.ActiveConnection   = Connection;
        Command.CommandText = CommandText;
        RecordSet = Command.Execute();
        RecordSet.MoveFirst();
        
        Пока RecordSet.EOF = Ложь Цикл
            Строка = Таблица.Добавить();
            Для Каждого Ст Из Структура Цикл
                Строка[Ст.Ключ] = RecordSet.Fields(RecordSet.Fields.Item(Ст.Значение).Name).Value;
            КонецЦикла;
            RecordSet.MoveNext();
        КонецЦикла;
        
    Исключение
        Сообщить("Не могу подключиться к базе!!!");
    КонецПопытки;
    Возврат Таблица;
КонецФункции


&НаСервере
Процедура ПолучитьДанные()
    
    ИмяТаблицыИзменений     = "LogFile";
    ИмяТаблицыДоговоров     = "DProk";
    ИмяТаблицыКонтрагентов     = "Clien";
    ИмяТаблицыМашины         = "Car";
    ИмяТаблицыПлатежей        = "Plat";
    
    УсловиеДляТаблицыИзменений = "SELECT * FROM LogFile WHERE DateOp="+СтрЗаменить(Строка(Число(НачалоДня(ТекущаяДата())-Дата(1800,12,28))/86400)," ","");
    СвежиеДанные = ПолучитьТаблицу(ИмяТаблицыИзменений,УсловиеДляТаблицыИзменений);
    Если СвежиеДанные.Количество() > 0 Тогда
        Сообщить("История получена!");
        ///Отбираем договора проката, сворачиваем и обрабатываем.
        СвежиеДанные.Свернуть("Таблица,ОбъектИД,Наименование,Операция");
        Отбор = Новый Структура;
        Отбор.Вставить("Таблица","DProk");
        ДоговораАренды = СвежиеДанные.НайтиСтроки(Отбор);
        Если ДоговораАренды.Количество()>0 тогда
            //ПодключитьТаблицуДоговоров();
            Для Индекс = 0 по ДоговораАренды.Количество()-1 Цикл
                Если ДоговораАренды[Индекс].Операция <> "Удаление договора" Тогда
                    УсловиеДляТаблицыДоговоров = "SELECT * FROM DProk WHERE "+"NUMBER"+ "=" + СтрЗаменить(Строка(ДоговораАренды[Индекс].ОбъектИд)," ","");
                    
                    //Получить целую таблицу пока не получается, нужно изучать язык запросов Clarion
                    СтрокаТаблицыДоговоров = ПолучитьТаблицу(ИмяТаблицыДоговоров,УсловиеДляТаблицыДоговоров);
                    
                    УсловиеДляТаблицыКонтрагентов = "SELECT * FROM Clien WHERE " + "ClientID"+"="+СтрЗаменить(Строка(СтрокаТаблицыДоговоров[0].КлиентИД)," ","");                    
                    
                    СтрокаТаблицыКонтрагента = ПолучитьТаблицу(ИмяТаблицыКонтрагентов,УсловиеДляТаблицыКонтрагентов);
                    Контрагент = ЗаполнитьДанныеКонтрагента(СтрокаТаблицыКонтрагента[0]);
                    
                    УсловиеДляТаблицыМашины = "SELECT * FROM Car WHERE CarID="+СтрЗаменить(Строка(СтрокаТаблицыДоговоров[0].МашинаИд)," ","");
                    
                    СтрокаТаблицыМашины = ПолучитьТаблицу(ИмяТаблицыМашины,УсловиеДляТаблицыМашины);
                    Машина = НайтиМашину(СтрокаТаблицыМашины[0]);
                    
                    Договор = ДоговорСКонтрагетом(СтрокаТаблицыДоговоров[0], Контрагент);
                    
                    УсловиеТаблицыПлатежей = "SELECT * FROM Plat WHERE DOGNUMBER="+СтрЗаменить(Строка(ДоговораАренды[Индекс].ОбъектИд)," ","");
                    
                    Платежи = ПолучитьТаблицу(ИмяТаблицыПлатежей,УсловиеТаблицыПлатежей);
                    ТаблицаПлатежей = ПодготовитьТаблицуПлатежей(Платежи,СтрокаТаблицыДоговоров[0]);
                    
                    Документ = НайтиДокумент(Договор, ДоговораАренды[Индекс].ОбъектИд, СтрокаТаблицыДоговоров[0], Машина, ТаблицаПлатежей);
                    
                Иначе
                    Сообщить("Надо удалить договор");
                КонецЕсли;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;

    //
    ////////////////    
    //ВремТаблицаИзменений = СформироватьВременнуюТаблицу(СвежиеДанные,Источник);
    ////////////
    //ВремТаблицаДоговоров = СформироватьВременнуюТаблицу(ТаблицаДоговоров,ИмяТаблицыДоговоров);
        
КонецПроцедуры
1 Wobland
 
02.12.13
12:36
и чо?
2 jour
 
02.12.13
12:36
И как это запустить на клиент серверном варианте работы
3 Wobland
 
02.12.13
12:38
(2) предлагаю избавляться от того, что вызывает ошибку
4 jour
 
02.12.13
12:38
Я думал прописать это в регламентные задания, только вот не пашет на сервере.
5 jour
 
02.12.13
12:38
ошибку ничего не вызывает
6 jour
 
02.12.13
12:38
(3) Просто не подключается к таблице и все.
7 Смотрящий от 1С
 
02.12.13
12:58
обращение к файлам происходимт от имени пользователя, запустившего серевр. У него есть права ?
8 jour
 
02.12.13
13:04
(7) Конечно, я сам запускаю
9 Defender aka LINN
 
02.12.13
13:12
(8) Тебе (7) по слогам прочитать, что ли?
10 Maxus43
 
02.12.13
13:26
(8) ты работаешь под пользователем USR1CV82?
11 jour
 
02.12.13
13:30
(10) Нет, но доступ полный для всех пользователей
12 Maxus43
 
02.12.13
13:33
(11) отладчиком иди, или замени богомерзкие сообщить()  на православные ЗаписьЖурналаРегистрации или ОбщегоНазначение.СообщитьОбОшибке();
13 kiruha
 
02.12.13
13:35
(11)
Напиши где валится
Connection = Новый COMОбъект("ADODB.Connection");

или
Connection.Open(СокрЛП(ПолучитьСтрокуПодключения(Источник)));

или

...

Неужели трудно посмотреть чтобы мы не гадали ?
14 jour
 
02.12.13
13:43
(13) Connection.Open(СокрЛП(ПолучитьСтрокуПодключения(Источник)));

не работает тут
15 Maxus43
 
02.12.13
13:44
&НаСервере
Функция ПолучитьТаблицу(Источник,CommandText)
16 МихаилМ
 
02.12.13
13:46
(0)
сервер 1с 64 битный?
17 jour
 
02.12.13
13:47
(15) я уже все в одной функции пишу.

&НаСервере
Функция ПолучитьИсториюИзменений()
    
    Таблица = Новый ТаблицаЗначений();
    Таблица.Колонки.Добавить("Таблица",,"Таблица");
    Таблица.Колонки.Добавить("Дата",,"Дата");
    Таблица.Колонки.Добавить("ОбъектИд",,"ОбъектИд");
    Таблица.Колонки.Добавить("Наименование",,"Наименование");
    Таблица.Колонки.Добавить("Операция",,"Операция");
    Таблица.Колонки.Добавить("Код",,"Код");
    Таблица.Колонки.Добавить("Примечание",,"Примечание");
    
    ConnectionString = "DSN=LogFile;DBQ=C:\Users\dev1c\Desktop\LogFile.tps\!;PWD=LogFile;Description=LogFile;Extension=tps;Oem=N;NullEmptyStr=Y;";
    Сообщить (ConnectionString);
    Connection = Новый COMОбъект("ADODB.Connection");
    Command  = Новый COMОбъект("ADODB.Command");
    RecordSet  = Новый COMОбъект("ADODB.RecordSet");
    
    Условие = СтрЗаменить(Строка(Число(НачалоДня(ТекущаяДата())-Дата(1800,12,28))/86400)," ","");
    Попытка
        Connection.Open(СокрЛП(ConnectionString));
        Command.ActiveConnection   = Connection;
        Command.CommandText = "SELECT * FROM LogFile WHERE DateOp="+Условие;
        RecordSet = Command.Execute();
        RecordSet.MoveFirst();
18 jour
 
02.12.13
13:47
(16) да
19 Wobland
 
02.12.13
13:48
а что такое неразрывный пробел?
20 Maxus43
 
02.12.13
13:48
Текст ошибки нам озвучат? или так и будем гадать?
21 Wobland
 
02.12.13
13:50
(20) -> (5)
22 МихаилМ
 
02.12.13
13:50
(0)
откройте для себя ПодробноеПредставлениеОшибки()
23 Maxus43
 
02.12.13
13:51
(21) это потому что (12), непровославное сообщить в исключении)
24 kiruha
 
02.12.13
13:56
(14)
Попробуй тот же код в общем модуле а не обработке
25 jour
 
02.12.13
13:57
(22) Спасибо.

{Форма.Форма.Форма(54)}: Ошибка при вызове метода контекста (Open)
        Connection.Open(СокрЛП(ConnectionString));
по причине:
Произошла исключительная ситуация (Microsoft OLE DB Provider for ODBC Drivers): [Microsoft][ODBC Driver Manager] The specified DSN contains an architecture mismatch between the Driver and Application
26 Wobland
 
02.12.13
13:57
алилуйя!
27 kiruha
 
02.12.13
13:59
64 бит драйвер
28 jour
 
02.12.13
14:00
и чеж блин делать...
29 AlexASNT
 
02.12.13
14:01
(22)
У тебя windows 7?
Если да то там драйвер OLE другой.
30 МихаилМ
 
02.12.13
14:06
(25)
тот драйвер, что я Вам прислал, работал в 64 бит.
установил Ваш: и действительно - перестал работать в 64 битах.
31 jour
 
02.12.13
14:14
(30) т.е. извращаться с драйверами надо.., ясно, спс
32 jour
 
02.12.13
14:15
Но вот почему в файл серверном варианте все работает.....
33 AlexASNT
 
02.12.13
14:16
(32)
ОС какая используется в файл серверном варианте?
34 jour
 
02.12.13
14:18
(33) Семерка, на сервере 2008р2
35 jour
 
02.12.13
14:20
(33) Локалка кстати тоже 64х
36 МихаилМ
 
02.12.13
14:21
(32)
потому, что клинт 1с8 - 32 битный
37 AlexASNT
 
02.12.13
14:31
Странно, может на локальной машине какой патч для ODBC 32 каким то боком установлен.
38 AlexASNT
 
02.12.13
14:31
точнее сам ODBC 32
39 jour
 
02.12.13
14:52
(37) на сервере точно также в файл серверном варианте нормально работает, а в клиент серверном нет, т.е. ось тут не играет значения