Как правильно конвертировать значение перечисления в строку в 1С:Конвертация данных

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Разница между внутренним именем и представлением перечисления

Прежде всего, проанализируем, какой именно результат мы хотим получить в строке-приемнике. В платформе 1С значение перечисления имеет два строковых выражения:

  1. Имя (Идентификатор): Это то имя, которое задано в конфигураторе (например, ОблагаетсяНДС). Оно неизменно и обычно используется для программной логики.
  2. Синоним (Представление): Это понятный человеку текст, который отображается в интерфейсе (например, «Облагается НДС»).

Разберем основные методы получения этих значений:

Для получения синонима (представления) используется стандартная функция Строка(). Однако этот метод редко подходит для обмена данными, так как синоним может измениться при обновлении конфигурации или зависеть от языка интерфейса.

Для получения внутреннего имени (идентификатора) наиболее правильным и надежным способом является использование функции XMLСтрока(). Эта функция возвращает строковое имя значения перечисления так, как оно определено в метаданных.

Рассмотрим пример кода в обработчике ПКС (Правила конвертации свойства) Перед выгрузкой:


// Правильный способ получения программного имени перечисления
Значение = XMLСтрока(Источник.СпособУчетаНДС);

Анализ ошибки «Поле объекта не обнаружено»

Часто при написании кода конвертации программисты сталкиваются с ошибкой выполнения обработчика. Проанализируем ситуацию: в логе ошибки указано Поле объекта не обнаружено (СпособУчетаНДС), хотя в конфигураторе реквизит у документа существует. Выясним причину этой проблемы.

Как правило, такая ошибка возникает в двух случаях:

  1. Опечатки в коде: Внимательно проверим написание идентификатора. Например, использование СпособйУчетаНДС (с лишней буквой) гарантированно приведет к ошибке.
  2. Контекст обращения к данным: Это наиболее важный момент. Если реквизит СпособУчетаНДС находится не в шапке документа, а в его табличной части, обращение через Источник.ИмяРеквизита будет ошибочным.

Разберем работу с табличными частями подробнее. В контексте обработки свойств табличной части (ПКС внутри группы ТЧ) параметр Источник ссылается на сам объект-владелец (например, весь ДокументОбъект.АвансовыйОтчет), в то время как текущая строка данных передается в параметре ОбъектКоллекции.

Посмотрим, как должен выглядеть исправленный код, если мы конвертируем строку табличной части:


// Обращаемся к текущей строке табличной части
Если ЗначениеЗаполнено(ОбъектКоллекции.СпособУчетаНДС) Тогда
    Значение = XMLСтрока(ОбъектКоллекции.СпособУчетаНДС);
Иначе
    Значение = "";
КонецЕсли;

Использование стандартных механизмов «Конвертации данных»

Помимо написания кода в обработчиках, мы можем воспользоваться визуальными средствами настройки. Рассмотрим альтернативный способ через Таблицу значений перечисления.

Если в правилах обмена создано ПКО (Правило конвертации объектов) для самого перечисления, мы можем перейти на закладку «Конвертация значений». Здесь можно вручную сопоставить каждое значение перечисления источника с конкретной строкой, которая должна попасть в приемник. Это особенно удобно, если логика сопоставления сложная или имена в источнике и приемнике сильно различаются.

В этом случае в ПКС документа, где перечисление преобразуется в строку, достаточно указать созданное ПКО для этого перечисления. Система сама выполнит поиск по таблице соответствий и подставит нужное строковое значение.

Обработка пустых значений

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


// Проверка на пустое значение перед конвертацией
Если Источник.СпособУчетаНДС = Перечисления.СпособУчетаНДС.ПустаяСсылка() Тогда
    Значение = "НеУказано";
Иначе
    Значение = XMLСтрока(Источник.СпособУчетаНДС);
КонецЕсли;

Рекомендации по отладке правил

Для того чтобы избежать «гадания» на причинах ошибки в процессе обмена, рекомендуется следовать простым правилам:

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

← На главную