В процессе работы с конфигурацией «1С:Управление торговлей 11» (УТ 11.4 и выше) часто возникает задача анализа «зависших» или необработанных заказов. Одной из ключевых задач для менеджеров или службы контроля является выборка партнеров, которые оформили заказ клиента, но по которым так и не была создана Реализация товаров и услуг. В этой статье мы подробно разберем, как реализовать такую выборку с помощью механизмов запросов 1С, учитывая архитектурные особенности системы.
Самый наглядный и понятный способ — это выбрать все заказы из базы данных и отфильтровать те, ссылка на которые не встречается в реквизитах документов реализации. Рассмотрим этот метод подробнее. В УТ 11 документ РеализацияТоваровУслуг обычно связан с заказом через реквизит ЗаказКлиента (если в настройках не указано иное). Напишем текст запроса, который выбирает партнеров из таких документов.
Проанализируем пример кода:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗаказКлиента.Партнер КАК Партнер,
ЗаказКлиента.Партнер.Наименование КАК ПартнерНаименование
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
ЗаказКлиента.Проведен = ИСТИНА
И ЗаказКлиента.Ссылка НЕ В (
ВЫБРАТЬ
Реализация.ЗаказКлиента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
ГДЕ
Реализация.Проведен = ИСТИНА
)
В данном примере мы используем вложенный запрос. Сначала система собирает все ссылки на заказы из проведенных реализаций, а затем основной запрос исключает эти ссылки из общего списка заказов. Использование ключевого слова РАЗЛИЧНЫЕ позволяет нам получить список уникальных партнеров, даже если у одного клиента было несколько пустых заказов.
С точки зрения производительности базы данных (особенно на крупных объемах данных), конструкция НЕ В может работать медленнее, чем соединение таблиц. Разберем, как переписать этот запрос, используя ЛЕВОЕ СОЕДИНЕНИЕ. Мы присоединяем таблицу реализаций к таблице заказов по ссылке на заказ и выбираем только те записи, где в правой таблице (реализации) образовалось значение NULL.
Рассмотрим структуру такого запроса:
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗаказКлиента.Партнер КАК Партнер
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализация
ПО ЗаказКлиента.Ссылка = Реализация.ЗаказКлиента
ГДЕ
Реализация.Ссылка ЕСТЬ NULL
И ЗаказКлиента.Проведен = ИСТИНА
Этот метод считается более профессиональным и «быстрым» при работе с большими информационными базами SQL.
Зачастую простого списка имен партнеров недостаточно — для работы (обзвона) нужны их телефоны. Посмотрим на расширенный пример запроса, который не только находит клиентов без отгрузок, но и сразу подтягивает их контактную информацию из справочника Партнеры.
ВЫБРАТЬ РАЗЛИЧНЫЕ
ЗаказКлиента.Партнер КАК Партнер,
ЗаказКлиента.Партнер.Наименование КАК ПартнерНаименование,
ПартнерыКонтактнаяИнформация.Представление КАК НомерТелефона
ИЗ
Документ.ЗаказКлиента КАК ЗаказКлиента
ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
ПО ЗаказКлиента.Партнер = ПартнерыКонтактнаяИнформация.Ссылка
И ПартнерыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
ГДЕ
ЗаказКлиента.Дата МЕЖДУ &НачДата И &КонДата
И ЗаказКлиента.Ссылка НЕ В (
ВЫБРАТЬ
Реализация.ЗаказКлиента
ИЗ
Документ.РеализацияТоваровУслуг КАК Реализация
)
УПОРЯДОЧИТЬ ПО
ПартнерНаименование
Здесь мы применили фильтр по дате документа (реквизит Дата), чтобы не анализировать заказы за прошлые годы, а сосредоточиться на актуальном периоде.
При написании запросов к документам в современных конфигурациях (УТ 11, ERP, КА) необходимо учитывать несколько критически важных факторов, которые могут повлиять на корректность результата:
ЗаказКлиента.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт).РеализацияТоваровУслуг, а в его табличной части Товары. В этом случае подзапрос должен обращаться к Документ.РеализацияТоваровУслуг.Товары.Остатки покажет те позиции, которые зарезервированы или ожидаются к отгрузке, но еще не списаны реализацией.Выясним причину, почему лучше обращаться к регистрам: обращение к физическим таблицам документов требует сканирования всех записей, тогда как регистры накопления хранят уже агрегированные итоги, что значительно ускоряет выполнение отчетов.
Мы рассмотрели несколько способов получения списка клиентов без реализаций: от простых запросов к документам до более сложных конструкций с получением телефонов. Для разовой задачи вполне подойдет метод через НЕ В или ЛЕВОЕ СОЕДИНЕНИЕ по шапке документа. Если же вам требуется регулярный и точный отчет, рекомендуем использовать данные регистра накопления ЗаказыКлиентов, так как он учитывает частичные отгрузки и статусы отмены позиций.