Загрузка данных
Суть проблемы заключается **не в самой платформе 1С**, а в логике работы с данными года при смене значения в `НомерТекущегоГода`.
### Почему это происходит?
1. Поле формы типа **«Календарь»** при перерисовке/перевыводе (событие `ПриВыводеПериода`) запрашивает оформление для дат, которые фактически отображаются в интерфейсе.
2. В вашем коде при смене года вы обновляете границы отображения календаря (`НачалоПериодаОтображения` и `КонецПериодаОтображения`) на сервере в процедуре `НастроитьПолеКалендаря()`.
3. Однако **соответствие `ВидыДней**` формируется на сервере, а элемент формы `Календарь` на клиенте перерисовывается моментально при переключении поля.
4. При смене года на **2021**:
* Значение `НомерПредыдущегоГода` или не успевает синхронизироваться / в процедуре `ОбработатьИзменениеГода` данные перечитываются не синхронно с элементом формы `Календарь`.
* Самое главное: коллекция `ВидыДней` содержит даты за **2021** год, а элемент `Календарь` на форме на момент вызова `ПриВыводеПериода` ещё помнит предыдущий период (например, **2022**) либо в коллекцию `ВидыДней` передается старый набор дат из-за того, что при смене года не вызывается явная передача/привязка новых границ.
* Метод `ВидыДней.Получить(ТекущаяДата)` возвращает `Неопределено`, из-за чего цвет берется по умолчанию, и оформление не срабатывает.
---
### Официальный / Эталонный способ решения (как это сделано в Библиотеке Стандартных Подсистем 1С — БСП)
В типовых конфигурациях (1С:ЗУП, 1С:ERP, БСП — модуль производственного календаря) при смене года **границы периода элемента формы обновляются строго до пересчета и обновления элемента**, а также проверяется актуальность года внутри самóй процедуры вывода периода.
#### 1. Проверка актуальности года в событии `ПриВыводеПериода`
В `КалендарьПриВыводеПериода` нужно явно пропускать или обрабатывать только те даты, которые входят в `НомерТекущегоГода`, либо безопасно получать значение из соответствия:
```bsl
&НаКлиенте
Процедура КалендарьПриВыводеПериода(Элемент, ОформлениеПериода)
Для Каждого СтрокаОформленияПериода Из ОформлениеПериода.Даты Цикл
ТекущаяДата = НачалоДня(СтрокаОформленияПериода.Дата);
// 1. Проверяем, что дата относится к выбранному в форме году
Если Год(ТекущаяДата) <> НомерТекущегоГода Тогда
Продолжить;
КонецЕсли;
// 2. Получаем вид дня
ВидДня = ВидыДней.Получить(ТекущаяДата);
ЦветОформленияДня = ЦветаВидовДней.Получить(ВидДня);
Если ЦветОформленияДня = Неопределено Тогда
ЦветОформленияДня = WebЦвета.Черный;
КонецЕсли;
СтрокаОформленияПериода.ЦветТекста = ЦветОформленияДня;
Если ДниГрафика.Получить(ТекущаяДата) <> Неопределено Тогда
СтрокаОформленияПериода.ЦветФона = WebЦвета.Роса;
Иначе
СтрокаОформленияПериода.ЦветФона = WebЦвета.Белый;
КонецЕсли;
Если НерабочиеДаты.Найти(ТекущаяДата) <> Неопределено Тогда
СтрокаОформленияПериода.ЦветФона = WebЦвета.Фиолетовый;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
```
---
#### 2. Исправление обновления границ календаря при понижении года
В вашей процедуре `ПроверитьИОбработатьИзменениеГода` элемент `Элементы.Календарь.Обновить()` вызывается **после** сервера. Попробуйте явно обновить границы элемента календаря на клиенте/сервере **до** перерисовки:
В процедуре `НастроитьПолеКалендаря()` (которая вызывается из `ЗаполнитьДаннымиТекущегоГода`):
```bsl
&НаСервере
Процедура НастроитьПолеКалендаря()
Если НомерТекущегоГода = 0 Тогда
НомерТекущегоГода = ?(ЗначениеЗаполнено(Объект.Год), Объект.Год, Год(ТекущаяДатаСеанса()));
КонецЕсли;
Объект.Год = НомерТекущегоГода;
// ВАЖНО: сначала сбрасываем границы периода отображения
Элементы.Календарь.НачалоПериодаОтображения = Дата(1000, 1, 1);
Элементы.Календарь.КонецПериодаОтображения = Дата(3000, 12, 31);
// Затем устанавливаем точный год
Элементы.Календарь.НачалоПериодаОтображения = Дата(НомерТекущегоГода, 1, 1);
Элементы.Календарь.КонецПериодаОтображения = Дата(НомерТекущегоГода, 12, 31);
Объект.ДатаНачала = Дата(НомерТекущегоГода, 1, 1);
Объект.ДатаОкончания = Дата(НомерТекущегоГода, 12, 31);
НомерПредыдущегоГода = НомерТекущегоГода; // обновляем значение предыдущего года
КонецПроцедуры
```
---
### Резюме изменений:
1. **Добавить проверку `Если Год(ТекущаяДата) <> НомерТекущегоГода Тогда Продолжить; КонецЕсли;**` в `КалендарьПриВыводеПериода`. Это исключит рассинхронизацию, когда календарь запрашивает отрисовку дат смежного/старого периода.
2. **Сбрасывать границы календаря** перед назначением новых в `НастроитьПолеКалендаря()`.