Как в 1с выбрать несколько позиций в отборе
Перейти к содержимому

Как в 1с выбрать несколько позиций в отборе

  • автор:

Как предоставить возможность быстрого отбора по нескольким полям в списке?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как сделать отбор в 1С:Бухгалтерия?

Подписывайтесь на мой telegram-канал. Сразу оговорюсь, что проектов у меня много, помощников нет, всем помочь физически и морально не смогу, прошу меня простить, если кому-то не ответил или отказал в помощи.

Отправить эту статью на мою почту

Работая практически с любым объектом системы 1С, пользователь может воспользоваться опцией использования стандартных отборов (фильтров). Они доступны в журналах документов, в справочниках, в отчетах и т.д.

Здесь мы рассмотрим, как сделать отбор в 1С.

Начнем с отчетов. Для примера возьмем отчет по взаиморасчетам Задолженность покупателей. Мы видим, что здесь уже есть отбор, выведенный по умолчанию в шапку – это поле Организация. Его можно уже использовать, выбрав значение из списка предлагаемых.

Для наглядности работы отборов сформируем отчет без их использования. Что в итоге? Мы получаем огромную таблицу, в которую попадают данные по всем контрагентам и всем организациям.

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

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

Как уже писала выше, в шапке уже есть фильтр, который можно использовать, но если нужно отфильтровать данные по другим параметрам, сделать отбор в 1С можно нажав команду Показать настройки и выбрав вторую вкладку.

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

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

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

Так я задала следующие критерии попадания данным по задолженностям в отчет

 Отображаются все покупатели, кроме тех, кто принадлежит группе Особые.

 Учитываются данные только по трем организациям.

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

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

Для установления фильтра по другим полям используется функция настройки списка (меню Еще → Настроить список). На первой вкладке отражаются уже выведенные в отборы поля, здесь можно поменять их вид сравнения и установить значение.

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

Так для примера я отбираю все документы, в которых менеджер установил комментарий, и сумма превышает 10 000 руб.

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

Как настроить группировку нескольких условий отбора

Видеоролик выполнен в программе «1С:Бухгалтерия 8» версия 3.0.64.42.

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

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

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

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

При выборе значения Группа И будет проверяться одновременное выполнение всех сгруппированных условий.

При выборе значения Группа Не будет проверяться, наоборот, одновременное невыполнение всех сгруппированных условий.

Чтобы отменить группировку условий, следует использовать команду Разгруппировать в контекстном меню.

Реализация подборов в документах

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

Предназначение механизма

Как обычно пользователь вводит данные в документы? Например, пользователь создает документ Реализация. Затем, чтобы добавить строку в табличную часть документа, нажимает на кнопку «Добавить». В строке табличной части выбирает элемент из справочника, либо пользуется функцией ввода по строке, вводит название и выбирает соответствующую позицию.

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

Хочется отметить отличия в подборе версии платформы 8.2 от 8.1. В подборе версии 8.1 открывалось специальное окно, которое обычно являлось прикрепляемым, оно прикреплялось к правой части экрана главного окна приложения. Пользователь мог одновременно видеть, и документ, и подбор, и мог между ними произвольным образом переключаться.

В платформе 8.2 подобная реализация невозможна из-за изменения принципа оконного интерфейса. Здесь нет одного главного окна, в которое входят все подчиненные окна. Реализация является независимой и отображается как отдельный элемент панели задач.

Здесь применяется принцип под названием «Блокировать окно владельца». Когда будет открываться форма подбора, система не должна позволять переключаться на другие элементы. Если открыть форму справочника, то невозможно переключиться в документ, окно будет заблокировано. Но в приложение можно спокойно переключиться. Такой принцип позволяет избежать ошибочного клика на документ, который сделает окно подбора неактивным. Если такое произойдет, то в этом случае можно легко запутаться. Реализуем подобный механизм, чтобы окно владельца блокировалось.

Простой вариант подбора

Начинаем реализацию подборов и начнем от простого к сложному. Для начала реализуем простейший вариант подбора. Этот вариант будет такой. Первое, нужно, чтобы форма выбора не закрывалась. Для этого можно использовать специальный параметр управляемой формы, который называется «ЗакрыватьПриВыборе». Обратимся к Синтаксис-помощнику и найдем этот параметр управляемой формы.

Параметр управляемой формы ЗакрыватьПриВыборе

Описание параметра управляемой формы ЗакрыватьПриВыборе в Синтаксис-помощнике

