Биты и байты.

Биты и байты.

пятница, 19 сентября 2014 г.

Быстрый доступ к данным 1С

Когда срочно нужны данные из 1С, а программиста 1С под рукой нет, поможет старый добрый SQL запрос.
Так как структура базы сама по себе хитрая (таблицы и поля имеют служебные названия  а-ля  _Document324 , _Reference1961   и  _Field32634)  желательно сначала получить структуру базы,  самый простой способ  с помощью обработки  с Инфостарта, запускать нужно из под тонкого клиента.

P.S Тоже самое можно получить  встроенной функцией  ПолучитьСтруктуруХраненияБазыДанных(,Истина)


Определенную сложность доставляют перечисления, т.к для них не хранится название элемента. См. ниже

Можно получить названия SSIS пакетом  используя этот код в отдельную таблицу,  взято с хабра

  CREATE TABLE [dbo].[tbl1CEnums](
    [EnumName] [nvarchar](1024) NULL,
    [EnumValue] [nvarchar](2014) NULL,
    [EnumOrder] [int] NULL
) ON [PRIMARY]

Затем  связать эту таблицу с перечислением

using System;
using System.Data;
using System.Data.SqlClient;
using V82;
namespace _1CEnumParser
{    
  class Program   
    {        
       /// <summary>        
       /// Пробегается по всем перечислениям и заполняет таблицу с тремя полями: название перечисления, название значения, порядок        
       /// </summary>        
        private  static void DataTableFill(DataTable aTable, dynamic a1CConn)        
        {             foreach (dynamic catalog in a1CConn.Metadata.Enums)            
        {                 string enumName = catalog.Name;               
            dynamic query = a1CConn.NewObject("Query");                
            query.Text = "select * from enum." + enumName;                
            dynamic items = query.Execute().Unload();                
            // бежим по строкам                
            for (int i = 0; i < items.Count(); i++)                
            {                    
                string enumValue = null;                    
                int enumOrder = -1;                    
                for (int j = 0; j < items.Columns.Count(); j++)                    
                {                        
                    string colName = items.Columns.Get(j).Name;                        
                    dynamic colValue;                        
                    try                       
                    {                            
                        colValue = a1CConn.String(items.Get(i).Get(j));                        
                    }                        
                    catch                       
                    {                            
                        colValue = "-1"
                        ;                        
                    }                        
                    switch (colName.ToLower())                        
                    {                            
                        case "ссылка":                                
                            enumValue = colValue.ToString();                                
                            break;                            
                        case "порядок":                                 
                            enumOrder = int.Parse(colValue.ToString());                                
                            break;                            
                        default:                                
                            throw new ApplicationException("unknown column name in enum.recordset: " + colName);                       
                    }                    
                }                    
                // получили  3 заполненные значения:  enumName, enumValue, enumOrder. вставка в таблицу                    
                aTable.Rows.Add(new object[] {enumName, enumValue, enumOrder});                
            }            
        }        
        }         
            /// <summary>        
            /// Устанавливает все соединения, заполняет DataTable с перечислениями, записывает в БД        
            /// </summary>        
            /// <param name="aConnectionString1C"></param>        
            /// <param name="aConnectionStringSQL"></param>        
            /// <param name="aTableName"></param>        
            private static void ConnectAndFill(string aConnectionString1C, string aConnectionStringSQL, string aTableName)        
            {            
                // входим в SQL базу и удаляем все из таблицы            
                var connSQL = new SqlConnection(aConnectionStringSQL);            
                connSQL.Open();            
                // входим в 1С            
                var connector1C = new V82.COMConnector();            
                dynamic conn1C = connector1C.Connect(aConnectionString1C);            
                // удаляем из таблицы все данные            
                var command = new SqlCommand("delete from " + aTableName, connSQL);            
                command.ExecuteNonQuery();            
                // заполняем таблицу            
                var da = new SqlDataAdapter("select EnumName, EnumValue, EnumOrder from " + aTableName, connSQL);            
                var thisBuilder = new SqlCommandBuilder(da);            
                var ds = new DataSet();            
                da.Fill(ds);            
                DataTableFill(ds.Tables[0], conn1C);            
                da.Update(ds);            
                // закрываем коннект            
                connSQL.Close();          
            }         
            static void Main()        
            {            
                string[] args  = Environment.GetCommandLineArgs();
                string aConnectionString1C = args[1];
                string aConnectionStringSQL = args[2];
                string aTableName = args[3];
              
            }    
}
}


По названию таблицы в БД можно определить какому объекту метаданных 1С она соответствует. Подробно смотреть тут

Константы
     _Consts
содержит текущие значения всех констант, определенных в конфигурации.
     _ConstsChangeRec -
таблица регистрации изменений констант. Создается, если хотя бы одна константа участвует хотя бы в одном плане обмена.
Планы обмена
     _Node<n> -
таблица плана обмена.
     _Node<n>_VT<k> -
табличная часть плана обмена, создается для каждой табличной части.
Справочники
     _Reference<n> -
таблица справочника.
     _Reference<n>_VT<k> -
табличная часть справочника - для каждой табличной части.
     _ReferenceChangeRec<n> - таблица регистрации изменений справочника. Создается, если справочник участвует хотя бы в одном плане обмена.
Документы
     _Document<n> - таблица документов для каждого объекта метаданных "документ".
     _Document<n>_VT<k> - табличная часть документа - для каждой табличной части каждого документа.
     _DocumentChangeRec<n> - таблица регистрации изменений объекта метаданных типа "документ". Создается для каждого объекта метаданных типа "документ", если он участвует хотя бы в одном плане обмена.
