Отбор по дополнительному реквизиту динамический список

На днях получил задание реализовать поиск документа по контрагенту, указанному в нем. Все было бы элементарно просто, но структура документа была не совсем обычна. Документ регистрирует продажу долга контрагентов сторонней организации, при этом одним документом может продаваться сразу несколько долгов. Поэтому в документе есть табличная часть, состоящая из двух колонок: Контрагент и СуммаДолга.

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

Рассмотрим причину возникновения этой проблемы. Дело в том, что формирование динамического списка происходит на основе запроса. Этот запрос может быть сформирован как вручную, так и автоматически, если мы указываем Основную таблицу динамического списка. Когда мы создаем форму списка по умолчанию применяется второй способ — автоматическое формирование запроса. При этом в выбираемые поля запроса попадают все реквизиты документа и табличные части. И именно по этим полям потом можно делать отбор. Но табличные части попадают в поле запроса целиком, поэтому сделать отбор по конкретному реквизиту табличной части невозможно.

Отбор в динамическом списке по реквизиту табличной части элемента

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

  1. В свойствах реквизита Список на управляемой форме установим флаг Произвольного запроса и перейдем в Настройку списка. Для наглядности для появившегося запроса можно открыть конструктор запросов.
    Отбор в динамическом списке по реквизиту табличной части элемента
  2. В конструкторе запросов необходимо убрать из полей выборки все табличне части. Вместо этого добавим табличную часть, по реквизиту которой необходимо делать отбор, в источники запроса (таблицы).
    Отбор в динамическом списке по реквизиту табличной части элемента
  3. Далее левым соединением соединяем табличные части с самим документом.
    Отбор в динамическом списке по реквизиту табличной части элемента
  4. И делаем группировку по всем полям (хотя можно и использовать ВЫБРАТЬ РАЗЛИЧНЫЕ).
    Отбор в динамическом списке по реквизиту табличной части элемента
  5. На вкладке Компановка данных — Таблицы снимаем флаг Обязательно для табличной части. Это нужно для того, чтобы соединение выполнялось не всегда, а только если используется отбор. Таким образом экономятся ресурсы и ускоряется работа конфигурации.
    Отбор в динамическом списке по реквизиту табличной части элемента
    На вкладке Компановка данных — Условия создаем необходимые условия отбора по необходимым реквизитам табличной части.
    Отбор в динамическом списке по реквизиту табличной части элемента
  6. Сохраняем запрос и переходим на вкладку Настройка. Там можно сразу добавить необходимые условия отбора, чтобы пользователям самим не приходилось каждый раз выбирать поля. Не забудьте снять флаги с полей отбора, иначе при открытии формы списка условие отбора будет сразу применено.

Отбор в динамическом списке по реквизиту табличной части элемента

Отбор в динамическом списке по реквизиту табличной части элемента

Сделать отбор в динамическом списке в внешней обработке

Я
   rogachev

12.09.19 — 10:17

Вопрос следующий , Есть обработка .в форме ее есть реквизит Договор .

в форме обработки есть динамический список  использует в настройках основную таблицу

как сделать отбор .чтобы в список попали договора отобранные по реквизиту договор ?

  

Партнерская программа EFSOL Oblako

   Вафель

1 — 12.09.19 — 10:19

а какая разница в обработке или на форме списка?

   sqr4

2 — 12.09.19 — 10:23

(0) ахахаха бедный, как же сложно это с отборами то) Юзай отборы СКД

   sqr4

3 — 12.09.19 — 10:23

(0) в форме выбора то выкряхтил отбор?

   rogachev

4 — 12.09.19 — 10:27

(3) да из двух реквизитов отбор сделал .параметрами связи и еще доп настройки

осталось с динам списком  разобраться . была мысль передавать значение реквизита формы в поле поиск динам списка . но так как поле поиск системное .то вариант отпал

   sqr4

5 — 12.09.19 — 10:28

(4) тобишь программно не осилил, печаль)

   rogachev

6 — 12.09.19 — 10:30

(5) слушай я то делом занят .а вот ты только троллингом пока .что не одной ценной идеи

   rogachev

7 — 12.09.19 — 10:32

(5) Там если отбор делать через лев прав значение то надо в модуль списка формы выбора писать код отбора .в проц При созд На Сервере  .а мне это очень не хочется . так как во все объекты пихать свой код .

   sqr4

8 — 12.09.19 — 10:33

(6) тупому ослу, дорога только в гору. Все подсказки обойти, игнорируются.

   sqr4

9 — 12.09.19 — 10:33

(7) ты делом занят, но не своим. Сляпать по аналогии код, которого море в инете, это дело не обезьянки, а ты даже это сделать не можешь

   sqr4

10 — 12.09.19 — 10:35

   rogachev

11 — 12.09.19 — 10:35

(9) а ты на диване дома дрочишь  и скорее всего в ауле . пока я делом занят

   EVGA

12 — 12.09.19 — 10:36

(0) сделать произвольный запрос, добавить условие в него с твоим реквизитом и на форме прописать:

ПриСозданииНаСервере

