Как программно получить последний месяц, в котором производилось закрытие месяца в БП 3.0

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

В конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) задача программного определения последнего закрытого месяца встречается довольно часто: при построении отчетов, проверке возможности редактирования документов или автоматизации регламентных заданий. На первый взгляд задача кажется простой, но механизм закрытия месяца в БП 3.0 многослоен. Он включает в себя не только документы, но и регистры сведений, контролирующие последовательность и актуальность операций.

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

Способ 1. Анализ документов «Регламентная операция»

Самый очевидный способ, к которому часто приходят разработчики — это поиск последних документов типа РегламентнаяОперация. Эти документы создаются автоматически при выполнении процедуры закрытия месяца. Каждая операция (амортизация, закрытие затратных счетов, расчет налогов) представлена отдельным видом операции в этом документе.

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

  1. Расчет налога на прибыль — для организаций на общей системе налогообложения (ОСНО).
  2. Расчет налога УСН — для организаций на упрощенке.
  3. Реформация баланса — выполняется только в декабре.

Проанализируем пример запроса, который позволяет найти дату последнего проведенного документа по расчету налога на прибыль:


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

Запрос.УстановитьПараметр("Организация", ВыбраннаяОрганизация);
РезультатЗапроса = Запрос.Выполнить();

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

Способ 2. Использование регистра «Состояние регламентных операций»

Для более точного определения статуса закрытия месяца в 1С используется специализированный регистр сведений — СостояниеРегламентныхОпераций. Именно из него обработка «Закрытие месяца» берет данные для отображения статусов (зеленый, синий, красный значки).

Этот регистр хранит информацию о каждой операции в разрезе организации и периода. Чтобы программно определить «последний закрытый месяц», нам нужно найти максимальный период, для которого все обязательные операции имеют статус Выполнено.

Давайте разберем, как выглядит обращение к этому регистру:


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

В данном случае мы анализируем состояние конкретных записей. Однако стоит учитывать, что некоторые операции могут быть исключены пользователем вручную. Для этого существует отдельный регистр — ИсключенныеИзЗакрытияМесяцаОперации. Если операция исключена, она не будет иметь статуса «Выполнено», но это не должно мешать признанию месяца закрытым.

Способ 3. Проверка актуальности через программный интерфейс (API)

В конфигурации БП 3.0 реализован мощный механизм в общих модулях, который берет на себя всю тяжелую работу по анализу документов, регистров состояний и «стоп-листов». Вместо написания сложных запросов, мы рекомендуем использовать функции общего модуля ЗакрытиеМесяцаСервер или ЗакрытиеМесяца.

Проанализируем ситуацию: нам нужно понять, актуально ли закрытие за конкретный месяц. Для этого можно вызвать метод, который система использует при открытии формы помощника. Рассмотрим примерный алгоритм получения состояния:


// Определяем период (начало месяца)
ПериодПроверки = НачалоМесяца(ТекущаяДата());

// Вызываем метод для определения состояния закрытия
Состояние = ЗакрытиеМесяца.ОпределитьСостояниеЗакрытияМесяца(Организация, ПериодПроверки);

Если Состояние = Перечисления.СостоянияЗакрытияМесяца.Выполнено Тогда
    Сообщить("Месяц полностью закрыт и актуален");
КонецЕсли;

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

Способ 4. Проверка через регистр «Актуальность регламентных операций»

Если ваша задача — не просто найти месяц, а убедиться, что данные в базе не требуют пересчета, необходимо обратиться к регистру сведений АктуальностьРегламентныхОпераций.

Выясним причину, почему это важно: в 1С:Бухгалтерии реализован механизм отслеживания изменений. Как только кто-то правит документ в закрытом периоде, система записывает данные в этот регистр. Если в нем есть записи по вашей организации за определенный месяц — значит, закрытие неактуально, даже если все документы проведены.

Разберем логику проверки:

  1. Находим последний месяц, где есть проведенная РегламентнаяОперация (Реформация баланса или Расчет налога).
  2. Проверяем, нет ли записей в регистре АктуальностьРегламентныхОпераций за этот и предшествующие периоды.
  3. Если записи отсутствуют, месяц считается «финально» закрытым.

Резюме и рекомендации

Подводя итог, можно выделить следующую последовательность действий для программиста:

Во-первых, если требуется быстрая и грубая оценка, ориентируйтесь на дату последнего документа РегламентнаяОперация с видом операции «Расчет налога на прибыль» (или УСН).

Во-вторых, для точной проверки используйте данные регистра сведений СостояниеРегламентныхОпераций. Обращайте внимание на значение перечисления СостоянияРегламентныхОпераций.Выполнено.

В-третьих, всегда учитывайте актуальность. Месяц не может считаться закрытым, если система требует перепроведения операций из-за изменений «задним числом». Проверка регистра АктуальностьРегламентныхОпераций — залог корректности ваших данных.

Наиболее правильным подходом в современной версии БП 3.0 будет использование функций общего модуля ЗакрытиеМесяцаСервер, так как это обеспечит совместимость вашего кода с будущими обновлениями конфигурации от фирмы «1С».

← На главную