БП Корп 8.3.25.1374/3.0.163.26 работа на расширении.
Задача: Недопустить создание документа реализации по контрагентам физическим лицам с цифрами (номерами лицевых счетов) в ФИО.

Как обратиться к справочнику Контрагенты как физическому лицу?
1.
Пытался через запрос в модуле формы Документ РеализацияТоваровУслуг: ФормаДокументаТовары
&НаСервереБезКонтекста
Функция ПроверитьЗаполненностьНаСервере(Контрагент, ДоговорКонтрагента)

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

Ошибка: Переменная не определена (ФизическоеЛицо)
2.
Пытался проверить на наличие цифр без запроса:

```1c
    Контрагент = Объект.Контрагент;
    Если Контрагент.УникальныйИдентификатор() = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
    РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Контрагент.Наименование, Ложь, "0123456789");
    Если Не РезультатПроверкиФЛ Тогда
    Сообщить("В наименовании ФЛ недопустимые символы");
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
```

Ошибка: Переменная не определена (Объект) Почему? Ведь, судя по форме (см. скриншот) путь прописан правильно.
---
```1c
    &НаСервере
    Функция ПроверитьЗаполненностьНаСервере(Контрагент, ДоговорКонтрагента)

    Отказ = Ложь;
    Если Контрагент.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
    РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Контрагент.Наименование, Ложь, "0123456789");
    Если Не РезультатПроверкиФЛ Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "В наименовании ФЛ недопустимые символы";
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;

    Возврат Отказ;

    КонецФункции
```
---
Потому что без контекста нет ни Объекта, ни ФизическогоЛица. Ничего нет.
---
```1c
    Если Контрагент.УникальныйИдентификатор() = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
```
Кросивое!
---
Ого, ты аж до сюда дочитал...
---
Этот код при отладке не выдаёт ошибки, но он и ничего не делает..
---
Потому что он не является ошибочным, но и не является продуктивным. Обычная профанация и видимость деятельности.
---
Ознакомься что такое &НаСервереБезКонтекста
https://its.1c.ru/db/v8std#content:636:hdoc
---
Спасибо.
Почему в запросе
```1c
    Контрагенты.ЮридическоеФизическоеЛицо = &ФизическоеЛицо
```
 не является тем самым контекстом?

Пробовал через отдельную процедуру, явно указав Документ. Но в этом случае вне контекста оказалось Перечисление

```1c
    &НаКлиенте
    Процедура ДК1_КонтрагентНачалоВыбораПосле(Документ, Отказ)
    Контрагент = Документ.Контрагент;
    Если Контрагент.Наименование = Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо Тогда...
```

Есть универсальный способ задать контекст?
---
Есть универсальный способ задать контекст? Не использовать БезКонтекста.
---
А разве запрос использует форму?
---
ФизическоеЛицо - в данном случае контекст формы. Ваш КЭП :)
---
А ты точно своим ответом попал в правильную контекстную ветку?
---
Если ФизическоеЛицо - реквизит формы, то точно туда :)
---
Слушай, откуда ты такой непонятливый постоянно берешься?
---
Местные мы :)
---
В моём случае реквизит Контрагента ЮридическоеФизическоеЛицо тип Перечисления со значениями ФизическоеЛицо и ЮридическоеЛицо.
---
Тут разговор чуть-чуть про другое. Не важно, какое там значение реквизиты формы. Разговор идёт о том, что при применении директивы &НаСервереБезКонтекста - процедура/функция не имеет никакого представления о форме, а тем более о переменных/реквизитах, которые на ней имеются. Но может принимать на вход простые типы.
---
Но может принимать на вход простые типы. Простые типы? Что это такое?
---
Простые типы? Что это такое? Это сложно.
---
Оставлю тут историю фраерского слива. А то ту тему все равно снесут админы.

ТС! Никогда не слушай таких вот шарлатанов!!!
---
Добавлю от себя:
https://sun9-63.userapi.com/impg/YrWrmZhRdEDgO8WZhrYOpkMKxYds4XxHpUj4yg/9-BBZJygJ84.jpg?size=542x407&quality=95&sign=f65dee28de47935fdc5718f06d85d2d­3&type=album
---
Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо
Попробуйте вместо этого

```1c
    ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо")
```

И посмотрите доступность перечислений
---
Как ему этот совет поможет сравнить ГУИД ссылки Справочника и ссылку Перечисления? Именно это он и пытается сделать в своем коде.
Тут хоть запредопределяйся, но сравнение не будет работать.

// А в другом месте он вообще пытается сравнить перечисление с наименованием, да еще и с ошибкой написанное (там даже до сравнения дело не дойдет, упадет на синтаксисе).
---
точно. вот я олень.
---
Попытка обратиться непосредственно к перечислениям ни к чему не привела:

```1c
    &НаКлиенте
    Процедура ДК1_ПриОткрытииПосле(Отказ)

    //Контрагенты = Объект.Контрагент;
    //Контрагенты = Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Контрагент;
    //Контрагенты = Справочники.Контрагенты.ЭтоФизическоеЛицо(Контрагент);
    //Контрагенты = Справочники.Контрагенты.
    //Контрагенты = Метаданные.Документы.ЗакупкаТоваров.Реквизиты
    //Контрагенты = ЭтотОбъект.
    //Контрагенты = УправлениеСвойствами.ЗначениеСвойства(Контрагенты, "ЮридическоеФизическоеЛицо");
    //Контрагенты = ПеречислениеСсылка.ЮридическоеФизическоеЛицо;

    Контрагенты = Перечисления.ЮридическоеФизическоеЛицо.ФизическоеЛицо;
    Если Контрагенты = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
    РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Объект.Контрагент, Ложь, "-");
    Если Не РезультатПроверкиФЛ Тогда
    Сообщить("В наименовании ФЛ недопустимые символы");
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;
```

Как прописать обращение к перечислению ЮридическоеФизическоеЛицо реквизита справочника Контрагенты?
---
1. Дружно идём учить доступность менеджеров метаданных в клиент-серверной модели. Проще говоря - смотрим СП.

2. Ты чего проверяешь-то? Те не хочешь обратиться, например, к реквизиту контрагента? Ну к тому самому, который содержит непосредственное значение перечисления? Не? Бред?
---
1. Извините, я не понял что такое СП
2. В примере же видно, что я обращался, там закомментировано.
---
1. Структура Предприятия
2. Не видно. Покажи конкретную строчку обращения к реквизиту.

Ну хорошо. Зададим вопрос попроще. Что такое реквизит?
---
2. Спасибо, user2116971, я, кажется, понял:
1. Нужно обращаться через Метаданные, которые недоступны.

Переменная не определена. Значит, остаётся только вариант через запрос.
---
Сообщение было скрыто модератором.
---
Оказалось, Метаданные недоступны &НаКлиенте.
&НаСервере доступны, но ПредопределенноеЗначение Переменная не определена

```1c
    КонтрагентыФЛ = Метаданные.Справочники.Контрагенты.Реквизиты.ЮридическоеФизическоеЛицо;
    Если КонтрагентыФЛ = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
```

Как обратиться к перечислению справочника?
---
Почитайте хотя бы Радченко, вопросов будет меньше.
Вы вообще не понимаете что делаете.
Радченко поможет понять основы.
https://its.1c.ru/db/pubdevguide83
---
У Радченко есть глава о перечислениях, но нет ничего о метаданных и предопределенном значении. Что именно не то я делаю?
---
Что именно не то я делаю?
Все.

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

```1c
    КонтрагентыФЛ = Метаданные.Справочники.Контрагенты.Реквизиты.ЮридическоеФизическоеЛицо;
    Если КонтрагентыФЛ = Метаданные.Перечисления.ЮридическоеФизическоеЛицо.ЗначенияПеречисления.ФизическоеЛицо Тогда
```

Однако далее, при проверке на наличие цифр в наименовании контрагента в документе РеализацияТоваровУслуг, обращение через метаданные не срабатывает:

```1c
    РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Метаданные.Документы.РеализацияТоваровУслуг.Реквизиты.Контрагент.Имя, Ложь, "0123456789");
```
---
Не останавливайся, твори!!!
---
Нет, все не верно.
---
При попытке обратиться из документа РеализацияТоваровУслуг к перечислению &НаКлиенте через ПредопределенноеЗначение

```1c
    Контрагент = Объект.Контрагент;
    Если Контрагент = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
```

Контрагента видит, а ПредопределенноеЗначение пишет: переменная не определена.
Возможно обратиться из документа в перечисление справочника?
---
перечисление справочникаУх ты!

"Война и мир" на печатных машинках...
---
Я заблудился в трёх соснах: Документ > Справочник > Перечисления
И двух кустах: &НаКлиенте и &НаСервере
---
Откройте отладку там же все видно, какие реквизиты у объекта, какого они типа и т.д.
---
Человек не знает, что такое реквизит, о чем ты?
---
```1c
    &НаСервере
    Функция ПроверитьЗаполненностьНаСервере(Контрагент, ДоговорКонтрагента)

    Отказ = Ложь;
    Если Контрагент.ЮридическоеФизическоеЛицо = ПредопределенноеЗначение("Перечисление.ЮридическоеФизическоеЛицо.ФизическоеЛицо") Тогда
    РезультатПроверкиФЛ = СтроковыеФункцииКлиентСерверРФ.ТолькоКириллицаВСтроке(Контрагент.Наименование, Ложь, "0123456789");
    Если Не РезультатПроверкиФЛ Тогда
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Текст = "В наименовании ФЛ недопустимые символы";
    Сообщение.Сообщить();
    Отказ = Истина;
    КонецЕсли;
    КонецЕсли;

    Возврат Отказ;

    КонецФункции
```