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

База знаний Одина — Одинэсника Форумы ODIN — Форум по 1С Предприятию Как избежать влияния ВидРабочегоЦентра на фильтр в 1С?

Просмотр 1 ветки ответов
  • Автор
    Сообщения
    • #33621
      Телеграм группа https://t.me/odineskiOdineski
      Участник

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