8.х Как получить данные напрямую из MSSQL посредством SQL запроса по нужному справочнику

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем Ppoludnev, 9 фев 2011.

  1. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Такой вопрос,

    У меня есть 1С 8.1 там есть Справочник Физические лица (Сотрудники которые работают в компании),
    облазил весь интернет и так не нашел нормальной документации по структуре таблиц, названий полей в MSSQL.

    Вручную отыскал нужную мне таблицу _Reference186, но там читабельные только ФИО (_Description), и код сотрудника (_Code), все остальные поля в Бинарном формате и не понятно куда дальше копать.

    Дело в том что я пишу сложную интеграцию 1С 8.1 и корпоративного портала (портал написан на PHP и находится в интернете), а 1С - в офисе.

    и необходимо сделать так чтобы доступ в корпоративный портал имели только те сотрудники которые есть в справочнике физических лиц в 1С, причем контактная информация (ФИО, Email, Мобильный телефон, Местный Рабочий телефон, Образование, Специализация, Должность, Юридическое лицо (подразделение) в котором работает, Дата Рождения, и Код сотрудника) автоматически подгружались в портал из справочника в 1С.

    На портале у каждого сотрудника есть личная страничка - где эта информация отражается.
    Но 1С-ом заведует бухгалтерия и отдел персонала и если они меняют там информацию по должности или телефонам, то портал в случае интеграции автоматически обновит эту информацию.

    Я просил программиста 1С сделать выгрузки - но как я понял примитивные выгрузки 1С-а мне не нужны. Т.к. кидать куда-то файлик, раз в сутки - это прошлый век.

    Мне нужно обновление данных в режиме Online - а это возможно в случае прямых запросов с портала в базу MSSQL 1С-а.

    Но нету документации по базе. Что же делать?

    Подскажите пожалуйста как разобраться в названиях таблиц и связях?
    Вот тут ничего не понятно:
    http://www.linq-demo.1centerprise.com/


    вот моя таблица в базе

    Код:
    SELECT [_IDRRef]
    ,[_Version]
    ,[_Marked]
    ,[_IsMetadata]
    ,[_ParentIDRRef]
    ,[_Folder]
    ,[_Code]
    ,[_Description]
    ,[_Fld2491RRef]
    ,[_Fld2492]
    ,[_Fld2493RRef]
    ,[_Fld2494RRef]
    ,[_Fld2495RRef]
    ,[_Fld2496RRef]
    ,[_Fld2497]
    ,[_Fld2498]
    ,[_Fld2499RRef]
    ,[_Fld2500RRef]
    ,[_Fld2501RRef]
    ,[_Fld2502]
    ,[_Fld2503]
    ,[_Fld2504]
    ,[_Fld2505]
    ,[_Fld2506RRef]
    ,[_Fld2507]
    ,[_Fld2508RRef]
    ,[_Fld2509]
    ,[_Fld2510RRef]
    ,[_Fld23340RRef]
    ,[_Fld23341RRef]
    ,[_Fld23342RRef]
    ,[_Fld23343]
    ,[_Fld23344]
    ,[_Fld23345RRef]
    ,[_Fld23346RRef]
    ,[_Fld23347]
    ,[_Fld23348]
    FROM [KorusDB].[dbo].[_Reference186]
    
    
    

    как расшифровать зашифрованные в бинарный формат ключи полей с названиями _Fld*******
    и в каких таблицах нужно искать соответствия.

    В каких таблицах хранятся телефоны, email-ы, связи кто в каком учебном заведении работал, где находятся связи у кого какая должность и прочее.

    подскажите пожалуйста,
    уже неделя - этого геморроя - меня скоро в гроб сведет.

    Заранее спасибо за оперативные ответы.
  2. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    Самый простой вариант нарисовать в консоле запросов (это в 1с) нужный запрос и пасатреть в профилер (эт sql)

    Правильный вариант курить вот это (из встроенной стравки)
    Код:
    Глобальный контекст
    ПолучитьСтруктуруХраненияБазыДанных (GetDBStorageStructureInfo)
    Синтаксис:
    ПолучитьСтруктуруХраненияБазыДанных(<Объекты метаданных>, <Имена базы данных>) 
    Параметры:
    <Объекты метаданных> (необязательный)
    Тип: Массив. Массив имен объектов метаданных или массив объектов метаданных, для которых требуется получить структуру таблиц базы данных. 
    <Имена базы данных> (необязательный)
    Тип: Булево. Определяет, в каких терминах выдается информация о структуре хранения.
    Истина - в терминах СУБД
    Ложь - в терминах SDBL.
    Значение по умолчанию: Ложь 
    Возвращаемое значение:
    Тип: ТаблицаЗначений. Возвращает таблицу значений с описаниями структуры таблиц, индексов и полей базы данных в терминах SDBL или используемой СУБД, в зависимости от значения параметра "Имена базы данных".
    Если параметр не используется, то возвращаемая таблица значений содержит информацию о структуре таблиц базы данных всех объектов метаданных.
    Таблица значений включает следующие колонки:
    ИмяТаблицыХранения(StorageTableName) – имя таблицы SDBL или базы данных;
    ИмяТаблицы(TableName) – имя таблицы в терминах языка запросов (для тех у кого оно есть);
    Метаданные(Metadata) – полное имя объекта метаданных;
    Назначение(Purpose) – назначение таблицы: 
    Основная(Main) - основная; 
    Константы(Constants) - константы; 
    Итоги(Totals) - итоги; 
    ИтогиПоСчетам(TotalsByAccounts) - итоги по счетам; 
    ИтогиПоСчетамССубконто(TotalsByAccountsWithExtDim) - итоги по счетам с субконто; 
    ИтогиМеждуСчетами(TotalsBetweenAccounts) - итоги между счетами; 
    ВидыСубконто(ExtDimensionTypes) - виды субконто; 
    ЗначенияСубконто(ExtDimensionsValues) - значения субконто; 
    ВытесняющиеВидыРасчета(DisplacingCalculationTypes) - вытесняющие виды расчета; 
    ПорядокВытеснения(DisplacementOrder) - порядок вытеснения; 
    ВедущиеВидыРасчета(LeadingCalculationTypes) - ведущие виды расчета; 
    БазовыеВидыРасчета(BaseCalculationTypes) - базовые виды расчета; 
    ПериодыДействия(ActionPeriods) - периоды действия; 
    ГраницыПоследовательности(SequenceBoundaries) - границы последовательности; 
    ТочкиМаршрута(RoutePoints) - точки маршрута бизнес-процесса; 
    ТабличнаяЧасть(TabularSection) - табличная часть; 
    РегистрацияИзменений(ChangeRecord) - регистрация изменений; 
    РегистрацияИзмененийКонстант(ConstantsChangeRecord) - регистрация изменений констант; 
    РегистрацияИзмененийКонфигурации(ConfigChangeRecord) - регистрация изменений конфигурации; 
    РегистрацияИзмененийВнешнихСвойствКонфигурации(ConfigExtPropertiesChangeRecord) - регистрация изменений внешних свойств конфигурации; 
    ТаблицаНастроекХраненияИтоговРегистровНакопления(AccumulationRegistersOptionsTable) - таблица настроек хранения итогов регистров накопления; 
    ТаблицаНастроекХраненияИтоговРегистровБухгалтерии(AccountRegistersOptionsTable) - таблица настроек хранения итогов регистров бухгалтерии;
    Поля(Fields) - таблица значений с полями таблицы базы данных; 
    ИмяПоляХранения(StorageFieldName) - имя поля SDBL или базы данных; 
    ИмяПоля(FieldName) - имя поля в терминах языка запросов (для тех у кого оно есть); 
    Метаданные(Metadata) – полное имя объекта метаданных;
    Индексы(Indexes) – таблица значений с индексами таблицы базы данных; 
    ИмяИндексаХранения(StorageIndexName) - имя индекса SDBL или базы данных; 
    ПоляИНдекса(IndexFields) - таблица значений с полями индекса; 
    ИмяПоляХранения(StorageFieldName) - имя поля SDBL или базы данных; 
    ИмяПоля(FieldName) - имя поля в терминах языка запросов (для тех у кого оно есть); 
    Метаданные(Metadata) – полное имя объекта метаданных.
    Описание:
    Получает информацию о структуре таблиц базы данных для переданных в качестве параметра массива имен объектов метаданных или массива объектов метаданных для административных действий с ней.
    Если параметр не используется, то возвращаемая таблица значений содержит информацию о структуре таблиц базы данных всех объектов метаданных. 
    Примечание:
    Следует использовать метод только для административных задач обслуживания базы данных и анализа записей технологического журнала. Не рекомендуется применять метод для реализации какой-либо части прикладной функциональности. 
    Пример:
    МассивИменМетаданных = Новый Массив();
    МассивИменМетаданных.Добавить("Справочник.Номенклатура");
    МассивИменМетаданных.Добавить("Документ.РасходнаяНакладная");
    СтруктБД=ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных);
    
    
    
  3. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    А что это объясните? это какой-то новый язык??? Я такое впервый раз вижу..

    я программист PHP, могу писать запросы SQL к базе, типа
    Код:
    
    <?php
    
    подключаемся к базе 1С 
    mssql_connect(...);
    mssql_select_db(...);
    
    mssql_query("select * from _Reference186");
    и т.д.
    
    далее каким-то образом обрабатывать данные и выводить их в нужном табличном виде
    
    ?>
    
    
    
    Поймите что у меня Интернет-сайт а не 1С, и сайт понимает только языки веб-программирования и язык запросов к базе, я могу подключиться к базе 1С MSSQL и вытащить любые данные.

    Но проблема в том, что я не знаю откуда эти данные брать, а в интернете (уж не знаю отчего от того что 1С - прошлый век и недоработок много, либо просто интернет против 1С - не знаю), но нету в интернете человеческой документации по тому каким образом связаны таблицы в 1С, по какому принципу они формируются и создаются, по какому признаку происходит связка таблиц и прочее.

    Если кто-то знает - подскажите пожалуйста.
  4. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    С PHP слабо знаком. Возможность создать COM объект там есть? Если да - подключайтесь к 1С через COMConnector и тяните нужные данные запросами на языке 1С.
  5. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    Это встроенный язык 1с

    связи таблиц, из структура, типизация - эт все на этапе конфигурирования в самой 1с
    имена таблиц задаются динамически при реструктуризации
    как получить из имена в привычном Вам виде было выше (1с методами глобального контекста
    ПолучитьСтруктуруХраненияБазыДанных (GetDBStorageStructureInfo))

    +1 к shurikvz
  6. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Либо еще вариант (но тут я не подскажу, может из коллег кто-то разбирался) - возможно можно использовать функционал 1С: web-сервисы.
  7. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    стартопик не указал конечную цель, мож все проще и нужно к примеру закинуть наменклатуру с ценами на сайт
    эт вообще далется в "пару" кликов грызуна
  8. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    упсссссс, ступил ........ в "0" посте была цель

    вариант намба ван (1с лезет на прямую в базу на майСкуле)
    на комп который будет выкладывать данные ставим одибиси дрова
    в 1с приделываем подписку на событие призаписи на справочник физлица
    по событию на подписку сливаем данные в майСкуль

    намба ту (из пыхпыха лезем в 1с)
    просим 1сника нарисовать запрос который вернет нужные данные
    цепляемся к 1с
    $loggedin=$_POST['user'];
    $loggedpasv=$_POST['user_password'];
    $serv="...";
    $dbase="...";
    $app = new COM("V8.COMConnector");
    $res = $app->connect("Srvr=$serv;Ref=$dbase;Usr=$loggedin;pwd=$loggedpasv");


    после подключения пририсовываем запрос от одноэсника
    $Запрос = $res->NewObject("Запрос");
    $Запрос->Текст =
    "ВЫБРАТЬ
    ФизическиеЛица.Наименование,
    ФизическиеЛица.РНН,
    ФизическиеЛица.Пол,
    ФизическиеЛица.МестоРождения
    ИЗ
    Справочник.ФизическиеЛица КАК ФизическиеЛица
    ГДЕ
    ФизическиеЛица.ЭтоГруппа = ЛОЖЬ";


    выполняем запрос

    $Результат = $Запрос->Выполнить();
    $nom = $Результат->Выбрать();

    и делаем че нада
  9. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    Блин... спасибо за ответы, но я всё равно не понимаю с чего мне начать.

    У меня есть задача.
    У меня есть в 1С 8.1 место где хранится то, чтобы задача была выполнена (Справочник физические лица)
    У меня есть база MSSQL где 1С это все хранит

    ... далее пробелы...
    не известно в каких таблицах нах-ся нужные мне данные

    подзадача - узнать в каких таблицах данные.


    ...

    Вытащить данные если будут известны названия таблиц и полей я смогу средствами PHP и соответственно отобразить их на корп. сайте.

    Объясните пожалуйста ещё раз "неучу в мире 1С" как мне заполнить "вышеуказанные пробелы" и решить подзадачу.
  10. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    Изучай вражеский язык :angry:

    эт нафиг не надо, изменят конфигурацию и ты приплыл

    пример на пыхпыхе был выше, все что нужно эт попросить вашего 1сника дать 1совкий запрос который вернет нужные данные
  11. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    А php разве поддерживает русские буквы в именах переменных?
  12. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    :angry: мдя, лезь "грязными" руками в 1с Вам еще рано
    ЗЫ. Эт скопипастен рабочий кусок, просто малеха упрощен для понимания
  13. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    У меня сайт лежит на Инфобоксе, у них хостинг вроде на Unix-е, он поддерживает разве COM Объекты, и как туда загрузить поддержку COM объекта (V8.*****)?

    и ещё.. у меня есть имя сервера, логин и пароль пользователя SQL.
    Логина и пароля пользователя 1С - нету.

    Ваш код в этом случае будет работать??

    А что такое скопипастен? как мне перевести твой код PHP там где (Запрос = я так понимаю можно переименовать в $Query, Результат - в $Result, Текст в $Text, а Выполнить - в Go или Start и там в этом объекте есть такие методы? а что такое Выбрать()..


    мммм.. ничего не понимаю..
  14. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    йопс, не взлетит, винда нужна и база 1совкая должна в инет смотреть (эт кто на такое то пойдет?)

    скопировал кусок с живого сайта (локальный хост и сайт для служебного пользования)
    Выполнить/Выбрать - это все методы 1с, не вставляет русский - можно воспользоваться англоязычными методами Execute/Choose

    Тогда вариант первый использовать (из 1с писать в базу сайта)





    1сник есть в этой конторе?
    Ежли есть, то могу кинуть пример обработки для 1с, которая ложит данные на прямую в базу mySQL лежащую у хостера
  15. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    да, именно так, хостинг 1С лежит на сервере винды 2008, а сайт лежит у провайдера на Unix-е.

    1с-ник есть,вроде,

    если не сложно скинь пример коннекта 1С в базу MySQL, так будет проще, а не получится ли так что 1С будет писать данные в базу MySQL только по расписанию?
  16. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Нет, не получится. Писать будет каждый раз, когда кто-то запишет элемент справочника Физ.лица.
  17. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    Для коннекта нать будет поставить дрова mysql connector odbc на ту машину с которой будет идти выгрузка
    Из 1с можно будет писать и по расписанию (в ней есть такая штука как регламентные задания, для регистрации новых или измененных элементов можно использовать узлы обмена)
    Можно писать при изменении данных (в 1с есть такая штука как подписка на событие или тупо ПриЗаписи)

    Пример самый простой
    Есть некая база в которой есть таблица "test_table" с 5 колонками "ID/NAME/PARAM1/PARAM2/PARAM3"
    обработка позволяет получить данные из удаленной базы MySQL "SELECT * FROM test_table"
    выгрузить данные в MySQL из справочника "Номенклатура" (там тупой вариант с "TRUNCATE TABLE test_table" и "INSERT INTO test_table" на каждый элемент справочника в 1с)
    обновить данные "UPDATE test_table" с обработкой исключения если записи нет то опять простой "INSERT INTO test_table"

    Вложения:

    • test.epf
      Размер файла:
      10,3 КБ
      Просмотров:
      107
  18. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    а отлично так оно и нужно.

    А он будет обновлять все записи в MySQL Или только ту что добавили или отредактировали?
    Хотелось бы чтобы все.
  19. poiuy
    Offline

    poiuy Опытный в 1С

    Регистрация:
    12 окт 2010
    Сообщения:
    170
    Симпатии:
    0
    Баллы:
    26
    тут полный простор для творчества, что напишит ваш 1сник, то и получите :angry:
  20. TopicStarter Overlay
    Ppoludnev
    Offline

    Ppoludnev

    Регистрация:
    9 фев 2011
    Сообщения:
    8
    Симпатии:
    0
    Баллы:
    1
    проблема...

    с сервера Unix я могу подключиться к серверу 1C,
    а как с сервера 1С подключиться к базе MySQL?

    у меня там подключение так делается

    Код:
    mysql_connect("localhost","","");
    ...
    
    
    но если я тоже самое напишу на серваке 1С, то будет наверно уже не localhost а что-то другое??

Поделиться этой страницей