Приветствую, Форумчане!
УФ, самопис

Имеется справочник, где в реквизите "ПроизвольноеУсловие" прописан код типа:

```1c
    Запрос = Новый Запрос;
    Запрос.Текст =
    "Выбрать
    ***************
    ***************

    Запрос.УстановитьПараметр("Ссылка", Контекст.Объект);
    //Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.НайтиПоКоду("00000018"));
    Сообщить(Справочники.Номенклатура.НайтиПоКоду("00000018");

    Если НЕ Запрос.Выполнить().Пустой() Тогда
```

Если Запустить команду

```1c
    Выполнить(ПроизвольноеУсловие)
```

то всё срабатывает как надо (без второго параметра). Однако "Сообщение" с найденной номенклатурой не выводит, дает ошибку
Поле объекта не найдено(Номенклатура)

Ну и как последствия не устанавливается параметр отбора...
тестирование проводил, кэш почистил...

Почему не находит этот справочник по коду? Справочник существует, код такой существует.
Проверял запуск этого поиска в программе, сообщение дает, а вот при "Выполнить()" не хочет
---
Точнее не просто не находит, а не видит такой справочник. Похожее бывает, если на клиенте обратится к справочнику...

Основной вопрос почему не срабатывает обращение "Справочники.Номенклатура.НайтиПоКоду(*****)"?
Первое правило робототехники: не нужно крутить две ручки сразу.
То что проблема не в этом (не видит вообще справочник) можно убедиться выполнив такой код (но отдельно, а не вместе с тем):

```1c
    НоменклатураВЗапрос = Неопределено;
    Стр = "НоменклатураВЗапрос = Справочники.Номенклатура.найтиПоКоду("000000018");";
    Выполнить(Стр);
    Сообщить(НоменклатураВЗапрос);
```

Ошибка же возникала на то, что в запросе использовался параметр &Номенклатура, но он не был установлен (закомментирован код установки параметра).
---
В отношении написанного. Отличие "Выполнить()" в моем случае заключается не в каком режиме это выполняется, а откуда... из справочника или документа в моем варианте поставленной задачи.
В итоге будет выполняться строка с кодом. И не важно как она получена, если она содержит одинаковые данные.
И вот тут еще одно предположение, что в справочнике условий было несколько записей. Ошибка была в одной, которая и выполнялась... до самой ошибки. А правили в другом элементе такой-же (похожий) код.
Когда перенесли на хранение в реквизит документа, то перенесли только нужный и единственный элемент.
---
а как оно у вас вообще работает?
вот здесь, скобки не хватает!!!

Сообщить(Справочники.Номенклатура.НайтиПоКоду("00000018") <<)>>;
---
Это опечатка... В коде стоит скобка. При отсутствии скобки вышла бы другая ошибка, а тут явно не находит справочник "номенклатура"
---
а можно весь кусок кода в студию.
Где выполняется данный код? На стороне сервера или на клиенте?
Есть подозрение что на клиенте
---
У меня тоже есть это подозрение.
Код выполняется из общего модуля серверного при подписке на событии документа "Обработка проведения"
Сам запуск произвольного условия расположен в Модуле Менеджера справочника, где прописаны произвольные условия

```1c
    Процедура ВыполняемКодОбработкаПроведения(Источник, Отказ, режимПроведения) Экспорт
    *************
    РезультатПроверки = Справочники.СправочникУсловий.ПроверитьВыполнениеУсловия(Источник.Ссылка....);
```

Модуль менеджера справочника с условиями:

```1c
    Функция ПроверитьВыполнениеУсловия(******************, ТекстПроизвольногоУсловия) Экспорт
    Если ЗначениеЗаполнено(ТекстПроизвольногоУсловия) Тогда
    Попытка
    Выполнить(ТекстПроизвольногоУсловия)
    Исключение
    ОписаниеОшибки = ОписаниеОшибки()
    КонецПопытки;
    КонецЕсли;
```

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

