На днях получил задание реализовать поиск документа по контрагенту, указанному в нем. Все было бы элементарно просто, но структура документа была не совсем обычна. Документ регистрирует продажу долга контрагентов сторонней организации, при этом одним документом может продаваться сразу несколько долгов. Поэтому в документе есть табличная часть, состоящая из двух колонок: Контрагент и СуммаДолга.
Список документов представлен управляемой формой и динамическим списком на ней. И конечно стандартный инструмент Настройка списка дает возможность проводить отбор только по реквизитам документа, но не по реквизитам табличной части.
Рассмотрим причину возникновения этой проблемы. Дело в том, что формирование динамического списка происходит на основе запроса. Этот запрос может быть сформирован как вручную, так и автоматически, если мы указываем Основную таблицу динамического списка. Когда мы создаем форму списка по умолчанию применяется второй способ — автоматическое формирование запроса. При этом в выбираемые поля запроса попадают все реквизиты документа и табличные части. И именно по этим полям потом можно делать отбор. Но табличные части попадают в поле запроса целиком, поэтому сделать отбор по конкретному реквизиту табличной части невозможно.
Решением проблемы может быть изменение стандартного автоматически формируемого запроса. Для этого нужно выполнить следующие действия:
- В свойствах реквизита Список на управляемой форме установим флаг Произвольного запроса и перейдем в Настройку списка. Для наглядности для появившегося запроса можно открыть конструктор запросов.
- В конструкторе запросов необходимо убрать из полей выборки все табличне части. Вместо этого добавим табличную часть, по реквизиту которой необходимо делать отбор, в источники запроса (таблицы).
- Далее левым соединением соединяем табличные части с самим документом.
- И делаем группировку по всем полям (хотя можно и использовать ВЫБРАТЬ РАЗЛИЧНЫЕ).
- На вкладке Компановка данных — Таблицы снимаем флаг Обязательно для табличной части. Это нужно для того, чтобы соединение выполнялось не всегда, а только если используется отбор. Таким образом экономятся ресурсы и ускоряется работа конфигурации.
На вкладке Компановка данных — Условия создаем необходимые условия отбора по необходимым реквизитам табличной части.
- Сохраняем запрос и переходим на вкладку Настройка. Там можно сразу добавить необходимые условия отбора, чтобы пользователям самим не приходилось каждый раз выбирать поля. Не забудьте снять флаги с полей отбора, иначе при открытии формы списка условие отбора будет сразу применено.
Сделать отбор в динамическом списке в внешней обработке |
Я |
12.09.19 — 10:17
Вопрос следующий , Есть обработка .в форме ее есть реквизит Договор .
в форме обработки есть динамический список использует в настройках основную таблицу
как сделать отбор .чтобы в список попали договора отобранные по реквизиту договор ?
1 — 12.09.19 — 10:19
а какая разница в обработке или на форме списка?
2 — 12.09.19 — 10:23
(0) ахахаха бедный, как же сложно это с отборами то) Юзай отборы СКД
3 — 12.09.19 — 10:23
(0) в форме выбора то выкряхтил отбор?
4 — 12.09.19 — 10:27
(3) да из двух реквизитов отбор сделал .параметрами связи и еще доп настройки
осталось с динам списком разобраться . была мысль передавать значение реквизита формы в поле поиск динам списка . но так как поле поиск системное .то вариант отпал
5 — 12.09.19 — 10:28
(4) тобишь программно не осилил, печаль)
6 — 12.09.19 — 10:30
(5) слушай я то делом занят .а вот ты только троллингом пока .что не одной ценной идеи
7 — 12.09.19 — 10:32
(5) Там если отбор делать через лев прав значение то надо в модуль списка формы выбора писать код отбора .в проц При созд На Сервере .а мне это очень не хочется . так как во все объекты пихать свой код .
8 — 12.09.19 — 10:33
(6) тупому ослу, дорога только в гору. Все подсказки обойти, игнорируются.
9 — 12.09.19 — 10:33
(7) ты делом занят, но не своим. Сляпать по аналогии код, которого море в инете, это дело не обезьянки, а ты даже это сделать не можешь
10 — 12.09.19 — 10:35
11 — 12.09.19 — 10:35
(9) а ты на диване дома дрочишь и скорее всего в ауле . пока я делом занят
12 — 12.09.19 — 10:36
(0) сделать произвольный запрос, добавить условие в него с твоим реквизитом и на форме прописать:
ПриСозданииНаСервере
Список.Параметры.УстановитьЗначениеПараметра(«ИмяПараметра», Параметр);
это если я все правильно понял
13 — 12.09.19 — 10:37
(12) параметр еще добавить в свойствах формы
14 — 12.09.19 — 10:38
(11) про осла и горы, это из русской народной литературы, недоросль блин
15 — 12.09.19 — 10:39
(13) (14) все запарил . найди себе дело . третий день троллишь сидишь бездельник
16 — 12.09.19 — 10:39
(11) я таких как ты перевидал, вагон и маленькую тележку. Некоторых даже, работать научил. И тебе сразу скажу, не твое это
17 — 12.09.19 — 10:40
(15) это ты тратишь время/деньги заказчика, попутно ломая его систему.
18 — 12.09.19 — 10:40
(16) тебе 24 г . ты кроме как на форуме сидеть ничего больше в жизни не видал и не умеешь
19 — 12.09.19 — 10:41
(17) твои высеры тут не уместны
20 — 12.09.19 — 10:42
(12) ПриСозданииНаСервере на форме обработки?
21 — 12.09.19 — 10:43
(18) прикинь и я 2 года работал старшим программистом в отделе, в обязанности которого как раз входило отсеивание и подготовка стажеров. Так что на счет тебя, я уверен полностью, с таким подходом к делу и неумением пользоваться тем готовым кодом что есть, ты бы шел нахер и очень быстренько
22 — 12.09.19 — 10:47
(21) нахер ты сходишь и не раз . кем ты там работал мне пох.щас ты дома дрочишь
23 — 12.09.19 — 10:49
(21) старшим помощником младшего дворника ты работал и отсеивал чебухреков из аулов
24 — 12.09.19 — 10:49
(22) вот поэтому это занятие и не твое. Тупые выводы и не умение пользоваться текущий информацией, которую тебе приводят. Беги оттуда, не мучай людей.
25 — 12.09.19 — 10:51
(23) а запросы то писать научился?)
26 — 12.09.19 — 10:52
(25) не .только с ноги пинать таким как ты
27 — 12.09.19 — 10:53
(25) ты какой то сцуко обозленный .что на работу не берут никуда?
28 — 12.09.19 — 10:56
(27) скажи где ты работаешь и ты там не будешь работать)
29 — 12.09.19 — 10:56
(26) а вот тут по подробнее, Москва область?
30 — 12.09.19 — 10:57
(28) ООО Газторгпромстрой
31 — 12.09.19 — 10:58
(29) Тебя там фсб за жопу возьмет и ко мне приведет
32 — 12.09.19 — 11:04
(31) ага, только ты отбор доделаешь)
33 — 12.09.19 — 11:05
(32) уберите его уже отсюда . пользы нет . один троллинг
34 — 12.09.19 — 11:06
(33) не, это теперь твоя карма, на всю жизнь.
35 — 12.09.19 — 11:06
в (10) разве нет ответа на твой вопрос?
36 — 12.09.19 — 11:08
(34) давай про карму не будем . ты не знаешь определения этому слову .
37 — 12.09.19 — 11:09
(36) а ты отборы делать не умеешь)
38 — 12.09.19 — 11:12
за sqr4 часто вижу на форуме агрессивное поведение, с толстыми попытками троллинга, и находятся люди которые ведутся на него xD
39 — 12.09.19 — 11:13
(36) ну, любовь до гроба. Как хочешь называй.
40 — 12.09.19 — 11:14
(38) и я про то же
41 — 12.09.19 — 11:14
(38) не люблю дебилов просто
42 — 12.09.19 — 11:17
(38) ну на форуме тут всегда слегка подтрунивают друг над другом. Непонятно, чего ТС взбеленился, прямо бьется в истерике. Таким опасно помогать. Потом тебя же и обосрут.
43 — 12.09.19 — 11:18
(42) а ТС это кто?
44 — 12.09.19 — 11:18
(41) ты сам себя большим умником считаешь?
45 — 12.09.19 — 11:19
(41) я пока наблюдаю твой безделие и троллинг
46 — 12.09.19 — 11:21
(45) да нет, я пока свой парсер графической схемы пишу, а тебя тролю, когда надо подумать как быть дальше.
47 — 12.09.19 — 11:21
(44) я считаю тебя большим тупицей, к себе всегда был самокритичен и строг
48 — 12.09.19 — 11:30
(46) ты псих с мониакальным задатком.
49 — 12.09.19 — 11:37
(48) а ты недоумок с завышенным ЧСВ, но я же тебе об этом не пишу, ой
50 — 12.09.19 — 11:39
(48) лан все, скучный ты
51 — 12.09.19 — 11:43
(50)мне скучать некогда я занят делами .а вот ты херней.
52 — 12.09.19 — 11:50
(51) За то у меня свой парсер графической схемы будет, а ты даже не знаешь что такое графическая схема)
53 — 12.09.19 — 11:52
(51) а вообще я свою систему согласования пишу, универсальную для каждого документа
54 — 12.09.19 — 11:55
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«ТвоеПолеДинамическогоСпискаЯНеЗнаюКакЕгоНазвать»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.Использование = Истина;
ЭлементОтбора.ПравоеЗначение = Объект.Договор;
Смотри как быстро я решил твою задачу.
55 — 12.09.19 — 11:57
56 — 13.09.19 — 10:12
(54) ты ее не решил .вот я ее решил
мож кому пригодится как это сделать в копилку
&НаСервере
Процедура ДоговорОтбПриИзмененииНаСервере()
ЭлементОтбора = СписокГрафиков.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Договор»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Объект.Договор;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ДоговорОтбПриИзменении(Элемент)
ДоговорОтбПриИзмененииНаСервере();
КонецПроцедуры
57 — 13.09.19 — 10:26
(56)-(54) найди десять отличий
58 — 13.09.19 — 10:27
(56) Никому не пригодится, потому что гуглится за 1 миниуту
59 — 13.09.19 — 10:28
(57) грамотное оформление . что и где должно быть (58) тебе точно
60 — 13.09.19 — 10:33
(59) ну полностью (56) совпадает с (54) значит это ты сплагиатил у него. Он же раньше сделал
61 — 13.09.19 — 10:35
(60) Он просто скопипастил кусок кода .а я показал как и где его правильно использовать
62 — 13.09.19 — 10:35
(56) ахаха, зачетно сделало и всего за пару дней) А если два раза изменить договор, а если удалить значение. А если в списке еще какие то отборы сделаны, которые надо оставить? Два тебе за решение)
63 — 13.09.19 — 10:38
(61) вообщем жду тебя в другой теме, может через месяц осилишь эту задачку)
64 — 13.09.19 — 10:45
(63) О объявился не запылился
65 — 13.09.19 — 10:48
(64) а еще ты написал велосипед, т.к в конфе уже есть замечательная функция) У меня сегодня праздник, а у тебя нет)
66 — 13.09.19 — 10:53
(65) у дураков каждый день праздник)
67 — 13.09.19 — 10:57
(65) слушай если ты знаешь .как сделать .чтоб при повторном выборе договора отрабатывал?
68 — 13.09.19 — 11:02
(66) а у программистов сегодня!)
69 — 13.09.19 — 11:02
(67) Конечно знаю, только вот тебе хуй скажу)
70 — 13.09.19 — 11:03
(69) не не знаешь
71 — 13.09.19 — 11:05
(69) ты из себя хер знает кого строишь . сам пустшка
СписокГрафиков.Отбор.Элементы.Очистить();
ЭлементОтбора = СписокГрафиков.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«Договор»);
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = Объект.Договор;
ЭлементОтбора.Использование = Истина;
Элементы.СписокГрафиков.Обновить();
72 — 13.09.19 — 11:08
(71) а если до этого отборы были, которые надо оставить?
73 — 13.09.19 — 11:08
(71) И нахера этот говнокод, когда есть общая процедура ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка
74 — 13.09.19 — 11:09
(71) и нахера тянуть на сервер весь контекст формы, когда тебе нужен только список?
75 — 13.09.19 — 11:09
(71) я уже сказал что тебе два за решение и это не твое. А все твои потуги, найти одну строчку в инете смешны
76 — 13.09.19 — 11:09
(72) не умничай . у меня один отбор по договору
77 — 13.09.19 — 11:10
(75) а тебе кол за безделие сидя дома )
78 — 13.09.19 — 11:10
(76) ты тупой, но пользователи еще тупее, они зайдут и поставят и скажут давай нам.
79 — 13.09.19 — 11:11
(75) А теперь сучонок тролльный Все свое возьми себе. мне чужого не надо
80 — 13.09.19 — 11:12
(78) ВСЕ СВОЕ ВОЗЬМИ СЕБЕ .ТВОИ РЕЧИ ТЕБЕ НА ПЛЕЧИ .
81 — 13.09.19 — 11:12
(79) пф, вышел из себя, как же ты с пользователями то работать собрался, ты же нормальное решение сделать не можешь уже третий день
82 — 13.09.19 — 11:13
(80) твое умение остается с тобой, я лишь указал тебе на это, оно всю жизнь твое было и будет)))
83 — 13.09.19 — 11:13
(80) Не истери
eklmn
84 — 13.09.19 — 11:45
sqr4 спасибо тебе за эту пятницу, поржал знатно!
ну и хватит уже над убогим издеваться… жалко уже его стало, его и так природа обидила
Формы списка объектов конфигурации построены с помощью объекта ДинамическийСписок. Пользователь может самостоятельно задать произвольные отборы в любом списке.
Однако зачастую заранее известно, что в конкретном списке будут часто использоваться отборы лишь по нескольким конкретным полям. И необходимо предоставить возможность простого и быстрого ввода требуемых значений и отбора по ним.
В этом случае можно использовать возможность установки отбора из встроенного языка. Чтобы установить отбор по нескольким реквизитам спиcка, нужно сначала создать группу элементов отбора, а затем добавить в нее собственно сами элементы отбора, которые будут связаны логическим союзом И, ИЛИ, НЕ в зависимости от типа группы.
Рассмотрим пример, когда список номенклатуры отбирается по реквизитам списка, соединенным логическим союзом И.
Допустим, в конфигурации существуют справочники Производители, Поставщики и справочник Номенклатура с реквизитами:
- Производитель (тип СправочникСсылка.Производители),
- Поставщик (тип СправочникСсылка.Поставщики).
Требуется выводить список номенклатуры с отбором по этим реквизитам.
Создадим форму списка номенклатуры. Добавим в форму реквизиты Производитель (тип СправочникСсылка.Производители) и Поставщик (тип СправочникСсылка.Поставщики) и поместим их над таблицей списка. В эти поля мы будем вводить значения для отбора.
Создадим команду формы Отфильтровать и поместим ее в командную панель формы. При нажатии этой кнопки будет выполняться отбор в списке в зависимости от значений в полях формы Поставщик и Производитель.
В палитре свойств команды Отфильтровать нажмем кнопку открытия в поле Действие. Обработчик команды в модуле формы заполним следующим образом:
&НаКлиенте Процедура Отфильтровать(Команда)
Для Каждого ЭлементОтбора Из Список.Отбор.Элементы Цикл Если ЭлементОтбора.Представление = "Программный отбор" Тогда Список.Отбор.Элементы.Удалить(ЭлементОтбора);
КонецЕсли;
КонецЦикла;
ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ГруппаОтбора.Использование = Истина; ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; ГруппаОтбора.Представление = "Программный отбор";
Если НЕ Производитель.Пустая() Тогда ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Производитель"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = Производитель; ЭлементОтбора.Представление = "Программный отбор";
КонецЕсли;
Если НЕ Поставщик.Пустая() Тогда ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Поставщик"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = Поставщик; ЭлементОтбора.Представление = "Программный отбор";
КонецЕсли;
КонецПроцедуры
В этом обработчике сначала в цикле обходится коллекция всех элементов и групп элементов отбора для основного реквизита формы Список (типа ДинамическийСписок). И удаляются все элементы отбора, созданные программно (Представление = «Программный отбор»). Затем создается группа элементов отбора ГруппаОтбора для реквизита Список с типом логической связи ГруппаИ. И если в полях Производитель и Поставщик содержится не пустая ссылка на справочник, то эти поля добавляются в элементы отбора, принадлежащие группе отбора.
В результате, задав в полях Производитель и Поставщик нужные значения, мы получим отбор в списке номенклатуры сразу по обоим реквизитам списка Производитель и Поставщик.
При этом закладка Отбор в окне Настройка списка (Все действия — Настроить список…) будет выглядеть следующим образом:
Выполнив команду Подробно из контекстного меню мы увидим оба условия отбора. В пользовательском режиме сюда можно добавлять другие элементы и группы отбора:
Если задано только одно из полей отбора, то отбор в списке будет выполняться только по одному реквизиту (Производитель или Поставщик).
Скачать демонстрационный пример (платформа 8.2.15.317) .
Отбор для динамического списка может быть установлен статически или динамически, в пользовательском интерфейсе или конфигураторе. Все варианты отборов мы рассмотрим ниже.
- Установка отбора в пользовательском режиме
- Установка отбора в конфигураторе
- Фиксированный отбор
- Динамический (программный) отбор
Установка отбора в пользовательском режиме
Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.
Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».
Откроется окно.
На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.
Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.
Отбор также можно группировать по логическим условиям «И», «ИЛИ».
При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.
Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.
Данный отбор будет сохранен только для текущего пользователя, что позволяет гибко производить кастомизированные настройки динамического списка. Однако если стоит задача сделать фиксированный отбор для определенного списка для всех пользователей системы, ее мы сможем решить только через конфигуратор.
Установка отбора в конфигураторе
Работая в конфигураторе, мы можем устанавливать отбор динамического списка двух видов – фиксированный и динамический. Фиксированный отбор настраивается один раз, динамический или программный – можно устанавливать в зависимости от каких-либо данных в системе.
Фиксированный отбор
Принцип установки фиксированного отбора в конфигураторе не отличается от установки в пользовательском режиме описанном выше. Чтобы установить отбор, мы должны открыть настройки динамического списка.
Откроется окно.
Отбор задается так же, как в пользовательском режиме.
Опция «Включать в пользовательские настройки» определяет, будет ли установленный в конфигураторе отбор доступен в пользовательском режиме через пункт меню «Настроить список».
Динамический (программный) отбор
Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.
Методы
Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.
ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.
ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).
ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.
Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).
Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).
РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.
ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).
Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:
ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.
ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).
Представление Тип: Строка – представление поля компоновки.
В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; // Опционально
ЭлементОтбора.ПравоеЗначение = "Иванов";
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».
Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных
ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Иванов";
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Петров";
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».
Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».
Для этого к тексту запроса добавляем условие «ГДЕ Истина»…
…в коде:
Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";
Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:
Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";
Если этого не учесть будет ошибка, но чтобы этого избежать, можно переделать на другую реализацию. В текс запроса добавляем такое условие:
ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))
…в коде:
Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 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
Счет-фактура для УПП
Библиотека классов для создания внешней компоненты 1С на C#
Акт об оказании услуг (со скидками) — внешняя печатная форма для Управление торговлей 11.1.10.86
Прайс-лист с артикулом в отдельной колонке
15 Comments
-
В запросе соединение надо в фигурные скобки заключить, иначе будете иметь соединение даже при отключенном отборе, что для динамических списков бывает болезненно. И вместо группировки лучше использовать «Различные». На производительность это скорее всего не повлияет, но смотрится лучше, и методически правильнее.
Reply ↓
-
Да, согласен. Спасибо за замечание.
Reply ↓
-
Вот оно, спасибо автору за раскрытие.
Reply ↓
-
Вроде как всегда хватало просто Ctrl + F на соответствующей табличной части и получим отбор по одному полю.
Ctrl + Q — отключение отбора.
Reply ↓
-
(4) mxm2, Верно, эти комбинации клавиш действительно управляют отбором табличной части самого документа, но здесь речь про журнал(список) документов, в котором нужно управлять отбором по полям реквизитов табличных частей документа.
Reply ↓
-
(5) Каюсь… Не въехал сразу. )
Reply ↓
-
Хорошо, доступно оформленная мысль. Автору спасибо. Для кого-то будет шпаркалкой.
Reply ↓
-
(1) Armando, вопрос сравнения производительности и выбора конструкций distinct (различные) и group by довольно часто поднимается и однозначного ответа на него нет. Уж больно все разнится на разных субд и разных запросах 🙂
Да, «различные» проще и красивее выглядит, но не всегда быстрее 🙂
Reply ↓
-
(8) nixel, я тоже точно не знаю. Надо план запроса смотреть. Просто привык, что вместе с группировкой используются агрегатные функции. А тут конкретно уникальные строки получить надо.
Reply ↓
-
-
Спасибо за статью! Но у меня почему-то пропадают значки документов в списке после указанных действий ((( Кто сталкивался с такой проблемой?
Reply ↓
-
(12) 7nightfly7, сложно диагностировать без скриншотика, картинки строк настраиваются в свойствах списка на закладке Использование (свойство ПутьКДаннымКартинкиСтроки обычно равно значению Список.СтандартнаяКартинка). Если же в списке использовалось свое собственное поле картинки, то нужно проследить, что реквизит списка, связанный с картинкой строк, присутствует в выбранных полях текста запроса.
Reply ↓
-
Столкнулся с тем, что при такой схеме не корректно работают отборы с условиями с НЕ (НЕ равно, НЕ в списке) для поля с табличной частью
Reply ↓
-
Просто
СГРУППИРОВАТЬ ПО
ДокументТабельУчетаРабочегоВремени.Ссылка
тоже замечательно работает
Reply ↓
-
Чуть было не изобрел велосипед! Спасибо автору ⭐
Reply ↓
Leave a Comment
Ваш адрес email не будет опубликован. Обязательные поля помечены *
В статье будут рассмотрены варианты установки отбора в управляемых формах 1С 8.3. Отбор для динамического списка может быть установлен статически или динамически, в пользовательском интерфейсе или конфигураторе. Все варианты отборов мы рассмотрим ниже.
- Установка отбора в пользовательском режиме
-
Установка отбора в конфигураторе
- Фиксированный отбор
- Динамический (программный) отбор
Установка отбора в пользовательском режиме
Динамический список в отличие от таблицы или дерева значений – более подходящее решение для реализации форм содержащих какие-либо списки, т.к. динамический список предоставляет наиболее широкий набор инструментов для работы с отбором, группировкой полей, сортировкой. Данный отбор можно установить при работе в пользовательском режиме или конфигураторе, принцип одинаков.
Для установки отбора в режиме предприятия необходимо вызвать команду «Настроить список».
Откроется окно.
На вкладке «отбор» представлен список полей, который есть в текущем списке. Выбираем поля списка, по которым будем фильтровать. Сделать это можно двойным кликом или используя drag and drop.
Задаем вид сравнения и значение, жмем «Завершить редактирование», отбор установлен.
Отбор также можно группировать по логическим условиям «И», «ИЛИ».
При установке отбора в режиме предприятия на форме списка автоматически создаются поля так называемых быстрых отборов.
Чтобы платформа 1С автоматически создавала поля быстрых отборов, при разработке формы в конфигураторе необходимо указать группу пользовательских настроек.
Данный отбор будет сохранен только для текущего пользователя, что позволяет гибко производить кастомизированные настройки динамического списка. Однако если стоит задача сделать фиксированный отбор для определенного списка для всех пользователей системы, ее мы сможем решить только через конфигуратор.
Установка отбора в конфигураторе
Работая в конфигураторе, мы можем устанавливать отбор динамического списка двух видов – фиксированный и динамический. Фиксированный отбор настраивается один раз, динамический или программный – можно устанавливать в зависимости от каких-либо данных в системе.
Фиксированный отбор
Принцип установки фиксированного отбора в конфигураторе не отличается от установки в пользовательском режиме описанном выше. Чтобы установить отбор, мы должны открыть настройки динамического списка.
Откроется окно.
Отбор задается так же, как в пользовательском режиме.
Опция «Включать в пользовательские настройки» определяет, будет ли установленный в конфигураторе отбор доступен в пользовательском режиме через пункт меню «Настроить список».
Динамический (программный) отбор
Зачастую возникает необходимость устанавливать отбор программно, например, при открытии формы выбора, когда нам необходимо открыть управляемую форму с отбором. В форму передается параметр и по этому параметру устанавливается отбор. Частый пример этого – отбор элементов справочника по владельцу.
Методы
Если в разрабатываемой конфигурации присутствует подсистема БСП «БазоваяФункциональность», программный отбор в динамическом списке можно установить используя типовой метод:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка()
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – Список, в котором требуется установить отбор.
ИмяПоля Тип: Строка – Поле, по которому необходимо установить отбор.
ПравоеЗначение Тип: Произвольный – Значение отбора (Необязательный. Значение по умолчанию: Неопределено. Внимание! Если передать Неопределено, то значение не будет изменено).
ВидСравнения Тип: ВидСравненияКомпоновкиДанных – Условие отбора.
Представление Тип: Строка – Представление элемента компоновки данных (Необязательный. Значение по умолчанию: Неопределено. Если указано, то выводится только флажок использования с указанным представлением (значение не выводится). Для очистки, чтобы значение снова выводилось, следует передать пустую строку).
Использование Тип: Булево – Флажок использования этого отбора (Необязательный. Значение по умолчанию: Неопределено).
РежимОтображения Тип: РежимОтображенияЭлементаНастройкиКомпоновкиДанных – Способ отображения этого отбора пользователю. Возможные значения:
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ – В группе быстрых настроек над списком.
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Обычный – В настройка списка (в подменю Еще).
- РежимОтображенияЭлементаНастройкиКомпоновкиДанных.Недоступный – Запретить пользователю менять этот отбор.
ИдентификаторПользовательскойНастройки Тип: Строка – Уникальный идентификатор этого отбора (Используется для связи с пользовательскими настройками).
Для удаления какого-то значения отбора необходимо воспользоваться типовым методом:
ОбщегоНазначенияКлиентСервер. УдалитьЭлементыГруппыОтбораДинамическогоСписка ()
Сигнатура данного метода:
ДинамическийСписок Тип: ДинамическийСписок – реквизит формы, для которого требуется установить отбор.
ИмяПоля Тип: Строка – имя поля компоновки (не используется для групп).
Представление Тип: Строка – представление поля компоновки.
В случае отсутствие в системе БСП отбор можно установить самостоятельно, используя объект ПолеКомпоновкиДанных.
ЭлементОтбора = Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных.БыстрыйДоступ; // Опционально
ЭлементОтбора.ПравоеЗначение = "Иванов";
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов».
Для использования логических «И», «ИЛИ», «НЕ» предназначен тип данных ГруппаЭлементовОтбораКомпоновкиДанных
ГруппаОтбора = Список.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных"));
ГруппаОтбора.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИЛИ;
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Иванов";
ЭлементОтбора = ГруппаОтбора.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("ФИО");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно;
ЭлементОтбора.ПравоеЗначение = "Петров";
Данный отбор отберет строки, в которых значение «ФИО» = «Иванов» или «Петров».
Отбор в динамическом списке также можно производить через изменение текста запроса динамического списка. Этот вариант работает, когда динамический список сделан через «произвольный запрос».
Для этого к тексту запроса добавляем условие «ГДЕ Истина»…
…в коде:
Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";
Как видно, такой подход более компактный с точки зрения написания кода. Чем сложнее условия отбора в табличной части мы хотим установить, тем более громоздким будет вариант с использованием отбора через ЭлементОтбораКомпоновкиДанных. Однако у примера с изменением текста запроса есть свои недостатки – эта реализация не устойчива к изменениям кода. Например, вы сделали такую реализацию и забыли, но если в будущем вы захотите модифицировать текст запроса, добавив в него какой-либо оператор после ГДЕ (УПОРЯДОЧИТЬ, СГРУППИРОВАТЬ), вам нужно не забыть про то, что в программном коде есть:
Список.ТекстЗапроса = Список.ТекстЗапроса + " И СправочникПользователи.ФИО В(""Иванов"",""Петров"")";
Если этого не учесть будет ошибка, но чтобы этого избежать, можно переделать на другую реализацию. В текс запроса добавляем такое условие:
ГДЕ (НЕ &ОтборУстановлен ИЛИ СправочникПользователи.ФИО В (&РазрешенныеФИО))
…в коде:
Список.Параметры.УстановитьЗначениеПараметра("ОтборУстановлен", ФИО.Количество() > 0);
Список.Параметры.УстановитьЗначениеПараметра("РазрешенныеФИО", ФИО);
Тут ФИО – массив.
Ка видно, 2 строчки кода против 10. Какой из способов выбрать, зависит от конкретной прикладной задачи.
Содержание:
1. Отборы в динамическом списке в пользовательском режиме 1С
2. Отборы в динамическом списке 1С 8.3 программно
1. Отборы в динамическом списке в пользовательском режиме 1С
Динамический список в 1С 8 – это реквизит управляемой формы, в котором отображаются данные, собранные посредством запроса к текущей конфигурации базы данных. Его чаще всего используют в формах списка справочников, документов, а также в обработках, где необходимо вывести массив данных в 1С построчно в виде таблицы. Помимо отборов в таком списке есть возможность указать условное оформление данных, группировки данных и порядок сортировки.
Любой пользователь может добавить необходимые ему отборы в любой форме, где используется динамический список в 1С 8. Фильтр применяется по любому доступному к выбору полю. Чтобы выполнить это действие, нужно перейти по кнопке «Еще» (в правом верхнем углу формы) – «Настроить список»:
Документы продажи: накладная в 1С 8
на вкладку отбор в 1С 8:
Отбор в 1С 8
Здесь из левой колонки пользователю нужно перенести вправо те поля, по которым ему требуется отфильтровать данные. Также обязательно нужно установить флажок в первой колонке, и указать значение своего фильтра. После выбора нужных полей эта информация будет отображаться на первой вкладке формы настройки списка в 1С:
Настройка списка в 1С
Установленный флажок указывает, используется ли в данный момент этот отбор. Если флажок отключить, то действие выбранного фильтра прекращается до его последующего включения.
Для того чтобы управлять отборами непосредственно из основной формы без помощи вспомогательной формы, их можно вывести в шапку первичной формы. Для этого в форме настройки списка в 1С после нажатия кнопок «Еще» – Свойства элемента Пользовательских настроек в 1С, откроется форма: Пользовательские настройки элемента в 1С:
Свойства элемента пользовательских настроек в 1С
Пользовательские настройки в 1С
В этом окне устанавливаем верхний флажок и в поле «Режим редактирования» выбираем значение «Быстрый доступ». Далее нажимаем кнопку «Ок» и завершаем настройки редактирования.
После этого мы видим, что выбранные фильтры доступны сразу в форме списка, где есть возможность их включать/отключать и менять значение:
Накладные в 1С 8
2. Отборы в динамическом списке 1С 8 программно
Теперь рассмотрим возможности программной установки отборов в динамическом списке в 1С 8.
В типовых конфигурациях 8.3 для этих целей используют процедуры и функции общего модуля ОбщегоНазначенияКлиентСервер. Доступ к этому модулю будет как на стороне клиента, так и на стороне сервера. В этом модуле содержаться экспортные процедуры в 1С и функции, с помощью которых выполняется добавление, создание, изменение, установка, поиск или удаление элементов/группы отбора динамического списка в 1С 8:
— НайтиЭлементыИГруппыОтбора;
— СоздатьГруппуЭлементовОтбора;
— ДобавитьЭлементКомпоновки;
— ИзменитьЭлементыОтбора;
— УдалитьЭлементыГруппыОтбора;
— УстановитьЭлементОтбора;
— УстановитьЭлементОтбораДинамическогоСписка;
— УдалитьЭлементыГруппыОтбораДинамическогоСписка;
Пример использования процедур этого модуля:
Функции общего модуля
Здесь идет установка фильтров по полям «Менеджер», «Статус» и «Вариант оформления» в форме списка документа: Реализация товаров и услуг в 1С.
Реализация товаров и услуг в 1С
В этом месте идет установка фильтра по полю периода в динамическом списке в 1С 8 на форме обработки.
Другие примеры использования процедур и функций по работе с отбором динамического списка в 1С 8 модуля ОбщегоНазначенияКлиентСервер можно найти в типовых конфигурациях 1С 8.3 и применять их в своих доработках, так как хорошим тоном программирования считается использование именно типовых процедур и функций, а не самостоятельно написанных.
Специалист компании «Кодерлайн»
Дарья Губернаторова