Как скорректировать записи регистра сведений после расчета себестоимости в 1С:УПП?

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

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

Для решения проблемы разработчики и администраторы пытаются использовать универсальный инструмент — документ Корректировка записей регистров. Однако здесь возникает техническая преграда платформы «1С:Предприятие 8»: при записи документов в одну и ту же секунду (например, в конец месяца — 31.12.2023 23:59:59) документ корректировки упорно оказывается на оси времени раньше, чем расчет себестоимости. Из-за этого движения корректировки перекрываются расчетом себестоимости, а функции получения среза последнего в регистрах сведений не выдают ожидаемый результат.

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

Развеиваем мифы: как на самом деле сортируются документы в одной секунде

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

На самом деле хронологическая последовательность (понятие Момент времени) для документов разных видов, записанных на одну и ту же секунду, определяется на уровне СУБД следующими факторами:

  1. Внутренний идентификатор таблицы метаданных (ID таблицы в СУБД). Каждому объекту метаданных при создании конфигуратором присваивается внутренний номер. Этот номер зависит от порядка расположения документов в дереве конфигурации или от хронологии их создания разработчиками фирмы «1С». Изменить этот порядок штатными средствами в режиме «1С:Предприятие» невозможно. В структуре метаданных УПП таблица расчета себестоимости расположена таким образом, что её документы всегда позиционируются «позже» документов корректировки при одинаковом времени.
  2. Уникальный идентификатор ссылки (GUID). Если бы мы сортировали документы одного и того же типа, платформа выстраивала бы их по возрастанию значений их GUID. Для разнородных документов этот фактор не является определяющим, уступая приоритет ID таблицы метаданных.

Таким образом, просто поменять время документов в интерфейсе на одинаковое значение не поможет — Расчет себестоимости выпуска все равно окажется «выше» (позже) корректировки.

Почему это критично для регистров сведений?

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

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

Рассмотрим технические способы обхода этой проблемы.

Способ 1: Сдвиг времени документов (Самый простой практический путь)

Самое очевидное и безопасное решение — физически развести документы по разным секундам на шкале времени. Поскольку расчет себестоимости должен быть финальным аккордом месяца, логично сделать его предпоследним событием, а корректировку — последним.

Разберем этот процесс по шагам:

  1. Измените время проведения документа Расчет себестоимости выпуска ровно на одну секунду назад. Вместо стандартного времени 23:59:59 установите значение 23:59:58.
  2. Запишите и проведите документ (без пересчета, если платформа позволяет просто переписать движения, либо воспользуйтесь обработкой изменения времени без перепроведения).
  3. Документу Корректировка записей регистров установите время 23:59:59.

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

Способ 2: Перенос корректировки на первую секунду следующего месяца

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

Установите дату документа корректировки равной первому числу следующего месяца со временем 00:00:00. Для регистра сведений срез последнего на эту дату выдаст измененные значения.

Важное предостережение: учитывайте логику построения ваших внутренних отчетов. Если отчеты за прошлый месяц строятся жестко по границе 31.12.2023 23:59:59, то корректировка, датированная 1 января, в эти отчеты не попадет. Этот способ подходит только в том случае, если вам важно скорректировать данные «нарастающим итогом» для последующих периодов.

Способ 3: Использование объекта «Граница» в программном коде

Если вы разрабатываете собственную логику получения данных из скорректированного регистра сведений через запрос, вы можете управлять выборкой программно. Вместо передачи стандартной даты в параметры среза последнего передавайте объект Граница.

Проанализируем пример кода на языке 1С:


// Создаем объект Граница, включающий момент времени документа корректировки
ГраницаПериода = Новый Граница(СсылкаНаДокументКорректировки.МоментВремени(), ВидГраницы.Включая);

Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	НоменклатураЦеныСрезПоследнего.Цена КАК Цена
    |ИЗ
    |	РегистрСведений.НоменклатураЦены.СрезПоследнего(&Период, Номенклатура = &Номенклатура) КАК НоменклатураЦеныСрезПоследнего";

Запрос.УстановитьПараметр("Период", ГраницаПериода);
Запрос.УстановитьПараметр("Номенклатура", ВыбраннаяНоменклатура);

РезультатЗапроса = Запрос.Выполнить();

Использование ВидГраницы.Включая вместе с конкретным моментом времени документа корректировки позволяет принудительно заставить систему учитывать движения этого документа, даже если в эту же секунду были другие записи.

Методологические риски ручной корректировки регистров при РАУЗ

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

Если вы напрямую скорректируете регистры накопления (такие как Учет затрат, Учет затрат регл) с помощью документа Корректировка записей регистров, вы нарушите целостность данных системы. Это приведет к следующим последствиям:

Рекомендованные альтернативы ручной корректировке

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

Если период закрыт окончательно, самым безопасным решением будет проведение корректирующих записей в текущем (открытом) периоде с использованием вышеуказанных штатных документов исправления.

← На главную