Итак, в параметрах указывается флаг «ЗакрыватьПриВыборе, то есть мы можем при открытии формы выбора передать значение этого параметра равную ЛОЖЬ. В этом случае, в момент двойного клика, либо при нажатии ENTER система не будет закрывать форму выбора. Именно такое поведение нам нужно.

Дальше мы открываем форму с передачей этого параметра и обязательно указываем, что эта форма подчинена определенному владельцу. Она должна открыватся в таком режиме. Для чего нужен владелец? Дело в том, что нужно поймать событие двойного клика или нажатие на ENTER в исходной форме владельца и в этой форме реализовать обработчик, который называется «ОбработкаВыбора». Давайте посмотрим, как это работает и всё станет понятно.

Итак, в форме документа создадим команду Подбор. Отразим эту команду на форме в командной панели. Здесь важно расположить кнопку в командной панели таблицы формы.

Кнопка Подбор на панели задач

Размещение команды Подбор на панели задач табличной части

Итак, в обработчике действия открываем форму и передаем в неё параметр. Конечно, можно создать структуру с названием «Параметры», но это было бы критической ошибкой. «Параметры» – это название свойства текущей управляемой формы, поэтому название изменим на «ПараметрыПодбора».

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

Функция глобального контекста ОткрытьФорму

Описание функции ОткрытьФорму в Синтаксис-помощники

Если нужно указать конкретную форму, то следует написать так:

Где «ИмяФормы» это название формы, которую нужно открыть. Если нужно открыть основную форму, то нужно указать имя основной формы так:

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

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

Обработчик события формы ОбработкаВыбора

Обработка выбора или подбора на форме

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

Добавляем новую строку в табличную часть. Для этого обращаемся к объекту табличная часть «Товары», используя метод «Добавить». Можно заполнить и цену выбранного товара. Есть обработчик «ТоварыНоменклатураПриИзменении», который может это сделать и может возникнуть соблазн вызвать этот обработчик. Зачем что-то писать если всё уже написано, но это обернется проблемами.

Если пробовать это сделать в старом документе с заполненной табличной частью, то все будет работать. Но могут быть проблемы с новыми документами. Если создать новый документ и попытаться подобрать номенклатуру, то возникает ошибка, связанная с методом «ТоварыНоменклатураПриИзменении».

Ошибка при попытке указать цену

Система не знает такого выражения как «Цена». Если сделать еще раз выбор и посмотреть в отладчике, что содержится в текущих данных, то можно увидеть, что значение еще не определено. То есть на самой форме нет еще ни одной строки. Мы добавили строку лишь в основной реквизит формы. Еще не произошла синхронизация, поэтому вызывать данное событие нельзя. Если нужно присвоить цену, то это нужно сделать без обработчика «ТоварыНоменклатураПриИзменении».

Подборы с множественным выбором

Сейчас немного усложним задачу. Ведь подбор работает только на одиночные выборы. То есть, если выделить несколько строк в форме подбора справочника и нажать на кнопку «Выбрать», то добавиться последняя выбранная строка. Каким образом можно реализовать множественный подбор? Если открыть форму выбора справочника и открыть в реквизитах свойства списка, то можно увидеть флаг «МножественныйВыбор». Именно это флаг нам и нужен.

Свойство таблицы МножественныйВыбор

Флаг для указания режима множественного выбора из списка

Здесь же, в свойствах списка есть еще такое свойство как «РежимВыделения». По умолчанию оно стоит взначении «Множественный» и пользователь может выделять много строк, но множественного выбора не происходит. Нужно установить флаг «МножественныйВыбор». Лучше это делать программно, обращаясь к элементу управления формы и к его флагу «МножественныйВыбор». Но есть одна проблема, которая связана с названием элемента управления формы. Это название нужно знать точно. Если элемент будет называться по-другому, то это вызовет ошибку. Этого можно избежать.

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

Как видно, здесь тоже есть параметр «МножественныйВыбор». Если выставить в основном реквизите данной формы этот параметр, то не нужно знать имя элемента управления формы. Поэтому при открытии формы нужно просто передать параметр «МножественныйВыбор».

Теперь при выборе значения будет возвращаться несколько значений. Это будет тип значений «Массив». Изменим программный код в соответствии с этим пониманием:

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

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

