Универсальный фильтр справочников средствами 1C

Находясь под впечатлением обработки по фильтрации справочников средствами SQL, решил написать свою версию обработки с использованием только стандартных средств 1С для работы с любыми базами.

Материал опубликован на сайте компании "СофтПоинт"/

Находясь под впечатлением обработки по фильтрации справочников средствами SQL, решил написать свою версию обработки с использованием только стандартных средств 1С для работы с любыми базами.

Для простоты решил отказаться от диапазонов. Осталось только два шаблона * и ?, так что реализовать оказалось несложно. Зато добавилась опция поиска с учетом либо без учета регистра символов.

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

Вот как выглядит форма обработки:

А вот вторая закладка (результат):

Вот код модуля:
Перем ТекСправочник,ТЗ;
Перем Последний;
Процедура ОбрТабл()
Если Список.КоличествоСтрок()>0 Тогда
Предупреждение(Список.Реквизит);
КонецЕсли;
КонецПроцедуры
//________________________________________________________
Функция ПроверкаСтроки(ПармСтрока)
Перем ВремСтрока, Результат;
ВремСтрока=ПармСтрока;
ТЗ.ВыбратьСтроки();
Результат=1;
Пока ТЗ.ПолучитьСтроку()=1 Цикл
Если СтрДлина(ВремСтрока)=0 Тогда
Результат=0;
КонецЕсли;
ТекПропуск=ТЗ.Пропуск;
ТекТекст=ТЗ.Текст;
ТекДлина=ТЗ.Длина;
Если ТекПропуск>0 Тогда
//обрезаем
ВремСтрока=Сред(ВремСтрока,1+ТекПропуск);
КонецЕсли;
Если ТекПропуск<0 Тогда
ТекПозиция=Найти(ВремСтрока,ТекТекст);
Если ТекПозиция>0 Тогда
ВремСтрока=Сред(ВремСтрока,ТекПозиция+ТекДлина);
Иначе
Результат=0;
Прервать;
КонецЕсли;
Иначе
//=0
Если Лев(ВремСтрока,ТекДлина)=ТекТекст Тогда
ВремСтрока=Сред(ВремСтрока,1+ТекДлина);
Иначе
Результат=0;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если (Последний=1) И (СтрДлина(ВремСтрока)>0) Тогда
Результат=0;
КонецЕсли;
Возврат Результат;
КонецФункции
//________________________________________________________
Процедура ШаблонистыйШаблон()
Состояние("Создание правил");
ТекШаблон=СокрП(Стр);
Если РегистрСимволов=0 Тогда
ТекШаблон=Врег(ТекШаблон);
КонецЕсли;
ТекПропуск=0;
Накопитель="";
Если ТипЗначениястр(ТЗ)="ТаблицаЗначений" Тогда
ТЗ.УдалитьСтроки();
Иначе
ТЗ=СоздатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Пропуск","Число");
ТЗ.НоваяКолонка("Текст","Строка");
ТЗ.НоваяКолонка("Длина","Число",);
КонецЕсли;
Последний=0;
Для к=1 по СтрДлина(ТекШаблон) Цикл
Символ=Лев(ТекШаблон,1);
ТекШаблон=Сред(ТекШаблон,2);
Если Символ="*" Тогда
Если СтрДлина(Накопитель)>0 Тогда
ТЗ.НоваяСтрока();
ТЗ.Пропуск=ТекПропуск;
ТЗ.Текст=Накопитель;
ТЗ.Длина=СтрДлина(Накопитель);
ТекПропуск=0;
Накопитель="";
КонецЕсли;
ТекПропуск=?(ТекПропуск>0,ТекПропуск,-1);
ИначеЕсли Символ="?" Тогда
Если СтрДлина(Накопитель)>0 Тогда
ТЗ.НоваяСтрока();
ТЗ.Пропуск=ТекПропуск;
ТЗ.Текст=Накопитель;
ТЗ.Длина=СтрДлина(Накопитель);
ТекПропуск=0;
Накопитель="";
КонецЕсли;
ТекПропуск=?(ТекПропуск>0,ТекПропуск+1,1);
Иначе
Накопитель=Накопитель+Символ;
КонецЕсли;
КонецЦикла;
Если СтрДлина(Накопитель)>0 Тогда
ТЗ.НоваяСтрока();
ТЗ.Пропуск=ТекПропуск;
ТЗ.Текст=Накопитель;
ТЗ.Длина=СтрДлина(Накопитель);
Последний=1;
КонецЕсли;
КонецПроцедуры
//________________________________________________________
Процедура Сформировать()
Перем Спр, ТекАтрибут;
Перем ТекРезультатПроверки;
Список.УдалитьСтроки();
ШаблонистыйШаблон();
ТекЭлемент=Справочники.ПолучитьЗначение(Справочники.ТекущаяСтрока());
ТекРеквизит=Реквизиты.ПолучитьЗначение(Реквизиты.ТекущаяСтрока());
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса="ЗапЭлемент = Справочник."+ТекЭлемент+".ТекущийЭлемент;
|ЗапРеквизит = Справочник."+ТекЭлемент+"."+ТекРеквизит+";
|Группировка ЗапЭлемент без упорядочивания;";
Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
Сообщить("Не выполнился запрос!");
Возврат;
КонецЕсли;
Состояние("Проверка соответствия");
Пока Запрос.Группировка(1)=1 Цикл
ТекЗначение=СокрП(Запрос.ЗапРеквизит);
Если РегистрСимволов=1 Тогда
//1-учитывать регистр
ТекРезультатПроверки=ПроверкаСтроки(ТекЗначение);
Иначе
//0- не учитывать регистр
ТекРезультатПроверки=ПроверкаСтроки(Врег(ТекЗначение));
КонецЕсли;
Если ТекРезультатПроверки = 1 Тогда
Список.НоваяСтрока();
Список.Элемент=Запрос.ЗапЭлемент;
Список.Реквизит=ТекЗначение;
КонецЕсли;
КонецЦикла;
Запрос=0;
КонецПроцедуры
//________________________________________________________
Процедура приОткрытии()
// Пример строки для фильтрации
Для х=1 По Метаданные.Справочник() Цикл // перебор справочников
Справочники.ДобавитьЗначение(МетаДанные.Справочник(х).Идентификатор);
Если х=1 тогда // Для первого справочника. Остальные при навигации
Реквизиты.ДобавитьЗначение("Код");
Реквизиты.ДобавитьЗначение("Наименование");
Для хх=1 По Метаданные.Справочник(х).Реквизит() Цикл
Если Метаданные.Справочник(х).Реквизит(хх).Тип="Строка" тогда
Если Метаданные.Справочник(х).Реквизит(хх).Длина=0 тогда
Продолжить;
КонецЕсли;
Если Метаданные.Справочник(х).Реквизит(хх).Периодический=1 тогда
Продолжить;
КонецЕсли;
Реквизиты.ДобавитьЗначение(МетаДанные.Справочник(х).Реквизит(хх).Идентификатор );
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ТекСправочник=Справочники.ПолучитьЗначение(1);
Форма.ИспользоватьСлой("Источник,Общий");
КонецПроцедуры
//________________________________________________________
Функция Пересчет()
Если НЕ(ТекСправочник=Справочники.ПолучитьЗначение(Справочники.ТекущаяСтрока())) Тогда
ТекСправочник=Справочники.ПолучитьЗначение(Справочники.ТекущаяСтрока());
Реквизиты.УдалитьВсе();
Если Метаданные.Справочник(ТекСправочник).ДлинаКода>0 Тогда
Реквизиты.ДобавитьЗначение("Код");
КонецЕсли;
Если Метаданные.Справочник(ТекСправочник).ДлинаНаименования>0 Тогда
Реквизиты.ДобавитьЗначение("Наименование");
КонецЕсли;
Для хх=1 По Метаданные.Справочник(ТекСправочник).Реквизит() Цикл
ТекТип=Метаданные.Справочник(ТекСправочник).Реквизит(хх).Тип;
Если (ТекТип="Строка") Или (ТекТип="Число") тогда
Если Метаданные.Справочник(ТекСправочник).Реквизит(хх).Длина=0 тогда
Продолжить;
КонецЕсли;
Если Метаданные.Справочник(ТекСправочник).Реквизит(хх).Периодический=1 тогда
Продолжить;
КонецЕсли;
Реквизиты.ДобавитьЗначение(МетаДанные.Справочник(ТекСправочник).Реквизит(хх).Идентификатор);
КонецЕсли;
КонецЦикла;
ТекСправочник=Справочники.ПолучитьЗначение(Справочники.ТекущаяСтрока());
Реквизиты.Текущаястрока(2);
КонецЕсли;
КонецФункции
//________________________________________________________
Процедура ПриВыбореЗакладки(ТекНомер)
Если ТекНомер=1 Тогда
Форма.ИспользоватьСлой("Источник,Общий");
Иначе
Форма.ИспользоватьСлой("Основной,Общий");
КонецЕсли;
КонецПроцедуры
//________________________________________________________
Форма.ИспользоватьЗакладки(1);
Форма.Закладки.ДобавитьЗначение(1,"Данные");
Форма.Закладки.ДобавитьЗначение(2,"Результат");
Список.НоваяКолонка("Элемент");
Список.НоваяКолонка("Реквизит");

