Когда мы работаем с базой данных 1С, особенно в условиях, когда данные по контрагентам могут быть введены некорректно, возникает задача по их очистке и валидации. Одним из частых случаев является необходимость отобрать контрагентов, чей ИНН имеет определенное количество цифр. Например, нам может потребоваться найти всех контрагентов, у которых ИНН состоит ровно из 10 или 12 цифр. Рассмотрим различные подходы к решению этой задачи с использованием запросов в 1С.
Прежде чем перейти к методам фильтрации, давайте проанализируем, почему этот вопрос так важен и какие особенности ИНН следует учитывать.
Эту важную информацию отметил один из участников дискуссии в сообщении 11. Мы должны помнить об этом различии при формировании условий отбора.
Теперь, когда мы понимаем контекст и основные особенности работы с ИНН, перейдем к конкретным способам фильтрации в запросах 1С.
Самым очевидным, надежным и предпочтительным способом для проверки точного количества символов в строке ИНН является использование встроенной функции языка запросов 1С СТРДЛИНА(). Эта функция возвращает количество символов в строке, что позволяет нам задать точное условие, соответствующее требуемой длине ИНН.
Если мы хотим отобрать контрагентов, которые являются юридическими лицами и имеют корректный 10-значный ИНН, мы можем использовать следующий запрос:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.ИНН,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
СТРДЛИНА(Контрагенты.ИНН) = 10
Аналогично, для отбора физических лиц или индивидуальных предпринимателей, чей ИНН должен состоять из 12 цифр, запрос будет выглядеть так:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.ИНН,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
СТРДЛИНА(Контрагенты.ИНН) = 12
Этот метод является наиболее предпочтительным, поскольку он точно измеряет длину строки и не зависит от содержимого символов (кроме их количества). Он прост в использовании, хорошо читаем и эффективен.
Еще один распространенный и очень полезный способ для проверки длины строки в запросах 1С – это использование оператора ПОДОБНО с символами подчеркивания (_), как было предложено в сообщении 4.
Символ _ (подчеркивание) в операторе ПОДОБНО является шаблоном, который соответствует любому одиночному символу. Соответственно, чтобы проверить, что ИНН состоит из определенного количества символов, мы можем просто повторить этот символ столько раз, какова должна быть ожидаемая длина ИНН. Автор темы подтвердил, что этот метод помог решить его задачу (сообщение 7).
Предположим, нам нужно найти ИНН, состоящие ровно из 9 символов:
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.ИНН,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
Контрагенты.ИНН ПОДОБНО "_________" // Девять символов подчеркивания
Этот запрос выберет все ИНН, состоящие ровно из 9 символов. Важно отметить: этот метод проверяет только количество символов, но не гарантирует, что все символы являются цифрами. Он пропустит, например, "123А56789" или "123 56789", если они имеют требуемую длину.
Если нам нужно убедиться, что ИНН состоит ровно из 10 (или 12) цифр, а не просто 10 любых символов, оператор ПОДОБНО в 1С имеет ограниченные возможности для таких сложных шаблонов. Он поддерживает лишь ограниченный набор символов-шаблонов (%, _) и не является полноценным механизмом регулярных выражений, способным проверить "только цифры" в каждом символе без потери производительности.
Для более строгой проверки того, что ИНН состоит только из цифр, обычно применяют программные методы на стороне сервера или клиента 1С, или же используют функции, которые уже реализованы в типовых конфигурациях для валидации ИНН. Пример, приведенный в сообщении 12, демонстрирует, насколько громоздким и неэффективным был бы запрос для посимвольной проверки каждого знака на то, является ли он цифрой.
В практическом смысле, если ИНН хранится корректно (т.е. содержит только цифры, так как это предполагается по его природе), то проверка ПОДОБНО "__________" (10 подчеркиваний) или ПОДОБНО "____________" (12 подчеркиваний) будет работать как ожидалось, отбирая ИНН нужной длины.
В ходе дискуссии был предложен метод, использующий функцию ПОДСТРОКА() для косвенной проверки длины (сообщение 17):
ВЫБРАТЬ
Контрагенты.Ссылка,
Контрагенты.ИНН,
Контрагенты.Наименование
ИЗ
Справочник.Контрагенты КАК Контрагенты
ГДЕ
ПОДСТРОКА(Контрагенты.ИНН, 10, 1) = ""
Данное условие означает: "выбрать все ИНН, у которых 10-й символ (один символ, начиная с 10-й позиции) является пустой строкой". Это фактически означает, что длина строки ИНН меньше 10 символов. То есть, данный запрос отберет ИНН длиной 0, 1, 2, ..., 9 символов.
Как было указано в сообщении 20, этот метод не контролирует наличие "мусора" (букв, пробелов, спецсимволов) в ИНН, а также, как было уточнено в сообщении 22, он отбирает все ИНН меньше 10 символов, включая незаполненные. Следовательно, этот метод не позволяет точно выбрать ИНН с ровно 9 символами. Он выберет все ИНН, у которых длина меньше или равна 9.
Ограничения: Если нам нужно строго 9 символов, этот подход не подойдет, так как он слишком "широкий". Для строгой проверки длины предпочтительнее использовать СТРДЛИНА() или ПОДОБНО "_________".
Если бы задача стояла "отобрать ИНН длиной НЕ БОЛЕЕ 9 символов", тогда этот метод был бы корректен.
Проверка длины – это только первый шаг в полной валидации ИНН. Для полноценной и надежной проверки мы рекомендуем также учитывать следующие аспекты:
ПроверитьИНН(), которые часто уже реализованы в типовых конфигурациях и обеспечивают более детальную проверку.Для решения задачи отбора контрагентов по точному количеству цифр в ИНН в запросах 1С мы рекомендуем использовать функцию СТРДЛИНА(Контрагенты.ИНН) = [нужное_количество_цифр]. Этот метод является наиболее прямым, читаемым и эффективным. Альтернативный способ – оператор ПОДОБНО с символами подчеркивания (например, ИНН ПОДОБНО "__________" для 10 символов), который также эффективно проверяет длину, но не гарантирует, что символы являются именно цифрами. Для полной и всесторонней валидации ИНН следует применять комплексные проверки, включая контрольные суммы и, по возможности, использовать функционал автоматической онлайн-проверки через сервисы ФНС, предоставляемый современными конфигурациями 1С.