Загрузка данных
Причина заключается в разнице между тем, как формируются данные при интерактивном выборе производственного календаря и при обычном чтении из регистра:
1. **При выборе производственного календаря** вызывается процедура `ЗаполнитьДаннымиПоУмолчанию()`, которая обращается к `РезультатЗаполненияПроизводственногоКалендаряПоУмолчанию()`. Эта функция принудительно циклически обходит **все 365 дней года** и записывает в соответствие `ВидыДней` вид дня для каждого числа (рабочий, суббота, воскресенье, праздник).
2. **При открытии/чтении данных** (`ЗаполнитьДаннымиТекущегоГода` -> `ПрочитатьДанныеПроизводственногоКалендаря`) данные запрашиваются из регистра сведений. Если в регистре хранятся только отдельные измененные/праздничные дни или новый объект еще не имеет записей, процедура `ПреобразоватьДанныеПроизводственногоКалендаря` заполняет `ВидыДней` **только для тех дат, которые вернулись из запроса**. Все остальные дни года остаются со значением `Неопределено`, из-за чего оформление календаря их не подтягивает.
---
### Как исправить
Чтобы виды дней подгружались всегда, необходимо в процедуре `ПреобразоватьДанныеПроизводственногоКалендаря` дополнить соответствие базовыми видами дней на весь текущий год для всех дат, отсутствующих в регистре.
Замените процедуру `ПреобразоватьДанныеПроизводственногоКалендаря` и `ПрочитатьДанныеПроизводственногоКалендаря` на следующий вариант:
```bsl
&НаСервере
Процедура ПрочитатьДанныеПроизводственногоКалендаря(ПроизводственныйКалендарь, НомерГода)
ТЗДанные = Справочники.ГрафикРаботы.ДанныеПроизводственногоКалендаря(ПроизводственныйКалендарь, НомерГода);
// Если сохраненных данных в регистре еще нет, но календарь выбран — загружаем дефолтный макет
Если ТЗДанные.Количество() = 0 И ЗначениеЗаполнено(Объект.ПроизводственныйКалендарь) Тогда
ТЗДанные = Справочники.ГрафикРаботы.РезультатЗаполненияПроизводственногоКалендаряПоУмолчанию(
Объект.ПроизводственныйКалендарь, НомерГода, Объект.ПроизводственныйКалендарь
);
КонецЕсли;
ПреобразоватьДанныеПроизводственногоКалендаря(ТЗДанные);
КонецПроцедуры
&НаСервере
Процедура ПреобразоватьДанныеПроизводственногоКалендаря(ДанныеПроизводственногоКалендаря)
ВидыДнейСоответствие = Новый Соответствие;
ПереносыДнейСоответствие = Новый Соответствие;
// 1. Заполняем явные данные, сохраненные в регистре / полученные из календаря
Для Каждого СтрокаТаблицы Из ДанныеПроизводственногоКалендаря Цикл
ВидыДнейСоответствие.Вставить(СтрокаТаблицы.Дата, СтрокаТаблицы.ВидДня);
Если ЗначениеЗаполнено(СтрокаТаблицы.ДатаПереноса) Тогда
ПереносыДнейСоответствие.Вставить(СтрокаТаблицы.Дата, СтрокаТаблицы.ДатаПереноса);
КонецЕсли;
КонецЦикла;
// 2. Дополняем пропущенные дни года стандартными рабочими/выходными днями
ДатаДня = Дата(НомерТекущегоГода, 1, 1);
ДатаОкончания = Дата(НомерТекущегоГода, 12, 31);
Пока ДатаДня <= ДатаОкончания Цикл
Если ВидыДнейСоответствие[ДатаДня] = Неопределено Тогда
НомерДня = ДеньНедели(ДатаДня);
Если НомерДня <= 5 Тогда
ВидДняПоУмолчанию = Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий;
ИначеЕсли НомерДня = 6 Тогда
ВидДняПоУмолчанию = Перечисления.ВидыДнейПроизводственногоКалендаря.Суббота;
Иначе
ВидДняПоУмолчанию = Перечисления.ВидыДнейПроизводственногоКалендаря.Воскресенье;
КонецЕсли;
ВидыДнейСоответствие.Вставить(ДатаДня, ВидДняПоУмолчанию);
КонецЕсли;
ДатаДня = ДатаДня + 86400;
КонецЦикла;
ВидыДней = Новый ФиксированноеСоответствие(ВидыДнейСоответствие);
ПереносыДней = Новый ФиксированноеСоответствие(ПереносыДнейСоответствие);
КонецПроцедуры
```