Как правильно вывести остатки и документы реализации в одну строку запроса 1С?

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

Часто при разработке отчетов в 1С перед программистом встает задача: вывести в одну строку данные из двух разных источников — например, текущие остатки на складе и связанные с ними документы реализации. Начинающие разработчики часто пытаются решить эту задачу с помощью оператора ОБЪЕДИНИТЬ или ОБЪЕДИНИТЬ ВСЕ, однако этот путь приводит к тому, что данные о товаре и данные о документе выводятся в разных строках, оставляя пустые ячейки (NULL). Давайте разберем, почему это происходит и как сделать правильно.

Почему ОБЪЕДИНИТЬ не подходит для этой задачи?

Важно понимать разницу в логике работы операторов запроса. ОБЪЕДИНИТЬ ВСЕ просто «склеивает» результаты двух выборок, помещая строки второй таблицы строго под строками первой. Запрос не умеет автоматически объединять столбцы по общему признаку, если вы не используете агрегатные функции и группировку.

Если ваша цель — получить структуру Товар | Остаток | Документ | Количество, то использование объединения лишь создаст «лесенку» из данных. Чтобы исправить это, вам придется оборачивать результат во вложенный запрос и использовать группировки, что сильно усложнит код и снизит производительность.

Решение через соединение таблиц

Если вам нужно видеть остатки и связанные с ними реализации в одной строке, правильнее использовать механизм соединений. Рассмотрим основные варианты:

  1. Левое соединение: Позволяет вывести все остатки, а к ним «пристегнуть» данные о продажах, если они есть. Если записи в документах для товара отсутствуют, поля документа останутся пустыми, но товар останется в списке.
  2. Полное соединение: Подойдет, если вам нужно видеть и товары, которые есть на остатках (но нет в продажах), и товары, которые были проданы (но их нет на остатках).

При использовании соединений не забывайте использовать функцию ЕСТЬNULL(). Это критически важно, чтобы вместо пустых значений NULL в отчете отображались нули, что позволит корректно суммировать данные.


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

Профессиональный подход: использование СКД

Самым методически верным решением для платформы 1С является использование Системы компоновки данных (СКД). Она избавляет от необходимости писать сложные «тяжелые» запросы и помогает избежать классических ошибок, таких как декартово произведение (задвоение данных).

Рассмотрим шаги по настройке СКД:

Преимущество этого метода в том, что СКД автоматически сгруппирует данные по номенклатуре, корректно посчитает итоги и избавит вас от «размножения» строк, которое часто случается при ручном написании ПОЛНОГО СОЕДИНЕНИЯ в консоли запросов.

На что обратить внимание при анализе данных

Работая с остатками и оборотами, всегда учитывайте следующие моменты:

  1. Агрегация данных: Если в документе реализации несколько строк с одной номенклатурой, соединение может привести к тому, что одна строка остатка будет выведена несколько раз. Всегда предварительно сворачивайте данные в виртуальные таблицы или используйте временные таблицы с группировкой перед основным соединением.
  2. Целостность данных: Помните, что регистры накопления хранят остатки на конкретный момент, а документы — это свершившиеся факты. При сравнении этих данных убедитесь, что вы используете корректные параметры периода, иначе результат отчета будет неверным.

Используя предложенные методы, вы сможете построить отчет любой сложности, сохранив при этом чистоту кода и высокую скорость работы системы.

← На главную