Как реализовать поиск контрагента по коду без ведущих нулей в 1С:Управление торговлей 10.3?

Программист 1С v8.3 (Обычные формы) Управленческий учет Торговля и дистрибуция
← На главную

В типовой конфигурации «Управление торговлей 10.3» (и других решениях на базе обычных форм) часто возникает ситуация, когда пользователям неудобно вводить полные коды справочников. Например, код контрагента имеет длину 9 символов и выглядит как 000000346. Оператору гораздо проще ввести в поле документа число 346, ожидая, что система сама найдет нужного контрагента. Однако по умолчанию 1С ищет точное совпадение строки, и ввод без нулей приводит к ошибке или открытию пустого списка.

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

Анализ проблемы строковых кодов в 1С

Для начала выясним причину, по которой поиск не работает автоматически. В 1С коды справочников чаще всего являются строковыми. Это сделано для обеспечения иерархии и возможности использования префиксов. Строка 346 и строка 000000346 — это абсолютно разные значения для базы данных. Когда пользователь вводит текст в поле выбора контрагента, система пытается выполнить поиск по наименованию или по коду (в зависимости от настроек), используя введенное значение «как есть».

Рассмотрим ситуацию: пользователь вводит «4». Программа ищет код 4 (с пробелами или без) или наименование, начинающееся на «4». Так как реальный код в базе 000000004, совпадение не находится. Наша задача — научить систему «догадываться», что если введено число, его нужно дополнить нулями слева до нужной длины.

Способ 1. Настройка свойств поля ввода (без программирования)

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

  1. Откроем свойства справочника Контрагенты.
  2. Перейдем на закладку «Поля ввода».
  3. Найдем список «Ввод по строке». По умолчанию там обычно стоит Наименование. Чтобы поиск работал и по коду, добавим туда поле Код.
  4. Свойство «Способ поиска строки» можно установить в значение Любая часть.

Важное замечание: Как показывает практика (и сообщение 5 в обсуждении), этот метод не всегда эффективен для кодов. Если включить поиск по любой части, система начнет находить все коды, где встречается «346» (например, 000034601, 346000000 и т.д.), что может запутать пользователя. Кроме того, поиск по любой части строки в больших базах данных может значительно замедлять работу, так как 1С не сможет полноценно использовать индексы таблиц.

Способ 2. Программная обработка события «ОкончаниеВводаТекста»

Это самый надежный и гибкий метод для конфигурации УТ 10.3. Мы перехватим момент, когда пользователь закончил ввод текста в поле Контрагент в документе Реализация товаров и услуг, и программно модифицируем введенную строку.

Разберем алгоритм по шагам:

  1. Откроем форму документа РеализацияТоваровУслуг.
  2. Выберем элемент управления — поле ввода Контрагент.
  3. В палитре свойств найдем событие «ОкончаниеВводаТекста» и нажмем на лупу для создания процедуры в модуле формы.

Проанализируем код, который нам необходимо написать:


Процедура КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)

    // Если текст пустой, ничего не делаем
    Если ПустаяСтрока(Текст) Тогда
        Возврат;
    КонецЕсли;

    // Проверяем, состоит ли введенный текст только из цифр
    // Для этого попробуем преобразовать его в число
    Попытка
        ЧисловойКод = Число(Текст);
    Исключение
        // Если в тексте буквы, значит пользователь ищет по наименованию
        // Оставляем стандартную обработку
        Возврат;
    КонецПопытки;

    // Определяем требуемую длину кода для справочника Контрагенты (обычно 9)
    НужнаяДлина = Метаданные.Справочники.Контрагенты.ДлинаКода;
    
    // Если длина введенного текста меньше нужной, дополняем нулями
    Если СтрДлина(Текст) < НужнаяДлина Тогда
        
        СтандартнаяОбработка = Ложь; // Отменяем стандартный поиск 1С
        
        // Формируем правильный код с ведущими нулями
        // Используем функцию Формат для быстрого дополнения
        // ЧЦ - общее количество знаков, ЧГ=0 - убрать группировку разрядов
        ДополненныйКод = Формат(ЧисловойКод, "ЧЦ=" + НужнаяДлина + "; ЧГ=0");
        
        // Пытаемся найти контрагента по сформированному коду
        НайденнаяСсылка = Справочники.Контрагенты.НайтиПоКоду(ДополненныйКод);
        
        Если НЕ НайденнаяСсылка.Пустая() Тогда
            // Если нашли — подставляем значение в поле
            Значение = НайденнаяСсылка;
        Иначе
            // Если не нашли по коду, можно оставить текст как есть
            // или вывести предупреждение
            Сообщить("Контрагент с кодом " + ДополненныйКод + " не найден!");
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

В этом коде мы используем объект Метаданные, чтобы динамически получить длину кода справочника. Это делает решение универсальным: если завтра вы измените длину кода в конфигураторе до 10 или 12 символов, код продолжит работать корректно.

Способ 3. Использование универсальной функции дополнения нулями

В типовых конфигурациях 1С часто уже существуют вспомогательные функции в общих модулях. Проанализируем возможность использования функции СоздатьПолныйКод. Если в вашей версии УТ 10.3 есть общий модуль ОбщегоНазначения, вы можете сократить написание логики.

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


Если СтрДлина(Текст) < 9 Тогда
    СтандартнаяОбработка = Ложь;
    ТекстПоиска = ОбщегоНазначения.СоздатьПолныйКод(Текст, 9);
    Значение = Справочники.Контрагенты.НайтиПоКоду(ТекстПоиска);
КонецЕсли;

Это делает код более чистым и понятным, перекладывая рутинную работу по строковым манипуляциям на проверенные временем механизмы системы.

Почему не стоит создавать новый реквизит «КодБезНулей»?

Выясним причину, по которой предложение автора из сообщения 12 (создать новый реквизит и хранить там код без нулей) является неудачным. Во-первых, это дублирование данных: информация о коде уже есть в базе. Во-вторых, вам придется обеспечивать уникальность этого реквизита программно. В-третьих, стандартные механизмы подбора всё равно не будут знать о вашем новом реквизите, пока вы не перепишете все формы выбора и поиска в системе.

Использование события ОкончаниеВводаТекста — это «точечное» и эффективное вмешательство, которое решает задачу именно там, где это нужно пользователю, не загромождая структуру метаданных.

Дополнительные рекомендации

При реализации данного функционала следует учитывать несколько нюансов:

Таким образом, мы выяснили, что наиболее элегантным решением для 1С:УТ 10.3 является программная обработка ввода. Это позволяет сохранить целостность базы данных и обеспечить максимальный комфорт для операторов, привыкших к быстрой работе с цифровыми кодами.

← На главную