Как передать параметры (номенклатура, характеристика) из табличной части документа в форму выбора спецификации в 1С:Комплексная автоматизация 2?

Программист 1С v8.3 (Управляемые формы) 1С:Комплексная автоматизация Управленческий учет Промышленность, строительство и АПК
← На главную

При работе с конфигурациями 1С:Предприятие 8.3, особенно с такими крупными и функциональными, как 1С:Комплексная автоматизация 2 (КА2), часто возникает задача динамической фильтрации данных в формах выбора. Одним из типовых сценариев является необходимость передать значения из текущей строки табличной части документа (например, номенклатуру или характеристику) в форму выбора связанного объекта (например, ресурсной спецификации). Это позволяет существенно сократить список выбора для пользователя, предлагая только релевантные данные. Рассмотрим подробнее, как решается эта задача, в частности, на примере документа «ОтчетПереработчика» и формы выбора спецификации.

Обзор механизмов передачи параметров в формы выбора в 1С

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

1. Связи параметров выбора (СвязиПараметровВыбора)

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

  1. Декларативное создание (в конфигураторе):

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

    Для этого в палитре свойств элемента формы (или реквизита объекта метаданных) на вкладке «Связи параметров выбора» мы можем добавить новую связь, указав:

    • Параметр выборки: Это имя параметра отбора, которое будет доступно в форме выбора (например, Отбор.Номенклатура).
    • Поле формы: Это путь к реквизиту на текущей форме, значение которого будет использоваться для отбора (например, Элементы.ВыходныеИзделия.ТекущиеДанные.Номенклатура).

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

  2. Программное создание:

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

    Типичное место для программного заполнения СвязиПараметровВыбора для элементов табличной части — это обработчики событий ПриСозданииНаСервере формы документа или ПриИзменении реквизитов, от которых зависит выбор (например, НоменклатураПриИзменении).

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

    
    &НаКлиенте
    Процедура ВыходныеИзделияСпецификацияНачалоВыбора(Элемент, СтандартнаяОбработка)
        СтандартнаяОбработка = Ложь; // Отменяем стандартную обработку, чтобы открыть форму с нашими параметрами, если это необходимо
                
        ПередаваемыеПараметры = Новый Структура();
        ТекущиеДанныеСтроки = Элементы.ВыходныеИзделия.ТекущиеДанные;
                
        Если ТекущиеДанныеСтроки <> Неопределено Тогда
            // Создаем массив связей параметров выбора
            Связи = Новый Массив();
                    
            Если ЗначениеЗаполнено(ТекущиеДанныеСтроки.Номенклатура) Тогда
                СвязьНоменклатура = Новый СвязьПараметраВыбора("Отбор.Номенклатура", "ВыходныеИзделия.ТекущиеДанные.Номенклатура");
                Связи.Добавить(СвязьНоменклатура);
            КонецЕсли;
                    
            Если ЗначениеЗаполнено(ТекущиеДанныеСтроки.Характеристика) Тогда
                СвязьХарактеристика = Новый СвязьПараметраВыбора("Отбор.Характеристика", "ВыходныеИзделия.ТекущиеДанные.Характеристика");
                Связи.Добавить(СвязьХарактеристика);
            КонецЕсли;
                    
            // Присваиваем созданные связи элементу формы
            Элемент.СвязиПараметровВыбора = Связи;
        КонецЕсли;
                
        // Если мы не отменяем СтандартнуюОбработка, то система сама откроет форму
        // Если же мы ее отменили, то необходимо явно открыть форму выбора
        // Например:
        // ОткрытьФорму("Справочник.РесурсныеСпецификации.ФормаВыбораПоНоменклатуре", ПередаваемыеПараметры, Элемент);
    КонецПроцедуры
    

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

2. Параметры выбора (ПараметрыВыбора)

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

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