Список.Параметры.УстановитьЗначениеПараметра(«ИмяПараметра», Параметр);

это если я все правильно понял

   EVGA

13 — 12.09.19 — 10:37

(12) параметр еще добавить в свойствах формы

   sqr4

14 — 12.09.19 — 10:38

(11) про осла и горы, это из русской народной литературы, недоросль блин

   rogachev

15 — 12.09.19 — 10:39

(13) (14) все запарил . найди себе дело . третий день троллишь сидишь бездельник

   sqr4

16 — 12.09.19 — 10:39

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

   sqr4

17 — 12.09.19 — 10:40

(15) это ты тратишь время/деньги заказчика, попутно ломая его систему.

   rogachev

18 — 12.09.19 — 10:40

(16) тебе 24 г  . ты кроме как на форуме сидеть ничего больше в жизни не видал и не умеешь

   rogachev

19 — 12.09.19 — 10:41

(17) твои высеры тут не уместны

   rogachev

20 — 12.09.19 — 10:42

(12) ПриСозданииНаСервере  на форме обработки?

   sqr4

21 — 12.09.19 — 10:43

(18) прикинь и я  2 года работал старшим программистом в отделе, в обязанности которого как раз входило отсеивание и подготовка стажеров. Так что на счет тебя, я уверен полностью, с таким подходом к делу и неумением пользоваться тем готовым кодом что есть, ты бы шел нахер и очень быстренько

   rogachev

22 — 12.09.19 — 10:47

(21) нахер ты сходишь и не раз . кем ты там работал мне пох.щас ты дома дрочишь

   rogachev

23 — 12.09.19 — 10:49

(21) старшим помощником младшего дворника ты работал и отсеивал чебухреков из аулов

   sqr4

24 — 12.09.19 — 10:49

(22) вот поэтому это занятие и не твое. Тупые выводы и не умение пользоваться текущий информацией, которую тебе приводят. Беги оттуда, не мучай людей.

   sqr4

25 — 12.09.19 — 10:51

(23) а запросы то писать научился?)

   rogachev

26 — 12.09.19 — 10:52

(25) не .только с ноги пинать таким как ты

   rogachev

27 — 12.09.19 — 10:53

(25) ты какой то сцуко обозленный .что на работу не берут никуда?

   sqr4

28 — 12.09.19 — 10:56

(27) скажи где ты работаешь и ты там не будешь работать)

   sqr4

29 — 12.09.19 — 10:56

(26) а вот тут по подробнее, Москва область?

   rogachev

30 — 12.09.19 — 10:57

(28) ООО Газторгпромстрой

   rogachev

31 — 12.09.19 — 10:58

(29) Тебя там фсб за жопу возьмет и ко мне приведет

   sqr4

32 — 12.09.19 — 11:04

(31) ага, только ты отбор доделаешь)

   rogachev

33 — 12.09.19 — 11:05

(32) уберите его уже отсюда . пользы нет . один троллинг

   hhhh

34 — 12.09.19 — 11:06

(33) не, это теперь твоя карма, на всю жизнь.

   sqr4

35 — 12.09.19 — 11:06

в (10) разве нет ответа на твой вопрос?

   rogachev

36 — 12.09.19 — 11:08

(34) давай про карму не будем . ты не знаешь определения этому слову .

   sqr4

37 — 12.09.19 — 11:09

(36) а ты отборы делать не умеешь)

   Niveus

38 — 12.09.19 — 11:12

за sqr4 часто вижу на форуме агрессивное поведение, с толстыми попытками  троллинга, и находятся люди которые ведутся на него xD

   hhhh

39 — 12.09.19 — 11:13

(36) ну, любовь до гроба. Как хочешь называй.

   rogachev

40 — 12.09.19 — 11:14

(38) и я про то же

   sqr4

41 — 12.09.19 — 11:14

(38) не люблю дебилов просто

   hhhh

42 — 12.09.19 — 11:17

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

   rogachev

43 — 12.09.19 — 11:18

(42) а ТС это кто?

   rogachev

44 — 12.09.19 — 11:18

(41) ты сам себя большим умником считаешь?

   rogachev

45 — 12.09.19 — 11:19

(41) я пока наблюдаю твой безделие и троллинг

   sqr4

46 — 12.09.19 — 11:21

(45) да нет, я пока свой парсер графической схемы пишу, а тебя тролю, когда надо подумать как быть дальше.

   sqr4

47 — 12.09.19 — 11:21

(44) я считаю тебя большим тупицей, к себе всегда был самокритичен и строг

   rogachev

48 — 12.09.19 — 11:30

(46) ты псих с мониакальным задатком.

   sqr4

49 — 12.09.19 — 11:37

(48) а ты недоумок с завышенным ЧСВ, но я же тебе об этом не пишу, ой

   sqr4

50 — 12.09.19 — 11:39

(48) лан все, скучный ты

   rogachev

51 — 12.09.19 — 11:43

(50)мне скучать некогда я занят делами .а вот ты херней.

   sqr4

52 — 12.09.19 — 11:50

(51) За то у меня свой парсер графической схемы будет, а ты даже не знаешь что такое графическая схема)

   sqr4

