|
|||
| ProProg
05.09.12 — 12:43 |
Выходит ошибка на клиент серверной восьмерке. Обработка загрузки в 1С экселевского файла — вернее его считывание через АДО |
||
| Heckfy
1 — 05.09.12 — 12:50 |
Чего то не доставлено на сервере…. |
||
| ProProg
2 — 05.09.12 — 13:20 |
никто не сталкивался? |
||
| ProProg
3 — 05.09.12 — 13:21 |
Полный текст ошибки Ошибка при установке значения атрибута контекста (ActiveConnection) по причине: |
||
| ProProg
4 — 05.09.12 — 13:27 |
Connection = Новый COMОбъект("ADODB.Connection");
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source = "+СокрЛП(ФайлИсходныхДанных);
СтрокаПодключения = СтрокаПодключения + "; Extended Properties = "+"""Excel 8.0"+";HDR=NO;IMEX=1"";";
Попытка
Connection.Open(СтрокаПодключения);
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
Command = Новый COMОбъект("ADODB.Command");
axCatalog = Новый COMОбъект("ADOX.Catalog");
axCatalog.ActiveConnection = Connection;
|
||
| pumbaEO
5 — 05.09.12 — 13:37 |
и где тут [загрузки в 1С экселевского файла] ? Сервер 1С x64 ? |
||
| ProProg
6 — 05.09.12 — 14:25 |
да сервак 64 |
||
| ProProg
7 — 05.09.12 — 14:25 |
(5) ну как где — строка подключения смотри. |
||
| ProProg
8 — 05.09.12 — 14:25 |
на том же самом серваке в файловой базе все работает. |
||
| pumbaEO
9 — 05.09.12 — 14:35 |
(8) потому, что файловая и клиент 32… Надо настраивать винду, что бы разрешил 64 серверу 1С обращаться к 32 COM объектам. В поиск. |
||
| ProProg
10 — 05.09.12 — 14:52 |
во блин. где бы это еще найти |
||
| 774816
11 — 05.09.12 — 15:12 |
попробуй такую строку соединения http://connectionstrings.com/excel |
||
|
ProProg 12 — 06.09.12 — 16:44 |
хелп. нифинта не пашет.. |
![]() |
|
TurboConf — расширение возможностей Конфигуратора 1С |
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку «Обновить» в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
ПРАКТИЧЕСКОЕ ПОСОБИЕ РАЗРАБОТЧИКА: Метод «MS ADODB» (ADODB.Connection).
Поддерживаемые типы: *.xls,*.xlsx.
В данной статье приведен функционал, с помощью которого в обработке
«Импорт из EXCEL и др.источников (xls,xlsx,ods,sxc,dbf,mxl,csv,sql) в 1С»: //infostart.ru/public/120961
производится считывание данных из файлов табличного типа *xls, *.xlsx.
Методы загрузки из внешнего источника:
— Метод «MS ADO» (Чтение файлов xls, xlsx средствами Microsoft ADO): //infostart.ru/public/163640/
— Метод «MS EXCEL» (Чтение файлов xls, xlsx с картинками средствами Microsoft Office): //infostart.ru/public/163641/
— Метод «LO CALC» (Чтение файлов xls, xlsx, ods, sxc с картинками средствами LibreOffice): //infostart.ru/public/163642/
— Метод «NativeXLSX» (Чтение файлов xlsx с картинками средствами 1С. ПостроительDOM): //infostart.ru/public/300092/
— Метод «NativeXLSX». Предыдущий вариант (Чтение файлов xlsx средствами 1С. ЧтениеXML)://infostart.ru/public/225624/
— Метод «Excel1C» (Загрузка на платформе 8.3.6 с картинками. Чтение файлов xls, xlsx, ods): //infostart.ru/public/341855/
— Список листов файла: //infostart.ru/public/163724/
Публикаций на тему загрузки из EXCEL — множество, но
«
— Вам билетёр нужен?
— Был нужен, да уже взяли.
— Может и я на что сгожусь?
— Может и сгодишься, если скалиться не будешь …
«
«НЕУЛОВИМЫЕ МСТИТЕЛИ» (1966).
// Метод "Microsoft ADODB"/
//
// Параметры:
// ФайлEXCEL - Полное имя файла (путь к файлу с именем файла и расширением).
// ИмяЛиста - Имя выбранного листа файла EXCEL.
// СтрокаЗаголовка (по умолчанию = 1) - Номер строки EXCEL, в которой расположены заголовки колонок.
// Не используется, т.к. в СтрокеСоединения указано HDR=YES, а не HDR=NO.
/ / В обработке 1-я строка анализируется для сопоставления колонок EXCEL с реквизитами 1С (справочники, докуметны, регистры).
// НачСтрока (по-умолчанию = 0) - Номер начальной строки, начиная с которой считываются данные из EXCEL.
// КонСтрока (по-умолчанию = 0) - Номер конечной строки, которой заканчиваются считываемые данные из EXCEL.
// Если НачСтрока=0 и КонСтрока=0, то считывается вся таблица, находящаяся на листе EXCEL.
// КолвоСтрокExcel - Количество строк на листе "ИмяЛиста" EXCEL. Возвращается в вызываемую процедуру.
// ПодключениеADODB - тип драйвера ADODB для подключения к EXCEL.
//
// Возвращаемые значения:
// ТаблицаРезультат - Результат считывания с листа "ИмяЛиста" EXCEL.
//
Функция ЗагрузитьМетодом_MSADODB(Знач ФайлEXCEL, Знач ИмяЛиста, Знач СтрокаЗаголовка = 1, НачСтрока = 0, КонСтрока = 0, КолвоСтрокExcel,
Знач ПодключениеADODB = "MicrosoftJetOLEDB40") Экспорт
Перем СonnectionString, ADODBConnection, ADODBRecordset, ТекстЗапроса;
Перем КолвоКолонокExcel, Поле, Колонка, ИмяКолонки;
Перем НоваяСтрока, НомерСтроки;
Перем ТаблицаРезультат;// Нумерация MS ADODB начинается с 1.
// Переменная "СтрокаЗаголовка", не используется, т.к. HDR=YES, а не HDR=NO.
// HDR=YES:
// 1. Считывание заголовков колонок с 1-ой строки.
// 2. Считываемые данные со 2-ой и последующих строк типизированы. Для варианта HDR=NO: считываемые данные - строка.// Строка соединения - определение драйвера, который будет использован для подключения к файлу EXCEL.
Если ПодключениеADODB = "MicrosoftACEOLEDB12" Тогда// ACE.OLEDB.12.0 - Для использования данного подключения необходимо дополнительное ПО:
// Microsoft Access Database Engine 2010 Redistributable 32/64 bit.
СonnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 12.0;HDR=YES;IMEX=1;""";// Еще один вариант.
//СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};Dbq=" + СокрЛП(ФайлEXCEL) + ";";Иначе
// Jet.OLEDB.4.0 - Стандартное подключение, как правило, не требующее установки дополнительного ПО.
// Рекомендуется установить последний Service Pack Windows.
СonnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП(ФайлEXCEL) + ";Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""";// Еще один вариант.
//СтрокаСоединения = "Driver={Microsoft Excel Driver (*.xls)};Dbq=" + СокрЛП(ФайлEXCEL) + ";";КонецЕсли;
Попытка
// Инициализация основного объекта ADODB.Connection. Открытие соединения.
ADODBConnection = Новый COMОбъект("ADODB.Connection");
ADODBConnection.ConnectionString = СonnectionString;
ADODBConnection.Open();
// Импирически определенный параметр для правильного определения количества строк листа.
ADODBConnection.CursorLocation = 3; // По-умолчанию 2.
Исключение
Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
Возврат Новый ТаблицаЗначений; // В случае ошибки возвращаем пустую таблицу значений.
КонецПопытки;ТекстЗапроса = "SELECT * FROM [" + ИмяЛиста + "$]";
// Создание Recordset. Дочерний объект ADODBConnection. Набор записей по запросу.
Попытка
ADODBRecordset = Новый COMОбъект("ADODB.Recordset");
ADODBRecordset.Open(ТекстЗапроса, ADODBConnection);// Проверка заполненности листа.
Если (ADODBRecordset.EOF ИЛИ ADODBRecordset.BOF) Тогда
КолвоСтрокExcel = 0;
Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);// Завершение работы.
// Закрытие Объектов.
ADODBRecordset.Close();
ADODBConnection.Close();
ADODBRecordset = Неопределено;
ADODBConnection = Неопределено;Возврат Новый ТаблицаЗначений; // В случае ошибки возвращаем пустую таблицу значений.
КонецЕсли;// Импирически определенные параметры для правильного определения количества строк листа.
ADODBRecordset.AbsolutePage = 1;
ADODBRecordset.AbsolutePosition = 1;
Исключение
Сообщить(НСтр("ru = '"+ОписаниеОшибки()+"'"), СтатусСообщения.Внимание);
Возврат Новый ТаблицаЗначений; // В случае ошибки возвращаем пустую таблицу значений.
КонецПопытки;// Параметр, возвращаемый в вызывающую процедуру.
КолвоСтрокExcel = ADODBRecordset.RecordCount + 1; // (+1) - учет Строки-Заголовока, которая "съедается".
КолвоКолонокExcel = ADODBRecordset.Fields.Count;// Проверка заполненности листа.
Тогда
Если КолвоСтрокExcel <= 2
КолвоСтрокExcel = 0;
Сообщить(НСтр("ru = '" + ИмяЛиста + ": не содержит данных.'"), СтатусСообщения.Внимание);
// Завершение работы.
// Закрытие Объектов.
ADODBRecordset.Close();
ADODBConnection.Close();
ADODBRecordset = Неопределено;
ADODBConnection = Неопределено;
Возврат Новый ТаблицаЗначений; // В случае ошибки возвращаем пустую таблицу значений.
КонецЕсли;
// Создание результирующей таблицы, в которую будут записываться считанные из EXCEL данные.
ТаблицаРезультат = Новый ТаблицаЗначений;
// Формирование колонок результирующей таблицы.
// "НомерСтроки" - для наглядности и удобства.
// В зависимости от разрабатываемой обработки.
// "Сопоставлено" - может быть другим.
// Здесь же могут быть добавлены другие колонки, не формируемые из содержимого файла EXCEL.
ТаблицаРезультат.Колонки.Добавить("НомерСтроки", Новый ОписаниеТипов("Число"), "№", 4);
ТаблицаРезультат.Колонки.Добавить("Сопоставлено", Новый ОписаниеТипов("Булево"), "Сопоставлено", 1);
Для ит = 1 ПО КолвоКолонокExcel Цикл
Поле = ADODBRecordset.Fields.Item(ит - 1);
ИмяКолонки = "К_" + ит;
Колонка = ТаблицаРезультат.Колонки.Добавить(ИмяКолонки, , СокрЛП(СтрЗаменить(Поле.Name, "#", ".")));
// Замена "#" на ".", т.к. при считывании ADODB "." в имени колонки заменяется на "#".
КонецЦикла;
// ТаблицаРезультат: 1-я строка - Строка-Заголовок.
// Добавление этой строки обусловлено исключительно из соображений идентичности содержимого файла EXCEL и ТаблицыЗначений,
// выводимой на форме Обработки, и дальнейшей обработки строки заголовка
// с целью сопоставления колонок EXCEL и реквизитов 1С: для Справочников, ПВХ, Регистров, Документов.
// Если в Вашей обработке в результирующей таблице в качестве 1-ой строки не нужна Строка-Заголовок, то
// следует закомментировать следующий цикл:
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.НомерСтроки = 1;
Для ит = 1 ПО КолвоКолонокExcel Цикл
ИмяКолонки = "К_" + ит;
Колонка = ТаблицаРезультат.Колонки.Найти(ИмяКолонки);
НоваяСтрока[ИмяКолонки] = Колонка.Заголовок;
КонецЦикла;
// ТаблицаРезультат: Формирование строк по указанному диапазону: НачСтрока - КонСтрока.
НомерСтроки = 1;
Пока ADODBRecordset.EOF() = 0 Цикл
НомерСтроки = НомерСтроки + 1;
Если НомерСтроки < НачСтрока Тогда // Номер строки вне диапазона считываемых строк.
ADODBRecordset.MoveNext(); // Следующая строка.
Продолжить;
КонецЕсли;
Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда // Номер строки вне диапазона считываемых строк.
Прервать;
КонецЕсли;
НоваяСтрока = ТаблицаРезультат.Добавить();
НоваяСтрока.НомерСтроки = НомерСтроки;
Для ит = 1 ПО КолвоКолонокExcel Цикл
Поле = ADODBRecordset.Fields.Item(ит - 1);
Если Поле.ActualSize = 0 Тогда // Пустое поле EXCEL.
Продолжить;
КонецЕсли;
ЗначениеЯчейки = Поле.Value; // Учитывая параметр HDR=YES в строке соединения, данные считываются в соответствии с их типом.
ИмяКолонки = "К_" + ит;
НоваяСтрока[ИмяКолонки] = ЗначениеЯчейки;
// Используется при формировании таблицы на форме обработки.
ШиринаКолонки = ТаблицаРезультат.Колонки[ИмяКолонки].Ширина;
ДлинаСтроки = СтрДлина(СокрЛП(ЗначениеЯчейки));
ТаблицаРезультат.Колонки[ИмяКолонки].Ширина = ?(ШиринаКолонки < ДлинаСтроки, ДлинаСтроки, ШиринаКолонки);
КонецЦикла;
ADODBRecordset.MoveNext(); // Следующая строка.
КонецЦикла;
//УдалитьКолонкиСНулевойШириной(ТаблицаРезультат);
// Завершение работы.
// Закрытие Объектов.
ADODBRecordset.Close();
ADODBConnection.Close();
ADODBRecordset = Неопределено;
ADODBConnection = Неопределено;
Возврат ТаблицаРезультат;
КонецФункции
Преимущества:
1.«В общем случае» метод «Microsoft ADODB» работает и в файловом и в клиент-серверном варианте.
2. Самый быстрый из трех рассматриваемых.
Особенности и Ограничения:
1.Для функционирования метода «Microsoft ADODB» необходимо:
Драйвер подключения Provider=Microsoft.Jet.OLEDB.4.0:
- Установленный Microsoft MDAC, как правило специальная установка не требуется, достаточно последнего Service Pack-а операционной системы..
Microsoft MDAC 2.8 SP1 10.05.2005: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=5793Драйвер подключения Provider=Microsoft.ACE.OLEDB.12.0:
- Установленный Microsoft Access Database Engine 2010 Redistributable (16/12/2010) 32 и 64 - разрядные версии:
Microsoft ADE 2010 16/12/2010: http://www.microsoft.com/en-us/download/details.aspx?id=13255
2. 1-я строка файла EXCEL - строка, содержащая заголовки колонок. Можно изменить, изменив HDR=YES на HDR=NO + некоторые изменения в функции.
С уважением к сообществу МА!
Автор Дринкинс, 12 июл 2013, 14:10
0 Пользователей и 1 гость просматривают эту тему.
Соединение=Новый COMОбъект(«ADODB.Connection»);
RecordSet=Новый COMОбъект(«ADODB.Recordset»);
//Соединение.ConnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+СокрЛП(ИмяФайлаЗагрузки)+»;Extended Properties=»»Excel 8.0;HDR=No; IMEX=1;»»»;
Соединение.ConnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+СокрЛП(ИмяФайлаЗагрузки)+»;Mode=Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=False»;
Соединение.Open();
RecordSet.ActiveConnection = Соединение;
RecordSet.CursorType = 3;
RecordSet.LockType = 2;
cat=Новый COMОбъект(«ADOX.Catalog»);
cat.ActiveConnection=Соединение;
//RecordSet.Source = «Select Лист.* from [«+cat.Tables(0).Name+»]»;
ТекстЗапроса =
«SELECT
| *
|FROM
| [» + ИмяФайлаЗагрузки + «$] as Лист»;
Попытка
RecordSet.Open(ТекстЗапроса,Соединение);
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
ТЗ=Новый ТаблицаЗначений();
КоличествоКолонок = RecordSet.Fields.Count;
Для НомерКолонки=0 По КоличествоКолонок — 1 Цикл
ТЗ.НоваяКолонка(RecordSet.Fields(НомерКолонки).Name);
КонецЦикла;
Пока RecordSet.Eof()=0 Цикл
ТЗ.НоваяСтрока();
Для НомерКолонки=0 По КоличествоКолонок — 1 Цикл
ТЗ.УстановитьЗначение(ТЗ.НомерСтроки,НомерКолонки+1,RecordSet.Fields(НомерКолонки).Value);
КонецЦикла;
RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
Соединение.Close();
ТЗ.ВыбратьСтроку();
Может кто подскажет почему выдает ошибку:
{Форма.Форма.Форма(22)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft JET Database Engine): Недопустимое имя ‘C:sheet.xls$’. Проверьте, что оно не содержит недопустимые символы или знаки препинания, а также не является слишком длинным.
А что в — ИмяФайлаЗагрузки ?
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Из какого запроса?!!!
Добавлено: 12 июл 2013, 14:31
Цитата: Дринкинс от 12 июл 2013, 14:10Соединение=Новый COMОбъект(«ADODB.Connection»);
RecordSet=Новый COMОбъект(«ADODB.Recordset»);
//Соединение.ConnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+СокрЛП(ИмяФайлаЗагрузки)+»;Extended Properties=»»Excel 8.0;HDR=No; IMEX=1;»»»;
Соединение.ConnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+СокрЛП(ИмяФайлаЗагрузки)+»;Mode=Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=False»;
Соединение.Open();
У тебя эта часть не работает!
Добавлено: 12 июл 2013, 14:32
Для Microsoft.Jet.OLEDB.4.0 вот правильный синтаксис:
«Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyExcel.xls;Extended Properties=»Excel 8.0;HDR=Yes;IMEX=1»;
Добавлено: 12 июл 2013, 14:33
http://www.connectionstrings.com/excel/
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Цитата: Dethmontt от 12 июл 2013, 14:30
Из какого запроса?!!!Добавлено: 12 июл 2013, 14:31
Цитата: Дринкинс от 12 июл 2013, 14:10Соединение=Новый COMОбъект(«ADODB.Connection»);
RecordSet=Новый COMОбъект(«ADODB.Recordset»);
//Соединение.ConnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+СокрЛП(ИмяФайлаЗагрузки)+»;Extended Properties=»»Excel 8.0;HDR=No; IMEX=1;»»»;
Соединение.ConnectionString = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=»+СокрЛП(ИмяФайлаЗагрузки)+»;Mode=Share Deny None;Extended Properties=Excel 8.0;Persist Security Info=False»;
Соединение.Open();У тебя эта часть не работает!
Добавлено: 12 июл 2013, 14:32
Для Microsoft.Jet.OLEDB.4.0 вот правильный синтаксис:
«Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyExcel.xls;Extended Properties=»Excel 8.0;HDR=Yes;IMEX=1»;Добавлено: 12 июл 2013, 14:33
http://www.connectionstrings.com/excel/
Если например так
Соединение = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyExcel.xls;Extended Properties=»Excel 8.0;HDR=Yes;IMEX=1»;
то ошибка при контроле кода
конечно… Кавычки то кто расставлять будет?
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Цитата: Dethmontt от 12 июл 2013, 15:20
конечно… Кавычки то кто расставлять будет?СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyExcel.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";
Я расставил кавычки нов се равно:
{Форма.Форма.Форма(22)}: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (Microsoft JET Database Engine): Недопустимое имя ‘C:sheet.xls$’. Проверьте, что оно не содержит недопустимые символы или знаки препинания, а также не является слишком длинным.
Добавлено: 12 июл 2013, 15:27
может чегото в винде не хватает?
СтрокаСоединения = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyExcel.xls;Extended Properties=»»Excel 8.0;HDR=Yes;IMEX=1″»»;
С этой строкой у тебя валиться ошибка недопустимое имя C:sheet.xls$?
Добавлено: 12 июл 2013, 16:04
Файл то на диске С: есть такой? sheet.xls
Соединение=Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:sheet.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";
Попытка
Соединение.Open();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
Если долго всматриваться в учебник…то в голову может прийти мысль его открыть!
Вот с этой
RecordSet.Open(ТекстЗапроса,Соединение);
Добавлено: 12 июл 2013, 16:05
Цитата: Dethmontt от 12 июл 2013, 16:01
СтрокаСоединения = «Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:MyExcel.xls;Extended Properties=»»Excel 8.0;HDR=Yes;IMEX=1″»»;
С этой строкой у тебя валиться ошибка недопустимое имя C:sheet.xls$?Добавлено: 12 июл 2013, 16:04
Файл то на диске С: есть такой? sheet.xls
Соединение=Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:sheet.xls;Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1""";
Попытка
Соединение.Open();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
файл конечно есть
Мне поручили инкрементный перенос устаревшего приложения VB6 (используя MS Access как базу данных, не спрашивайте).NET.
Это будет длинный, но я думаю, что лучше дать немного контекста.
Это приложение имеет основную форму MDI с меню, которое создается динамически на основе DLL, найденных в папках приложений. Это принципиально плагин: каждая DLL представлена элементом меню, который при нажатии открывается основная форма, содержащаяся в DLL, вызывая SetParent() по мере необходимости.
Форма MDI — это моя отправная точка. Я хочу переписать достаточно просто (редизайн и модульное тестирование, поскольку я иду, конечно), чтобы иметь возможность открывать указанные формы. Как только я закрою этот гвоздь, я начну переписывать одну DLL за раз.
Каждая DLL нуждается в подключении ADO, которое я смог передать из С#.
Дело в том, что один из этих плагинов (по крайней мере, но, возможно, многие другие) использует ADOX для работы в базе данных, и здесь возникает проблема: когда я пытаюсь установить свойство ADOX.Catalog ActiveConnection для ADO соединение, все, что я получаю, это ошибка времени выполнения 3001: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
Я не могу для жизни меня понять, что я делаю неправильно.
Код VB6 настолько прост, насколько это возможно:
Dim c As New ADOX.Catalog
Set c.ActiveConnection = theAdoConnectionComingFromDotNet ' error!
Код С#, который создает ADO-соединение, столь же прямолинейен, как и VB:
var conn = new ADODB.Connection();
conn.Open("Provider=Microsoft.JET.Oledb;[...]");
и вызов Open() завершается успешно.
Если я попытаюсь установить ActiveConnection на стороне С# так:
var catalog = new ADOX.Catalog();
catalog.ActiveConnection = conn;
все работает.
Теперь я мог бы решить проблему, просто создав ADOX на стороне С# и передав ее на VB6, но настройка кода VB6 (который, конечно же, не имеет ни одного unit test) может оказаться PITA, и Я даже не уверен, что это было бы легко сделать в первую очередь (потому что приложение может использовать сразу несколько БД доступа, открывая и закрывая соединения для каждого из них по мере необходимости).
Итак, у кого-нибудь есть представление о том, что я делаю неправильно? С С# я пробовал ссылаться на ADODB как с вкладки .NET, так и с COM-версии (и версия ADO, которую я выбрал на вкладке COM, является правой: 2.5… снова, не спрашивайте), но все равно нет радость.
ИЗМЕНИТЬ
То же самое происходит, когда я пытаюсь назначить свойство RecordSet ActiveConnection для соединения, которое приходит из С#, например:
Dim rs As New ADODB.Recordset
Set rs.ActiveConnection = theAdoConnectionComingFromDotNet
Другим обходным решением, о котором я могу думать, поскольку ActiveConnection является вариантом, было бы установить его в свойство ConnectionString соединения. Это работает, но это создавало и открывало новое соединение каждый раз, и, честно говоря, мне это не понравилось.
Выходит ошибка на клиент серверной восьмерке. На файловой все работает. Кто в курсе что это и как побороть? Гугл ничем не помог. Обработка загрузки в 1С экселевского файла — вернее его считывание через АДО
Чего то не доставлено на сервере….
Полный текст ошибки Ошибка при установке значения атрибута контекста (ActiveConnection) по причине: Произошла исключительная ситуация (ADOX.Catalog): Невозможно использование подключения для выполнения операции. Оно закрыто или не допускается в данном контексте.
и где тут [загрузки в 1С экселевского файла] ? Сервер 1С x64 ?
ну как где — строка подключения смотри.
на том же самом серваке в файловой базе все работает.
потому, что файловая и клиент 32… Надо настраивать винду, что бы разрешил 64 серверу 1С обращаться к 32 COM объектам. В поиск.
во блин. где бы это еще найти
попробуй такую строку соединения Driver={Microsoft Excel Driver (*.xls)};DriverId=790;Dbq=C:MyExcel.xls;DefaultDir=c:mypath;
Тэги: 1С 8
Комментарии доступны только авторизированным пользователям
При подготовке документа к загрузке или сопоставлении номенклатуры появилось сообщение «Произошла исключительная ситуация [текст ошибки]».

Причина
На компьютере не установлен драйвер для работы с форматом *.dbf и система не смогла сопоставить данные файла с online.sbis.ru.
Решение №1. Установите драйвер пакета MS Office
- Определите разрядность платформы 1С. Для клиент-серверной версии 1С сделайте это на компьютере, где установлена серверная часть. В диспетчере задач Windows перейдите на вкладку «Процессы», и если название процесса:
- 1cv8ct.exe *32 — это 32-разрядная платформа (x86);
- 1cv8ct.exe *64 — 64-разрядная (x64).

- Убедитесь, что на компьютере установлен пакет MS Office, и узнайте его разрядность. Скачайте драйвер:
- Откройте командную строку и установите драйвер с ключом «passive».

Сопоставление данных из DBF-файла и online.sbis.ru невозможно, если:
- разрядность 1С x86, а MS Office x64;
- при клиент-серверной версии 1С на клиенте используется Windows, а на сервере другая ОС.
Решение №2. Добавьте файл настроек внешней обработки
- Определите каталог хранения файла настроек.
По умолчанию это «С:Sbis1C». В зависимости от режима работы настройки могут храниться на сервере вместе с базой 1С или на локальном компьютере. - Скачайте:
файл настроек (XML, 280 байт) для 1С: «Управление торговлей» версия 10, «Управление производственным предприятием»;
файл настроек (XML, 286 байт) для 1С: «Управление торговлей» версия 11, «ERP», «Бухгалтерия государственного учреждения», «Бухгалтерия сельскохозяйственного предприятия», «Бухгалтерия 2.0», «Бухгалтерия 3.0», «Комплексная автоматизация 2.0», «Управление нашей фирмой 1.0».
- Переименуйте скачанный файл в соответствии с другими файлами настроек, но не указывайте расширение «sbis».
Например: имя файла в настройках имеет вид «ВО82КА1-1-36_Конфигурация.sbis3.xml». Скачанный файл назовите «ВО82КА1-1-36_Конфигурация.xml»
- Скопируйте переименованный файл в каталог хранения настроек и перезапустите внешнюю обработку.
Нашли неточность? Выделите текст с ошибкой и нажмите ctrl + enter.
Содержание
- Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ отличается от версии корневого модуля ‘core83’
- Заполнение внешней таблицы
- Выборка данных и запись
- Использование хранимых процедур
- Новые записи:
Ошибка при вызове метода контекста (Connect): Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ отличается от версии корневого модуля ‘core83’
Часто бывает, что при настроенной синхронизации после обновления платформы появляется ошибка «Произошла исключительная ситуация (V83.COMConnector.1): Версия компоненты ‘comcntr’ отличается от версии корневого модуля ‘core83′». Так происходит потому, что автоматически не зарегистрировалась компонента comcntr.dll из-за проблем с правами пользователя на компьютере.
Решить данную проблему можно двумя способами.
Способ №1.
Переустановить платформу под правами Администратора или под пользователем, у которого есть такие права.
Способ №2.
Если не получилось как в способе №1, то можно вручную зарегистрировать самому эту компоненту.
Перед этим нам необходимо изменить Параметры контроль учетной записи.
Для Windows 7 нам необходимо зайти в Пуск затем в Панель управления.
Для Windows 10 нам необходимо в левом нижнем углу панели задач в строке поиска набрать Панель управления и перейти по открывшейся ссылке.
В правом верхнем углу Панели управления выбрать Просмотр-Мелкие значки и затем в списке перейти в Учетные записи пользователей.
.png)
Там выбрать Изменить параметры контроля учетных записей.
.png)
Затем поставить ползунок в самом нижнем положении..png)
И перезапустить компьютер.
После перезагрузки необходимо:
Для Windows 7 надо перейти в Пуск, затем в строке поиска ввести cmd.exe,нам покажет что найдена Командная строка и, щелкнув по ней правой клавишей мыши, выбрать «Запуск от имени администратора».
Для Windows 10 нам необходимо в левом нижнем углу панели задач в строке поиска набрать Командная панель или cmd.exe и, щелкнув по ней правой клавишей мыши, выбрать «Запуск от имени администратора».
.png)
У нас откроется Командная строка, где нам необходимо ввести команду:
1.Для платформы x86
.png)
2.Для платформы х64
.png)
Затем нажать клавишу Enter.
Если все сделали правильно, то увидите вот такое окно.
.png)
После этого необходимо перезагрузить компьютер. Как включится, пробуйте снова сделать синхронизацию.
Пришлось недавно ближе поработать с объектами ADODB. Давно этого не делал, так что пришлось снова смотреть в старый код, а что-то и в интернете поискать. Решил скомпоновать базу здесь, в блоге — для дальнейшего возвращения.
Работа с ADODB производится через несколько объектов:
ADODB.Connection — Объект производит подключение к источнику данных, а так же трансляцию команд и наборов данных
ADODB.RecordSet — Объект предоставляющий механизмы работы с набором данных, такие как получение, модификация, удаление или добавление данных.
ADODB.Command — Объект, так же предоставляющий механизмы работы с наборами данных, но, в отличие от RecordSet, не возвращает данные на клиента.
ADODB.Connection
Перед тем как начать работать с данными из внешнего источника необходимо установить с ним связь, для этого вызывается функция Open объекта Connection, в единственный параметр этой функции передается строка ConnectionString с описанием параметров подключения.
Попытка ADOСоединение = Новый COMОбъект(«ADODB.Connection»); ADOСоединение.Open(«Provider=SQLOLEDB.1; |Persist Security Info=False; |User ID=»+Пользователь+»; |Password=»+ Пароль+»; |Initial Catalog=»+ База+»; |Data Source=»+ Сервер); Возврат ADOСоединение; Исключение КонецПопытки;
Provider — Имя драйвера источника данных (к примеру SQLOLEDB.1 для MS SQL server)
Persist Security Info — необходимость использования шифрованого канала
User ID — Имя пользователя внешнего источника
Password — Пароль пользователя
Initial Catalog — Имя базы внешного источника
Data Source — Имя сервера
ADODB.RecordSet
Открытие набора данных для всей таблицы. Этот вариант хорош тем, что есть возможность указания дополнительных параметров набора данных.
RecordSet.Open(Источник, Соединение, ТипКурсора, ТипБлокировки, Параметры)
В приведенном ниже примере набор данных открывается с параметрами
Источник — «IMPORT_PRODUCTS»
Соединение — мADOСоединение
ТипКурсора — «0» (adOpenForwardOnly)
ТипБлокировки — «2» (adLockPessimistic)
Параметры — «2» (adCmdTable)
ADOНаборДанныхТовары = Новый COMОбъект(«ADODB.RecordSet»); ADOНаборДанныхТовары.Open(«IMPORT_PRODUCTS», мADOСоединение, 0, 2, 2);
Открытие набора данных по запросу (использование дополнительных параметров вызывает исключения)
ТекстЗапросаТоваров = «SELECT * | FROM | where in (SELECT FROM where (( = ») |or ( = ‘NULL’) or( = ‘1’)))»; ADOНаборДанныхТовары = Новый COMОбъект(«ADODB.RecordSet»); ADOНаборДанныхТовары .Open(ТекстЗапросаТоваров, мADOСоединение);
Заполнение внешней таблицы
При необходимости очистить таблицу внешнего источника данных, и загрузить туда обновленные данные.
Подключаемся к внешней базе
Попытка СтрокаСоединения = «Provider=SQLOLEDB.1; |Persist Security Info=False; |User ID=»+Пользователь+»; |Password=»+ Пароль+»; |Initial Catalog=»+ База+»; |Data Source=»+ Сервер); Connection = Новый COMОбъект(«ADODB.Connection»); Connection.Open(СтрокаСоединения); Исключение Возврат; КонецПопытки; С помощью объекта ADODB.Command выполняем запрос по удалению данных из таблицы по определенному условию. При этом, в CommandText прописываем сам запрос, и важно указать CommandType равным 1.
Command = Новый COMОбъект(«ADODB.Command»); Command.CommandTimeout = 100; Command.CommandText = «DELETE FROM .. WHERE PERIOD_ID = Convert(datetime,’»+Лев(Строка(ДатаНач),10)+»‘,103)»; Command.CommandType = 1; Command.ActiveConnection = Connection; Command.Execute();
Устанавливаем новый запрос, который запишет в таблицу отобранные данные, и выполняем его.
// Выборка данных за прошлый месяц Выборка = Запрос.Выполнить.Выбрать(); Пока Выборка.Следующий() Цикл Command.CommandText = «INSERT INTO ..(PERIOD_ID, CO_ID, ART_ID, S ) VALUES (» + » Convert(datetime,’»+Лев(Строка(ДатаНач),10)+»‘,103)» + «,NULL» + «,»+Формат(Выборка.Код, «ЧГ=») + «,»+Строка(?(Сумма = 0,»0″,Формат(Сумма,»ЧРД=.; ЧГ=; ЧО=»))) +»)»; Попытка Command.Execute(); Исключение Сообщить(«Ошибка записи данных в базу: «+ОписаниеОшибки()); КонецПопытки; КонецЦикла;
Выборка данных и запись
Вариант ситуации, когда необходимо выполнить выборку данных, и записать результат для дальнейшей обработки. (Не забываем создавать объект Connection)
В данном случае используется объект ADODB.Recordset, который позволяет получить набор записей.
CommandText = «select g_id, saledate, sqty, scost from dbo.»+НастройкиADODB.dbo+»(‘»+Формат(НачПериода,»ДФ=yyyyMMdd»)+»‘,’»+Формат(КонПериода,»ДФ=yyyyMMdd»)+»‘) where g_id in («+СтрокаКодовТМЦ+»)»; Попытка rsRES = NEW COMObject(«ADODB.Recordset»); rsRES.Open(CommandText, Connection); Исключение Connection.Close(); Возврат; КонецПопытки Пока не rsRES.eof() Цикл НоваяЗапись = НаборЗаписей.Добавить(); Для х = 0 по 3 Цикл НоваяЗапись = rsRES.Fields(х).Value; КонецЦикла; rsRES.MoveNext(); КонецЦикла; НаборЗаписей.Записать(Истина); rsRES.Close(); Connection.Close();
Кстати, советую пользоваться функцией EOF вместо RecordCount, так как последняя очень не надежна, неопределенная во времени выполнения и может привести к «залипанию» процесса — подробнее можно почитать на форумах.
Использование хранимых процедур
Хранимые процедуры можно вызвать просот из запроса, вписав в начале текста слово «exec», либо указав соответствующий CommandType и название хранимой процедуры в CommandText.
Command = Новый COMОбъект(«ADODB.Command»); Command.CommandTimeout = 100; Command.ActiveConnection = Connection; Command.CommandText = «add_image»; Command.CommandType = 4; Создаем параметр посредством объекта Parameter (на перевес этому можно воспользоваться методом CreateParameter), и добавляем его методом Append в наше подключение.
Парам = Новый COMОбъект(«ADODB.Parameter»); Парам.Name = «@code»; Парам.Direction = 1; //1 — adParamInput Парам.Type = 201; // Парам.Size = 255; Парам.Value = ВнутреннийКод; Command.Parameters.Append(Парам);
Переводим файл, который хотим передать в двоичный поток, создаем и добавляем параметр
Поток = Новый COMОбъект(«ADODB.Stream»); Поток.Type = 1; //StreamTypeEnum.adTypeBinary = 1 StreamTypeEnum.adTypeText = 2 Поток.Open(); Поток.LoadFromFile(ПолноеИмяФайла); локПотокБайт = Новый ComSafeArray(Поток.Read()); Парам = Новый COMОбъект(«ADODB.Parameter»); Парам.Name = «@file_data»; Парам.Direction = 1; //1 — adParamInput Парам.Type = 205; //205 — adLongVarBinary Парам.Size = локПотокБайт.GetLength(); Парам.Value = локПотокБайт; Command.Parameters.Append(Парам); Command.Execute();
Мне было поручено постепенно переносить устаревшее приложение VB6 (используя MS Access в качестве базы данных, не спрашивайте) на .NET.
Это будет долгий вопрос, но я думаю, что лучше дать немного контекста.
Это приложение имеет основную форму MDI с меню, которое создается динамически на основе библиотек DLL, находящихся в папках приложения. По сути, это плагин: каждая DLL представлена пунктом меню, при нажатии на который открывается основная форма, содержащаяся в DLL, вызывая SetParent() по мере необходимости.
Форма MDI — моя отправная точка. Я хочу переписать его ровно столько (разумеется, переделывая и модульное тестирование по ходу), чтобы иметь возможность открывать указанные формы. Как только я добьюсь этого, я начну переписывать по одной DLL за раз.
Каждой DLL требуется соединение ADO, которое я смог передать с C #.
Дело в том, что один из этих плагинов (по крайней мере, но, возможно, многие другие) использует ADOX для работы с базой данных, и здесь кроется проблема: когда я пытаюсь установить свойство ActiveConnection ADOX.Catalog для соединения ADO, все Я получаю ошибку времени выполнения 3001: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
Я хоть убей не могу понять, что делаю не так.
Код VB6 настолько прост, насколько это возможно:
Dim c As New ADOX.Catalog
Set c.ActiveConnection = theAdoConnectionComingFromDotNet ' error!
Код C #, который создает соединение ADO, так же прост, как и код VB:
var conn = new ADODB.Connection();
conn.Open("Provider=Microsoft.JET.Oledb;[...]");
И вызов Open() завершается успешно. Если я попытаюсь установить ActiveConnection на стороне C #, например:
var catalog = new ADOX.Catalog();
catalog.ActiveConnection = conn;
Все работает.
Теперь я мог бы обойти проблему, просто создав экземпляр ADOX на стороне C # и передав его VB6, но настройка кода VB6 (который, конечно, не имеет ни одного модульного теста) может оказаться PITA, а я не даже уверен, что это будет легко сделать в первую очередь (потому что приложение может использовать несколько баз данных Access одновременно, открывая и закрывая соединения с каждой из них по мере необходимости).
Итак, кто-нибудь знает, что я делаю не так? С C # я пробовал ссылаться на ADODB как с вкладки .NET, так и с вкладки COM (и версия ADO, которую я выбрал на вкладке COM, является правильной: 2.5 … опять же, не спрашивайте), но все равно нет радость.
ИЗМЕНИТЬ
То же самое происходит, когда я пытаюсь назначить свойство ActiveConnection RecordSet подключению, исходящему из C #, например:
Dim rs As New ADODB.Recordset
Set rs.ActiveConnection = theAdoConnectionComingFromDotNet
Еще одно решение, которое я могу придумать, поскольку ActiveConnection является вариантом, было бы установить его в свойстве ConnectionString соединения. Это работает, но каждый раз будет создавать и открывать новое соединение, и, честно говоря, мне бы это не понравилось.
Это кажется неправильным, но это настолько подозрительно похоже на проблему, которая у меня была — когда ADO перестала работать в COM-объекте, перекомпилированном на машине Win7, а затем использованном на машине XP — что я думаю, это может быть связано с тем же . А именно катастрофическое обновление Windows, которое сломало MDAC. ADO в COM-объектах (очень длинный поток, ожидается медленная загрузка). В таком случае официальное исправление можно найти здесь.
Если это не так, и вы не можете найти решение, я думаю, что ваш лучший способ действий — просто использовать обходной путь строки подключения, который вы упомянули в своем редактировании. Это не идеально, но вы говорите, что все равно начнете переписывать библиотеки DLL, так что это будет временное решение.
1
Antagony
15 Май 2012 в 22:11
