При интеграции сторонних приложений (например, через макросы VBA в Excel) с системой 1С:Предприятие часто возникает задача программного создания документов или справочников. Одной из камней преткновения для разработчиков становится работа с объектами типа Перечисление (Enum). В этой статье мы разберем, почему стандартные подходы могут не работать и как правильно передавать значения перечислений через COM-соединение.
Рассмотрим ситуацию: нам необходимо создать спецификацию номенклатуры и установить в ней ВидВоспроизводства. Часто новички пытаются использовать синтаксис, привычный для языка запросов 1С или просто интуитивно понятный, но сталкиваются с ошибками. Проанализируем, почему не работают типичные варианты:
Перечисление вместо множественного Перечисления.ЗНАЧЕНИЕ(), которая предназначена исключительно для языка запросов.Выбрать() или Добавить(), которые не применимы к значениям перечислений, так как перечисления — это статические объекты метаданных, значения которых задаются в конфигураторе.Выясним главную причину: при работе через COM-объект мы обращаемся к объектной модели 1С. В этой модели коллекция перечислений называется во множественном числе — Перечисления (на английском — Enums). В то же время в языке запросов используется ключевое слово в единственном числе. Именно это различие часто сбивает с толку.
Наиболее простым и эффективным способом установки значения является прямое обращение к объекту через подключенную базу. Рассмотрим пример кода на VBA, который решает задачу автора темы:
' Допустим, Basa — это ваше установленное COM-соединение
' Продукт — это объект (например, СправочникОбъект или ДокументОбъект)
Продукт.ВидВоспроизводства = Basa.Перечисления.ВидыВоспроизводстваНоменклатуры.Производство
В данном примере мы четко следуем иерархии объектов: Соединение -> Коллекция Перечисления -> Имя Перечисления -> Имя Значения. Это решение работает максимально быстро и надежно, если вы точно знаете имя значения в конфигурации.
Иногда прямое обращение может вызвать сложности, если в именах объектов используются специфические символы или требуется динамически формировать строку. В таких случаях на помощь приходит универсальный метод ПредопределенноеЗначение. Рассмотрим его применение:
' Обратите внимание: внутри строки используется единственное число "Перечисление"
Set IKS = Basa.PredefinedValue("Enum.ВидыВоспроизводстваНоменклатуры.Производство")
' Или на русском языке
IKS = Basa.ПредопределенноеЗначение("Перечисление.ВидыВоспроизводстваНоменклатуры.Производство")
Продукт.ВидВоспроизводства = IKS
Этот метод удобен тем, что вы передаете путь к объекту в виде обычной строки. Однако важно помнить: внутри строкового параметра для этой функции всегда пишется Перечисление (в единственном числе), что опять же возвращает нас к особенностям синтаксиса платформы.
Если вам необходимо перебрать все значения перечисления или вы знаете только порядковый номер значения, можно использовать метод Получить(Индекс). Посмотрим, как это реализовать:
' Индексация начинается с нуля
' Допустим, "Производство" идет первым в списке конфигуратора
Продукт.ВидВоспроизводства = Basa.Перечисления.ВидыВоспроизводстваНоменклатуры.Получить(0)
Важно не путать это с методом Индекс(). Метод Индекс(ЭлементПеречисления) выполняет обратную задачу — возвращает числовой индекс уже имеющегося у вас значения. Попытка вызвать Индекс(0) приведет к ошибке, так как метод ожидает объект перечисления, а не число.
Если вы не уверены в точном имени значения (например, оно может отличаться в разных версиях конфигурации), можно проанализировать метаданные прямо из вашего кода. Проанализируем ситуацию, когда нам нужно программно узнать доступные значения:
' Получаем коллекцию значений перечисления через метаданные
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С.
' Пример завершения операции
Продукт.ВидВоспроизводства = Basa.Перечисления.ВидыВоспроизводстваНоменклатуры.Производство
Продукт.Записать
Таким образом, мы рассмотрели все основные способы работы с перечислениями через COM-соединение. Главное правило успеха здесь — строгое соблюдение регистра имен и понимание того, в каком контексте (код или запрос) вы находитесь в данный момент.