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