Нестандартное закрытие месяца на Бухгалтерии 3.0.
Хотел бы рассказать вам об интересном опыте решения задачи по доработке штатного закрытия месяца (по 20,23,25,26 счету) в Бухгалтерии 3.0 и Корп.
Исторически сложилось, что у клиента 25 счет распределялся таким же образом, как 26 (т.е. не в пределах подразделения, а по всем подразделениям, где есть нужная база распределения, кроме того – на часть номенклатурных групп, по которым распределяются затраты на 20 счете, не должны распределяться затраты со счета 25. Все это было реализовано в 1С: Бухгалтерии 2.0 и потом этот код был без изменений перенесен в бухгалтерию 3.0.
Однако с течением времени меняется все, в том числе механизмы закрытия месяца в бухгалтерии 3 и учетная политика… И старые механизмы перестали заполнять необходимые дополнительные регистры, и потребовалось адаптировать штатные механизмы бухгалтерии 3.0 для подобного поведения регламентной операции «Закрытие 20,23,25,26 счета».
Итак, передо мной открылась замечательная перспектива дописывания графа затрат, ребер, вершин и прочей высшей математики в приложении 1с. Однако, с момента появления этого механизма, 1с внес множество усовершенствований, в частности, сделал программный интерфейс, с помощью которого можно дорабатывать поведение процедуры закрытия месяца для различных ситуаций, происходящих на клиентских базах. В результате изучения партнерского форума и кода конфигурации «Бухгалтерия 3.0», в частности, был обнаружен общий модуль «ПравилаРаспределенияРасходовМодификацияКонфигурации», содержащий процедуру:
Процедура ПриДобавленииПравилПоСчету(Процессор) Экспорт
В оригинале, она выглядит так:
Процедура ПриДобавленииПравилПоСчету(Процессор) Экспорт
// Для поиска предопределенного правила, подлежащего модификации, можно использовать Имя предопределенных правил.
// При этом анализировать следует части имени, предшествующую первому символу "."
// Подробнее см. комментарий в ПравилаРаспределенияРасходов.НовыеПравилаРаспределения()
// Пример модификации правила, позволяющей распределять расходы, учтенные на счете 25, аналогично общехозяйственным:
// без ограничения направлений распределения подразделениями, в которых учтены расходы на счете 25.
// <начало примера>
//Если Процессор.КлассСчетов <> "КосвенныеРасходы" Тогда
// Возврат;
//КонецЕсли;
//
//Если Процессор.Закрытие.Направление <> "КалькуляционныйСчет" Тогда
// Возврат;
//КонецЕсли;
//
//ИмяМодифицируемогоПравила = "МетодОплатаТруда";
//
//Для Каждого Правило Из Процессор.Правила Цикл
//
// ЭлементыИмени = СтрРазделить(Правило.Имя, ".");
// Если Не ЗначениеЗаполнено(ЭлементыИмени) Или ЭлементыИмени[0] <> ИмяМодифицируемогоПравила Тогда
// Продолжить;
// КонецЕсли;
//
// Правило.ПоляИсточника.Удалить("Подразделение");
//
//КонецЦикла;
// <конец примера>
КонецПроцедуры
Как видим, там приведен хороший пример, как сделать распределение 25 счета по аналогии с 26-м (т.е. не учитывая подразделения!!!).
Я проверил, этот код действительно работает и делает то что надо – из 25 счета второй 26.
Однако перед нами стоит еще одна задача – сделать так, чтобы наши затраты 25 (и только 25) счета не распределялись на некоторые, отмеченные галками «не распр.25» номенклатурные группы. Изыскания в отладчике принесли информацию, что в процедуру «ПриДобавленииПравилПоСчету» передается структура «Процессор» с таблицей «Правила», в каждой из строк которой есть запрос, определяющий базу распределения по каждому из правил, он в виде текста хранится в реквизите «Правило.БазаРаспределения.ТекстЗапроса». Т.е. если мы хотим поменять базу распределения, то нужно поменять этот самый запрос. Например, так:
НайденныйСчет = Неопределено;
Если Правило.ОтборРасходов.Свойство("Счет",НайденныйСчет)Тогда
Если НайденныйСчет = Счет25 Тогда
Если Найти(Правило.БазаРаспределения.ТекстЗапроса,"ПрямыеРасходы.НоменклатурнаяГруппа.НеРаспр25 = ЛОЖЬ") = 0 Тогда
Правило.БазаРаспределения.ТекстЗапроса = СтрЗаменить( Правило.БазаРаспределения.ТекстЗапроса,
"СГРУППИРОВАТЬ ПО","
|ГДЕ
| ПрямыеРасходы.НоменклатурнаяГруппа.НеРаспр25 = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО");
КонецЕсли;
КонецЕсли;
КонецЕсли;
В разкомментированном примере из типовой конфигурации добавляем условие, что если счет – это счет 25 и в запросе еще нет условия по галке, то добавляем это условие. Проверка на наличие условия в запросе нужна, так как процедура может вызываться более одного раза, и, если это условие не вставить – запрос может быть испорчен. Такая настройка позволяет распределить 25 счет только на те номенклатурные группы, у которых не стоит галка «НеРаспр25».
Полная текстовка процедуры:
Процедура ПриДобавленииПравилПоСчету(Процессор) Экспорт
Если Процессор.КлассСчетов <> "КосвенныеРасходы" Тогда
Возврат;
КонецЕсли;
Если Процессор.Закрытие.Направление <> "КалькуляционныйСчет" Тогда
Возврат;
КонецЕсли;
ИмяМодифицируемогоПравила = "МетодОплатаТруда";
Счет25 = ПланыСчетов.Хозрасчетный.ОбщепроизводственныеРасходы;
Для Каждого Правило Из Процессор.Правила Цикл
ЭлементыИмени = СтрРазделить(Правило.Имя, ".");
Если Не ЗначениеЗаполнено(ЭлементыИмени) Или ЭлементыИмени[0] <> ИмяМодифицируемогоПравила Тогда
Продолжить;
КонецЕсли;
НайденныйСчет = Неопределено;
Если Правило.ОтборРасходов.Свойство("Счет",НайденныйСчет)Тогда
Если НайденныйСчет = Счет25 Тогда
Если Найти(Правило.БазаРаспределения.ТекстЗапроса,"ПрямыеРасходы.НоменклатурнаяГруппа.НеРаспр25 = ЛОЖЬ") = 0 Тогда
Правило.БазаРаспределения.ТекстЗапроса = СтрЗаменить( Правило.БазаРаспределения.ТекстЗапроса,
"СГРУППИРОВАТЬ ПО","
|ГДЕ
| ПрямыеРасходы.НоменклатурнаяГруппа.НеРаспр25 = ЛОЖЬ
|
|СГРУППИРОВАТЬ ПО");
КонецЕсли;
КонецЕсли;
КонецЕсли;
Правило.ПоляИсточника.Удалить("Подразделение");
КонецЦикла;
КонецПроцедуры
Однако вскрылась еще одна интересная особенность распределения затрат: оказывается, база распределения, расчет которой мы так замечательно поправили, рассчитывается не для счета затрат (как было бы логично исходя из отдельных правил для 25 и 26 счета в таблице правил), а для способа распределения (в нашем случае это «Оплата труда»). Т.е. при такой настройке у нас 26 счет тоже не распределится на номенклатурные группы с галкой «НеРаспр25», что нас, конечно же, не устраивает. Решение этого вопроса мне подсказала коллега (Спасибо тебе, Мартьянова Екатерина!) – нужно сделать для 26 счета отдельный способ распределения в регистре сведений «Методы распределения общепроизводственных и общехозяйственных затрат»:
И назначить ему базу распределения – отдельные статьи прямых затрат, а в список статей прямых затрат набрать те же статьи, которые входят в предыдущую базу распределения (в данном случае все статьи с видом «Оплата труда». Вуаля – теперь 25 счет распределяется по базе распределения, описанной нашим доработанным запросом, а 26 по аналогичной, но другой базе распределения, где никаких условий по галке уже нет.
Таким вот нехитрым способом можно добиваться нестандартного закрытия месяца с помощью встроенных механизмов Бухгалтерии 3.0.