В процессе работы менеджеров по продажам, особенно в таких отраслях, как торговля автозапчастями, возникает острая необходимость оперативно получать информацию о наличии товара не только на собственных складах, но и в прайс-листах поставщиков. Стандартный функционал 1С:Управление торговлей (УТ 11) разделяет эти данные: собственная номенклатура находится в одном справочнике, а номенклатура поставщиков — в другом. Это заставляет сотрудников переключаться между окнами, что значительно замедляет обработку входящих заявок.
В данной статье мы разберем, как объединить эти данные в одном окне, настроить сквозной поиск по артикулу и создать удобное рабочее место (АРМ) для менеджера.
Основная цель доработки — минимизация времени поиска. Рассмотрим типовую ситуацию: менеджер получает запрос по артикулу. Если позиции нет в собственной базе, ему нужно проверить, есть ли она у поставщиков, чтобы предложить клиенту вариант «под заказ». Вместо открытия нескольких форм и файлов Excel, мы создадим интерфейс, где по одному вводу артикула система покажет:
Номенклатуре.Номенклатура контрагентов.Этот способ предполагает добавление на форму (например, новую форму списка или отдельную обработку) двух независимых таблиц. Разберем по шагам, как настроить синхронный поиск для обеих таблиц.
Проблема штатного поиска в том, что он привязан к конкретному элементу управления. Чтобы реализовать поиск «одной строкой», проанализируем следующий алгоритм:
Строка, назовем его СтрокаПоиска.СписокНашаНоменклатура и СписокНоменклатураПоставщиков) настроим программную фильтрацию в событии ПриИзменении поля поиска.Пример программной установки отбора для поиска по артикулу:
&НаСервере
Процедура УстановитьПоискНаСервере(ЗначениеПоиска)
// Очищаем старые фиксированные настройки
ЭлементОтбора = СписокНашаНоменклатура.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Артикул");
ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбора.ПравоеЗначение = ЗначениеПоиска;
ЭлементОтбора.Использование = Значит(ЗначениеПоиска <> "");
// Аналогично для списка номенклатуры контрагентов
ЭлементОтбораК = СписокНоменклатураПоставщиков.КомпоновщикНастроек.ФиксированныеНастройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
ЭлементОтбораК.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Артикул");
ЭлементОтбораК.ВидСравнения = ВидСравненияКомпоновкиДанных.Содержит;
ЭлементОтбораК.ПравоеЗначение = ЗначениеПоиска;
КонецПроцедуры
Если мы хотим видеть данные в единой таблице, проанализируем возможность использования оператора ОБЪЕДИНИТЬ ВСЕ в запросе динамического списка. Это позволит вывести «смешанный» список, где будут присутствовать и наши позиции, и позиции поставщиков, которые еще не сопоставлены.
Рассмотрим структуру такого запроса:
Номенклатура. Добавляем поля цен и остатков.НоменклатураКонтрагентов. С помощью ЛЕВОЕ СОЕДИНЕНИЕ исключаем те позиции, которые уже сопоставлены с нашей номенклатурой (чтобы избежать дублей).Важно помнить, что при использовании объединения в динамическом списке система должна иметь основную таблицу для корректной работы стандартных функций (открытие формы, пометка на удаление). В случае «смешанного» списка основную таблицу лучше не указывать, а открытие форм прописывать программно в событии Выбор.
ВЫБРАТЬ
Номенклатура.Ссылка КАК Объект,
Номенклатура.Наименование КАК Наименование,
Номенклатура.Артикул КАК Артикул,
"Собственный" КАК ТипПозиции
ИЗ
Справочник.Номенклатура КАК Номенклатура
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
НоменклатураКонтрагентов.Ссылка,
НоменклатураКонтрагентов.Наименование,
НоменклатураКонтрагентов.Артикул,
"Поставщик: " + НоменклатураКонтрагентов.Владелец.Наименование
ИЗ
Справочник.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
ГДЕ
НоменклатураКонтрагентов.Номенклатура = ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
Многие специалисты рекомендуют не модифицировать основную форму списка справочника Номенклатура, чтобы не затруднять последующие обновления конфигурации. Вместо этого лучше создать отдельную внешнюю обработку или отчет с формой АРМ.
Разберем преимущества создания выделенного рабочего места:
НормализоватьАртикул(), которая будет искать OC90, даже если пользователь ввел OC-90.Номенклатура контрагентов, а читать напрямую из внешних файлов или временных таблиц в этом же АРМ.Проанализируем ситуацию: в справочнике Номенклатура артикул записан как 123-456, а в справочнике поставщика — 123456. Обычный поиск их не свяжет. Для решения этой проблемы в 1С рекомендуется:
АртикулПоиск (индексированный).Посмотрим на пример функции нормализации:
Функция НормализоватьАртикул(Знач Стр) Экспорт
Результат = "";
Для Индекс = 1 По СтрДлина(Стр) Цикл
Символ = Сред(Стр, Индекс, 1);
Если (Символ >= "0" И Символ <= "9") ИЛИ (ВРег(Символ) >= "A" И ВРег(Символ) <= "Z") Тогда
Результат = Результат + ВРег(Символ);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Мы рассмотрели несколько подходов к выводу двух справочников в одном окне. Наиболее стабильным и удобным для поддержки является создание внешней обработки (АРМ менеджера) с использованием динамического списка на основе произвольного запроса. Это позволяет объединить данные, настроить быстрый поиск по очищенным артикулам и предоставить менеджеру всю необходимую информацию для продажи (цены, остатки, аналоги) в режиме «одного окна».
Выбор конкретного метода зависит от объема вашей базы данных. Если позиций номенклатуры контрагентов миллионы, лучше использовать прямые запросы к базе или специализированные индексированные таблицы, чтобы интерфейс оставался отзывчивым.