При настройке обмена данными между конфигурациями 1С часто возникает задача передачи значения перечисления в текстовый реквизит приемника. Несмотря на кажущуюся простоту, этот процесс имеет свои нюансы, связанные с выбором метода получения строки (имя или синоним) и контекстом выполнения кода в обработчиках. Рассмотрим подробно, как правильно реализовать эту задачу и избежать типичных ошибок программиста.
Прежде всего, проанализируем, какой именно результат мы хотим получить в строке-приемнике. В платформе 1С значение перечисления имеет два строковых выражения:
ОблагаетсяНДС). Оно неизменно и обычно используется для программной логики.Разберем основные методы получения этих значений:
Для получения синонима (представления) используется стандартная функция Строка(). Однако этот метод редко подходит для обмена данными, так как синоним может измениться при обновлении конфигурации или зависеть от языка интерфейса.
Для получения внутреннего имени (идентификатора) наиболее правильным и надежным способом является использование функции XMLСтрока(). Эта функция возвращает строковое имя значения перечисления так, как оно определено в метаданных.
Рассмотрим пример кода в обработчике ПКС (Правила конвертации свойства) Перед выгрузкой:
// Правильный способ получения программного имени перечисления
Значение = XMLСтрока(Источник.СпособУчетаНДС);
Часто при написании кода конвертации программисты сталкиваются с ошибкой выполнения обработчика. Проанализируем ситуацию: в логе ошибки указано Поле объекта не обнаружено (СпособУчетаНДС), хотя в конфигураторе реквизит у документа существует. Выясним причину этой проблемы.
Как правило, такая ошибка возникает в двух случаях:
СпособйУчетаНДС (с лишней буквой) гарантированно приведет к ошибке.СпособУчетаНДС находится не в шапке документа, а в его табличной части, обращение через Источник.ИмяРеквизита будет ошибочным.Разберем работу с табличными частями подробнее. В контексте обработки свойств табличной части (ПКС внутри группы ТЧ) параметр Источник ссылается на сам объект-владелец (например, весь ДокументОбъект.АвансовыйОтчет), в то время как текущая строка данных передается в параметре ОбъектКоллекции.
Посмотрим, как должен выглядеть исправленный код, если мы конвертируем строку табличной части:
// Обращаемся к текущей строке табличной части
Если ЗначениеЗаполнено(ОбъектКоллекции.СпособУчетаНДС) Тогда
Значение = XMLСтрока(ОбъектКоллекции.СпособУчетаНДС);
Иначе
Значение = "";
КонецЕсли;
Помимо написания кода в обработчиках, мы можем воспользоваться визуальными средствами настройки. Рассмотрим альтернативный способ через Таблицу значений перечисления.
Если в правилах обмена создано ПКО (Правило конвертации объектов) для самого перечисления, мы можем перейти на закладку «Конвертация значений». Здесь можно вручную сопоставить каждое значение перечисления источника с конкретной строкой, которая должна попасть в приемник. Это особенно удобно, если логика сопоставления сложная или имена в источнике и приемнике сильно различаются.
В этом случае в ПКС документа, где перечисление преобразуется в строку, достаточно указать созданное ПКО для этого перечисления. Система сама выполнит поиск по таблице соответствий и подставит нужное строковое значение.
Важным этапом является проверка на заполненность. Попытка вызвать XMLСтрока от пустого значения перечисления не вызовет падения системы (вернется пустая строка), но если вы пытаетесь обращаться к свойствам значения, всегда проверяйте его наличие. Проанализируем пример безопасного кода:
// Проверка на пустое значение перед конвертацией
Если Источник.СпособУчетаНДС = Перечисления.СпособУчетаНДС.ПустаяСсылка() Тогда
Значение = "НеУказано";
Иначе
Значение = XMLСтрока(Источник.СпособУчетаНДС);
КонецЕсли;
Для того чтобы избежать «гадания» на причинах ошибки в процессе обмена, рекомендуется следовать простым правилам:
XMLСтрока() для получения стабильного идентификатора.Источник (весь объект) и ОбъектКоллекции (строка таблицы).Таким образом, правильная конвертация перечисления в строку требует не только знания функций преобразования типов, но и четкого понимания структуры объектов метаданных в конфигурациях 1С.