Как программно установить значения реквизитов при открытии формы нового элемента в 1С 7.7?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

В процессе разработки на платформе 1С:Предприятие 7.7 часто возникает задача не просто открыть форму нового элемента справочника, но и сразу заполнить некоторые его реквизиты (например, наименование, родителя или специфические признаки) данными из вызывающей процедуры. Рассмотрим подробно, как это реализовать максимально эффективно и какими методами располагает разработчик для решения этой задачи.

Способ 1: Использование механизма параметров формы и процедуры ВводНового()

Это наиболее «чистый» и рекомендуемый способ с точки зрения архитектуры платформы 7.7. Суть его заключается в том, что мы передаем данные во второй параметр функции ОткрытьФорму, а внутри модуля формы справочника принимаем их и присваиваем нужным атрибутам.

Разберем по шагам реализацию этого метода. Сначала проанализируем код в вызывающей форме (например, в обработке или другом справочнике):


// Создаем список значений для передачи нескольких параметров
Парам = СоздатьОбъект("СписокЗначений");
Парам.Установить("Название", "123");
Парам.Установить("СпецУсловие", 1);

// Открываем форму нового элемента
ОткрытьФорму("Элемент.Клиенты", Парам);

Теперь выясним, что происходит в модуле формы самого справочника Клиенты. Для перехвата момента создания нового элемента нам понадобится предопределенная процедура ВводНового(). Она вызывается системой в момент создания объекта, но еще до того, как форма будет отрисована на экране.


Процедура ВводНового(Копирование)
    // Проверяем, переданы ли параметры
    Если ТипЗначенияСтр(Форма.Параметр) = "СписокЗначений" Тогда
        // Извлекаем данные и присваиваем реквизитам формы
        Наименование = Форма.Параметр.Получить("Название");
        // Здесь можно заполнить и другие реквизиты
    КонецЕсли;
КонецПроцедуры

Важный нюанс: Почему мы используем именно ВводНового(), а не ПриОткрытии()? Процедура ВводНового() отрабатывает раньше, что позволяет инициализировать объект в «чистом» состоянии. Если использовать ПриОткрытии(), форма может визуально «моргнуть» при обновлении данных, а в некоторых случаях стандартные проверки системы могут сработать некорректно.

Способ 2: Прямое обращение к контексту открытой формы

Проанализируем более динамичный способ, который позволяет управлять формой прямо из вызывающего кода. Метод ОткрытьФорму в 1С 7.7 имеет интересную особенность: во второй параметр (который мы использовали для передачи данных) система возвращает контекст открытой формы после того, как метод отработает.

Посмотрим на пример реализации:


Перем Конт; // Переменная для контекста
// Вызываем открытие формы
// Система поместит контекст открытой формы в переменную Конт
Если ОткрытьФорму("Элемент.Клиенты", Конт) = 1 Тогда
    // Теперь мы можем напрямую обращаться к атрибутам формы через контекст
    Конт.Наименование = "123";
    Конт.ТипКлиента = Перечисление.ТипыКлиентов.Оптовик;
КонецЕсли;

Этот метод кажется более коротким, так как не требует написания кода внутри самого справочника. Однако у него есть ряд ограничений:

  1. Модальный режим: Если вы используете ОткрытьФормуМодально(), этот способ не сработает. При модальном вызове исполнение кода в вызывающей процедуре полностью останавливается до момента закрытия окна. Следовательно, когда управление вернется в следующую строку, формы уже не будет существовать.
  2. Инициализация: В сложных конфигурациях при открытии формы может срабатывать тяжелая логика инициализации. Прямое присвоение значения через контекст сразу после открытия может конфликтовать с внутренними процедурами формы.

Особенности работы с подчиненными справочниками

Рассмотрим ситуацию, когда наш справочник Клиенты является подчиненным. В этом случае простого заполнения наименования недостаточно. Если мы создаем новый элемент программно, система должна знать, кто является владельцем.

Проанализируем, как правильно передать владельца при открытии:


КонтВладельца = ТекущийЭлемент(); // Например, ссылка на Группу компаний
Парам = СоздатьОбъект("СписокЗначений");
Парам.Установить("Владелец", КонтВладельца);
Парам.Установить("Наименование", "Новый филиал");

ОткрытьФорму("Элемент.Клиенты", Парам);

В модуле формы справочника в процедуре ВводНового() обязательно нужно использовать метод ИспользоватьВладельца(), иначе запись элемента будет невозможна.

Сравнение методов: когда и что выбирать

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

  1. Гибкость: Использование Форма.Параметр и СписокЗначений является универсальным стандартом для 1С 7.7. Это позволяет передавать структуры данных любой сложности (таблицы значений, другие списки, объекты).
  2. Читаемость кода: Если логика заполнения нового элемента специфична именно для этого справочника (например, заполнение полей по умолчанию), лучше инкапсулировать её внутри модуля справочника в ВводНового().
  3. Быстрые правки: Прямое обращение через контекст (Конт.Наименование = ...) удобно для разовых задач в обработках, когда не хочется менять структуру типовой конфигурации.

Важный совет: При работе с контекстом всегда проверяйте результат выполнения функции ОткрытьФорму(). Если она вернет 0 (форма не открылась по каким-то причинам), обращение к Конт.Наименование вызовет фатальную ошибку исполнения кода.

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

← На главную