53 — 12.09.19 — 11:52

(51) а вообще я свою систему согласования пишу, универсальную для каждого документа

   sqr4

54 — 12.09.19 — 11:55

ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТвоеПолеДинамическогоСпискаЯНеЗнаюКакЕгоНазвать»);

ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

ЭлементОтбора.Использование = Истина;

ЭлементОтбора.ПравоеЗначение = Объект.Договор;

Смотри как быстро я решил твою задачу.

   FIXXXL

55 — 12.09.19 — 11:57

   rogachev

56 — 13.09.19 — 10:12

(54) ты ее не решил .вот я ее решил

мож кому пригодится как это сделать в копилку

&НаСервере

Процедура ДоговорОтбПриИзмененииНаСервере()

    ЭлементОтбора = СписокГрафиков.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Договор»);

    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

    ЭлементОтбора.ПравоеЗначение = Объект.Договор;

    ЭлементОтбора.Использование = Истина;

КонецПроцедуры

&НаКлиенте

Процедура ДоговорОтбПриИзменении(Элемент)

    ДоговорОтбПриИзмененииНаСервере();

КонецПроцедуры

   aleks_default

57 — 13.09.19 — 10:26

(56)-(54) найди десять отличий

   aleks_default

58 — 13.09.19 — 10:27

(56) Никому не пригодится, потому что гуглится за 1 миниуту

   rogachev

59 — 13.09.19 — 10:28

(57) грамотное оформление . что и где должно быть (58)  тебе точно

   hhhh

60 — 13.09.19 — 10:33

(59) ну полностью (56) совпадает с (54) значит это ты сплагиатил у него. Он же раньше сделал

   rogachev

61 — 13.09.19 — 10:35

(60) Он просто скопипастил кусок кода .а я показал как и где его правильно использовать

   sqr4

62 — 13.09.19 — 10:35

(56) ахаха, зачетно сделало и всего за пару дней) А если два раза изменить договор, а если удалить значение. А если в списке еще какие то отборы сделаны, которые надо оставить? Два тебе за решение)

   sqr4

63 — 13.09.19 — 10:38

(61) вообщем жду тебя в другой теме, может через месяц осилишь эту задачку)

   rogachev

64 — 13.09.19 — 10:45

(63) О объявился не запылился

   sqr4

65 — 13.09.19 — 10:48

(64) а еще ты написал велосипед, т.к в конфе уже есть замечательная функция) У меня сегодня праздник, а у тебя нет)

   rogachev

66 — 13.09.19 — 10:53

(65) у дураков каждый день праздник)

   rogachev

67 — 13.09.19 — 10:57

(65) слушай если ты знаешь .как сделать .чтоб при повторном выборе договора отрабатывал?

   sqr4

68 — 13.09.19 — 11:02

(66) а у программистов сегодня!)

   sqr4

69 — 13.09.19 — 11:02

(67) Конечно знаю, только вот тебе хуй скажу)

   rogachev

70 — 13.09.19 — 11:03

(69) не не знаешь

   rogachev

71 — 13.09.19 — 11:05

(69) ты из себя хер знает кого строишь . сам пустшка

    СписокГрафиков.Отбор.Элементы.Очистить();

    ЭлементОтбора = СписокГрафиков.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));

    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Договор»);

    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;

    ЭлементОтбора.ПравоеЗначение = Объект.Договор;

    ЭлементОтбора.Использование = Истина;

    Элементы.СписокГрафиков.Обновить();

   sqr4

72 — 13.09.19 — 11:08

(71) а если до этого отборы были, которые надо оставить?

   sqr4

73 — 13.09.19 — 11:08

(71) И нахера этот говнокод, когда есть общая процедура ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка

   sqr4

74 — 13.09.19 — 11:09

(71) и нахера тянуть на сервер весь контекст формы, когда тебе нужен только список?

   sqr4

75 — 13.09.19 — 11:09

(71) я уже сказал что тебе два за решение и это не твое. А все твои потуги, найти одну строчку в инете смешны

   rogachev

76 — 13.09.19 — 11:09

(72) не умничай . у меня один отбор по договору

   rogachev

77 — 13.09.19 — 11:10

(75) а тебе кол за безделие сидя дома )

   sqr4

78 — 13.09.19 — 11:10

(76) ты тупой, но пользователи еще тупее, они зайдут и поставят и скажут давай нам.

   rogachev

79 — 13.09.19 — 11:11

(75) А теперь сучонок тролльный Все свое возьми себе. мне чужого не надо

   rogachev

80 — 13.09.19 — 11:12

(78) ВСЕ СВОЕ ВОЗЬМИ СЕБЕ .ТВОИ РЕЧИ ТЕБЕ НА ПЛЕЧИ .

   sqr4

81 — 13.09.19 — 11:12

(79) пф, вышел из себя, как же ты с пользователями то работать собрался, ты же нормальное решение сделать не можешь уже третий день

   sqr4

82 — 13.09.19 — 11:13

(80) твое умение остается с тобой, я лишь указал тебе на это, оно всю жизнь твое было и будет)))

   sqr4

