Разработка собственной конфигурации «с нуля» — это отличный способ создать систему, идеально подходящую под бизнес-процессы конкретной компании. Если вы успешно реализовали базовый бухгалтерский учет и баланс сходится, то следующим важным шагом становится автоматизация закрытия периода. В этой статье мы подробно разберем, как устроен этот механизм с методологической точки зрения, а также как правильно написать алгоритм закрытия месяца и расчета финансового результата в 1С с использованием запросов к регистру бухгалтерии.
Для начала проанализируем ситуацию: зачем вообще нужно закрывать месяц? В течение отчетного периода (месяца) на счетах бухгалтерского учета накапливаются первичные данные. Мы собираем выручку, фиксируем расходы на производство, аренду, рекламу, заработную плату и амортизацию. Однако до тех пор, пока эти расходы не будут сопоставлены с доходами, мы не сможем узнать, сработала ли компания в плюс или в минус.
Процесс закрытия месяца — это строго последовательное обнуление (или распределение) временных и затратных счетов и перенос итогового сальдо на счет 99 «Прибыли и убытки». В результате этих операций формируется конечный финансовый результат, который затем отражается в балансе в качестве нераспределенной прибыли или непокрытого убытка.
Если в вашей конфигурации ведется только синтетический учет (без глубокой аналитики по субконто), задача существенно упрощается. Нам не нужно распределять затраты по конкретным номенклатурным группам, договорам или статьям затрат. Мы оперируем исключительно оборотами и остатками по счетам и субсчетам.
Выясним главную методологическую ошибку начинающих разработчиков: нельзя закрывать счета в произвольном порядке. Если нарушить последовательность, себестоимость рассчитается неверно, а финансовый результат исказится. Проанализируем правильную цепочку закрытия счетов:
20, 23, 25, 26, 44). Соответственно, эта регламентная операция должна выполняться самой первой.23 (Вспомогательные производства) на счет 20. Следом распределяется счет 25 (Общепроизводственные расходы) — он также переносится в дебет счета 20.26 закрывается напрямую на финансовый результат — в дебет субсчета 90.07.1 (Управленческие расходы).26 распределяются на счет 20 (Основное производство).20 на конец месяца.43), либо напрямую на себестоимость продаж (90.02), если выполнялись работы или оказывались услуги.90.08.99.Рассмотрим подробнее структуру сопоставляющих счетов 90 «Продажи» и 91 «Прочие доходы и расходы». Это крайне важный нюанс. Начинающие специалисты часто думают, что в конце месяца нужно полностью обнулить все субсчета счетов 90 и 91. Это не так!
В течение календарного года (с января по декабрь) на субсчетах (например, 90.01 «Выручка», 90.02 «Себестоимость продаж», 90.03 «НДС») обороты накапливаются нарастающим итогом. Ежемесячно мы закрываем только разницу между дебетовыми и кредитовыми субсчетами. Для этого используется специальный регулирующий субсчет — 90.09 «Прибыль / убыток от продаж» (и аналогично 91.09 для прочих операций).
В конце каждого месяца проводками закрытия мы переносим сальдо счетов 90 и 91 на счет 99.01:
90 Кредит (Выручка) больше Дебета (Себестоимость + Расходы), то у нас прибыль. Формируется проводка: Дебет 90.09 — Кредит 99.01.В итоге, сам счет 90 в целом (сумма всех его субсчетов) на конец каждого месяца всегда имеет нулевое сальдо, но внутри субсчетов показатели продолжают расти. Окончательное «обнуление» субсчетов (так называемая реформация баланса) происходит строго один раз в год — 31 декабря.
Посмотрим на пример того, как технически извлечь нужные суммы из регистра бухгалтерии в вашей самописной конфигурации. Для получения итоговых оборотов за закрываемый месяц наиболее эффективно использовать виртуальную таблицу Обороты регистра бухгалтерии.
Ниже представлен пример кода на языке запросов 1С, который выбирает обороты по счетам доходов и расходов за определенный период:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХозрасчетныйОбороты.Счет КАК Счет,
| ХозрасчетныйОбороты.СуммаОборотДт КАК ОборотДебет,
| ХозрасчетныйОбороты.СуммаОборотКт КАК ОборотКредит
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Месяц, Счет В ИЕРАРХИИ (&СписокСчетов), , , , ) КАК ХозрасчетныйОбороты";
// Задаем параметры запроса
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ДатаДокумента));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ДатаДокумента));
// Заполняем массив счетов, по которым собираем итоги
СписокСчетов = Новый Массив;
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("90"));
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("91"));
Запрос.УстановитьПараметр("СписокСчетов", СписокСчетов);
РезультатЗапроса = Запрос.Выполнить();
Этот простой запрос вернет нам дебетовые и кредитовые обороты по всем субсчетам 90 и 91 счетов. На основании этих данных мы сможем рассчитать разницу программно.
Разберем по шагам, как обработать результаты запроса и создать проводки в документе «Закрытие месяца». Предположим, что у нас в плане счетов настроены соответствующие предопределенные счета. Проанализируем пример кода:
Выборка = РезультатЗапроса.Выбрать();
СуммаДоходов90 = 0;
СуммаРасходов90 = 0;
СуммаДоходов91 = 0;
СуммаРасходов91 = 0;
Пока Выборка.Следующий() Цикл
// Разделяем данные по счетам 90 и 91
Если Выборка.Счет.ПринадлежитРодителю(ПланыСчетов.Хозрасчетный.НайтиПоКоду("90")) Тогда
// Накапливаем обороты по субсчетам (исключая сам регулирующий 90.09)
Если Выборка.Счет <> ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.09") Тогда
СуммаДоходов90 = СуммаДоходов90 + Выборка.ОборотКредит;
СуммаРасходов90 = СуммаРасходов90 + Выборка.ОборотДебет;
КонецЕсли;
ИначеЕсли Выборка.Счет.ПринадлежитРодителю(ПланыСчетов.Хозрасчетный.НайтиПоКоду("91")) Тогда
Если Выборка.Счет <> ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.09") Тогда
СуммаДоходов91 = СуммаДоходов91 + Выборка.ОборотКредит;
СумmaРасходов91 = СуммаРасходов91 + Выборка.ОборотДебет;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Вычисляем результат по продажам (счет 90)
ФинРезультат90 = СуммаДоходов90 - СуммаРасходов90;
// Вычисляем результат по прочим операциям (счет 91)
ФинРезультат91 = СуммаДоходов91 - СуммаРасходов91;
// Движения документа (формирование проводок в регистр бухгалтерии)
ТаблицаДвижений = Движения.Хозрасчетный;
Если ФинРезультат90 <> 0 Тогда
НоваяПроводка = ТаблицаДвижений.Добавить();
НоваяПроводка.Период = КонецМесяца(ДатаДокумента);
Если ФинРезультат90 > 0 Тогда
// Прибыль по продажам
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.09");
НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("99.01");
НоваяПроводка.Сумма = ФинРезультат90;
Иначе
// Убыток по продажам
НоваяПроводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("99.01");
НоваяПроводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("90.09");
НоваяПроводка.Сумма = -ФинРезультат90; // записываем положительное число
КонецЕсли;
КонецЕсли;
Если ФинРезультат91 <> 0 Тогда
НоваяПроводка91 = ТаблицаДвижений.Добавить();
НоваяПроводка91.Период = КонецМесяца(ДатаДокумента);
Если ФинРезультат91 > 0 Тогда
// Прибыль по прочим операциям
НоваяПроводка91.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.09");
НоваяПроводка91.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("99.01");
НоваяПроводка91.Сумма = ФинРезультат91;
Иначе
// Убыток по прочим операциям
НоваяПроводка91.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("99.01");
НоваяПроводка91.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("91.09");
НоваяПроводка91.Сумма = -ФинРезультат91;
КонецЕсли;
КонецЕсли;
ТаблицаДвижений.Записать();
Чтобы ваша программа рассчитывала результаты корректно и без технических сбоев, необходимо предусмотреть в конфигурации несколько важных механизмов контроля:
20 или 41 окажется неактуальной.10, 41, 43) висит «краснота» (отрицательные остатки). Наличие отрицательного остатка по дебету означает, что списано ТМЦ больше, чем числилось на складе, что делает расчет себестоимости некорректным.УчетнаяПолитика с периодичностью в один год. Программа должна считывать настройки на дату закрытия месяца и решать, закрывать ли счет 26 на 20 или на 90 напрямую. Это обеспечит вашей самописной системе гибкость на годы вперед.Таким образом, мы детально разобрали как методологические принципы распределения затрат, так и практический способ программирования алгоритма закрытия месяца в среде 1С. Реализовав эту логику, вы получите автоматический расчет прибыли и убытков, что сделает вашу конфигурацию полноценным и надежным инструментом для ведения учета.