Эту обработку можно загрузить в разделе "Скачать".

Автор статьи: Антон Гусев

Начать дискуссию

Уголовное дело Елены Блиновской передали в суд

Блогер спрятала от налоговой 906 млн рублей, из них 716 млн вывела через две подконтрольные фирмы. Следователи допросили больше 200 свидетелей и провели свыше 20 обысков.

Бесплатно с Госзакупки

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

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

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

Брокер ВТБ запустил голосовые рекомендации для инвесторов

Голосовые советы позволят инвесторам быстрее принимать решения о проведении наиболее выгодных сделок.

Курсы повышения
квалификации

18
Официальное удостоверение с занесением в госреестр Рособрнадзора
Расчетный счет

Расчетно-кассовое обслуживание для ИП: как найти свой идеальный тариф

Открытие расчетного счета — один из первых шагов для любого индивидуального предпринимателя. С помощью РКО ИП ведет безналичные расчеты, принимает оплату от клиентов на счет, переводит средства контрагентам и бюджету. Банки предлагают разные тарифы на расчетно-кассовое обслуживание, которые отличаются по стоимости и условиям. 

Расчетно-кассовое обслуживание для ИП: как найти свой идеальный тариф

15 курсов бренд-менеджера для начинающих 

Бренд-менеджер — это специалист в области маркетинга, который занимается продвижением бренда. Его задача: сформировать мнение у покупателей по продукту, услуге или самой компании, склонить их к приобретению. На всех этапах он должен следить за репутацией компании и торговой марки.

