Имя: Пароль:
1C
1С v8
v8.3 COMConnection [C#] выскакивает Исключение
,
0 Frdezleen
 
29.05.14
10:40
Доброго времени суток. Надеюсь по адресу обращаюсь. Не могу никак заставить работать программу. На форме 1 кнопка. Текст клика:

        private void button1_Click(object sender, EventArgs e)
        {
            string user = "Admin";
            string pas = "123456";
            string file = "D:\\1cv83\\TEST";
            dynamic result;
            dynamic refer;
            V83.COMConnector com1s = new V83.COMConnector();
            
            com1s.PoolCapacity = 10;
            com1s.PoolTimeout = 60;
            com1s.MaxConnections = 2;
            result = com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';");
            refer = result.Справочники.Номенклатура.СоздатьЭлемент();
            refer.Наименование = "Создано из C# Алексом";
            refer.Записать();
                      
        }

Текст ошибки при клике по кнопке
Необработанное исключение типа "System.Runtime.InteropServices.COMException" произошло в Link1C.exe
Дополнительные сведения: В результате вызова компонента COM возвращена ошибка в формате HRESULT E_FAIL.

P.S. система Windows 7 x64. 1С лицензионная, установлена в системе. Разработка ведется для x86 платформы в VS2010. База такая существует, пользователь в ней создан. Права на папку выданы

P.P.S только что обнаружил что во время выброса исключения в папке с базой появляются два *tmp* файлика, которые исчезают. То есть что-то происходит во время подключения, а что не понятно.
1 Рэйв
 
29.05.14
10:44
(0)А апострофы точно можно исмпользовать вместо нормальных
кавычек?
А то у меня например вот так:

Соединение = Сом.Connect ("File="""+СокрЛП(ПутьКБазеФ)+"""; Usr ="""+СокрЛП(ПользовательБазыФ)+""";Pwd ="""+СокрЛП(ПарольБазыФ)+"""");
2 Maxus43
 
29.05.14
10:45
имхо строка соединения неправильная
3 Maxus43
 
29.05.14
10:47
проверь строку собранную средствами винды
4 Frdezleen
 
29.05.14
11:13
проверил. собирает как у Рэйва.
Я пробовал, кавычки, без кавычек, апострофы - все уже перебрал
5 Maxus43
 
29.05.14
11:21
(4) средствами винды проверил? (файлик с расширением .udl сделай) по твоей строке подключения подключается вобще? не из VS
6 Frdezleen
 
29.05.14
11:25
(5) Как не из VS проверить строку подключения не знаю пока. С udl разбираюсь сейчас
7 shuhard
 
29.05.14
11:28
(5) udl для ADODB, с комами он не работает
8 shuhard
 
29.05.14
11:28
(0) в какой строке произошла ошибка ?
9 Maxus43
 
29.05.14
11:30
(7) точняк..(
10 Frdezleen
 
29.05.14
11:32
(8) result = com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';"); в этой.

Немного изменил текст программы

string user = @"""Admin""";
            string pas = @"""123456""";
            string file = @"""D:\1cv83\TEST""";
            dynamic result;
            dynamic refer;
            V83.COMConnector com1s = new V83.COMConnector();
            
            
            //com1s.PoolCapacity = 10;
            //com1s.PoolTimeout = 60;
            //com1s.MaxConnections = 2;
            string con = "File=" + file + ";Usr=" + user + ";Pwd=" + pas + ";";
            Console.Write(con);
            //string con =@"File=""D:\1cv83\Test"";Usr=""Admin"";pwd=""123456""";
            try
            {
                result = com1s.Connect(con);
                refer = result.Справочники.Номенклатура.СоздатьЭлемент();
                refer.Наименование = "Создано из C# Алексом";
                refer.Записать();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message + " " + con);
            }
11 Maxus43
 
29.05.14
11:48
из 1с к 1с попробуй цепанись по кому.
12 Frdezleen
 
30.05.14
07:42
Такой вопрос. Может ли блокировать мне внешнее соединение отсутствие лицензии? Качал технологическую платформу 8.2 с сайта https://users.v8.1c.ru/
13 shuhard
 
30.05.14
07:44
(12) а ключ ?
14 Frdezleen
 
30.05.14
07:45
а вот хз, она ключ не просила и работает...
15 Frdezleen
 
30.05.14
07:48
(13) У нас есть лицензия на 1 рабочее место, я по этому регномеру на сайте users зарегистрировался, скачал оттуда технологическую платформу 8.2 и конфиг с целью разработки внешнего приложения. Вот она и не просит никакой ключ, а работать позволяет...Но как будто именно она блокирует внешние соединения
16 shuhard
 
30.05.14
08:00
(15) [Но как будто именно она блокирует внешние соединения]
а у пользователя в ролях есть работа по Com ?
17 Frdezleen
 
30.05.14
08:19
да есть полные права (ну все галочки проставил)
18 shuhard
 
30.05.14
08:23
(17) ещё раз, права на корень
19 Frdezleen
 
30.05.14
08:27
(18) это как?
20 shuhard
 
30.05.14
08:37
(19) нужно открыть конфигуратор
найти роль
и позырить все права этой роли на корень конфигурации, возможно нет галки на Внешнее соединение
21 Frdezleen
 
30.05.14
08:41
(20) хм... а какая может быть роль у пользователя. Я создал пользователя и проставил ему все галки в правах.
22 shuhard
 
30.05.14
08:42
(21) у пользователя может быть неограниченно количество ролей
и все эти роли чудесно видны в конфигураторе
Администрирование - пользователи
23 Frdezleen
 
06.06.14
09:32
Продолжение истории. К базе я подключился, объект получил. А вот теперь на строчке refer.Записать(); выскакивает эксепшн что ссылка на объект не указывает на экземпляр объекта...
24 kiruha
 
06.06.14
09:40
(23)
referObject=refer.ПолучитьОбъект();
...
referObject.Записать();
25 kiruha
 
06.06.14
09:41
А у тебя уже объект сорри
26 Dolphinbet
 
06.06.14
09:50
(0) А не лучше ли веб-сервисы использовать вместо com?
27 Frdezleen
 
06.06.14
09:54
(26) мне нужно чтобы это и у заказчика работало, а я не знаю стоит ли у него web-расширение, можно ли залезть в конфиг 1С.
Так я просто сначала на своей машине соберу конфиг, потом на машине заказчика установлю IDE и пересоберу проект с его COM.Connector.
Версия 1С заказчика 7.7
28 Dolphinbet
 
06.06.14
09:56
(27) Если у заказчика 7.7 почему Вы используете V83.COMConnector()? Это совершенно разные вещи..
29 Frdezleen
 
06.06.14
09:59
(27) Я у себя разрабатываю и тестирую приложение, платформы 7.7 и не имею. Планирую потом на компьютере заказчика пересобрать проект
30 Dolphinbet
 
06.06.14
10:08
(29) не знаю... я бы поставил 7.7 на Вашем месте, потом придется все переделывать
31 Frdezleen
 
06.06.14
10:09
(30) у меня нет 7.7 )
32 Dolphinbet
 
