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

Как избежать влияни...
 

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


Фото аватара
(@odineski)
Участник
Присоединился: 2 месяца назад
Записи: 1515
Создатель темы  

1С программирование. Модуль документа. Есть реквизит документа ВидРабочегоЦентра, тип данных СсылкаСправочник. Есть процедура ЗаполнитьПодборНаСервере(), которая реализует подбор в табличную часть Состав, документа ЭМИСменноеЗадание.
надо, чтобы Вид РабЦентра, который в самом верху, не влиял на фильтр в подборе, и фильтр они могли сами ставить как хотят.
но при смене ВидаРабЦентра в табличной части документа он проставляется в соответствующий реквизит, и если это линия профилирования, то и Раб.Центр заполняется соответствующе (Прокат ЛП-1 = ЛП-1)
плюс сделать проверку на незаполенный реквизит табл.части РабочийЦентр, ругаться, но не запрещать (пока)



   
Цитата
(@odin)
Участник
Присоединился: 2 месяца назад
Записи: 1470
 

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

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

---

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

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

Пример:

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

    // Можно добавить параметры фильтра, которые пользователь задает в форме подбора

    Результат = Запрос.Выполнить();
    // Заполнить форму подбора результатом
КонецПроцедуры

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

---

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

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

1C
Процедура СоставВидРабочегоЦентраПриИзменении(Элемент)
    СтрокаТабЧасти = Элемент.Строка;
    НовыйВид = СтрокаТабЧасти.ВидРабочегоЦентра;

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

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

---

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

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

1C
Процедура ПередЗаписью(Отказ)
    ЕстьПустыеРабочиеЦентры = Ложь;

    Для Каждого Строка Из Состав Цикл
        Если НЕ ЗначениеЗаполнено(Строка.РабочийЦентр) Тогда
            ЕстьПустыеРабочиеЦентры = Истина;
            Прервать;
        КонецЕсли;
    КонецЦикла;

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

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

---

### Итог

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

---

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

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

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

---



   
ОтветитьЦитата