При разработке и автоматизации задач в платформе 1С:Предприятие 7.7 начинающие программисты часто сталкиваются с проблемой путаницы между объектами метаданных. Наиболее распространенная ошибка — попытка работать с перечислениями так же, как со справочниками. Справочники представляют собой динамически расширяемые списки данных, которые пользователи могут изменять в процессе работы. Перечисления же задаются жестко на этапе конфигурирования и не могут быть изменены в режиме «1С:Предприятие».
В этой статье мы подробно разберем, почему стандартные методы поиска справочников не применимы к перечислениям, и рассмотрим все возможные способы программного выбора и установки значений перечислений в 1С 7.7.
Проанализируем код, который изначально пытался использовать автор темы:
СпрПеречисления = СоздатьОбъект("Справочник.Перечисления");
Если (СпрВидОплаты.НайтиПоНаименованию("Pўrskait®jums", 0, 1) = 1) Тогда
ВидОплаты = СпрВидОплаты.ТекущийЭлемент();
КонецЕсли;
В данном фрагменте кода кроется сразу несколько критических ошибок:
"Справочник.Перечисления" завершится ошибкой выполнения, так как в системе нет такого справочника (если только разработчик не создал его вручную, что лишает смысла использование встроенного механизма перечислений).СоздатьОбъект(). Перечисления доступны в глобальном контексте напрямую через системный объект Перечисление.НайтиПоНаименованию() или НайтиПоКоду(), которые привычны для работы со справочниками.Давайте разберем по шагам правильные и эффективные способы решения этой задачи.
Если вам заранее известно, какое именно значение перечисления необходимо установить в реквизит документа или справочника, лучшим решением будет обращение к нему «в лоб» через точку. Это самый быстрый и производительный метод.
Синтаксис выглядит следующим образом:
ВидОплаты = Перечисление.ВидыОплаты.Перечисление;
ДокРеализации.ВидОплаты = ВидОплаты;
В данном примере:
Перечисление — это системное ключевое слово платформы 1С 7.7 для доступа к коллекции перечислений.ВидыОплаты — это идентификатор конкретного перечисления, заданный в конфигураторе.Перечисление (на конце строки) — это конкретное значение (идентификатор значения) данного перечисления. В реальных базах это может быть, например, Наличные, Безналичные, Карта и т.д. В контексте латвийской локализации, обсуждаемой на форуме, значение "Pārskaitījums" (безналичный расчет) было записано разработчиком конфигурации как идентификатор Перечисление.Важный совет: Чтобы узнать точные идентификаторы перечисления и его значений, откройте базу в режиме Конфигуратор, найдите в дереве метаданных ветку «Перечисления», раскройте нужное перечисление и посмотрите список его значений на вкладке «Данные».
Рассмотрим ситуацию, когда имя значения перечисления приходит к нам в виде текстовой строки (например, при импорте данных из файла Excel, XML или внешней базы данных). В этом случае мы не можем написать имя через точку напрямую в коде. Нам на помощь приходит метод ЗначениеПоИдентификатору().
Разберем пример кода:
// Предположим, имя значения мы получили из внешнего источника
ИмяИдентификатора = "Перечисление";
// Получаем значение перечисления динамически
ВидОплаты = Перечисление.ВидыОплаты.ЗначениеПоИдентификатору(ИмяИдентификатора);
Если ПустоеЗначение(ВидОплаты) = 0 Тогда
ДокРеализации.ВидОплаты = ВидОплаты;
Иначе
Сообщить("Внимание! Идентификатор '" + ИмяИдентификатора + "' не найден в перечислении ВидыОплаты!");
КонецЕсли;
Этот метод чрезвычайно полезен при построении универсальных механизмов обмена данными.
Иногда внешние файлы или пользователи оперируют не техническими идентификаторами (которые пишутся латиницей или без пробелов), а пользовательскими представлениями (синонимами) — например, "Безналичный расчет" или латышским "Pārskaitījums" (которое из-за проблем с кодировкой может превратиться в "Pўrskait®jums").
Поскольку прямого поиска по синониму в перечислениях 1С 7.7 нет, мы можем реализовать его самостоятельно, выполнив обход всех доступных значений перечисления в цикле:
ИскомыйСиноним = "Pўrskait®jums"; // Строка, которую мы ищем
НайденноеЗначение = ПолучитьПустоеЗначение(); // Инициализируем переменную
// Определяем общее количество значений в перечислении
ВсегоЗначений = Перечисление.ВидыОплаты.КоличествоЗначений();
// Обходим все значения по их порядковому номеру
Для Номер = 1 По ВсегоЗначений Цикл
ТекущееЗначение = Перечисление.ВидыОплаты.ЗначениеПоНомеру(Номер);
// Получаем строковое представление (синоним) текущего значения
Представление = СокрЛП(Строка(ТекущееЗначение));
Если Представление = ИскомыйСиноним Тогда
НайденноеЗначение = ТекущееЗначение;
Прервать; // Выходим из цикла, так как значение найдено
КонецЕсли;
КонецЦикла;
// Проверяем результат поиска
Если ПустоеЗначение(НайденноеЗначение) = 0 Тогда
ДокРеализации.ВидОплаты = НайденноеЗначение;
Сообщить("Значение успешно найдено и установлено!");
Else
Сообщить("Ошибка: Не удалось найти значение перечисления с представлением: " + ИскомыйСиноним);
КонецЕсли;
Этот способ более ресурсоемок, так как требует перебора значений, однако он незаменим, когда сопоставление данных происходит на уровне интерфейсных наименований.
Для успешной работы с перечислениями в 1С:Предприятии 7.7 всегда помните следующие правила:
НайтиПоНаименованию).Перечисление.ИмяПеречисления.ИмяЗначения.ЗначениеПоИдентификатору().ЗначениеПоНомеру() и функции Строка().