83 — 13.09.19 — 11:13

(80) Не истери

  

eklmn

84 — 13.09.19 — 11:45

sqr4 спасибо тебе за эту пятницу, поржал знатно!

ну и хватит уже над убогим издеваться… жалко уже его стало, его и так природа обидила

Формы списка объектов конфигурации построены с помощью объекта ДинамическийСписок. Пользователь может самостоятельно задать произвольные отборы в любом списке.

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

В этом случае можно использовать возможность установки отбора из встроенного языка. Чтобы установить отбор по нескольким реквизитам спиcка, нужно сначала создать группу элементов отбора, а затем добавить в нее собственно сами элементы отбора, которые будут связаны логическим союзом ИИЛИНЕ в зависимости от типа группы.

Рассмотрим пример, когда список номенклатуры отбирается по реквизитам списка, соединенным логическим союзом И.

Допустим, в конфигурации существуют справочники ПроизводителиПоставщики и справочник Номенклатура с реквизитами:

  • Производитель (тип СправочникСсылка.Производители),
  • Поставщик (тип СправочникСсылка.Поставщики). 

Требуется выводить список номенклатуры с отбором по этим реквизитам.

Создадим форму списка номенклатуры. Добавим в форму реквизиты Производитель (тип СправочникСсылка.Производители) и Поставщик (тип СправочникСсылка.Поставщики) и поместим их над таблицей списка. В эти поля мы будем вводить значения для отбора.

Создадим команду формы Отфильтровать и поместим ее в командную панель формы. При нажатии этой кнопки будет выполняться отбор в списке в зависимости от значений в полях формы Поставщик и Производитель.


В палитре свойств команды Отфильтровать нажмем кнопку открытия в поле Действие. Обработчик команды в модуле формы заполним следующим образом:

&НаКлиенте
Процедура Отфильтровать(Команда)
   Для Каждого ЭлементОтбора Из Список.Отбор.Элементы Цикл
      Если ЭлементОтбора.Представление = "Программный отбор" Тогда
         Список.Отбор.Элементы.Удалить(ЭлементОтбора);
      КонецЕсли;
   КонецЦикла;
   ГруппаОтбора =  Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
   ГруппаОтбора.Использование = Истина;
   ГруппаОтбора.ТипГруппы     = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
   ГруппаОтбора.Представление = "Программный отбор";
   Если НЕ Производитель.Пустая() Тогда
      ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
      ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Производитель");
      ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
      ЭлементОтбора.Использование  = Истина;
      ЭлементОтбора.ПравоеЗначение = Производитель;
      ЭлементОтбора.Представление  = "Программный отбор";
   КонецЕсли;
   Если НЕ Поставщик.Пустая() Тогда
      ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
      ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных("Поставщик");
      ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Равно;
      ЭлементОтбора.Использование  = Истина;
      ЭлементОтбора.ПравоеЗначение = Поставщик;
      ЭлементОтбора.Представление  = "Программный отбор";
   КонецЕсли;
КонецПроцедуры 

В этом обработчике сначала в цикле обходится коллекция всех элементов и групп элементов отбора для основного реквизита формы Список (типа ДинамическийСписок). И удаляются все элементы отбора, созданные программно (Представление = «Программный отбор»). Затем создается группа элементов отбора ГруппаОтбора для реквизита Список с типом логической связи ГруппаИ. И если в полях Производитель и Поставщик содержится не пустая ссылка на справочник, то эти поля добавляются в элементы отбора,  принадлежащие группе отбора.

В результате, задав в полях Производитель и Поставщик нужные значения, мы получим отбор в списке номенклатуры сразу по обоим реквизитам списка Производитель и Поставщик.

  

При этом закладка Отбор в окне Настройка списка (Все действия — Настроить список…) будет выглядеть следующим образом:


 

Выполнив команду Подробно из контекстного меню мы увидим оба условия отбора. В пользовательском режиме сюда можно добавлять другие элементы и группы отбора:


Если задано только одно из полей отбора, то отбор в списке будет выполняться только по одному реквизиту (Производитель или Поставщик).

Скачать демонстрационный пример (платформа 8.2.15.317) .

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

  • Установка отбора в пользовательском режиме
  • Установка отбора в конфигураторе
    • Фиксированный отбор
    • Динамический (программный) отбор

Установка отбора в пользовательском режиме

Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.

Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».

Рис.1 Настроить список
Рис.1 Настроить список

Откроется окно.

Рис.2 Окно настройки
Рис.2 Окно настройки

На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.

Рис.3 На вкладке «Отбор»
Рис.3 На вкладке «Отбор»

Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.

Отбор также можно группировать по логическим условиям «И», «ИЛИ».

Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»
Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»

При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.

Рис.5 Поля быстрых отборов
Рис.5 Поля быстрых отборов

Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.

Рис.6 Группа пользовательских настроек
Рис.6 Группа пользовательских настроек

Данный отбор будет сохранен только для текущего пользователя, что позволяет гибко производить кастомизированные настройки динамического списка. Однако если стоит задача сделать фиксированный отбор для определенного списка для всех пользователей системы, ее мы сможем решить только через конфигуратор.

