Как найти перечисление по наименованию 1с 8. Перечисления

Как мы знаем, клиенты могут быть не только частными лицами, но и компаниями. Список всех клиентов содержится в специальном справочнике «Контрагенты». Как же разделить их на две группы?

Чтобы выполнить это действие, в справочнике Контрагентов должен быть реквизит, в котором будет содержаться два разных варианта. И здесь возникает еще один вопрос: как сделать так, чтобы значения было только два?

Справочник, как перечислние

Например, мы добавим справочник для хранения наших двух значений. Назовем его для удобства «ВидыКлиентов». Внесем соответственно эти два варианта в справочник.
Теперь кажется, что дело выполнено, но программисту пользоваться этим неудобно. Захочется, например, определять значение в тексте программы и как это сделать? Проверять все эти данные по коду или наименованию нельзя, поскольку пользователь легко мог изменить эти данные. Возможно, в таком случае надо воспользоваться константой?

Предопределенные значения справочника

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

Чтобы все это выполнить, вам нужно зайти в конфигуратор, найти в представленном списке нужный справочник и правой кнопкой мыши вызвать контекстное меню, в котором выбрать пункт «Открыть предопределенные значения».

Уже в этом окне можно легко добавить два новых предопределенных значения 1С. Нужно учитывать, что при добавлении мы должны указать два названия:

1. Которое будет отображаться в коде.
2. Которое будет видеть пользователь.

После этого вы можете использовать их в программе. Уже сейчас, если пользователь выбрал для себя юридическое лицо, то мы предложим ему заполнить обязательное поле КПП, а если выберут частого покупателя - то день рождения.

И здесь возникает еще одна проблема: что будет, если пользователь зайдет в наш справочник, введет туда какой-то третий вариант и выберет его?

Объект Перечисление

Перечисление - это объект который позволит вам задать список предопределенных значений, которые пользователь сможет использовать, выбирая то или иное значение:

1. Его не сможет изменить пользователь.
2. Можно использовать в тексте программы.

Чтобы создать перечисления, в 1С нужно сначала добавить его в «Конфигурации» на ветке «Перечисление». После этого нужно открыть перечисления и добавить значение. Уже сейчас мы сможем на форме в качестве типа значения указать наше перечисление и теперь пользователь сможет выбрать только то, что мы указали.

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

Теперь с помощью правой кнопки мыши создадим наше первое перечисление.

Назовем его «Пол», и предложим два варианта «мужской» и «женский». Эта информация заполняется на вкладке «Данные».

Чтобы оценить возможности созданного нами перечисления 1с 8.2, давайте добавим его в качестве реквизита в какой-нибудь наш документ. Данная процедура происходит таким образом. Открываем нужный документ в конфигураторе, добавляем новые реквизит, называем его и в поле «Тип» выбираем ссылку на это
перечисление.

В документе добавляется еще один реквизит с выбранным нами перечислением.

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

Итак, значение перечислений в 1с 8.2 довольно большое и очевидное. Перед тем как создавать справочник или перечисления, программист должен ответить на два вопроса: 1) нужно ли пользователям самим создавать новые элементы?; 2) сколько таких элементов может быть в конкретном случае: много или
мало? Если вариантов ответов мало, и пользователям ничего не нужно больше создавать, используйте перечисления 1с. В противном случае подойдут справочники.

Справочники в 1С:Предприятии 8 используются для организации хранения информации об однотипных объектах. Например, справочник Клиенты будет хранить данные о клиентах, справочник Сотрудники - о сотрудниках организации, Контрагенты - о контрагентах, Номенклатура - о товаро-материальных ценностях, Подразделения - о подразделениях организации. Справочник можно сравнить с обычной бумажной картотекой. Каждая конфигурация обычно содержит множество справочников .

Обратите внимание на то, что в режиме конфигурирования мы создаем структуру справочника , определяем формы, которые позволяют работать с ним, устанавливаем его связи с другими объектами конфигурации. А в режиме 1С:Предприятие, то есть - в пользовательском режиме - происходит наполнение справочника информацией. Эта особенность характерна и для других подобных объектов. Их структуру и особенности задает программист, а ввод в систему новых элементов осуществляет пользователь . Стоит отметить, что в случае со справочниками мы все же можем создавать его элементы в режиме конфигурирования. Это - так называемые предопределенные элементы, на которые обычно опираются какие-то алгоритмы разрабатываемой конфигурации. Пользователь не может удалить такие элементы - иначе нарушилась бы логика работы системы.

