При импорте данных из внешних источников, таких как файлы Excel, программисты часто сталкиваются с необходимостью конвертации строкового представления данных во внутренние типы 1С. Одной из наиболее частых задач является поиск значения перечисления. Рассмотрим подробно, как правильно сопоставить строку из таблицы со ссылкой типа ПеречислениеСсылка, разберем возможные ошибки и наиболее эффективные методы реализации этой задачи.
Если в файле Excel хранятся внутренние идентификаторы значений перечисления (те имена, которые заданы в конфигураторе), мы можем получить ссылку максимально быстро. Для этого используется обращение к менеджеру перечисления через квадратные скобки. Рассмотрим пример кода:
ИмяЗначения = "Обычная"; // Значение, прочитанное из Excel
Попытка
СсылкаНаПеречисление = Перечисления.ВариантыВажностиЗадачи[ИмяЗначения];
Исключение
Сообщить("Значение '" + ИмяЗначения + "' не найдено в перечислении!");
КонецПопытки;
Важный нюанс: прямое обращение по имени чувствительно к регистру и точному написанию. Если в перечислении нет значения с таким именем, система вызовет исключение, поэтому использование конструкции Попытка...Исключение здесь обязательно, либо предварительно нужно проверить существование имени через Метаданные.
Зачастую в Excel записывают не технические имена (идентификаторы), а понятные пользователю синонимы (например, вместо "Обычная" написано "Обычная важность"). В этом случае прямое обращение не сработает. Нам потребуется перебор коллекции значений перечисления в метаданных. Проанализируем следующую реализацию:
ИскомыйСиноним = "Обычная важность";
СсылкаНаПеречисление = Перечисления.ВариантыВажностиЗадачи.ПустаяСсылка();
Для каждого ЭлементПеречисления Из Метаданные.Перечисления.ВариантыВажностиЗадачи.ЗначенияПеречисления Цикл
Если ЭлементПеречисления.Синоним = ИскомыйСиноним Тогда
СсылкаНаПеречисление = Перечисления.ВариантыВажностиЗадачи[ЭлементПеречисления.Имя];
Прервать;
КонецЕсли;
КонецЦикла;
Разберем по шагам, что здесь происходит: мы обращаемся к объекту Метаданные, находим нужное нам перечисление и перебираем все его значения. У каждого значения мы проверяем свойство Синоним. Как только соответствие найдено, мы используем свойство Имя, чтобы получить реальную ссылку через менеджер перечисления.
Чтобы не использовать громоздкие циклы каждый раз, мы можем воспользоваться методом Найти() коллекции значений метаданных. Это сделает код более лаконичным. Посмотрим на пример:
ИмяЗначения = "Обычная";
МетаДанныеЗначения = Метаданные.Перечисления.ВариантыВажностиЗадачи.ЗначенияПеречисления.Найти(ИмяЗначения);
Если МетаДанныеЗначения <> Неопределено Тогда
СсылкаНаПеречисление = Перечисления.ВариантыВажностиЗадачи[МетаДанныеЗначения.Имя];
Иначе
// Обработка ситуации, когда значение не найдено
КонецЕсли;
Этот способ предпочтительнее простого перебора, так как он использует встроенные механизмы платформы для поиска по имени объекта метаданных.
Если ваша конфигурация построена на базе БСП (что верно для большинства современных решений вроде 1С:ERP, УТ 11 или БП 3.0), лучше всего использовать готовые функции из общего модуля ОбщегоНазначения. Это "золотой стандарт" разработки, обеспечивающий стабильность и высокую скорость работы.
Для получения ссылки по имени используйте:
ОбщегоНазначения.ЗначениеПеречисленияПоИмени("ВариантыВажностиЗадачи", "Обычная")
Для получения имени по ссылке (обратная задача):
ОбщегоНазначения.ИмяЗначенияПеречисления(СсылкаНаПеречисление)
Преимущество: функции БСП часто используют кэширование, что значительно ускоряет работу при массовой загрузке данных (например, когда вы обрабатываете файл Excel на 10 000 строк).
Платформа позволяет получить значение перечисления по его порядковому номеру (индексу). Рассмотрим, как это выглядит в коде:
Индекс = 1; // Порядок значения в конфигураторе (начиная с 0)
СсылкаНаПеречисление = Перечисления.ВариантыВажностиЗадачи.Получить(Индекс);
Выясним причину, по которой этот метод считается нежелательным. Порядок значений в перечислении может измениться при обновлении конфигурации или если другой программист решит передвинуть значения кнопками "Вверх"/"Вниз". В этом случае ваш код начнет возвращать неверные данные, что приведет к трудноуловимым логическим ошибкам в базе данных.
Если вы загружаете из Excel большой объем данных, выполнение поиска через метаданные или БСП в каждой итерации цикла может замедлить процесс. Проанализируем ситуацию: метаданные перечисления не меняются в процессе работы сеанса. Следовательно, мы можем один раз подготовить таблицу соответствий.
Рассмотрим алгоритм оптимизации:
Соответствие.Пример реализации оптимизированного поиска:
// Подготовка кэша
КэшПеречисления = Новый Соответствие;
Для каждого ЗначениеМетаданных Из Метаданные.Перечисления.ВариантыВажностиЗадачи.ЗначенияПеречисления Цикл
КэшПеречисления.Вставить(ЗначениеМетаданных.Синоним, Перечисления.ВариантыВажностиЗадачи[ЗначениеМетаданных.Имя]);
КонецЦикла;
// В цикле чтения Excel
ТекущееЗначениеИзФайла = "Обычная";
Ссылка = КэшПеречисления.Получить(ТекущееЗначениеИзФайла);
Если Ссылка = Неопределено Тогда
// Обработка ошибки: в файле указано некорректное значение
КонецЕсли;
Такой подход позволяет сократить время обращения к метаданным и избежать лишних проверок, обеспечивая максимальную производительность вашего программного кода.