Как реализовать поиск и отбор контрагента по ИНН в отчете 1С?

Программист 1С v8.3 (Управляемые формы) 1C:Бухгалтерия Бухгалтерский учет
← На главную

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

Реализация поиска контрагента по введенному ИНН

Для того чтобы при изменении поля ИНН на форме отчета автоматически заполнялось поле Контрагент, нам потребуется выполнить взаимодействие между клиентом и сервером. Поскольку выполнение запросов к базе данных должно происходить на сервере, воспользуемся директивой &НаСервереБезКонтекста.

Рассмотрим пример реализации функции поиска:


&НаСервереБезКонтекста
Процедура ИННПриИзмененииНаСервере(ИНН)
    НайденныйКонтрагент = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН", ИНН);
    Возврат НайденныйКонтрагент;
КонецПроцедуры

&НаКлиенте
Процедура ИННПриИзменении(Элемент)
    НайденныйКонтрагент = ИННПриИзмененииНаСервере(Отчет.ИНН);
    Если НайденныйКонтрагент = Справочники.Контрагенты.ПустаяСсылка Тогда
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = СтрШаблон("Контрагент с ИНН - %1 не найден", Отчет.ИНН);
        Сообщение.Сообщить();
    Иначе
        Отчет.Контрагент = НайденныйКонтрагент;
    КонецЕсли;
КонецПроцедуры

Обратите внимание: Метод НайтиПоРеквизиту удобен для простых задач, однако при работе с большими базами данных рекомендуется использовать запросы с условием ГДЕ ИНН = &ИНН, так как это позволяет более эффективно использовать индексы базы данных.

Настройка отбора в отчете через программное изменение запроса

Если после заполнения поля ИНН необходимо, чтобы отчет формировался строго по найденному контрагенту, мы должны вмешаться в процесс формирования запроса. Если отчет не использует СКД, можно воспользоваться объектом СхемаЗапроса для динамического добавления условий.

Разберем, как добавить отбор в запрос:


Перед Запрос.УстановитьПараметр...
Если ЗначениеЗаполнено(Отчет.ИНН) Тогда
    СхемаЗапроса = Новый СхемаЗапроса;
    СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
    ОператорЗапроса = СхемаЗапроса.ПакетЗапросов[0].Операторы[0];
    ОператорЗапроса.Источники.Добавить("Справочник.Контрагенты");
    ОператорЗапроса.Источники[0].Соединения.Очистить;
    ОператорЗапроса.Источники[0].Соединения.Добавить("Контрагенты", "ХозрасчетныйОстатки.Субконто1 = Контрагенты.Ссылка");
    ОператорЗапроса.Отбор.Добавить("Контрагенты.ИНН = &ИНН");
    Запрос.Текст = СхемаЗапроса.ПолучитьТекстЗапроса();
    Запрос.УстановитьПараметр("ИНН", Отчет.ИНН);
КонецЕсли;

Рекомендации по профессиональному подходу

Для того чтобы ваше решение работало стабильно, учтите следующие важные моменты:

  1. Работа с СКД: Если ваш отчет создан на базе Система Компоновки Данных (СКД), не используйте программное изменение текста запроса через СхемаЗапроса. Лучше добавьте параметр ПарамИНН в настройки набора данных. Это позволит пользователю самостоятельно управлять отборами через стандартную панель настроек отчета.
  2. Учет КПП: Помните, что ИНН не всегда является уникальным ключом. Одно юридическое лицо может иметь несколько филиалов с одним ИНН, но разными КПП. Для корректной идентификации всегда учитывайте связку этих двух реквизитов.
  3. Валидация ввода: Всегда проверяйте длину введенной строки. Для юридических лиц длина ИНН составляет 10 символов, для индивидуальных предпринимателей — 12. Лишние пробелы, которые могут возникнуть при копировании, лучше удалять методом СокрЛП().
  4. Стандартные механизмы: Перед тем как создавать отдельное поле на форме, убедитесь, что не будет достаточно стандартного механизма поиска. Современные формы в 1С позволяют вводить ИНН непосредственно в стандартное поле выбора контрагента, система сама найдет нужный элемент справочника.

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

← На главную