Фильтрация иерархического справочника по какому-либо условию в форме списка Есть ли в 8.х аналог ИспользоватьСписокЭлементов?
В динамических списках документов, справочников и т.д. может быть программно установлен отбор по полю Ссылка с указанием в качестве вида сравнения вхождения в список значений. Это позволяет отображать в списке только определенные объекты.
Однако эта возможность может иметь только ограниченное применение, так как динамический список имеет достаточно большое количество универсальных возможностей (установка отбора пользователем, переходы по уровням в иерархических списках и т.д.) и совмещение в прикладных решениях этих механизмов с отбором по конкретным значениям ссылок достаточно сложно реализуется.
В большинстве случаев, если необходимо обеспечить отображение в списке специально отобранного перечня объектов, можно рекомендовать использовать другие возможности (например, выборку данных запросом и отображение в форме с помощью таблицы значений или табличного документа). При этом система обеспечивает возможность полноценного взаимодействия с такими формами других системных механизмов.
Код 1C v 8.х Запрос = Новый Запрос();
Запрос.Текст = " ВЫБРАТЬ
| СпецификацииНоменклатуры.Ссылка
|ИЗ
| Справочник.СпецификацииНоменклатуры КАК СпецификацииНоменклатуры
|ГДЕ
| СпецификацииНоменклатуры.Владелец.Ссылка = &НоменклатураСсылка
| И СпецификацииНоменклатуры.Организация В ИЕРАРХИИ (&Организация)";
Запрос.УстановитьПараметр("НоменклатураСсылка", ГотоваяПродукция);
Запрос.УстановитьПараметр("Организация", Организация);
СписокСпецификаций = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
ФормаВыбора = Справочники.СпецификацииНоменклатуры.ПолучитьФормуВыбора(,Элемент,Элемент);
ЭлементОтбора = ФормаВыбора.СправочникСписок.Отбор.Ссылка;
ЭлементОтбора.ВидСравнения = ВидСравнения.ВСписке;
ЭлементОтбора.Значение = СписокСпецификаций;
ЭлементОтбора.Использование = Истина;
ФормаВыбора.ЭлементыФормы.СправочникСписок.НастройкаОтбора.Ссылка.Доступность = Ложь;
ФормаВыбора.Открыть();
Код 1C v 8.2 УП &НаКлиенте
Процедура ПоУмолчаниюОпцияНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
ФормаВыбора = ПолучитьФорму("Справочник.ОпцииАвтомобилей.Форма.ФормаВыбора");
ФормаВыбора.Открыть();
ЭлементОтбора = ФормаВыбора.Список.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Ссылка");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ЭлементОтбора.ПравоеЗначение = СписокОпций;
ЭлементОтбора.Использование = Истина;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//считаем данные по опциям доступной для данной модели
СписокОпций.ЗагрузитьЗначения(Объект.Владелец.ОпцииМодели.Выгрузить().ВыгрузитьКолонку("Опция"));
КонецПроцедуры
Для 7.7 используем метод ИспользоватьСписокЭлементов
Автор:
Antoska
Для решения данной задачи я решил воспользоваться методом формы списка "ИспользоватьСписокЭлементов(<СписокЗначений>)", так как использование процедуры "ОбработкаПодбора()" требует наличия реквизита справочника для отбора, а это мне не очень подходит. Вот как я реализовал этот алгоритм (код из модуля формы списка справочника):
Код 1C v 7.x Функция СоответствуетУсловиямФильтра(ЭлементСправочника)
Если ПустоеЗначение(ЭлементСправочника) = 0 Тогда
//Условие фильтра: текущий остаток не равен нулю
Если Регистр.ПартииТоваров.СводныйОстаток("",ЭлементСправочника.ТекущийЭлемент(),,,,,"ОстатокТовара") <> 0 Тогда
Возврат 1;
КонецЕсли;
КонецЕсли;
Возврат 0;
КонецФункции
Процедура УстановитьФильтр(Знач Группа="", Знач Иерархия="")
//Для флажка Фильтр задана формула "УстановитьФильтр()"
Если Фильтр = 1 Тогда
//Определяем параметры процедуры
Группа = ?(Группа="",ТекущийЭлемент().Родитель,Группа);
Иерархия = ?(Иерархия="",ИерархическийСписок(),Иерархия);
СписокФильтра = СоздатьОбъект("СписокЗначений");
Спр = СоздатьОбъект("Справочник.Номенклатура");
//Определяемся с использованием родителя при выборке элементов
Если ПустоеЗначение(Группа) = 0 Тогда
Спр.ИспользоватьРодителя(Группа);
КонецЕсли;
Спр.ВключатьПодчиненные(0);
//Выбираем элементы с учётом иерархии
Спр.ВыбратьЭлементы(Иерархия);
Пока Спр.ПолучитьЭлемент() = 1 Цикл
//Показваем группы, для удобства навигации
Если Спр.ЭтоГруппа() = 1 Тогда
//Добавляем группу в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
Продолжить;
КонецЕсли;
//Проверяем элемент на соответствие условиям фильтра
Если СоответствуетУсловиямФильтра(Спр.ТекущийЭлемент()) = 1 Тогда
//Добавляем элемент в список фильтра
СписокФильтра.ДобавитьЗначение(Спр.ТекущийЭлемент());
КонецЕсли;
КонецЦикла;
//Устанавливаем фильтр
ИспользоватьСписокЭлементов(СписокФильтра);
Иначе
//Снимаем фильтр
ИспользоватьСписокЭлементов();
КонецЕсли;
КонецПроцедуры
Процедура ПриВыбореРодителя(Элемент)
УстановитьФильтр(Элемент)
КонецПроцедуры
Процедура ПриСменеИерархии(Способ)
УстановитьФильтр(,Способ)
КонецПроцедуры
Функцией "СоответствуетУсловиямФильтра(ЭлементСправочника)" можно задавать любые условия фильтрации списка опираясь на передаваемый ей элемент справочника.
Скорость работы приемлема, но можно попробовать реализовать и через запрос...
Категория:
Справочники Быстрый отбор в справочнике по первой букве В статье описан способ быстрой организации отбора в списке справочника по первой букве наименования. Механизм легко дотачивается под собственные нужды.
Код 1C v 8.2 УП // ПРОЦЕДУРЫ И ФУНКЦИИ МОДУЛЯ
&НаКлиенте
Процедура УстановитьПометку(Команда)
Для Каждого Кнопка Из Элементы.ПанельСБуквами.ПодчиненныеЭлементы Цикл
Кнопка.Пометка = (Команда.Имя = Кнопка.Имя);
КонецЦикла;
КонецПроцедуры // УстановитьПометку()
&НаСервере
Процедура ПодготовитьДинамическийСписок()
Список.ПроизвольныйЗапрос = Истина;
ТекстЗапроса =
"ВЫБРАТЬ *
|ИЗ
| %ИмяТаблицы% КАК Т
|{ГДЕ
| (ПОДСТРОКА(Т.Наименование, 1, 1) В (&СписокБукв))}";
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "%ИмяТаблицы%", Список.ОсновнаяТаблица);
Список.ТекстЗапроса = ТекстЗапроса;
КонецПроцедуры // ПодготовитьДинамическийСписок()
&НаСервере
Процедура СоздатьПанельСБуквами()
ПанельСБуквами = Элементы.Вставить("ПанельСБуквами", Тип("ГруппаФормы"), ЭтаФорма, Элементы.Список);
ПанельСБуквами.Вид = ВидГруппыФормы.КоманднаяПанель;
// кнопка "Все"
КомандаФормы = Команды.Добавить("Все");
КомандаФормы.Действие = "УдалитьФильтрПоПервойБукве";
КнопкаФормы = Элементы.Добавить("Все", Тип("КнопкаФормы"), ПанельСБуквами);
КнопкаФормы.ИмяКоманды = "Все";
КнопкаФормы.Пометка = Истина;
// кнопки А...Я
Для Сч = КодСимвола("А") По КодСимвола("Я") Цикл
ИмяКоманды = Символ(Сч);
Если Найти("Ё,Й,Ъ,Ь", ИмяКоманды) > 0 Тогда
Продолжить;
КонецЕсли;
КомандаФормы = Команды.Добавить(ИмяКоманды);
КомандаФормы.Действие = "УстановитьФильтрПоПервойБукве";
КнопкаФормы = Элементы.Добавить(ИмяКоманды, Тип("КнопкаФормы"), ПанельСБуквами);
КнопкаФормы.ИмяКоманды = ИмяКоманды;
КонецЦикла;
КонецПроцедуры // СоздатьПанельСКнопками()
////////////////////////////////////////////////////////////////////////////////
// КОМАНДЫ МОДУЛЯ
&НаКлиенте
Процедура УстановитьФильтрПоПервойБукве(Команда)
Буква = Команда.Имя;
СписокБукв = Новый Массив;
СписокБукв.Добавить(Буква);
СписокБукв.Добавить(НРег(Буква));
Если Буква = "Е" Тогда
СписокБукв.Добавить("Ё");
СписокБукв.Добавить("ё");
КонецЕсли;
Если Буква = "И" Тогда
СписокБукв.Добавить("Й");
СписокБукв.Добавить("й");
КонецЕсли;
Список.Параметры.УстановитьЗначениеПараметра("СписокБукв", СписокБукв);
УстановитьПометку(Команда);
КонецПроцедуры
&НаКлиенте
Процедура УдалитьФильтрПоПервойБукве(Команда)
ПараметрКомпоновкиДанных = Новый ПараметрКомпоновкиДанных("СписокБукв");
ЗначениеПараметраКомпоновкиДанных = Список.Параметры.НайтиЗначениеПараметра(ПараметрКомпоновкиДанных);
Если ЗначениеПараметраКомпоновкиДанных = Неопределено Тогда
Возврат;
КонецЕсли;
ЗначениеПараметраКомпоновкиДанных.Использование = Ложь;
УстановитьПометку(Команда);
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ПРОЦЕДУРЫ - ОБРАБОТЧИКИ СОБЫТИЙ ФОРМЫ
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПодготовитьДинамическийСписок();
СоздатьПанельСБуквами();
КонецПроцедуры // ПриСозданииНаСервере()
Данный текст необходимо вставить в модуль формы списка справочника.
Процедуру "ПриСозданииНаСервере" вручную назначить обработчиком одноименного события формы.
Если данному событию уже назначен обработчик, то необходимо дополнить его строками процедуры "ПриСозданииНаСервере" из листинга.
Реквизита формы "Список"
не должен содержать произвольного запроса. Если список формируется произвольным запросом, то в запрос необходимо дописать условие компоновки:
{ГДЕ (ПОДСТРОКА(ИмяТаблицы.Наименование, 1, 1) В (&СписокБукв))}
и удалить процедуру "ПодготовитьДинамическийСписок" и все ее вызовы.
Автор
Armando Категория:
Справочники Выбрать все движения регистра с остатками Метод ВыбратьДвиженияСОстатками инициирует выбор всех движении регистра в указанном интервале дат. Если <КонецВыборки> не указан или равен 0, то конном временного интервала выбора движений регистра считается ТА.
Данный метод отличается от метода ВыбратьДвижения тем, что после получения очередного движения метод Остаток будет выдавать актуальные значения остатков для этого регистра.
Код 1C v 7.x
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
Прих = 0;
Расх = 0;
Если Рег.Приход = 1 Тогда
Прих = Рег.Долг;
Иначе
Расх = Рег.Долг;
КонецЕсли;
ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
Док = Рег.ТекущийДокумент();
Таб.ВывестиСекцию("Документ");
КонецЦикла;
Категория:
Регистры Выбрать все движения регистра по датам Код 1C v 7.x
Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
Рег1.УстановитьФильтр(Клиент);
Рег1.ВыбратьДвижения(ДатаНачало, );
Пока Рег1.ПолучитьДвижение() > 0 Цикл
Док = Рег1.ТекущийДокумент();
Дв_Баз_Сум = Рег1.СуммаБазовая;
Дв_Вал_Сум = Рег1.СуммаВалютная;
Если Рег1.Расход = 1 Тогда
Таб.ВывестиСекцию("Расход2");
Иначе
Таб.ВывестиСекцию("Приход2");
КонецЕсли;
КонецЦикла;
КонецЕсли;
Категория:
Регистры Установить фильтр для оптимизации действий с регистром Код 1C v 7.x // Пример 1
// Для регистра с измерениями «Товар», «Склад», «МОЛ» запись
Рег.УстановитьФильтр(Тов1, , );
// означает, что расчеты будут проводиться только по одному товару (Тов1), но по всем складам и МОЛам.
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
Прих = 0;
Расх = 0;
Если Рег.Приход = 1 Тогда
Прих = Рег.Долг;
Иначе
Расх = Рег.Долг;
КонецЕсли;
ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
Док = Рег.ТекущийДокумент();
Таб.ВывестиСекцию("Документ");
КонецЦикла;
// Пример 2
РегТовары = СоздатьОбъект("Регистр.Товары");
//выбрать все движения по данному складу за период
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1 Цикл
//... код
КонецЦикла;
// Пример 3
РегТовары = СоздатьОбъект("Регистр.Товары");
//выбрать все товары на данном складе
РегТовары.УстановитьФильтр(,ТекСклад);
РегТовары.ВыбратьИтоги();
Пока РегТовары.ПолучитьИтог()=1 Цикл
//... код
КонецЦикла;
Категория:
Регистры Получить движения регистра Код 1C v 7.x // Пример 1
Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
Рег1.УстановитьФильтр(Клиент);
// Открываем выборку
Рег1.ВыбратьДвижения(ДатаНачало, );
// Цикл выбора движений по регистру
Пока Рег1.ПолучитьДвижение() > 0 Цикл
Если Строка(Рег1.Клиент.Код) <> Строка(Запрос.Клиент.Код) Тогда
Продолжить;
КонецЕсли;
Док = Рег1.ТекущийДокумент();
Дв_Баз_Сум = Рег1.СуммаБазовая;
Дв_Вал_Сум = Рег1.СуммаВалютная;
Если Рег1.Расход = 1 Тогда
Таб.ВывестиСекцию("Расход2");
Иначе
Таб.ВывестиСекцию("Приход2");
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Пример 2
РегТовары = СоздатьОбъект("Регистр.Товары");
РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1 Цикл
Сообщить("Дата движения " + Строка(РегТовары.ТекущийДокумент.ДатаДок));
Сообщить("Клиент: " + РегТовары.Клиент);
Сообщить("Товар: " + РегТовары.Товар);
Сообщить("Сумма: " + РегТовары.Доход);
КонецЦикла;
Категория:
Регистры Выбрать все движения регистра с остатками Метод ВыбратьДвиженияСОстатками инициирует выбор всех движении регистра в указанном интервале дат. До вызова данной процедуры может быть установлен фильтр (см. УстановитьФильтр), ограничивающий выборку значений из регистра. Если <КонецВыборки> не указан или равен 0, то конном временного интервала выбора движений регистра считается ТА.
Данный метод отличается от метода ВыбратьДвижения тем, что после получения очередного движения метод Остаток будет выдавать актуальные значения остатков для этого регистра. Но для этого перед вызовом метода ВыбратьДвиженияСОстатками регистру должен быть установлен признак временногоРасчета» (см. ВременныйРасчет) и должен быть выполнен временный расчет (см. РассчитатьРегистрыНа и РассчитатьРегистрыПо) — его дата и будет являться начальной датой выбираемых движений регистра.
Данная возможность не может быть использована совместно с дальнейшими «Временными» расчетами.
Собственно выбор первого и последующих движений регистра осуществляется методом ПолучитьДвижение.
Код 1C v 7.x
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
Прих = 0;
Расх = 0;
Если Рег.Приход = 1 Тогда
Прих = Рег.Долг;
Иначе
Расх = Рег.Долг;
КонецЕсли;
ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
Док = Рег.ТекущийДокумент();
КонецЦикла;
Категория:
Регистры Выгрузить Итоги регистра в таблицу значений Код 1C v 7.x
// Пример 1
РегДоходы = СоздатьОбъект("Регистр.Доходы");
ТабЗнач = СоздатьОбъект("ТаблицаЗначений");
РегДоходы.ВыгрузитьИтоги(ТабЗнач);
ТабЗнач.ВыбратьСтроки();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
Сообщить("Товар " + Строка(ТабЗнач.Товар) +
" на складе " + Строка(ТабЗнач.Склад) +
" кол-во: " + Строка(ТабЗнач.Количество) +
" стоимость: " + Строка(ТабЗнач.Стоимость) +
КонецЦикла;
// Пример 2
Функция ВыбратьКредит(ВыбКлиент)
Список = СоздатьОбъект("ТаблицаЗначений");
Рег = СоздатьОбъект("Регистр.ТоварныйКредит");
Рег.УстановитьФильтр(ВыбКлиент, );
Рег.ВыгрузитьИтоги(Список, 1);
Возврат Список;
КонецФункции
Категория:
Регистры Выбрать Итоги, остатки регистра Код 1C v 7.x
// Пример 1
РегТовары = СоздатьОбъект("Регистр.Товары");
РегТовары.ВыбратьИтоги();
Пока РегТовары.ПолучитьИтог()=1 Цикл
Сообщить("Товар " + Строка(РегТовары.Товар) +
" на складе " + Строка(РегТовары.Склад) +
" кол-во: " + Строка(РегТовары.Количество) +
" стоимость: " + Строка(РегТовары.Стоимость) +
КонецЦикла;
// Пример 2
Процедура ВыбратьКредит()
Список = СоздатьОбъект("СписокЗначений");
Рег = СоздатьОбъект("Регистр.ТоварныйКредит");
Рег.УстановитьФильтр(Клиент, );
Рег.ВыбратьИтоги();
Ном = 0;
Пока Рег.ПолучитьИтог() = 1 Цикл
Док = Рег.Документ;
Список.ДобавитьЗначение(Док, "" + Док + " — Остаток = " + Рег.Долг);
Если Ном = 0 Тогда
ВыбДок = Док;
КонецЕсли;
Ном = Ном + 1;
КонецЦикла;
Если Ном > 0 Тогда
Если Список.ВыбратьЗначение(ВыбДок, "Выберите кредит") = 1 Тогда
ДокКредита = ВыбДок;
КонецЕсли;
КонецЕсли;
Возврат;
КонецПроцедуры
Категория:
Регистры