Пропала строка в отчете 1С: ищем, где потерялось значение в пакетном запросе
Ко мне часто приходят с одним и тем же вопросом: «Почему в отчете нет этой номенклатуры?». Запрос большой, временных таблиц двадцать с лишним, отчет собирается, цифры сходятся, а нужной строки нет. Смотришь в базу — номенклатура есть. Смотришь в отчет — нет.
Найти это не сложно. Это нудно. Сначала выполняешь пакет по временным таблицам, открываешь каждую, ищешь, на каком шаге значение еще было, а на каком пропало. Потом смотришь условие или связь на этом шаге. Полчаса, час, а то и вечер, если таблиц много и названия не помогают.
Дальше — как этот поиск устроен и как его сократить до нескольких минут.
Почему значение пропадает
Почти всегда причина одна из пяти.
Внутреннее соединение с таблицей, где строки нет. Самое частое. Соединили товары с ценами по номенклатуре, а у одной позиции цены нет — строка исчезла. В отчете это выглядит как «номенклатуры нет», хотя она есть в первой таблице.
Условие в ГДЕ по правой таблице. Было левое соединение, добавили ГДЕ Цены.Цена > 0 — и оно тихо стало внутренним: строки без цены отсеклись. Классика.
Группировка и ИМЕЮЩИЕ. Строка была, но не попала в группу или группа отсеялась условием по итогу.
Условие во вложенном запросе. Отбор стоит не там, где ищешь: не в главном запросе, а в подзапросе, который готовит временную таблицу.
Несовпадение типов в связи. Соединяют строку с ссылкой или число с кодом-строкой. Запрос выполняется, связь не находит ничего, строки пропадают без ошибки.
Общее у них одно: значение было на предыдущем шаге и исчезло на следующем. Значит, искать надо не по всему запросу, а по шагам.
Как искали руками
Пакет из двадцати временных таблиц. Включаешь показ временных таблиц, выполняешь, открываешь первую, ищешь нужную номенклатуру. Есть. Открываешь вторую. Есть. Третью. Нет. Значит, смотрим соединение между второй и третьей. Открываешь текст, находишь это соединение, читаешь условие.
Работа механическая, но пропустить шаг нельзя: значение могло пропасть в любом месте, а названия таблиц вроде ВТ1, ВТ2, ВТИтог только мешают.
Что показывает окно «Где потерялось значение»
В консоли этот поиск автоматизирован: выбираешь значение во временной таблице и жмешь «Где потерялось значение». Окно строит цепочку шагов и говорит словами, где значение пропало.

В примере — контрагенты, у которых не заполнен ИНН. Пакет простой:
ВЫБРАТЬ
Контрагент.Наименование КАК Наименование,
Контрагент.ИНН КАК ИНН
ПОМЕСТИТЬ ВТКонтрагенты
ИЗ
Справочник.Контрагенты КАК Контрагент;
ВЫБРАТЬ
Контрагент.Наименование КАК Наименование,
Контрагент.ИНН КАК ИНН
ПОМЕСТИТЬ ВТСИНН
ИЗ
Справочник.Контрагенты КАК Контрагент
ГДЕ
Контрагент.ИНН <> "";
ВЫБРАТЬ
ВТКонтрагенты.Наименование КАК Наименование,
ВТСИНН.ИНН КАК ИНН
ИЗ
ВТКонтрагенты КАК ВТКонтрагенты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТСИНН КАК ВТСИНН
ПО ВТКонтрагенты.Наименование = ВТСИНН.Наименование
Выбираем в первой временной таблице «Наше предприятие». Окно показывает:
- значение и колонку, откуда оно взято;
- шаги цепочки: где значение есть, где его уже нет;
- вторую сторону соединения — таблицу, в которой не нашлось пары;
- причину: «Значение Наше предприятие отсекает внутреннее соединение с ВТСИНН по ВТКонтрагенты.Наименование = ВТСИНН.Наименование: в ВТСИНН нет Наименование = Наше предприятие. С левым соединением значение осталось бы».
Это ровно тот вывод, до которого руками доходишь после десятка открытых таблиц. Только здесь он появляется сразу и не зависит от того, догадался ли ты посмотреть нужное соединение.
Что делать с причиной
Дальше решение зависит от задачи, и его принимает человек:
- если строка нужна в отчете — менять внутреннее соединение на левое и обрабатывать пустое значение;
- если строки без цены или без ИНН действительно не нужны — это не ошибка, а условие; тогда стоит написать его явно и понятно;
- если проблема в типах — приводить тип в соединении;
- если в ИМЕЮЩИЕ — смотреть, какое условие отсекло группу.
Окно не переписывает запрос. Оно объясняет, где искать, и экономит ту самую механическую часть.
Когда окно не поможет
- Значение нужно выбрать во временной таблице, где оно еще есть. Если сразу выбрать итоговую таблицу, искать будет нечего.
- Если значение посчитано выражением или свернуто группировкой, выбирайте колонку, где оно хранится до свертки.
- Окно разбирает пакет запросов. Отдельный запрос без временных таблиц оно не превращает в цепочку — там искать нечего, причина видна в тексте.
Коротко
Пропавшая строка — это всегда «было на шаге N, нет на шаге N+1». Раньше этот шаг искали руками: двадцать таблиц, полчаса, вечер. Теперь достаточно выделить значение и открыть окно, которое показывает цепочку и называет соединение или условие.
Консоль, в которой это есть, — Инженерная консоль запросов.
Вступайте в нашу телеграмм-группу Инфостарт
Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.