Реализация формы подбора

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

  • Просмотр выбранных значений в текущем сеансе подбора, то есть ему нужно просмотреть что он уже сделал и произвести необходимые изменения. Может быть пользователь кликнул дважды случайно и хочет отказаться от сделанного выбора. То есть нужно предоставить возможность визуализации выбранных значений.
  • Корректировка выбранных значений, например, пользователь ввел одну строчку и потом решает, что вместо одной штуки товара нужно указать четыреста штук. У пользователя должна быть возможность корректировки строки, не закрывая подбор.

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

Создадим для документа «РеализацияТоваров» новую форму, которая будет называться «ФормаПодбора». Создадим произвольную форму, так как она не будет отображать данные документа. На форме создадим реквизит «Таблица» с типом данных «ТаблицаЗначений». Сделанный пользователем выбор будет размещен в этом реквизите.

В таблицу добавим несколько колонок. Колонка «Номенклатура» тип данных справочник «Номенклатура». И колонка «Количество» тип данных число длина 15, точность 3.

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

После установки этого флага система будет наследовать соответствующие параметры от динамического списка для этой формы. К сожалению, после установки этого флага на форме появилось три командных панели. И две из них абсолютно одинаковые. Чтобы отключить лишние панели нужно убрать флаг «Автозаполнение» у элемента формы «Командная панель». Для номенклатуры оставим командную панель, а вот для «Таблицы» отключим, поскольку пользователи добавляет данные в таблицу двойным кликом по верхней таблицы формы.

Флаг Автозаполнение

Флаг Автозаполнение элемента формы «Командная панель»

Итак, форму настроили, теперь нужно реализовать правильное поведение формы. Для начала в списке свойств формы найдем свойство «РежимОткрытияОкна» и из выпадающего списка выберем значение «Блокировать окно владельца». Это необходимо, чтобы пользователь не потерял окно подбора, когда нечаянно кликнет за пределами формы. В этом режиме можно перейти в главное приложение, а окно владельца блокируется, то есть то окно, из которого происходил вызов. Если сравнить с модальным режимом, то в этом режиме блокируются все окна приложения.

Когда пользователь делает выбор на одном из строк таблицы «Товары», то происходит добавление этой строки в нижнюю таблицу. Посмотрим какие есть события для таблицы формы «Товары». Событие «Выбор» как раз подойдет для реализации наших планов. Оно срабатывает при двойном щелчке мыши или нажатии на ENTER. По умолчанию система при выполнении этого действия откроет элемент справочника на редактирование, но нашем случае нужно изменить стандартное поведение.

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

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

Теперь нужно, чтобы при добавлении товара, который уже есть в нижней таблице не было дублирования строк, а вместо этого увеличивалось количество. Но хотелось бы вначале поговорить о том, какой тип данных у реквизита «Таблица». Если говорить о модуле формы подбора, то на клиенте переменная «Таблица» имеет другой тип данных. Если посмотреть в отладчике, то он покажет, что это тип данных «ДанныеФормыКоллекция». Синтаксис-помощник показывает, что у этого объекта есть метод «НайтиСтроки». Можно использовать этот метод, передавая параметры поиска. Перед тем, как добавить новую строку, будет осуществлен поиск.

Передача результата в вызывающую форму

Сейчас нужно сделать передачу выбранных значений пользователя в форму владельца. Для этого воспользуемся методом «ОповеститьОВыборе». Этот метод управляемой формы нужно вызывать в форме подбора. Нужно создать команду формы, назовём ее «Перенести» и разместим ее на форме в виде кнопке и установим флаг «КнопкаПоУмолчанию», чтобы при нажатии клавиш Ctrl+ENTER происходило нажатие на эту кнопку.

Форма подбора номенклатуры

Форма подбора с возможностью перенести данные в табличную часть документа

Обратите внимание, что в метод «ОповеститьОВыборе» будет передаваться не тип данных таблица значений, ведь этого нельзя сделать на клиенте, а тип «ДанныеФормыКоллекция».

На уровне владельца нужно обработать сделанный выбор в обработчике событий «ТоварыОбработкаВыбора» и в процедуре «ДобавитьСтрокуТовары».

Передача данных табличной части в вызываемую форму

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

Кроме того, в форме подбора напишем обработчик события «ПриСозданииНаСервере».

Еще чуточку изменим обработчик событий «ТоварыОбработкаВыбора» и процедуру «ДобавитьСтрокуТовары».

Теперь все корректно работает. Может вы увидите, что можно еще улучшить для себя в этом подборе. А результат можно посмотреть в коротком видео (33 секунды):

Добавить комментарий

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