Параметры в 1С 8.3: где их создают и как передают значение из кода

· 9 мин

Содержание

Чаще всего «установить параметр » в 1С 8.3 означает одну строку кода: Запрос.УстановитьПараметр("Организация", Организация). В тексте запроса параметр пишется с амперсандом (&Организация), а значение подставляет платформа перед выполнением. Для параметров сеанса, формы и отчёта на СКД способ другой, и права на них проверяются по-разному.

Типичная ситуация: разработчик дописывает отчёт по продажам, запускает его, а 1С отвечает Не задано значение параметра "КонецПериода". Или параметр задан, ошибки нет, но отчёт пустой. Обе проблемы решаются за пару минут, если понимать, какой именно параметр вы устанавливаете и где живёт его значение.

Какие параметры бывают в 1С 8.3 и чем они отличаются

Слово «параметр» в платформе относится к нескольким разным механизмам. У каждого своё место хранения и время жизни.

Вид параметраГде объявляютКак задают значениеСколько живёт значение
Параметр запросаВ тексте запроса: &ИмяЗапрос.УстановитьПараметр()До выполнения запроса
Параметр сеансаКонфигуратор: ветка Общие → Параметры сеансаМодуль сеанса, ПараметрыСеанса.Имя = …До конца сеанса пользователя
Параметр формыФорма: вкладка «Параметры»Структура в ОткрытьФорму()Пока форма открыта
Параметр данных СКДСхема компоновки, закладка «Параметры»ПараметрыДанных.УстановитьЗначениеПараметра()В настройках отчёта
Параметр функциональных опцийКонфигуратор: Общие → Параметры функциональных опцийУстановитьПараметрыФункциональныхОпцийИнтерфейса()Пока не переустановят

Если значение должно храниться между сеансами и после перезапуска, это уже не параметр, а константа или хранилище. О них ниже, в отдельном разделе.

Как создать параметр в Конфигураторе

Значение параметра в Конфигураторе не задаётся: там создают сам объект и описывают его тип. Значение появляется только в работающем сеансе.

Параметр сеанса

  1. Откройте Конфигурация → Открыть конфигурацию.
  2. В дереве раскройте Общие → Параметры сеанса.
  3. Нажмите «Добавить», укажите имя (например, ТекущийСклад) и тип — СправочникСсылка.Склады.
  4. Откройте роли, которым нужен параметр, и отметьте права «Получение» и, если требуется, «Установка».
  5. Напишите код установки в модуле сеанса (пример в следующем разделе).
  6. Сохраните конфигурацию и выполните Конфигурация → Обновить конфигурацию базы данных (F7).

В типовых конфигурациях на поддержке правка модуля сеанса снимает объект с поддержки или требует включить возможность изменения. Безопаснее добавить параметр сеанса и обработчик в расширение конфигурации.

Параметр формы

  1. Откройте форму в редакторе, перейдите на вкладку «Параметры» (рядом с «Реквизитами» и «Командами»).
  2. Добавьте параметр, задайте имя и тип.
  3. Если без него форма бессмысленна, установите флажок «Ключевой параметр»: тогда при разных значениях параметра откроются разные экземпляры формы.

Параметр данных в схеме компоновки

В конструкторе СКД параметр появляется сам, как только в тексте запроса набора данных встречается &Период. На закладке «Параметры» ему задают тип, значение по умолчанию и флажок «Ограничение доступности». Снятый флажок выводит параметр в пользовательские настройки отчёта.

Установить параметр запроса: метод УстановитьПараметр

Это самый частый случай. Порядок простой: написать текст с &Имя, передать значение, выполнить.

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|	Реализация.Ссылка КАК Ссылка,
|	Реализация.СуммаДокумента КАК Сумма
|ИЗ
|	Документ.РеализацияТоваровУслуг КАК Реализация
|ГДЕ
|	Реализация.Дата МЕЖДУ &НачалоПериода И &КонецПериода
|	И Реализация.Организация = &Организация
|	И Реализация.Проведен";

Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ДатаОтчета));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ДатаОтчета));
Запрос.УстановитьПараметр("Организация", Организация);

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
	Сообщить(СтрШаблон("%1: %2", Выборка.Ссылка, Формат(Выборка.Сумма, "ЧДЦ=2")));
КонецЦикла;

