← вся теориятеория к собесу · Оптимизация запросов 1С

Остатки, Обороты и ОстаткиИОбороты в 1С

разбор писал Даниил, автор Сеньорчика

Зачем это спрашивают

У регистра остатков три виртуальные таблицы: Остатки на дату, Обороты за период и ОстаткиИОбороты сразу всё вместе. На собесе спрашивают, какую взять для ведомости, что делает периодичность и почему в отчёте не видно дней без движений. Результат ниже сверен на PostgreSQL.

// Так спрашивают: «Чем Остатки отличается от ОстаткиИОбороты?» «Как получить остаток до и после каждого документа?» «Почему в отчёте по дням нет дней без движений?» «Как посчитать остатки на каждый день года?»

Три таблицы

Остатки() без даты берёт текущие итоги и работает быстрее всего. Остаток на дату документа берут на МоментВремени(): тогда документы той же секунды учитываются в правильном порядке, а на голую дату порядок внутри секунды теряется.

Периодичность

Третий параметр ОстаткиИОбороты задаёт периодичность: день, месяц, регистратор, запись. С периодичностью «день» таблица отдаёт строку на каждый день с движениями, с начальным и конечным остатком этого дня. Молоко с 5 по 7 октября, на начало 10 штук:

Строки за 6 октября нет: движений в этот день не было. Так работает метод дополнения по умолчанию «Движения». ДвиженияИГраницыПериода добавит строки на границы периода, а остатки на каждый день без движений собирают соединением с таблицей дат.

Периодичность «Регистратор» даёт строку на каждый документ с остатком до и после него. Это готовая ведомость движения товара по документам, без отдельных запросов.

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

Вместо цикла по дням

365 запросов к остаткам заменяет одна ОстаткиИОбороты с периодичностью «день». Дни без движений берут остаток предыдущего дня с движениями: его даёт соединение с таблицей дат и выбор последнего конечного остатка не позже даты.

Проверка остатков при проведении на момент документа пропускает минус у последующих расходов: если документ проводят задним числом, на его момент товара хватает, а позже расход уже ушёл в минус. Для контроля берут итоговые остатки.

Как отвечать: «Нужна ведомость по складу за месяц: начальный остаток, приход, расход, конечный. Какую таблицу возьмёшь?»

ОстаткиИОбороты с периодом месяца, она отдаёт все четыре показателя за один проход. Склад ставлю в условие параметра. Если нужна разбивка по дням, ставлю периодичность «день», но помню, что дни без движений туда не попадут, и при необходимости добавляю их соединением с таблицей дат. Если нужна разбивка по документам, беру периодичность «Регистратор».

Кандидат выбирает таблицу под задачу, ставит отбор в параметр и заранее знает про пропущенные дни. Регистратор как периодичность показывает опыт с ведомостями.

На чём валят

  • −Строят остатки на каждый из 365 дней циклом. Одна ОстаткиИОбороты по дням считает всё за проход.
  • −Ждут строки на каждый день от периодичности «день». Дни без движений не появятся. Нужны ДвиженияИГраницыПериода и таблица дат.
  • −Проверяют остатки на момент документа при проведении задним числом. Минус у последующих расходов пропускается. Контроль по итоговым остаткам.
  • −Берут остаток на голую дату документа. Порядок документов внутри секунды теряется. Берут МоментВремени().

Проверь себя

Пять вопросов из банка по этой подтеме. Всего их 12, остальные разбираются в тренажёре.

  1. #oc_vt_balances1 / 5
    Какие параметры у ОстаткиИОбороты?
    A)Начало, Конец и Регистратор
    B)Только Период и Условие, как у таблицы Остатки
    C)Начало, Конец, Периодичность, МетодДополнения, Условие
    D)Период и список измерений
    показать ответ и разбор
    +C)Начало, Конец, Периодичность, МетодДополнения, Условие

    // разбор: ОстаткиИОбороты принимает начало и конец периода, периодичность разбиения (Запись, Регистратор, День, Месяц и другие), метод дополнения и условие на измерения. Период и Условие — параметры таблицы Остатки. Регистратор появляется как поле при периодичности Регистратор.

  2. #oc_vt_balances2 / 5
    Нужен отчёт по дням: остаток на начало, приход, расход, остаток на конец. Какая таблица?
    A)Остатки на каждый день в цикле
    B)ОстаткиИОбороты с периодичностью «День»
    C)Обороты без периодичности
    D)Таблица движений и расчёт в коде
    показать ответ и разбор
    +B)`ОстаткиИОбороты` с периодичностью «День»

    // разбор: ОстаткиИОбороты с периодичностью День за один запрос даёт начальный остаток, приход, расход и конечный остаток в разрезе дней. Остатки в цикле — 30 запросов вместо одного, Обороты без периодичности — один итог за период без остатков.

  3. #oc_vt_balances3 / 5
    Отчёт по дням через ОстаткиИОбороты(..., День, Движения): в днях без движений строк нет. Как получить строку на каждый день?
    A)ДвиженияИГраницыПериода и календарь
    B)Периодичность «Запись» вместо «День»
    C)Убрать условие из параметров таблицы
    D)Периодичность «Месяц» вместо «День»
    показать ответ и разбор
    +A)ДвиженияИГраницыПериода и календарь

    // разбор: Метод «Движения» даёт строки только в периодах с движениями. «ДвиженияИГраницыПериода» добавляет строки на границах периода отчёта. Строку на каждый день без движений получают соединением с таблицей дней (календарём) и протягиванием остатка, СКД умеет это дополнением периодов.

  4. #oc_vt_balances4 / 5
    Чем Остатки(&Дата) отличается от Остатки() без параметра?
    A)На последний момент учёта
    B)Без параметра — остатки на начало текущего дня
    C)Без параметра — ошибка выполнения
    D)Различий нет
    показать ответ и разбор
    +A)На последний момент учёта

    // разбор: Без даты таблица отдаёт остатки на последний момент учёта и берёт их из текущих итогов, это быстро. С датой платформа считает остаток на этот момент от ближайшего сохранённого итога и движений. Для «сколько сейчас» дату не передают.

  5. #oc_vt_balances5 / 5
    Остатки на начало периода и обороты за период по товару. Можно ли взять одну таблицу?
    A)Нет: нужен расчёт в коде по движениям
    B)Нет, нужны два запроса
    C)Да: Обороты с полем НачальныйОстаток
    D)Да, таблица ОстаткиИОбороты
    показать ответ и разбор
    +D)Да, таблица ОстаткиИОбороты

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

дальше

Теорию прочитал. Навык ставится повторением

В Сеньорчике эта подтема идёт в ежедневных сессиях: движок возвращает её, пока ответы не станут уверенными, и ведёт прогресс отдельно по каждой подтеме. Теория внутри тоже бесплатна, бесплатная часть практики — одна сессия дня в сутки.