Оценка себестоимости товара – ключевой момент при определении валовой прибыли предприятия. И именно она зачастую становится проблемой для системного администратора и пользователей. Крайне важно, чтобы программист понимал, какие алгоритмы были заложены разработчиками при написании программы расчета себестоимости. В статье мы подробно расскажем, как рассчитывается себестоимость продукта в программах 1С (ERP 2.1.3 и следующие за ней версии), эта информация будет полезна как системным администраторам, так и рядовым пользователям.
Общая информация о механизме оффлайнового расчета себестоимости и движении по регистрам себестоимости
Движение по регистрам себестоимости бывает двух видов:
- первичные – те, которые формируются соответственно логике проведения документов;
- расчетные – те, которые формируются данным механизмом. Новый реквизит РасчетСебестоимости регистров накопления является идентификатором типа движения.
Чтобы уточнить список регистров, которые обслуживает механизм расчета себестоимости, обратитесь в раздел ИсходящиеДанныеМеханизма.
Регистратором расчетных движений выступает не документ РасчетСебестоимостиТоваров, а первичный документ из реквизита ДокументДвижения.
Изменения, которые были внесены в документ, никак не влияют на расчетные движения при перепроведении документов. Для этого используется специальный код, размещенный в модуле набора записей обслуживаемых регистров. Все изменения и правки, внесенные в документ, учитываются в расчетных движениях во время перерасчета себестоимости.
В версии ERP 2.1.3 разработчики изменили алгоритм формирования и записи движения. Движение по каждому из обслуживающихся механизмом регистров организовано следующим образом:
- предыдущие расчетные движения в новой версии ERP 2.1.3 остаются в ИБ, пока не будет окончен расчет;
- те расчетные движения, которые формируются механизмом «с нуля», находятся в таблице значений;
- созданные движения из таблицы значений перемещаются во временную таблицу;
- когда расчет окончен, новые движения, которые находятся во временной таблице, и старые (из ИБ) сравниваются. Затем движения из документов, отличающихся расчетными движениями, старыми и новыми, переписываются. Эти документы обязательно подлежат регистрации в учете.
Изменения, внесенные в новые версии ERP, имеют свои преимущества:
- теперь есть возможность ознакомиться с себестоимостью непосредственно из документа – в отчете Движения документа;
- после перерасчета себестоимости перезаписанными оказываются только те расчетные движения, которые были реально изменены;
- регистрируются в отражении лишь те документы, в которых есть перезаписанные движения.
Как перейти на ERP 2.1.3 и версии КА2 и УТ11, которые ей соответствуют
Когда осуществляется переход на новую версию ERP, те расчетные движения, которые были сформированы, не меняются автоматически. Ведь для этого потребуется не просто перенести движения с одного регистратора на другой, а «эмуляция» перерасчета себестоимости. Такие манипуляции могут повлечь за собой серьезные последствия.
Запуск перерасчета старого периода поможет сформировать правильные движения уже по новой схеме.
Как запустить расчет себестоимости
Началом работы над запуском расчета себестоимости станет вход в алгоритм расчета – операция РассчитатьВсе. Предварительно в ней устанавливаются следующие параметры:
- расчетный период – месяц;
- более «легкий» предварительный расчет предоставляет возможность сформировать несколько отчетов. Создать предварительный отчет можно лишь в том случае, если за требуемый период еще не выполнялся фактический расчет;
- расчет может быть выполнен как по нескольким указанным организациям, так и по всем предприятиям, которые связываются по схеме Интеркампани. Если не указано, расчет какой организации должен быть проведен. В данном случае расчет будет выполняться для всех организаций, в которых в данном периоде осуществлялось движение по регистрам. Кстати, у организаций, по которым будет выполняться расчет, должен быть один и тот же метод оценивания стоимости запасов;
- расчет себестоимости может быть запущен интерактивно посредством механизма закрытия месяца или же из регламентного задания.
Перед тем как начать расчет каждой организации будет открыт документ под названием РасчетСебестоимостиТоваров. Опишем его структуру.
- Название организация, на чье имя будет открыт документ, указывается в Организации шапки документа.
- Организации, связанные с ней посредством Интеркампани, указываются в табличной части реквизита Организация. Стоит уточнить, что в предыдущих версиях ERP этого реквизита не было вообще, а документ с расчетом себестоимости формировался на все организации, которые были связаны Интеркампани. Данные обо всех документах можно найти в таблице ВТДокументыРасчетаСебестоимости, где они находятся на хранении.
Функция РассчитатьВсеВПопыткеИсключении создана для того, чтобы при возникновении ошибки расчет был выполнен без падения.
Расчет себестоимости
Расчет себестоимости выполняет функция РассчитатьСебестоимостьПоГруппеОрганизаций. Этапы расчета:
- инициализация параметров алгоритма;
- последовательное прохождение всех этапов расчета. Причем возможен пропуск некоторых этапов по причине специфичных настроек системы либо параметров запуска. Итогом данного этапа становятся готовые расчетные движения или временные таблицы, которые используются на следующих этапах расчета;
- запись всех расчетных движений, измененных в процессе. Используя фоновые задания, можно организовать запись сразу в несколько потоков;
- отображение в учете всех измененных документов.
Этап расчета и его структура
Непосредственно этап расчета можно оформить в виде следующей цепочки операций.
- Создание запроса на выборку первоначальных данных для этапа, заполнение свойств запроса, непосредственное выполнение запроса. Если цель этапа – формирование масштабных временных таблиц, вся следующая информация будет уже неактуальна.
- Учитывая данные запроса, формируются расчетные движения по регистрам расчета. Следует сказать, что многие этапы формируют не движения, а масштабные временные таблицы. Код формирования внесен в процедуру, вид которой СформироватьДвижения<Имя регистра><Уточнение операции>. Чтобы добавить движения внутри данных процедур, используется процедура ДобавитьЗаписьВТаблицуДвижений.
- Удаление временных таблиц, которые использовались на этом этапе.
- Перемещение из таблиц значений сформированных движений в таблицы временные. Одновременно с этим процессом обновляются служебные кэши оборотов и остатков, соответственно, кэши будут не актуализированы в тот промежуток времени, когда осуществляется выборка исходных данных и окончание этапа.
Запросы с обращениями к данным ИБ
Уже известно, что запись в ИБ новых расчетных движений по регистрам себестоимости осуществляется исключительно в конце расчета. Поэтому, обращаясь к таблицам данных регистров, как реальных, так и виртуальных, следует соблюдать определенные правила.
- Обороты регистра за требуемый период получаются путем объединения главной таблицы регистра, отбор которого «Т.РасчетСебестоимости = Ложь», и временной таблицы ВТКэш<Имя регистра>.
- Остатки регистра в конце требуемого периода получаются, если объединить остатки регистра, которые были в начале периода, с главной таблицей регистра, отбор которого "Т.РасчетСебестоимости = Ложь", а также с временной таблицей ВТКэш<Имя регистра>, где содержатся новые расчетные движения за заданный период. Данные по некоторым из регистров автоматически кэшируются во временной таблице под названием ВТКэшРасчетныеОстатки<Имя регистра>. Все регистры можно найти в параметрах расчетов ("РегистрыСРасчетнымиОстатками").
- Те движения, которые были образованы на перечисленных этапах расчета, можно найти во временной таблице ВТКэш<Имя регистра>, где они хранятся. Эта таблица специально создана для регистров, которые обслуживают механизм расчета себестоимости.
Работа с запросами, ее особенности
Данные, которые используются для отборов в запросах, находятся либо в параметрах расчета, либо в масштабных временных таблицах. Чтобы установить эти параметры, используется операция ИнициализироватьСвойстваЗапроса. После проведенной процедуры запросы механизма расчета будут использовать одни и те же отборы. Также данная операция способна установить запрос общему менеджеру временных таблиц, где находятся таблицы кэшей, о которых упоминалось чуть выше.
Если во временных таблицах возникли проблемы с полем ВидДвижения, причиной может быть ошибка Платформы 30025997. Для того чтобы обойти эту ошибку, вместо привычного поля ВидДвижения во временных таблицах были созданы техногенные поля СлужебноеВидДвиженияПриход, тип работы которых "Булево". Существуют определенные правила работы с ними. Во-первых, отправляя запросы к данным временным таблицам, нужно обращаться исключительно к полю СлужебноеВидДвиженияПриход. Во-вторых, в таблицах значений, где хранятся недавно созданные расчетные записи, функционирует только поле ВидДвижения. Изменения в поле между временной таблицей и таблицей значений вносятся автоматически, то есть проведение каких-либо манипуляций не требуется.
Отладка и поиск проблемных мест
Чтобы максимально облегчить процесс программирования, тестирования и поиска проблемных мест, был создан механизм протоколирования. Функционирует он следующим образом. В начале любого этапа расчета в журнале регистрации появляется запись, она помогает отслеживать, как выполняется процесс расчета. Когда расчет окончен, в журнале регистрации находим исчерпывающий протокол расчета. Если этого недостаточно, можно воспользоваться возможностью предопределить параметры расчета.