```1c
    Контекст.Запретить = Ложь;

    Запрос = Новый Запрос;

    Запрос.Текст =
    "ВЫБРАТЬ
    | ПродажаТоваровТовары.Ссылка КАК Ссылка,
    | ПродажаТоваровТовары.Номенклатура КАК Номенклатура
    |ИЗ
    | Документ.ПродажаТоваров.Товары КАК ПродажаТоваровТовары
    |ГДЕ
    | ПродажаТоваровТовары.Ссылка = &Ссылка
    | И ПродажаТоваровТовары.Номенклатура = &Номенклатура
    |";

    Запрос.УстановитьПараметр("Ссылка", Контекст.Объект);
    //Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.найтиПоКоду("000000018"));
    //Сообщить(Справочники.Номенклатура.найтиПоКоду("000000018"));

    Если НЕ Запрос.Выполнить().Пустой() Тогда

    Контекст.Запретить = Ложь;
    Сообщить("Нельзя продать товар Вентиль водоснабжения");

    КонецЕсли;
```

Текст ошибки:

{<Неизвестный модуль>(20)}: Поле объекта не обнаружено (Номенклатура)
---
Текст произвольного условия
Если это текст произвольного условия, то он вообще не должен сработать.
Я просил именно полный текст. Нужен именно текст, так как могут быть нарушены правила экранирования и другие не явные ошибки.
---
Это и есть полный текст.
Если убрать условие по номенклатуре, то код работает

Закомментирован как раз для случая проверки работы кода без условия по номенклатуре (в коде запроса забыл закомментировать)
---
Это и есть полный текст.
Полный текст это:

В отладчике перехватываете значение переменной ТекстПроизвольногоУсловия. Вот значение этой переменной и хотелось видеть.

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

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

Основной вопрос почему не срабатывает обращение "Справочники.Номенклатура.НайтиПоКоду(*****)"?

Ранее делал подобное в другой базе, правда не на событии по подписке, а по нажатию кнопок и код типа

```1c
    Запрос.УстановитьПараметр("К25", Справочники.МоделиСтел.НайтиПоКоду("000000155"));
```

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

Основной вопрос почему не срабатывает обращение "Справочники.Номенклатура.НайтиПоКоду(*****)"?
Первое правило робототехники: не нужно крутить две ручки сразу.
То что проблема не в этом (не видит вообще справочник) можно убедиться выполнив такой код (но отдельно, а не вместе с тем):

```1c
    НоменклатураВЗапрос = Неопределено;
    Стр = "НоменклатураВЗапрос = Справочники.Номенклатура.найтиПоКоду("000000018");";
    Выполнить(Стр);
    Сообщить(НоменклатураВЗапрос);
```

Ошибка же возникала на то, что в запросе использовался параметр &Номенклатура, но он не был установлен (закомментирован код установки параметра).
---
Да раскомментирован он. Здесь запостил с комментом. Опечатался я...

А вот за пример спасибо. Создал кнопку на форме и запустил этот код на клиенте и на сервере.

На Сервере сработал поиск, а вот на клиенте дал ошибку, похожую на мою:

"{<Неизвестный модуль>(20)}: Переменная не определена (Справочники)"
---
На Сервере сработал поиск, а вот на клиенте дал ошибку, похожую на мою:

"{(20)}: Переменная не определена (Справочники)"
{<Неизвестный модуль>(20)}: Поле объекта не обнаружено (Номенклатура)
Вот совсем разная ошибка. Не нужно в нее упираться. Не там ищите.
Да на клиенте (тонком) и запрос не существует и выполнить его невозможно.
---
Да сколько же можно Вам говорить, что запрос работает, Выполнить() срабатывает.
Не срабатывает поиск по метаданным, в данном случае по справочникам.

Если я в произвольно запросе поставлю

```1c
    | И ПродажаТоваровТовары.Номенклатура.КОД = &Номенклатура
    |";

    Запрос.УстановитьПараметр("Ссылка", Контекст.Объект);
    Запрос.УстановитьПараметр("Номенклатура", "000000018");
```

Т.е. буду искать не ссылку, а буду искать сразу известным мне код, то всё прекрасно сработает.
Не работает поиск по Справочник.Номенклатура.НайтиПоКоду()

