Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 апр 2024, 20:29

1С 7.7 + .NET = как обмениваться данными с 1С ?

Автор hotcoder, 26 июл 2011, 12:11

0 Пользователей и 1 гость просматривают эту тему.

hotcoder

Есть приложение .NET написанное с помощью языка C#.
Код:
private void OnAppStartup(object sender, StartupEventArgs e)
{
    object inst = null;
    try
    {
        //
        // Запускаем 1C
        //
        inst = Activator.CreateInstance(Type.GetTypeFromProgID("V77L.Application", true));
        var type = inst.GetType();

        var args = new Object[3];
        args[0] = type.InvokeMember("RMTrade", BindingFlags.Public | BindingFlags.InvokeMethod, null, inst, null);
        args[1] = @"/d D:\\1С_Data /n /p";
        args[2] = "NO_SPLASH_SHOW";

        bool ok = (Boolean) type.InvokeMember("Initialize", BindingFlags.Public | BindingFlags.InvokeMethod, null, inst, args);
        if (ok)
        {
           // Вызываем функцию MyTest из главного модуля.
            var result = type.InvokeMember("MyTest", BindingFlags.Public | BindingFlags.InvokeMethod, null, inst, new object[] { null });
        }
        else
        {
            Trace.WriteLine("Unable to initialize V77.Application.");
            Trace.Flush();
        }
    }
    catch (Exception ex)
    {
        Trace.TraceError(ex.Message);
        Trace.Flush();
    }
    finally
    {
        inst = null; // закрываем 1С

        GC.Collect();
        GC.WaitForPendingFinalizers();

        Shutdown();
    }
}


И есть 1С Предприятие 7.7. Нужно: записывать данные в справочники и читать тз них. Проблема в том, что когда запущена 1С, то мой код не работает. Функция Initialize возвращает False.
Как мне научить мое приложение обмениваться данными с 1С 7.7 ?

sergejK74

Type.GetTypeFromProgID("V77L.Application", true) - это локальная однопользовательская версия. Смените на сетевую V77.Application или SQL-версию V77S.Application
Кнопочка Спасибо - слева!

hotcoder

Цитата: sergejK74 от 26 июл 2011, 12:25
Type.GetTypeFromProgID("V77L.Application", true) - это локальная однопользовательская версия. Смените на сетевую V77.Application или SQL-версию V77S.Application
Сделал, всё равно не помогло. При зупущенной 1С-ке в монопольном или сетевом режиме моя программа все равно на Initialize возвращает false

hotcoder

P.S. У меня БД файловая - таблички в файлах DBF.

sergejK74

Пользователи в базе заведены? Если да - то без указания свободного пользователя не должна пускать?
Кнопочка Спасибо - слева!

hotcoder

Цитата: sergejK74 от 26 июл 2011, 13:10
Пользователи в базе заведены? Если да - то без указания свободного пользователя не должна пускать?

Пользователи не заведены.

Сейчас провел эксперимент добавил 2 пользователя - администраторов. Пробую вызывать указывая пользователя @"/d D:\\1С_Data /n User2 /p", когда 1C уже запущена с пользователем User1... увы, Initialize опять false...

Если выключить все 1С-ки, то вызов функции MyTest возвращает 2.0 - как и положено, т.е. функция описана в глобальном модуле...

sergejK74

Сделай простейшие пароли. Добавь каждому пользователю свой рабочий каталог. Обязательно должна быть как минимум сетевая 1с. Точно не помню как в 7.7 - но лучше если конфигурация не будет базовой
Кнопочка Спасибо - слева!

hotcoder

Я смекнул что к чему...  :wacko:

Решил проверить GUID в реестре: V77.Application и V77L.Application стоят рядышком соответственно HKEY_CLASSES_ROOT\CLSID\{63112D80-94F0-11D2-9F39-008048DA120F} и HKEY_CLASSES_ROOT\CLSID\{63112D81-94F0-11D2-9F39-008048DA120F}.

Проверяю значения в разделе LocalServer32 и вижу, что для сетевой версии стоит файл D:\1Cv77\BIN\1cv7l.exe    - это повергло меня в шок  - изменил на D:\1Cv77\BIN\1cv7s.exe  и тут то всё у меня и заработало...  Ура!! )

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск