Параметры в 1С 8.3: где их создают и как передают значение из кода
Содержание
Чаще всего «установить параметр
» в 1С 8.3 означает одну строку кода: Запрос.УстановитьПараметр("Организация", Организация). В тексте запроса параметр пишется с амперсандом (&Организация), а значение подставляет платформа перед выполнением. Для параметров сеанса, формы и отчёта на СКД способ другой, и права на них проверяются по-разному.
Типичная ситуация: разработчик дописывает отчёт по продажам, запускает его, а 1С отвечает Не задано значение параметра "КонецПериода". Или параметр задан, ошибки нет, но отчёт пустой. Обе проблемы решаются за пару минут, если понимать, какой именно параметр вы устанавливаете и где живёт его значение.
Какие параметры бывают в 1С 8.3 и чем они отличаются
Слово «параметр» в платформе относится к нескольким разным механизмам. У каждого своё место хранения и время жизни.
| Вид параметра | Где объявляют | Как задают значение | Сколько живёт значение |
|---|---|---|---|
| Параметр запроса | В тексте запроса: &Имя | Запрос.УстановитьПараметр() | До выполнения запроса |
| Параметр сеанса | Конфигуратор: ветка Общие → Параметры сеанса | Модуль сеанса, ПараметрыСеанса.Имя = … | До конца сеанса пользователя |
| Параметр формы | Форма: вкладка «Параметры» | Структура в ОткрытьФорму() | Пока форма открыта |
| Параметр данных СКД | Схема компоновки, закладка «Параметры» | ПараметрыДанных.УстановитьЗначениеПараметра() | В настройках отчёта |
| Параметр функциональных опций | Конфигуратор: Общие → Параметры функциональных опций | УстановитьПараметрыФункциональныхОпцийИнтерфейса() | Пока не переустановят |
Если значение должно храниться между сеансами и после перезапуска, это уже не параметр, а константа или хранилище. О них ниже, в отдельном разделе.
Как создать параметр в Конфигураторе
Значение параметра в Конфигураторе не задаётся: там создают сам объект и описывают его тип. Значение появляется только в работающем сеансе.
Параметр сеанса
- Откройте
Конфигурация → Открыть конфигурацию. - В дереве раскройте
Общие → Параметры сеанса. - Нажмите «Добавить», укажите имя (например,
ТекущийСклад) и тип —СправочникСсылка.Склады. - Откройте роли, которым нужен параметр, и отметьте права «Получение» и, если требуется, «Установка».
- Напишите код установки в модуле сеанса (пример в следующем разделе).
- Сохраните конфигурацию и выполните
Конфигурация → Обновить конфигурацию базы данных(F7).
В типовых конфигурациях на поддержке правка модуля сеанса снимает объект с поддержки или требует включить возможность изменения. Безопаснее добавить параметр сеанса и обработчик в расширение конфигурации.
Параметр формы
- Откройте форму в редакторе, перейдите на вкладку «Параметры» (рядом с «Реквизитами» и «Командами»).
- Добавьте параметр, задайте имя и тип.
- Если без него форма бессмысленна, установите флажок «Ключевой параметр»: тогда при разных значениях параметра откроются разные экземпляры формы.
Параметр данных в схеме компоновки
В конструкторе СКД параметр появляется сам, как только в тексте запроса набора данных встречается &Период. На закладке «Параметры» ему задают тип, значение по умолчанию и флажок «Ограничение доступности». Снятый флажок выводит параметр в пользовательские настройки отчёта.
Установить параметр запроса: метод УстановитьПараметр
Это самый частый случай. Порядок простой: написать текст с &Имя, передать значение, выполнить.
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Реализация.Ссылка КАК Ссылка,
| Реализация.СуммаДокумента КАК Сумма
|ИЗ
| Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
| Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
| И Реализация.Организация = &Организация
| И Реализация.Проведен";
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ДатаОтчета));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ДатаОтчета));
Запрос.УстановитьПараметр("Организация", Организация);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(СтрШаблон("%1: %2", Выборка.Ссылка, Формат(Выборка.Сумма, "ЧДЦ=2")));
КонецЦикла;
Что здесь важно на практике:
- 📅
КонецМесяца()возвращает 23:59:59 последнего дня. Если передать просто дату 31.10 без времени, документы, проведённые днём 31-го, в выборку не попадут. - 🔤 Имя параметра не зависит от регистра:
&организацияи"Организация"совпадут. А опечатка в одной букве даст ошибку «не задано значение». - 🔁 Один параметр можно использовать в тексте сколько угодно раз, устанавливают его один раз.
- 📦
Запрос.Параметры— это структура. Её можно заполнить заранее и передать целиком, например при переиспользовании одного запроса в цикле.
Список значений и массив
Для условия В (&Склады) передайте массив или список значений:
Склады = Новый Массив;
Склады.Добавить(ОсновнойСклад);
Склады.Добавить(СкладБрака);
Запрос.УстановитьПараметр("Склады", Склады);
Пустой массив ошибки не вызовет: запрос просто вернёт ноль строк. Если пустой массив должен означать «все склады», проверяйте это до формирования текста.
Таблица значений как параметр
Таблицу можно передать в запрос и поместить во временную таблицу: ВЫБРАТЬ … ПОМЕСТИТЬ ВТТовары ИЗ &Товары КАК Т. У колонок таблицы обязательно должны быть описаны типы (Новый ОписаниеТипов("СправочникСсылка.Номенклатура")). Колонка без типа — частая причина ошибки при выполнении.
Дата для виртуальных таблиц регистров
В параметр &Дата виртуальной таблицы остатков передавайте не голую дату, а границу или момент времени. Так учитываются движения самого документа или, наоборот, отсекаются:
// имя регистра условное
Запрос.УстановитьПараметр("Граница", Новый Граница(Документ.МоментВремени(), ВидГраницы.Исключая));
Параметры сеанса, формы и отчёта в режиме Предприятия
Параметр сеанса: модуль сеанса
Платформа вызывает процедуру УстановкаПараметровСеанса при старте сеанса и при первом обращении к ещё не установленному параметру. Во втором случае в ТребуемыеПараметры придёт массив имён.
Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
Если ТребуемыеПараметры = Неопределено Тогда
// старт сеанса: можно установить сразу всё
ПараметрыСеанса.ТекущийСклад = СкладПоУмолчаниюПользователя(); // ваша функция
Возврат;
КонецЕсли;
Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
Если ИмяПараметра = "ТекущийСклад" Тогда
ПараметрыСеанса.ТекущийСклад = СкладПоУмолчаниюПользователя();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
💡 Приём: тяжёлые параметры (запрос к базе, обращение к внешнему сервису) ставьте «лениво», только по ТребуемыеПараметры. Тогда запуск программы не замедляется, а значение вычисляется при первой надобности.
В конфигурациях на БСП модуль сеанса трогать не нужно. Обработчик своего параметра регистрируют в процедуре ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса — её можно перехватить в расширении.
ПараметрыСеанса доступны только на сервере. На клиенте код с ними не скомпилируется: нужна серверная процедура формы или функция общего серверного модуля, которая вернёт значение на клиент.
Параметр формы: открытие с данными
ПараметрыФормы = Новый Структура("Контрагент", Контрагент);
ОткрытьФорму("Обработка.СверкаРасчетов.Форма.Форма", ПараметрыФормы, ЭтотОбъект);
В самой форме значение читают в ПриСозданииНаСервере через Параметры.Контрагент. Позже, в других обработчиках, параметры уже недоступны для изменения, поэтому значение сразу переносят в реквизит формы.
Если параметр в форме не объявлен, прочитать его через Параметры.Имя не получится. Поэтому каждый параметр, который передаёте из вызывающего кода, объявляйте на вкладке «Параметры» с конкретным типом: тогда платформа ещё и проверит тип переданного значения.
Параметр отчёта на СКД
Настройки = КомпоновщикНастроек.Настройки;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", ТекущаяДатаСеанса());
Метод сам включает использование параметра. Пользователь меняет то же значение в шапке отчёта, если параметр выведен в пользовательские настройки.
Параметр функциональных опций
УстановитьПараметрыФункциональныхОпцийИнтерфейса(Новый Структура("Организация", ТекущаяОрганизация));
После вызова интерфейс перерисуется с учётом опций, которые зависят от выбранной организации. Метод вызывают на клиенте; на форме для этого есть отдельный метод УстановитьПараметрыФункциональныхОпцийФормы.
Права доступа и безопасность при установке параметров
Права на параметр сеанса
У параметра сеанса в роли два права: «Получение» и «Установка». Без «Получения» код в обычном режиме выдаст ошибку нарушения прав при чтении. Без «Установки» — при записи значения.
Модуль сеанса выполняется в привилегированном режиме, поэтому внутри УстановкаПараметровСеанса права роли не проверяются. Если значение нужно поменять позже, из другого серверного модуля, есть два пути:
- 🔐 выдать роли право «Установка» (подходит, если пользователь вправе менять значение сам);
- 🛡️ обернуть присваивание в
УстановитьПривилегированныйРежим(Истина)…УстановитьПривилегированныйРежим(Ложь)в серверном модуле, где перед этим проверено, что пользователю можно это делать.
Параметры сеанса часто участвуют в ограничениях доступа на уровне записей (RLS). Если дать пользователю право «Установка» на такой параметр, он сможет подменить значение и увидеть чужие данные.
Параметры запроса вместо склейки строк
Никогда не вставляйте пользовательский ввод в текст запроса конкатенацией: "… ГДЕ Наименование = """ + СтрокаПоиска + """". Кавычка или служебное слово в строке поиска поменяют смысл запроса. Передача через УстановитьПараметр такой проблемы не имеет: значение не разбирается как часть текста.
Кроме того, запрос с параметрами платформа и СУБД кешируют лучше, чем десятки разных текстов с вклеенными значениями.
Права на константы и хранилище
Константы проверяются по правам «Чтение» и «Изменение» в роли. Для ХранилищеОбщихНастроек пользователь без административных прав может работать только со своими настройками; чтение и запись чужих — для администратора или в привилегированном режиме.
Когда параметр не подходит: константы и хранилище значений
Параметр сеанса пропадает при выходе пользователя. Если значение нужно помнить дольше, выберите подходящее хранилище.
| Задача | Чем хранить | Как записать |
|---|---|---|
| Одно значение для всей базы (основная организация, адрес сервиса) | Константа | Константы.Имя.Установить(Значение) |
| Своя настройка каждого пользователя | ХранилищеОбщихНастроек | ХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Значение) |
| Файл, картинка, структура в реквизите объекта | Реквизит типа ХранилищеЗначения | Новый ХранилищеЗначения(Данные, Новый СжатиеДанных(9)) |
Пример с настройкой пользователя:
// запись
ХранилищеОбщихНастроек.Сохранить("СверкаРасчетов", "ПоследнийКонтрагент", Контрагент);
// чтение; если ничего не сохранено, вернётся Неопределено
Контрагент = ХранилищеОбщихНастроек.Загрузить("СверкаРасчетов", "ПоследнийКонтрагент");
В конфигурациях на БСП для этого есть обёртки ОбщегоНазначения.ХранилищеОбщихНастроекСохранить и ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить: они сами обрабатывают недостаток прав.
Из реквизита типа ХранилищеЗначения значение достают методом Получить(). В запросе такое поле прочитать можно, но отобрать или отсортировать по нему нельзя — для поиска храните ключевые данные в обычных реквизитах рядом.
💡 Значение константы в пользовательском режиме удобно проверить без кода: в окне «Функции для технического специалиста» раскройте ветку «Константы». Команда открытия этого окна включается в настройках параметров программы из главного меню.
Почему параметр не устанавливается: разбор ошибок
Если ошибка не воспроизводится в отладке, а у пользователя есть, проверьте две вещи: права его ролей и сохранённые настройки отчёта. Отладчик под администратором часто скрывает именно права. Удобнее всего войти под этим пользователем в копии базы или временно добавить ему роль для проверки — и вернуть всё обратно.
Частые вопросы
Можно ли передать в параметр запроса значение типа Неопределено?
Поле = &Параметр с Неопределено не найдёт пустые ссылки, потому что пустая ссылка и Неопределено — разные значения. Для пустой ссылки передавайте Справочники.Имя.ПустаяСсылка().Как посмотреть установленные параметры запроса в отладчике?
Параметры у переменной запроса в окне «Вычислить выражение» или в табло. Там видны все имена и значения, которые уже переданы.