Установка отбора в конфигураторе

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

Фиксированный отбор

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

Рис.7 Фиксированный отбор
Рис.7 Фиксированный отбор

Откроется окно.

Рис.8 Окно динамического списка
Рис.8 Окно динамического списка

Отбор задается так же, как в пользовательском режиме.

Опция «Включать в пользовательские настройки» определяет, будет ли установленный в конфигураторе отбор доступен в пользовательском режиме через пункт меню «Настроить список».

Рис.9 Настроить список
Рис.9 Настроить список

Динамический (программный) отбор

Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.

Методы

Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:


ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.

ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.

ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).

ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.

Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).

Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).

РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:

  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.

ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).

Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:


ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.

ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).

Представление Тип: Строка – представление поля компоновки.

В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.


	 ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; 
	 ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; // Опционально
     ЭлементОтбора.ПравоеЗначение = "Иванов";

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».

Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных


	ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;
 
	ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = "Иванов";
 
	ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = "Петров";

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».

Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».

Рис.10 Отбор в динамическом списке
Рис.10 Отбор в динамическом списке

Для этого к тексту запроса добавляем условие «ГДЕ Истина»…

Рис.11 Условие «ГДЕ Истина»
Рис.11 Условие «ГДЕ Истина»

…в коде:


	Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:


	Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

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

ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))

…в коде:


	Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 0);
	Список.Параметры.УстановитьЗначениеПараметра("РазрешенныеФИО", ФИО);

где ФИО – массив.

Ка видно, 2 строки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.

Добавление выбранного поля

Пример добавления выбранного поля:

Копировать в буфер обмена

// Добавим выбранное поле для вывода в отчет.
ВыбранноеПоле = Настройки.Выбор.Элементы.Добавить(Тип(«ВыбранноеПолеКомпоновкиДанных»));
ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных(«КоличествоОстаток»);

В данном примере в список выбранных полей было добавлено поле КоличествоОстаток.

Для указания взаимного расположения полей в список выбранных полей можно добавить группу выбранных полей и поместить выбранные поля в нее.

Пример:

  // Создадим группу полей, для того, чтобы выводить в ней склад в раздельных колонках.
 ГруппаПолей = Настройки.Выбор.Элементы.Добавить(Тип("ГруппаВыбранныхПолейКомпоновкиДанных"));
 // Установим шапку группы полей.
 ГруппаПолей.Заголовок = "Реквизиты склада";
 // Укажем размещение.
 ГруппаПолей.Расположение = РасположениеПоляКомпоновкиДанных.Горизонтально;
 
 // Добавим выбранное поле в группу для вывода в отчет.
 ВыбранноеПоле = ГруппаПолей.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад");
 
 // Добавим выбранное поле  в группу для вывода в отчет.
 ВыбранноеПоле = ГруппаПолей.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
 ВыбранноеПоле.Поле = Новый ПолеКомпоновкиДанных("Склад.Код");
 // Установим заголовок поля.
 ВыбранноеПоле.Заголовок = "Код";

В данном примере создана группа выбранных полей, в нее помещено два поля. Группе указано, каким образом располагать поля, вложенные в нее. Для поля Склад.Код установлен заголовок.

Добавление отбора

Пример добавления элемента отбора:

 // Добавим отбор на группу номенклатуры.
 ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии;
 ЭлементОтбора.ПравоеЗначение = ГруппаНоменклатуры;

В данном примере в отчет добавлен элемент отбора с видом сравнения «В Группе».

В отбор можно добавлять сложные условия. Делается это при помощи групп элементов отбора.

Пример добавления группового условия:

Копировать в буфер обмена

 ГруппаЭлементовОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
 ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 100;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 200;

В данном примере добавлено условие КоличествоОстаток >= 100 И КоличествоОстаток <=200.

Добавление упорядочивания

Пример добавления упорядочивания:

  // Добавим упорядочивание.
 ЭлементПорядка = Настройки.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
 ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементПорядка.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв;

В данном примере показано добавление упорядочивания по полю КоличествоОстаток в убывающем порядке.

Установка параметров вывода

Пример установки параметров вывода:

 // Установим макет оформления.
 ЭлементОформления = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("МакетОформления"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = "Море";
 
 // Укажем, что отбор не нужно выводить в отчет.
 ЭлементОформления = Настройки.ПараметрыВывода.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ВыводитьОтбор"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = ТипВыводаТекстаКомпоновкиДанных.НеВыводить;

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

Добавление условного оформления

Пример добавления условного оформления:

// Добавим условное оформление.
 ЭлементУсловногоОформления = Настройки.УсловноеОформление.Элементы.Добавить();
 
 // Создадим условие оформления.
 ГруппаЭлементовОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
 ГруппаЭлементовОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 100;
 
 ЭлементОтбора = ГруппаЭлементовОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("КоличествоОстаток");
 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.МеньшеИлиРавно;
 ЭлементОтбора.ПравоеЗначение = 200;
 
 // Укажем цвет.
 ЭлементОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных("ЦветТекста"));
 ЭлементОформления.Использование = Истина;
 ЭлементОформления.Значение = Новый Цвет(255, 0, 0);
 
 // Укажем, что оформление нужно применять только к одному полю.
 ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить();
 ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных("КоличествоОстаток");

