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