Почему в запросах 1С пропадают цены и остатки: разбираем ошибки и исправляем данные

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

При разработке отчетов и обработок в среде 1С разработчики нередко сталкиваются с ситуациями, когда запросы возвращают неполные данные: не определяются цены на некоторые позиции, выпадают товары без характеристик или «плавают» остатки по складам (сегодня остаток нулевой, а завтра на ту же дату — положительный). Рассмотрим подробнее, почему возникают подобные аномалии, как правильно накладывать условия в виртуальных таблицах и как восстановить целостность итогов регистров.

1. Ошибка разыменования пустых ссылок в условиях

Одной из самых распространенных скрытых причин исчезновения строк из выборки является разыменование полей через точку при наличии пустых ссылок. Проанализируем типичный запрос к срезу последних регистра сведений:


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

Выясним причину, почему при таком условии пропадают все товары, у которых не ведется учет по характеристикам:

  1. Если для товара характеристика не указана, в поле ХарактеристикаНоменклатуры хранится пустая ссылка (или значение Неопределено / NULL).
  2. При обращении через точку к реквизиту ХарактеристикаНоменклатуры.ПометкаУдаления СУБД выполняет неявное левое соединение со справочником характеристик. Поскольку записи в справочнике нет, результатом выражения становится NULL.
  3. В трехзначной логике баз данных выражение НЕ (NULL) возвращает NULL (Неизвестно), что в секции ГДЕ приравнивается ко лжи. Строка отсекается.

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


ГДЕ
    НЕ ЦеныНоменклатурыСрезПоследних.Номенклатура.ПометкаУдаления
    И (ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры = ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка)
        ИЛИ НЕ ЦеныНоменклатурыСрезПоследних.ХарактеристикаНоменклатуры.ПометкаУдаления)

2. Правильная фильтрация в параметрах виртуальных таблиц

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


// ОШИБОЧНЫЙ КОД: платформа выдаст синтаксическую ошибку
ВЫБРАТЬ
    ТоварыВРозницеОстатки.Номенклатура КАК Номенклатура,
    ТоварыВРозницеОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыВРознице.Остатки(
        &Дата,
        КоличествоОстаток > 0
        И НЕ Номенклатура.ПометкаУдаления) КАК ТоварыВРозницеОстатки

Важное правило платформы: второй параметр виртуальной таблицы Остатки(&Период, &Условие) предназначен только для фильтрации по измерениям регистра и их реквизитам. Ресурсы (например, КоличествоОстаток) рассчитываются на лету и не могут быть ограничены внутри параметров виртуальной таблицы.

Разберем, как написать запрос корректно. Условия на измерения выносим в параметры виртуальной таблицы, а фильтр по ресурсу — в секцию ГДЕ:


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

Для оптимизации быстродействия высоконагруженных баз рекомендуется избегать разыменования через точку в параметрах виртуальной таблицы (таких как НЕ Номенклатура.ПометкаУдаления), предварительно помещая список нужных ссылок во временную таблицу и фильтруя через условие Номенклатура В (ВЫБРАТЬ Ссылка ИЗ ВТ_Товары).

3. Особенности передачи даты и границы момента времени

Если в параметрах запроса передается просто дата без времени (например, 01.05.2026 00:00:00), то виртуальные таблицы рассчитывают срез или остатки на самое начало этой секунды, исключая любые движения, проведенные в этот день.

Для корректного получения данных на дату применяем следующие правила:

  1. Если требуется получить данные на конец суток, в коде встроенного языка явно используем функцию: Запрос.УстановитьПараметр("Дата", КонецДня(ВыбДата));
  2. Если срез берется на момент проведения документа, передаем объект МоментВремени или объект Граница с видом ВидГраницы.Включая.

4. Устранение «плавающих» остатков: пересчет и слияние итогов

Ситуация, когда остатки по товару то появляются, то исчезают без видимых причин (на одну и ту же дату при неизменных движениях), свидетельствует о рассинхронизации таблиц итогов регистра накопления. Чаще всего это происходит при регулярном проведении документов «задним числом» или параллельной записи движений при включенном режиме разделения итогов.

Разберем по шагам, как восстановить корректный расчет остатков:

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

Комплексный подход — корректное составление условий в запросах с контролем пустых ссылок и регулярное регламентное обслуживание итогов — гарантирует стабильное и точное получение цен и остатков в любых отчетах 1С.

← На главную