В конфигурации «1С:Бухгалтерия предприятия 3.0» (БП 3.0) задача программного определения последнего закрытого месяца встречается довольно часто: при построении отчетов, проверке возможности редактирования документов или автоматизации регламентных заданий. На первый взгляд задача кажется простой, но механизм закрытия месяца в БП 3.0 многослоен. Он включает в себя не только документы, но и регистры сведений, контролирующие последовательность и актуальность операций.
В этой статье мы подробно разберем, какими методами можно получить информацию о закрытии месяца, начиная от простых запросов к документам и заканчивая использованием программного интерфейса (API) самой конфигурации.
Самый очевидный способ, к которому часто приходят разработчики — это поиск последних документов типа РегламентнаяОперация. Эти документы создаются автоматически при выполнении процедуры закрытия месяца. Каждая операция (амортизация, закрытие затратных счетов, расчет налогов) представлена отдельным видом операции в этом документе.
Рассмотрим логику: если за определенный период существуют проведенные документы РегламентнаяОперация по «финальным» задачам, значит, месяц можно считать закрытым. К финальным задачам обычно относятся:
Проанализируем пример запроса, который позволяет найти дату последнего проведенного документа по расчету налога на прибыль:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| МАКСИМУМ(РегламентнаяОперация.Период) КАК ПоследнийМесяц
|ИЗ
| Документ.РегламентнаяОперация КАК РегламентнаяОперация
|ГДЕ
| РегламентнаяОперация.Проведен = ИСТИНА
| И РегламентнаяОперация.Организация = &Организация
| И РегламентнаяОперация.ВидОперации = ЗНАЧЕНИЕ(Перечисление.ВидыРегламентныхОпераций.РасчетНалогаНаПрибыль)";
Запрос.УстановитьПараметр("Организация", ВыбраннаяОрганизация);
РезультатЗапроса = Запрос.Выполнить();
Важное ограничение: наличие проведенного документа не гарантирует, что данные в нем актуальны. Если пользователь внес изменения в документы прошлого периода «задним числом», документ РегламентнаяОперация останется проведенным, но его состояние в интерфейсе помощника закрасится красным цветом, сигнализируя о необходимости пересчета.
Для более точного определения статуса закрытия месяца в 1С используется специализированный регистр сведений — СостояниеРегламентныхОпераций. Именно из него обработка «Закрытие месяца» берет данные для отображения статусов (зеленый, синий, красный значки).
Этот регистр хранит информацию о каждой операции в разрезе организации и периода. Чтобы программно определить «последний закрытый месяц», нам нужно найти максимальный период, для которого все обязательные операции имеют статус Выполнено.
Давайте разберем, как выглядит обращение к этому регистру:
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СостояниеРегламентныхОпераций.Период КАК Период
|ИЗ
| РегистрСведений.СостояниеРегламентныхОпераций КАК СостояниеРегламентныхОпераций
|ГДЕ
| СостояниеРегламентныхОпераций.Организация = &Организация
| И СостояниеРегламентныхОпераций.Состояние = ЗНАЧЕНИЕ(Перечисление.СостоянияРегламентныхОпераций.Выполнено)
| И СостояниеРегламентныхОпераций.РегламентнаяОперация В (&СписокФинальныхОпераций)
|УПОРЯДОЧИТЬ ПО
| Период УБЫВ";
В данном случае мы анализируем состояние конкретных записей. Однако стоит учитывать, что некоторые операции могут быть исключены пользователем вручную. Для этого существует отдельный регистр — ИсключенныеИзЗакрытияМесяцаОперации. Если операция исключена, она не будет иметь статуса «Выполнено», но это не должно мешать признанию месяца закрытым.
В конфигурации БП 3.0 реализован мощный механизм в общих модулях, который берет на себя всю тяжелую работу по анализу документов, регистров состояний и «стоп-листов». Вместо написания сложных запросов, мы рекомендуем использовать функции общего модуля ЗакрытиеМесяцаСервер или ЗакрытиеМесяца.
Проанализируем ситуацию: нам нужно понять, актуально ли закрытие за конкретный месяц. Для этого можно вызвать метод, который система использует при открытии формы помощника. Рассмотрим примерный алгоритм получения состояния:
// Определяем период (начало месяца)
ПериодПроверки = НачалоМесяца(ТекущаяДата());
// Вызываем метод для определения состояния закрытия
Состояние = ЗакрытиеМесяца.ОпределитьСостояниеЗакрытияМесяца(Организация, ПериодПроверки);
Если Состояние = Перечисления.СостоянияЗакрытияМесяца.Выполнено Тогда
Сообщить("Месяц полностью закрыт и актуален");
КонецЕсли;
Использование встроенных функций — это самый надежный метод, так как он автоматически учитывает настройки учетной политики (например, систему налогообложения) и специфику конкретной организации.
Если ваша задача — не просто найти месяц, а убедиться, что данные в базе не требуют пересчета, необходимо обратиться к регистру сведений АктуальностьРегламентныхОпераций.
Выясним причину, почему это важно: в 1С:Бухгалтерии реализован механизм отслеживания изменений. Как только кто-то правит документ в закрытом периоде, система записывает данные в этот регистр. Если в нем есть записи по вашей организации за определенный месяц — значит, закрытие неактуально, даже если все документы проведены.
Разберем логику проверки:
РегламентнаяОперация (Реформация баланса или Расчет налога).АктуальностьРегламентныхОпераций за этот и предшествующие периоды.Подводя итог, можно выделить следующую последовательность действий для программиста:
Во-первых, если требуется быстрая и грубая оценка, ориентируйтесь на дату последнего документа РегламентнаяОперация с видом операции «Расчет налога на прибыль» (или УСН).
Во-вторых, для точной проверки используйте данные регистра сведений СостояниеРегламентныхОпераций. Обращайте внимание на значение перечисления СостоянияРегламентныхОпераций.Выполнено.
В-третьих, всегда учитывайте актуальность. Месяц не может считаться закрытым, если система требует перепроведения операций из-за изменений «задним числом». Проверка регистра АктуальностьРегламентныхОпераций — залог корректности ваших данных.
Наиболее правильным подходом в современной версии БП 3.0 будет использование функций общего модуля ЗакрытиеМесяцаСервер, так как это обеспечит совместимость вашего кода с будущими обновлениями конфигурации от фирмы «1С».