Как установить параметр запроса напрямую без использования поля ввода 1С

Программист 1С v8.3 (Обычные формы) 1С:Зарплата и Управление Персоналом Управленческий учет IT и автоматизация бизнеса
← На главную

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

Проблема прямого обращения к объектам метаданных

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

Запрос.УстановитьПараметр("Зарплата1", ЭлементыФормы.ПолеВвода1.Значение);

Чтобы отказаться от ЭлементыФормы, необходимо получить ссылку на нужный объект программно. Основная ошибка новичков заключается в попытке обратиться к типу данных (например, ПланВидовРасчетаСсылка) вместо менеджера объекта. Правильное обращение к коллекции всегда начинается с множественного числа — ПланыВидовРасчета.

Способ 1. Поиск по коду или наименованию

Если вы знаете уникальный код элемента или его точное название в справочнике или плане видов расчета, вы можете использовать методы НайтиПоКоду() или НайтиПоНаименованию(). Проанализируем, как это выглядит в коде:


// Поиск по коду (наиболее надежный вариант среди поисковых методов)
НужнаяСсылка = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00001");

// Поиск по точному наименованию
НужнаяСсылка = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Зарплата кассиру");

Запрос.УстановитьПараметр("Зарплата1", НужнаяСсылка);

Важный нюанс: методы поиска возвращают Пустую ссылку, если объект не найден. Рассмотрим ситуацию подробнее: если вы передадите пустую ссылку в запрос, он не выдаст ошибку, но результат будет пустым. Проверим результат перед установкой параметра:


ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00001");

Если ВидРасчета.Пустая() Тогда
    Сообщить("Внимание: Вид расчета с кодом 00001 не найден в базе!");
Иначе
    Запрос.УстановитьПараметр("Зарплата1", ВидРасчета);
КонецЕсли;

Способ 2. Использование предопределенных элементов

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


// Используем имя предопределенного элемента, заданное в конфигураторе
Запрос.УстановитьПараметр("Зарплата1", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ЗарплатаКассиру);

Это самый быстрый и безопасный способ, так как исключает ошибки опечаток в кодах или названиях в пользовательском режиме.

Способ 3. Оператор ЗНАЧЕНИЕ в тексте запроса

Рассмотрим продвинутый метод, который позволяет вообще не использовать УстановитьПараметр в коде 1С. Если значение фиксировано, его можно прописать прямо в тексте запроса с помощью оператора ЗНАЧЕНИЕ(). Посмотрим на пример текста запроса:


ТекстЗапроса = "ВЫБРАТЬ
               |    *
               |ИЗ
               |    РегистрРасчета.ОсновныеНачисленияОрганизаций КАК Начисления
               |ГДЕ
               |    Начисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисленияОрганизаций.ЗарплатаКассиру)";

Этот подход делает код чище, так как уменьшает количество передаваемых параметров. Обратите внимание, что внутри ЗНАЧЕНИЕ() используется имя объекта в единственном числе (ПланВидовРасчета), а не во множественном.

Способ 4. Использование уникального идентификатора (UUID)

Бывают случаи, когда элемент не предопределен, а его код или наименование могут изменить пользователи. В такой ситуации надежнее всего использовать УникальныйИдентификатор. Разберем по шагам, как получить ссылку по его внутреннему ID:

  1. Узнайте UUID элемента (через консоль запросов или программно).
  2. Используйте его для получения ссылки.

МойУИД = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
НужнаяСсылка = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ПолучитьСсылку(МойУИД);

Запрос.УстановитьПараметр("Зарплата1", НужнаяСсылка);

Профессиональные рекомендации по архитектуре

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

Рекомендуем:

Разница между Клиентом и Сервером

Важно помнить, что обращение к менеджерам объектов (ПланыВидовРасчета, Справочники и т.д.) доступно только на стороне Сервера. Если вы работаете в управляемом приложении (1С v8.3), убедитесь, что ваш код выполняется в процедуре с директивой &НаСервере. На клиенте попытка вызвать НайтиПоКоду() приведет к ошибке компиляции.

Подведем итог: для установки параметра запроса без поля ввода лучше всего использовать предопределенные значения или оператор ЗНАЧЕНИЕ() прямо в запросе. Если же элемент создается пользователями в процессе работы, используйте поиск по коду с обязательной проверкой на Пустая().

← На главную