RE: Как избежать влияния ВидРабочегоЦентра на фильтр в 1С?

#33622
bot_avaOdin — Одинэсник
Участник

    Денис, добрый день!

    Для решения вашей задачи в 1С предлагаю следующий подход, разбитый на три части:

    ### 1. Исключить влияние реквизита `ВидРабочегоЦентра` на фильтр подбора табличной части `Состав`

    В процедуре `ЗаполнитьПодборНаСервере()` не используйте значение реквизита `ВидРабочегоЦентра` для формирования фильтра. Вместо этого предоставьте пользователю возможность самостоятельно задавать фильтр.

    Пример:

    1C
    Процедура ЗаполнитьПодборНаСервере(Команда)
        // Формируем запрос без учета ВидРабочегоЦентра
        Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ
            Номенклатура.Ссылка КАК Номенклатура,
            Номенклатура.Наименование КАК Наименование
        ИЗ
            Справочник.Номенклатура КАК Номенклатура
        ГДЕ
            /* Здесь фильтры, которые задает пользователь, без учета ВидРабочегоЦентра */";
    
        // Можно добавить параметры фильтра, которые пользователь задает в форме подбора
    
        Результат = Запрос.Выполнить();
        // Заполнить форму подбора результатом
    КонецПроцедуры
    

    Таким образом, `ВидРабочегоЦентра` не влияет на подбор.

    ### 2. При смене `ВидРабочегоЦентра` в табличной части проставлять соответствующий реквизит `РабочийЦентр`

    Для этого в модуле документа в обработчике события изменения реквизита `ВидРабочегоЦентра` табличной части `Состав` (например, в процедуре `ПриИзменении`) реализуйте логику:

    1C
    Процедура СоставВидРабочегоЦентраПриИзменении(Элемент)
        СтрокаТабЧасти = Элемент.Строка;
        НовыйВид = СтрокаТабЧасти.ВидРабочегоЦентра;
    
        Если ЗначениеЗаполнено(НовыйВид) Тогда
            // Пример: если ВидРабочегоЦентра = "Линия профилирования", то РабочийЦентр = "Прокат ЛП-1" -> "ЛП-1"
            Если НовыйВид.Наименование = "Прокат ЛП-1" Тогда
                СтрокаТабЧасти.РабочийЦентр = Справочники.РабочиеЦентры.НайтиПоНаименованию("ЛП-1");
            Иначе
                // Иная логика заполнения или очистка
                СтрокаТабЧасти.РабочийЦентр = Неопределено;
            КонецЕсли;
        Иначе
            СтрокаТабЧасти.РабочийЦентр = Неопределено;
        КонецЕсли;
    КонецПроцедуры
    

    Если у вас нет события на изменение реквизита табличной части, можно использовать обработчик `ПриИзменении` формы или подписаться на событие изменения реквизита.

    ### 3. Проверка незаполненного реквизита `РабочийЦентр` в табличной части с выводом предупреждения, но без запрета сохранения

    В процедуре `ПередЗаписью` документа добавьте проверку:

    1C
    Процедура ПередЗаписью(Отказ)
        ЕстьПустыеРабочиеЦентры = Ложь;
    
        Для Каждого Строка Из Состав Цикл
            Если НЕ ЗначениеЗаполнено(Строка.РабочийЦентр) Тогда
                ЕстьПустыеРабочиеЦентры = Истина;
                Прервать;
            КонецЕсли;
        КонецЦикла;
    
        Если ЕстьПустыеРабочиеЦентры Тогда
            Сообщить("Внимание! В табличной части 'Состав' есть строки с незаполненным реквизитом 'РабочийЦентр'.");
            // Отказ = Истина; // не запрещаем сохранение, поэтому не ставим отказ
        КонецЕсли;
    КонецПроцедуры
    

    Так пользователь увидит предупреждение, но сможет сохранить документ.

    ### Итог

    — В подборе табличной части не используйте `ВидРабочегоЦентра` для фильтрации.
    — При изменении `ВидРабочегоЦентра` в табличной части автоматически проставляйте `РабочийЦентр` по заданной логике.
    — При сохранении выводите предупреждение, если `РабочийЦентр` не заполнен, но не блокируйте сохранение.

    Если нужно, могу помочь с конкретным кодом для вашей конфигурации.

    Рекомендую посмотреть здесь: https://infostart.ru/public/99035/ (пример работы с хранилищем значений и табличными частями) и https://infostart.ru/public/80342/ (пример работы с реквизитами и формами).

    Если потребуется, могу помочь с более детальной реализацией.

    База знаний 1С