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

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

При реализации механизмов обмена данными между различными конфигурациями на платформе 1С:Предприятие 7.7 программисты часто сталкиваются с проблемой передачи и последующего приема реквизитов типа Перечисление. В отличие от простых типов (строка или число), перечисление является ссылочным типом данных, и простая передача его строкового представления в XML-файле не позволяет напрямую записать его в базу-приемник. Рассмотрим, как правильно обработать такие данные и какие методы платформы следует использовать.

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

Типичная ошибка при попытке установить значение перечисления — использование объектов метаданных вместо реальных значений. Когда мы перебираем коллекцию Метаданные.Перечисление(к), мы получаем доступ к структуре конфигурации, а не к данным. Если попытаться присвоить результат такого поиска напрямую в реквизит документа, система выдаст ошибку или просто не заполнит поле, так как реквизиту требуется объект типа Перечисление, а не объект описания метаданных.

Разберем ситуацию, когда из XML приходят две строки: идентификатор вида перечисления (например, "СтавкиНДС") и идентификатор конкретного значения (например, "НДС20"). Наша задача — превратить эти строки в полноценный объект 1С.

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

Самый эффективный и правильный способ в 1С 7.7 — использование метода ЗначениеПоИдентификатору(). Этот метод позволяет получить ссылку на значение перечисления, зная его текстовое имя в конфигураторе. Проанализируем базовый код для случая, когда вид перечисления нам заранее известен:


// Предположим, Перес - это строка "Цена2", полученная из XML
ТекЗначение = Перечисление.ТипыЦен.ЗначениеПоИдентификатору(Перес);
Если ТекЗначение.Выбран() = 1 Тогда
    Документ.УстановитьАтрибут("ТипЦены", ТекЗначение);
КонецЕсли;

Здесь Перечисление.ТипыЦен — это обращение к конкретному виду перечисления. Однако в универсальных обработках обмена вид перечисления часто передается динамически в переменной.

Решение 2: Динамическое обращение к виду перечисления

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


// ВидXML - строка "ТипыЦен", ПересXML - строка "Цена2"
Вид = СокрЛП(ВидXML);
ЗначИд = СокрЛП(ПересXML);

// Получаем доступ к нужному виду перечисления динамически
ВидПеречисления = Перечисление.ПолучитьАтрибут(Вид);

// Находим конкретное значение
НужноеЗначение = ВидПеречисления.ЗначениеПоИдентификатору(ЗначИд);

// Устанавливаем реквизит документа
Документ.УстановитьАтрибут(ИмяРеквизита, НужноеЗначение);

Этот метод является наиболее надежным, так как он корректно обрабатывает типы данных платформы 1С 7.7.

Решение 3: Использование функции Шаблон для получения значения

Существует еще один "хитрый" способ, позволяющий получить значение перечисления одной строкой без использования промежуточных методов. Мы можем воспользоваться функцией Шаблон(), которая вычисляет строковое выражение как код 1С. Рассмотрим этот пример:


Вид = "ТипыЦен";
Ид = "Цена2";
// Формируем строку вида "[Перечисление.ТипыЦен.Цена2]"
НужноеЗначение = Шаблон("[Перечисление." + Вид + "." + Ид + "]");

Если ПустоеЗначение(НужноеЗначение) = 0 Тогда
    Документ.УстановитьАтрибут(ИмяРеквизита, НужноеЗначение);
КонецЕсли;

Этот способ удобен своей краткостью, но его сложнее отлаживать, если в XML-файле переданы некорректные идентификаторы, которых нет в конфигурации.

Важные нюансы и рекомендации

При работе с перечислениями через XML важно учитывать несколько технических особенностей платформы 7.7:

  1. Идентификатор vs Представление: Метод ЗначениеПоИдентификатору ищет значение именно по внутреннему имени (то, что написано в конфигураторе в колонке "Идентификатор"). Если в XML передано "Представление" (текст, который видит пользователь в интерфейсе), поиск может не сработать, если они различаются. В таком случае придется использовать перебор значений вида перечисления и сравнение через Представление().
  2. Регистрозависимость: В некоторых случаях (особенно при работе с SQL-версиями 1С 7.7) поиск идентификаторов может быть чувствителен к регистру. Рекомендуется обеспечивать полное соответствие написания в источнике и приемнике.
  3. Проверка на существование: Всегда проверяйте результат поиска перед установкой атрибута. Если ЗначениеПоИдентификатору не найдет соответствия, оно вернет пустое значение. Если реквизит документа обязателен к заполнению, это может привести к ошибкам при проведении.
  4. Типизация реквизита: Если реквизит документа имеет составной тип или тип "Неопределенный", перед установкой значения перечисления полезно явно вызвать Документ.НазначитьТип(ИмяРеквизита, "Перечисление." + Вид).

Таким образом, для стабильной передачи документов через XML в 1С 7.7 следует использовать связку методов Перечисление.ПолучитьАтрибут(ИмяВида) и ЗначениеПоИдентификатору(ИмяЗначения). Это гарантирует правильную типизацию данных и исключает ошибки при записи объектов в информационную базу.

← На главную