В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает задача не просто открыть форму нового элемента справочника, но и сразу заполнить некоторые его реквизиты (например, наименование, родителя или специфические признаки) данными из вызывающей процедуры. Рассмотрим подробно, как это реализовать максимально эффективно и какими методами располагает разработчик для решения этой задачи.
Это наиболее «чистый» и рекомендуемый способ с точки зрения архитектуры платформы 7.7. Суть его заключается в том, что мы передаем данные во второй параметр функции ОткрытьФорму, а внутри модуля формы справочника принимаем их и присваиваем нужным атрибутам.
Разберем по шагам реализацию этого метода. Сначала проанализируем код в вызывающей форме (например, в обработке или другом справочнике):
// Создаем список значений для передачи нескольких параметров
Парам = СоздатьОбъект("СписокЗначений");
Парам.Установить("Название", "123");
Парам.Установить("СпецУсловие", 1);
// Открываем форму нового элемента
ОткрытьФорму("Элемент.Клиенты", Парам);
Теперь выясним, что происходит в модуле формы самого справочника Клиенты. Для перехвата момента создания нового элемента нам понадобится предопределенная процедура ВводНового(). Она вызывается системой в момент создания объекта, но еще до того, как форма будет отрисована на экране.
Процедура ВводНового(Копирование)
// Проверяем, переданы ли параметры
Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
// Извлекаем данные и присваиваем реквизитам формы
Наименование = Форма.Параметр.Получить("Название");
// Здесь можно заполнить и другие реквизиты
КонецЕсли;
КонецПроцедуры
Важный нюанс: Почему мы используем именно ВводНового(), а не ПриОткрытии()? Процедура ВводНового() отрабатывает раньше, что позволяет инициализировать объект в «чистом» состоянии. Если использовать ПриОткрытии(), форма может визуально «моргнуть» при обновлении данных, а в некоторых случаях стандартные проверки системы могут сработать некорректно.
Проанализируем более динамичный способ, который позволяет управлять формой прямо из вызывающего кода. Метод ОткрытьФорму в 1С 7.7 имеет интересную особенность: во второй параметр (который мы использовали для передачи данных) система возвращает контекст открытой формы после того, как метод отработает.
Посмотрим на пример реализации:
Перем Конт; // Переменная для контекста
// Вызываем открытие формы
// Система поместит контекст открытой формы в переменную Конт
Если ОткрытьФорму("Элемент.Клиенты", Конт) = 1 Тогда
// Теперь мы можем напрямую обращаться к атрибутам формы через контекст
Конт.Наименование = "123";
Конт.ТипКлиента = Перечисление.ТипыКлиентов.Оптовик;
КонецЕсли;
Этот метод кажется более коротким, так как не требует написания кода внутри самого справочника. Однако у него есть ряд ограничений:
ОткрытьФормуМодально(), этот способ не сработает. При модальном вызове исполнение кода в вызывающей процедуре полностью останавливается до момента закрытия окна. Следовательно, когда управление вернется в следующую строку, формы уже не будет существовать.Рассмотрим ситуацию, когда наш справочник Клиенты является подчиненным. В этом случае простого заполнения наименования недостаточно. Если мы создаем новый элемент программно, система должна знать, кто является владельцем.
Проанализируем, как правильно передать владельца при открытии:
КонтВладельца = ТекущийЭлемент(); // Например, ссылка на Группу компаний
Парам = СоздатьОбъект("СписокЗначений");
Парам.Установить("Владелец", КонтВладельца);
Парам.Установить("Наименование", "Новый филиал");
ОткрытьФорму("Элемент.Клиенты", Парам);
В модуле формы справочника в процедуре ВводНового() обязательно нужно использовать метод ИспользоватьВладельца(), иначе запись элемента будет невозможна.
Выясним причины, по которым следует предпочесть тот или иной подход в зависимости от задачи:
Форма.Параметр и СписокЗначений является универсальным стандартом для 1С 7.7. Это позволяет передавать структуры данных любой сложности (таблицы значений, другие списки, объекты).ВводНового().Конт.Наименование = ...) удобно для разовых задач в обработках, когда не хочется менять структуру типовой конфигурации.Важный совет: При работе с контекстом всегда проверяйте результат выполнения функции ОткрытьФорму(). Если она вернет 0 (форма не открылась по каким-то причинам), обращение к Конт.Наименование вызовет фатальную ошибку исполнения кода.
Таким образом, мы разобрали основные механизмы взаимодействия между формами в 1С 7.7. Комбинируя передачу параметров через СписокЗначений и грамотную обработку в предопределенных процедурах, можно добиться надежной и быстрой работы интерфейса вашего решения.