Перечисление — это объект метаданных. Значения определяются только через конфигуратор. Имя значения перечисления не доступно «через точку». Получить имя объекта ПеречислениеСсылка можно через метаданные. Во многих типовых конфигурациях можно найти подобные функции в общих модулях. Обычно такие процедуры и функции расположены в общем модуле с наименованием «ОбщегоНазначения».
Функция ПолучитьИмяЗначенияПеречисления()
Функция на вход принимает значение типа ПеречислениеСсылка, а возвращает имя значения.
Функция ПолучитьИмяЗначенияПеречисления(ПеречислениеСсылка) ОбъектМетаданных
= ПеречислениеСсылка.Метаданные();
Индекс = Перечисления[ОбъектМетаданных.Имя].Индекс(ПеречислениеСсылка);
Возврат ОбъектМетаданных.ЗначенияПеречисления[Индекс].Имя;КонецФункции
Получить синоним значения перечисления
Синоним значения перечисления получается через приведение значения типа ПеречислениеСсылка к типу Строка.
СинонимЗначения = Строка(ПеречислениеСсылка);
Работаем с перечислениями 1с 8
Иногда требуется по значению синонима найти имя перечисления или имя значения перечисления и преобразовать найденный результат к типу ПеречислениеСсылка. Для решения такой задачи программирования можно предложить варианты функций рассмотренные в данной статье. Рассматривается алгоритмический метод с использованием языка 1С и языка запросов.
Перечисление – объект конфигурации, имеющий значения данных описанное свойствами Имя и Синоним. Имя используется в алгоритмической части конфигурации, Синоним – для получения представления при выводе в элементы формы объектов или печатные формы. Другое определение перечисления – это именованные списки значений, задаваемых на этапе конфигурирования.
Как получить имя перечисления по синониму
Алгоритмически можно получить коллекцию перечислений из конфигурации и перебрав их в цикле сравнить значение реквизита синоним с параметром функции вернуть имя перечисления.
Исходный код функции ИмяПеречисленияПоСинониму (СинонимПеречисления):
// Возвращает имя перечисления по известному значению синонима // Пример пСиснонимПеречисления = «Юр физ лицо» тип строка, // возвращаемое значение имя = «ЮрФизЛицо», тип строка Функция ИмяПеречисленияПоСинониму( пСинонимПеречисления ) Экспорт КолекцияПеречислений = Метаданные.Перечисления; Для каждого пНайденноеЗначение из КолекцияПеречислений Цикл Если пНайденноеЗначение.Синоним = пСинонимПеречисления Тогда Возврат пНайденноеЗначение.Имя; КонецЕсли; КонецЦикла; Возврат неопределено; КонецФункции // Имя Перечисления По Синониму |
Функция размещена в примере конфигурации к данному разделу в общем модуле “Работа с перечислениями”.
Как получить имя значения перечисления, если известен синоним значения
Если известно перечисление, и известно, что одно из значений имеет известный нам синоним, то перебрав в цикле коллекцию значений перечисления можно получить его имя. Совокупность имени перечисления и имени значения перечисления позволяют получить ссылку на перечисление, которую уже можно применять в качестве значения реквизитов справочников, документов и регистров.
Исходный код функции ИмяЗначенияПеречисленияПоСинониму(ИмяПеречисления, СинонимЗначения):
// Функция возвращает имя реквизита данных перечисления по имени // перечисления и синониму его значения // Принимаемые значения: // пИмяПеречисления — тип строка. Имя объекта конфигурации «Перечисления» // пСинонимЗначения — тип строка. Значение свойства Синоним реквизита данных перечисления // Возвращаемое значение: // Имя реквизита данных перечисления Функция ИмяЗначенияПеречисленияПоСинониму( пИмяПеречисления, пСинонимЗначения ) Экспорт КолекцияЗначенийПеречисления = Метаданные.Перечисления[пИмяПеречисления].ЗначенияПеречисления; Для каждого пНайденноеЗначение из КолекцияЗначенийПеречисления Цикл Если пНайденноеЗначение.Синоним = пСинонимЗначения Тогда Возврат пНайденноеЗначение.Имя; КонецЕсли КонецЦикла; Возврат неопределено; КонецФункции // Имя Значения Перечисления По Синониму |
Функция размещена в примере конфигурации к данному разделу в общем модуле “Работа с перечислениями”.
Получение ссылки на значение перечисления по имени перечисления и по имени его значения
Если известно имя самого перечисления и имя его значения, то получить ссылку которая будет являться значением, например субконто, можно следующим образом:
ПеречислениеСсылка = Перечисления[пИмяПречисления][пИмяЗначения];
Исходный код функции ПолучитьСсылкуНаЗначениеПеречисления( пИмяПеречисления, пИмяЗначения )
// Возвращает ПеречисленияСсылка по «Имени» перечисления и «Имени» значения // Пример пИмяПеречисления = «ЮрФизЛицо», пИмяЗначения = «ЮрЛицо», // результат: Перечисление ссылка на ЮрФизЛицо.ЮрЛицо // пИмяПеречисления — тип строка // пИмяЗначения — тип строка Функция ПолучитьСсылкуНаЗначениеПеречисления( пИмяПеречисления, пИмяЗначения ) Экспорт Попытка Возврат Перечисления[пИмяПеречисления][пИмяЗначения]; исключение Сообщить(«Ошибка получения ссылки на значение перечисления. « + пИмяПеречисления + » :: « + пИмяЗначения); Возврат неопределено; КонецПопытки; КонецФункции // Получить Ссылку На Значение Перечисления |
Функция размещена в примере конфигурации к данному разделу в общем модуле “Работа с перечислениями”.
Использование значения перечисления в запросе
Возможность использования перечислений в запросах появилась в версии 8.1.5. В учебной версии 8.1.9.57 она описана во встроенной справке конфигуратора в разделе: 1С:Предприятие -> Встроенный язык -> Работа с запросами -> Язык запросов -> Использование предопределенных данных конфигурации.
Текст запроса может содержать значения системных перечислений, которые могут быть присвоены полям в таблицах базы данных: ВидДвиженияНакопления, ВидСчета и ВидДвиженияБухгалтерии.
Обращение в запросах к предопределенным данным конфигурации и значениям системных перечислений осуществляется с помощью литерала функционального типа:
ЗНАЧЕНИЕ(<ПредставлениеЗначения>)
Для системных перечислений представление значение имеет вид:
<ИмяСистемногоПеречисления>.<Значение>
Пример запроса может выглядеть следующим образом:
Запрос = Новый Запрос; Запрос.Текст = «ВЫБРАТЬ | ВидыНоменклатуры.Ссылка как ссылка, | ВидыНоменклатуры.Порядок |ИЗ | Перечисление.ВидыНоменклатуры КАК ВидыНоменклатуры |ГДЕ | ВидыНоменклатуры.Ссылка = Значение(Перечисление.ВидыНоменклатуры.Услуга) «; ТЗ = Новый ТаблицаЗначений; ТЗ = запрос.Выполнить().Выгрузить(); ЭлементыФормы.ТабличноеПоле1.Значение = ТЗ; ЭлементыФормы.ТабличноеПоле1.СоздатьКолонки(); |
Демонстрация работы с перечислениями в 1С
В качестве примера работы с менеджером коллекции значений перечисления можно скачать файл обновления конфигурации для платформы 1С версии 8.1 и демонстрационную обработку. Двойной щелчок мыши или нажатие клавиши обеспечивает вызов события “Выбор”, обработчик заполняет поля данных пСинонимПеречисления и пСинонимЗначение, а функционал общего модуля работа с перечислениями обеспечивает нахождение нужного значения типа ПеречислениеСсылка, который в форме имеет составной тип данных и рассчитан на работу только с версией cf из примера. При работе с другими конфигурациями следует отредактировать тип данных элемента формы пДанные.
Внешний вид экранной формы обработки по работе с синонимами перечислений для платформы 1С:
Выдержка из справочной системы 1С по назначению перечислений:
Перечисления используются в системе 1С:Предприятие для описания постоянных наборов значений, не изменяемых в процессе работы конфигурации. В отличие от справочника, значения перечислений задаются на этапе конфигурирования, и не могут быть изменены на этапе исполнения.
Типичными примерами перечислений являются виды оплаты (наличная, безналичная, бартер), статус клиента (постоянный, разовый) и т.д.
Одной из главных особенностей перечислений, отличающую их от справочников, является то, что набор значений перечисления не изменяется при работе конечного пользователя с программой. Например, алгоритм конфигурации может быть ориентирован на то, что каждый клиент имеет один из двух статусов – либо “постоянный”, либо “разовый”, в этом случае указание статуса клиента выполняется путем выбора одного из значений перечисления. Пользователь не может добавить новый статус.
В отличие от перечислений, для справочников конкретные значения обычно вводятся пользователем при работе с программой, например: наименования товаров, контрагентов и прочее.
Если Вы хотите больше узнать о программировании в 1С, тогда регистрируйтесь на курс: 1С 8.3 Старт >>>
ПОЛУЧИ́ТЬ, —лучу́, —лу́чишь; прич. страд. прош. полу́ченный, —чен, -а, -о; сов., перех. (несов. получать). 1. Взять, принять что-л. вручаемое, присылаемое, выдаваемое и т. д. Получить зарплату. Получить телеграмму. Получить на руки справку.
Все значения слова «получить»
-
– Если ему удастся убедить императрицу в необходимости вторжения, он может получить возможность распоряжаться значительными средствами.
-
Только таким образом можно получить возможность понять своё поведение и поведение других.
-
– Хотите получить новый результат – начните делать что-то новое!
- (все предложения)
- диплом
- зарплата
- деньги
- подарок
- получка
- (ещё ассоциации…)
- человек получает
- орден получил
- получить ответ
- получить возможность
- (полная таблица сочетаемости…)
- Спряжение глагола «получить»
- Разбор по составу слова «получить»
- Как правильно пишется слово «получить»
Как получить синоним реквизита? |
Я |
10.03.15 — 14:31
Есть задача, проверка заполнения реквизитов по условию. Реквизиты на техническом английском, а синонимы по русски и нужно, что бы если реквизит(например «X_GZT») не заполнен, тогда сообщить пользователю, что не заполнен реквизит «СинонимРеквизита». Гугл пока ничего подходящего не сказал, мб тут подскажут?
1 — 10.03.15 — 14:32
какая конфа? релиз?
2 — 10.03.15 — 14:33
Метаданные ?
3 — 10.03.15 — 14:33
Правильно ли я понимаю, что синоним реквизита не заполнен в дереве метаданных?
Тогда по метаданным в цикле и проверять реквизит.
Если НЕ ЗначениеЗаполнено(Реквизит.Синоним) Тогда
// Ошибочка вышла
КонецЕсли;
4 — 10.03.15 — 14:34
никак
5 — 10.03.15 — 14:35
(4) почему «Никак»?
6 — 10.03.15 — 14:36
(5) потому что штатными средствами в режиме предприятия никак
7 — 10.03.15 — 14:37
проверь и поправь в своей конфе:
МетаданныеДокумента = Источник.Метаданные();
// Проверка по реквизитам шапки
Для Каждого РеквДок из МетаданныеДокумента.Реквизиты Цикл
Сообщить(РеквДок.Синоним);
КонецЦикла;
// Проверка по табличным частям
Для каждого ТабЧасть Из МетаданныеДокумента.ТабличныеЧасти Цикл
Для каждого КолонкаТЧ Из ТабЧасть.Реквизиты Цикл
Сообщить(КолонкаТЧ.Синоним);
КонецЦикла;
КонецЦикла;
Я грубо вырезал свою обработку использования помеченных на удаление элементов справочников.
(5) и (6) Потому что ты этого не знаешь. А средства штатные. Код — выше.
8 — 10.03.15 — 14:38
(6) так в (3) и предложено нештатное
а штатно — только смотреть в конфигураторе дерево метаданных
9 — 10.03.15 — 14:39
(7) понятно
10 — 10.03.15 — 14:39
(8) Почему нештатное? Внешние компоненты, VBS, WSH — нештатное. А нативный код в 1С — штатное.
11 — 10.03.15 — 14:40
+(7) Весь код такой (может, кому пригодится)
МетаданныеДокумента = Источник.Метаданные();
// Проверка по реквизитам шапки
Для Каждого РеквДок из МетаданныеДокумента.Реквизиты Цикл
Если ВидОбъектаПоСсылке(Источник[РеквДок.Имя]) = «Справочник» Тогда
Если ЗначениеЗаполнено(Источник[РеквДок.Имя])
И Источник[РеквДок.Имя].ПометкаУдаления Тогда
ОбщегоНазначения.СообщитьОбОшибке(«Нельзя использовать помеченный на удаление элемент!
|Реквизит шапки » + РеквДок.Синоним + » — » + Источник[РеквДок.Имя]);
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Проверка по табличным частям
Для каждого ТабЧасть Из МетаданныеДокумента.ТабличныеЧасти Цикл
Для каждого СтрокаТЧ Из Источник[ТабЧасть.Имя] Цикл
Для каждого КолонкаТЧ Из ТабЧасть.Реквизиты Цикл
Если ВидОбъектаПоСсылке(СтрокаТЧ[КолонкаТЧ.Имя]) = «Справочник» Тогда
Если ЗначениеЗаполнено(СтрокаТЧ[КолонкаТЧ.Имя])
И СтрокаТЧ[КолонкаТЧ.Имя].ПометкаУдаления Тогда
ОбщегоНазначения.СообщитьОбОшибке(«Нельзя использовать помеченный на удаление элемент!
|Табличная часть » + ТабЧасть.Синоним
+ «, строка » + СтрокаТЧ.НомерСтроки
+ «, колонка » + КолонкаТЧ.Синоним
+ » — » + СтрокаТЧ[КолонкаТЧ.Имя], Отказ);
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
12 — 10.03.15 — 14:40
(10) т.е. я вношу изменения в модуль конфы, и получаю штатное решение?
13 — 10.03.15 — 14:49
(12) Так обработки же есть
14 — 10.03.15 — 14:50
(12) Внешней обработкой.
Что есть штатное и нештатное?
Что есть штатное для типовой?
Что есть нештатное для типовой?
Что находится в папках Extforms на диске ИТС?
15 — 10.03.15 — 14:51
Телепатирую: у ТС есть некий объект Деталь1, у которого есть реквизит Деталь1.X_GZT, у которого синоним, например «Ширина детали» и, если при загрузке извне она оказалась пустой, то сообщать нужно «у Детали1 не заполнена Ширина детали»
16 — 10.03.15 — 14:52
(12) Вот получить Exif-информацию из фоток (размер, выдержка, GPS-координты. модель фотоаппарата, дата и время снимка и т.д.) средствами 1С без внешних компонент — явно нештатное, ибо приходилось задействовать vbs.
А прочиттать синоним метаданых — вполне себе штатный метод, описан в синтакс-помощнике.
17 — 10.03.15 — 14:53
(15) Хороший вариант.
18 — 10.03.15 — 14:56
(1) Конфа — Управление Мед. Центром
(2) Что метаданные?
(3) Нет, синоним в дереве метаданных заполнен. Например реквизит «X_TVP» его синоним: «ТВП». Программно проверяю заполнен ли реквизит «X_TVP», если нет, то нужно вывести сообщение пользователю «Не заполнен реквизит «ТВП»», но как узнать синоним реквизита не могу нагуглить.
(7) Спасибо, сейчас попробую
19 — 10.03.15 — 14:57
>>Реквизиты на техническом английском
Я бы рекомендовал эвтаназию для автора решения.
20 — 10.03.15 — 15:00
(19) Не знаешь для чего и почему так сделано, а критикуешь — глупо
21 — 10.03.15 — 15:05
(18) Ну вот как раз это и есть синоним:
ОбщегоНазначения.СообщитьОбОшибке(«Нельзя использовать помеченный на удаление элемент!
|Реквизит шапки » + РеквДок.Синоним + » — » + Источник[РеквДок.Имя]);
РеквДок.Синоним — синоним реквизита, как его привыкли видеть пользователи на экране.
22 — 10.03.15 — 15:13
(16) я понял, спасибо!
gerthog
23 — 10.03.15 — 15:21
(21) Пробую сейчас по Вашему примеру. К метаданным можно обращаться только НаСервере, да?
Я когда-то писал для двух языков свою конфу, нормально работает НСтр()
Но для данных я использовал несколько реквизитов и google переводчик
Добавлено через 3 минуты
Конфа делалась для совместного использования Серийско-Российской компанией.
Так вот в Сирии арабский язык и они совсем не знают английский, было принято решение вести «основную» информацию в двух языках.
Если пользователь создает справочник на арабском (там кстати написание справо на лево) гугл переводит в отдельный реквизит на русский, и НАШИ уже видят только русский переведенный текст.
Аналогично при вводе и на русском.
А вот для интерфейсов мне давали переводчика)))
Добавлено через 4 минуты
Сообщение от turboq
Получить сразу 2 синонима значения
polax, 2 СИНОНИМА одного значения!
Отлично отработает через НСтр()