При работе с решением «1С:Управление торговлей 11» (а также в аналогичных конфигурациях 1С:ERP и 1С:Комплексная автоматизация) пользователи и администраторы часто сталкиваются с необходимостью отображения уникального кода номенклатуры в различных списках. По умолчанию в типовой конфигурации в формах списков и подбора код может быть скрыт, а стандартные попытки вывести его через настройки формы или изменить динамический список в Конфигураторе вызывают множество вопросов. Кроме того, часто возникает проблема, когда поиск по части кода (подстроке) не дает результатов.
В этой статье мы подробно и по шагам разберем причины такого поведения системы, выясним, как правильно вывести код номенклатуры на форму силами пользователя, как настроить корректный поиск по подстроке кода и как решить эту задачу на уровне разработчика с помощью механизмов расширений.
Многие пользователи пытаются добавить колонку через стандартное меню «Еще — Настроить список». Однако в открывшемся окне доступны только настройки отбора, сортировки, группировки и условного оформления. Добавить новые колонки в таблицу там нельзя.
Для добавления полей необходимо использовать инструмент «Изменить форму», но здесь кроется неочевидный нюанс платформы 1С, который часто принимают за системную ошибку (баг). Разберем по шагам, как правильно вывести код:
СписокНоменклатура или Список).Ссылка, Номенклатура или Наименование.Ссылка (или Номенклатура).Ссылка, кнопка «Добавить поля» станет доступной. Нажмем на нее.Ссылка появится новое подчиненное поле Ссылка.Код. Мы можем управлять его положением на форме с помощью стрелок «Вверх» и «Вниз» на панели инструментов окна настройки.Проанализируем ситуацию: почему платформа ведет себя именно так? Это не баг, а продуманная архитектурная особенность оптимизации динамических списков управляемого приложения 1С. Динамический список считывает из базы данных только те поля, которые явно требуются для отображения. Поле Ссылка является объектом-контейнером. Когда мы указываем платформе, что хотим добавить поля «через Ссылку», система понимает, к какому именно объекту базы данных нужно обратиться, чтобы динамически дозагрузить реквизит Код, избегая избыточной нагрузки на СУБД.
После успешного вывода колонки Код пользователи часто сталкиваются со следующей проблемой: если ввести код номенклатуры целиком (например, 00-00001234), программа мгновенно находит товар. Но стоит ввести лишь последние цифры (например, 1234), поиск не выдает никаких результатов, несмотря на то, что полнотекстовый поиск в системе включен и индекс актуален.
Выясним причину этого поведения. В конфигурациях на базе ERP-платформы (включая УТ 11) поиск в списках может работать в двух принципиально разных режимах:
1. Расширенный поиск (Полнотекстовый поиск данных - ППД)
По умолчанию в современных базах включен именно этот режим. Механизм полнотекстового поиска оптимизирован для работы с огромными массивами текстовой информации. Он индексирует слова и числа как отдельные «токены». Код номенклатуры вида 00-00001234 воспринимается поисковым движком как единое неделимое слово. Соответственно, ППД может найти объект только при полном совпадении поискового запроса с этим токеном. Поиск по подстроке (по части «слова» из середины или конца) в данном режиме не поддерживается ради сохранения высокой скорости работы системы.
2. Стандартный поиск (поиск по подстроке средствами СУБД)
В этом режиме система транслирует поисковый запрос пользователя в классическое SQL-выражение с использованием оператора ПОДОБНО "%1234%". Такой поиск легко находит любые вхождения символов в коде, артикуле или наименовании, но на больших базах данных (сотни тысяч позиций) может вызывать существенные задержки (зависания) при вводе символов.
Рассмотрим, как переключить режим поиска в пользовательском интерфейсе:
Важный совет по обслуживанию индекса: Если поиск по коду перестал работать совсем (даже при вводе полного кода), это свидетельствует о повреждении или неактуальности индекса ППД. Для восстановления работоспособности администратору необходимо перейти в НСИ и администрирование — Администрирование — Общие настройки — Поиск данных, нажать кнопку «Очистить индекс», а затем запустить операцию «Обновить индекс».
Специалисты по внедрению часто пытаются решить задачу вывода кода раз и навсегда для всех пользователей через Конфигуратор. Они открывают форму подбора номенклатуры, находят динамический список, изменяют его SQL-запрос (добавляют выборку поля Код) и выносят элемент на форму. Однако при запуске в режиме «1С:Предприятие» колонка все равно не отображается.
Давайте проанализируем, почему так происходит. В современной архитектуре «1С:Управление торговлей 11» разработчики фирмы «1С» применили концепцию динамического построения интерфейса. В процедуре формы ПриСозданииНаСервере вызываются процедуры общих модулей, которые программно пересобирают текст запроса динамического списка подбора «на лету» (исходя из настроек параметров выбора, соглашений, цен, наличия остатков на складах и т.д.). Любые статические изменения текста запроса, которые программист делает вручную в свойствах списка в Конфигураторе, просто затираются программным кодом системы при инициализации формы.
Чтобы вывести колонку Код по умолчанию для всех пользователей без изменения основной конфигурации (сохраняя ее на поддержке), необходимо использовать механизм расширений платформы «1С:Предприятие 8.3».
Рассмотрим пример решения задачи через перехват программного формирования динамического списка. Нам нужно добавить поле Код в запрос списка программно в процедуре-обработчике создания формы.
Пример кода расширения для формы подбора номенклатуры:
&НаСервере
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверим наличие элемента списка на форме
ТаблицаСписка = Элементы.Найти("СписокНоменклатуры");
Если ТаблицаСписка <> Неопределено Тогда
// Получаем схему компоновки данных или текст запроса динамического списка
ТекстЗапроса = СписокНоменклатуры.ТекстЗапроса;
// Программно модифицируем запрос, добавляя выборку кода, если его там нет
Если Не СтрНайти(ТекстЗапроса, "Номенклатура.Код") Тогда
// Интегрируем поле Код в структуру запроса динамического списка
// (В зависимости от логики построения запроса в конкретной версии УТ 11)
КонецЕсли;
// Программно добавляем колонку на форму для всех пользователей
НовыйЭлемент = Элементы.Добавить("СписокНоменклатурыКод", Тип("ПолеФормы"), ТаблицаСписка);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "СписокНоменклатуры.Ссылка.Код";
НовыйЭлемент.Заголовок = "Код";
НовыйЭлемент.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Нет;
КонецЕсли;
КонецПроцедуры
Использование этого метода гарантирует, что колонка будет добавлена на форму принудительно для всех пользователей программным путем, настройки не «слетят» при очистке кэша или обновлении конфигурации, а сам код решения останется изолированным внутри безопасного расширения.
Мы подробно разобрали все аспекты настройки видимости кода номенклатуры и управления механизмами поиска в управляемых формах 1С. Применение описанных методик позволит существенно повысить удобство и скорость работы менеджеров по продажам и кладовщиков при оформлении документов.