Skip to content
This repository has been archived by the owner on Dec 14, 2023. It is now read-only.
/ dajet-metadata Public archive

Library to read 1C:Enterprise 8 metadata from Microsoft SQL Server or PostgreSQL databases

License

Notifications You must be signed in to change notification settings

zhichkin/dajet-metadata

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

dajet-metadata

Library to read 1C:Enterprise 8 metadata from Microsoft SQL Server or PostgreSQL database.

Библиотека для чтения метаданных 1С:Предприятие 8 напрямую из базы данных СУБД.

Поддерживаются Microsoft SQL Server и PostgreSQL.

Развитие версии 3.2.0 библиотеки больше выполняться не будет.

Новая версия библиотеки 4.0 находится здесь

Требуется установка .NET Core 3.1, а, начиная с версии 3.2.0, .NET 6.0.

NuGet package & Канал Telegram

Конфигурация 1С для выполнения тестов

Кроме метаданных 1С дополнительно можно выполнять чтение метаданных СУБД.

Пример загрузки метаданных и свойств конфигурации
using DaJet.Metadata;
using DaJet.Metadata.Model;

static void Main(string[] args)
{
    string csPostgres = "Host=127.0.0.1;Port=5432;Database=MY_1C_DATABASE;Username=postgres;Password=postgres;";
    string csSqlServer = "Data Source=MY_DATABASE_SERVER;Initial Catalog=MY_1C_DATABASE;Integrated Security=True";

    IMetadataService metadataService = new MetadataService();

    #region "PostgreSQL"

    // Настройки для подключения к PostgreSQL
    metadataService.
        .UseConnectionString(csPostgres)
        .UseDatabaseProvider(DatabaseProviders.PostgreSQL);

    // 1. Пример чтения метаданных конфигурации 1С
    InfoBase infoBase = metadataService.LoadInfoBase();
    
    // 2. Пример чтения свойств конфигурации 1С
    ConfigInfo config = metadataService.ReadConfigurationProperties();

    // 3. Пример дополнения справочника "Номенклатура" свойствами из базы данных
    MetadataObject catalog = infoBase.Catalogs.Values
                                 .Where(i => i.Name == "Номенклатура")
                                 .FirstOrDefault();

    if (catalog == null)
    {
        Console.WriteLine("Справочник \"Номенклатура\" не найден!");
        return;
    }

    Console.WriteLine("Свойства справочника до обогащения из базы данных.");
    Console.WriteLine(catalog.Name + " (" + catalog.TableName + "):");
    foreach (MetadataProperty property in catalog.Properties)
    {
        Console.WriteLine(" - " + property.Name + " (" + property.DbName + ")");
    }

    // Выполняем сравнение и объединение с метаданными СУБД
    metadataService.EnrichFromDatabase(catalog);

    Console.WriteLine("Свойства справочника после обогащения из базы данных.");
    Console.WriteLine(catalog.Name + " (" + catalog.TableName + "):");
    foreach (MetadataProperty property in catalog.Properties)
    {
        Console.WriteLine(" - " + property.Name + " (" + property.DbName + ")");
    }

    #endregion

    #region "Microsoft SQL Server"

    // Настройки для подключения к Microsoft SQL Server
    metadataService.
        .UseConnectionString(csSqlServer)
        .UseDatabaseProvider(DatabaseProviders.SQLServer);

    // Всё остальное работает ровно также, как и для PostgreSQL

    #endregion
}
Пример загрузки свойств и узлов плана обмена
using DaJet.Metadata;
using DaJet.Metadata.Model;
using DaJet.Metadata.Mappers;

static void Main(string[] args)
{
    string connectionString = "Data Source=MY_DATABASE_SERVER;Initial Catalog=MY_1C_DATABASE;Integrated Security=True";

    IMetadataService metadataService = new MetadataService();

    metadataService.
        .UseConnectionString(connectionString)
        .UseDatabaseProvider(DatabaseProviders.SQLServer);

    InfoBase infoBase = metadataService.LoadInfoBase();

    // Находим план обмена (публикацию) по его имени, как оно указано в конфигурации 1С
    Publication publication = infoBase.Publications.Values
                                  .Where(i => i.Name == "ТестовыйПланОбмена")
                                  .FirstOrDefault();

    if (publication == null)
    {
        Console.WriteLine("План обмена \"ТестовыйПланОбмена\" не найден!");
        return;
    }

    // Создаём экземпляр класса для загрузки данных плана обмена
    PublicationDataMapper mapper = new PublicationDataMapper();
    mapper.UseDatabaseProvider(metadataService.DatabaseProvider);
    mapper.UseConnectionString(metadataService.ConnectionString);

    // Загружаем узлы плана обмена (подписчиков)
    mapper.SelectSubscribers(publication);

    // Выводим информацию об "этом узле" (издателе)
    // Код 1С: ПланыОбмена.ТестовыйПланОбмена.ЭтотУзел()
    Console.WriteLine(string.Format("Publisher: ({0}) {1}",
        publication.Publisher.Code,
        publication.Publisher.Name));

    // Выводим информацию об узлах плана обмена (подписчиках)
    Console.WriteLine("Subscribers:");
    foreach (Subscriber subscriber in publication.Subscribers)
    {
        Console.WriteLine(string.Format(" - ({0}) {1} [{2}]",
            subscriber.Code,
            subscriber.Name,
            subscriber.IsMarkedForDeletion ? "x" : "+"));
    }
}
Пример сравнения метаданных СУБД для объекта метаданных 1С
using DaJet.Metadata;
using DaJet.Metadata.Model;

static void Main(string[] args)
{
    string connectionString = "Data Source=MY_DATABASE_SERVER;Initial Catalog=MY_1C_DATABASE;Integrated Security=True";

    IMetadataService metadataService = new MetadataService();

    metadataService.
        .UseConnectionString(connectionString)
        .UseDatabaseProvider(DatabaseProviders.SQLServer);

    InfoBase infoBase = metadataService.LoadInfoBase();

    // Находим объект метаданных 1С для загрузки его метаданных СУБД
    Publication publication = infoBase.Publications.Values
                                  .Where(i => i.Name == "ТестовыйПланОбмена")
                                  .FirstOrDefault();

    if (publication == null)
    {
        Console.WriteLine("План обмена \"ТестовыйПланОбмена\" не найден!");
        return;
    }

    List<string> delete_list; // Список "лишних" - есть в объекте метаданных 1С, но не найдены в базе данных
    List<string> insert_list; // Список "новых" - есть в базе данных, но нет в объекте метаданных 1С
    bool result = metadataService.CompareWithDatabase(publication, out delete_list, out insert_list);
}

Утилита для чтения метаданных (свойств конфигурации)

Ссылка для скачивания

Помощь по использованию:

Помощь по использованию

Пример использования для Microsoft SQL Server:

Пример использования dajet cli для Microsoft SQL Server

Пример использования для PostgreSQL:

Пример использования dajet cli для PostgreSQL

Примечание: в случае необходимости указать порт для PostgreSQL адрес сервера можно указать, например, так: 127.0.0.1:5432

About

Library to read 1C:Enterprise 8 metadata from Microsoft SQL Server or PostgreSQL databases

Resources

License

Stars

Watchers

Forks

Packages

No packages published