В типовых конфигурациях «1С:Бухгалтерия 8» (редакция 3.0) механизмы закрытия месяца и распределения косвенных расходов (счета 25 и 26) претерпели значительные изменения с внедрением новой архитектуры. Разработчики предусмотрели специальный механизм «мягкой» модификации правил распределения через общий модуль ПравилаРаспределенияРасходовМодификацияКонфигурации. Однако при попытке настроить распределение по базе Выручка программисты часто сталкиваются с тем, что стандартные примеры кода, работающие для «Прямых затрат» или «Оплаты труда», не дают ожидаемого результата. Рассмотрим подробно, как решить эту задачу и почему база Выручка требует особого подхода.
Рассмотрим ситуацию: организации необходимо, чтобы затраты, накопленные на счете 25 (или 26), распределялись на счет 20 пропорционально выручке по всем номенклатурным группам, вне зависимости от того, по какому подразделению эта выручка была отражена. В стандартной логике программы распределение происходит внутри подразделения: если на подразделении «Цех №1» есть затраты, система ищет базу (выручку или прямые расходы) именно по «Цеху №1».
Для модификации этого поведения в общем модуле ПравилаРаспределенияРасходовМодификацияКонфигурации предусмотрен закомментированный пример. Разберем его логику:
// Пример из типовой конфигурации:
ИмяМодифицируемогоПравила = "МетодОплатаТруда";
Для Каждого Правило Из Процессор.Правила Цикл
ЭлементыИмени = СтрРазделить(Правило.Имя, ".");
Если Не ЗначениеЗаполнено(ЭлементыИмени) Или ЭлементыИмени[0] <> ИмяМодифицируемогоПравила Тогда
Продолжить;
КонецЕсли;
Правило.ПоляИсточника.Удалить("Подразделение");
КонецЦикла;
Этот код отлично работает для методов МетодОплатаТруда или МетодПрямыеЗатраты. Удаляя Подразделение из коллекции ПоляИсточника, мы заставляем систему игнорировать аналитику подразделения при поиске данных на счетах затрат. Но при использовании МетодВыручка или МетодВыручкаТолькоУслуги распределение все равно «зависает» на конкретном подразделении. Выясним причину этого поведения.
Проанализируем архитектуру формирования базы распределения. В отличие от прямых затрат, которые лежат на тех же счетах (20, 23), база «Выручка» собирается из оборотов счета 90.01. Программный механизм распределения в 1С использует систему сопоставления полей источника (что распределяем) и полей базы (на что распределяем).
Основные отличия метода выручки:
Правило, помимо ПоляИсточника, существуют коллекции ПоляБазы и ПоляСопоставления. Если в методах прямых затрат связь по подразделению часто подразумевается неявно, то в методе выручки она прописана в структуре самой базы.Подразделение в структуре базы, запрос будет искать выручку строго по тому подразделению, где возник расход.Чтобы распределение по выручке заработало по всем подразделениям, нам необходимо не только очистить источник, но и модифицировать структуру самой базы в объекте правила. Рассмотрим правильный алгоритм действий.
Шаг 1. Определение правильного имени правила.
В зависимости от настроек учетной политики, правило может называться МетодВыручка, МетодВыручкаТолькоУслуги или МетодВыручкаОтРеализации. Проанализируем коллекцию Процессор.Правила в режиме отладки, чтобы убедиться, какое именно правило используется в вашем случае.
Шаг 2. Модификация структуры правила.
В модуле ПравилаРаспределенияРасходовМодификацияКонфигурации необходимо расширить типовой код, добавив удаление подразделения из полей базы. Посмотрим на пример кода:
Процедура МодифицироватьПравилаРаспределения(Процессор) Экспорт
// Определяем правила, которые хотим изменить
МассивИмен = Новый Массив;
МассивИмен.Добавить("МетодВыручка");
МассивИмен.Добавить("МетодВыручкаТолькоУслуги");
Для Каждого Правило Из Процессор.Правила Цикл
ЭлементыИмени = СтрРазделить(Правило.Имя, ".");
Если ЭлементыИмени.Количество() = 0 Тогда
Продолжить;
КонецЕсли;
ИмяМетода = ЭлементыИмени[0];
Если МассивИмен.Найти(ИмяМетода) <> Неопределено Тогда
// 1. Удаляем подразделение из источника (счет 25/26)
Если Правило.ПоляИсточника.Содержит("Подразделение") Тогда
Правило.ПоляИсточника.Удалить("Подразделение");
КонецЕсли;
// 2. КРИТИЧНО: Удаляем подразделение из базы (счет 90)
// Это позволит собирать выручку со всех подразделений
Если Правило.ПоляБазы.Содержит("Подразделение") Тогда
Правило.ПоляБазы.Удалить("Подразделение");
КонецЕсли;
// 3. Проверяем наличие полей сопоставления (зависит от версии конфигурации)
// Если подразделение есть в сопоставлении, его также нужно исключить
Если Правило.Свойство("ПоляСопоставления") И Правило.ПоляСопоставления.Содержит("Подразделение") Тогда
Правило.ПоляСопоставления.Удалить("Подразделение");
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Шаг 3. Учет особенностей конкретных релизов.
В некоторых версиях «1С:Бухгалтерии» логика сбора базы «Выручка» может быть жестко зашита в процедурах типа ДобавитьПравилоМетодВыручкаТолькоУслуги основного модуля ПравилаРаспределенияРасходов. Если модификация в специальном модуле (который вызывается в конце формирования правил) не помогает, это может означать, что структура запроса формируется динамически на основе параметров, которые не передаются в Процессор. Однако в 90% случаев очистка ПоляБазы решает проблему.
Проанализируем ситуацию с точки зрения бухгалтерского учета. Начиная с 2021 года, согласно ФСБУ 5/2019 «Запасы», общехозяйственные расходы (счет 26) в бухгалтерском учете не должны включаться в себестоимость продукции (счет 20), если они не связаны напрямую с производственным процессом. По умолчанию в 1С они списываются на счет 90.08 (директ-костинг).
Если вы модифицируете закрытие счета 26 через счет 20 по выручке, помните:
Для реализации нестандартного закрытия счетов 25 или 26 по базе выручки без привязки к подразделениям необходимо:
ПравилаРаспределенияРасходовМодификацияКонфигурации.Подразделение не только в ПоляИсточника, но и в ПоляБазы объекта правила.Такой подход позволяет сохранить конфигурацию на поддержке (так как изменения вносятся в специально предназначенный для этого модуль) и достичь требуемой гибкости в распределении затрат.