Давайте создадим новый справочник и рассмотрим особенности работы с ним. Пусть это будет справочник ФизическиеЛица . Как следует из названия, он предназначен для хранения сведений о физических лицах. Мы планируем хранить в этом справочнике персональные сведения о физических лицах.

Для того чтобы создать справочник , перейдем в ветвь Справочники дерева конфигурации и создадим в ней новый элемент ( рис. 3.1).

Окно редактирования объекта конфигурации имеет множество закладок, которые позволяют последовательно настраивать свойства объекта, редактировать его структуру. Обратите внимание на кнопки Назад и Далее , которые расположены в нижней части окна. Они предназначены для прохождения по вкладкам и настройки его свойств в правильной последовательности. Вы можете либо пользоваться этими кнопками, либо выбирать закладки вручную. Рассмотрим вкладки окна редактирования объекта. Сейчас мы не будем стремиться рассмотреть их все - позже, работая над конфигурацией, мы сможем увидеть особенности их использования.

Основные . Здесь расположены уже знакомые вам свойства Имя , Синоним , Комментарий . Они имеют тот же смысл, что и у других объектов.

Данные . Одна из важнейших закладок настройки справочника ( рис. 3.2)


Рис. 3.2.

Для начала на закладке Данные нужно настроить длину кода и наименования элемента справочника .

Длина кода . 9-значный код способен вместить такое количество элементов, которого гарантированно хватит не только для нашей учебной конфигурации, да и для большинства реально используемых конфигураций. На практике длина кода бывает как меньше, так и больше 9. Код используется для идентификации элементов справочника и код каждого элемента уникален. Система сама следит за уникальностью кодов.

Длина наименования . Это свойство справочника обычно хранит краткое наименование элемента. В нашем случае в справочнике планируется хранить сведения о физических лицах, вполне логично в качестве наименования использовать какую-то комбинацию фамилии, имени и отчества физического лица. Будем использовать сокращенную форму, например, "Иванов И.И.", однако, фамилии могут быть довольно длинными, поэтому увеличим длину наименования до 30 символов.

Обратите внимание на то, что в реквизиты любого справочника входят, как минимум , код и наименование. То есть, если мы на данном этапе работы запустим систему в режиме 1С:Предприятие и попытаемся поработать со справочником , то набор данных для каждого из его элементов будет ограничен кодом и наименованием. На практике могут применяться подобные справочники , например, что-то вроде справочника Должности . Поля Наименование вполне хватает для того, чтобы сохранить название должности, а код используется в служебных целях.

Продолжаем настройку закладки Данные . Здесь можно найти два очень важных поля: Реквизиты и Табличные части .

Реквизиты - в этом поле можно описать дополнительные характеристики элемента справочника . Для того, чтобы добавить в справочник новый реквизит , щелкните по кнопке Добавить в поле Реквизиты или воспользуйтесь соответствующей командой контекстного меню . Добавление нового реквизита сродни добавлению нового объекта - система создает его, присваивает имя по умолчанию и выводит окно его свойств. На рис. 3.3 вы можете видеть реквизит с уже настроенными свойствами.

Перед нами реквизит Фамилия . Очевидно, что такой реквизит должен хранить фамилию физического лица в виде строки, длину строки можно ограничить 30-ю символами.

Добавим в справочник следующие реквизиты (табл. 3.1):

Таблица 3.1. Реквизиты справочника ФизическиеЛица
Имя реквизита Тип Параметры типа
Фамилия Строка Длина: 30
Имя Строка Длина: 30
Отчество Строка Длина: 30
ДатаРождения Дата Состав даты: Дата
Пол ПеречислениеСсылка.Пол -
Район СправочникСсылка.Районы -

В конце таблицы есть пара строк, которые могут вызвать у вас затруднения. Типов данных " Перечисление . Ссылка .Пол" и "Справочник. Ссылка .Районы" в системе нет. Их нужно создать самостоятельно, создав соответствующие объекты. Прежде чем создавать эти объекты, давайте поговорим о данных, которые они будут хранить.