Если в одном элементе формы одновременно используются СвязиПараметровВыбора и ПараметрыВыбора с одинаковым именем параметра (например, Отбор.Номенклатура), приоритет отдается СвязямПараметровВыбора, если связанное поле заполнено. Это означает, что динамический отбор по контексту будет иметь преимущество над статическим.

3. Передача параметров при явном открытии формы (ОткрытьФорму())

Хотя этот метод менее применим для стандартных форм выбора, открываемых по кнопке (...), важно упомянуть, что параметры в любую форму можно передать при ее явном открытии с помощью метода ОткрытьФорму(). При этом в самой форме, в обработчике события ПриСозданииНаСервере, эти параметры становятся доступными через свойство формы Параметры.


&НаКлиенте
Процедура КомандаОткрытьФормуСоСвоимиПараметрами(Команда)
    ПараметрыДляФормы = Новый Структура();
    ПараметрыДляФормы.Вставить("НоменклатураДляОтбора", Объект.Номенклатура);
    ПараметрыДляФормы.Вставить("ТолькоДействующие", Истина);
    
    ОткрытьФорму("Справочник.РесурсныеСпецификации.ФормаВыбора", ПараметрыДляФормы);
КонецПроцедуры

В форме выбора, в процедуре ПриСозданииНаСервере, эти параметры будут доступны:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    Если Параметры.Свойство("НоменклатураДляОтбора") Тогда
        // Применяем отбор по номенклатуре
        Элементы.Список.Отбор.Номенклатура.Установить(Параметры.НоменклатураДляОтбора);
    КонецЕсли;
    Если Параметры.Свойство("ТолькоДействующие") И Параметры.ТолькоДействующие Тогда
        // Применяем дополнительный отбор
        Элементы.Список.Отбор.Действующая.Установить(Истина);
    КонецЕсли;
КонецПроцедуры

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

Решение проблемы из кейса: анализ типовой конфигурации КА2

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

В нашем случае, для реквизита табличной части «Спецификация» в документе «ОтчетПереработчика» в КА2, было указано использование формы выбора «ФормаВыбораПоНоменклатуре» из справочника «РесурсныеСпецификации». Именно в этой форме выбора, а точнее, перед ее открытием, система ожидает параметры для отбора.

Согласно подсказкам из обсуждения (сообщения 6 и 7), ключевую роль играет функция:

Эта функция, расположенная в общем модуле УправлениеДаннымиОбИзделияхКлиентСервер, вероятно, и отвечает за программное заполнение СвязиПараметровВыбора для элемента формы, представляющего поле спецификации в табличной части документа. Её задача — собрать необходимую информацию из текущего контекста (например, номенклатуру, характеристику из текущей строки табличной части) и передать её в форме СвязиПараметровВыбора.

Примерная логика внутри типовой функции

Давайте предположим, как может быть реализована функция УстановитьПараметрыВыбораСпецификаций:

  1. Она получает в качестве параметра Элемент, который является элементом формы (полем, для которого открывается выбор).
  2. Она получает второй параметр, который может быть структурой дополнительных условий или просто пустым, если все берется из текущей строки.
  3. Внутри функции определяется текущая строка табличной части (например, через Элементы.ВыходныеИзделия.ТекущиеДанные).
  4. Из текущей строки извлекаются значения реквизитов, по которым будет выполняться отбор (Номенклатура, Характеристика и другие, специфичные для ресурсных спецификаций, например, ВидВоспроизводства, Назначение).
  5. На основе этих значений формируется массив объектов СвязьПараметраВыбора.
  6. Этот массив присваивается свойству Элемент.СвязиПараметровВыбора.

Таким образом, когда пользователь нажимает кнопку выбора для поля "Спецификация", платформа 1С вызывает эту функцию (или аналогичную логику), которая программно устанавливает связи, а затем открывает форму выбора, которая уже получает эти параметры отбора.

Пошаговая инструкция для самостоятельного поиска и отладки