Последовательности документов
     _Sequence<n> - таблица регистрации документов - для каждой последовательности.
     _SequenceBoundary<n> - таблица границ последовательности - для каждой последовательности.
     _SequenceChangeRec<n> - таблица регистрации изменений последовательности. Создается для каждой последовательности, которая участвует хотя бы в одном плане обмена.
Журналы документов.
     _DocumentJournal<n> - таблица журнала документов, создается для каждого журнала документов.
Перечисления
     _Enum<n> - таблица перечисления - по одной для каждого перечисления.
Планы видов характеристик
     _Chrc<n> - основная таблица плана видов характеристик.
     _Chrc<n>_VT<k> - табличная часть плана видов характеристик - для каждой табличной части.
     _ChrcChangeRec<n> - таблица регистрации изменений плана видов характеристик. Создается, если план видов характеристик участвует хотя бы в одном плане обмена.
Планы счетов
     _Acc<n> - основная таблица плана счетов.
     _Acc<n>_ExtDim<k> - таблица видов субконто плана счетов, создается для плана счетов в том случае, если максимальное количество субконто больше нуля.
     _Acc<n>_VT<k> - табличная часть плана счетов, создается для каждой табличной части плана счетов.
     _AccChangeRec<n> - таблица регистрации изменений плана счетов. Создается, если план счетов участвует хотя бы в одном плане обмена.
Планы видов расчета
     _CalcKind<n> - основная таблица плана видов расчета.
     _CalcKind<n>_BaseCK - таблица базовых видов расчета, создается для плана видов расчета в случае, если его свойство "Зависимость от базы" имеет значение, отличное от "Не зависит".
     _CalcKind<n>_DisplacedCK - таблица вытесняемых видов расчета, создается для плана видов расчета в случае, если у него установлен флаг "Использует период действия".
     _CalcKind<n>_LeadingCK - таблица ведущих видов расчета - для каждого плана видов расчета.
     _CalcKindDN<n> - вспомогательная таблица для порядка вытеснения, создается, если у плана видов расчета установлен флаг "Использует период действия".
     _CalcKind<n>_VT<k> - табличная часть плана видов расчета, создается для каждой табличной части.
     _CalcKindChangeRec<n> - таблица регистрации изменений плана видов расчета. Создается, если план видов расчета участвует хотя бы в одном плане обмена.
Регистры сведений
     _InfoReg<n> - таблица движений регистра сведений.
     _InfoRegChangeRec<n> - таблица регистрации изменений регистра сведений. Создается, если регистр сведений участвует хотя бы в одном плане обмена.
Регистры накопления
     _AccumReg<n> - таблица движений регистра накопления.
     _AccumRegTotals<n> - таблица итогов регистра накопления, если регистр поддерживает остатки.
     _AccumRegTurnovers<n> - таблица оборотов регистра накопления, если регистр поддерживает обороты.
     _AccumRegChangeRec<n> - таблица регистрации изменений регистра накопления. Создается, если регистр накопления участвует хотя бы в одном плане обмена.
     _AccumRegOptions - таблица настроек хранения итогов регистров накопления одна на все регистры накопления.
Регистры бухгалтерии
     _AccntReg<n> - таблица движений регистра бухгалтерии.
     _AccntRegED<n> - таблица значений субконто регистра бухгалтерии, создается в том случае, если он ссылается на план счетов, у которого максимальное количество субконто больше нуля.
     _AccTtl0<n> - таблица итогов по счету.
     _AccTtl<i><n> - где i от 1 до максимального количества субконто. Таблица итогов по счету с количеством видов субконто равным i.
     _AccTtlC<n> - таблица итогов оборотов между счетами, только для регистра бухгалтерии поддерживающего корреспонденцию.
     _AccntRegChangeRec<n> - таблица регистрации изменений регистра бухгалтерии. Создается, если регистр бухгалтерии участвует хотя бы в одном плане обмена.
     _AccntRegOptions - таблица настроек хранения итогов одна на все регистры бухгалтерии.
Регистры расчета
     _CalcReg<n> - таблица движений регистра расчета.
     _CalcRegActPer<n> - таблица фактических периодов действия для регистра расчета, создается, если у регистра расчета установлен флаг "Период действия".
     _CalcRegChangeRec<n> - таблица регистрации изменений регистра расчета. Создается для каждого регистра расчета, участвующего хотя бы в одном плане обмена.
     _CalcRegRecalc<n> - таблица перерасчета регистра расчета, создается для каждого перерасчета.
     _CalcRegRecalcChangeRec<n> - таблица регистрации изменений перерасчета. Создается, если перерасчет участвует хотя бы в одном плане обмена.
Бизнес-процессы
     _BPRoutePoint<n> - таблица точек маршрута бизнес-процесса для каждого бизнес-процесса.
     _BusinessProcess<n> - основная таблица бизнес-процесса.
     _BusinessProcess<n>_VT<k> - табличная часть бизнес-процесса для каждой табличной части.
    _BusinessProcessChangeRec<n> - таблица регистрации изменений бизнес-процесса. Создается для каждого бизнес-процесса, участвующего хотя бы в одном плане обмена.
Задачи
     _Task<n> - основная таблица задачи.
     _Task<n>_VT<k> - табличная часть задачи для каждой табличной части.
     _TaskChangeRec<n> - таблица регистрации изменений в задачах. Создается для каждого объекта метаданных типа "задача", который участвует хотя бы в одном плане обмена.

+ Традиционный анекдот не в тему..
Больные захватили психиатрическую больницу. Они требуют миллион вертолетов и один доллар.

About