06.06.14
10:09
А вообще посоветуйте заказчику перейти на платформу 8.3 :)
33 Frdezleen
 
06.06.14
10:11
(32) я то посоветую, это мою проблему не решает. Почему выскакивает эксепшн на refer.Записать()
34 Dolphinbet
 
06.06.14
10:14
(33) а какая у Вас конфигурация? какая то из типовых или самописная?
35 Dolphinbet
 
06.06.14
10:15
интерактивно создается элемент справочника?
36 Frdezleen
 
06.06.14
10:15
(35) что? я не знаю - это работа через COM же
37 Serginio1
 
06.06.14
12:04
38 Frdezleen
 
06.06.14
12:05
(37) на всякий случай спасибо. Но пока не понял
39 Serginio1
 
06.06.14
12:12
Проблема может быть в том, что из модуля объекта ПриЗаписи вызываются методы из модулей у которых не стоит галка ВнешнееСоединение. Поэтому при выполнении данных методов вызывается ошибка. Так же для справочников может вызываться событие ПриУстановкеНовогоКода (при подписке на событие)
40 Frdezleen
 
06.06.14
12:18
(39)хм то есть про ссылку на объект еще не факт? ладно посмотрю
41 Frdezleen
 
06.06.14
13:33
(39) проверка не выявила ошибок
42 Serginio1
 
