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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Задача

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

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

Решение

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

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

Перечисления в системе 1С:Предприятие

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

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

Рассмотрим в качестве примера такое понятие, как «статус покупателя». В простейшем случае покупатели бывают розничные и оптовые. Со статусом покупателя обычно связывают уровень предоставляемых скидок с продажной цены товаров.

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

Если статус покупателя вводится в процессе настройки конфигурации задачи как перечисление, то специалист, выполняющий конфигурирование системы 1С:Предприятие, может заранее ввести варианты расчета продажных цен в зависимости от указанного статуса.

По своим свойствам перечисление похоже на справочник, однако имеет ряд существенных отличий.

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

Перечисление не имеет вложенности -- все его значения находятся на одном уровне.

Основное отличие состоит в том, что список значений перечисления известен и доступен в Конфигураторе -- сама конфигурация использует конкретные значения перечисления.

С функциональной точки зрения, перечисление проще в настройке и в использовании.

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

Управление списком перечислений

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

Редактирование перечисления

Редактирование перечисления заключается в создании списка значений перечислений. Для редактирования перечисления используется окно редактирования «Перечисление».

Назначение управляющих элементов диалога объясняется ниже.

Значения. Группа «Значения» объединяет управляющие элементы, предназначенные для ведения списка значений перечисления и редактирования их свойств. Подробно об использовании управляющих элементов этой группы будет рассказано ниже в параграфе «Управление значениями перечисления».

Описание. Кнопка «Описание» предназначена для вызова текстового редактора, в котором можно описать назначение и порядок использования перечисления.

Управление значениями перечисления

Перечисление, как самостоятельный объект метаданных, в системе 1 (^Предприятие не применяется, а используется, в основном, при работе с объектами данных других типов: при заполнении реквизитов документов или справочников, при вводе значений констант и в Других аналогичных случаях. Использование перечисления позволяет ограничить выбор пользователя заранее заданным списком значений перечисления и дает возможность уже в процессе настройки конфигурации задачи предусмотреть все ситуации в зависимости от выбора пользователя.

Управление списком значений перечисления и определение свойств этих значений производится при помощи управляющих элементов группы «Значения» диалога «Перечисление». Порядок использования этих управляющих элементов можно посмотреть в п. «Редактирование списков объектов метаданных» на стр. 21.

Редактирование свойств значения перечисления

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

В отличие от других объектов метаданных, значение перечисления не имеет свойства «Синоним». В этом качестве выступает свойство значения перечисления «Представление».

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

Можно сказать, что представление занимает промежуточное значение между идентификатором и комментарием: в наиболее общем случае, представление должно быть более подробное, чем идентификатор, но не такое развернутое, как комментарий.

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

Если поле «Представление» не заполнено, для выдачи в списке будет использоваться идентификатор значения перечисления.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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