Как программно установить значение перечисления в 1С через COM-соединение?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет Промышленность, строительство и АПК
← На главную

При интеграции сторонних приложений (например, через макросы VBA в Excel) с системой 1С:Предприятие часто возникает задача программного создания документов или справочников. Одной из камней преткновения для разработчиков становится работа с объектами типа Перечисление (Enum). В этой статье мы разберем, почему стандартные подходы могут не работать и как правильно передавать значения перечислений через COM-соединение.

Анализ основной проблемы: синтаксическая ловушка

Рассмотрим ситуацию: нам необходимо создать спецификацию номенклатуры и установить в ней ВидВоспроизводства. Часто новички пытаются использовать синтаксис, привычный для языка запросов 1С или просто интуитивно понятный, но сталкиваются с ошибками. Проанализируем, почему не работают типичные варианты:

  1. Использование единственного числа Перечисление вместо множественного Перечисления.
  2. Попытка применить функцию ЗНАЧЕНИЕ(), которая предназначена исключительно для языка запросов.
  3. Использование методов Выбрать() или Добавить(), которые не применимы к значениям перечислений, так как перечисления — это статические объекты метаданных, значения которых задаются в конфигураторе.

Выясним главную причину: при работе через COM-объект мы обращаемся к объектной модели 1С. В этой модели коллекция перечислений называется во множественном числе — Перечисления (на английском — Enums). В то же время в языке запросов используется ключевое слово в единственном числе. Именно это различие часто сбивает с толку.

Решение 1: Прямое обращение к коллекции перечислений

Наиболее простым и эффективным способом установки значения является прямое обращение к объекту через подключенную базу. Рассмотрим пример кода на VBA, который решает задачу автора темы:


' Допустим, Basa — это ваше установленное COM-соединение
' Продукт — это объект (например, СправочникОбъект или ДокументОбъект)
Продукт.ВидВоспроизводства = Basa.Перечисления.ВидыВоспроизводстваНоменклатуры.Производство

В данном примере мы четко следуем иерархии объектов: Соединение -> Коллекция Перечисления -> Имя Перечисления -> Имя Значения. Это решение работает максимально быстро и надежно, если вы точно знаете имя значения в конфигурации.

Решение 2: Использование метода ПредопределенноеЗначение

Иногда прямое обращение может вызвать сложности, если в именах объектов используются специфические символы или требуется динамически формировать строку. В таких случаях на помощь приходит универсальный метод ПредопределенноеЗначение. Рассмотрим его применение:


' Обратите внимание: внутри строки используется единственное число "Перечисление"
Set IKS = Basa.PredefinedValue("Enum.ВидыВоспроизводстваНоменклатуры.Производство")
' Или на русском языке
IKS = Basa.ПредопределенноеЗначение("Перечисление.ВидыВоспроизводстваНоменклатуры.Производство")
Продукт.ВидВоспроизводства = IKS

Этот метод удобен тем, что вы передаете путь к объекту в виде обычной строки. Однако важно помнить: внутри строкового параметра для этой функции всегда пишется Перечисление (в единственном числе), что опять же возвращает нас к особенностям синтаксиса платформы.

Решение 3: Получение значения по индексу

Если вам необходимо перебрать все значения перечисления или вы знаете только порядковый номер значения, можно использовать метод Получить(Индекс). Посмотрим, как это реализовать:


' Индексация начинается с нуля
' Допустим, "Производство" идет первым в списке конфигуратора
Продукт.ВидВоспроизводства = Basa.Перечисления.ВидыВоспроизводстваНоменклатуры.Получить(0)

Важно не путать это с методом Индекс(). Метод Индекс(ЭлементПеречисления) выполняет обратную задачу — возвращает числовой индекс уже имеющегося у вас значения. Попытка вызвать Индекс(0) приведет к ошибке, так как метод ожидает объект перечисления, а не число.

Работа с метаданными через COM

Если вы не уверены в точном имени значения (например, оно может отличаться в разных версиях конфигурации), можно проанализировать метаданные прямо из вашего кода. Проанализируем ситуацию, когда нам нужно программно узнать доступные значения:


' Получаем коллекцию значений перечисления через метаданные
Set EnumMetadata = Basa.Metadata.Enums.ВидыВоспроизводстваНоменклатуры.EnumValues
' Проходим циклом по значениям (пример логики)
For i = 0 To EnumMetadata.Count() - 1
    Debug.Print EnumMetadata.Get(i).Name
Next i

Это позволяет сделать ваш интеграционный механизм более гибким и устойчивым к изменениям в конфигурации 1С.

Важные рекомендации при записи данных

После того как значение ВидВоспроизводства или СтавкаНДС успешно установлено, крайне важно не забыть зафиксировать изменения в базе данных. Помните, что присвоение значения переменной в VBA или свойству объекта в памяти 1С еще не записывает его в таблицу SQL. Разберем финальный этап:

  1. Убедитесь, что вы работаете с Объектом (полученным через СоздатьЭлемент() или ПолучитьОбъект()), а не со Ссылкой.
  2. Вызовите метод Записать() у объекта 1С.

' Пример завершения операции
Продукт.ВидВоспроизводства = Basa.Перечисления.ВидыВоспроизводстваНоменклатуры.Производство
Продукт.Записать

Таким образом, мы рассмотрели все основные способы работы с перечислениями через COM-соединение. Главное правило успеха здесь — строгое соблюдение регистра имен и понимание того, в каком контексте (код или запрос) вы находитесь в данный момент.

← На главную