Что здесь важно на практике:

  • 📅 КонецМесяца() возвращает 23:59:59 последнего дня. Если передать просто дату 31.10 без времени, документы, проведённые днём 31-го, в выборку не попадут.
  • 🔤 Имя параметра не зависит от регистра: &организация и "Организация" совпадут. А опечатка в одной букве даст ошибку «не задано значение».
  • 🔁 Один параметр можно использовать в тексте сколько угодно раз, устанавливают его один раз.
  • 📦 Запрос.Параметры — это структура. Её можно заполнить заранее и передать целиком, например при переиспользовании одного запроса в цикле.

Список значений и массив

Для условия В (&Склады) передайте массив или список значений:

Склады = Новый Массив;
Склады.Добавить(ОсновнойСклад);
Склады.Добавить(СкладБрака);
Запрос.УстановитьПараметр("Склады", Склады);

Пустой массив ошибки не вызовет: запрос просто вернёт ноль строк. Если пустой массив должен означать «все склады», проверяйте это до формирования текста.

Таблица значений как параметр

Таблицу можно передать в запрос и поместить во временную таблицу: ВЫБРАТЬ … ПОМЕСТИТЬ ВТТовары ИЗ &Товары КАК Т. У колонок таблицы обязательно должны быть описаны типы (Новый ОписаниеТипов("СправочникСсылка.Номенклатура")). Колонка без типа — частая причина ошибки при выполнении.

Дата для виртуальных таблиц регистров

В параметр &Дата виртуальной таблицы остатков передавайте не голую дату, а границу или момент времени. Так учитываются движения самого документа или, наоборот, отсекаются:

// имя регистра условное
Запрос.УстановитьПараметр("Граница", Новый Граница(Документ.МоментВремени(), ВидГраницы.Исключая));

Параметры сеанса, формы и отчёта в режиме Предприятия

Параметр сеанса: модуль сеанса

Платформа вызывает процедуру УстановкаПараметровСеанса при старте сеанса и при первом обращении к ещё не установленному параметру. Во втором случае в ТребуемыеПараметры придёт массив имён.

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)

	Если ТребуемыеПараметры = Неопределено Тогда
		// старт сеанса: можно установить сразу всё
		ПараметрыСеанса.ТекущийСклад = СкладПоУмолчаниюПользователя(); // ваша функция
		Возврат;
	КонецЕсли;

	Для Каждого ИмяПараметра Из ТребуемыеПараметры Цикл
		Если ИмяПараметра = "ТекущийСклад" Тогда
			ПараметрыСеанса.ТекущийСклад = СкладПоУмолчаниюПользователя();
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

💡 Приём: тяжёлые параметры (запрос к базе, обращение к внешнему сервису) ставьте «лениво», только по ТребуемыеПараметры. Тогда запуск программы не замедляется, а значение вычисляется при первой надобности.

В конфигурациях на БСП модуль сеанса трогать не нужно. Обработчик своего параметра регистрируют в процедуре ОбщегоНазначенияПереопределяемый.ПриДобавленииОбработчиковУстановкиПараметровСеанса — её можно перехватить в расширении.

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

Параметр формы: открытие с данными

ПараметрыФормы = Новый Структура("Контрагент", Контрагент);
ОткрытьФорму("Обработка.СверкаРасчетов.Форма.Форма", ПараметрыФормы, ЭтотОбъект);

В самой форме значение читают в ПриСозданииНаСервере через Параметры.Контрагент. Позже, в других обработчиках, параметры уже недоступны для изменения, поэтому значение сразу переносят в реквизит формы.

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

Параметр отчёта на СКД

Настройки = КомпоновщикНастроек.Настройки;
Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("Период", ТекущаяДатаСеанса());

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

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

УстановитьПараметрыФункциональныхОпцийИнтерфейса(Новый Структура("Организация", ТекущаяОрганизация));

После вызова интерфейс перерисуется с учётом опций, которые зависят от выбранной организации. Метод вызывают на клиенте; на форме для этого есть отдельный метод УстановитьПараметрыФункциональныхОпцийФормы.

Права доступа и безопасность при установке параметров

Права на параметр сеанса

У параметра сеанса в роли два права: «Получение» и «Установка». Без «Получения» код в обычном режиме выдаст ошибку нарушения прав при чтении. Без «Установки» — при записи значения.

Модуль сеанса выполняется в привилегированном режиме, поэтому внутри УстановкаПараметровСеанса права роли не проверяются. Если значение нужно поменять позже, из другого серверного модуля, есть два пути:

  • 🔐 выдать роли право «Установка» (подходит, если пользователь вправе менять значение сам);
  • 🛡️ обернуть присваивание в УстановитьПривилегированныйРежим(Истина) … УстановитьПривилегированныйРежим(Ложь) в серверном модуле, где перед этим проверено, что пользователю можно это делать.