Для указания пола сотрудника мы не случайно выбрали объект Перечисление . Дело в том, что при выборе пола мы ограничены двумя вариантами - либо мужской, либо женский. Почему бы не предоставить пользователю возможность вводить информацию о поле в виде строки, не используя перечисление ? Предположим, мы дадим пользователю текстовое поле , в которое предложим ввести пол. Разные пользователи (да и один и тот же пользователь в разное время) введут в это поле разные значения. Это могут быть "М" и "Ж" или "муж." и "жен." или "мужской" и "женский". Можно подобрать и другие варианты. Как видите, в итоге получится, что если мы захотим, например, получить сведения о количестве физических лиц мужского пола, зарегистрированных в нашей базе, нам придется "пробираться" сквозь разнообразные наименования, введенные пользователями при заполнении базы. Такая ситуация весьма нежелательна и неудобна. Поэтому везде, где только можно, следует применять средства, стандартизирующие ввод данных. В случае с закрытым (или редко пополняемым, причем, пополняемым администратором в конфигураторе) списком вариантов следует пользоваться перечислениями .

Реквизит Район мы будем использовать для указания района города, в котором проживает физическое лицо. Этот реквизит администрация автоматизируемого салона красоты будет использовать для планирования выездной работы мастеров. Для хранения этой информации мы применим справочник . Почему бы нам не использовать перечисление ? Дело в том, что набор районов города обычно далек от закрытого. Поэтому логично предоставить пользователям самостоятельно формировать список районов и самостоятельно контролировать правильность его заполнения. Почему бы, в таком случае, не сделать реквизит Район в виде обычной текстовой строки? Дело, снова, в том, что пользователи могут назвать один и тот же район по-разному, в итоге, возникнут сложности с автоматической обработкой данных о районах. То есть, например, если нам нужно будет выполнить задачу "подобрать мастеров, которые могут обслужить клиента, проживающего в районе Х", при использовании справочника Районы мы указываем системе конкретный элемент справочника , соответствующего району проживания клиента, а система подбирает по этому району мастеров. Если же сделать ввод данных о районах произвольным, неразбериха в базе гарантирована.

В следующих лекциях мы будем использовать этот справочник для хранения сведений не только о физических лицах-клиентах, но и о мастерах, доработав его.

Создадим два новых объекта - перечисление Пол и справочник Районы .

На рис. 3.4 вы можете видеть окно настройки свойств перечисления Пол . Мы находимся на его вкладке Данные . Здесь мы можем добавлять значения перечисления .

Добавим два значения для перечисления : "Мужской" и "Женский". Окно свойств значения перечисления поддерживает лишь ввод имени, синонима и комментария, других свойств у значения перечисления нет. Перечисление может иметь формы, которые используются для вывода информации, макеты, которые применяются для формирования печатных форм.

В запросе значение перечисления задается через функцию Значение().

Обратите внимание , что в запросе наименование объекта метаданных используется в единственном числе: «Перечисление«

Например:

ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ПолФизическихЛиц.Мужской) КАК Поле

Пустое (не выбранное) значение:

ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ПолФизическихЛиц.ПустаяСсылка) КАК Поле

Системное перечисление получается аналогично, но без указания «Перечисление»:

ВЫБРАТЬ ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК Поле

Быстрый переход

А не в запросе?

В коде модулей получить значение можно двумя способами:

Знач = Перечисления.ПолФизическихЛиц.Мужской; //или Знач = ПредопределенноеЗначение("Перечисление.ПолФизическихЛиц.Мужской");

Второй более универсальный, т.к. выполняется и &НаКлиенте . Первоначальный вызов значение выполняется медленнее, далее — кэшируется системой.

В 8.1 доступен только первый вариант.

Поведение Максимум() в запросе с перечислением

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

  • не по порядку
  • не по наименованию
  • не по длине имени
  • скорее всего по внутреннему уид значения, которое нам недоступно простыми средствами, тем более в запросе

Задача

Есть перечисление со значениями

Необходимо в запросе получать максимальное или минимальное значение согласно его порядка

Решение

