Параметры в 1С 8.3: откуда берётся значение и как его передать

· 9 мин

Содержание

Значение параметра в 1С задают по-разному в зависимости от того, где он объявлен. В тексте запроса это &ИмяПараметра, а значение передают методом Запрос.УстановитьПараметр("ИмяПараметра", Значение). В отчёте на системе компоновки (СКД) значение задают на вкладке «Параметры» схемы или в коде через ПараметрыДанных.УстановитьЗначениеПараметра(). Форме значение передают структурой в ОткрытьФорму(), параметру сеанса — присваиванием в модуле сеанса.

Какой способ выбрать? Если значение меняется при каждом вызове (дата, организация, список товаров), это параметр запроса или отчёта. Если оно одинаково для всей базы (валюта учёта, основная организация), его держат в константе. Если оно зависит от пользователя или сеанса, подойдёт параметр сеанса или хранилище настроек. Всё ниже относится к платформе 8.3 и не зависит от конфигурации: в БП, ЗУП и УТ механизмы одинаковые.

Какие бывают параметры в 1С и где задаётся значение

Слово «параметр» в 1С обозначает несколько разных механизмов. Путаница между ними — частая причина вопросов «я задал значение, а оно не работает ».

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

Если вы правите типовую конфигурацию, новые параметры формы, параметры сеанса и константы добавляйте в расширение. Так изменения переживут обновление релиза.

Как задать значение параметра в запросе 1С

Параметр в тексте запроса начинается с амперсанда. Имя должно совпадать с тем, что вы передаёте в УстановитьПараметр, регистр букв не важен.

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

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

Выборка = Запрос.Выполнить().Выбрать();

Запрос.Параметры — обычная структура. Метод УстановитьПараметр по сути делает Параметры.Вставить(), поэтому повторный вызов с тем же именем просто перезапишет значение.

Какой тип значения передавать

  • 📅 Дата. Для условия МЕЖДУ границы приводите к началу и концу дня, иначе документы последнего дня после 00:00:00 выпадут.
  • 📋 Список. Для условия В (&Склады) передавайте Массив, СписокЗначений или ФиксированныйМассив. Одно значение тоже сработает.
  • 📦 Таблица. Таблицу значений можно передать параметром и выбрать из неё: ВЫБРАТЬ … ПОМЕСТИТЬ ВТТовары ИЗ &ТаблицаТоваров КАК Т. У колонок таблицы должны быть заданы типы через ОписаниеТипов, иначе запрос не поймёт, что в них лежит.
  • ⏱ Момент времени. Для виртуальных таблиц остатков удобно передать Новый Граница(Документ.МоментВремени(), ВидГраницы.Включая) — так остаток считается с учётом движений самого документа.

Параметры работают и внутри параметров виртуальных таблиц:

"ВЫБРАТЬ
|	Остатки.Номенклатура,
|	Остатки.КоличествоОстаток
|ИЗ
|	РегистрНакопления.ТоварыНаСкладах.Остатки(&Граница, Склад = &Склад) КАК Остатки"

Условие внутри скобок виртуальной таблицы фильтрует данные до расчёта остатков. Условие в ГДЕ — после. Для отбора по складу или организации первый вариант быстрее.

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

В конструкторе запроса параметр появляется, когда вы пишете условие с & на вкладке условий или в параметрах виртуальной таблицы. Значений конструктор не задаёт — он только формирует текст.

Значения для отладки вводят в обработке «Консоль запросов». После вставки текста она находит все &-параметры и показывает их списком, где для каждого выбирают тип и значение. То же самое в коде делает метод Запрос.НайтиПараметры(): он возвращает описание всех параметров, которые есть в тексте.

Параметры отчёта на СКД: в схеме, в настройках и из кода

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

  • 🏷 Заголовок — как параметр подписан у пользователя.
  • 🧩 Тип — дата, ссылка, число и т.д.
  • ✏️ Значение — значение по умолчанию.
  • 📋 Доступен список значений — разрешает передать несколько значений сразу.
  • 🧮 Выражение — формула, которой параметр вычисляется из других. Классический пример: параметр НачалоПериода с выражением &Период.ДатаНачала, где Период имеет тип «Стандартный период».
  • 🔒 Ограничение доступности — скрывает параметр от пользователя, если значение вычисляется или передаётся программно.

Чтобы пользователь видел поле параметра над отчётом, на вкладке «Настройки» включите параметр в пользовательские настройки (свойства элемента, режим быстрого доступа). Тогда значение задают прямо в форме отчёта, без открытия настроек.

Как задать параметр СКД программно

Чаще всего это нужно в модуле отчёта, когда значение берётся из контекста, или при открытии отчёта из другой формы.

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

Если нужно проверить, есть ли параметр, и задать признак использования отдельно:

Параметр = КомпоновщикНастроек.Настройки.ПараметрыДанных.НайтиЗначениеПараметра(
	Новый ПараметрКомпоновкиДанных("Склад"));
Если Параметр <> Неопределено Тогда
	Параметр.Значение = Склад;
	Параметр.Использование = Истина;
КонецЕсли;

У параметра СКД есть флажок «Использование». Если он снят, значение игнорируется, и запрос получает значение из схемы или пустое. Это первое, что стоит проверить, когда отчёт «не видит» переданную дату.

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

Параметры формы и параметры сеанса

Передать значение в форму

Собственный параметр формы создают в редакторе формы на вкладке «Параметры»: имя и тип. Значение передают структурой при открытии:

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Контрагент", Контрагент);
ПараметрыФормы.Вставить("ТолькоПросмотр", Истина);
ОткрытьФорму("Документ.СчетНаОплатуПокупателю.ФормаСписка", ПараметрыФормы);

Читают его в обработчике ПриСозданииНаСервере через Параметры.Контрагент. Есть и стандартные параметры: Ключ открывает конкретный объект, Отбор накладывает отбор на список, РежимВыбора открывает форму для выбора значения.

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

Задать параметр сеанса

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

Значения задают в модуле сеанса, в процедуре УстановкаПараметровСеанса(ТребуемыеПараметры):

Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
	ПараметрыСеанса.ОсновнойСклад = ПолучитьОсновнойСклад();
КонецПроцедуры

Процедура вызывается при первом обращении к неустановленному параметру. В ТребуемыеПараметры платформа передаёт имена тех, что нужны прямо сейчас, — это позволяет не вычислять всё при старте.

Для чтения и записи параметра сеанса у роли должны быть соответствующие права. Модуль сеанса выполняется в привилегированном режиме, поэтому там ограничений нет, а в обычном коде попытка записи без права вызовет ошибку.

Предопределённые значения и константы вместо параметра

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

"ГДЕ
|	Хозрасчетный.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.РасчетыСПоставщиками)
|	И Хозрасчетный.Валюта <> ЗНАЧЕНИЕ(Справочник.Валюты.ПустаяСсылка)"

Внутри ЗНАЧЕНИЕ() допустимы только предопределённые элементы, значения перечислений и пустые ссылки. Обычный элемент справочника по наименованию так не получить — для него нужен параметр.

В коде модулей те же значения получают так:

Где пишете кодКак получить значение
СерверПланыСчетов.Хозрасчетный.РасчетыСПоставщиками или Перечисления.ВидыОпераций.Продажа
Клиент и общий кодПредопределенноеЗначение("Перечисление.ВидыОпераций.Продажа")
Текст запросаЗНАЧЕНИЕ(Перечисление.ВидыОпераций.Продажа)

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

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

Не меняйте константы типовой базы напрямую через конфигуратор или обработку, если не понимаете, какие функциональные опции от них зависят. Отключение константы может скрыть документы и реквизиты у всех пользователей.

Значение из внешних источников: строка запуска, файл, хранилище настроек

Иногда значение параметра приходит снаружи 1С: от скрипта запуска, из файла настроек или с другого сервера.

Параметр запуска

Строка после ключа /C в командной строке запуска попадает в глобальную переменную ПараметрЗапуска:

"C:\Program Files\1cv8\common\1cestart.exe" ENTERPRISE /F"D:\Bases\Trade" /C"Режим=Выгрузка;Склад=Основной"

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

Файл настроек

Для настроек интеграций (адрес сервиса, логин, путь к папке обмена) удобен JSON-файл. Его читают на сервере:

Чтение = Новый ЧтениеJSON;
Чтение.ОткрытьФайл("D:\Exchange\settings.json");
Настройки = ПрочитатьJSON(Чтение);
Чтение.Закрыть();

Запрос.УстановитьПараметр("ПапкаОбмена", Настройки.ПапкаОбмена);

ПрочитатьJSON без второго параметра возвращает структуру, поэтому ключи в файле должны быть допустимыми именами — латиница или кириллица без пробелов.

В клиент-серверном варианте путь к файлу указывается относительно сервера 1С, а не компьютера пользователя. Файл должен лежать там, куда есть доступ у пользователя, под которым работает служба сервера.

Хранилище настроек

Значение, которое пользователь задал один раз и хочет видеть в следующий раз, удобно сохранять в хранилище:

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

Данные сохраняются для текущего пользователя. Если ничего не сохранено, Загрузить вернёт Неопределено — предусмотрите значение по умолчанию.

Внешние источники данных

Если в конфигурации есть объект «Внешний источник данных», параметры подключения к чужой базе задают в коде через ВнешниеИсточникиДанных.ИмяИсточника.УстановитьОбщиеПараметрыСоединения(), передавая объект ПараметрыСоединенияВнешнегоИсточникаДанных со строкой соединения. Строку соединения лучше брать из константы или файла, а не держать в коде: пароль в тексте модуля увидит любой разработчик.

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

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

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

  1. Поставьте точку останова на строке Запрос.Выполнить().
  2. В табло вычислите Запрос.Параметры и раскройте структуру: видны имена, значения и типы.
  3. Скопируйте Запрос.Текст и вставьте его в консоль запросов. Задайте те же значения и посмотрите, что вернёт запрос.
  4. Если в консоли результат правильный, а в коде нет — разница в значении какого-то параметра. Сравнивайте по одному.

Для отчёта на СКД смотрите КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы: у каждого элемента видно значение и флажок использования.

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

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