В данном примере добавлено оформление на поле КоличествоОстаток. Поле будет отображаться красным цветом, в случае если его значение больше или равно 100 и меньше или равно 200.

Добавление группировки

Пример добавление группировки:

 // Добавим новую группировку в структуру отчета.
Группировка = Настройки.Структура.Добавить(Тип(«ГруппировкаКомпоновкиДанных»));

// Укажем, по каким полям нужно группировать.
ПолеГруппировки = Группировка.ПоляГруппировки.Элементы.Добавить(Тип(«ПолеГруппировкиКомпоновкиДанных»));
ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных(«Номенклатура»);

// Укажем тип иерархии.
ПолеГруппировки.ТипГруппировки = ТипГруппировкиКомпоновкиДанных.Иерархия;

В данном примере добавлена группировка по полю Номенклатура с иерархией.

Заметим, что группировке нужно указать, какие поля в ней нужно выводить, как упорядочивать группировку. Если нужно, чтобы состав выводимых полей и полей упорядочивания определялся системой самостоятельно на основании полей группировки и вышестоящих группировок и отчета, то нужно добавить в выбранные поля и поля упорядочивания авто поля.

Пример добавления автополей в порядок и выбранные поля.

Копировать в буфер обмена

 // Укажем, что поля, которые нужно выводить в группировке, система должна определять самостоятельно.
Группировка.Выбор.Элементы.Добавить(Тип(«АвтоВыбранноеПолеКомпоновкиДанных»));

// Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку.
Группировка.Порядок.Элементы.Добавить(Тип(«АвтоЭлементПорядкаКомпоновкиДанных»));

Добавление детальных записей

Детальные записи являются группировкой, в которой отсутствуют поля группировки.

Пример добавления детальных записей, вложенных в группировку:

Копировать в буфер обмена

// Добавим в отчет детальные записи, вложенные в группировку.
ДетальныеЗаписи = Группировка.Структура.Добавить(Тип(«ГруппировкаКомпоновкиДанных»));

// Укажем, что поля, которые нужно выводить в детальных записях, система должна определять самостоятельно.
ДетальныеЗаписи.Выбор.Элементы.Добавить(Тип(«АвтоВыбранноеПолеКомпоновкиДанных»));

// Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить детальные записи.
ДетальныеЗаписи.Порядок.Элементы.Добавить(Тип(«АвтоЭлементПорядкаКомпоновкиДанных»));

// Добавим детальным записям оформление.
ЭлементУсловногоОформления = ДетальныеЗаписи.УсловноеОформление.Элементы.Добавить();
// Укажем наклонный шрифт.
ЭлеменОформления = ЭлементУсловногоОформления.Оформление.НайтиЗначениеПараметра(Новый ПараметрКомпоновкиДанных(«Шрифт»));
ЭлеменОформления.Использование = Истина;
ЭлеменОформления.Значение = Новый Шрифт(,,, Истина);

В данном примере детальные записи добавлены в группировку, в детальные записи добавлены автополя выбора и порядка, указано условное оформление, которое будет действовать в этих детальных записях.

Добавление диаграммы

Пример добавления диаграммы:

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

 // Укажем, по какому полю нужно группировать в серии.
 ПолеГруппировки = Серия.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Склад");
 
 // Укажем, что система сама должна определять, какие поля нужно выводить в серии.
 Серия.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 
 // Укажем каким образом нужно упорядочивать данные серии
 ЭлементПорядка = Серия.Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных"));
 ЭлементПорядка.Поле = Новый ПолеКомпоновкиДанных("Склад");

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

Добавление таблицы

Пример добавления таблицы:

// Добавим в отчет таблицу
 Таблица = Настройки.Структура.Добавить(Тип("ТаблицаКомпоновкиДанных"));
 
 // Добавим в таблицу строку
 Строка = Таблица.Строки.Добавить();
 // Укажем, что система сама должна определять, какие поля нужно выводить в группировке
 Строка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 // Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку
 Строка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
 // Укажем, по какому полю нужно группировать
 ПолеГруппировки = Строка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Номенклатура");
 
 // Добавим в таблицу колонку
 Колонка = Таблица.Колонки.Добавить();
 // Укажем, что система сама должна определять, какие поля нужно выводить в группировке
 Колонка.Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
 // Укажем, что системе необходимо самостоятельно определять порядок, в котором выводить группировку
 Колонка.Порядок.Элементы.Добавить(Тип("АвтоЭлементПорядкаКомпоновкиДанных"));
 // Укажем, по какому полю нужно группировать
 ПолеГруппировки = Колонка.ПоляГруппировки.Элементы.Добавить(Тип("ПолеГруппировкиКомпоновкиДанных"));
 ПолеГруппировки.Поле = Новый ПолеКомпоновкиДанных("Склад");

В данном примере в отчет добавлена таблица, в таблице в строках выводится группировка по полю Номенклатура, а в колонках выводится группировка по полю Склад.

<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='

