IE 2017

C# + 1C. Урок 2. Обращение к 1С из C#

Программирование - Практика программирования

В рамках этого урока мы изучим интеграцию 1С языком программирования C# на примере обращения к функционалу 1С из программ на C#

C# + 1C. Урок 2. Обращение к 1С из C#

На прошлом уроке мы из 1С обращались к программе на C#.  Сегодня сделаем наоборот: из C# будем обращаться в программу 1С. Для этого нам нужно подключить к проекту на C# COM-объект 1С (через "Проекты" -> "Добавить ссылку"):

C# + 1C. Урок 2. Обращение к 1С из C#

Соответствующую библиотеку мы добавим с закладки COM:

C# + 1C. Урок 2. Обращение к 1С из C#

Ну и все, теперь мы можем юзать 1С из программы на C#. Вот простейший пример, создание элемента справочника "номенклатура":

        private void button1_Click(object sender, EventArgs e)

        {

            string user = "Админ";

            string pas = "";

            string file = "C:\\1cv82\\Личные базы\\ДБ";

            dynamic result;

            dynamic refer;

            V82.COMConnector com1s = new V82.COMConnector();

 

            com1s.PoolCapacity = 10;

            com1s.PoolTimeout = 60;

            com1s.MaxConnections = 2;

            result = com1s.Connect("File='" + file + "';Usr='" + user + "';pwd='" + pas + "';");

            refer = result.Справочники.Номенклатура.СоздатьЭлемент();

            refer.Наименование = "Создано из C#";

            refer.Записать();

        }

 

После запуска этой программы в 1С у нас добавиться элемент справочника "Номенклатура":

 

C# + 1C. Урок 2. Обращение к 1С из C#

 

 

Источник: http://easyprog.ru/index.php?option=com_content&task=view&id=1453&Itemid=48

См. также

Комментарии
1. serg__k (serg__k) 78 12.03.14 00:53 Сейчас в теме
Просьба помочь, на строке с dynamic возникает ошибка:
Не удалось найти имя типа или пространства имен "dynamic" (пропущена директива using или ссылка на сборку?)
Как можно исправить ошибку?
2. Олег (oleg_km) 04.06.14 09:00 Сейчас в теме
dynamic появился вроде в NET 4.0
3. Дан Рассел (evrey96) 01.02.15 18:46 Сейчас в теме
Это скрипт работает на ASP.NET если да то как?
4. Батор Кореев (bator.koreev) 10.07.15 17:58 Сейчас в теме
При обращении к платформе 8.3 необходимо в настройках проекта поставить 32 разрядную систему))
5. Николай Пугачев (nickpugachev) 10.07.15 18:32 Сейчас в теме
(4) bator.koreev, при обращении к 8.3 не надо ломиться в COM :)
да и сам смысл ломиться в COM какой, если есть более приятные и для .Net и для 1С способы - Веб-сервисы/HTTP сервисы. Только если надо ввалить кучу данных. Но и в этом случае (да простит меня 1С :)) проще использовать более родные способы для .Net из пространства имен System.Data или даже SSIS
6. С К (cepera1575) 29.10.15 07:50 Сейчас в теме
(1) serg__k, тип "dynamic" появился в VS 2010. В более ранних версиях его нету.
7. Евгений Мукомело (ixilimuse) 150 14.08.17 07:47 Сейчас в теме
Автору большое спасибо за вполне себе грамотную и подробную статью. По существу все супер.

Но у меня возникли вопросы на которые сейчас не знаю ответа. В процессе поиска. Поиски чуть подзатянулись и поэтому хочу спросить, может автор статьи сталкивался уже? Или может кто ещё подскажет?

В общем, создаю я в C# комОбъект. Вижу через него справочники, регистры и т.п. Даже могу вызвать метод ПолучитьСтруктуруХраненияБазыДанных(). Хоть и не могу потом на стороне C# разобрать результат по частям. Но это не важно.

Написал пару методов для себя на стороне 1С.
Первый принимает в качестве параметра название объекта 1С. Параметр строковый. Возвращает тоже строку, только уже с описанием структуры хранения данного объекта. Второй метод принимает дату, возвращает число 1 или 0.

Проблема: ни тот, ни другой метод я не могу использовать на стороне C#. Получаю ошибку System.NullReferenceException: "Ссылка на объект не указывает на экземпляр объекта."
Тоже самое получаю и при вызове ТекущаяДата().

У меня конечная цель была - узнать статус одной долгой процедуры, если статус плохой - развернуть свежий бэкап базы на тестовом сервере и параллельно запустить одну обработку на тестовом сервере.
Опять же начинаю сомневаться в том - смогу ли я корректно эту обработку запустить? Там в процедуру надо передать ряд параметров у которых типы: Строка, дата, булево...

Буду благодарен за любое направление в нужную сторону, где копать(искать).
8. Евгений Мукомело (ixilimuse) 150 14.08.17 09:48 Сейчас в теме
(7) upd: Уже разобрался что для вызова методов через COM соединение существует Модуль внешнего соединения. Действительно - функции объявленные в нем - благополучно вызываются из C#. И даже параметры передаются корректно.
Но! Стоит мне вызвать в функции, объявленной в модуле внешнего соединения, функцию из другого, общего модуля - возникает та же самая ошибка. Хотя в общем модуле тоже стоит признак "Внешнее соединение". Уже думал проблема с ролями или что-то ещё. Возвращаю из общего модуля без всяких обработок просто строку "Проверка дебаг" - ошибка осталась. Возврат этой же строки непосредственно из модуля внешнего соединения - проходит корректно. Продолжаю поиски
9. Евгений Мукомело (ixilimuse) 150 14.08.17 12:03 Сейчас в теме
(7) upd1: Разобрался окончательно. Всем спасибо! Первым делом надо было отлаживать всю схему из 1С, а потом уже код переносить в C#.

В 1С было видно что за ошибки возникали. И сразу все пофиксил и все заработало.
А именно: в общем модуле были ссылки на общий модуль который не имел флага "Внешнее соединение", в общем модуле были команды которые доступны только на клиенте, не обрамленные проверкой что бы выполнять только на клиенте. Плюс жесткий косяк с моей стороны - назвал методы в модуле внешнего соединения и в общем модуле - одинаково.
После устранения описанных ошибок - все заработало.
Оставьте свое сообщение