Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > VB for Application > Как вытащить справочники из 1С через V83.COMConnector |
Автор: Marchello 30.01.18, 12:57 |
Всем здравия! Опыта в 1с нет, тч извиняйте. Конектюсь через СОМ. В общем задача вытащить все данные из: Справочники: Номенклатура, Контрагенты. Можно ли их вытащить сразу двумерной таблой? Если нет, то как построчно вывести? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Dim cntr As Object Dim trade As Object Dim Òîâàð As Object Set cntr = CreateObject("V83.COMConnector") Set trade = cntr.Connect("File=""C:\Program Files\1cv8""; Usr=""Пупкин"";") На этом мои познания закончились, т.к. дальше 1С код идет. Если можно примеры вывода и ввода. Заранее весьма благодарен. |
Автор: Akina 30.01.18, 13:19 |
https://forum.infostart.ru/forum9/topic141309/ См. "// Пример на языке MS Visual Basic". А использовать - как обычный рекордсет, с поправкой на имена его методов и свойств. |
Автор: Marchello 30.01.18, 14:37 |
Цитата Akina @ https://forum.infostart.ru/forum9/topic141309/ См. "// Пример на языке MS Visual Basic". А использовать - как обычный рекордсет, с поправкой на имена его методов и свойств. На последней строке выдаёт ошибку. С чем это может быть связано? Может какой реф ему ещё нать? Добавлено Может админ что перекрыл или в 1с? Я первый кто конектится так у нас. |
Автор: Akina 30.01.18, 18:04 |
У тебя есть и 1С, и коннектор, и ещё много чего. У меня нет ничего вышеперечисленного, включая интерес. И кто из нас должен экспериментировать и читать маны? Или хотя бы смотреть в окно OB и на сообщения об ошибках? |
Автор: Gonarh 30.01.18, 20:46 |
Покопался в загашниках 12-летней давности, накопал компонент для делфей как раз основанный на COM к одинэске, вот модуль. ПЫСЫ. Программирование тогда только начинал постигать, т.ч. говнокод присутствует в огромных дозах, типа утечек памяти и глобальных переменных, но всё что тебе надо и даже больше чем надо там есть. ole1c.pas (, : 308) |
Автор: Bas 30.01.18, 23:41 |
Версия 1С какая? |
Автор: Marchello 31.01.18, 05:29 |
1С:Предприятие 8.3 (8.3.10.2650) Бухгалтерия предприятия, редакция 3.0 (3.0.57.17) |
Автор: ^D^ima 31.01.18, 11:00 |
Это у тебя реально там база лежит, или ты коннектишся к экзешнику? Добавлено <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Sub Кнопка1_Щелчок() Dim cntr As Object Dim Buh As Object Dim Контрагенты As Object Dim Выборка As Object Dim n As Integer Dim Count As Integer Set cntr = CreateObject("V83.COMConnector") Set Buh = cntr.Connect("File=""C:\TestBase\Каврецкая"";") Set Контрагенты = Buh.Справочники.Контрагенты Set Выборка = Контрагенты.Выбрать() n = 1 While Выборка.следующий() = True Cells(n, 1).Value = Выборка.Наименование Cells(n, 2).Value = Выборка.ИНН n = n + 1 Wend End Sub Добавлено Тебе придется указывать конкретные реквизиты этих справочников |
Автор: Marchello 31.01.18, 12:46 |
Цитата ^D^ima @ Это у тебя реально там база лежит, или ты коннектишся к экзешнику? Хороший вопрос! Админа вымучил. Короче база лежит на серваке, у юзеров клиенты. Работает через постгри. То что реквизиты указывать это я понимаю. Мне примерчик нужен как именно из ёкселя обращаться к таблам и запросы делать. Дальше уже сам буду разбираться. |
Автор: ^D^ima 31.01.18, 12:51 |
Не важно. Как в 1с-ке строка подключения, то и сюда пихай.В списке баз внизу строка. Добавлено выше примерчик |
Автор: kosten 31.01.18, 13:14 |
Вот пример для 1С. Сам адаптируешь для экселя. |
Автор: ^D^ima 31.01.18, 13:34 |
Добавил в пример запрос <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Sub Кнопка1_Щелчок() Dim cntr As Object Dim Buh As Object Dim Контрагенты As Object Dim Выборка As Object Dim Запрос As Object Dim ВыборкаЗапрос As Object Set cntr = CreateObject("V83.COMConnector") Set Buh = cntr.Connect("File=""C:\TestBase\Каврецкая"";") Set Контрагенты = Buh.Справочники.Контрагенты Set Выборка = Контрагенты.Выбрать() n = 1 While Выборка.следующий() = True Cells(n, 1).Value = Выборка.Наименование Cells(n, 2).Value = Выборка.ИНН n = n + 1 Wend Set Запрос = Buh.NewObject("Запрос") Запрос.Текст = "ВЫБРАТЬ Номенклатура.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Код = &Код" Запрос.УстановитьПараметр "Код", "00-00000291" Set ВыборкаЗапрос = Запрос.Выполнить.Выбрать() While ВыборкаЗапрос.следующий() = True Cells(1, 3).Value = Выборка.Наименование Wend End Sub |
Автор: Marchello 31.01.18, 13:38 |
Цитата ^D^ima @ Все равно не хочет. На первом set дольше висит но выдаёт ту же ошибку. Может где что-то не так пишу? Визуально базу на серваке не видно. Может быть из-за этого? Как проверить что ее хоть видит V83 при конекте? Не понятно то ли база его отпихивает, то ли не видит вообще его. У нас стандартная версия, может быть отключена внешняя обработка? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Sub Excel_to_trade() Dim cntr As Object Dim trade As Object Set connector = CreateObject("V83.COMConnector") Serv = "1c8server" Bs = "SRV-BUH" User = "Ìàð÷åâñêèé Ä. Å." Pass = vbNullString Set trade = connector.Connect("Srvr=""1c8server"";Ref=""SRV-BUH"";") Set trade = connector.Connect("Srvr=" & Serv & ";" & "Ref=" & Bs & ";" & "Usr=" & User & ";" & "Pwd=" & Pass) Set trade = connector.Connect("Srvr=" & Serv & ";" & "Ref=" & Bs & ";" & "Usr=" & User & ";" & "Pwd=" & Pass & ";") End Sub |
Автор: ^D^ima 31.01.18, 13:54 |
Ты в 1С базу-то открываешь? Добавлено советую что-бы идти дальше локально поставить копию к себе файловую базу. |
Автор: Marchello 31.01.18, 14:02 |
Цитата kosten @ Благодарю. Цитата ^D^ima @ Благодарю, то что надо. Осталось только подключиться. Добавлено Цитата ^D^ima @ Алгоритм какой использовать? Открыть локального клиента, а потом конектиться из экселя к серваку без указания паса и логина? Или както ещё? |
Автор: MIF 31.01.18, 14:07 |
попроси админа установить и сконфигурировать 1С клиента на твоем компьютере. Эта акция поможет найти потерянные компоненты и фиксануть некорректные сеттигнги компьютера ( типа неоткрытого порта в фаерволе). |
Автор: Marchello 31.01.18, 14:13 |
Цитата MIF @ Он не знает толком сам 1с, у нас офиц поддержка. |
Автор: MIF 31.01.18, 14:19 |
Неважно, зовут его Админ или Офисиальная Поддержка. Важно, что он умеет устанавливать и конфигурировать клиеттскую |
Автор: ^D^ima 31.01.18, 14:26 |
Marchello Прости за не скоромный вопрос, но сам сам ком коннектор от 1с у тебя установлен? |
Автор: Marchello 01.02.18, 05:25 |
Цитата ^D^ima @ да. в реферах он активен и запуск проходит без ошибки. А на подключ к базе ругается. Может ещё что-то надо подгрузить в рефах? А может действительно что-то с правами. Я в глубинке нынче сижу, народ темный, боится всего нового для них. Настолько все ограничено, что я месяц боролся за то чтоб мне сделали возможность просмотра последних документов. А то и их не видно. Через месяц эксель поставили, а через два 1с. Вот теперь следующий этап борьбы со страхами. Добавлено Полная переустановка клиента? ____________________1.png (, : 678) |
Автор: ^D^ima 01.02.18, 06:09 |
так и проверь из 1с-ки на твоем ПК открывается ли база? если да и через сом откроется тогда. |
Автор: Marchello 01.02.18, 06:13 |
На компе открывается, а через эксель нет. Я там выше рефер сфоткал, может чего не хватает? Может ли nod32 коцать соединение? |
Автор: ^D^ima 01.02.18, 07:06 |
это на этом что-ли? Если да, то как я понимаю он даже до коннекта к базе не доходит |
Автор: kosten 01.02.18, 07:13 |
Цитата CreateObject("V83.COMConnector") может V82.COMConnector попробовать? |
Автор: ^D^ima 01.02.18, 07:27 |
Кстати если на серваке версия 1С сервера из дистрибутива 8,3,10,2560, то V82.COMConnector подключится? |
Автор: kosten 01.02.18, 07:34 |
Цитата ^D^ima @ Кстати если на серваке версия 1С сервера из дистрибутива 8,3,10,2560, то V82.COMConnector подключится? Может ругнуться на несовместимость версий клиента и сервера. |
Автор: Marchello 01.02.18, 07:50 |
Цитата ^D^ima @ нет, это сам конект. там два SETa подключения к базе. Добавлено Цитата kosten @ у меня такого нет. С базой 83 идет. |
Автор: ^D^ima 01.02.18, 08:45 |
Так на какой строке и какая ошибка? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set trade = connector.Connect("Srvr=""1c8server"";Ref=""SRV-BUH"";") Set trade = connector.Connect("Srvr=" & Serv & ";" & "Ref=" & Bs & ";" & "Usr=" & User & ";" & "Pwd=" & Pass) Set trade = connector.Connect("Srvr=" & Serv & ";" & "Ref=" & Bs & ";" & "Usr=" & User & ";" & "Pwd=" & Pass & ";") |
Автор: Marchello 01.02.18, 11:06 |
Цитата ^D^ima @ На всех одна и та же. ____________________.png (, : 688) |
Автор: kosten 01.02.18, 11:54 |
Marchello, зайди в базу в режиме предприятия и сделай скрин окна с информацией о программе. Выложи сюда. |
Автор: evGenius 01.02.18, 17:08 |
Цитата ^D^ima @ так и проверь из 1с-ки на твоем ПК открывается ли база? если да и через сом откроется тогда. Не факт, там отдельное право есть у роли, "Automation" называется. Добавлено Можно через Метаданные() все имена реквизитов вытянуть. Добавлено А в чем вообще исходная задача? Может проще из 1С соответствующие данные в Excel выгрузить, а не наоборот. Обычно так попроще. |
Автор: MIF 01.02.18, 18:16 |
1. Совпадают ли строки строки соединения в клиенте и экселе? 2. Проведи анализ переменной коннектора после инициализатора в дебаггере. Есть ли у обьекта аттрибут Error? Есть ли свойства, выбрасывающие исключения? 2. Попробуй раннее связывание. Работает ли инициализасия? Можно ли обьявить обьект коннекторa WithEvents? Ест. Ли у обьекта событие OnError? |
Автор: ^D^ima 02.02.18, 06:15 |
будем знать. Спасибо |
Автор: Marchello 02.02.18, 08:54 |
____________________2.png (, : 658) |
Автор: kosten 02.02.18, 08:58 |
Скриншот с ошибкой это из рабочего варианты, который ты пытаешься сделать? |
Автор: Marchello 02.02.18, 09:03 |
Цитата evGenius @ А в чем вообще исходная задача? Может проще из 1С соответствующие данные в Excel выгрузить, а не наоборот. Обычно так попроще. Задача фулдуплекс с экселем сделать. Сам фейс в екселе для продаж, закупок, логистов и возможно еще для склада. Бухгалтерия и финансы в 1с остаются. Добавлено Цитата kosten @ У мя открывается скрин. МОжет глюкануло у тя? Добавлено Цитата kosten @ Это та которая у меня стоит, клиентка. Добавлено Цитата MIF @ Дебагер экселя или цеплять надо отдельной какойнить прогой? |
Автор: Marchello 02.02.18, 09:14 |
Еще разок скрин ____________________2.png (, : 691) |
Автор: kosten 02.02.18, 09:18 |
Ни одной строки подключения к базе из скрина я так и не увидел. |
Автор: Marchello 02.02.18, 09:27 |
Цитата MIF @ Блин, я WithEvents никогда не юзал. Бум лопатить буквы. Добавлено Цитата kosten @ В этом окне что-то ещё должно быть? |
Автор: Bas 02.02.18, 16:43 |
Я может и ошибаюсь. но... 1С это надстройка над MS SQL, так сказать "движок". И доступы они не могли ограничить на уровне Базы, только на уровне интерфейса 1С. PS Надо изучить 1С , можкт работу найду |
Автор: evGenius 03.02.18, 06:25 |
Цитата Bas @ Я может и ошибаюсь. но... 1С это надстройка над MS SQL, так сказать "движок". И доступы они не могли ограничить на уровне Базы, только на уровне интерфейса 1С. Наш топикстартер пытается подключаться не к базе MSSQL, а к высокоуровневой прослойке-базе 1С над ней, так что доступ на этом уровне может быть ограничен. Можно и к базе MSSQL подключиться и оттуда данные вытянуть, но для этого придется полностью разобраться во внутренней структуре хранения данных, а это задача уже совершенно другого уровня сложности. А вообще, прощу прощения за оффтоп Добавлено А вообще, это ошибка, что в коде везде я вижу имя базы "SRV-BUH", а на скриншоте "KRIZ-BUH"??? |
Автор: kosten 03.02.18, 07:00 |
Цитата evGenius @ А вообще, это ошибка, что в коде везде я вижу имя базы "SRV-BUH", а на скриншоте "KRIZ-BUH"??? Я уже спрашивал об этом, но ответа не получил. |
Автор: Bas 04.02.18, 09:57 |
|
Автор: Marchello 05.02.18, 05:44 |
Цитата kosten @ Цитата evGenius @ А вообще, это ошибка, что в коде везде я вижу имя базы "SRV-BUH", а на скриншоте "KRIZ-BUH"??? Я уже спрашивал об этом, но ответа не получил. Касательно названия, то это я просто проверял ошибки подключения к реальной базе и не существующей. Без разницы. |
Автор: Marchello 07.06.18, 11:41 |
Всем здравия! Побороли косяк с конектом. Что было хз. Делали перенастройку сети из-за смены провайдера и новый комп поставили. Косяк исчез. Пример Дмитрия работает. Начал писать другие названия элементов справочника - ошибка. Факт, юрадрес, телефон и прочее. Может есть мегашпаргалка какаянить как обращаться к элементам 1С по структуре их расположения через vba? Или как-то можно из инструментов внутри 1с понять. В универсальном отчете есть структура, но что-то не получается по ней. Гдето не правильно пишу. Например <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> не работаетВыборка.ФактическийАдрес Можно как-то перебрать названия элементов справочника, чтоб получить типа названий столбцов и путь, чтоб явно указывать (ИНН,Телефон,Email....) |
Автор: ^D^ima 07.06.18, 14:16 |
Marchello открой конфигуратор в 1с и у каждого документа\справочника смотри как называются реквизиты для обращения к ним. А какой запрос ты делаешь? Ты в начале код на 1с пиши и смотри что получается, затем сможешь без труда перенести в вба. Структуру я писал дл справочника и абстрактный запрос. + ты всегда можешь из 1С в эксель писать. |
Автор: Marchello 08.06.18, 07:02 |
Твой пример кода пытаюсь разобрать. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Public Sub v8connect() Set Base = v8con.Connect(StrConnectBase) Dim cntr As Object Dim Справочник As Object Dim Выборка As Object Dim n As Integer Set Справочник = Base.Справочники.Контрагенты Set Выборка = Справочник.Выбрать() n = 1 While Выборка.следующий() = True Cells(n, 1).Value = Выборка.Код Cells(n, 2).Value = Выборка.ИНН Cells(n, 3).Value = Выборка.КПП Cells(n, 4).Value = Выборка.Наименование Cells(n, 5).Value = Выборка.ЮрЛица.Наименование n = n + 1 Wend End Sub (n, 5) как не корёжил из того, что в инете нарыл - ничё не подходит. |
Автор: ^D^ima 08.06.18, 08:02 |
Дергай запросом. Табличные части отдельные таблицы. Ещё раз - делай вначале в 1С, затем переноси в vba |
Автор: Marchello 08.06.18, 09:44 |
Как тащить таблицы целиком? Примерчик кинь пожалуйста. Можно ли как-то вывести имена полей или вообще всю структуру справочника? Темповую базу пока не поставили, а в рабочую лезть пока страшновато. Кроме COM есть ещё варианты запросов делать в 1С? В 16 excel куча разных вариантов языков на основе которых можно сделать запрос и вывести в PQ. Читал статейку сейчас, что com это чисто поддержка для старых версий и она через какое-то время наверно исчезнет. У нас сервачная версия на PostgreSQL. |
Автор: ^D^ima 08.06.18, 10:13 |
1 Через веб сервисы 2 Напрямую в БД 3 Через файлы открой конфигуратор и посмотри. тестовую базу можно к себе на локальный ПК поставить. |
Автор: kosten 08.06.18, 10:17 |
Ты сейчас научишь плохому |
Автор: Marchello 08.06.18, 10:55 |
Я имею ввиду протоколы какие на локалке можно юзать? Если база на postgre, то я так понимаю что можно к ней законектиться стандартными средствами эксель? Может ещё какие понимает язычки? В инете ничего про пост и 1с не нашел. Только что серваки н нём делают. БД имеешь ввиду в обход конфига напрямую с таблами? Добавлено Для того мы тут и есть. |
Автор: ^D^ima 08.06.18, 11:01 |
Хорошо. Из БД. Но это делать крайне сложно, все таблицы поименованы так что не поймешь что за что отвечает. Я не слышал. |
Автор: kosten 08.06.18, 11:05 |
Цитата ^D^ima @ Но это делать крайне сложно, все таблицы поименованы так что не поймешь что за что отвечает. Это еще и нарушает лицензионное соглашение. |
Автор: Marchello 08.06.18, 11:37 |
Не могу. Доступа нет к конфигу. Имел бы давно бы уже посмотрел. |
Автор: kosten 08.06.18, 11:55 |
Программно через метод Метаданные требуемого объекта. В СП почитай. |
Автор: Marchello 09.06.18, 10:37 |
Принтскринов наделал справочника. Что-то работает, а что-то не работает с какого-то перепуга. До строки СтранаРегистрации работает. А она уже не работает. Хотя в справочнике стоят на одном уровне. С чем такое связано? Я так подозреваю, что там ссылка стоит на СтраныМирв, но как обращаться к таким полям? 9 строка тоже не работает. <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Set Справочник = Base.Справочники.Контрагенты Set Выборка = Справочник.Выбрать() n = 1 While Выборка.следующий() = True Cells(n, 1).Value = Выборка.Код Cells(n, 2).Value = Выборка.ИНН Cells(n, 3).Value = Выборка.КПП Cells(n, 4).Value = Выборка.Наименование Cells(n, 5).Value = Выборка.НаименованиеПолное Cells(n, 6).Value = Выборка.ДатаРегистрации Cells(n, 7).Value = Выборка.КодПоОкпо Cells(n, 8).Value = Выборка.СтранаРегистрации Cells(n, 9).Value = Выборка.ТабличныеЧасти.КонтактнаяИнформация.НомерТелефона Блин. Вытащить-то надо фигню какуюто - несколько таблиц, а времени чую убью немерянно. |
Автор: kosten 09.06.18, 11:29 |
Попробуй написать так <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> Cells(n, 8).Value = Выборка.СтранаРегистрации.Наименование |
Автор: Marchello 09.06.18, 12:01 |
ОУЕ! А в табличнуючасть как залезть? Cells(n, 9).Value = Выборка.ТабличныеЧасти.КонтактнаяИнформация.Город (имя и наименование не подходит) |
Автор: kosten 09.06.18, 12:27 |
Цитата Marchello @ А вот ТЧ надо перебирать, например, в цикле. |