При работе с большим количеством юридических лиц на разных системах налогообложения (ОСНО, УСН, ИП) возникает острая необходимость в централизованном контроле сроков сдачи отчетности. Типовые решения не всегда подходят для специфических задач или самописных конфигураций, поэтому разберем, как спроектировать и реализовать собственный «Календарь бухгалтера», который будет наглядным, автоматизированным и удобным.
Для создания гибкой системы нам недостаточно простого списка отчетов. Мы должны разделить логику формирования расписания и хранение данных о фактической сдаче. Рассмотрим оптимальную структуру метаданных, которую мы будем использовать.
ВидыОтчетов. Здесь мы будем хранить не только названия (СЗВ-М, НДС, УСН), но и настройки их периодичности. Важно добавить реквизиты: Периодичность (месяц, квартал, год) и СрокСдачи (например, количество дней после окончания периода).НазначениеОтчетов. С помощью этого объекта мы будем привязывать конкретный набор отчетов к организации. Это позволит гибко управлять списком: например, если организация перешла с УСН на ОСНО, мы просто создадим новый документ назначения.КалендарьОтчетности. Это основной «движок» нашей системы. При проведении документа НазначениеОтчетов или при срабатывании регламентного задания мы будем генерировать записи в этом регистре.Структура регистра КалендарьОтчетности:
Организация, ВидОтчета, ПериодОтчета (дата начала квартала/месяца).КрайнийСрок (конкретная дата), Статус (Перечисление: Не сдано, Сдано, Просрочено), ДатаФактическойСдачи.Разберем, как программно рассчитать крайний срок сдачи. Проанализируем ситуацию: отчет должен быть сдан до 25 числа месяца, следующего за отчетным кварталом. Если 25 число выпадает на выходной, срок переносится. Для этого нам понадобится ПроизводственныйКалендарь.
Рассмотрим пример кода для расчета даты сдачи с учетом праздничных дней:
Функция РассчитатьСрокСдачи(ДатаКонцаПериода, КоличествоДнейСмещения) Экспорт
// Получаем базовую дату (например, 25-е число следующего месяца)
БазоваяДата = ДобавитьМесяц(НачалоМесяца(ДатаКонцаПериода), 1) + (КоличествоДнейСмещения - 1) * 86400;
// Проверяем по производственному календарю
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ ПЕРВЫЕ 1
| Календарь.Дата
|ИЗ
| РегистрСведений.ДанныеПроизводственногоКалендаря КАК Календарь
|ГДЕ
| Календарь.Дата >= &БазоваяДата
| И Календарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий)
|УПОРЯДОЧИТЬ ПО
| Календарь.Дата ВОЗРАСТАНИЕ";
Запрос.УстановитьПараметр("БазоваяДата", БазоваяДата);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.Дата;
КонецЕсли;
Возврат БазоваяДата;
КонецФункции
Чтобы добиться эффекта «таймлайна», как в современных сервисах отчетности, у нас есть несколько путей реализации в 1С. Выясним преимущества каждого.
Это стандартный элемент управляемой формы 1С. Он позволяет отображать сетку времени и размещать в ней элементы. Мы можем настроить его так, чтобы по вертикали шли организации, а по горизонтали — месяцы. Каждое событие (отчет) будет отдельным элементом планировщика.
Проанализируем шаги настройки Планировщика:
Периодичность в значение "Месяц".ШкалуВремени, добавляя интервалы.КалендарьОтчетности создаем ЭлементыПланировщика.Если нам нужна классическая таблица «Месяцы по колонкам, Организации по строкам», мы можем использовать динамическое создание колонок формы. Это надежный метод, который хорошо работает на больших объемах данных.
Рассмотрим, как программно создать колонки для каждого месяца:
Процедура СформироватьКолонкиКалендаря()
// Удаляем старые колонки, если они были
// ... логика удаления ...
Для НомерМесяца = 1 По 12 Цикл
ИмяРеквизита = "Месяц_" + НомерМесяца;
ЗаголовокКолонки = Формат(Дата(2023, НомерМесяца, 1), "ДФ=MMMM");
// Добавляем реквизит в массив для создания
НовыеРеквизиты = Новый Массив;
НовыеРеквизиты.Добавить(Новый РеквизитФормы(ИмяРеквизита, Новый ОписаниеТипов("Строка"), "СписокОрганизаций"));
ЭтаФорма.ИзменитьРеквизиты(НовыеРеквизиты);
// Добавляем элемент на форму
НовыйЭлемент = Элементы.Добавить(ИмяРеквизита, Тип("ПолеФормы"), Элементы.СписокОрганизаций);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.Заголовок = ЗаголовокКолонки;
НовыйЭлемент.ПутьКДанным = "СписокОрганизаций." + ИмяРеквизита;
КонецЦикла;
КонецПроцедуры
Самый эффектный вариант — использование ПоляHTMLДокумента. Мы можем подготовить HTML-шаблон с использованием CSS Grid или Flexbox. Данные из 1С передаются в шаблон в формате JSON, а JavaScript внутри поля отрисовывает красивые «плитки» с анимацией и всплывающими подсказками.
Преимущества HTML-подхода:
window.external.Чтобы система «ожила», нам нужно фиксировать факт сдачи отчета. Выясним, как это лучше сделать. Оптимально создать документ ПодтверждениеОтчетности, в котором пользователь выбирает организацию и отчет. При проведении этого документа ресурс Статус в регистре КалендарьОтчетности меняется на "Сдано", и записывается ДатаФактическойСдачи.
Если в вашей конфигурации используется интеграция с сервисами электронного документооборота (1С-Отчетность), мы можем автоматизировать этот процесс. С помощью регламентного задания система может опрашивать статусы отправленных пакетов и автоматически помечать отчеты как сданные в нашем календаре.
При работе с сотнями организаций отчет «Календарь» может начать притормаживать. Проанализируем способы ускорения:
КалендарьОтчетности стоят индексы на измерениях Организация и ПериодОтчета.Таким образом, мы разобрали комплексный подход к созданию календаря. Разделение на правила (справочники), расписание (регистры) и визуализацию (формы/HTML) позволяет создать гибкий инструмент, который легко масштабировать под любые изменения законодательства.