Если вы столкнулись с подобной проблемой и не знаете, как передаются параметры в конкретной типовой конфигурации, мы рекомендуем следующие шаги:

  1. Определите, какая форма выбора используется:

    Для реквизита табличной части «Спецификация» (в нашем случае это СправочникСсылка.РесурсныеСпецификации) в конфигураторе мы можем посмотреть, какая форма выбора установлена. В данном кейсе это «ФормаВыбораПоНоменклатуре» из справочника «РесурсныеСпецификации».

  2. Установите точку останова в форме выбора:

    Откройте модуль этой формы выбора (Справочник.РесурсныеСпецификации.ФормаВыбораПоНоменклатуре). Установите точку останова в процедуре ПриСозданииНаСервере(Отказ, СтандартнаяОбработка). Эта процедура выполняется при первом создании экземпляра формы на сервере и является идеальным местом для анализа переданных параметров.

    
    &НаСервере
    Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
        // *** Установить здесь точку останова ***
        // Анализируем Параметры, СвязиПараметровВыбора и ПараметрыВыбора
        // формы, чтобы понять, что было передано.
                
        Если Параметры.Свойство("Отбор") И ТипЗнч(Параметры.Отбор) = Тип("Структура") Тогда
            // Здесь можно увидеть параметры, переданные через ОткрытьФорму()
            // или те, которые автоматически формируются платформой из СвязейПараметровВыбора
            // при программной передаче.
        КонецЕсли;
                
        // Также можно посмотреть текущие отборы списка (если элемент формы называется Список)
        // Если Элементы.Свойство("Список") И Элементы.Список.Свойство("Отбор") Тогда
        //     Сообщить("Отбор списка: " + Элементы.Список.Отбор.ПолучитьПараметры());
        // КонецЕсли;
                
        // Проверка на обязательность параметров, как в сообщении 3
        Если НЕ Параметры.Свойство("Номенклатура") Тогда
            ВызватьИсключение НСтр("ru = 'Для открытия формы необходимо передать параметр \"Номенклатура\".'");
        КонецЕсли;
        // ... дальнейшая логика инициализации формы
    КонецПроцедуры
    
  3. Запустите отладку:

    В режиме 1С:Предприятие откройте документ «ОтчетПереработчика», перейдите в табличную часть «ВыходныеИзделия» и нажмите кнопку выбора для реквизита «Спецификация».

  4. Анализируйте стек вызовов и параметры:

    Когда отладчик остановится в ПриСозданииНаСервере формы выбора, мы увидим в окне отладчика:

    • Стек вызовов: Здесь мы сможем увидеть последовательность вызовов, которая привела к открытию этой формы. Это поможет нам найти место в коде документа или общего модуля, где формируются параметры выбора. Именно здесь мы, вероятно, увидим вызов функции типа УправлениеДаннымиОбИзделияхКлиентСервер.УстановитьПараметрыВыбораСпецификаций.
    • Свойства формы: В частности, нас интересуют свойства Параметры, СвязиПараметровВыбора и ПараметрыВыбора самой формы. Мы можем проанализировать их, чтобы понять, какие отборы или параметры были переданы в форму.

    Если в Параметры формы вы обнаружите структуру с ключами типа Отбор.Номенклатура, Отбор.Характеристика, это означает, что отбор был сформирован программно через СвязиПараметровВыбора или при явном открытии формы. Если же отбор устанавливается непосредственно для элемента Список (например, Элементы.Список.Отбор), то это тоже укажет на программное формирование.

Именно такой подход (анализ стека вызовов и отладка) позволяет точно определить, какой механизм используется в конкретной типовой конфигурации и где именно формируются передаваемые параметры. В случае с КА2 и документом «ОтчетПереработчика», отладка приведет нас к упомянутой выше функции из общего модуля УправлениеДаннымиОбИзделияхКлиентСервер, которая является централизованным местом для управления отборами спецификаций.

Заключение

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

← На главную