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

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

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

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

Выясняем причину ошибки: почему не работает поиск по наименованию?

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


СпрПеречисления = СоздатьОбъект("Справочник.Перечисления");
Если (СпрВидОплаты.НайтиПоНаименованию("Pўrskait®jums", 0, 1) = 1) Тогда
    ВидОплаты = СпрВидОплаты.ТекущийЭлемент();
КонецЕсли;

В данном фрагменте кода кроется сразу несколько критических ошибок:

  1. Несуществующий объект: Попытка создать объект типа "Справочник.Перечисления" завершится ошибкой выполнения, так как в системе нет такого справочника (если только разработчик не создал его вручную, что лишает смысла использование встроенного механизма перечислений).
  2. Разная природа объектов: Для работы с перечислениями не нужно создавать объект через функцию СоздатьОбъект(). Перечисления доступны в глобальном контексте напрямую через системный объект Перечисление.
  3. Отсутствие стандартных методов поиска: У перечислений в 1С 7.7 отсутствуют методы поиска НайтиПоНаименованию() или НайтиПоКоду(), которые привычны для работы со справочниками.

Давайте разберем по шагам правильные и эффективные способы решения этой задачи.

Способ 1. Прямое обращение по идентификатору (статический выбор)

Если вам заранее известно, какое именно значение перечисления необходимо установить в реквизит документа или справочника, лучшим решением будет обращение к нему «в лоб» через точку. Это самый быстрый и производительный метод.

Синтаксис выглядит следующим образом:


ВидОплаты = Перечисление.ВидыОплаты.Перечисление;
ДокРеализации.ВидОплаты = ВидОплаты;

В данном примере:

Важный совет: Чтобы узнать точные идентификаторы перечисления и его значений, откройте базу в режиме Конфигуратор, найдите в дереве метаданных ветку «Перечисления», раскройте нужное перечисление и посмотрите список его значений на вкладке «Данные».

Способ 2. Получение значения по строковому идентификатору

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

Разберем пример кода:


// Предположим, имя значения мы получили из внешнего источника
ИмяИдентификатора = "Перечисление"; 

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

Если ПустоеЗначение(ВидОплаты) = 0 Тогда
    ДокРеализации.ВидОплаты = ВидОплаты;
Иначе
    Сообщить("Внимание! Идентификатор '" + ИмяИдентификатора + "' не найден в перечислении ВидыОплаты!");
КонецЕсли;

Этот метод чрезвычайно полезен при построении универсальных механизмов обмена данными.

Способ 3. Поиск значения по его представлению (синониму)

Иногда внешние файлы или пользователи оперируют не техническими идентификаторами (которые пишутся латиницей или без пробелов), а пользовательскими представлениями (синонимами) — например, "Безналичный расчет" или латышским "Pārskaitījums" (которое из-за проблем с кодировкой может превратиться в "Pўrskait®jums").

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


ИскомыйСиноним = "Pўrskait®jums"; // Строка, которую мы ищем
НайденноеЗначение = ПолучитьПустоеЗначение(); // Инициализируем переменную

// Определяем общее количество значений в перечислении
ВсегоЗначений = Перечисление.ВидыОплаты.КоличествоЗначений();

// Обходим все значения по их порядковому номеру
Для Номер = 1 По ВсегоЗначений Цикл
    ТекущееЗначение = Перечисление.ВидыОплаты.ЗначениеПоНомеру(Номер);
    
    // Получаем строковое представление (синоним) текущего значения
    Представление = СокрЛП(Строка(ТекущееЗначение));
    
    Если Представление = ИскомыйСиноним Тогда
        НайденноеЗначение = ТекущееЗначение;
        Прервать; // Выходим из цикла, так как значение найдено
    КонецЕсли;
КонецЦикла;

// Проверяем результат поиска
Если ПустоеЗначение(НайденноеЗначение) = 0 Тогда
    ДокРеализации.ВидОплаты = НайденноеЗначение;
    Сообщить("Значение успешно найдено и установлено!");
Else
    Сообщить("Ошибка: Не удалось найти значение перечисления с представлением: " + ИскомыйСиноним);
КонецЕсли;

Этот способ более ресурсоемок, так как требует перебора значений, однако он незаменим, когда сопоставление данных происходит на уровне интерфейсных наименований.

Резюме

Для успешной работы с перечислениями в 1С:Предприятии 7.7 всегда помните следующие правила:

← На главную