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

Программист 1С v7.7
← На главную

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

Метод 1. Использование предопределенной процедуры ВводНового

Разберем наиболее технически правильный способ, который позволяет перехватить стандартное создание нового элемента. В форме списка справочника существует системная процедура ВводНового. Она срабатывает в тот момент, когда пользователь нажимает кнопку «Новая строка» или клавишу Ins.

Проанализируем алгоритм действий:

  1. В форме списка мы перехватываем событие создания.
  2. Отменяем стандартное создание элемента (чтобы не открылась пустая форма без параметров).
  3. Программно вызываем открытие формы элемента, передавая в качестве параметра нужные нам данные.

Пример реализации в форме списка:


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

В этом случае в открываемой форме элемента переданное значение можно будет получить через атрибут Форма.Параметр в процедуре ПриОткрытии.

Метод 2. Использование глобальных переменных

Если структура конфигурации сложная или передача через контекст по каким-то причинам неудобна, можно воспользоваться глобальным модулем. Рассмотрим ситуацию, когда параметр должен быть доступен «сквозь» несколько уровней вызовов. Выясним причину, почему разработчики часто выбирают этот путь: это быстро и позволяет не менять сигнатуры существующих функций.

Для этого выполним следующие шаги:

  1. В Глобальном модуле объявим переменную с ключевым словом Перем и экспортом.
  2. В форме списка присвоим этой переменной значение.
  3. В форме элемента прочитаем это значение.

В Глобальном модуле:

Перем ГлПараметрДляСправочника Экспорт;

В форме списка перед открытием или в процессе работы:

ГлПараметрДляСправочника = ГруппаДругогоСправочника;

В форме элемента (процедура ПриОткрытии):


Процедура ПриОткрытии()
    Если ПустоеЗначение(ГлПараметрДляСправочника) = 0 Тогда
        // Используем параметр для установки родителя или заполнения реквизита
        РеквизитГруппа = ГлПараметрДляСправочника;
        
        // Важно! Очищаем глобальную переменную, чтобы не было «хвостов»
        ГлПараметрДляСправочника = 0; 
    КонецЕсли;
КонецПроцедуры

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

Метод 3. Передача через СписокЗначений

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

Рассмотрим по шагам, как это реализовать:

1. В форме списка подготавливаем пакет данных:


ПакетДанных = СоздатьОбъект("СписокЗначений");
ПакетДанных.Установить("РодительскаяГруппа", ВыбраннаяГруппа);
ПакетДанных.Установить("РежимРаботы", 1);

2. При вызове ОткрытьФорму передаем этот список. Если мы открываем форму списка программно, мы можем сохранить этот список в локальной переменной формы списка, а затем пробросить его в ВводНового, как описано в первом методе.

3. В форме элемента извлекаем данные:


Процедура ПриОткрытии()
    КонтекстПрихода = Форма.Параметр;
    Если ТипЗначенияСтр(КонтекстПрихода) = "СписокЗначений" Тогда
        НужнаяГруппа = КонтекстПрихода.Получить("РодительскаяГруппа");
    КонецЕсли;
КонецПроцедуры

Метод 4. Установка владельца (ИспользоватьВладельца)

Если ваш параметр — это владелец справочника, то в 1С 7.7 существует специализированный метод ИспользоватьВладельца(). Выясним, как он помогает упростить задачу. Когда вы программно открываете форму списка подчиненного справочника, вы можете явно указать, элементы какого владельца показывать. При нажатии Ins в такой форме, система 1С 7.7 автоматически подставит текущего владельца в новый элемент.

Пример кода открытия формы списка с привязкой:


Конт = "";
ОткрытьФорму("Справочник.Подчиненный.ФормаСписка", Конт);
Конт.ИспользоватьВладельца(ВыбранныйВладелец);

В этом случае дополнительно передавать параметр в форму элемента не потребуется — платформа отработает механизм подчинения самостоятельно. Однако, если ваш «параметр» не является владельцем в терминах метаданных (как в случае с группой из другого справочника), этот метод не подойдет, и придется возвращаться к использованию Форма.Параметр или глобальных переменных.

Резюме и рекомендации

Проанализировав все способы, можно сделать вывод: для чистой архитектуры в 1С 7.7 предпочтительнее использовать Метод 1 (перехват через ВводНового) в сочетании с Методом 3 (передача СписокЗначений). Это исключает засорение глобальной области памяти и делает логику работы формы прозрачной. Глобальные переменные стоит использовать только в крайних случаях, когда внесение изменений в логику открытия форм по всей конфигурации слишком трудозатратно.

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

← На главную