В данном случае решение усложнено, отсутствием для вас реальных данных, ведь не надо было делать вложенные соединения — порядок можно получить из значения непосредственно

ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ВидыСтраховыхПродуктов.Каско) КАК Поле ПОМЕСТИТЬ Перечисления ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ВидыСтраховыхПродуктов.ОСАГО) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ВидыСтраховыхПродуктов.ВЗР) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ВидыСтраховыхПродуктов.ГО) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ ЗНАЧЕНИЕ(Перечисление.ВидыСтраховыхПродуктов.ОПО) ; ВЫБРАТЬ ОценкаМин.Ссылка как МинПоПорядку, Влож.МинСтандарт, ОценкаМакс.Ссылка как МаксПоПорядку, Влож.МаксСтандарт ИЗ (ВЫБРАТЬ //Определяем максимум для значений выборки МИНИМУМ(перечисления.Порядок) КАК Мин, МАКСИМУМ(перечисления.Порядок) КАК Макс, МИНИМУМ(перечисления.Поле) КАК МинСтандарт, МАКСИМУМ(перечисления.Поле) КАК МаксСтандарт ИЗ (ВЫБРАТЬ //определяем порядок для каждого значения Перечисления.Поле КАК Поле, ВидыСтраховыхПродуктов.Порядок КАК Порядок ИЗ Перечисления КАК Перечисления ЛЕВОЕ СОЕДИНЕНИЕ Перечисление.ВидыСтраховыхПродуктов КАК ВидыСтраховыхПродуктов ПО Перечисления.Поле = ВидыСтраховыхПродуктов.Ссылка) КАК перечисления) КАК Влож //По определенным максимумам определяем нужное значение ЛЕВОЕ СОЕДИНЕНИЕ Перечисление.ВидыСтраховыхПродуктов КАК ОценкаМакс ПО Влож.Макс = ОценкаМакс.Порядок ЛЕВОЕ СОЕДИНЕНИЕ Перечисление.ВидыСтраховыхПродуктов КАК ОценкаМин ПО Влож.Мин = ОценкаМин.Порядок

Иногда требуется по значению синонима найти имя перечисления или имя значения перечисления и преобразовать найденный результат к типу ПеречислениеСсылка. Для решения такой задачи программирования можно предложить варианты функций рассмотренные в данной статье. Рассматривается алгоритмический метод с использованием языка 1С и языка запросов.

Перечисление – объект конфигурации, имеющий значения данных описанное свойствами Имя и Синоним. Имя используется в алгоритмической части конфигурации, Синоним – для получения представления при выводе в элементы формы объектов или печатные формы. Другое определение перечисления – это именованные списки значений, задаваемых на этапе конфигурирования.

Как получить имя перечисления по синониму
Алгоритмически можно получить коллекцию перечислений из конфигурации и перебрав их в цикле сравнить значение реквизита синоним с параметром функции вернуть имя перечисления.
Исходный код функции ИмяПеречисленияПоСинониму (СинонимПеречисления):

// Возвращает имя перечисления по известному значению синонима // Пример пСиснонимПеречисления = "Юр физ лицо" тип строка, // возвращаемое значение имя = "ЮрФизЛицо", тип строка Функция ИмяПеречисленияПоСинониму( пСинонимПеречисления ) Экспорт КолекцияПеречислений = Метаданные. Перечисления; Для каждого пНайденноеЗначение из КолекцияПеречислений Цикл Если пНайденноеЗначение. Синоним = пСинонимПеречисления Тогда Возврат пНайденноеЗначение. Имя; КонецЕсли; КонецЦикла; Возврат неопределено; КонецФункции // Имя Перечисления По Синониму

Как получить имя значения перечисления, если известен синоним значения
Если известно перечисление, и известно, что одно из значений имеет известный нам синоним, то перебрав в цикле коллекцию значений перечисления можно получить его имя. Совокупность имени перечисления и имени значения перечисления позволяют получить ссылку на перечисление, которую уже можно применять в качестве значения реквизитов справочников, документов и регистров.
Исходный код функции ИмяЗначенияПеречисленияПоСинониму(ИмяПеречисления, СинонимЗначения):

// Функция возвращает имя реквизита данных перечисления по имени // перечисления и синониму его значения // Принимаемые значения: // пИмяПеречисления - тип строка. Имя объекта конфигурации "Перечисления" // пСинонимЗначения - тип строка. Значение свойства Синоним реквизита данных перечисления // Возвращаемое значение: // Имя реквизита данных перечисления Функция ИмяЗначенияПеречисленияПоСинониму( пИмяПеречисления, пСинонимЗначения ) Экспорт КолекцияЗначенийПеречисления = Метаданные. Перечисления[ пИмяПеречисления] . ЗначенияПеречисления; Для каждого пНайденноеЗначение из КолекцияЗначенийПеречисления Цикл Если пНайденноеЗначение. Синоним = пСинонимЗначения Тогда Возврат пНайденноеЗначение. Имя; КонецЕсли КонецЦикла; Возврат неопределено; КонецФункции // Имя Значения Перечисления По Синониму

Получение ссылки на значение перечисления по имени перечисления и по имени его значения
Если известно имя самого перечисления и имя его значения, то получить ссылку которая будет являться значением, например субконто, можно следующим образом:
ПеречислениеСсылка = Перечисления[пИмяПречисления][пИмяЗначения];
Исходный код функции ПолучитьСсылкуНаЗначениеПеречисления(пИмяПеречисления, пИмяЗначения)

// Возвращает ПеречисленияСсылка по "Имени" перечисления и "Имени" значения // Пример пИмяПеречисления = "ЮрФизЛицо", пИмяЗначения = "ЮрЛицо", // результат: Перечисление ссылка на ЮрФизЛицо.ЮрЛицо // пИмяПеречисления - тип строка // пИмяЗначения - тип строка Функция ПолучитьСсылкуНаЗначениеПеречисления( пИмяПеречисления, пИмяЗначения ) Экспорт Попытка Возврат Перечисления[ пИмяПеречисления] [ пИмяЗначения] ; исключение Сообщить("Ошибка получения ссылки на значение перечисления. " + пИмяПеречисления + " :: " + пИмяЗначения) ; Возврат неопределено; КонецПопытки; КонецФункции // Получить Ссылку На Значение Перечисления

Использование значения перечисления в запросе
Возможность использования перечислений в запросах появилась в версии 8.1.5. В учебной версии 8.1.9.57 она описана во встроенной справке конфигуратора в разделе: 1С:Предприятие -> Встроенный язык -> Работа с запросами -> Язык запросов -> Использование предопределенных данных конфигурации.
Текст запроса может содержать значения системных перечислений, которые могут быть присвоены полям в таблицах базы данных: ВидДвиженияНакопления, ВидСчета и ВидДвиженияБухгалтерии.
Обращение в запросах к предопределенным данным конфигурации и значениям системных перечислений осуществляется с помощью литерала функционального типа:
ЗНАЧЕНИЕ(<ПредставлениеЗначения>)
Для системных перечислений представление значение имеет вид:
<ИмяСистемногоПеречисления>.<Значение>
Пример запроса может выглядеть следующим образом:

Запрос = Новый Запрос; Запрос. Текст = "ВЫБРАТЬ | ВидыНоменклатуры.Ссылка как ссылка, | ВидыНоменклатуры.Порядок |ИЗ | Перечисление.ВидыНоменклатуры КАК ВидыНоменклатуры |ГДЕ | ВидыНоменклатуры.Ссылка = Значение(Перечисление.ВидыНоменклатуры.Услуга) " ; ТЗ = Новый ТаблицаЗначений; ТЗ = запрос. Выполнить( ) . Выгрузить() ; ЭлементыФормы. ТабличноеПоле1 . Значение = ТЗ; ЭлементыФормы. ТабличноеПоле1 . СоздатьКолонки() ;

Выдержка из справочной системы 1С по назначению перечислений:
Перечисления используются в системе 1С:Предприятие для описания постоянных наборов значений, не изменяемых в процессе работы конфигурации. В отличие от справочника, значения перечислений задаются на этапе конфигурирования, и не могут быть изменены на этапе исполнения.
Типичными примерами перечислений являются виды оплаты (наличная, безналичная, бартер), статус клиента (постоянный, разовый) и т.д.
Одной из главных особенностей перечислений, отличающую их от справочников, является то, что набор значений перечисления не изменяется при работе конечного пользователя с программой. Например, алгоритм конфигурации может быть ориентирован на то, что каждый клиент имеет один из двух статусов – либо “постоянный”, либо “разовый”, в этом случае указание статуса клиента выполняется путем выбора одного из значений перечисления. Пользователь не может добавить новый статус.
В отличие от перечислений, для справочников конкретные значения обычно вводятся пользователем при работе с программой, например: наименования товаров, контрагентов и прочее.