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

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

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

Почему важно проверять длину ИНН и хранить его как строку?

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

  1. Бардак в базе данных: Введенные вручную ИНН могут содержать ошибки – лишние символы, пробелы, буквы, или же иметь неверную длину. Такая ситуация, как было отмечено в сообщении 5, требует регулярной чистки и проверки данных.
  2. Разная длина ИНН для разных типов контрагентов:
    • Для юридических лиц в России ИНН состоит из 10 цифр.
    • Для физических лиц, включая индивидуальных предпринимателей (ИП), ИНН состоит из 12 цифр.

    Эту важную информацию отметил один из участников дискуссии в сообщении 11. Мы должны помнить об этом различии при формировании условий отбора.

  3. ИНН как строка, а не число: Критически важно хранить и обрабатывать ИНН как строковый тип данных. Как было справедливо замечено в сообщениях 14 и 15, некоторые ИНН могут начинаться с нуля (например, для определенных регионов, включая Крым). Если мы будем воспринимать ИНН как число, ведущие нули будут отброшены, что приведет к искажению данных и некорректным проверкам. Например, ИНН "0123456789" при преобразовании в число станет "123456789", теряя важную информацию.

Теперь, когда мы понимаем контекст и основные особенности работы с ИНН, перейдем к конкретным способам фильтрации в запросах 1С.

Метод 1: Использование функции СТРДЛИНА() (Рекомендуемый и наиболее прямой способ)

Самым очевидным, надежным и предпочтительным способом для проверки точного количества символов в строке ИНН является использование встроенной функции языка запросов 1С СТРДЛИНА(). Эта функция возвращает количество символов в строке, что позволяет нам задать точное условие, соответствующее требуемой длине ИНН.

Пример запроса для 10-значного ИНН (юридические лица):

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


ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.ИНН,
    Контрагенты.Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    СТРДЛИНА(Контрагенты.ИНН) = 10

Пример запроса для 12-значного ИНН (физические лица / ИП):

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


ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.ИНН,
    Контрагенты.Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    СТРДЛИНА(Контрагенты.ИНН) = 12

Этот метод является наиболее предпочтительным, поскольку он точно измеряет длину строки и не зависит от содержимого символов (кроме их количества). Он прост в использовании, хорошо читаем и эффективен.

Метод 2: Использование оператора ПОДОБНО с символами подчеркивания

Еще один распространенный и очень полезный способ для проверки длины строки в запросах 1С – это использование оператора ПОДОБНО с символами подчеркивания (_), как было предложено в сообщении 4.

Символ _ (подчеркивание) в операторе ПОДОБНО является шаблоном, который соответствует любому одиночному символу. Соответственно, чтобы проверить, что ИНН состоит из определенного количества символов, мы можем просто повторить этот символ столько раз, какова должна быть ожидаемая длина ИНН. Автор темы подтвердил, что этот метод помог решить его задачу (сообщение 7).

Пример запроса для 9-значного ИНН (по аналогии с запросом автора):

Предположим, нам нужно найти ИНН, состоящие ровно из 9 символов:


ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.ИНН,
    Контрагенты.Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    Контрагенты.ИНН ПОДОБНО "_________" // Девять символов подчеркивания

Этот запрос выберет все ИНН, состоящие ровно из 9 символов. Важно отметить: этот метод проверяет только количество символов, но не гарантирует, что все символы являются цифрами. Он пропустит, например, "123А56789" или "123 56789", если они имеют требуемую длину.

Уточнение для ИНН, состоящих только из цифр:

Если нам нужно убедиться, что ИНН состоит ровно из 10 (или 12) цифр, а не просто 10 любых символов, оператор ПОДОБНО в 1С имеет ограниченные возможности для таких сложных шаблонов. Он поддерживает лишь ограниченный набор символов-шаблонов (%, _) и не является полноценным механизмом регулярных выражений, способным проверить "только цифры" в каждом символе без потери производительности.

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

В практическом смысле, если ИНН хранится корректно (т.е. содержит только цифры, так как это предполагается по его природе), то проверка ПОДОБНО "__________" (10 подчеркиваний) или ПОДОБНО "____________" (12 подчеркиваний) будет работать как ожидалось, отбирая ИНН нужной длины.

