Параметры в 1С 8.3: откуда берётся значение и как его передать
Содержание
Значение параметра в 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С, а не компьютера пользователя. Файл должен лежать там, куда есть доступ у пользователя, под которым работает служба сервера.
Хранилище настроек
Значение, которое пользователь задал один раз и хочет видеть в следующий раз, удобно сохранять в хранилище:
ХранилищеОбщихНастроек.Сохранить("МояОбработка", "ПоследнийСклад", Склад);
Склад = ХранилищеОбщихНастроек.Загрузить("МояОбработка", "ПоследнийСклад");
Данные сохраняются для текущего пользователя. Если ничего не сохранено, Загрузить вернёт Неопределено — предусмотрите значение по умолчанию.
Внешние источники данных
Если в конфигурации есть объект «Внешний источник данных», параметры подключения к чужой базе задают в коде через ВнешниеИсточникиДанных.ИмяИсточника.УстановитьОбщиеПараметрыСоединения(), передавая объект ПараметрыСоединенияВнешнегоИсточникаДанных со строкой соединения. Строку соединения лучше брать из константы или файла, а не держать в коде: пароль в тексте модуля увидит любой разработчик.
Почему значение параметра не подставляется: проверка и отладка
УстановитьПараметр не совпадает с &Имя в тексте: опечатка, лишний пробел, латинская буква вместо кириллической. Сверьте имена через Запрос.НайтиПараметры().Запрос.Параметры в отладчике и проверьте тип каждого значения.Использование = Истина и проверьте режим доступности параметра.Порядок отладки, который быстрее всего находит причину:
- Поставьте точку останова на строке
Запрос.Выполнить(). - В табло вычислите
Запрос.Параметрыи раскройте структуру: видны имена, значения и типы. - Скопируйте
Запрос.Тексти вставьте его в консоль запросов. Задайте те же значения и посмотрите, что вернёт запрос. - Если в консоли результат правильный, а в коде нет — разница в значении какого-то параметра. Сравнивайте по одному.
Для отчёта на СКД смотрите КомпоновщикНастроек.Настройки.ПараметрыДанных.Элементы: у каждого элемента видно значение и флажок использования.
Частые вопросы
Можно ли передать в параметр запроса значение Неопределено?
Поле = &Параметр с таким значением отберёт записи, где поле тоже равно Неопределено, то есть обычно ничего. Если параметр необязательный, лучше менять текст запроса или писать условие (&Склад = Неопределено ИЛИ Склад = &Склад).Как задать параметр, если отбор нужен не всегда?
{ГДЕ Склад = &Склад}. Тогда компоновка добавит его, только если параметр используется.