Использование .NET сборок в 1С 8.2, 8.3 без установки и без регистрации в реестре
Разработка - Разработка внешних компонент
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Предлагаемая компонента выполнена по технологии Native API и дает возможность использовать компоненты, созданные на платформе .NET, без установки и без регистрации в реестре windows. Для подключения .NET сборок используется "CLR Hosting API". При загрузке .NET сборки, компонента начинает обладать свойствами и методами созданного класса.
Ограничения компоненты:
Статические классы не поддерживаются;
Конструктор должен быть без параметров;
Поддерживаются только следующие типы для обмена с 1С: System.String; System.Boolean; System.Int32; System.Double; System.Byte[];
Out и ref параметры не поддерживаются в связи с тем, что не получилось это реализовать, см. описание метода, если кто разберется, как это сделать, буду очень рад.
Свойства и метода компоненты:
свойства:
- CurrentVersionCLR - только для чтения, доступно только после успешного выполнения метода CreateObject(), возвращает используемую версию CLR;
методы:
- GetLastError() - возвращает строку, содержащую последнюю ошибку;
- GetInstalledRuntimes() - возвращает строку, содержащую перечисленные через ";" установленные версии CLR;
- CreateObject(Dir, AssemblyName, ClassName, VersionCLR, RemoveDir) - создает объект из сборки, находящейся в определенном каталоге;
- Dir - каталог, в котором находятся компоненты, фактически аналог каталога приложения, нужен чтобы могли загрузиться зависимые сборки;
- AssemblyName - имя сборки без расширения;
- ClassName - полное имя класса;
- VersionCLR - необязательный параметр, если не указана, то будет использована последняя версия, формат строки можно посмотреть в свойстве CurrentVersionCLR;
- RemoveDir - необязательный параметр, по умолчанию Ложь, если Истина, то при уничтожении компоненты будет удален каталог Dir.
- CreateObjectFromFile(FileName, ClassName, VersionCLR) - создает объект из сборки, находящейся в определенном файле;
- FileName - полное имя файла;
- ClassName - полное имя класса;
- VersionCLR - необязательный параметр, если не указана, то будет использована последняя версия, формат строки можно посмотреть в свойстве CurrentVersionCLR;
- CreateObjectFromBase64(FileData, ClassName, VersionCLR) - создает объект из сборки, файл которой закодирован в строку Base64.
- FileData - строка, двоичные данные сборки, закодированные в Base64;
- ClassName - полное имя класса;
- VersionCLR - необязательный параметр, если не указана, то будет использована последняя версия, формат строки можно посмотреть в свойстве CurrentVersionCLR;
Пример кода:
Если Не ПодключитьВнешнююКомпоненту(ИмяМакетаКомпоненты, "NET") Тогда
Сообщить("Не удалось подключить компоненту NETLoader");
Возврат Неопределено;
Иначе
Сообщить("Компонента NETLoader успешно подключена");
КонецЕсли;
Компонента = Новый("AddIn.NET.NETLoader");
Попытка
// Параметры: FileData, ClassName, VersionCLR
Компонента.CreateObjectFromBase64(Base64Строка(Test_dll), "Test.Class1");
Исключение
Сообщить("Ошибка при вызове метода ""CreateObject"": " + ОписаниеОшибкиКомпоненты(Компонента));
Компонента = Неопределено;
КонецПопытки;
CurrentVersionCLR = Компонента.CurrentVersionCLR;
Сообщить("CurrentVersionCLR: """ + CurrentVersionCLR + """");
InstalledRuntimes = Компонента.GetInstalledRuntimes();
Сообщить("Installed runtimes: " + InstalledRuntimes);
Результат = Компонента.TestMethod("СтрокаИз1С");
Сообщить(Результат);
Компонента.TestProp = "TestPropFrom1C";
Сообщить(Компонента.TestProp);
Компонента.TestField = "TestFieldFrom1C";
Сообщить(Компонента.TestField);
Описание файлов:
NETLoader.zip - архив, содержащий каталоги:
- NETLoader - проект для Visual Studio Express 2013 for Windows Desktop и демо обработку (1 версия от 02.09.2014).
- NETLoader2 - проект для Visual Studio 2015 Community Edition, использованы заголовочные файлы для версии 1С 8.3.8 (2 версия от 14.08.2016).
Отказ от ответственности:
Данный продукт Вы используете на свой страх и риск, претензии ни в каком виде не принимаются.
Update 14.08.2016: проект скомпилирован Visual Studio 2015 Community Edition, использованы заголовочные файлы от 8.3.8, исправлены ошибки и недочеты, добавлены методы CreateObjectFromFile и CreateObjectFromBase64.
Update 13.12.2022: Компонента морально устарела, т.к. давно уже появился .net core, который теперь просто .net, и вообще на серверах уже linux.
Я даже не знаю, работает ли она до сих пор. Поэтому, у меня нет никакого желания получать за нее стартмани, но бесплатной у меня не получилось её сделать.
Если вам нужна какая-то функциональность, которой нет в 1С, то для начала, самый простой способ получить её - это реализовать http-сервис, который можно использовать из 1С.
Ну и если вы уверены, что вам нужна именно нативная внешняя компонента, и не хочется писать её на C++, то попробуйте Rust, тут можно посмотреть пример https://github.com/medigor/example-native-api-rs.
Вступайте в нашу телеграмм-группу Инфостарт
См. также
Разработка внешних компонент Телефония, SIP Разработчик 1С:Предприятие 8 1C:Бухгалтерия Россия Платные (руб)
Внешняя компонента выполнена по технологии Native API для 1С 8.х, обеспечивает доступ к программным АТС Asterisk (FreePBX, Elastix) через AMI интерфейс. Через него можно управлять многими функциями Asterisk (определение номеров, перевод звонков, набор телефона и т. д.)
5246 руб.
04.05.2018 52190 128 68
Разработка внешних компонент Разработчик 1С:Предприятие 8 1C:Бухгалтерия 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 Платные (руб)
Внешняя компонента позволяет работать c TWAIN-совместимым оборудованием (сканерами, камерами) . Полностью совместима со стандартной TWAIN-компонентой из БСП и может применяться как ее замена без изменения вызовов, при этом может работать с 64-разрядной платформой, а так же имеет расширенную функциональность, например, сохранение результата непосредственно в PDF без использования сторонних утилит. Прекрасно работает на сервере, тонком клиенте и веб-клиенте (проверена работа в браузерах Google Chrome, Mozilla Firefox и Microsoft Internet Explorer).
5084 руб.
12.05.2020 34947 147 100
Разработка внешних компонент Инструментарий разработчика Разработчик 1С 8.3 Бесплатно (free)
Внешняя обработка проверяет выгрузку конфигурации, расширений и внешних обработок и находит места, где код руками делает то, что платформа умеет штатно: регулярки через COM, пауза пустым циклом, свой хеш и Base64, распаковка архивов программой, буфер обмена через HTML-поле. По каждой находке пишет, доступна ли замена на месте или мешает тонкий клиент.
13.10.2026 1314 144 nedomolkov.ivan 5
Разработка внешних компонент Разработчик 1С:Предприятие 8 Бесплатно (free)
Нативная внешняя компонента для 1С 8 для чтения файлов Excel без установленного Excel и делает это быстро, файл 68МБ загружается в таблицу значений ~1 секунду. Компонента поддерживает чтение двух форматов: Excel 2007+ и Excel 97-2003 Формат файла определяется автоматически по сигнатуре (первые 8 байт файла), а не по расширению. Позволяет открывать XLS и XLSX файлы и получать содержимое листов в виде ТаблицыЗначений или JSON-массива.
03.07.2026 2384 skyadmin 31
Разработка внешних компонент Разработчик 1С 8.3 Бесплатно (free)
В современных корпоративных решениях на платформе 1С:Предприятие 8.3 всё чаще возникает потребность в визуальном моделировании и автоматизации бизнес-процессов с использованием нотации BPMN 2.0. Стандартные средства платформы не предоставляют полноценного редактора BPMN, однако интеграция открытой библиотеки bpmn-js позволяет реализовать интерактивное моделирование бизнес-процессов непосредственно в 1С. В статье рассмотрены архитектура решения, пошаговая инструкция по сборке библиотеки из исходников для WebKit, а также примеры программного взаимодействия между 1С и JavaScript.
03.04.2026 4279 SultanovStas 8
Разработка внешних компонент Разработчик 1С 8.3 Россия Бесплатно (free)
Создать NativeAPI-компоненту для Python-скриптов? Это просто!
20.10.2025 11020 IlyaKuznetsov 10
Разработка внешних компонент Системный администратор Разработчик Стажер Бесплатно (free)
Библиотека для работы с базами SQLite из 1С на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!
14.01.2025 8222 bayselonarrend 17
Разработка внешних компонент Разработчик 1С:Предприятие 8 Россия Бесплатно (free)
В статье описывается приложение-конструктор внешних компонент (native API). Конструктор упрощает процесс разработки за счет удобного добавления всех нужных функций и процедур в графическом режиме, с указанием их параметров и типов параметров. На выходе приложение генерирует готовый код на С++ и Rust и позволяет сразу приступить к реализации, без настройки API компоненты вручную.
04.12.2024 13808 kovalevdmv 29
Удалось создать тестовый проект со сборкой dll на IDE SharpDevelop c .Net 4. Взял текст вашего класса, создал x64 dll, загрузил в макет обработки 1с.
Запустил в 1с, dll запустилась, отработала.
Пара моментов на данный момент не работают:
1. Запуск dll в контексте клиента не отрабатывает, работает только контекст сервера.
С аналогичной проблемой уже сталкивались люди, см. ввыше комментарии.
2. Запуск обработки с управляемой формой возможен либо в управляемом режиме 1с, либо в неуправляемом с созданием неуправляемой формы и переносом функционала в нее.
Это проблема платформы.
Официально, это новая фишка 1с платформы.
На самом деле - баг, который с 2014 года не исправляют.
Объясните пожалуйста более подробно, каким образом мы загружаем dll"ку на C#. Из кода демки внешней обработки понятно, что zip архив с манифестом и dll'ка C++ NETLoader_x32.dll загружаются в макет формы. Дальше, при инициализации компоненты в самой базе они загружаются.
Не понятно каким образом Test.dll с кодом C# попадает в обработку.
В коде формы есть строки:
КаталогКомпонент = КаталогВременныхФайлов() + Новый УникальныйИдентификатор;
СоздатьКаталог(КаталогКомпонент);
Test_dll.Записать(КаталогКомпонент + "\Test.dll");
откуда "вытаскивается" Test.dll?
Я правильно понял, что Test.dll загружается в макет Test_dll? Если да, то в каком формате?
Если есть возможность использовать com-объект, то наверное стоит использовать его, т.к. он удобнее в использовании. NativeAPI удобнее только в распространении, т.к. не надо ничего регистрировать. Собственно для этого я и сделал её, потому что бывает, что нет возможности развернуть нужное ПО на компьютерах клиента.
То есть по аналогии с моей компонентой
public static object ОбернутьОбъект(object obj)
{
if (obj != null)
{
//switch (obj.GetType().ToString())
//{
// case "System.String":
// case "System.DateTime":
// case "System.Boolean":
// case "System.Byte":
// case "System.Char":
// case "System.Decimal":
// case "System.Double":
// case "System.Single": // Float
// case "System.Int32":
// case "System.Int64": // Long
// case "System.SByte":
// case "System.Int16":// Short
// case "System.UInt32":
// case "System.UInt64":
// case "System.UInt16":
// break; // These Types do not get wrapped
// default:
// obj = new AutoWrap(obj); // Wrap Type
// break;
//}
// Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double и Single.
Type Тип = obj.GetType();
if (Тип==typeof(System.IntPtr) || Тип==typeof(System.UIntPtr))
return new AutoWrap(obj);
if (ЭтоСемерка)
{
if (Тип == typeof(System.Decimal)) return ((Decimal)obj).ToString(CultureInfo.InvariantCulture);
if (Тип.IsPrimitive)
{
if ((Тип == typeof(System.Int64) || Тип == typeof(System.UInt32) || Тип == typeof(System.UInt64) || Тип == typeof(System.UInt16) || Тип == typeof(System.SByte)))
obj = Convert.ChangeType(obj, typeof(string), CultureInfo.InvariantCulture);
}
else if (!(Тип == typeof(System.DateTime)
|| Тип == typeof(System.String)
|| Тип == typeof(System.Decimal)
|| Тип.IsCOMObject)
)
obj = new AutoWrap(obj);
}
else
{
if (Тип.IsArray)
{
Type ТипМассива = Тип.GetElementType();
if (ТипМассива != null)
Тип = ТипМассива;
}
if (!(Тип.IsPrimitive
|| Тип == typeof(System.Decimal)
|| Тип == typeof(System.DateTime)
|| Тип == typeof(System.String)
|| Тип.IsCOMObject)
)
obj = new AutoWrap(obj);
}
}
return obj;
}
ПоказатьКстати сейчас ПМ можно применять
(10) куда передать? и откуда вернуть? если речь про обмен между компонентой и 1С, то возможна передача только простых типов и массива байтов, таковы ограничения технологии NativeAPI.
(11) пробовал я ByRef, не работает. Я знаю как по-другому сделать, но мне лень свои наработки выкладывать, тем более компонента не очень популярна.
Args[j-i].vt:=VT_BYREF or TvarData(p^[i]).VType;
Args[j-i].unkVal:=@TVarData(p^[i]).VAny;
Получив данные о параметрах через GetParameters можно передавать адрес переменной
То есть вернуть ссылку и передать не получится? Или ссылку на ВК можно передать?
Тогда можно оборачивать например в двоичные данные структуру типа Variant, а из них доставать уже ссылки на объекты.
А ВК создавать через Новый куда передавать эти двоичные данные для инициализации ВК,
и если нужен объект в параметрах то передавать опять же эти ДД и из неё вытаскивать ссылку на реальный объект.
(14) пробовал я c++/cli, CLR Hosting работает надежнее, сами 1Сники писали, что в таких смешанных сборках есть проблемы (не помню какие). Насчет CLR Hosting могу сказать, что её даже в MS SQL применяют для создания хранимых процедур CLR.
(15) импортозамещение в ПО достаточно условное, сам Linux пишут в америке в основном (если не ошибаюсь), поэтому под этими громкими словами скрывается простой смысл - не платить американцам за ПО. Core CLR еще не достаточно стабилен (судя по отзывам в инете). Тема конечно интересна, тем более xamarin Теперь бесплатный, можно писать на c# под разные платформы.
P.S. я не проф. разработчик на технологиях .NET, поэтому к моему мнению нужно относится с осторожностью.
Просто данный подход можно прикрутить к ВК Native.
Кстати а CLR Hosting используется в .Net Core ?
На стороне .Net выполнять метод. Параметры передаются ввиде Stream. Сначало идет тип, затем данные. Возвращаемые объекты сохряняются в словаре и ID типа автоинкремента и передается тип как ссылочный и ИД.
В 1С мы можем возвращать Двоичные данные. Единственно, что byte[] мы тоже должны упаковывать и распаковывать
struct Элемент
{
Object объект;
int СледующийУдаленныйЭлемент
}
Class МенеджерПамяти
{ List<Элемент> Список;
int ПервыйУдаленный;
}
ПоказатьЯ это к тому, что можно и в Linux это сделать с Core .Net
Сейчас с импортозамещением это будет актуально
А там была куча классов. И стал выбор либо вручную использовать обертку либо реализовать встроенный механизм IReflect.
Для примера в
AngleSharp используется под сотню классов и интерфейсов. Кстати если раньше сначала писал на C# и переводил на 1С, то сейчас уже пишу напрямую. Опыт
Серьезность Код Описание Проект Файл Строка Состояние подавления
Ошибка C2371 int8_t: переопределение; различные базовые типы NETLoader \netloader\addin.netloader\include\types.h 67
А то я начинающий С++ ник
походу где-то уже объявлен такой тип
вообще советую обновить все файлы из каталога include, т.к. с тех пор много чего изменилось, в компоненты была добавлена асинхронность, вроде бы шаблон собрали не 2010 студии, а на 2013.
(С++ не тот язык , который наскоком учится. в отличие от C#. советую почитать какие-нибудь книги. ошибки так и будут возникть, важно понимать причины их появления )
и советую установить английскую версию VS. просто потому что информацию по ошибкам будет проще искать.
Кстати а есть полный аналог MemoryStream d C++. Или проще свой написать там недолго.
А насчет английской версии VS я уже понял. Идут кракозябры
В чем причина так и не удалось понять, оба пользователя администраторы системы, по идее вся разница только в используемых Temp папках - C:\Users\<имя пользоваетля>\AppData\Local\Temp.
Помогите пожалуйста, было бы здорово разобраться с этим странным явлением:)
я давно еще добавил метод CreateObjectFromBase64(), в этом методе не используется каталог, а передается dll в виде строки (кодированной Base64), потом конвертируется в массив байтов и загружается в домен. Но есть небольшой минус - если есть зависимые dll, то их нужно зашивать в ресурсы (в случае загрузки из каталога CLR сама их загрузит). Приме во вложении.
в ресурсы dll добавлена другая сборка System.Web.Helpers.dll, она загружается в домен в методе CurrentDomain_AssemblyResolve, а этот метод в свою очередь является обработчиком события AssemblyResolve.
вот тут описано что происходит.
Вообще те методы давно добавлены, просто лень было обновлять публикацию, вот решил обновить не знаю зачем. Вообще у меня есть еще наработки, но т.к. требуется время, чтобы всё это оформить и выложить, а пользы не предвидится, то и не хочется этим заниматься.
Не думал, что придется писать вам, так как до недавнего времени компонента работала корректно.Но, внезапно выяснилось, что на некоторых машинах компонента не работает, если ее запускать в контексте клиента.
Сама компонента NETLoader загружается, но при вызове метода CreateObjectFromBase64 возникает исключение, также поле CurrentVersionCLR не доступно. При этом, если запускать в контексте сервера, все нормально.
Как ни странно, функция GetInstalledRuntimes() работает нормально везде.
Пытался, как-то отследить зависимость ошибки, но на двух разных машинах с одинаковой ос (windows server 2008) и версией платформы, ошибка проявляется только на одной машине.
При этом, если использовать метод загрузки из временной папки CreateObject, то все нормально.
Не знаю будете ли вы разбираться с этим, но просто сообщил о такой ситуации.
ps.метод в моей компоненте возвращает 1С'ке многомерный массив "multidimensional array <double>" .
На этом моменте 1С ругается на ошибку, так понимаю что с многомерными массивами Netloader не работает.
Нужно вернуть простой тип, например сериализовать массив в строку используя формат XML, JSON, CSV и т.д.
А в 1С потом можно десериализовать одним из встроенных методов.
Я делал лично так: в 1С создаешь нужный объект (в данном случае массив), сериализовал его с помощью объекта СериализаторXDTO, посмотрел какой получился текст, в компоненте в лоб сделал такой же текст (используя StringBuilder) и вернул получившуюся строку. в 1С потом с помощью объекта СериализаторXDTO обратно десериализовал.
процедуры для сериализации/десериализации:
Функция СериализоватьВXML(Значение)
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение);
СтрокаXML = ЗаписьXML.Закрыть();
Возврат СтрокаXML;
КонецФункции
Функция ДесериализацияИзXML(СтрокаXML)
ЧтениеXML = Новый ЧтениеXML();
ЧтениеXML.УстановитьСтроку(СтрокаXML);
Значение = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Возврат Значение;
КонецФункции
ПоказатьА как считаете правильнее/быстрее?
Ведь в случае с сериализацией: на стороне 1с надосериализовать начальные данные(массив) в строку, затем строку опять сериализовать на стороне компоненты в массив c#. И обработанные данные также возвращать 1С т.е снова сериализовывать на компоненте передать 1с и сериазовать в тип 1с.
В случае обьявления в компоненте доступных массивов: Входящие данные и Результирующие данные и метода для установки/получения данных массива по индексу из 1С.
Множественные вызовы компоненты из 1С для получения значений, но не быстрее ли так чем с сериализацией или какие подводные камни могут быть.
Хотя возможно дело в том, что когда добавили асинхронность в 1С, в компоненте тоже что-то поменялось. В версии 8.3.8 был обновлен шаблон компоненты для поддержки асинхронности и я тоже выложил перекомпилированную компоненту. Вы используете последнюю версию? Версия 1С какая (8.3.7, 8.3.8)?
Допустим, у меня во внешней компоненте будут выполняться долгие по времени вычисления. В данном случае, можно ли воспользоваться асинхронным вызовом ВК, чтобы интерфейс у пользователя не замораживался?
Чтобы не блокировался интерфейс, придется реализовывать что-то подобное: в компоненте запускать другой поток и в нем выполнять все действия. А чтобы понять, что действие выполнено, придется периодически опрашивать компоненту (т.к. поддержка внешних событий в текущей версии компоненты отсутствует). Т.е. вместо одного метода придется делать два: один запускает выполнение в другом потоке, второй проверяет выполнение и если надо возвращает результат.
Вы можете заказать платную консультацию или разработку у автора. Будет создан приватный заказ на «Бирже заказов» для автора.
№ 300091
Создание 02.09.14 19:01
Обновление 16.12.22 08:21
Просмотры 48222
Загрузки 244
Рейтинг
70
Комментарии 73
Код открыт Да
Рубрики Разработка внешних компонент
Кому
Системный администратор
,
Разработчик
Тип файла Компонента, плагин (dll, vbs,..)
Платформа 1С:Предприятие 8
Конфигурация 1C:Бухгалтерия
Операционная система Windows
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Доступ к файлу Абонемент ($m)