Разработка и Конфигурация · 10 мин
Как передать значение в 1С: способы и примеры
Как передать значение в 1С: передача параметров в процедуры и функции, между формами, через структуры и временное хранилище. Примеры кода и типичные ошибки.
Передача значений — базовая операция при разработке и доработке конфигураций 1С. Значение может потребоваться передать в процедуру или функцию, из одной формы в другую, между клиентом и сервером, в отчёт или в фоновое задание. Каждый сценарий имеет свои механизмы, ограничения и типичные ошибки, из-за которых код либо не работает, либо ведёт себя непредсказуемо.
В платформе 1С:Предприятие 8.3 значения передаются по значению (копия данных) и по ссылке (через параметр с ключевым словом «Знач» управляет этим разработчик). Понимание разницы критично: при передаче по ссылке вызываемая процедура может изменить исходную переменную, что часто становится источником трудноуловимых ошибок.
Ниже разобраны основные способы передачи значений с примерами кода на встроенном языке, критерии выбора подходящего механизма и способы проверки результата.
Как передать значение в процедуру или функцию
Самый частый случай — передача значения внутри одного модуля или между общими модулями. Параметры объявляются в заголовке процедуры или функции через запятую. Без ключевого слова параметр передаётся по ссылке: изменения внутри вызванного кода отразятся на переменной вызывающего.
Процедура РассчитатьСкидку(Сумма, ПроцентСкидки, Результат)
Результат = Сумма - Сумма * ПроцентСкидки / 100;
КонецПроцедуры
Итог = 0;
РассчитатьСкидку(1000, 10, Итог);
// Итог = 900
Если нужно защитить исходную переменную от изменений, используйте ключевое слово Знач — в процедуру попадёт копия:
Процедура Обработать(Знач Номенклатура, Знач Количество)
// изменения Номенклатура и Количество не выйдут наружу
КонецПроцедуры
Функция возвращает значение оператором Возврат. Это предпочтительный способ получить результат, когда он один: код читается проще, чем при передаче результата через параметр по ссылке.
Как передать значение между формами
Передача данных между формами — самая частая задача при доработке интерфейса. Основной инструмент — параметры формы, которые передаются структурой при открытии.
Передача при открытии формы
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Контрагент", ТекущийКонтрагент);
ПараметрыФормы.Вставить("Период", ТекущаяДатаСеанса());
ОткрытьФорму("Обработка.ПечатьДоговора.Форма", ПараметрыФормы, ЭтотОбъект);
В открываемой форме значения доступны через объект Параметры в обработчике ПриСозданииНаСервере. Если у реквизита формы включён флаг «Ключевой параметр», значение из структуры подставится в него автоматически при совпадении имён.
Возврат значения из формы
Обратную передачу делают двумя способами. Первый — Закрыть(Значение) с обработчиком ожидания через ОписаниеОповещения у ОткрытьФорму. Второй — универсальный механизм Оповестить(ИмяСобытия, Параметр, Источник) и обработчик ОбработкаОповещения в форме-получателе.
- 1Сформируйте структуру с нужными значениями в форме-источнике
- 2Вызовите ОткрытьФорму с этой структурой и укажите владельца формы
- 3В открываемой форме прочитайте значения в ПриСозданииНаСервере
- 4Для возврата результата используйте Закрыть(Результат) или Оповестить
- 5Проверьте, что форма-получатель корректно обрабатывает отсутствие параметра
Передача значений между клиентом и сервером
В управляемом приложении клиентская и серверная части разделены, и между ними можно передавать не любые типы. Допустимы примитивные типы (число, строка, дата, булево), ссылки на объекты, структуры, массивы, таблицы значений и некоторые другие сериализуемые типы. Нельзя передать, например, объект типа «СправочникОбъект» — на сервере его нужно получить заново по ссылке.
Для передачи больших объёмов данных (файлов, таблиц, макетов) используется временное хранилище: на сервере значение помещается функцией ПоместитьВоВременноеХранилище(Значение, УникальныйИдентификаторФормы), а на клиенте доступен адрес хранилища. Привязка к идентификатору формы гарантирует, что данные живут, пока открыта форма.
АдресХранилища = ПоместитьВоВременноеХранилище(ТаблицаДанных, УникальныйИдентификатор);
Возврат АдресХранилища;
Передача нескольких значений: структуры и соответствия
Когда нужно передать набор разнородных значений, их упаковывают в структуру — это стандартный «контейнер» в 1С. Ключи структуры — строки, значения — любые сериализуемые типы. Структура удобна для параметров форм, настроек отчётов, пакетной передачи данных в процедуры.
Если ключи не являются строками или их состав динамический, используют соответствие. Для упорядоченных однотипных данных — массив. Выбор контейнера определяется логикой задачи, а не привычкой.
Сравнение вариантов упаковки значений
Именованные поля, удобна для параметров форм и настроек. Ограничение: ключи — только строки, состав фиксирован при создании кода.
Ключи любого типа, состав формируется динамически. Менее читаемо при передаче фиксированных наборов.
Однотипные значения с доступом по индексу. Не подходит для именованных данных.
Передача значения в фоновое задание и внешние механизмы
Фоновые задания запускаются методом ФоновыеЗадания.Выполнить, куда третьим параметром передаётся массив параметров. Ограничения те же, что при клиент-серверном взаимодействии: только сериализуемые типы. Результат работы фонового задания возвращают через временное хранилище — адрес передают в параметрах, а задание помещает туда результат.
При обмене с внешними системами (веб-сервисы, HTTP-запросы, файлы) значения сериализуются в XML, JSON или другой формат. Для JSON в платформе есть объект ЗаписьJSON/ЧтениеJSON. Здесь важно помнить о преобразовании типов: дата 1С, ссылка и уникальный идентификатор не имеют прямых аналогов в JSON и требуют явного приведения к строке.
При отладке передачи параметров в фоновое задание ошибки часто «немые»: задание падает, а сообщение видно только в журнале регистрации. Всегда проверяйте состояние фонового задания и поле ИнформацияОбОшибке, а не только факт завершения.
Как проверить, что значение передано корректно
Простейший способ проверки — отладчик: точка останова в вызываемой процедуре и просмотр значений параметров в табло. Убедитесь, что тип и содержимое соответствуют ожиданиям, особенно если значение прошло через несколько уровней вызовов.
Для проверки без отладчика используйте Сообщить() с представлением значения или запись в журнал регистрации через ЗаписьЖурналаРегистрации. При передаче между формами проверяйте наличие ключа в структуре параметров методом Свойство("ИмяКлюча", Значение) — это защитит от ошибки обращения к несуществующему полю.
Как проверить результат
Совпадает с ожидаемым (ссылка, число, структура)
Неопределено или строка вместо ссылки — значение потеряно на одном из уровней
Свойство() возвращает Истина и заполненное значение
Ключа нет — опечатка в имени при Вставить() или при чтении
Переменная меняется только там, где это задумано
Исходные данные «портаются» — параметр передан по ссылке вместо Знач
Типичные ошибки при передаче значений
Большинство проблем с передачей значений сводятся к нескольким повторяющимся причинам. Их знание экономит часы отладки.
Отдельная группа ошибок — передача значений в толстом клиенте обычного приложения и в управляемом приложении по старым привычкам. Код, работавший в обычных формах (например, прямое обращение к реквизитам чужой формы), в управляемом приложении не сработает: там действует строгое разделение контекстов.
FAQ: частые вопросы о передаче значений в 1С
Как передать таблицу значений в другую форму?
Через временное хранилище: поместите таблицу функцией ПоместитьВоВременноеХранилище с указанием УникальныйИдентификатор формы-получателя, передайте адрес в параметрах формы, а в ПриСозданииНаСервере извлеките её через ПолучитьИзВременногоХранилища. Напрямую в структуру параметров таблицу лучше не вкладывать.
Чем передача по значению отличается от передачи по ссылке?
По умолчанию параметр передаётся по ссылке: вызванная процедура работает с той же переменной и может её изменить. Ключевое слово «Знач» создаёт копию — изменения не выйдут за пределы процедуры. Для чтения данных обычно безопаснее «Знач», для возврата нескольких результатов — параметры по ссылке.
Как вернуть несколько значений из функции?
Функция возвращает одно значение, поэтому упакуйте результаты в структуру и верните её. Альтернатива — процедура с параметрами по ссылке, но структура делает код нагляднее и упрощает расширение набора возвращаемых данных.
Почему параметр формы равен Неопределено, хотя я его передавал?
Чаще всего причина в несовпадении имён: ключ в структуре при вызове ОткрытьФорму отличается от имени, по которому читают значение. Также проверьте, что чтение выполняется в ПриСозданииНаСервере, а не позже, и что форма открывается именно вашим вызовом, а не из другого места без параметров.
Можно ли передать значение в регламентное задание?
Напрямую при старте — нет, регламентные задания запускаются планировщиком без параметров. Обычно нужные данные сохраняют в константах, регистрах сведений или параметрах самого задания в метаданных и читают внутри обработчика. Для разовых запусков с параметрами используют фоновые задания.
Как передать значение из 1С на внешний сайт или API?
Сформируйте HTTP-запрос через HTTPСоединение и HTTPЗапрос: значения передаются в строке запроса, заголовках или теле в формате JSON/XML. Ссылочные типы и даты предварительно приведите к строковому представлению, понятному принимающей стороне.
Что важно запомнить
Внутри модуля передавайте значения параметрами, защищая исходные данные словом «Знач». Между формами — структурой параметров и оповещениями, между клиентом и сервером — только сериализуемыми типами, большие данные — через временное хранилище. Проверяйте тип и наличие значения в точке приёмки: большинство ошибок — это опечатки в именах ключей и потерянное Неопределено.