Подключение к access из 1с
Всем привет. Возможно ли перекинуьт данные из Access в 1С при помощи delphi?
Если возможно то огромнная просьба написать об этом более подробно. Если дадите линк буду благодарен. За ранее благодарен.
masol
masol
да лазил. Тока чё то нормального не ничего. Ну ладно если ещё кто чё знает отпишитесь плиз очень надо.Пошёл лазать по 1С.
masol
Процедура ACCESS()
dbe=CreateObject("DAO.DBEngine.36");
wksp=dbe.Workspaces(0);
db=0;
// в ковычках имя фаила с расширением MDB
Если ФС.СуществуетФайл(КаталогПользователя()+"sr.mdb")=0 Тогда
// создание файла базы данных с русским порядком сортировки
db=wksp.CreateDataBase(КаталогПользователя()+"mars_sr.mdb",";LANGID=0x0419;CP=1251;COUNTRY=0");
// DDL - запрос на создание таблицы
// описание языка DDL (подмножество SQL) смотрите в хелпе по MS Access
// не пытайтесь делать это с другими форматами - DDL через DAO поддерживается только для MDB
//Создадим еще таблицу
db.Execute("CREATE TABLE BANKS
|(REC_IND INTEGER,
|BANKCODE INTEGER,
|BANKNAME TEXT ,
|ModifiedFlg BIT,
|ChangeSeqFlg BIT);"
);
// индекс на нужные поля
db.Execute("CREATE INDEX REC_IND ON BANKS (REC_IND);");
Иначе
// просто открываем базу данных в разделенном режиме
db=wksp.OpenDataBase(КаталогПользователя()+"sr.mdb");
// и очищаем имеющиеся данные
db.Execute("DELETE * FROM BANKS;");
КонецЕсли;
// rs-это как раз сама таблица, куда мы будем добавлять записи
rs=db.OpenRecordset("BANKS");
// добавление записи
rs.AddNew();
// присвоение значений полям
rs.REC_IND = "1";
rs.BANKCODE = "34";
rs.BANKNAME = "Инвест";
rs.ModifiedFlg = "1";
// запомним запись
rs.Update();
// и так далее .
db.Close(); // закрытие базы данных
КонецПроцедуры
Это наоборот в АССЕС.
Гляди в хелп. как подключитьбазу выше. как взять данные в хелпе. Дерзай.
да с Access проблемы нет вот как в 1С записать из OLE полей. Я понимаю что также подключаем её как и Access а вот что дальше. Если б было в 1с тоже что и в Access вопросов бы небыло, но всё ровно спасибо.
masol
Так вопрос стоит чтобы записать в 1С. тогда смотря какие данные. Если запись через ОЛе. То необходимо передавать не ссылки, а сами данные. А вообще через Оле это *цензура* Проше всё выгрузить в файл и от туда забрать.
Да вопрос состоит в том что в 1С записать. Выгрузить в фаил то можно а потом в 1С записать. Но как в 1С записать??Или у тя есть другое решение данной проблемы. Просто незнаю с какой стороны подойти.
masol
Ну ты фу ты. С этого и надо начинать. т.е. в 1с знаний 0. Здесь зависит уже от конкретики. Какая кофигурация, что хочешь записать. Самый простой способ. это
ВЗЯТЬ КНИГУ ПО ВСТРОЕННОМУ ЯЗЫКУ.
НУ как 0 ну ставить могу. Но это не суть. Короч давай я те раскажу всю ситуацию как есть.
Есть у меня база на Access и в ней данных порядочно. и эти данные мне надо перекинуть в 1С:Предприятие7.
masol
Ставить. Понятно. Это необходимо писать обработку. Можно написать её впринципе для всех справочников и дл всех документов. Но необходимо настроить обмен. Т.е чтобы поля в файле и в 1с совпадали. Т.е. Наименование совпадало с Наименованием, ну понятно я думаю.
Вот пример- это стандартная обработка идет с 1С
Если сможешь привести к токаму виду, то без проблем.
"Справочник 1","Элемент.ДисконтныеКарты","Записан","?Код()1","Наименование()","ШтрихКод()1100001000012","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 2","Элемент.ДисконтныеКарты","Записан","?Код()2","Наименование()","ШтрихКод()1100002000028","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 3","Элемент.ДисконтныеКарты","Записан","?Код()3","Наименование()","ШтрихКод()1100003000034","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 4","Элемент.ДисконтныеКарты","Записан","?Код()4","Наименование()","ШтрихКод()1100004000040","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 5","Элемент.ДисконтныеКарты","Записан","?Код()5","Наименование()","ШтрихКод()1100005000056","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 6","Элемент.ДисконтныеКарты","Записан","?Код()6","Наименование()","ШтрихКод()1100006000062","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 7","Элемент.ДисконтныеКарты","Записан","?Код()7","Наименование()","ШтрихКод()1100007000078","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 8","Элемент.ДисконтныеКарты","Записан","?Код()8","Наименование()","ШтрихКод()1100008000084","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 9","Элемент.ДисконтныеКарты","Записан","?Код()9","Наименование()","ШтрихКод()1100009000090","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 10","Элемент.ДисконтныеКарты","Записан","?Код()10","Наименование()","ШтрихКод()1100010000102","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 11","Элемент.ДисконтныеКарты","Записан","?Код()11","Наименование()","ШтрихКод()1100011000118","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 12","Элемент.ДисконтныеКарты","Записан","?Код()12","Наименование()","ШтрихКод()1100012000124","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 13","Элемент.ДисконтныеКарты","Записан","?Код()13","Наименование()","ШтрихКод()1100013000130","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 14","Элемент.ДисконтныеКарты","Записан","?Код()14","Наименование()","ШтрихКод()1100014000146","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
"Справочник 15","Элемент.ДисконтныеКарты","Записан","?Код()15","Наименование()","ШтрихКод()1100015000152","Скидка()3","СколькоПокупок()0","ДатаПок() . . ","ФамилияИмяОтчество()","Напечатан()1"
Пришлось перекопать множество материалов пока не наткнулся на книгу А. Михайлова "1C: Предприятие 7.7/8.0: системное программирование. Данный код можно использовать в отчетах для их выгрузки в файл ACCESS.
//Создаем файл Access
dbe = Новый COMОбъект("DAO.DBEngine.36");
Путь = Имя + "\"+ИмяФайла+".mdb";
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source ADOX.Catalog");
// Создание новой таблицы
Table = Новый COMОбъект("ADOX.Table");
// Создание новой колонки
// adDouble = 5 Значение с плавающей точкой двойной точности
// adCurrency = 6 Денежная сумма
// adBoolean = 11 Булево
// adVarWChar = 202 Символьная строка Unicode, заканчивающаяся NULL
// adLongVarWChar = 203 Длинное строковое значение
Column = Новый COMОбъект("ADOX.Column");
Column.Type = 5; // Число
// Присоединение колонки к таблице
Column = Новый COMОбъект("ADOX.Column");
Column.Type = 202; // Строка
// Присоединение колонки к таблице
// Присоединение созданной таблицы (листа)
СтрокаПодключения = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Путь + ";""";
Connection = Новый COMОбъект("ADODB.Connection");
Запись = Новый COMОбъект("ADODB.RecordSet");
ТекстЗапроса = "SELECT * FROM DistrSalesReport";
Запись.Open(ТекстЗапроса, Connection, 1, 3);
//Здесь ваш запрос или тз для выгрузки
//Бежим по выборке запроса 1С
Пока Выборка.Следующий() Цикл
// Добавление новой записи в колонки
Запись.Fields(1).Value = "Какая то строка";
Специальные предложения
Судя по всему - вы открыли для себя Recordset и работу с Jet соединением, что в принципе, само по себе не несет ценности сообществу.
Вот если бы описали бы и выложили прокси-модуль, которому скармливаешь таблицу значений, например, и он отрабатывает - была бы польза.
А по теме - довольно странно, что базу вы создаете новую программно. По-идее, база должна сначала разрабатываться, со своей структурой - смысл Access - интеграция с офисными приложениями, формы, репорты - этого нет. Хотя, может такая задача - просто странно.
У меня была конкретная задача: сделать отчет и выгрузить его в файл ASSECC по заранее определенной структуре (2 таблицы и определенное количество и названия столбцов). Порылся на этом сайте, решения не нашел. Сделал свое. Я описал лишь свой опыт не претендуя на новизну (это не научная статья). Другому программисту 1С при выполнении схожей задачи будет проще. Хорошо тогда как под 1С создать по вашему файл Assecc?
(2) Добрый день.
Если у Вас заранее определенная структура файла базы - то зачем его каждый раз создавать. Сделали шаблон, скопировали, заполнили.
Добрый день! У меня пользователь сам выбирает куда ему сохранять файл с отчетом + имя этого файла приходиться генерить.
EliasShy, конечно можно использовать "заготовку файла Assecc" нужной структуры, как вариант сохранять его в двоичные данные или active document, но это тема отдельной статьи.
(8) Ну на счет отдельной статьи - надеюсь Вы пошутили.
Было бы интересно, если бы сделали наподобие прокси-класса для работы с базами Access. Однако практическая ценность дальше "интересно" вряд-ли распространится.
Просмотры 31886
Загрузки 0
Рейтинг 5
Создание 31.10.13 16:56
Обновление 31.10.13 16:56
№ Публикации 205721
Тип файла Нет файла
Конфигурация Не имеет значения
Операционная система Windows
Страна Россия
Вид учета Не имеет значения
Доступ к файлу Бесплатно (free)
Код открыт Не указано
Главное отличие онлайн-тренажера - отработка теории в группах с последующим разбором, сразу, никаких автовебинаров.
См. также
Минимализмы 3 Промо
19.02.2018 51385 ildarovich 47
Изменения формата файлов конфигурации (CF) в 8.3.16
Дополнение по формату файлов конфигурации (*.cf) в версии 8.3.16.
16.12.2021 2258 fishca 10
Что за ? в коде, или Секретный оператор в 1С
Инкремент, модуль и прочая магия, которая скрыта под символом "?"
21.10.2021 11507 SeiOkami 42
Механизм анализа данных. Кластеризация.
Подробный разбор, с примером использования, встроенного механизма кластеризации 1С.
31.08.2021 3000 dusha0020 8
Этюды по программированию. Взаимодействие с Microsoft Word Промо
Часто приходится заниматься созданием сложных документов Word с таблицами, вложенными фрагментами, хитрым оформлением и прочими радостями жизни. Это - попытка как-то структурировать полученный опыт, чтобы не приходилось перерывать ворох старых обработок в поисках крупиц истины. Надеюсь, эта статья будет полезна и Вам.
11.12.2017 34060 milkers 23
Распределенные алгоритмы РИБ 1С
Небольшое исследование на тему применимости классических распределённых алгоритмов репликации и синхронизации данных между узлами обмена РИБ 1С.
02.07.2021 1531 zhichkin 1
15.06.2021 2745 zhichkin 11
ВИДы на жительство. Использование внешних источников данных в прикладных задачах
На Infostart Meetup Novosibirsk выступил ведущий разработчик МКК «Ваш Инвестор» Вадим Фоминых. Он на практических примерах показал коллегам, как его команда использует внешние источники данных в прикладных задачах, призвал не отказываться от этого инструмента и объяснил – почему.
19.04.2021 2424 Shmell 5
Будни автоматизации или "мне нужна программка для 3D упаковки" Промо
Автоматизация отечественных предприятий, которой приходиться заниматься, это нужная и высокооплачиваемая, но довольно нервная работа. Выручает юмор. Например, при общении с требовательным клиентом можно вспомнить анекдот: "Держась руками за стену, на ногах еле стоит мужик. К нему пристает ребенок: "Ну, папа, пожалуйста, сделай мне кораблик!", папа отвечает: "Ага! - Сейчас все брошу и пойду делать тебе кораблик!". Про один такой сделанный для клиента "кораблик" и хочется рассказать. Надеюсь, совместное погружение в теплое ламповое (то есть клиентоориентированное) программирование доставит Вам положительные эмоции, да и задача попалась интересная. Поплыли?
24.03.2014 47543 ildarovich 119
Чем воспользоваться для распознавания котиков в 1С?
На митапе по инструментам для расширения возможностей 1С выступил Олег Филиппов. Он сравнил подходы Native API, COM, Docker и Serverless, и рассказал, как упростить использование в 1С алгоритмов, реализованных на других языках, с помощью облачной технологии «Функция как сервис».
12.04.2021 3892 comol 10
Правила обмена больше не нужны
Есть несколько общепринятых подходов к написанию обмена между 1С-системами, каждый из которых упирается в длительное изучение технологии, мучительную отладку правил конвертации и написание большого количества сервисного кода, в котором потом тяжело разобраться. О принципах работы универсального фреймворка liteExchange, который реализует быстрые обмены между 1С и внешними системами, и берет на себя всю техническую обвязку по стандартному преобразованию данных, на INFOSTART MEETUP Saint Petersburg.Online рассказал Николай Крылов.
17.03.2021 14922 Nikola23 40
Работа с Ворд через СОМ-Объект
Статья представляет собой еще один велосипед на тему формирования документов на основе шаблонов через СОМ-Объект. Как и все другие велосипеды, этот написан потому, что другие велосипеды - плохие. В действительности, если погуглить, мы получим огромное количество ссылок на советы в стиле "сделай так и будет тебе счастье". Но почему "так", зачем "так", какие есть альтернативы - авторы советов не раскрывают. Хуже того, половина найденных таким способом рецептов окажутся откровенно вредными. Судя по тому, как вредные рецепты копируются из совета в совет, большинство разработчиков, из тех, что переписываются на форумах, просто воспроизводят то, что когда-то нагуглили сами. Ну да, работает - не трогай :-)
Время показало, что приложения для работы с электронными таблицами, в том числе и Microsoft Excel, имеют потрясающие возможности для сбора, систематизации и анализа различных данных. Трудно представить бизнес, где бы не использовали этот инструмент. Вне зависимости от размера компании в ней обязательно используют электронные таблицы в том или ином виде.
Все те, кто работают с платформой 1С и решениями на ее основе не по наслышке знают, что Excel является чуть ли не главным инструментом бухгалтеров, аналитиков, финансистов и многих других специалистов.
Коллеги, Вы только вспомните сколько было сделано выгрузок из 1С в Excel! Сколько человеко-часов на это было потрачено!
Нет, нет! Excel ни в коем случае не является заменой учетных систем 1С, ведь назначение у них совершенно разное. Уберите оружие! Он скорее инструмент локального пользования для более гибкой обработки данных, ведь в 1С это не всегда сделать также просто, как в Excel.
Но если все так хорошо, то почему статья будет про Access? Неужели им кто-то еще пользуется? И на самом деле пользуется!
Excel vs. Access
Эпичной битвы не будет! Мы просто сравним два отличных инструмента по 9 критериям и опишем ситуации, когда Access может быть более подходящим вариантом.
Критерий | Excel | Access |
Назначение | Создание графиков, диаграмм и различных моделей данных. | Приложение базы данных для сбора и сортировки данных. |
Использование | Построение финансовых, статистических и других моделей, а также возможность проверки данных при вводе. | Сбор, сортировка и изменение информации в базах данных. |
Размер хранилища | Имеет ограничения по количеству строк (1 048 576) и столбцов (16 384), а также другие ограничения. Подробнее смотреть здесь. | Ограничения на макс. размер базы (2 ГБ) и другие. Подробнее смотреть здесь. |
Возможность доработки | Очень просто. Это может сделать любой пользователь Excel, конечно, если дело не касается макросов или других специфичных вещей. | Сложно, поскольку требуются знания по построению баз данных и других особенностей. |
Применимость | Больше всего подходит для анализа данных (финансовых, статистических или любых других). | Больше подходит для хранения данных. Ориентировано больше на малый бизнес. |
Изучение | Прост в изучении. | Тяжелее в изучении по сравнению с Excel. |
Реляционный или линейный | Не реляционное хранилище данных. | Для хранения используется реляционная модель. |
Знание программирования | В большинстве случаев знания программирования не нужны. | Знания программирования обязательны для работы с базами данных Access. |
И так, Access меньше ограничен в объемах выгрузки данных и позволяет строить реляционную модель хранения информации. Кроме того, можно делать произвольные SQL-запросы к таблицам для обработки данных. Во всем остальном Excel удобнее и эффективнее. Это если смотреть общую информацию, поэтому поклонников Access прошу не идти на несанкционированный митинг в комментариях! Тем более никто не мешает подключиться к базе Access из Excel и работать в последнем.
Таким образом, когда нужно выгрузить информацию из базы 1С в большом объеме и при этом у конечного потребителя нет навороченной СУБД, или просто стандарт работы через Access, или же есть реализованная на нем бизнес-логика, то почему бы не использовать его? Также иногда нужно обойти ограничение Excel в 1 миллион строк и выгрузить данные одним набором. В последнем случае база данных Access также может быть хорошим выбором.
Конечно, вместо Excel или Access есть масса других вариантов, но в зависимости от требований они не всегда могут подходить:
- CSV-файлы - их трудно анализировать, да и подходит это больше для последующей загрузки в другой источник данных.
- База SQL Server / PostgreSQL - отличный вариант, вот только не все конечные пользователи могут позволить себе настройку этого ПО.
- Разбить выгрузку Excel на несколько файлов? Отлично! Попробуйте собрать отчетность из 15 файлов Excel по 1 миллиону записей, тогда и поговорим!
- И др.
Далее поверхностно пробежимся по вопросу лицензирования и наконец-то перейдем к разработке.
Немного про лицензии
Этот вопрос очень важный, поскольку можно здорово напортачить, от чего в будущем могут быть проблемы из-за нарушения лицензионного соглашения Microsoft на их ПО. Дело тут вот в чем.
Выгрузка или другие действия в 1С должны выполняться на стороне сервера 1С, т.к. только там мы можем работать с запросами, таблицами значений или с системой компоновки данных. Конечно, есть еще толстый клиент и файловые базы, но сейчас они не представляют особого интереса, ведь тонкий клиент более предпочтительный вариант для прикладных решений. А для файловых баз проблема лицензирования офиса вообще не стоит, т.к. обычно все кто с этой базой работают уже имеют установленный офисный пакет. Получается, что для того, чтобы сервер 1С мог работать с базами данных Access нужно выполнить одно из следующих действий на сервере 1С:
- Установить полный пакет Microsoft Access.
- Установить пакет "Microsoft Access Database Engine 2016 Redistributable".
- И последний вариант - установить "Microsoft Access 2016 Runtime".
Самым простым вариантом выглядит установка полного пакета приложения MS Access на сервере, но это сильно нарушает лицензионное соглашение. В этом случае потребуется покупка лицензий на Office не только для сервера, но и клиентские лицензии для всех пользователей, которые работают с этим сервером. В нашем случае для всех, кто работает в 1С на этом сервере. А если пользователей 1000? И их становится все больше? Докупать лицензии? Это будет не дешево. В некоторых случаях лицензия может вообще запрещать такое развертывание, но на подробностях уже не будем останавливаться.
Второй вариант - это установка только ODBC-драйвера в пакете Microsoft Access Database Engine 2016 Redistributable. Да, это будет работать! Access устанавливать не нужно, а мы сможем работать с базой данных Access через ADO-соединение. Но и тут не все просто! Если перейти по ссылке и посмотреть детальную информацию, то там черным по белому написано, что этот пакет не может использоваться для:
- Для замены Ace (нас это сейчас не интересует).
- Для замены Jet OLEDB (из 1С тоже можно работать через Jet с базами Access, но это уже другая история).
- Как замена основных систем управления базами данных, электронными таблицами или документами.
- И самый главный пункт - использоваться как системная служба или программа серверной части приложения.
Фактически, этот пакет предназначен для клиентских компьютеров, которые подключаются к различным источникам данных
Третий вариант - установка Microsoft Access 2016 Runtime. Согласно информации на странице, для установки и распространения не требуется покупка дополнительных лицензий, т.к. этот пакет содержит лишь среду выполнения, которая используется для запуска уже готовых решений. Средства разработки в ней отсутствуют. При этом в состав пакета также входит установщик ODBC-драйвера, который нам и нужен.
На практике видел использование второго и третьего варианта, причем аудит от Microsoft не выявлял в этом случае никаких нарушений. Возможно, установка Microsoft Access Database Engine 2016 Redistributable формально и может являться нарушением соглашения, но по факту его никто не проверяет.
Все вышесказанное относится и к другим продуктам MS Office, в том числе и Excel, Word и т.д. Интересная информация по лицензированию есть здесь, можете прочитать там про "Access Runtime".
Нашли ошибку или не согласны что лицензирование работает именно так? Пишите в комментариях!
Простые примеры
В основном мы сосредоточимся на задачах выгрузки данных в Access. Операции загрузки также возможна, но она всегда достаточно простая и очень сильно завязана на условиях задачи (что и куда загрузить, как преобразовывать данные из базы и т.д.). Приведу лишь небольшой пример загрузки данных.
Все просто - создаем соединение с базой данных Access через ADO, создаем команду чтений данных в виде набора и обрабатываем его. После освобождаем ресурсы.
С выгрузкой данных все куда интересней, потому что проблемы сложнее:
- ODBC-драйвер не позволяет создать пустую базу. Тут либо иметь уже готовый файл с нужными таблицами или придумывать альтернативный вариант (что и было сделано, но об этом позже).
- При выгрузке всегда одного набора данных задача упрощается, но что если нужно выгружать каждый раз разные наборы. Например, нужно выгружать отчет на СКД и учитывать, что настройки (выводимые поля) пользователь может изменять. То есть нам нужно научиться создавать таблицы в Access, сопоставляя типы 1С с доступными типами MS Access.
- Нужно учесть ограничения базы Access на различные типы, а также на сам ODBC-драйвер. Например, что выгрузка в Access не поддерживает даты меньше 1753 года, если используется ODBC-драйвер.
- Также необходимо учитывать максимальный размер базы данных в 2 ГБ. Тут в качестве решения может быть настройка максимального количества выгружаемых записей для одной базы. В случае необходимости выгрузка будет выполняться в несколько порций.
То есть на практике нужно быть готовым к выгрузке произвольных наборов данных. которые в 1С могут быть представлены таблицей значений, запросов или результатом компоновки данных отчета. Если бы этих проблем не стояло, то алгоритм выгрузки был бы примерно такой.
Но вернемся все же к реальным требованиям. Для упрощения разработки и сопровождения сделаем прокси-функцию, которая позволит выгружать в Access таблицы значений, запросы и результаты СКД.
Прокси, прокси, прокси
Начнем с описания что в итоге нужно получить. Интерфейс выгрузки будет представлен тремя функциями:
- ВыгрузитьТаблицуЗначений(КаталогВыгрузки, ИсточникДанных)
- ВыгрузитьЗапрос(КаталогВыгрузки, ИсточникДанных)
- ВыгрузитьРезультатКомпоновки(КаталогВыгрузки, СхемаКомпоновкиДанных, Настройки)
Примеры работы с ними ниже под спойлером.
Все функции находятся в общем серверном модуле "РаботаСAccessСервер" и возвращают структуру результата выгрузки с количеством выгруженных записей.
Устанавливаем БД MySQL
Создание подключения
Для начала немного теории:
Есть такая идея - предоставить программисту универсальный интерфейс для обращения к базам данных (и не только к ним). С другой стороны, каждый производитель базы данных который хочет предоставить доступ к своей базе, пишет ODBC driver. Получается, что если ты как программист умеешь работать с ODBC, то не важно с какой базой ты работаешь, главное что б был установлен ODBC driver к той базе.
OLEDB – продолжение этой идеи. Это универсальный компонент для работы с различными источниками данных. Он позволяет "унифицировать" объектный интерфейс, то есть создать "прокладку" между БД и программистом, т.е. программисту так-же уже не важно знать специфику подключения к тому или иному источнику данных. Но это вовсе не ODBC. LEDB это высокоскоростная COM-технология MS доступа к базам данных.
Что из них медленней, что быстрее Вы уже решите сами в последствии.
Вот примеры строк соединений для разных технологий:
ODBC:
DRIVER=; SERVER=localhost; DATABASE=BDn; UID=root; PASSWORD=; OPTION=3;
OLEDB:
Provider=Microsoft.Jet.OLEDB.4.0; User Password=; Data Source=c:\odbc.mdb;Mode=ReadWrite|Share Deny None;
Для начала создадим новый проект, добавим в него модуль и нарисуем формочку для наших тестов. Формочка будет у нас такого вида:
1) Разместим на форме элемент управления закладками – TabControl, сделаем два слоя: Соединение с MySQL и Соединение с Access. На слои поместим Label–ы, TextBox-ы и Button-ы:
Слой "Соединение с MySQL":
Элемент
Свойство Name
Свойство Text
Слой "Соединение с Access":
Элемент
Свойство Name
Свойство Text
2) Создадим вне слоёв Label – "Строка соединения" и TextBox:
Элемент
Свойство Name
Свойство Text
В модуле напишем (далее с комментариями):
В модуле формы напишем (далее с комментариями):
Теперь скомпиляем проект и посмотрим что получиться. Для начала поместим по пути c:\odbc.mdb (настройки пути можно изменить) предварительно сделанный в Access - odbc.mdb. Так – же создадим таблицу в БД MySQL - BDn (настройки так-же изменить) – если это Денвер, то с помощью PhpMyAdmin включенной в пакет поставки. Теперь выберем одну из вкладок и сначала нажмем «Создать строку соединения» и далее «Тест». У некоторых он будет безотказно работать с первого раза :) .
В некоторых случаях удобно выгрузить из 1С какие либо данные в Access для дальнейшей работы. Работа осуществляется через ADODB.Connection, причем возможно использование языка запросов Transact SQL. Пример ниже:
adOpenForwardOnly = 0 ; // код состояния
adLockPessimistic = 2 ; // режим блокировок
adOpenStatic = 3 ; // режим открытия соединения
adStateOpen = 1 ; // код открытия соединения
ИмяФайла = «C:\MyFile.accdb» ; // имя файла
// строка подключения к файлу БД Access
conn_str = «Provider=Microsoft.ACE.OLEDB.12.0; Data Source=» + ИмяФайла + «;»»» ;
cn = Новый COMОбъект ( «ADODB.Connection» ); // объект для соединения
cn . Open ( conn_str ); // соединяемся с БД Access
Если ( cn . State <> adStateOpen ) тогда // проверка открытия соединения
Сообщить ( «Не удалось открыть ADODB.Connection» );
Возврат;
КонецЕсли;
rs = Новый COMОбъект ( «ADODB.Recordset» ); // объект для обхода строк
rs_select = Новый COMОбъект ( «ADODB.Recordset» );
strSQL = «customers» ; // таблица Access, с которой имеем дело
rs . Open ( strSQL , cn , adOpenStatic , adLockPessimistic ); // открываем таблицу
strSQL = «select name from customers where >; // sql запрос к таблице
rs_select . Open ( strSQL , cn , adOpenStatic , adLockPessimistic ); // делаем выборку
Если rs_select . EOF = Ложь тогда // проверка наличия записей в выборке
Сообщить ( «Нет строки с таким идентификатором: « );
rs_select . Close (); // закрываем выборку
rs_select = Неопределено; // уничтожаем лишние данные
КонецЕсли;
Попытка
rs . AddNew (); // добавить новую строку в табл customers
rs . Fields ( 0 ) . Value = 250 ; // имя нового контрагента
rs . Fields ( 1 ) . Value = «Новый контрагент» ; // имя нового контрагента
rs . Update (); // записать новую строку в таблицу
// вывод на печать строки по колонкам
Для Каждого col Из rs . Fields Цикл
Сообщить ( «Колонка « + col . Name + » = « + Строка ( col . Value ));
КонецЦикла;
Исключение
// исключение может быть вызвано наличием сроки с таким же
// идентификатором
Если rs . ActiveConnection . Errors ( 0 ). Number = -2147217887 тогда
Сообщить ( «Такая запись уже есть в таблице» );
Иначе
Сообщить ( ОписаниеОшибки ()); // другая ошибка
КонецЕсли;
КонецПопытки;
// закрываем выборку, если она открыта
Если ( rs . state = adStateOpen ) тогда
rs . Close ();
КонецЕсли;
// закрываем соединение с БД, если оно открыто
Если cn . state = adStateOpen тогда
cn . Close ();
КонецЕсли;
// уничтожаем лишние данные
rs = Неопределено;
cn = Неопределено;
Читайте также: