Не нашел решение данной задачи на просторах интернета.
Есть выбранный период, из которого нужно исключить даты, тем самым будут подпериоды без этих дат. Решение считаю не идеальным. Думал, получится за один проход циклом, но получилось аж в 2 процедуры. Возможно, будет предложено более простое решение. Во вложении обработка (см. картинку) с тем же самым алгоритмом.
Функция РазбитьПериодИсключениемДат(ДатаНачала, ДатаОкончания, ТЗИсключенияДат)
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Дата");
ТЗ.Колонки.Добавить("ЭтоИсключение");
ТЗПериоды = Новый ТаблицаЗначений;
ТЗПериоды.Колонки.Добавить("ДатаНачала");
ТЗПериоды.Колонки.Добавить("ДатаОкончания");
ПериодДатаНачала = ДатаНачала;
ПериодДатаОкончания = ДатаОкончания;
//Заполним таблицу ТЗ с отметкой дат которые нам не нужны
Пока ПериодДатаНачала <= ПериодДатаОкончания Цикл
НоваяСтрока = ТЗ.Добавить();
НоваяСтрока.Дата = ПериодДатаНачала;
МассивСтрокДата = ТЗИсключенияДат.НайтиСтроки(Новый Структура("Период", ПериодДатаНачала));
Если МассивСтрокДата.Количество() > 0 Тогда
НоваяСтрока.ЭтоИсключение = Истина;
Иначе
НоваяСтрока.ЭтоИсключение = Ложь;
КонецЕсли;
ПериодДатаНачала = НачалоДня(КонецДня(ПериодДатаНачала) + 1);
КонецЦикла;
//Обходим заполненную таблицу ТЗ
Индекс = 0;
КоличествоСтрок = ТЗ.Количество() - 1;
Пока Индекс <= КоличествоСтрок Цикл
ТекущаяСтрока = ТЗ[Индекс];
Если ТекущаяСтрока.ЭтоИсключение = Истина Тогда
Индекс = Индекс + 1;
Иначе
ПериодНачала = НачалоДня(ТекущаяСтрока.Дата);
ИндексДатаОкончания = ПолучитьИндексДатаОкончания(ТЗ, Индекс, КоличествоСтрок);
ПериодОкончания = НачалоДня(ТЗ[ИндексДатаОкончания].Дата);
НоваяСтрока = ТЗПериоды.Добавить();
НоваяСтрока.ДатаНачала = ПериодНачала;
НоваяСтрока.ДатаОкончания = ПериодОкончания;
Индекс = ИндексДатаОкончания + 1;
КонецЕсли;
КонецЦикла;
Возврат ТЗПериоды;
КонецФункции
Функция ПолучитьИндексДатаОкончания(ТЗ, Индекс, КоличествоСтрок)
ИндексДатаОкончания = 0;
Пока Индекс <= КоличествоСтрок Цикл
ТекущаяСтрока = ТЗ[Индекс];
Если ТекущаяСтрока.ЭтоИсключение = Истина Тогда
ИндексДатаОкончания = Индекс - 1;
Прервать;
Иначе
ИндексДатаОкончания = Индекс;
КонецЕсли;
Индекс = Индекс + 1;
КонецЦикла;
Возврат ИндексДатаОкончания;
КонецФункции
Обработка протестирована на: Зарплата и управление персоналом, Зарплата и кадры государственного учреждения, редакция 3.1 (3.1.20.97), платформа: 1С:Предприятие 8.3 (8.3.19.1229). Но можно использовать и в других конфигурациях на управляемых формах.