06.06.14
14:05
(41)Параметры\Модули\проверка галку напротив внешнее соединение. И сделай проверку модуля или проверка модулей в меню конфигурация

точно галочку поставил?
43 Frdezleen
 
06.06.14
14:18
Все на другом форуме помогли. добавил строчку
refer.ОбменДанными.Загрузка=true перед refer.Записать() и все заработало. Всем спасибо за потраченное время) Еще увидимся
44 Serginio1
 
06.06.14
14:25
(43) Значит проблема у тебя при записи где обычно проверяется ОбменДанными.Загрузка
45 Frdezleen
 
06.06.14
14:28
(44) Где это посмотреть? А то работает то работает. Но я не люблю "случайные" и непонятные решения проблем
46 Serginio1
 
06.06.14
14:35
(39) Если внимательно перечитаешь 39 то поймешь откуда проблема. Где то вызывается модуль у которого не стоит галочка внешнее соединение.
Если ты считаешь, что предусмотрел все действия которые происходят при записи то используй  ОбменДанными.Загрузка=истина. Она как раз предназначена, что бы не проводить никаких действий при записи
например

Процедура ПриЗаписи(Отказ)
    Если НЕ ОбменДанными.Загрузка Тогда
        НастройкаПравДоступа.ОбновитьПраваДоступаКИерархическимОбъектамПриНеобходимости(Ссылка,ПрошлыйИзмененныйРодительОбъектаДоступа, Отказ);
    КонецЕсли;    
КонецПроцедуры
47 Frdezleen
 
06.06.14
14:36
(46) А как мне "предусмотреть"? То бишь, где узнать ВСЁ, что происходит при записи, а то выходит это костыль и опасный костыль
48 Serginio1
 
06.06.14
14:39
(47) Угу. Прочитать модуль при записи и подписки на события
49 kiruha
 
06.06.14
20:45
(47)
Ставишь точку останова в ПередЗаписью и по шагам отлаживаешь
В чем проблема ?
50 EvgeniuXP
 
06.06.14
22:52
(31) у тебя нет - в инете всё есть, попробуй поискать там. Только 7.7 инсталлируй, а не перепиши просто папку, иначе OLE не будет работать, ну или регай dll отдельно.
51 EvgeniuXP
 
06.06.14
22:54
и книжку заодно найди Андрей Михайлов 2-ое издание "1С.Предприятие 7.7 8.0. Системное программирование", там всё написано.
52 Frdezleen
 
10.06.14
06:28
итак...вся проблема была в...единице измерения. Кому интересно вот нормальный код на C#. Записи также присваивается новый код из нумерации 1С.
private void button1_Click(object sender, EventArgs e)
        {
            string user = @"""Admin""";
            string pas = @"""123456""";
            string file = @"""D:\1CBase\AccountingBase""";
            dynamic result;
            dynamic refer;
            V82.COMConnector com1s = new V82.COMConnector();
                      
            com1s.PoolCapacity = 10;
            com1s.PoolTimeout = 60;
            com1s.MaxConnections = 2;
            string con = "File=" + file + ";Usr=" + user + ";Pwd=" + pas + ";";
            result = com1s.Connect(con);
            refer  = result.Справочники.Номенклатура.СоздатьЭлемент();
            refer.УстановитьНовыйКод();
            refer.Наименование = "Персики";
            refer.НаименованиеПолное = "Персики солнечные";
            refer.БазоваяЕдиницаИзмерения = result.Справочники.КлассификаторЕдиницИзмерения.НайтиПоКоду("796");//соответствует ЕИ "штук"
            refer.Записать();        
        }
Ошибка? Это не ошибка, это системная функция.