Related Posts

  • Получение логина и пароля техподдержки 1С из базы
  • Класс для вывода отчета в ExcelКласс для вывода отчета в Excel
  • Счет-фактура для УПП
  • Библиотека классов для создания внешней компоненты 1С на C#
  • Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
  • Прайс-лист с артикулом в отдельной колонке

15 Comments

  1. В запросе соединение надо в фигурные скобки заключить, иначе будете иметь соединение даже при отключенном отборе, что для динамических списков бывает болезненно. И вместо группировки лучше использовать «Различные». На производительность это скорее всего не повлияет, но смотрится лучше, и методически правильнее.

    Reply

  2. Да, согласен. Спасибо за замечание.

    Reply

  3. Вот оно, спасибо автору за раскрытие.

    Reply

  4. Вроде как всегда хватало просто Ctrl + F на соответствующей табличной части и получим отбор по одному полю.

    Ctrl + Q — отключение отбора.

    Reply

  5. (4) mxm2, Верно, эти комбинации клавиш действительно управляют отбором табличной части самого документа, но здесь речь про журнал(список) документов, в котором нужно управлять отбором по полям реквизитов табличных частей документа.

    Reply

  6. (5) Каюсь… Не въехал сразу. )

    Reply

  7. Хорошо, доступно оформленная мысль. Автору спасибо. Для кого-то будет шпаркалкой.

    Reply

  8. (1) Armando, вопрос сравнения производительности и выбора конструкций distinct (различные) и group by довольно часто поднимается и однозначного ответа на него нет. Уж больно все разнится на разных субд и разных запросах 🙂

    Да, «различные» проще и красивее выглядит, но не всегда быстрее 🙂

    Reply

  9. (8) nixel, я тоже точно не знаю. Надо план запроса смотреть. Просто привык, что вместе с группировкой используются агрегатные функции. А тут конкретно уникальные строки получить надо.

    Reply

  10. Спасибо за статью! Но у меня почему-то пропадают значки документов в списке после указанных действий ((( Кто сталкивался с такой проблемой?

    Reply

  11. (12) 7nightfly7, сложно диагностировать без скриншотика, картинки строк настраиваются в свойствах списка на закладке Использование (свойство ПутьКДаннымКартинкиСтроки обычно равно значению Список.СтандартнаяКартинка). Если же в списке использовалось свое собственное поле картинки, то нужно проследить, что реквизит списка, связанный с картинкой строк, присутствует в выбранных полях текста запроса.

    Reply

  12. Столкнулся с тем, что при такой схеме не корректно работают отборы с условиями с НЕ (НЕ равно, НЕ в списке) для поля с табличной частью

    Reply

  13. Просто

    СГРУППИРОВАТЬ ПО
    ДокументТабельУчетаРабочегоВремени.Ссылка

    тоже замечательно работает

    Reply

  14. Чуть было не изобрел велосипед! Спасибо автору ⭐

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *

В статье будут рассмотрены варианты установки отбора в управляемых формах 1С 8.3. Отбор для динамического списка может быть установлен статически или динамически, в пользовательском интерфейсе или конфигураторе. Все варианты отборов мы рассмотрим ниже.

  • Установка отбора в пользовательском режиме
  • Установка отбора в конфигураторе

    • Фиксированный отбор
    • Динамический (программный) отбор

Установка отбора в пользовательском режиме

Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.

Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».

Рис.1 Настроить список
Рис.1 Настроить список

 

Откроется окно.

Рис.2 Окно настройки
Рис.2 Окно настройки

 

На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.

Рис.3 На вкладке «Отбор»
Рис.3 На вкладке «Отбор»

 

Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.

Отбор также можно группировать по логическим условиям «И», «ИЛИ».

Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»
Рис.4 Отбор также можно группировать по логическим условиям «И», «ИЛИ»

 

При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.

Рис.5 Поля быстрых отборов
Рис.5 Поля быстрых отборов

 

Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.

Рис.6 Группа пользовательских настроек
Рис.6 Группа пользовательских настроек

 

Данный отбор будет сохранен только для текущего пользователя, что позволяет гибко производить кастомизированные настройки динамического списка. Однако если стоит задача сделать фиксированный отбор для определенного списка для всех пользователей системы, ее мы сможем решить только через конфигуратор.

Установка отбора в конфигураторе

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

Фиксированный отбор

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

Рис.7 Фиксированный отбор
Рис.7 Фиксированный отбор

 

Откроется окно.

Рис.8 Окно динамического списка
Рис.8 Окно динамического списка

 

Отбор задается так же, как в пользовательском режиме.

Опция «Включать в пользовательские настройки» определяет, будет ли установленный в конфигураторе отбор доступен в пользовательском режиме через пункт меню «Настроить список».

Рис.9 Настроить список
Рис.9 Настроить список

 

Динамический (программный) отбор

Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.

Методы

Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:


	 ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.

ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.

ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).

ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.

Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).

Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).

РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:

  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
  • РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.

ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).

Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:


	 ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()

Сигнатура данного метода:

ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.

ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).

Представление Тип: Строка – представление поля компоновки.

