Как получить остатки регистра накопления на определенную дату и исправить отрицательные значения

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

В практике разработчика 1С часто возникает задача анализа и корректировки данных в регистрах накопления. Особенно остро этот вопрос стоит при работе со сложными системами, такими как РАУЗ (расширенная аналитика учета затрат), где данные хранятся в регистре УчетЗатратРегл. В этой статье мы разберем, как правильно извлечь остатки на конкретный момент времени, какие инструменты платформы 1С для этого предназначены и на что стоит обратить внимание при массовой корректировке записей.

Понимание работы виртуальных таблиц остатков

Рассмотрим ситуацию: нам необходимо получить список отрицательных остатков за конкретный месяц (например, ноябрь 2018 года), чтобы в дальнейшем их скорректировать. Обычный запрос к физической таблице регистра не даст нам оперативного среза, поэтому мы используем виртуальную таблицу Остатки.

Важно понимать, что виртуальная таблица РегистрНакопления.УчетЗатратРегл.Остатки — это не просто хранилище, а механизм, который вычисляет итоги на указанную дату. Чтобы получить данные не на текущий момент, а на конец ноября, необходимо использовать параметры этой таблицы.

Проанализируем базовый синтаксис обращения к виртуальной таблице:


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

Здесь &Период — это первый параметр виртуальной таблицы. Если его не заполнить, система вернет актуальные остатки на момент последнего движения. Если же передать туда дату, мы получим срез на начало этой даты.

Тонкости работы с параметром Период и объектом Граница

Разберем важный нюанс. Если мы передадим в параметр просто дату 30.11.2018 23:59:59, то запрос может не включить движения, совершенные в последнюю секунду месяца. В 1С для решения этой проблемы используется объект Граница.

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


КонецПериода = КонецДня(Дата("20181130"));
ПараметрПериод = Новый Граница(КонецПериода, ВидГраницы.Включая);
Запрос.УстановитьПараметр("Период", ПараметрПериод);

Использование ВидГраницы.Включая позволяет получить остатки после всех документов, проведенных в указанную секунду. Это критически важно при подготовке данных для документа КорректировкаЗаписейРегистров.

Выбор между таблицами Остатки и ОстаткиИОбороты

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

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


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

Внимание: Если вы попытаетесь использовать поле Регистратор в условиях виртуальной таблицы (во втором параметре), система выдаст ошибку. Поле Регистратор доступно только в результатах выборки при установленной периодичности Регистратор.

Специфика регистра УчетЗатратРегл (РАУЗ)

Проанализируем структуру регистра УчетЗатратРегл. В отличие от простых товарных регистров, здесь используются так называемые «ключи аналитики». Вместо прямых ссылок на Номенклатура или Склад, мы видим поля:

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

Кроме того, в РАУЗ отрицательные остатки часто являются следствием того, что регламентный документ Расчет себестоимости еще не был проведен или был проведен с ошибками. Прежде чем приступать к ручной корректировке, рекомендуется убедиться, что все этапы закрытия месяца выполнены корректно.

Практические рекомендации по исправлению остатков

Если вы решили использовать документ КорректировкаЗаписейРегистров для массового исправления минусов, придерживайтесь следующего алгоритма:

  1. Сформируйте запрос к виртуальной таблице остатков на нужную дату (используя Граница), отобрав только записи с КоличествоОстаток < 0.
  2. Обходите результат запроса в цикле и формируйте новые строки в движениях документа корректировки.
  3. Заполняйте все ресурсы. В регистре УчетЗатратРегл важно корректировать не только поле Количество, но и стоимостные показатели (Стоимость, СтоимостьНУ и др.). Если убрать только количественный минус, останется «висеть» пустая стоимость, что приведет к ошибкам в следующих периодах.
  4. Используйте правильный вид движения. Для устранения отрицательного остатка необходимо сделать движение Приход на сумму модуля отрицательного остатка.

Рассмотрим пример заполнения документа в коде:


НоваяСтрока = Движения.УчетЗатратРегл.ДобавитьПриход();
НоваяСтрока.Период = ДатаКорректировки;
НоваяСтрока.АналитикаВидаУчета = Выборка.АналитикаВидаУчета;
НоваяСтрока.АналитикаУчетаЗатрат = Выборка.АналитикаУчетаЗатрат;
НоваяСтрока.Количество = -Выборка.КоличествоОстаток; // Переводим минус в плюс
// Обязательно заполняем стоимостные показатели, если они есть в остатках

Помните, что ручные правки в РАУЗ — это крайняя мера. Проанализируйте ситуацию: возможно, минус возник из-за пересортицы по аналитикам (например, товар пришел на одну организацию, а списан с другой), и правильнее будет исправить первичный документ, а не создавать корректировку.

← На главную