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