В процессе работы с отчетами часто возникает необходимость быстрого поиска или отбора данных по специфическому критерию, например, по ИНН контрагента. Разберем пошагово, как реализовать такую возможность, если отчет уже готов, но требует доработки интерфейса и логики формирования данных.
Для того чтобы при изменении поля ИНН на форме отчета автоматически заполнялось поле Контрагент, нам потребуется выполнить взаимодействие между клиентом и сервером. Поскольку выполнение запросов к базе данных должно происходить на сервере, воспользуемся директивой &НаСервереБезКонтекста.
Рассмотрим пример реализации функции поиска:
&НаСервереБезКонтекста
Процедура ИННПриИзмененииНаСервере(ИНН)
НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
Возврат НайденныйКонтрагент;
КонецПроцедуры
&НаКлиенте
Процедура ИННПриИзменении(Элемент)
НайденныйКонтрагент = ИННПриИзмененииНаСервере(Отчет.ИНН);
Если НайденныйКонтрагент = Справочники.Контрагенты.ПустаяСсылка Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СтрШаблон("Контрагент с ИНН - %1 не найден", Отчет.ИНН);
Сообщение.Сообщить();
Иначе
Отчет.Контрагент = НайденныйКонтрагент;
КонецЕсли;
КонецПроцедуры
Обратите внимание: Метод НайтиПоРеквизиту удобен для простых задач, однако при работе с большими базами данных рекомендуется использовать запросы с условием ГДЕ ИНН = &ИНН, так как это позволяет более эффективно использовать индексы базы данных.
Если после заполнения поля ИНН необходимо, чтобы отчет формировался строго по найденному контрагенту, мы должны вмешаться в процесс формирования запроса. Если отчет не использует СКД, можно воспользоваться объектом СхемаЗапроса для динамического добавления условий.
Разберем, как добавить отбор в запрос:
Перед Запрос.УстановитьПараметр...
Если ЗначениеЗаполнено(Отчет.ИНН) Тогда
СхемаЗапроса = Новый СхемаЗапроса;
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
ОператорЗапроса = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
ОператорЗапроса.Источники.Добавить("Справочник.Контрагенты");
ОператорЗапроса.Источники[0].Соединения.Очистить;
ОператорЗапроса.Источники[0].Соединения.Добавить("Контрагенты", "ХозрасчетныйОстатки.Субконто1 = Контрагенты.Ссылка");
ОператорЗапроса.Отбор.Добавить("Контрагенты.ИНН = &ИНН");
Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
Запрос.УстановитьПараметр("ИНН", Отчет.ИНН);
КонецЕсли;
Для того чтобы ваше решение работало стабильно, учтите следующие важные моменты:
Система Компоновки Данных (СКД), не используйте программное изменение текста запроса через СхемаЗапроса. Лучше добавьте параметр ПарамИНН в настройки набора данных. Это позволит пользователю самостоятельно управлять отборами через стандартную панель настроек отчета.ИНН не всегда является уникальным ключом. Одно юридическое лицо может иметь несколько филиалов с одним ИНН, но разными КПП. Для корректной идентификации всегда учитывайте связку этих двух реквизитов.ИНН составляет 10 символов, для индивидуальных предпринимателей — 12. Лишние пробелы, которые могут возникнуть при копировании, лучше удалять методом СокрЛП().ИНН непосредственно в стандартное поле выбора контрагента, система сама найдет нужный элемент справочника.Применяя данные методы, вы сможете гибко управлять процессом поиска и отбора контрагентов, делая отчеты более функциональными для конечных пользователей.