15 курсов бренд-менеджера для начинающих 
ПСН

Как совместить патент с УСН и что делать, если ИП превысил лимиты

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

Опытом делятся эксперты-практики, без воды
ЭДО

Хранение документов. На бумаге или в электронном виде? Затраты и риски

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

Хранение документов. На бумаге или в электронном виде? Затраты и риски
Право

Как подписать соглашение NDA с самозанятым

Для нормальной работы самозанятому нужен доступ к конфиденциальной информации. Но плательщик НПД — не штатный работник, он не подписывает ЛНА компании и на него нельзя повлиять дисциплинарными мерами ответственности. Проблему может решить соглашение о конфиденциальности (NDA). Рассказываем, как его правильно оформить.

Как подписать соглашение NDA с самозанятым
Охрана труда

Новый порядок оказания первой помощи с 1 сентября 2024 года. Что нужно знать работодателю

С 1 сентября 2024 года вступает в силу новый порядок оказания первой помощи.

Новый порядок оказания первой помощи с 1 сентября 2024 года. Что нужно знать работодателю

Жителям ЕС запретили участвовать в обмене заблокированными акциями

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

НДС на УСН, выбор СНО, топ претензий от ФНС, и господдержка бизнеса — какие вебинары пройдут в августе 2024 года

Подготовили для вас анонс предстоящих вебинаров в августе.

НДС на УСН, выбор СНО, топ претензий от ФНС, и господдержка бизнеса — какие вебинары пройдут в августе 2024 года
УСН

В законе о налоговой реформе-2025 в части УСН есть спорные моменты

Федеральный закон от 12.07.2024 № 176-ФЗ о совершенствовании налоговой системы России с 2025 года содержит много изменений и новшеств по УСН. Уже сейчас возникают вопросы, как их применять и трактовать на практике.

Куда не движется движимость

Рассуждение на одну из вечных тем в налоговом праве: переквалификация налоговыми органами движимого имущества в недвижимое.

Куда не движется движимость

Что такое амортизация облигаций и зачем инвестору про нее знать

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

Что такое амортизация облигаций и зачем инвестору про нее знать
ПСН

Отказ от патента не отменить, как считать лимит для ПСН, особенности учета при переходе с УСН: что нужно знать бухгалтеру и ИП

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

Иллюстрация: Вера Ревина/Клерк.ру

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

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

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

На Новый год-2025 каникулы продлятся 11 дней

Вышел проект постановления Минтруда о праздничных днях в 2025 году. На майских россияне будут отдыхать восемь дней, а в Новый год — 11 дней.

ФСБУ

Поступление аренды в 1С отражают как услугу или услугу аренды: от чего зависит

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

ОСАГО

На маркетплейсе Сбера водители купили 534 тысячи полисов ОСАГО

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

Интересные материалы

Общество

Для автопутешественников подготовили 50 маршрутов

К 2030 году число туристических поездок на автомобилях вырастет с 26 млн до 50 млн.