Передача сложных структур данных, таких как списки или массивы, из внешних DLL, написанных на языках .NET (VBA.NET, C#), в среду 1С:Предприятие 7.7 является классической задачей при создании внешних компонент или COM-объектов. Поскольку платформа 7.7 не поддерживает передачу сложных типов данных напрямую, нам необходимо воспользоваться механизмами сериализации или промежуточными COM-объектами. Рассмотрим подробнее основные способы решения этой задачи.
Одним из самых надежных и простых способов передачи данных является сериализация. Суть метода заключается в том, что мы приводим данные к строковому виду, который 1С способна распознать как свой собственный тип.
ЗначениеВСтрокуВнутр(Объект).ЗначениеИзСтрокиВнутр(СтрокаДанных), которая автоматически восстановит исходный СписокЗначений или ТаблицуЗначений.Этот способ удобен тем, что он не требует сложных манипуляций с памятью и работает стабильно на любых версиях платформы.
Если вам нужно передать структуру данных, которую можно перебирать, отличным решением будет использование COM-объекта Scripting.Dictionary из библиотеки Microsoft Scripting Runtime.
Разберем по шагам, как это работает:
Scripting.Dictionary.VARIANT.Item и Keys, а также перебирать их в цикле Для каждого.Этот метод работает быстрее, чем многие другие, так как является «родным» для COM-интерфейсов и позволяет избежать излишнего копирования данных.
Если вы создаете полноценную внешнюю компоненту (ВК), то у вас есть возможность управлять 1С напрямую. При инициализации компоненты 1С передает интерфейс IInitDone. Используя его, мы можем получить доступ к свойству AppDispatch.
Рассмотрим пример того, как можно создать объект непосредственно внутри 1С:
// В коде на стороне DLL (псевдокод):
// Получаем интерфейс приложения
var app = iInitDone.AppDispatch;
// Создаем список значений средствами 1С
var список = app.CreateObject("СписокЗначений");
// Наполняем его
список.AddValue("Значение1", "Представление1");
список.AddValue("Значение2", "Представление2");
Используя AppDispatch, вы не «передаете» список в 1С, а создаете его внутри адресного пространства приложения. Это наиболее профессиональный подход при разработке внешних компонент, так как он минимизирует риски несоответствия типов данных между внешним модулем и платформой.
При работе с COM-объектами важно помнить о типе VARIANT. 1С 7.7 ожидает, что данные будут упакованы в этот тип. Если вы планируете передавать массивы, убедитесь, что библиотека на .NET корректно преобразует массив в SafeArray, который понимается COM-интерфейсом.
Основные советы:
Scripting.Dictionary для сложных структур, если не требуется именно объект 1С СписокЗначений.AppDispatch учитывайте, что вы работаете внутри процесса 1С, поэтому любая ошибка в коде DLL может привести к аварийному завершению работы всей программы 1С. Всегда используйте блоки try-catch в вашем коде на .NET.Проанализировав эти методы, вы сможете выбрать тот, который лучше всего подходит для вашей архитектуры решения. Для простых задач идеально подойдет сериализация, а для сложных интеграционных модулей — работа через AppDispatch или Scripting.Dictionary.