В процессе разработки в среде 1С:Предприятие часто возникает задача взаимодействия между различными объектами системы. Типичный сценарий: пользователь находится в форме справочника (например, «Номенклатура») и нажимает кнопку, которая должна запустить обработку, при этом определенные данные из текущей карточки номенклатуры должны автоматически «перекочевать» в поля этой обработки. Несмотря на кажущуюся простоту, реализация этого механизма существенно различается в зависимости от того, используете ли вы Управляемые формы или Обычное приложение (Толстый клиент).
В этой статье мы подробно разберем оба подхода, проанализируем возможные ошибки, связанные с типами данных, и выясним, как сделать передачу параметров максимально надежной.
В современных конфигурациях на платформе 1С 8.3 работа с формами строится на клиент-серверном взаимодействии. Основной механизм передачи данных здесь — использование структуры параметров при открытии формы. Давайте разберем этот процесс по шагам.
Шаг 1. Вызов формы из справочника
В модуле формы справочника (на стороне клиента) нам необходимо сформировать структуру, где ключом будет имя параметра, а значением — те данные, которые мы хотим передать. Для открытия формы используется метод ОткрытьФорму.
&НаКлиенте
Процедура ВызватьОбработку(Команда)
// Формируем параметры. "Наименование" — это ключ, по которому мы обратимся в обработке
ПараметрыОткрытия = Новый Структура("Наименование", Объект.Наименование);
// Открываем форму обработки
ОткрытьФорму("Обработка.ИмяВашейОбработки.Форма.Форма", ПараметрыОткрытия);
КонецПроцедуры
Шаг 2. Прием данных в обработке
Теперь перейдем в модуль формы обработки. Чтобы данные из структуры параметров попали в реквизиты, нам нужно перехватить их в обработчике события ПриСозданииНаСервере. Важно помнить, что в управляемых формах объект Параметры доступен именно в этот момент.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, передан ли наш параметр, чтобы избежать ошибок
Если Параметры.Свойство("Наименование") Тогда
Объект.НаименованиеКровати = Параметры.Наименование;
КонецЕсли;
КонецПроцедуры
Если НаименованиеКровати является реквизитом самой формы (а не объекта обработки), то обращение будет выглядеть как ЭтаФорма.НаименованиеКровати.
Если вы работаете в таких конфигурациях, как «Управление производственным предприятием 1.3» или «Комплексная автоматизация 1.1», механизм «Параметры» в том виде, как он описан выше, может отсутствовать или работать иначе. В обычном приложении используется метод прямого обращения к свойствам формы после её инициализации, но до её открытия.
Рассмотрим подробнее алгоритм действий:
ПолучитьФорму. Это позволяет нам «подготовить» форму, не показывая её пользователю сразу.Открыть или ОткрытьМодально.Пример кода в модуле формы справочника:
Процедура КнопкаВыполнитьНажатие(Кнопка)
// Получаем форму по её имени в метаданных
ФормаОбработки = Обработки.СозданиеКровати.ПолучитьФорму("Форма");
// Передаем значение напрямую в реквизит формы (он должен быть доступен)
ФормаОбработки.НаименованиеКровати = Наименование;
// Теперь открываем уже заполненную форму
ФормаОбработки.Открыть();
КонецПроцедуры
Важное примечание для обычных форм: Чтобы программно присвоить значение реквизиту формы извне, убедитесь, что этот реквизит определен в списке реквизитов формы. Если вы пытаетесь передать данные в переменную, объявленную в модуле формы, она должна быть помечена ключевым словом Экспорт.
Иногда, даже если код написан без синтаксических ошибок, поле в обработке остается пустым. Рассмотрим причины такой ситуации:
1. Несоответствие типов данных
Проанализируем ситуацию: в справочнике реквизит Ссылка имеет тип СправочникСсылка.Номенклатура, а в обработке поле может иметь тип Строка. Если вы передадите ссылку в строковое поле без преобразования, 1С попытается выполнить приведение типов, что не всегда срабатывает автоматически при заполнении программно. Если же наоборот — вы передаете Наименование (строку) в поле с типом «Ссылка», оно гарантированно останется пустым, так как строка не является ссылкой.
2. Использование неправильного обработчика
В управляемых формах начинающие разработчики иногда пытаются получить данные из Параметры в процедуре ПриОткрытии (на клиенте). Однако на клиенте состав доступных параметров ограничен. Всегда используйте ПриСозданииНаСервере для первичной инициализации данных формы.
3. Имена параметров и реквизитов
Проверьте внимательно: не перепутали ли вы имя ключа в структуре и имя параметра. Например, если вы написали Новый Структура("Название", ...), то и искать нужно Параметры.Название, а не Параметры.Наименование.
Вместо того чтобы передавать только «Наименование» (простую строку), мы рекомендуем передавать Ссылку на объект номенклатуры. Это гораздо более гибкий подход.
Почему это лучше? Имея ссылку в обработке, вы сможете в любой момент получить не только название, но и артикул, цену, единицу измерения или любые дополнительные реквизиты номенклатуры, не меняя код вызова в справочнике. Проанализируем пример:
// В справочнике
Параметры = Новый Структура("ОбъектВладелец", Объект.Ссылка);
ОткрытьФорму("Обработка.МояОбработка.Форма", Параметры);
// В обработке ПриСозданииНаСервере
Если Параметры.Свойство("ОбъектВладелец") Тогда
// Теперь нам доступны все данные
ИмяИзделия = Параметры.ОбъектВладелец.Наименование;
АртикулИзделия = Параметры.ОбъектВладелец.Артикул;
КонецЕсли;
Если ваша обработка не встроена в конфигурацию, а является внешним файлом (.epf), порядок действий немного меняется. Сначала нужно программно подключить внешнюю обработку, получить её имя, и только потом открывать форму.
// Пример для управляемого приложения
АдресХранилища = ПоместитьВоВременноеХранилище(ДвоичныеДанныеОбработки);
ИмяОбработки = ВнешниеОбработки.Подключить(АдресХранилища);
ОткрытьФорму("ВнешняяОбработка." + ИмяОбработки + ".Форма.ИмяФормы", Параметры);
В обычном приложении для этого используется метод ВнешниеОбработки.Создать(ПутьКФайлу), после чего вызывается ПолучитьФорму() у созданного объекта.
Подводя итог, можно сказать, что выбор метода передачи данных зависит прежде всего от режима работы вашего приложения. Для управляемых форм — это структура параметров, для обычных — прямое назначение свойств объекта формы. Тщательно следите за соответствием типов данных, и ваши формы будут работать корректно!