Как сохранить условие отбора в реквизитах справочника.

25.02.14

Разработка - Механизмы платформы 1С

Иногда возникает необходимость дать пользователю возможность ввести условие отбора данных, чтобы в дальнейшем его использовать.
В базе 1С напрямую сохранить данные типа "Отбор" нельзя.
Как все-таки их сохранить.

Скачать файлы

Наименование Файл Версия Размер
Пример конфигурации с сохранением условий отбора (ХранениеУсловияОтбора.dt)
.dt 37,30Kb
49
.dt 37,30Kb 49 Скачать

Допустим, необходимо ограничить выбор реквизитов в зависимости от других реквизитов.

Например, в зависимости от контрагента ограничить выбор номенклатуры, которая ему может быть продана.
Или ограничить перечень допустимых счетов учета в зависимости от номенклатуры.
Как проще всего это сделать?

Если ограничение простое, например, каждый контрагент может закупать номенклатуру из своей группы, то достаточно добавить в справочник контрагентов реквизит "Номенклатура" и хранить в нем группу, которая контрагенту доступна. К сожалению, обычно условия отбора более сложные и одного реквизита недостаточно. Приходится хранить несколько полей, типы сравнения, потом городить сложные условия.

На самом деле все проще.

В 1С есть специальный тип данных, который предназначен для хранения отборов и так и называется "Отбор".

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

Пользователь может накладывать несколько ограничений на разные реквизиты. Эти ограничения будут действовать совместно.

Итак, как им пользоваться.

Для примера возьмем простейшую приведенную выше задачу "В зависимости от контрагента ограничить выбор номенклатуры, которая ему может быть продана"

1. В справочник "Контрагенты" добавляем реквизит "УсловияОтбора" типа "ХранилищеЗначений". В нем будем хранить условия отбора на справочник "Номенклатура". (Вернее, хранить будем построитель отчета, так как тип "Отбор", по данным синтакс-помошника, не входит в сериализуемые)

2. Добавляем на форму справочника контрагентов реквизит данные отбора с типом "Отбор" и связываем его с табличным полем на форме.

3. В форму элемента справочника "Контрагенты" добавляем процедуры:

   3.1 "ПриОткрытии" - в нем по сохраненному построителю отчетов заполняем отборы.

   3.2. "ПередЗаписью" - в нем по отбору формируем построитель и сохраняем его в элементе справочника.

4. В форму документа для элемента "Номенклатура" табличной части добавляем обработчик события "НачалоВыбора", в котором по выбранному контрагенту накладываем условие на справочник "Номенклатура" 

Процедура ТоварыНоменклатураНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    //Если заполнен контрагент, 
    //то дополнительно на отбираемую номенклатуру накладываем фильтр из настроек контрагента
    Если ЗначениеЗаполнено(Контрагент.УсловияОтбора) Тогда
        
        ПостроительСтруктура =  Контрагент.УсловияОтбора.Получить();
        
        Если ПостроительСтруктура <> Неопределено Тогда
            СтандартнаяОбработка = Ложь;
            ФормаВыбора = Справочники.Номенклатура.ПолучитьФормуВыбора(,Элемент);
            
            //Получаем сохраненный построитель отчета и из него условия отбора
            Построитель = Новый ПостроительОтчета(ПостроительСтруктура.Текст);
            Построитель.ЗаполнитьНастройки();
            Построитель.УстановитьНастройки(ПостроительСтруктура.Настройки);
            Для каждого Настройка Из Построитель.Отбор Цикл
                НовоеУсловиеОтбора = ФормаВыбора.СправочникСписок.Отбор[Настройка.ПутьКДанным];
                НовоеУсловиеОтбора.ВидСравнения = Настройка.ВидСравнения;
                ЗаполнитьЗначенияСвойств(НовоеУсловиеОтбора,Настройка);
            КонецЦикла; 
            
            ФормаВыбора.Открыть();
        КонецЕсли;
    КонецЕсли; 
КонецПроцедуры

В результате при выборе номенклатуры в документ реализация у нас отображается лишь та номенклатура, которая доступна указанному в документе контрагенту.

Выгрузка базы с примером в приложении к статье.

В базе 2 справочника ("Контрагенты" и "Номенклатура") и один документ "Реализация товаров".  Для контрагента можно указать фильтр на номенклатуру, которая будет доступна в документе реализации.

Работает в обычном интерфейсе. Но при необходимости эту же идею можно аналогично реализовать и на управляемых формах.

 

отбор настройка отбора

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4538    dsdred    53    

72

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5295    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6410    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18475    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12088    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8824    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Внешние компоненты для 1С можно разработывать очень просто, пользуясь всеми преимуществами языка Rust - от безопасности и кроссплатформенности до удобного менеджера библиотек.

20.08.2023    6279    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15986    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. AlX0id 23.02.14 13:08 Сейчас в теме
Старомодно на построителе - пора на СКД ;)
2. ekaruk 4896 23.02.14 13:28 Сейчас в теме
(1) AlX0id,
Пример можете привести?
Чем СКД проще или удобнее для пользователя?
3. Serj1C 483 24.02.14 07:36 Сейчас в теме
(2) СКД как минимум удобнее и проще для разработчика.
Бонусом для пользователя идут вычисляемые поля, условное оформление и т.д.
6. AlX0id 27.02.14 15:44 Сейчас в теме
(2)
В построителе есть группа ИЛИ?
7. ekaruk 4896 27.02.14 16:55 Сейчас в теме
(6) AlX0id, В построителе нет, насколько я знаю
Только "И"
В отборах на СКД можно использовать группы "И", "ИЛИ", "НЕ".
Возможно, немного позже опишу, как можно с ними работать.
8. AlX0id 27.02.14 17:22 Сейчас в теме
(7)
Это я к тому, что вы просили привести пример, чем СКД лучше построителя %)
Как с ними работать, я в курсе )
4. pepe 62 25.02.14 17:00 Сейчас в теме
Спасибо за идею, а как ее реализовать через СКД или построитель - это уже другой вопрос.
5. DrAku1a 1679 26.02.14 04:42 Сейчас в теме
Загляните на досуге в документ ИнвентаризацияТоваровНаСкладе (в КА, УТ, УПП и т.п.) - там именно так и сохраняются условия отбора. Документу уже несколько лет. Ничего нового Вы не изобрели.
Noxie41; karpushka; ChasovskiH; sergiobargio1; +4 Ответить
9. Silenser 592 26.12.14 10:26 Сейчас в теме
Сам реквизит СправочникСписок.Отбор можно сериализовать функцией ЗначениеВСтрокуВнутр. И хотя сам реквизит Отбор только для чтения, его элементы поддаются изменению.


врОтбор = ЗначениеИзСтрокиВнутр({СтрокаССериализованнымОтбором});
Для каждого врЭл Из врОтбор Цикл
Если (врЭл.Использование) Тогда

Эл = СписокЗаказов.Отбор.Найти(врЭл.Имя);
Если (Эл <> Неопределено) Тогда
ЗаполнитьЗначенияСвойств(Эл, врЭл);
КонецЕсли;

КонецЕсли;
КонецЦикла;
babaikass; AzagTot; belchonokh; +3 Ответить
Оставьте свое сообщение