При сопровождении и доработке конфигурации «1С:Управление производственным предприятием» (УПП) разработчики нередко сталкиваются с ситуацией, когда документ ТребованиеНакладная проводится, флаги отражения в бухгалтерском и налоговом учете установлены, однако в регистрах бухгалтерии движения отсутствуют. Рассмотрим причины такого поведения системы, определим методы конфигурации, отвечающие за генерацию проводок, и разберем последствия попыток добавить кастомное субконто по заказам на счета затрат.
Выясним причину, почему документ не формирует проводки, несмотря на активность флагов «БУ» и «НУ» на форме и в движениях. В УПП с традиционным партионным учетом за это отвечают следующие ключевые факторы:
Дт 20 (26) - Кт 10) в таком случае формируются исключительно регламентной обработкой Проведение по партиям.ПартииТоваровНаСкладахБухгалтерскийУчет на момент документа. Если товар оприходован по другой организации, поступил позже по времени или числится только в управленческом учете, движения по счетам БУ и НУ сформированы не будут.ЦеныНоменклатуры на дату документа зафиксирована плановая цена номенклатуры по типу цен, указанному в настройках параметров учета. При отсутствии плановой цены сумма проводки будет нулевой либо движение не запишется вовсе.Проанализируем структуру программного кода УПП, отвечающую за отражение списания материалов в регламентированном учете. Основные алгоритмы вынесены в специализированные общие модули:
УправлениеЗапасамиПартионныйУчетФормированиеПроводокРегл содержит процедуры генерации проводок регламентированного учета. В частности, процедура ВыполнитьСвязанныеДвиженияРегл() управляет созданием движений по счетам учета затрат и запасов, а процедура СписаниеНаСчет() формирует корреспонденции списания материальных ценностей на производственные счета.УправлениеЗапасамиПартионныйУчет выполняет непосредственный расчет стоимости списания по алгоритмам ФИФО или средней стоимости.Нередко перед программистом ставится задача заполнять аналитику заказа покупателя в проводках по дебету счета 20 («Основное производство») и кредиту счета 10 («Материалы»). Разберем, к каким критическим последствиям в архитектуре УПП приводит такое вмешательство:
Хозрасчетный максимальное число субконто по умолчанию ограничено тремя. На счете 10 уже задействованы аналитики: «Номенклатура», «Склады» и «Партии». Добавление четвертого субконто «Заказ» потребует изменения структуры метаданных конфигурации.Расчет себестоимости закрывает производственные счета (дебет 40, 43, 90 — кредит 20) на основании регистров накопления (Незавершенное производство (бухгалтерский учет) и Затраты (бухгалтерский учет)), а не на основании регистра бухгалтерии. Типовой алгоритм расчета себестоимости не знает о кастомном субконто и не заполнит его по кредиту счета 20. В результате в оборотно-сальдовой ведомости возникнет незакрывающееся сальдо: дебетовый остаток с заполненным заказом и свернутый кредитовый остаток с пустым субконто.ТребованиеНакладная в табличной части предусмотрен реквизит «Заказ затрат» («Заказ»), который фиксирует аналитику в регистрах НЗП. Вся позаказная производственная себестоимость анализируется типовыми отчетами («Ведомость по производственным затратам», «Анализ распределения затрат»), не требуя ломки плана счетов.Если задача заполнения субконто в проводках обязательна к выполнению, рассмотрим правильные и ошибочные варианты реализации.
Не рекомендуется: модифицировать код напрямую в общем модуле УправлениеЗапасамиПартионныйУчетФормированиеПроводокРегл. При перепроведении документов обработкой Проведение по партиям или при обновлении типовых модулей конфигурации такие правки часто затираются или приводят к расхождениям между партиями и проводками.
Рекомендуемый подход: перехватывать запись движений в модуле набора записей регистра бухгалтерии Хозрасчетный в обработчике события ПередЗаписью. Посмотрим на пример реализации алгоритма:
Процедура ПередЗаписью(Отказ, Замещение)
// Проверяем тип регистратора
Если ЭтотОбъект.Отбор.Регистратор.Использование
И ТипЗнч(ЭтотОбъект.Отбор.Регистратор.Значение) = Тип("ДокументСсылка.ТребованиеНакладная") Тогда
ДокументСсылка = ЭтотОбъект.Отбор.Регистратор.Значение;
Для Каждого Проводка Из ЭтотОбъект Цикл
// Заполнение субконто дебета, если у счета определен вид субконто "Заказы"
Если Проводка.СчетДт.ВидыСубконто.Найти(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ЗаказПокупателя) <> Неопределено Тогда
// Заполняем значение заказа из соответствующей строки документа или шапки
// Например, Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.ЗаказПокупателя] = НужныйЗаказ;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
Разберем по шагам логику этого решения: код не затрагивает громоздкие модули расчета партий и отрабатывает как при оперативном проведении документа пользователем, так и при фоновом перепроведении через регламентную обработку Проведение по партиям. Однако помним: при внедрении этой схемы потребуется аналогично дорабатывать проводки документов Расчет себестоимости и Корректировка НЗП, чтобы исключить зависание остатков на счетах учета.