Как закрыть месяц и рассчитать финансовый результат в самописной конфигурации 1С

Программист 1С v8.3 (Управляемые формы) Бухгалтерский учет IT и автоматизация бизнеса
← На главную

Разработка собственной конфигурации «с нуля» — это отличный способ создать систему, идеально подходящую под бизнес-процессы конкретной компании. Если вы успешно реализовали базовый бухгалтерский учет и баланс сходится, то следующим важным шагом становится автоматизация закрытия периода. В этой статье мы подробно разберем, как устроен этот механизм с методологической точки зрения, а также как правильно написать алгоритм закрытия месяца и расчета финансового результата в 1С с использованием запросов к регистру бухгалтерии.

Понимание сути закрытия месяца: синтетический учет и финансовый результат

Для начала проанализируем ситуацию: зачем вообще нужно закрывать месяц? В течение отчетного периода (месяца) на счетах бухгалтерского учета накапливаются первичные данные. Мы собираем выручку, фиксируем расходы на производство, аренду, рекламу, заработную плату и амортизацию. Однако до тех пор, пока эти расходы не будут сопоставлены с доходами, мы не сможем узнать, сработала ли компания в плюс или в минус.

Процесс закрытия месяца — это строго последовательное обнуление (или распределение) временных и затратных счетов и перенос итогового сальдо на счет 99 «Прибыли и убытки». В результате этих операций формируется конечный финансовый результат, который затем отражается в балансе в качестве нераспределенной прибыли или непокрытого убытка.

Если в вашей конфигурации ведется только синтетический учет (без глубокой аналитики по субконто), задача существенно упрощается. Нам не нужно распределять затраты по конкретным номенклатурным группам, договорам или статьям затрат. Мы оперируем исключительно оборотами и остатками по счетам и субсчетам.

Шаг 1. Соблюдение строгой последовательности закрытия счетов

Выясним главную методологическую ошибку начинающих разработчиков: нельзя закрывать счета в произвольном порядке. Если нарушить последовательность, себестоимость рассчитается неверно, а финансовый результат исказится. Проанализируем правильную цепочку закрытия счетов:

  1. Амортизация и валютные переоценки: Начисление амортизации формирует расходы текущего периода, которые попадают на счета затрат (20, 23, 25, 26, 44). Соответственно, эта регламентная операция должна выполняться самой первой.
  2. Распределение вспомогательных и косвенных производственных затрат: Сначала закрывается счет 23 (Вспомогательные производства) на счет 20. Следом распределяется счет 25 (Общепроизводственные расходы) — он также переносится в дебет счета 20.
  3. Закрытие общехозяйственных расходов (счет 26): Здесь логика зависит от выбранной учетной политики вашей организации:
    • Если применяется метод «директ-костинг», то счет 26 закрывается напрямую на финансовый результат — в дебет субсчета 90.07.1 (Управленческие расходы).
    • Если «директ-костинг» не используется, затраты со счета 26 распределяются на счет 20 (Основное производство).
  4. Расчет себестоимости и закрытие основного производства (счет 20):
    • Если у предприятия есть незавершенное производство (НЗП), то часть суммы (остаток НЗП) должна остаться на счете 20 на конец месяца.
    • Остальная часть списывается либо на счет выпуска готовой продукции (43), либо напрямую на себестоимость продаж (90.02), если выполнялись работы или оказывались услуги.
  5. Закрытие коммерческих расходов (счет 44): Все затраты на продажу (реклама, доставка, содержание магазинов) списываются в дебет счета 90.08.
  6. Определение финансового результата (закрытие 90 и 91 счетов): Это финальная стадия, на которой сопоставляются доходы и расходы, а разница переносится на счет 99.

Шаг 2. Разбор логики работы со счетами 90, 91 и 99

Рассмотрим подробнее структуру сопоставляющих счетов 90 «Продажи» и 91 «Прочие доходы и расходы». Это крайне важный нюанс. Начинающие специалисты часто думают, что в конце месяца нужно полностью обнулить все субсчета счетов 90 и 91. Это не так!

В течение календарного года (с января по декабрь) на субсчетах (например, 90.01 «Выручка», 90.02 «Себестоимость продаж», 90.03 «НДС») обороты накапливаются нарастающим итогом. Ежемесячно мы закрываем только разницу между дебетовыми и кредитовыми субсчетами. Для этого используется специальный регулирующий субсчет — 90.09 «Прибыль / убыток от продаж» (и аналогично 91.09 для прочих операций).

В конце каждого месяца проводками закрытия мы переносим сальдо счетов 90 и 91 на счет 99.01:

В итоге, сам счет 90 в целом (сумма всех его субсчетов) на конец каждого месяца всегда имеет нулевое сальдо, но внутри субсчетов показатели продолжают расти. Окончательное «обнуление» субсчетов (так называемая реформация баланса) происходит строго один раз в год — 31 декабря.

Шаг 3. Техническая реализация запроса к регистру бухгалтерии

Посмотрим на пример того, как технически извлечь нужные суммы из регистра бухгалтерии в вашей самописной конфигурации. Для получения итоговых оборотов за закрываемый месяц наиболее эффективно использовать виртуальную таблицу Обороты регистра бухгалтерии.

Ниже представлен пример кода на языке запросов 1С, который выбирает обороты по счетам доходов и расходов за определенный период:


Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	ХозрасчетныйОбороты.Счет КАК Счет,
    |	ХозрасчетныйОбороты.СуммаОборотДт КАК ОборотДебет,
    |	ХозрасчетныйОбороты.СуммаОборотКт КАК ОборотКредит
    |ИЗ
    |	РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоПериода, &КонецПериода, Месяц, Счет В ИЕРАРХИИ (&СписокСчетов), , , , ) КАК ХозрасчетныйОбороты";

// Задаем параметры запроса
Запрос.УстановитьПараметр("НачалоПериода", НачалоМесяца(ДатаДокумента));
Запрос.УстановитьПараметр("КонецПериода", КонецМесяца(ДатаДокумента));

// Заполняем массив счетов, по которым собираем итоги
СписокСчетов = Новый Массив;
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("90"));
СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("91"));
Запрос.УстановитьПараметр("СписокСчетов", СписокСчетов);

РезультатЗапроса = Запрос.Выполнить();

Этот простой запрос вернет нам дебетовые и кредитовые обороты по всем субсчетам 90 и 91 счетов. На основании этих данных мы сможем рассчитать разницу программно.

Шаг 4. Алгоритм программного формирования проводок

Разберем по шагам, как обработать результаты запроса и создать проводки в документе «Закрытие месяца». Предположим, что у нас в плане счетов настроены соответствующие предопределенные счета. Проанализируем пример кода:


Выборка = РезультатЗапроса.Выбрать();

СуммаДоходов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;
    КонецЕсли;
КонецЕсли;

ТаблицаДвижений.Записать();

Важные практические рекомендации перед запуском алгоритма

Чтобы ваша программа рассчитывала результаты корректно и без технических сбоев, необходимо предусмотреть в конфигурации несколько важных механизмов контроля:

Таким образом, мы детально разобрали как методологические принципы распределения затрат, так и практический способ программирования алгоритма закрытия месяца в среде 1С. Реализовав эту логику, вы получите автоматический расчет прибыли и убытков, что сделает вашу конфигурацию полноценным и надежным инструментом для ведения учета.

← На главную