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

Денис, добрый день!
Для решения вашей задачи в 1С предлагаю следующий подход, разбитый на три части:
—
### 1. Исключить влияние реквизита ВидРабочегоЦентра
на фильтр подбора табличной части Состав
В процедуре ЗаполнитьПодборНаСервере()
не используйте значение реквизита ВидРабочегоЦентра
для формирования фильтра. Вместо этого предоставьте пользователю возможность самостоятельно задавать фильтр.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
1C Процедура ЗаполнитьПодборНаСервере(Команда) // Формируем запрос без учета ВидРабочегоЦентра Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, Номенклатура.Наименование КАК Наименование ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ /* Здесь фильтры, которые задает пользователь, без учета ВидРабочегоЦентра */"; // Можно добавить параметры фильтра, которые пользователь задает в форме подбора Результат = Запрос.Выполнить(); // Заполнить форму подбора результатом КонецПроцедуры |
Таким образом, ВидРабочегоЦентра
не влияет на подбор.
—
### 2. При смене ВидРабочегоЦентра
в табличной части проставлять соответствующий реквизит РабочийЦентр
Для этого в модуле документа в обработчике события изменения реквизита ВидРабочегоЦентра
табличной части Состав
(например, в процедуре ПриИзменении
) реализуйте логику:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
1C Процедура СоставВидРабочегоЦентраПриИзменении(Элемент) СтрокаТабЧасти = Элемент.Строка; НовыйВид = СтрокаТабЧасти.ВидРабочегоЦентра; Если ЗначениеЗаполнено(НовыйВид) Тогда // Пример: если ВидРабочегоЦентра = "Линия профилирования", то РабочийЦентр = "Прокат ЛП-1" -> "ЛП-1" Если НовыйВид.Наименование = "Прокат ЛП-1" Тогда СтрокаТабЧасти.РабочийЦентр = Справочники.РабочиеЦентры.НайтиПоНаименованию("ЛП-1"); Иначе // Иная логика заполнения или очистка СтрокаТабЧасти.РабочийЦентр = Неопределено; КонецЕсли; Иначе СтрокаТабЧасти.РабочийЦентр = Неопределено; КонецЕсли; КонецПроцедуры |
Если у вас нет события на изменение реквизита табличной части, можно использовать обработчик ПриИзменении
формы или подписаться на событие изменения реквизита.
—
### 3. Проверка незаполненного реквизита РабочийЦентр
в табличной части с выводом предупреждения, но без запрета сохранения
В процедуре ПередЗаписью
документа добавьте проверку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
1C Процедура ПередЗаписью(Отказ) ЕстьПустыеРабочиеЦентры = Ложь; Для Каждого Строка Из Состав Цикл Если НЕ ЗначениеЗаполнено(Строка.РабочийЦентр) Тогда ЕстьПустыеРабочиеЦентры = Истина; Прервать; КонецЕсли; КонецЦикла; Если ЕстьПустыеРабочиеЦентры Тогда Сообщить("Внимание! В табличной части 'Состав' есть строки с незаполненным реквизитом 'РабочийЦентр'."); // Отказ = Истина; // не запрещаем сохранение, поэтому не ставим отказ КонецЕсли; КонецПроцедуры |
Так пользователь увидит предупреждение, но сможет сохранить документ.
—
### Итог
– В подборе табличной части не используйте ВидРабочегоЦентра
для фильтрации.
– При изменении ВидРабочегоЦентра
в табличной части автоматически проставляйте РабочийЦентр
по заданной логике.
– При сохранении выводите предупреждение, если РабочийЦентр
не заполнен, но не блокируйте сохранение.
—
Если нужно, могу помочь с конкретным кодом для вашей конфигурации.
Рекомендую посмотреть здесь: https://infostart.ru/public/99035/ (пример работы с хранилищем значений и табличными частями) и https://infostart.ru/public/80342/ (пример работы с реквизитами и формами).
Если потребуется, могу помочь с более детальной реализацией.
—