Метод 3: Проверка наличия символа за пределами ожидаемой длины (с ограничениями)

В ходе дискуссии был предложен метод, использующий функцию ПОДСТРОКА() для косвенной проверки длины (сообщение 17):


ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.ИНН,
    Контрагенты.Наименование
ИЗ
    Справочник.Контрагенты КАК Контрагенты
ГДЕ
    ПОДСТРОКА(Контрагенты.ИНН, 10, 1) = ""

Анализ этого метода:

Данное условие означает: "выбрать все ИНН, у которых 10-й символ (один символ, начиная с 10-й позиции) является пустой строкой". Это фактически означает, что длина строки ИНН меньше 10 символов. То есть, данный запрос отберет ИНН длиной 0, 1, 2, ..., 9 символов.

Как было указано в сообщении 20, этот метод не контролирует наличие "мусора" (букв, пробелов, спецсимволов) в ИНН, а также, как было уточнено в сообщении 22, он отбирает все ИНН меньше 10 символов, включая незаполненные. Следовательно, этот метод не позволяет точно выбрать ИНН с ровно 9 символами. Он выберет все ИНН, у которых длина меньше или равна 9.

Ограничения: Если нам нужно строго 9 символов, этот подход не подойдет, так как он слишком "широкий". Для строгой проверки длины предпочтительнее использовать СТРДЛИНА() или ПОДОБНО "_________".

Если бы задача стояла "отобрать ИНН длиной НЕ БОЛЕЕ 9 символов", тогда этот метод был бы корректен.

Комплексная валидация ИНН

Проверка длины – это только первый шаг в полной валидации ИНН. Для полноценной и надежной проверки мы рекомендуем также учитывать следующие аспекты:

  1. Проверка на то, что ИНН состоит только из цифр: В 1С нет простой встроенной функции запроса для проверки "все символы – цифры". Это обычно делается программно на стороне сервера 1С или клиента, используя циклы и проверку каждого символа. Пример, приведенный в сообщении 12, показывает, насколько громоздким был бы такой запрос. Гораздо эффективнее использовать функции общего назначения в модулях конфигурации, например, ПроверитьИНН(), которые часто уже реализованы в типовых конфигурациях и обеспечивают более детальную проверку.
  2. Проверка контрольного числа (checksum): ИНН имеет внутреннюю структуру с контрольными цифрами, которые позволяют выявить ошибки ввода. Алгоритмы расчета контрольного числа различаются для 10-значных (юрлица) и 12-значных (физлица/ИП) ИНН. Типовые конфигурации 1С содержат такие алгоритмы во встроенных функциях для проверки валидности ИНН. Это позволяет определить, является ли ИНН не просто числом правильной длины, но и корректным номером с точки зрения ФНС.
  3. Автоматическая онлайн-проверка через сервисы ФНС: Современные версии 1С (например, "1С:Бухгалтерия 8" ред. 3.0) интегрированы с веб-сервисами Федеральной налоговой службы (ФНС). Это позволяет в автоматическом режиме проверять ИНН на актуальность, существование контрагента в Едином государственном реестре налогоплательщиков (ЕГРН) и его статус (действующий/недействующий). Такая проверка является наиболее полной и надежной. Результаты проверки могут быть визуально отображены (например, изменением цвета поля ИНН в карточке контрагента) и сообщают о таких статусах, как "Неверная длина ИНН", "Неверный ИНН" (ошибки в контрольных цифрах или формате), "Контрагент отсутствует в базе ФНС" и т.д.

Заключение

Для решения задачи отбора контрагентов по точному количеству цифр в ИНН в запросах 1С мы рекомендуем использовать функцию СТРДЛИНА(Контрагенты.ИНН) = [нужное_количество_цифр]. Этот метод является наиболее прямым, читаемым и эффективным. Альтернативный способ – оператор ПОДОБНО с символами подчеркивания (например, ИНН ПОДОБНО "__________" для 10 символов), который также эффективно проверяет длину, но не гарантирует, что символы являются именно цифрами. Для полной и всесторонней валидации ИНН следует применять комплексные проверки, включая контрольные суммы и, по возможности, использовать функционал автоматической онлайн-проверки через сервисы ФНС, предоставляемый современными конфигурациями 1С.

← На главную