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