1. С чем пришлось столкнуться: в системе erp отключен партионный учет, метод оценки по средней, учет по видам запаса отключен. Казалось бы, что может быть еще проще, но себестоимость упорно не закрывалась процедурой закрытия месяца.
А как мы знаем: по окончании работы процедуры закрытия месяца регистр Себестоимость товаров не должен иметь суммовых остатков на конец отчетного периода без количества или отрицательных суммовых остатков с количеством.
Наличие или же отсутствие таковых, можно отследить в том же универсальном отчете с настройкой:
Одной из причин не закрытия себестоимости кроется в накопленных данных измерения регистра Себестоимость товаров - «Вид Запасов» ( «НСИ и администрирование – Финансовый результат и контролинг – Учет Товара – Обособленный учет себестоимости по видам запасов»), а именно в записях данного измерения сделанных первичными документами. Собственно мне думается идентично можно рассуждать и в отношении измерения Аналитика учета номенклатуры и его содержимым по сериям и характеристикам, если таковая детализация включена в системе.
Практика показывает, что в процессе работы, по той или иной причине предприятие может отключить данный учет или наоборот включить, что приведет к тому, что часть документов будет иметь заполненное измерение Вид запасов в записях регистра, а часть нет.
Естественно, что решением данной проблемы – это пере проведение документов за весь период.
Но есть большое НО: в новой системе erp, при простом пере проведении документа система не обновляет его движения. Для обновления движений документа необходимо его с начало отменить, а потом провести. (если мы что то глобально поменяли в шапке документа или открыли «Виды запасов», через меню документа Все действия – Открыть виды запасов, и перенесли в документ, то обновление записей в регистрах произойдет, но это как вы понимаете при индивидуальной работе с конкретным документом).
Если у вас большой документооборот за месяц, то естественным выходом в данной ситуации, будет получение именно тех документов, которые образовали «проблемные» движения.
Под «проблемными» движениями будем понимать те, у которых «Вид запасов» не заполнен, если учет по виду запасов в процессе работы был включен, и те, у которых «Вид запасов» заполнен, если учет по видам запасов отключен.
Если учет по виду запасов включен, то увидеть и проанализировать корректность оборотов вы можете через тот же универсальный отчет, настроив его по регистру Себестоимость товаров – остатки и обороты, или же через типовой отчет 1с с одноименным названием.
Если же у вас учет по виду запасов отключен, то здесь сложнее: что бы найти источник проблемы надо как минимум получить обороты в разрезе видов запаса по условию что он заполнен, Но движения в разрезе видов запасов мы не увидим ни в универсальном, ни в типовом , ни на скд отчете написанном своем, ни в форме списка регистра Себестоимость товаров – система определяет, что учет по видам запаса отключен и просто суммирует строки по разным видам запасов по каждой аналитике учета номенклатуры в отчетах, отключает данное поле в форме настроек полей отчетов и форме списка регистра, вообще везде, где оно могло быть доступно. В итоге в отчетах мы, например можем в оборотах увидеть внезапный скачок себестоимости в оборотах за период, не смотря на то что прихода не было и на начало периода стоимостной показатель совсем другой.
Таким образом, в этом конкретном случае, пробиться к записям регистра в разрезе видов запаса можно только написав свою обработку с табличной частью, в которую выгружать обороты за период с регистраторами и по условию, что вид запаса заполнен. Полученные регистраторы надо отменить и провести, для чего можно так же написать кнопочку, которая это сделает за вас. При этом надо помнить, что такие документы например как «Выпуск продукции» и «Списание затрат на выпуск», должны быть отменены и проведены последовательно, то есть с начало отмена выпуска, а потом ему подчиненных списаний на выпуск, и в той же последовательности проведение. А далее снова закрываем месяц, предварительно его «откатив».
2. Да: Откат РС значительно облегчает вашу жизнь. С возможностью отката вам просто не надо при не удачном закрытии пере проводить документы или часть из них. Особенно это важно когда большой документооборот и особенно, если помнить что сброс движений РС или собственно обновление записей регистров происходит только при отмене и проведении документов, а как практика показала пере закрытие РС, поверх уже сделанных записей дает ошибку уже на этапе распределения постатейных расходов на себестоимость продукции. В общем из моей практики: чистота расчета будет все таки обеспечена именно при зачищенных движения сделанных РС.
Итак. Для корректного расчета себестоимости, если вы уже производили фактический расчет, необходимо его откатить.
Под откатом будем понимать зачистку тех движений, которые сделал блок расчет себестоимости в обработке закрытия месяца. А технология работы расчета в erp интересная: блок расчета себестоимости обслуживает 12 регистров, и произведенные расчеты «дописывает» к имеющимся уже записям первичных документов. Такие записи имеют признак «расчет себестоимости» = Истина.
Таким образом, количественные показатели образуют первичные документы, а суммовые рассчитывает и дописывает в записи документов, блок расчета себестоимости (кроме ну например поступления товаров и услуг).
Сам документ расчет себестоимости имеет записи по данным регистрам, но уже дополнительные / корректировочные, для регистра сведений «стоимость товаров» и накопления «Финансовый результат» документ РС является единственным регистратором.
Регистр сведений «Стоимость товаров» - это базис, от которого потом будут рассчитывать суммовые обороты по обслуживаемым регистрам, в том числе и регистре «Себестоимость товаров» и замыкающем расчет регистре «Выручка и себестоимость продаж».
На первом этапе Стоимость товаров образуется по формуле:
(Стоимость начальный остаток + Стоимость прихода за период) / (количество нач. остаток + количество прихода за период).
Перемещения в данную формулу не входят, входят именно поступления, оприходования и тд.
Далее на полученное значение распределяются расходы по статьям с направлением на стоимость товара (например ТЗР).
Далее расчет себестоимости делает распределение партий в производстве: работает с регистрами Партии Производственных Затрат и Партии Незавершенного Производства, определяя по какой передаче материалов в производство списывать материалы на тот или иной выпуск, а так же : работает с регистром Прочие Расходы Незавершенного Производства, рассчитывая суммовые показатели расходов на себестоимость продукции и их доли вхождения в тот или иной выпуск (идет распределение постатейных затрат на себестоимость продукции). К стати наличие записей в регистре сведений «задания к расчету себестоимости» на начало расчета, показывает системе, что распределение по партиям в производстве, или распределение по партиям организаций ,если у вас партионный учет, не производилось, как следствие РС будет приводить таковые к актуальному состоянию (идентично наличие записей в регистре Задания к распределению расчетов с клиентами и Задания к распределению расчетов с поставщиками, дает системе сигнал при процедуре закрытия месяца, что Формирование расчетов с партнерами и переоценка расчетов – пункт не актаульны и требует пересчета).
Актуальность партий: не смотря на то, включен у вас партионный учет или нет, и не смотря на то, что система имеет ряд чисто партионных регистров, например тот же «партии нзп (реквизит Документ источник и Документ Выпуска)», 1С ввела ноу-хау: рефакторинг партионного учета – оценка производится в целом за месяц, именно поэтому в системе теперь не надо соблюдать последовательность ввода документов! Главное что бы на начало и конец отчетного периода не было отрицательных сальдо по регистрам, например «Товары организаций», «Себестоимость товаров»....
Далее. Полученную в итоге стоимость РС записывает в регистр сведений, и на базе нее рассчитывает суммовые показатели во всех остальных обслуживаемых регистрах. Описала упрощенно конечно, но тем не менее..
Стоимость в регистре сведений, если у вас метод оценки по средней, должна быть одинаковой по тем складам и подразделениям, которые общаются между собой: то есть перемещение с одного склада не может идти по одной цене и приходить по другой на склад получатель, или например передача материала в производство со склада не может приходить в производство по отличной цене от складской. Обращайте на это внимание в регистре сведений Стоимость товаров!. Расхождения могут быть в копеечках стоимости товаров, но РС все скорректирует по окончании расчетов.
Обслуживаемые регистры блоком РС:
- Движения Номенклатура Номенклатура
- Движения Номенклатура Доходы Расходы
- Прочие Расходы (кэш остатков)
- Прочие Доходы (кэш остатков)
- Себестоимость Товаров (кэш оборотов) (кэш остатков)
- Прочие Активы Пассивы
- Прочие Расходы Незавершенного Производства
- Закупки
- Финансовые Результаты
- Выручка И Себестоимость Продаж (кэш оборотов)
//во всех этих регистрах есть реквизит РасчетСебестоимости
- Стоимость Товаров
//регистратором является только документ Расчета себестоимости
- Партии Производственных Затрат
//регистраторы Передача материалов в производство, Списание затрат на выпуск
- Партии незавершенного производства
//регистраторы Списание затрат на выпуск, Выпуск продукции
//несмотря на то что записи данных регистров крепятся к первичным документам, расчет их делает блок РС в закрытии месяца .
Увидеть данный список вы можете в протоколах расчета себестоимости, записанные в журнал регистрации.
Вернемся к откату РС: либо напищите свою процедуру, которая произведет очистку записей сделанных РС в регистрах, либо в общем модуле РС включите нужный параметр в Функции ИнициализироватьПараметрыРасчета. Приведу параметры из данной процедуры, которые мне были интересны и я их задействовала (скопировала прямо из общего модуля с комментами 1с):
// 2. Данное свойство позволяет очистить все старые расчетные движения перед новым расчетом - эмулирует первый расчет периода.
// Следует использовать только для отладки, т.к. очистка может выполняться достаточно долго.
ПараметрыРасчета.Отладка.Вставить("ОчищатьСтарыеДвижения", Ложь);
- это и есть откат РС если установить значение параметра Истина. Я же оставляю в значении ложь так как написала свой Откат РС.
// Многопоточная запись (если запущено не в файловой ИБ и не из регламентного задания)
// Стабильность многопоточной записи на разном железе зависит от сочетания нескольких факторов:
// - количества активных фоновых заданий (чем больше заданий, тем больше надо памяти для сервера Предприятия)
// - количества движений, записываемых одним заданием (чем больше движений - тем больше памяти надо этому заданию)
// - одновременности выполнения записи одного регистра разными заданиями (чем больше заданий пишет один регистр,
//тем больше вероятность возникновения ошибок, например, "Lock request time out period exceeded")
ПараметрыРасчета.Вставить("МаксимальноеКоличествоФЗ",
?(ОбщегоНазначения.ИнформационнаяБазаФайловая()
ИЛИ ПредварительныйРасчет, 1, 5)); // максимальное количество одновременно выполняемых заданий записи
В моем случае система обрушалась с ошибкой форматного потока, поэтому я привела данный параметр к значению файловой базы (то есть вместо 5 поставила 1). Что еще мне это дало – я всегда работаю во время закрытия с журналом регистрации и при отключенном многопоточном режиме, можно увидеть последовательность закрытия и расчета регистров, а так же увидеть ошибки и во время остановить закрытие.
// 4. Для анализа решения СЛУ можно сохранить таблицы, используемые при решении СЛУ, в виде файлов mxl в указанный каталог.
// Если имя каталога не заполнено, сохранение таблиц не выполняется.
//ПараметрыРасчета.Отладка.Вставить("КаталогДляСохраненияДанныхСЛУ", ""); //1С код
ПараметрыРасчета.Отладка.Вставить("КаталогДляСохраненияДанныхСЛУ", "C:\РешениеСЛУ"); //код мной подправленный
P/S:
1. Как возникло понятие «многопоточность фоновых заданий»:
Предстояло закрытие 13 месяцев и как было отмечено выше, база обладала большим документооборотом: на одно только отмена / проведение документов перемещений за один месяц уходило двое суток. Так вот, при закрытии месяца система почему то падала с ошибкой «Ошибка формата потока», что приводило меня в шок. Тестирование и исправление информационной базы ( все пункты входящие в него были сделаны) не давали результатов. Тогда начинаю сильно дружить с журналом регистрации: отслеживаю на каком именно этапе идет обрушение системы. Выяснилось: на этапе работы блока расчета себестоимости, а именно при записях рассчитанных данных РС в обслуживаемые регистры. При этом в журнале все «скакало и прыгало» - то есть было видно что отработка идет параллельно нескольких регистров и собственно понять что за чем и в какой последовательности считается / записывается не представлялось возможным, как не представлялось возможным понять на каком регистре систему выбивает (на данный этапе вопрос мучал только – таблица какого регистра в sql «покалечена»? ). Тогда начинаю сильно дружить с общим модулем Расчета Себестоимости, буквально разбирая его на косточки. Вот в этом то процессе (и спасибо 1с за щедрые комменты в модуле) и был найден параметр РС, который определял многопоточность фоновых заданий. Что это значит – это значит мы говорим системе, что она должна считать и записывать сразу несколько обслуживаемых регистров или все таки по одному последовательно. Поразмыслив и оперевшись на высказывание «тише едешь – дальше будешь» привожу данный параметр к значению файловой базы – то есть в место значения 5 ставим 1. Собственно сделано это было с целью отследить на каком регистре система рушиться, а в итоге отработка блока РС прошла полностью без обрушений! При этом был получен еще один плюс: теперь в журнале регистрации можно было последовательно увидеть что и за чем считается и пишется расчетом и как практика показала это потом очень пригодилось.
2. Как вышла на ошибку в данных по видам запасов.
Как уже было сказано выше, по закрытии месяца имелись ошибки по расчету себестоимости: наличие суммовых остатков по нулевому количеству. Беру одну из позиций (работу ведем с универсальным отчетом по регистру себестоимость товаров с разворотом по регистратору), такую в которой у меня был остаток на начало месяца по количеству и сумме и весь этот количественный остаток со склада передавался в производство (просто удачный случай для отслеживания получения чистой суммы). По смыслу уйти в производство данная позиция должна была с суммовым показателем в себестоимости равным начальному суммовому остатку, но у меня она уходила по такой сумасшедшей стоимости что ну просто безобразие! Начинаю размышлять : что могло увеличить стоимость материала? Это могли быть дополнительные расходы имеющие направление распределения на стоимость товара. Тогда начинаю разборки таковых статей и на что они распределились через тот же универсальный отчет, но уже по регистру партии прочих расходов, с отбором
Проанализировав результат работы данного отчета, сделан вывод: ни один дополнительный расход не имеет отношения к «проблемной позиции». Продолжаю думать: что же могло настолько увеличить стоимость товара? Принимается решение углубиться в дружбу с модулем РС.
В данном модуле работа блока РС заключена в процедуре РассчитатьСебестоимостьПоГруппеОрганизаций(). В ней ключевыми до непосредственного решения СЛУ являются функции (выделены жирным шрифтом):
//// Этап 3.2
// Формирует временную таблицу ВТДопРасходов (для фактического расчета она пустая)
//- это распределение поступивших расходов по статьям на себестоимость товара
РаспределитьРасходыНаСебестоимость(ПараметрыРасчета);
//// Этап 3.3
// Формирует временную таблицу ВТВозвраты (для фактического расчета она пустая)
// Формирует движения по регистрам (если выполняется фактический расчет):
// - СебестоимостьТоваров
// - ВыручкаИСебестоимостьПродаж
// - ПрочиеРасходы
// - ПрочиеДоходы
// - ДвиженияНоменклатураДоходыРасходы
// - ДвиженияНоменклатураНоменклатура
СкорректироватьСтоимостьВозвратовПрошлыхПериодов(ПараметрыРасчета);
//++ НЕ УТ
// Этап 3.4
// Формирует временные таблицы ВтАналитикаУчетаРасходов, ВтНезавершенноеПроизводство
РаспределитьПрочиеРасходыНезавершенногоПроизводства(ПараметрыРасчета);
// Этап 3.5
// Формирует временную таблицу ВтПередачиТоваров
СформироватьТаблицуПередачМеждуОрганизациями(ПараметрыРасчета);
// Этап 3.6
// Формирует временную таблицу ВтУзлыКорректировки
СформироватьУзлыКорректировкиСписанияСтоимости(ПараметрыРасчета);
//Является ключевым моментом в расчете и главное себ-ть на начало периода
Если ПараметрыРасчета.КоличествоУзлов <> 0 Тогда
// Этап 3.7
// Формирует временные таблицы ВтТаблицаРешений, ВтПеремещенияСписания
РассчитатьСтоимость(ПараметрыРасчета, Ложь);
// Этап 3.8
// Формирует движения по регистрам:
// - СтоимостьТоваров
ЗарегистрироватьСтоимость(ПараметрыРасчета, Ложь);
КонецЕсли;
……………………….. и т.д….
Сконцентрировать внимание стоит на процедурах :
СформироватьУзлыКорректировкиСписанияСтоимости - здесь формируется временная таблица узлов корректировки на базе которой будет сформирован запрос в процедуре РассчитатьСтоимость и от туда результат данного запроса уйдет в процедуру РешитьСЛУ, в которой, при прочтении была обнаружена возможность задействовать параметр по сохранению произведенных расчетов во внешний файл:
// 4. Для анализа решения СЛУ можно сохранить таблицы, используемые при решении СЛУ,
// в виде файлов mxl в указанный каталог.
//Если имя каталога не заполнено, сохранение таблиц не выполняется.
ПараметрыРасчета.Отладка.Вставить("КаталогДляСохраненияДанныхСЛУ", "C:\РешениеСЛУ");
// значение C:\РешениеСЛУ поставила я, в 1с коде параметр не заполнен .
Именно это сохранение во внешний файл очень пригодилось!
Так вот, если вернуться к вопросу «что могло увеличить стоимость товара?», концентрируем свое внимание на процедуре СформироватьУзлыКорректировкиСписанияСтоимости. Внимательно изучаются пакеты запросов входящие в него и делается вывод, что ключевыми в пакетах и их соединении являются измерения «Вид запасов» и «Аналитика учета номенклатуры». Ну с аналитикой все просто в конкретно моем случае: в системе не ведется учет по сериям и характеристикам. Остается вид запасов. Начинаю играть пакетами запроса:
с начало вообще убираю соединение по видам запасов, запускаю на отработку, получаю внешний файл – в нем нахожу свою позицию – результат тот же количество идет, а стоимость получается та же что и вижу в регистре стоимость (как мы помним, стоимость из регистра сведений будет умножена на количество и получиться суммовой показатель в регистре себестоимость).
Ну Хорошо. Вернее плохо..
Тогда во всех пакетах запроса в место
*.ВидЗапасов КАК ВидЗапасов,
//(* - имя таблицы, на которой построен пакет)
//ставлю :
Справочник.ВидЗапасов.ПусстаяСсылка КАК ВидЗапасов
//(у меня нет учета по виду запасов, значит он д.б. пустой)
запускаю на отработку процедуры, получаю внешний файл и вот оно чудо: стоимость по проблемной позиции получается = (стоимость начальный остаток / количество начальный остаток). (напомню по проблемной позиции не было прихода в отчетном периоде а был только начальный остаток, а если бы был приход то считайте по формуле: (стоимость начальный остаток + стоимость прихода/ количество начальный остаток + количество приход)).
Отсюда делается вывод: значит в записях регистра себестоимости, не смотря на то, что учет по виду запасов отключен, имеются записи с заполненным видом запаса. А далее, как было описано выше, что бы найти эти проблемные записи, и была написана соответствующая обработка по поиску и исправлению таковых. После отмены и проведения проблемных документов себестоимость стала закрываться корректно!
3. Как возникла мысль об откате себестоимости
«Ну Все, сколько можно!» сказала я себе после очередного не удачного закрытия, исправления ошибок первички, и отмене / проведения документов за месяц, занимающего несколько суток, нервов и т.д. и т.п. Села и написала обработку – кнопочку по откату себестоимости. В общем и в основном, задавшись вопросом «как же сделать так, что бы не дергать все время первичку при неудачных закрытиях», вооружившись крепкой дружбой с журналом регистрации, в котором путем отслеживания последовательности расчетов и изучением протоколов (спасибо 1с за это!), был определен круг регистров, записи в которые дописывает РС, с соответствующим признаком и как следствие их надо просто очистить. К 11 регистрам, указанным в протоколе добавила еще отмену / проведение документов распределения расходов на себестоимость продукции, для сброса всех движений сделанных ими, а так же зачистку регистра Партии НЗП, что бы РС снова все в нзп пересчитал – ну так на всякий случай. Метить документы с подчищенными движениями РС к отражению, как было доказано опытным путем, не надо – РС сам делает к отражению документы, в которых дописывает движения. Таким образом, исходя из наличия большого документооборота, откат РС стал занимать всего лишь 3- 4 часа, а полное закрытие месяца (все пункты процедуры закрытия месяца) в пределах 12 часов, из которых блок РС занимает так же около 3-4 часов.