При работе с регистрами накопления в системе «1С:Предприятие 8» начинающие разработчики часто сталкиваются с особенностью хранения данных: в физических таблицах значения ресурсов (например, Количество или Сумма) всегда хранятся как положительные числа. Направление движения (увеличение или уменьшение остатка) определяется специальным полем ВидДвижения. Однако для построения отчетов часто требуется, чтобы приход отображался с плюсом, а расход — с минусом. В этой статье мы разберем несколько эффективных способов решения этой задачи, проанализируем нюансы работы с виртуальными таблицами и выясним, как не потерять при этом важные данные, такие как регистратор движения.
Рассмотрим ситуацию, когда нам необходимо получить данные напрямую из основной (физической) таблицы регистра. Этот метод наиболее нагляден, так как мы работаем с «сырыми» данными. Если нам нужно, чтобы расход вычитался из общего итога, мы можем применить условную конструкцию языка запросов.
Проанализируем пример кода, который позволяет преобразовать положительные значения расхода в отрицательные:
ВЫБОР
КОГДА ТоварыНаСкладах.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
ТОГДА ТоварыНаСкладах.Количество
ИНАЧЕ -ТоварыНаСкладах.Количество
КОНЕЦ КАК КоличествоСоЗнаком
В данном случае мы проверяем значение системного перечисления ВидДвиженияНакопления. Если запись является приходом, мы оставляем число как есть. В противном случае (для расхода) мы умножаем его на -1. Это решение идеально подходит, если вам не требуются автоматические итоги по остаткам, а нужно лишь вывести детальный список операций.
Работа с физической таблицей не всегда оптимальна с точки зрения производительности. Платформа 1С предоставляет мощный механизм виртуальных таблиц. Разберем, как работает таблица Обороты. Платформа самостоятельно агрегирует данные и предоставляет нам уже готовые поля, которые значительно упрощают разработку:
Если мы выберем поле КоличествоОборот, система сама подставит минус для расходных операций. Это избавляет нас от написания лишних условий ВЫБОР КОГДА и снижает риск ошибок при расчетах.
Часто при переходе на виртуальные таблицы разработчики замечают, что поле Регистратор (документ, сделавший запись) становится недоступным в конструкторе запроса. Это происходит потому, что виртуальная таблица по умолчанию группирует данные за весь период. Чтобы увидеть конкретные документы, нам нужно изменить настройки периодичности.
Выясним, как правильно настроить параметры виртуальной таблицы:
В параметрах таблицы (в скобках после имени таблицы в тексте запроса) необходимо указать периодичность. Если мы хотим видеть каждое отдельное движение, установим значение Регистратор. Пример вызова такой таблицы:
РегистрНакопления.ТоварыНаСкладах.Обороты(&НачалоПериода, &КонецПериода, Регистратор, )
Важно помнить: использование периодичности Регистратор фактически отключает использование заранее рассчитанных итогов, и запрос по скорости будет сопоставим с запросом к физической таблице. Используйте это только тогда, когда детализация до документа действительно необходима.
Если ваша задача шире, и вам нужно не только разделить движения, но и показать начальные и конечные остатки в рамках одного отчета, воспользуемся таблицей ОстаткиИОбороты. Рассмотрим подробнее, какие поля она предлагает:
КоличествоНачальныйОстаток — сколько товара было на начало периода.КоличествоПриход — сколько пришло за период (всегда положительное).КоличествоРасход — сколько ушло за период (всегда положительное).КоличествоКонечныйОстаток — итог на конец периода.Эта таблица является наиболее универсальной для построения материальных ведомостей и отчетов по движению денежных средств. Она гарантирует математическую целостность: НачальныйОстаток + Приход - Расход = КонечныйОстаток.
Рассмотрим ситуацию, когда в системе оформляется корректировка или сторнирование документа. В 1С это может быть сделано двумя способами: либо обратным движением (например, приходом вместо расхода), либо тем же видом движения, но с отрицательным числом.
Если вы используете ручной расчет знака через ВЫБОР КОГДА (как в первом способе), отрицательный приход превратится в положительный расход, что может исказить логику отчета. Виртуальные таблицы 1С (Обороты, ОстаткиИОбороты) обрабатывают такие случаи корректно на уровне платформы, правильно учитывая знак числа независимо от вида движения. Именно поэтому использование виртуальных таблиц считается более надежным «best practice» в разработке на 1С.
Проанализируем, как сделать наш запрос максимально быстрым. При работе с регистрами накопления критически важно накладывать отборы правильно:
ГДЕ для фильтрации по измерениям (Номенклатура, Склад). Всегда передавайте эти фильтры в Параметры виртуальной таблицы. Это позволит СУБД отсечь ненужные записи на самом раннем этапе.Пример эффективного отбора в виртуальной таблице:
ВЫБРАТЬ
Т.Номенклатура,
Т.КоличествоОборот
ИЗ
РегистрНакопления.ТоварыНаСкладах.Обороты(,, Авто, Номенклатура = &ВыбНоменклатура) КАК Т
Таким образом, мы рассмотрели все основные сценарии разграничения движений. Для простых списков документов подойдет физическая таблица с условием ВЫБОР, а для серьезных аналитических отчетов лучше использовать виртуальные таблицы с правильно настроенной периодичностью и параметрами отбора.