В процессе разработки на платформе 1С часто возникает задача автоматизации, когда необходимо исключить лишние действия пользователя. Одной из таких задач является передача конкретного значения в запрос программно, минуя элементы формы (поля ввода). Рассмотрим подробно, как это реализовать на примере работы с планами видов расчета, и разберем типичные ошибки начинающих разработчиков.
Разберем типичную ситуацию: у вас есть запрос, в который нужно передать конкретный вид расчета (например, "Зарплата кассиру"). Изначально код может выглядеть так:
Запрос.УстановитьПараметр("Зарплата1", ЭлементыФормы.ПолеВвода1.Значение);
Чтобы отказаться от ЭлементыФормы, необходимо получить ссылку на нужный объект программно. Основная ошибка новичков заключается в попытке обратиться к типу данных (например, ПланВидовРасчетаСсылка) вместо менеджера объекта. Правильное обращение к коллекции всегда начинается с множественного числа — ПланыВидовРасчета.
Если вы знаете уникальный код элемента или его точное название в справочнике или плане видов расчета, вы можете использовать методы НайтиПоКоду() или НайтиПоНаименованию(). Проанализируем, как это выглядит в коде:
// Поиск по коду (наиболее надежный вариант среди поисковых методов)
НужнаяСсылка = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00001");
// Поиск по точному наименованию
НужнаяСсылка = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоНаименованию("Зарплата кассиру");
Запрос.УстановитьПараметр("Зарплата1", НужнаяСсылка);
Важный нюанс: методы поиска возвращают Пустую ссылку, если объект не найден. Рассмотрим ситуацию подробнее: если вы передадите пустую ссылку в запрос, он не выдаст ошибку, но результат будет пустым. Проверим результат перед установкой параметра:
ВидРасчета = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.НайтиПоКоду("00001");
Если ВидРасчета.Пустая() Тогда
Сообщить("Внимание: Вид расчета с кодом 00001 не найден в базе!");
Иначе
Запрос.УстановитьПараметр("Зарплата1", ВидРасчета);
КонецЕсли;
Если нужный вам вид расчета создан в конфигураторе как предопределенный, обращение к нему упрощается до максимума. В этом случае нам не нужно обращаться к базе данных для поиска, мы обращаемся к метаданным напрямую. Выясним, как выглядит такой синтаксис:
// Используем имя предопределенного элемента, заданное в конфигураторе
Запрос.УстановитьПараметр("Зарплата1", ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ЗарплатаКассиру);
Это самый быстрый и безопасный способ, так как исключает ошибки опечаток в кодах или названиях в пользовательском режиме.
Рассмотрим продвинутый метод, который позволяет вообще не использовать УстановитьПараметр в коде 1С. Если значение фиксировано, его можно прописать прямо в тексте запроса с помощью оператора ЗНАЧЕНИЕ(). Посмотрим на пример текста запроса:
ТекстЗапроса = "ВЫБРАТЬ
| *
|ИЗ
| РегистрРасчета.ОсновныеНачисленияОрганизаций КАК Начисления
|ГДЕ
| Начисления.ВидРасчета = ЗНАЧЕНИЕ(ПланВидовРасчета.ОсновныеНачисленияОрганизаций.ЗарплатаКассиру)";
Этот подход делает код чище, так как уменьшает количество передаваемых параметров. Обратите внимание, что внутри ЗНАЧЕНИЕ() используется имя объекта в единственном числе (ПланВидовРасчета), а не во множественном.
Бывают случаи, когда элемент не предопределен, а его код или наименование могут изменить пользователи. В такой ситуации надежнее всего использовать УникальныйИдентификатор. Разберем по шагам, как получить ссылку по его внутреннему ID:
МойУИД = Новый УникальныйИдентификатор("550e8400-e29b-41d4-a716-446655440000");
НужнаяСсылка = ПланыВидовРасчета.ОсновныеНачисленияОрганизаций.ПолучитьСсылку(МойУИД);
Запрос.УстановитьПараметр("Зарплата1", НужнаяСсылка);
Прописывание конкретных значений прямо в коде (хардкодинг) считается "плохим тоном" в разработке. Проанализируем ситуацию: если завтра "Зарплата кассиру" изменится на "Оклад кассира", вам придется переписывать код.
Рекомендуем:
Константы.ОсновнойВидЗарплаты.Получить().Важно помнить, что обращение к менеджерам объектов (ПланыВидовРасчета, Справочники и т.д.) доступно только на стороне Сервера. Если вы работаете в управляемом приложении (1С v8.3), убедитесь, что ваш код выполняется в процедуре с директивой &НаСервере. На клиенте попытка вызвать НайтиПоКоду() приведет к ошибке компиляции.
Подведем итог: для установки параметра запроса без поля ввода лучше всего использовать предопределенные значения или оператор ЗНАЧЕНИЕ() прямо в запросе. Если же элемент создается пользователями в процессе работы, используйте поиск по коду с обязательной проверкой на Пустая().