В типовой конфигурации «Управление торговлей 10.3» (и других решениях на базе обычных форм) часто возникает ситуация, когда пользователям неудобно вводить полные коды справочников. Например, код контрагента имеет длину 9 символов и выглядит как 000000346. Оператору гораздо проще ввести в поле документа число 346, ожидая, что система сама найдет нужного контрагента. Однако по умолчанию 1С ищет точное совпадение строки, и ввод без нулей приводит к ошибке или открытию пустого списка.
В этой статье мы подробно разберем, как автоматизировать этот процесс, проанализируем стандартные механизмы платформы и напишем программный код, который избавит пользователей от необходимости рутинного ввода нулей.
Для начала выясним причину, по которой поиск не работает автоматически. В 1С коды справочников чаще всего являются строковыми. Это сделано для обеспечения иерархии и возможности использования префиксов. Строка 346 и строка 000000346 — это абсолютно разные значения для базы данных. Когда пользователь вводит текст в поле выбора контрагента, система пытается выполнить поиск по наименованию или по коду (в зависимости от настроек), используя введенное значение «как есть».
Рассмотрим ситуацию: пользователь вводит «4». Программа ищет код 4 (с пробелами или без) или наименование, начинающееся на «4». Так как реальный код в базе 000000004, совпадение не находится. Наша задача — научить систему «догадываться», что если введено число, его нужно дополнить нулями слева до нужной длины.
Прежде чем приступать к написанию кода, проверим стандартные возможности платформы 1С:Предприятие 8.3 для обычных форм. Посмотрим на свойства справочника Контрагенты в конфигураторе.
Контрагенты.Наименование. Чтобы поиск работал и по коду, добавим туда поле Код.Любая часть.Важное замечание: Как показывает практика (и сообщение 5 в обсуждении), этот метод не всегда эффективен для кодов. Если включить поиск по любой части, система начнет находить все коды, где встречается «346» (например, 000034601, 346000000 и т.д.), что может запутать пользователя. Кроме того, поиск по любой части строки в больших базах данных может значительно замедлять работу, так как 1С не сможет полноценно использовать индексы таблиц.
Это самый надежный и гибкий метод для конфигурации УТ 10.3. Мы перехватим момент, когда пользователь закончил ввод текста в поле Контрагент в документе Реализация товаров и услуг, и программно модифицируем введенную строку.
Разберем алгоритм по шагам:
РеализацияТоваровУслуг.Контрагент.Проанализируем код, который нам необходимо написать:
Процедура КонтрагентОкончаниеВводаТекста(Элемент, Текст, Значение, СтандартнаяОбработка)
// Если текст пустой, ничего не делаем
Если ПустаяСтрока(Текст) Тогда
Возврат;
КонецЕсли;
// Проверяем, состоит ли введенный текст только из цифр
// Для этого попробуем преобразовать его в число
Попытка
ЧисловойКод = Число(Текст);
Исключение
// Если в тексте буквы, значит пользователь ищет по наименованию
// Оставляем стандартную обработку
Возврат;
КонецПопытки;
// Определяем требуемую длину кода для справочника Контрагенты (обычно 9)
НужнаяДлина = Метаданные.Справочники.Контрагенты.ДлинаКода;
// Если длина введенного текста меньше нужной, дополняем нулями
Если СтрДлина(Текст) < НужнаяДлина Тогда
СтандартнаяОбработка = Ложь; // Отменяем стандартный поиск 1С
// Формируем правильный код с ведущими нулями
// Используем функцию Формат для быстрого дополнения
// ЧЦ - общее количество знаков, ЧГ=0 - убрать группировку разрядов
ДополненныйКод = Формат(ЧисловойКод, "ЧЦ=" + НужнаяДлина + "; ЧГ=0");
// Пытаемся найти контрагента по сформированному коду
НайденнаяСсылка = Справочники.Контрагенты.НайтиПоКоду(ДополненныйКод);
Если НЕ НайденнаяСсылка.Пустая() Тогда
// Если нашли — подставляем значение в поле
Значение = НайденнаяСсылка;
Иначе
// Если не нашли по коду, можно оставить текст как есть
// или вывести предупреждение
Сообщить("Контрагент с кодом " + ДополненныйКод + " не найден!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В этом коде мы используем объект Метаданные, чтобы динамически получить длину кода справочника. Это делает решение универсальным: если завтра вы измените длину кода в конфигураторе до 10 или 12 символов, код продолжит работать корректно.
В типовых конфигурациях 1С часто уже существуют вспомогательные функции в общих модулях. Проанализируем возможность использования функции СоздатьПолныйКод. Если в вашей версии УТ 10.3 есть общий модуль ОбщегоНазначения, вы можете сократить написание логики.
Рассмотрим пример использования такой функции:
Если СтрДлина(Текст) < 9 Тогда
СтандартнаяОбработка = Ложь;
ТекстПоиска = ОбщегоНазначения.СоздатьПолныйКод(Текст, 9);
Значение = Справочники.Контрагенты.НайтиПоКоду(ТекстПоиска);
КонецЕсли;
Это делает код более чистым и понятным, перекладывая рутинную работу по строковым манипуляциям на проверенные временем механизмы системы.
Выясним причину, по которой предложение автора из сообщения 12 (создать новый реквизит и хранить там код без нулей) является неудачным. Во-первых, это дублирование данных: информация о коде уже есть в базе. Во-вторых, вам придется обеспечивать уникальность этого реквизита программно. В-третьих, стандартные механизмы подбора всё равно не будут знать о вашем новом реквизите, пока вы не перепишете все формы выбора и поиска в системе.
Использование события ОкончаниеВводаТекста — это «точечное» и эффективное вмешательство, которое решает задачу именно там, где это нужно пользователю, не загромождая структуру метаданных.
При реализации данного функционала следует учитывать несколько нюансов:
Попытка...Исключение. Если пользователь введет «ООО Магнит», функция Число() вызовет исключение, и программа перейдет к стандартному поиску по строке.УТ0000346), алгоритм дополнения нулями нужно усложнить, добавляя префикс организации или информационной базы в начало строки.СтандартнаяОбработка. Если вы установили его в значение Ложь, вы берете на себя полную ответственность за заполнение переменной Значение.Таким образом, мы выяснили, что наиболее элегантным решением для 1С:УТ 10.3 является программная обработка ввода. Это позволяет сохранить целостность базы данных и обеспечить максимальный комфорт для операторов, привыкших к быстрой работе с цифровыми кодами.