Параметры сеанса часто участвуют в ограничениях доступа на уровне записей (RLS). Если дать пользователю право «Установка» на такой параметр, он сможет подменить значение и увидеть чужие данные.

Параметры запроса вместо склейки строк

Никогда не вставляйте пользовательский ввод в текст запроса конкатенацией: "… ГДЕ Наименование = """ + СтрокаПоиска + """". Кавычка или служебное слово в строке поиска поменяют смысл запроса. Передача через УстановитьПараметр такой проблемы не имеет: значение не разбирается как часть текста.

Кроме того, запрос с параметрами платформа и СУБД кешируют лучше, чем десятки разных текстов с вклеенными значениями.

Права на константы и хранилище

Константы проверяются по правам «Чтение» и «Изменение» в роли. Для ХранилищеОбщихНастроек пользователь без административных прав может работать только со своими настройками; чтение и запись чужих — для администратора или в привилегированном режиме.

Когда параметр не подходит: константы и хранилище значений

Параметр сеанса пропадает при выходе пользователя. Если значение нужно помнить дольше, выберите подходящее хранилище.

ЗадачаЧем хранитьКак записать
Одно значение для всей базы (основная организация, адрес сервиса)КонстантаКонстанты.Имя.Установить(Значение)
Своя настройка каждого пользователяХранилищеОбщихНастроекХранилищеОбщихНастроек.Сохранить(КлючОбъекта, КлючНастроек, Значение)
Файл, картинка, структура в реквизите объектаРеквизит типа ХранилищеЗначенияНовый ХранилищеЗначения(Данные, Новый СжатиеДанных(9))

Пример с настройкой пользователя:

// запись
ХранилищеОбщихНастроек.Сохранить("СверкаРасчетов", "ПоследнийКонтрагент", Контрагент);

// чтение; если ничего не сохранено, вернётся Неопределено
Контрагент = ХранилищеОбщихНастроек.Загрузить("СверкаРасчетов", "ПоследнийКонтрагент");

В конфигурациях на БСП для этого есть обёртки ОбщегоНазначения.ХранилищеОбщихНастроекСохранить и ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить: они сами обрабатывают недостаток прав.

Из реквизита типа ХранилищеЗначения значение достают методом Получить(). В запросе такое поле прочитать можно, но отобрать или отсортировать по нему нельзя — для поиска храните ключевые данные в обычных реквизитах рядом.

💡 Значение константы в пользовательском режиме удобно проверить без кода: в окне «Функции для технического специалиста» раскройте ветку «Константы». Команда открытия этого окна включается в настройках параметров программы из главного меню.

Почему параметр не устанавливается: разбор ошибок

Диагностика: выберите симптом

Если ошибка не воспроизводится в отладке, а у пользователя есть, проверьте две вещи: права его ролей и сохранённые настройки отчёта. Отладчик под администратором часто скрывает именно права. Удобнее всего войти под этим пользователем в копии базы или временно добавить ему роль для проверки — и вернуть всё обратно.

Частые вопросы

Можно ли передать в параметр запроса значение типа Неопределено?
Можно. Условие Поле = &Параметр с Неопределено не найдёт пустые ссылки, потому что пустая ссылка и Неопределено — разные значения. Для пустой ссылки передавайте Справочники.Имя.ПустаяСсылка().
Как посмотреть установленные параметры запроса в отладчике?
Раскройте свойство Параметры у переменной запроса в окне «Вычислить выражение» или в табло. Там видны все имена и значения, которые уже переданы.
Сбрасываются ли параметры запроса после Выполнить()?
Нет. Объект запроса хранит их, пока вы его не пересоздадите. Это удобно в цикле: меняете один параметр и выполняете запрос снова, остальные остаются.
Можно ли менять параметр сеанса из обработки или фонового задания?
Да, на сервере и при наличии права «Установка» или в привилегированном режиме. У фонового задания свой сеанс: значение, установленное в нём, в сеанс пользователя не попадёт.
Чем параметр сеанса лучше глобальной переменной клиентского модуля?
Он доступен на сервере, в запросах и в ограничениях доступа, а клиентская переменная — только на клиенте. Зато на клиенте к параметру сеанса не обратиться без серверного вызова.