В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.


	 ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	 ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	 ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; 
	 ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; // Опционально
     ЭлементОтбора.ПравоеЗначение = "Иванов";

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».

Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных


	ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
	ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;
 
	ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = "Иванов";
 
	ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
	ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
	ЭлементОтбора.ПравоеЗначение = "Петров";

Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».

Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».

Рис.10 Отбор в динамическом списке
Рис.10 Отбор в динамическом списке

 

Для этого к тексту запроса добавляем условие «ГДЕ Истина»…

Рис.11 Условие «ГДЕ Истина»
Рис.11 Условие «ГДЕ Истина»

 

…в коде:


	Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:


	Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";

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

ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))

…в коде:


	Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 0);
	Список.Параметры.УстановитьЗначениеПараметра("РазрешенныеФИО", ФИО);

Тут ФИО – массив.

Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.

Содержание:

1.     Отборы в динамическом списке в пользовательском режиме 1С

2.     Отборы в динамическом списке 1С 8.3 программно 

1.     Отборы в динамическом списке в пользовательском режиме 1С

Динамический список в 1С 8 – это реквизит управляемой формы, в котором отображаются данные, собранные посредством запроса к текущей конфигурации базы данных. Его чаще всего используют в формах списка справочников, документов, а также в обработках, где необходимо вывести массив данных в 1С построчно в виде таблицы. Помимо отборов в таком списке есть возможность указать условное оформление данных, группировки данных и порядок сортировки.

Любой пользователь может добавить необходимые ему отборы в любой форме, где используется динамический список в 1С 8. Фильтр применяется по любому доступному к выбору полю. Чтобы выполнить это действие, нужно перейти по кнопке «Еще» (в правом верхнем углу формы) – «Настроить список»:

1s konfiguracija 3.0.png

Документы продажи: накладная в 1С 8

на вкладку отбор в 1С 8:

1s konfiguracija.png

Отбор в 1С 8

Здесь из левой колонки пользователю нужно перенести вправо те поля, по которым ему требуется отфильтровать данные. Также обязательно нужно установить флажок в первой колонке, и указать значение своего фильтра. После выбора нужных полей эта информация будет отображаться на первой вкладке формы настройки списка в 1С:

forma spiska spravochnika.png

Настройка списка в 1С

Установленный флажок указывает, используется ли в данный момент этот отбор. Если флажок отключить, то действие выбранного фильтра прекращается до его последующего включения.

Для того чтобы управлять отборами непосредственно из основной формы без помощи вспомогательной формы, их можно вывести в шапку первичной формы. Для этого в форме настройки списка в 1С после нажатия кнопок «Еще» – Свойства элемента Пользовательских настроек в 1С, откроется форма: Пользовательские настройки элемента в 1С:

forma spiska spravochnika v 1s.png


Свойства элемента пользовательских настроек в 1С 

5 nastrojka spiska v 1s.png

Пользовательские настройки в 1С

В этом окне устанавливаем верхний флажок и в поле «Режим редактирования» выбираем значение «Быстрый доступ». Далее нажимаем кнопку «Ок» и завершаем настройки редактирования.

После этого мы видим, что выбранные фильтры доступны сразу в форме списка, где есть возможность их включать/отключать и менять значение:

6 nastrojka spiska.png

Накладные в 1С 8   

2.     Отборы в динамическом списке 1С 8 программно

Теперь рассмотрим возможности программной установки отборов в динамическом списке в 1С 8.

В типовых конфигурациях 8.3 для этих целей используют процедуры и функции общего модуля ОбщегоНазначенияКлиентСервер. Доступ к этому модулю будет как на стороне клиента, так и на стороне сервера. В этом модуле содержаться экспортные процедуры в 1С и функции, с помощью которых выполняется добавление, создание, изменение, установка, поиск или удаление элементов/группы отбора динамического списка в 1С 8:

— НайтиЭлементыИГруппыОтбора;

— СоздатьГруппуЭлементовОтбора;

— ДобавитьЭлементКомпоновки;

— ИзменитьЭлементыОтбора;

— УдалитьЭлементыГруппыОтбора;

— УстановитьЭлементОтбора;

— УстановитьЭлементОтбораДинамическогоСписка;

— УдалитьЭлементыГруппыОтбораДинамическогоСписка;

Пример использования процедур этого модуля:

7 nastrojka spiska 1s.png

Функции общего модуля

Здесь идет установка фильтров по полям «Менеджер», «Статус» и «Вариант оформления» в форме списка документа: Реализация товаров и услуг в 1С.

8 spisok v 1s.png

Реализация товаров и услуг в 1С

В этом месте идет установка фильтра по полю периода в динамическом списке в 1С 8 на форме обработки.

Другие примеры использования процедур и функций по работе с отбором динамического списка в 1С 8 модуля ОбщегоНазначенияКлиентСервер можно найти в типовых конфигурациях 1С 8.3 и применять их в своих доработках, так как хорошим тоном программирования считается использование именно типовых процедур и функций, а не самостоятельно написанных.

Специалист компании «Кодерлайн»

Дарья Губернаторова

Понравилась статья? Поделить с друзьями:

Другие крутые статьи на нашем сайте:

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии