К статье
Практический материал

Разработка и Конфигурация · 10 мин

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

Как передать значение в 1С: передача параметров в процедуры и функции, между формами, через структуры и временное хранилище. Примеры кода и типичные ошибки.

Передача значений — базовая операция при разработке и доработке конфигураций 1С. Значение может потребоваться передать в процедуру или функцию, из одной формы в другую, между клиентом и сервером, в отчёт или в фоновое задание. Каждый сценарий имеет свои механизмы, ограничения и типичные ошибки, из-за которых код либо не работает, либо ведёт себя непредсказуемо.

В платформе 1С:Предприятие 8.3 значения передаются по значению (копия данных) и по ссылке (через параметр с ключевым словом «Знач» управляет этим разработчик). Понимание разницы критично: при передаче по ссылке вызываемая процедура может изменить исходную переменную, что часто становится источником трудноуловимых ошибок.

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

Как передать значение в процедуру или функцию

Самый частый случай — передача значения внутри одного модуля или между общими модулями. Параметры объявляются в заголовке процедуры или функции через запятую. Без ключевого слова параметр передаётся по ссылке: изменения внутри вызванного кода отразятся на переменной вызывающего.

Процедура РассчитатьСкидку(Сумма, ПроцентСкидки, Результат)

Результат = Сумма - Сумма * ПроцентСкидки / 100;

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

Итог = 0;

РассчитатьСкидку(1000, 10, Итог);

// Итог = 900

Если нужно защитить исходную переменную от изменений, используйте ключевое слово Знач — в процедуру попадёт копия:

Процедура Обработать(Знач Номенклатура, Знач Количество)

// изменения Номенклатура и Количество не выйдут наружу

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

Функция возвращает значение оператором Возврат. Это предпочтительный способ получить результат, когда он один: код читается проще, чем при передаче результата через параметр по ссылке.

Как передать значение между формами

Передача данных между формами — самая частая задача при доработке интерфейса. Основной инструмент — параметры формы, которые передаются структурой при открытии.

Передача при открытии формы

ПараметрыФормы = Новый Структура;

ПараметрыФормы.Вставить("Контрагент", ТекущийКонтрагент);

ПараметрыФормы.Вставить("Период", ТекущаяДатаСеанса());

ОткрытьФорму("Обработка.ПечатьДоговора.Форма", ПараметрыФормы, ЭтотОбъект);

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

Возврат значения из формы

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

Порядок действий при передаче между формами
  1. 1
    Сформируйте структуру с нужными значениями в форме-источнике
  2. 2
    Вызовите ОткрытьФорму с этой структурой и укажите владельца формы
  3. 3
    В открываемой форме прочитайте значения в ПриСозданииНаСервере
  4. 4
    Для возврата результата используйте Закрыть(Результат) или Оповестить
  5. 5
    Проверьте, что форма-получатель корректно обрабатывает отсутствие параметра

Передача значений между клиентом и сервером

В управляемом приложении клиентская и серверная части разделены, и между ними можно передавать не любые типы. Допустимы примитивные типы (число, строка, дата, булево), ссылки на объекты, структуры, массивы, таблицы значений и некоторые другие сериализуемые типы. Нельзя передать, например, объект типа «СправочникОбъект» — на сервере его нужно получить заново по ссылке.

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

АдресХранилища = ПоместитьВоВременноеХранилище(ТаблицаДанных, УникальныйИдентификатор);

Возврат АдресХранилища;

Передача нескольких значений: структуры и соответствия

Когда нужно передать набор разнородных значений, их упаковывают в структуру — это стандартный «контейнер» в 1С. Ключи структуры — строки, значения — любые сериализуемые типы. Структура удобна для параметров форм, настроек отчётов, пакетной передачи данных в процедуры.

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

Сравнение вариантов упаковки значений

Структура

Именованные поля, удобна для параметров форм и настроек. Ограничение: ключи — только строки, состав фиксирован при создании кода.

Соответствие

Ключи любого типа, состав формируется динамически. Менее читаемо при передаче фиксированных наборов.

Массив

Однотипные значения с доступом по индексу. Не подходит для именованных данных.

Передача значения в фоновое задание и внешние механизмы

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

При обмене с внешними системами (веб-сервисы, HTTP-запросы, файлы) значения сериализуются в XML, JSON или другой формат. Для JSON в платформе есть объект ЗаписьJSON/ЧтениеJSON. Здесь важно помнить о преобразовании типов: дата 1С, ссылка и уникальный идентификатор не имеют прямых аналогов в JSON и требуют явного приведения к строке.

При отладке передачи параметров в фоновое задание ошибки часто «немые»: задание падает, а сообщение видно только в журнале регистрации. Всегда проверяйте состояние фонового задания и поле ИнформацияОбОшибке, а не только факт завершения.
ПЗ
Практическое замечание

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

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

Для проверки без отладчика используйте Сообщить() с представлением значения или запись в журнал регистрации через ЗаписьЖурналаРегистрации. При передаче между формами проверяйте наличие ключа в структуре параметров методом Свойство("ИмяКлюча", Значение) — это защитит от ошибки обращения к несуществующему полю.

Контрольные точки

Как проверить результат

Тип параметра в точке приёмки
Норма

Совпадает с ожидаемым (ссылка, число, структура)

Тревожный признак

Неопределено или строка вместо ссылки — значение потеряно на одном из уровней

Наличие ключа в структуре параметров
Норма

Свойство() возвращает Истина и заполненное значение

Тревожный признак

Ключа нет — опечатка в имени при Вставить() или при чтении

Изменение исходной переменной
Норма

Переменная меняется только там, где это задумано

Тревожный признак

Исходные данные «портаются» — параметр передан по ссылке вместо Знач

Типичные ошибки при передаче значений

Большинство проблем с передачей значений сводятся к нескольким повторяющимся причинам. Их знание экономит часы отладки.

Типичные ошибки
01
Опечатка в имени ключа структуры: вставили «Контрагент», читают «Контрагент1» — значение молча теряется, ошибки нет
02
Передача Неопределено из-за незаполненной переменной-источника без предварительной проверки
03
Попытка передать объект (а не ссылку) между клиентом и сервером — ошибка сериализации
04
Изменение параметра по ссылке там, где вызывающий код этого не ожидает
05
Чтение Параметры.ИмяКлюча напрямую без проверки — ошибка, если форму открыли без параметра
06
Использование временного хранилища без привязки к форме — данные удаляются раньше времени

Отдельная группа ошибок — передача значений в толстом клиенте обычного приложения и в управляемом приложении по старым привычкам. Код, работавший в обычных формах (например, прямое обращение к реквизитам чужой формы), в управляемом приложении не сработает: там действует строгое разделение контекстов.

FAQ: частые вопросы о передаче значений в 1С

Как передать таблицу значений в другую форму?

Через временное хранилище: поместите таблицу функцией ПоместитьВоВременноеХранилище с указанием УникальныйИдентификатор формы-получателя, передайте адрес в параметрах формы, а в ПриСозданииНаСервере извлеките её через ПолучитьИзВременногоХранилища. Напрямую в структуру параметров таблицу лучше не вкладывать.

Чем передача по значению отличается от передачи по ссылке?

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

Как вернуть несколько значений из функции?

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

Почему параметр формы равен Неопределено, хотя я его передавал?

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

Можно ли передать значение в регламентное задание?

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

Как передать значение из 1С на внешний сайт или API?

Сформируйте HTTP-запрос через HTTPСоединение и HTTPЗапрос: значения передаются в строке запроса, заголовках или теле в формате JSON/XML. Ссылочные типы и даты предварительно приведите к строковому представлению, понятному принимающей стороне.

Итог

Что важно запомнить

Внутри модуля передавайте значения параметрами, защищая исходные данные словом «Знач». Между формами — структурой параметров и оповещениями, между клиентом и сервером — только сериализуемыми типами, большие данные — через временное хранилище. Проверяйте тип и наличие значения в точке приёмки: большинство ошибок — это опечатки в именах ключей и потерянное Неопределено.