Как передать список значений или массив из DLL (VBA.NET) в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

Передача сложных структур данных, таких как списки или массивы, из внешних DLL, написанных на языках .NET (VBA.NET, C#), в среду 1С:Предприятие 7.7 является классической задачей при создании внешних компонент или COM-объектов. Поскольку платформа 7.7 не поддерживает передачу сложных типов данных напрямую, нам необходимо воспользоваться механизмами сериализации или промежуточными COM-объектами. Рассмотрим подробнее основные способы решения этой задачи.

Использование сериализации через ЗначениеВСтрокуВнутр

Одним из самых надежных и простых способов передачи данных является сериализация. Суть метода заключается в том, что мы приводим данные к строковому виду, который 1С способна распознать как свой собственный тип.

  1. Внутри 1С 7.7 мы можем изучить структуру строки, которую возвращает функция ЗначениеВСтрокуВнутр(Объект).
  2. На стороне DLL, написанной на .NET, мы программно формируем строку аналогичного формата, в которую упаковываем все элементы нашего списка.
  3. Передаем эту строку в 1С как обычный строковый параметр.
  4. В 1С вызываем функцию ЗначениеИзСтрокиВнутр(СтрокаДанных), которая автоматически восстановит исходный СписокЗначений или ТаблицуЗначений.

Этот способ удобен тем, что он не требует сложных манипуляций с памятью и работает стабильно на любых версиях платформы.

Применение объекта Scripting.Dictionary

Если вам нужно передать структуру данных, которую можно перебирать, отличным решением будет использование COM-объекта Scripting.Dictionary из библиотеки Microsoft Scripting Runtime.

Разберем по шагам, как это работает:

  1. В вашем коде на .NET инициализируйте объект Scripting.Dictionary.
  2. Наполните его ключами и значениями.
  3. Передайте этот объект в 1С как VARIANT.
  4. Внутри 1С 7.7 вы можете обращаться к элементам словаря через стандартные методы Item и Keys, а также перебирать их в цикле Для каждого.

Этот метод работает быстрее, чем многие другие, так как является «родным» для COM-интерфейсов и позволяет избежать излишнего копирования данных.

Прямое взаимодействие через AppDispatch

Если вы создаете полноценную внешнюю компоненту (ВК), то у вас есть возможность управлять 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-интерфейсом.

Основные советы:

Проанализировав эти методы, вы сможете выбрать тот, который лучше всего подходит для вашей архитектуры решения. Для простых задач идеально подойдет сериализация, а для сложных интеграционных модулей — работа через AppDispatch или Scripting.Dictionary.

← На главную