Загрузка данных


Суть проблемы заключается **не в самой платформе 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. **Сбрасывать границы календаря** перед назначением новых в `НастроитьПолеКалендаря()`.