В процессе эксплуатации 1С:ERP Управление предприятием специалисты часто сталкиваются с ситуациями, когда в прошлых периодах (иногда даже несколько лет назад) были допущены ошибки в партионном учете. Типичный пример: в регистре СебестоимостьТоваров по разделам Товары на складах или Производственные затраты не заполнилась Партия. Рассмотрим, почему попытки исправить это стандартным документом Корректировка регистров обречены на провал, и разберем работающие методики восстановления данных.
Представим ситуацию: материалы были переданы в производство в 2018 году, а выпуск продукции произошел в 2019 году. При расчете себестоимости в текущем периоде система обнаруживает, что на остатках в незавершенном производстве (НЗП) висит количество без стоимости, так как в исходном документе передачи не была указана партия. Попытка создать документ Корректировка регистров, чтобы «перебросить» остатки с пустой партии на правильную, обычно не дает результата. Проанализируем причины этого явления:
КлючиАналитикиУчетаНоменклатуры, КлючиАналитикиУчетаПартий и КлючиАналитикиЗатрат. При ручном заполнении корректировки крайне сложно обеспечить полное соответствие всех невидимых глазу реквизитов тем, что ожидает алгоритм расчета.ДокументДвижения в регистре СебестоимостьТоваров играет ключевую роль. Если система видит расход, она пытается сопоставить его с приходом по конкретному первичному документу. Документ Корректировка регистров для системы является «пустышкой», не имеющей хозяйственного смысла.Чтобы понять, где именно «теряется» наша ручная правка, посмотрим на внутреннюю структуру модуля ПроведениеРасчетаСебестоимости. Процедура расчета состоит из множества этапов, каждый из которых отвечает за свой участок данных. Рассмотрим сокращенный перечень основных этапов:
// Этап 4: Распределение номенклатуры на производство
РаспределениеНоменклатурыНаПроизводство(ПараметрыРасчета);
// Этап 7: Распределение материалов между остатком НЗП и выпуском
РаспределениеМатериаловМеждуОстаткомНЗПиВыходнымиИзделиями(ПараметрыРасчета);
// Этап 8: Заполнение партий в регистре Себестоимость товаров
ЗаполнениеПартийВРегистреСебестоимостьТоваров(ПараметрыРасчета);
// Этап 9: Основной расчет фактической себестоимости (решение системы уравнений)
РасчетСебестоимостиТоваров(ПараметрыРасчета, СтрокаСхемыРасчета, Истина);
Как мы видим, система сначала распределяет количественные показатели, затем пытается восстановить партионные цепочки и только потом приступает к расчету стоимости. Если на этапе 8 система не сможет связать ваш ручной «приход» в корректировке с реальным «расходом» производства из-за отсутствия правильного ДокументаДвижения или АналитикиУчетаПартий, стоимость на этапе 9 будет равна нулю.
Поскольку Корректировка регистров не позволяет полноценно эмулировать движения, наиболее эффективным (хотя и требующим осторожности) методом является программное исправление записей в регистре накопления непосредственно у исходного документа-регистратора. Рассмотрим алгоритм действий:
АналитикаУчетаПартий и Партия. Для этого можно посмотреть аналогичные исправные документы того же периода.Пример кода для программной корректировки записей регистра СебестоимостьТоваров:
Процедура ИсправитьДвиженияДокумента(ДокументСсылка, НужнаяПартия, НужныйКлючПартии)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ * ИЗ РегистрНакопления.СебестоимостьТоваров
ГДЕ Регистратор = &Регистратор";
Запрос.УстановитьПараметр("Регистратор", ДокументСсылка);
Выборка = Запрос.Выполнить().Выбрать();
Набор = РегистрыНакопления.СебестоимостьТоваров.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ДокументСсылка);
Набор.Прочитать();
Для Каждого Запись Из Набор Цикл
// Проверяем, что это нужная нам строка (например, по номенклатуре)
Если Запись.Раздел = Перечисления.РазделыУчетаСебестоимостиТоваров.ПроизводственныеЗатраты
И НЕ ЗначениеЗаполнено(Запись.АналитикаУчетаПартий) Тогда
Запись.АналитикаУчетаПартий = НужныйКлючПартии;
Запись.Партия = НужнаяПартия;
// Важно: в ERP 2.4/2.5 также нужно проверять реквизит ДокументДвижения
Если НЕ ЗначениеЗаполнено(Запись.ДокументДвижения) Тогда
Запись.ДокументДвижения = НужнаяПартия;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// ОбменДанными.Загрузка = Истина позволяет обойти проверки при записи
Набор.ОбменДанными.Загрузка = Истина;
Набор.Записать();
КонецПроцедуры
Проанализируем, почему этот «грязный» метод оказывается эффективнее официальной корректировки. Когда мы правим движения внутри исходного документа Передача материалов в производство:
Регистратор, который система ожидает увидеть в цепочке затрат.ДокументДвижения, который является ключевым для сопоставления приходов и расходов в алгоритмах ФИФО.Разберем дополнительные нюансы, которые помогут избежать ошибок при восстановлении учета:
КлючАналитикиУчетаПартий соответствует выбранной партии. Если вы просто подставите ссылку на документ в поле Партия, но оставите старый (пустой) ключ аналитики, расчет может проигнорировать запись.МатериалыИРаботыВПроизводстве. Часто требуется синхронная правка обоих регистров для корректного закрытия месяца.Резюмируем: Корректировка регистра СебестоимостьТоваров через стандартный документ Корректировка регистров для исправления старых ошибок партионного учета практически нереальна. Система 1С:ERP требует жесткой связки первичного регистратора и аналитики ключей. Единственным надежным способом остается программное исправление записей регистра непосредственно у исходных документов в закрытом периоде с последующим выполнением регламентных операций в текущем месяце.