Как в 1С:УТ 11 выбрать клиентов, у которых есть заказы без оформленных реализаций?

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

В процессе работы с конфигурацией «1С:Управление торговлей 11» (УТ 11.4 и выше) часто возникает задача анализа «зависших» или необработанных заказов. Одной из ключевых задач для менеджеров или службы контроля является выборка партнеров, которые оформили заказ клиента, но по которым так и не была создана Реализация товаров и услуг. В этой статье мы подробно разберем, как реализовать такую выборку с помощью механизмов запросов 1С, учитывая архитектурные особенности системы.

Способ 1. Простой запрос с использованием конструкции «НЕ В»

Самый наглядный и понятный способ — это выбрать все заказы из базы данных и отфильтровать те, ссылка на которые не встречается в реквизитах документов реализации. Рассмотрим этот метод подробнее. В УТ 11 документ РеализацияТоваровУслуг обычно связан с заказом через реквизит ЗаказКлиента (если в настройках не указано иное). Напишем текст запроса, который выбирает партнеров из таких документов.

Проанализируем пример кода:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЗаказКлиента.Партнер КАК Партнер,
    ЗаказКлиента.Партнер.Наименование КАК ПартнерНаименование
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
ГДЕ
    ЗаказКлиента.Проведен = ИСТИНА
    И ЗаказКлиента.Ссылка НЕ В (
        ВЫБРАТЬ
            Реализация.ЗаказКлиента
        ИЗ
            Документ.РеализацияТоваровУслуг КАК Реализация
        ГДЕ
            Реализация.Проведен = ИСТИНА
    )

В данном примере мы используем вложенный запрос. Сначала система собирает все ссылки на заказы из проведенных реализаций, а затем основной запрос исключает эти ссылки из общего списка заказов. Использование ключевого слова РАЗЛИЧНЫЕ позволяет нам получить список уникальных партнеров, даже если у одного клиента было несколько пустых заказов.

Способ 2. Оптимизация через «ЛЕВОЕ СОЕДИНЕНИЕ»

С точки зрения производительности базы данных (особенно на крупных объемах данных), конструкция НЕ В может работать медленнее, чем соединение таблиц. Разберем, как переписать этот запрос, используя ЛЕВОЕ СОЕДИНЕНИЕ. Мы присоединяем таблицу реализаций к таблице заказов по ссылке на заказ и выбираем только те записи, где в правой таблице (реализации) образовалось значение NULL.

Рассмотрим структуру такого запроса:


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЗаказКлиента.Партнер КАК Партнер
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
    ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК Реализация
    ПО ЗаказКлиента.Ссылка = Реализация.ЗаказКлиента
ГДЕ
    Реализация.Ссылка ЕСТЬ NULL
    И ЗаказКлиента.Проведен = ИСТИНА

Этот метод считается более профессиональным и «быстрым» при работе с большими информационными базами SQL.

Способ 3. Выборка клиентов с получением контактных данных

Зачастую простого списка имен партнеров недостаточно — для работы (обзвона) нужны их телефоны. Посмотрим на расширенный пример запроса, который не только находит клиентов без отгрузок, но и сразу подтягивает их контактную информацию из справочника Партнеры.


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ЗаказКлиента.Партнер КАК Партнер,
    ЗаказКлиента.Партнер.Наименование КАК ПартнерНаименование,
    ПартнерыКонтактнаяИнформация.Представление КАК НомерТелефона
ИЗ
    Документ.ЗаказКлиента КАК ЗаказКлиента
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Партнеры.КонтактнаяИнформация КАК ПартнерыКонтактнаяИнформация
        ПО ЗаказКлиента.Партнер = ПартнерыКонтактнаяИнформация.Ссылка
        И ПартнерыКонтактнаяИнформация.Тип = ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
ГДЕ
    ЗаказКлиента.Дата МЕЖДУ &НачДата И &КонДата
    И ЗаказКлиента.Ссылка НЕ В (
        ВЫБРАТЬ 
            Реализация.ЗаказКлиента 
        ИЗ 
            Документ.РеализацияТоваровУслуг КАК Реализация
    )
УПОРЯДОЧИТЬ ПО
    ПартнерНаименование

Здесь мы применили фильтр по дате документа (реквизит Дата), чтобы не анализировать заказы за прошлые годы, а сосредоточиться на актуальном периоде.

Важные нюансы архитектуры УТ 11

При написании запросов к документам в современных конфигурациях (УТ 11, ERP, КА) необходимо учитывать несколько критически важных факторов, которые могут повлиять на корректность результата:

  1. Статусы заказов и флаги отмены: Если заказ был отменен (установлен признак отмены в строках или статус «Закрыт» без отгрузки), реализация по нему не появится. Чтобы такие заказы не попадали в выборку «зависших», добавьте условие: ЗаказКлиента.Статус <> ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт).
  2. Связь через табличную часть: В некоторых настройках системы (например, при использовании договоров с детализацией расчетов «по заказам» или при сборных реализациях) связь с заказом может находиться не в шапке документа РеализацияТоваровУслуг, а в его табличной части Товары. В этом случае подзапрос должен обращаться к Документ.РеализацияТоваровУслуг.Товары.
  3. Использование регистров: Для получения более точных данных об остатках (когда заказ реализован лишь частично) лучше использовать не документы, а регистр накопления «Заказы клиентов». Выборка по виртуальной таблице Остатки покажет те позиции, которые зарезервированы или ожидаются к отгрузке, но еще не списаны реализацией.

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

Заключение

Мы рассмотрели несколько способов получения списка клиентов без реализаций: от простых запросов к документам до более сложных конструкций с получением телефонов. Для разовой задачи вполне подойдет метод через НЕ В или ЛЕВОЕ СОЕДИНЕНИЕ по шапке документа. Если же вам требуется регулярный и точный отчет, рекомендуем использовать данные регистра накопления ЗаказыКлиентов, так как он учитывает частичные отгрузки и статусы отмены позиций.

← На главную