Как передать параметр из отбора журнала в новый документ в 1С 7.7?

Программист 1С v7.7 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе в платформе 1С:Предприятие 7.7 часто возникает задача: пользователь устанавливает отбор в журнале документов по конкретному контрагенту и при нажатии кнопки «Новый» (или клавиши Insert) хочет, чтобы у вновь созданного документа автоматически заполнялось поле с этим клиентом.

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

Способ 1. Использование экспортной глобальной переменной

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

Разберем по шагам порядок настройки:

  1. В Глобальном модуле конфигурации объявляем экспортную переменную для хранения ссылки на выбранного клиента: Переменная ОтборныйКлиент Экспорт;
  2. В модуле формы журнала документов при выборе контрагента и установке отбора заносим выбранное значение в глобальную переменную:
    
    Процедура УстановкаКлиента()
        Если ВыбКлиент.Выбран() > 0 Тогда    
            УстановитьОтбор("КлиентКомПредл", ВыбКлиент); 
            ОтборныйКлиент = ВыбКлиент;
        Иначе
            ОтборныйКлиент = "";
            СброситьОтбор();
        КонецЕсли;
    КонецПроцедуры
    
  3. Чтобы избежать ситуаций, когда в переменной остаются старые данные после закрытия журнала, в самом конце модуля формы журнала (в теле модуля) необходимо очищать значение: ОтборныйКлиент = "";
  4. В модуле открываемого документа в предопределенной процедуре ВводНового или ПриОткрытии проверяем значение переменной и заполняем реквизит:
    
    Процедура ВводНового(Скопирован, СкопированныйДокумент)
        Если (Скопирован = 0) И (ПустоеЗначение(ОтборныйКлиент) = 0) Тогда
            Контрагент = ОтборныйКлиент;
        КонецЕсли;
    КонецПроцедуры
    

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

Способ 2. Использование внешней компоненты FormEx

Проанализируем более технологичный способ с использованием внешней компоненты FormEx. Этот вариант позволяет динамически опрашивать активное окно журнала и получать установленный отбор непосредственно в момент создания нового документа.

Рассмотрим пример кода в процедуре ВводНового модуля документа:


Процедура ВводНового(Скопирован, СкопированныйДокумент)
    Если Скопирован = 0 Тогда
        Конт = 0;
        Сервис.АктивныйКонтекст(Конт);
        Если ТипЗначенияСтр(Конт) = "ГрупповойКонтекст" Тогда
            ИмяОтбора = "";
            ЗначениеОтбора = "";
            Попытка
                Конт.ПолучитьОтбор(ИмяОтбора, ЗначениеОтбора);
            Исключение
            КонецПопытки;
            Если ПустоеЗначение(ИмяОтбора) = 0 Тогда
                Если ТипЗначенияСтр(ЗначениеОтбора) = "Справочник" Тогда
                    Если ЗначениеОтбора.Вид() = "Контрагенты" Тогда
                        Контрагент = ЗначениеОтбора;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

В данном примере с помощью метода АктивныйКонтекст получаем контекст формы журнала, а через ПолучитьОтбор считываем значение установленного отбора. Это позволяет корректно заполнить реквизит без использования промежуточных глобальных переменных.

Способ 3. Переопределение кнопки создания документа

Посмотрим на ещё одно решение, которое не требует использования внешних компонент и исключает побочные эффекты глобальных переменных. На форме журнала отключается стандартная кнопка создания документа, а вместо нее добавляется пользовательская кнопка.

Шаги по настройке данного варианта:

  1. На форму журнала выносится кнопка «Новый», которая вызывает процедуру программного открытия формы документа.
  2. При нажатии на кнопку в функцию ОткрытьФорму передается ссылка на выбранного в отборе контрагента в качестве параметра:
    
    Процедура СоздатьНовыйСПараметром()
        Если ВыбКлиент.Выбран() = 1 Тогда
            ОткрытьФорму("Документ.КоммерческоеПредложение", ВыбКлиент);
        Иначе
            ОткрытьФорму("Документ.КоммерческоеПредложение");
        КонецЕсли;
    КонецПроцедуры
    
  3. В модуле формы самого документа в процедуре ПриОткрытии принимаем и проверяем переданное значение:
    
    Процедура ПриОткрытии()
        Если ПустоеЗначение(Форма.Параметр) = 0 Тогда
            Если ТипЗначенияСтр(Форма.Параметр) = "Справочник" Тогда
                Если Форма.Параметр.Вид() = "Контрагенты" Тогда
                    Контрагент = Форма.Параметр;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецПроцедуры
    

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

← На главную