Всё расскомментировано, все написано по буквам правильно...
---
Да сколько же можно Вам говорить, что запрос работает, Выполнить() срабатывает.
Не срабатывает поиск по метаданным, в данном случае по справочникам.
Достаточного одного раза, но правильно. А не понятные огрызки кода с примечанием "Да раскомментирован он. Здесь запостил с комментом. Опечатался я...".
Представьте полностью правильный код и полный текст возможной ошибки.
---
Представьте полностью правильный код и полный текст возможной ошибки.
Это слишком просто. ТС не ищет легких путей.
---
Всё было предоставлено полностью, не дал только ключи от квартиры где деньги лежат...

Из всего сказанного Космобольцем оказалось полезным только призрачный намек на Клиент/Сервер.
Видно, что человек грамотный и подготовленный. Лишний раз подтвердилось, что нужно доверять интуиции, а не академическому образованию.

Тема раскрыта, топик можно закрывать...
---
без хамства обойтись было ни как?
Вы же просто выдаете "желаемое" за действительное.
Подумайте сами, если (как вы себе надумали) "но если всё это запускать в рамках справочника, то поиск идет на Клиенте", то каким способом вообще возможно выполнение запроса на клиенте? На тонком клиенте.

Как мне видится, тут возможно 2 случая.
1 - что-то с вашим кодом не так.
2 - было создана переменная Справочники и она перекрыла видимость системной Справочники.
---
2. Чушь! особенно про переменную "Справочники". Я уже давно научился не использовать "встроенные" наименования для работы с базами, еще во времена MS Access
1. С кодом всё нормально. Подобное уже давно использую у себя и всё прекрасно работает. Просто сейчас решил сделать по уму и попробовать использовать справочник. До этого, по-каким то причинам использовал документы. Хотя не помню уже почему. Наверно по тем же причинам, что менеджер справочника работает несколько иначе, чем менеджер документа.
3. Про то, что "надумал". Дайте разумное объяснение почему у меня всё тоже самое сработало в документе и не работало в справочнике. Объясняю, я ничего не переделывал, просто создал новый документ и перенес его один-в-один из справочника. Возможно при работе в менеджере справочника произвольное условие нужно писать иначе, но я не нашел нигде, в доступном для меня мире поиска, что Выполнить() работает по-разному в разных местах...

Буду признателен Вам, если Вы сможете найти решение, если указанный произвольный код с поиском будет работать из модуля менеджера справочника, а не указывать мне весь день, что у меня что-то заремачено и если это разремачить, то всё заработает; отловить в отладчике значение произвольного условия, т.к. оно почему-то должно очень сильно отличаться от текста написанного в реквизите; раскрыть тайну всего кода, т.к. не ищу легких путей... Ну и т.д.
Что по мне, перечисленное куда хуже "хамства" :-)

Еще раз поблагодарю основного своего визави, который пусть непроизвольно, но всё-таки натолкнул на мысль куда идти, в результате чего всё у меня заработало :-)
//Отметил как решение!!!
---
держите тестовую БД. Все как описано в задаче и выполняется в менеджере справочника. И самое главное - работает!
А теперь думайте...
---
Вот обидно, у Вас 8.3.19... у меня 8.3.18... Есть возможность как то трансформировать? У меня поднять платформу нет возможности... :-(
С большим интересом бы посмотрел Ваше решение...
---
без проблем.
---
"Такое и я могу, а ты Мурку давай" (с) Промокашка, "Место встречи изменить нельзя"
:-)

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

В Вашем примере код условия прописывается в Конфигураторе, да еще и в Подписке, а я, точнее пользователь, должен прописывать это руками во время работы, и этот код должен срабатывать при выполнении его программно через команду

```1c
    Выполнить("Произвольноеусловие");
```

На скрине приведен пример справочника (документа в окончательном варианте), который должен быть создан. Как видно код запроса, а точнее код срабатывания условий прописан в справочнике, а не в конфигураторе.
Я как раз и говорил, что выделенный фрагмент и не срабатывал в "рамках" справочника, хотя, если это всё сделать в рамках документа (как у меня ы итоге, то установка параметра, т.е. поиск по коду будет срабатывать через "Выполнить()"

ПС: Неужели я похож на человека, который бы не смог сделать код в вашем предложенном варианте?
---
Вот я и говорил, что если всё это сделать в рамках справочника, то код
Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.найтиПоКоду("000000018"));

