База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как избежать влияния ВидРабочегоЦентра на фильтр в 1С? › RE: Как избежать влияния ВидРабочегоЦентра на фильтр в 1С?
Денис, добрый день!
Для решения вашей задачи в 1С предлагаю следующий подход, разбитый на три части:
—
### 1. Исключить влияние реквизита `ВидРабочегоЦентра` на фильтр подбора табличной части `Состав`
В процедуре `ЗаполнитьПодборНаСервере()` не используйте значение реквизита `ВидРабочегоЦентра` для формирования фильтра. Вместо этого предоставьте пользователю возможность самостоятельно задавать фильтр.
Пример:
1C
Процедура ЗаполнитьПодборНаСервере(Команда)
// Формируем запрос без учета ВидРабочегоЦентра
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
Номенклатура.Ссылка КАК Номенклатура,
Номенклатура.Наименование КАК Наименование
ИЗ
Справочник.Номенклатура КАК Номенклатура
ГДЕ
/* Здесь фильтры, которые задает пользователь, без учета ВидРабочегоЦентра */";
// Можно добавить параметры фильтра, которые пользователь задает в форме подбора
Результат = Запрос.Выполнить();
// Заполнить форму подбора результатом
КонецПроцедуры
Таким образом, `ВидРабочегоЦентра` не влияет на подбор.
—
### 2. При смене `ВидРабочегоЦентра` в табличной части проставлять соответствующий реквизит `РабочийЦентр`
Для этого в модуле документа в обработчике события изменения реквизита `ВидРабочегоЦентра` табличной части `Состав` (например, в процедуре `ПриИзменении`) реализуйте логику:
1C
Процедура СоставВидРабочегоЦентраПриИзменении(Элемент)
СтрокаТабЧасти = Элемент.Строка;
НовыйВид = СтрокаТабЧасти.ВидРабочегоЦентра;
Если ЗначениеЗаполнено(НовыйВид) Тогда
// Пример: если ВидРабочегоЦентра = "Линия профилирования", то РабочийЦентр = "Прокат ЛП-1" -> "ЛП-1"
Если НовыйВид.Наименование = "Прокат ЛП-1" Тогда
СтрокаТабЧасти.РабочийЦентр = Справочники.РабочиеЦентры.НайтиПоНаименованию("ЛП-1");
Иначе
// Иная логика заполнения или очистка
СтрокаТабЧасти.РабочийЦентр = Неопределено;
КонецЕсли;
Иначе
СтрокаТабЧасти.РабочийЦентр = Неопределено;
КонецЕсли;
КонецПроцедуры
Если у вас нет события на изменение реквизита табличной части, можно использовать обработчик `ПриИзменении` формы или подписаться на событие изменения реквизита.
—
### 3. Проверка незаполненного реквизита `РабочийЦентр` в табличной части с выводом предупреждения, но без запрета сохранения
В процедуре `ПередЗаписью` документа добавьте проверку:
1C
Процедура ПередЗаписью(Отказ)
ЕстьПустыеРабочиеЦентры = Ложь;
Для Каждого Строка Из Состав Цикл
Если НЕ ЗначениеЗаполнено(Строка.РабочийЦентр) Тогда
ЕстьПустыеРабочиеЦентры = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если ЕстьПустыеРабочиеЦентры Тогда
Сообщить("Внимание! В табличной части 'Состав' есть строки с незаполненным реквизитом 'РабочийЦентр'.");
// Отказ = Истина; // не запрещаем сохранение, поэтому не ставим отказ
КонецЕсли;
КонецПроцедуры
Так пользователь увидит предупреждение, но сможет сохранить документ.
—
### Итог
— В подборе табличной части не используйте `ВидРабочегоЦентра` для фильтрации.
— При изменении `ВидРабочегоЦентра` в табличной части автоматически проставляйте `РабочийЦентр` по заданной логике.
— При сохранении выводите предупреждение, если `РабочийЦентр` не заполнен, но не блокируйте сохранение.
—
Если нужно, могу помочь с конкретным кодом для вашей конфигурации.
Рекомендую посмотреть здесь: https://infostart.ru/public/99035/ (пример работы с хранилищем значений и табличными частями) и https://infostart.ru/public/80342/ (пример работы с реквизитами и формами).
Если потребуется, могу помочь с более детальной реализацией.
—