не срабатывал, давал ошибку, а как только я создал всё это в рамках документа, то всё сработало.
---
"Такое и я могу, а ты Мурку давай" (с) Промокашка, "Место встречи изменить нельзя"
:-)

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

В Вашем примере код условия прописывается в Конфигураторе, да еще и в Подписке, а я, точнее пользователь, должен прописывать это руками во время работы, и этот код должен срабатывать при выполнении его программно через команду
Выполнить("Произвольноеусловие");

Вот про Мурку в самую точку. Но не как сами предполагаете.
А теперь объясните, в чем отличие, в момент выполнения кода Выполнить("Произвольноеусловие");, выполняемая строка создана в режиме предприятия или в коде конфигуратора, если условно предположительно в итоге она содержит одинаковые данные.
Я специально создал строку в коде, чтобы соблюсти чистоту эксперимента.
А вот Вы пытаетесь увести в сторону момент проверки.
Читаем (5):
Код выполняется из общего модуля серверного при подписке на событии документа "Обработка проведения"
Сам запуск произвольного условия расположен в Модуле Менеджера справочника, где прописаны произвольные условия
Вот от этого и исходим.
---
Давайте прекратим этот бессмысленный спор. Вы уже на протяжении всего диспута пытаетесь меня тыкнуть мордочкой в песок. Я понимаю, что Вы мега сертифицированный специалист. Я это ценю, завидую и восхищаюсь Вами. А мне позвольте остаться в тени Вашего величия.

В отношении написанного. Отличие "Выполнить()" в моем случае заключается не в каком режиме это выполняется, а откуда... из справочника или документа в моем варианте поставленной задачи.
---
я никого никуда не тыкал. Я пытался объяснить ошибочность вашего предположения. Не хотите этого понимать - воля ваша. Только не надо тогда и утверждать, что это из-за выполнение на клиенте, там где это вообще никак не возможно. Так и сказали бы, что: "ошибку удалось обойти. Не известно почему, но работает и устраивает."
---
В отношении написанного. Отличие "Выполнить()" в моем случае заключается не в каком режиме это выполняется, а откуда... из справочника или документа в моем варианте поставленной задачи.
В итоге будет выполняться строка с кодом. И не важно как она получена, если она содержит одинаковые данные.
И вот тут еще одно предположение, что в справочнике условий было несколько записей. Ошибка была в одной, которая и выполнялась... до самой ошибки. А правили в другом элементе такой-же (похожий) код.
Когда перенесли на хранение в реквизит документа, то перенесли только нужный и единственный элемент.
---
Гениально!!! Всё правильно! Вы удовлетворены? Тему мож всё-таки закроем?
Отметил как решение.
---
Отметил как решение, но только сам код... Не додумался бы так сделать для проверки :-)
Удачи!
---
| И ПродажаТоваровТовары.Номенклатура = &Номенклатура
Предположу, что ругается на это. &Номенклатура не установлено.
---
А почему строка закоментирована ?
//Запрос.УстановитьПараметр("Номенклатура", Справочники.Номенклатура.найтиПоКоду("000000018"));
---
Решил проблему. Всё работает. Ранее все деяния творил в рамках справочника "МеханизмКонтроля"
Создал полный аналог этого, только как документ "МеханизмКонтроляНовый."

Все поиски и условия заработали. Не знаю почему, но если всё это запускать в рамках справочника, то поиск идет на Клиенте, если через Документ, то поиск типа Справочник.Номенклатура.НайтиПоКоду срабатывает без каких либо капризов
---
Если у вас код выполнялся в модуле объекта, то скорее всего в справочнике МеханизмКонтроля есть реквизит, или табличная часть, или переменная модуля объекта с именем "Справочники".
---
Нету...
---
Что такое "выполнял в рамках справочника"? Может я от жизни отстал?
---
Для выполнения задачи создал справочник "МеханизмКонтроля" и прописал в нем всё необходимое для выполнения. Но вышла такая вот ошибка...

Удалил этот справочник, создал документ "МеханизмКонтроля", перенес туда всё, что было в справочнике. Ну, если так можно выразится, то сделал полную копию по функционалу справочника и документа... Сразу всё взлетело...

Уже внедрил в рабочую базу, всё работает корректно так, как задумывалось...
---
прописал в нем всё необходимое для выполнения В нём - это ГДЕ?