К основному контенту

КалендарныеГрафики.ДатыПоКалендарю() получаем предшествующие даты (количество дней с минусом)

Через расширение добиваемся того, чтобы выполнялся расчет  дней предшествующих ДатаОт 

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

Функция расширение_ПредшествующиеДатыПоКалендарю(ГрафикРаботы, ДатаОт, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей, ВызыватьИсключение)
 
 Если Не ЗначениеЗаполнено(ГрафикРаботы) Тогда
  Если ВызыватьИсключение Тогда
   ВызватьИсключение НСтр("ru = 'Не указан график работы или производственный календарь.'");
  КонецЕсли;
  Возврат Неопределено;
 КонецЕсли;
 
 Если ТипЗнч(ГрафикРаботы) <> Тип("СправочникСсылка.ПроизводственныеКалендари") Тогда
  Если ОбщегоНазначения.ПодсистемаСуществует("СтандартныеПодсистемы.ГрафикиРаботы") Тогда
   МодульГрафикиРаботы = ОбщегоНазначения.ОбщийМодуль("ГрафикиРаботы");
   Возврат МодульГрафикиРаботы.ДатыПоГрафику(
    ГрафикРаботы, ДатаОт, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей, ВызыватьИсключение);
  КонецЕсли;
 КонецЕсли;
 
 МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
 
 СоздатьВТПриращениеДней(МенеджерВременныхТаблиц, МассивДней, РассчитыватьСледующуюДатуОтПредыдущей);
 
 // Алгоритм работает следующим образом:
 // Получаем все дни календаря, предшествующие дате отсчета.
 // Для каждого из таких дней рассчитываем количество дней, включенных в график с даты отсчета.
 // Отбираем рассчитанное таким образом количество по таблице приращения дней.
 
 Запрос = Новый Запрос;
 
 Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;
 
 // По производственному календарю.
 Запрос.Текст =
 "ВЫБРАТЬ
 | КалендарныеГрафики.Дата КАК ДатаГрафика
 |ПОМЕСТИТЬ ВТПоследующиеДатыГрафика
 |ИЗ
 | РегистрСведений.ДанныеПроизводственногоКалендаря КАК КалендарныеГрафики
 |ГДЕ
 | КалендарныеГрафики.Дата <= &amp;ДатаОт
 | И КалендарныеГрафики.ПроизводственныйКалендарь = &amp;ГрафикРаботы
 | И КалендарныеГрафики.ВидДня В (ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий), ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный))
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 | ПоследующиеДатыГрафика.ДатаГрафика,
 | КОЛИЧЕСТВО(КалендарныеГрафики.ДатаГрафика) - 1 КАК КоличествоДнейВключенныхВГрафик
 |ПОМЕСТИТЬ ВТПоследующиеДатыГрафикаСКоличествомДней
 |ИЗ
 | ВТПоследующиеДатыГрафика КАК ПоследующиеДатыГрафика
 |  ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафика КАК КалендарныеГрафики
 |  ПО (КалендарныеГрафики.ДатаГрафика >= ПоследующиеДатыГрафика.ДатаГрафика)
 |
 |СГРУППИРОВАТЬ ПО
 | ПоследующиеДатыГрафика.ДатаГрафика
 |;
 |
 |////////////////////////////////////////////////////////////////////////////////
 |ВЫБРАТЬ
 | ПриращениеДней.ИндексСтроки,
 | ЕСТЬNULL(ПоследующиеДни.ДатаГрафика, НЕОПРЕДЕЛЕНО) КАК ДатаПоКалендарю
 |ИЗ
 | ВТПриращениеДней КАК ПриращениеДней
 |  ЛЕВОЕ СОЕДИНЕНИЕ ВТПоследующиеДатыГрафикаСКоличествомДней КАК ПоследующиеДни
 |  ПО ПриращениеДней.КоличествоДней = ПоследующиеДни.КоличествоДнейВключенныхВГрафик
 |
 |УПОРЯДОЧИТЬ ПО
 | ПриращениеДней.ИндексСтроки";
 
 Запрос.УстановитьПараметр("ДатаОт", НачалоДня(ДатаОт));
 Запрос.УстановитьПараметр("ГрафикРаботы", ГрафикРаботы);
 
 Выборка = Запрос.Выполнить().Выбрать();
 
 МассивДат = Новый Массив;
 
 Пока Выборка.Следующий() Цикл
  Если Выборка.ДатаПоКалендарю = Неопределено Тогда
   СообщениеОбОшибке = НСтр("ru = 'Производственный календарь «%1» не заполнен с даты %2 на указанное количество рабочих дней.'");
   Если ВызыватьИсключение Тогда
    ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(СообщениеОбОшибке, ГрафикРаботы, Формат(ДатаОт, "ДЛФ=D"));
   Иначе
    Возврат Неопределено;
   КонецЕсли;
  КонецЕсли;
  
  МассивДат.Добавить(Выборка.ДатаПоКалендарю);
 КонецЦикла;
 
 Возврат МассивДат;
 
КонецФункции

Комментарии

Популярные сообщения из этого блога

СписокВыбора. Показать Представление вместо Значения

Вводная Если на форме есть элемент управления со списком выбора, в моем конкретном примере это Колонка Значение (Число (3,0)) с настроенным списком выбора. По умолчанию платформа отображает именно строковое значения, а не текст представления  из списка выбора (когда как при выборе значения из списка показываются именно представления). Решение Для Управляемых форм необходимо настроить правила условного оформления, для обычных форм - оформление ячеек при выводе данных.

Табличный Документ. Разная ширина колонки в строках

Когда нужно в макете (табличном документе) изменить ширину колонки  для конкретных строк: 1. Выделить всю строку (строки). Именно всю, фокус для выделенной области не работает. 2. Нажимаем и не отпускает Ctrl 3. С помощью мыши изменяют ширину любой из колонок - будет задан вопрос об создании нового формата строк - соглашаемся. Как же прекрасен мир, где для модификаций не достаточно просто использовать контекстное меню и диалог редактора свойств, где нужно знать заветные слова и таинства танца. 90ые, моё почтение. UPD Программно, тоже самое, можно сделать через ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(1,,1,).СоздатьФорматСтрок(); ТабДок.Область(1,1).ШиринаКолонок = 70; ТабДок.Область(1,2).ШиринаКолонок = 30; ТабДок.Область(2,,2,).СоздатьФорматСтрок(); ТабДок.Область(2,1).ШиринаКолонок = 30; ТабДок.Область(2,2).ШиринаКолонок = 70; ТабДок.Показать();

Расширение конфигурации + Связанные документы (Режим совместимости 8.3.12)

Вводная: реализовать ввод Заказа поставщику на основании Заказа на Ремонт. решить через расширения конфигурации. Хочу обратить ваше внимание, не нужно добавлять в расширение критерий отбора, для 8.3.12 нам не доступно добавление\изменение состава критерия. Более того может зависать конфигуратор (столкнулся с последней версией 8.3.14 + ERP) Разработку рекомендую вести с применением хранилища и для расширения. Иначе устанете потом выгребать чего лишнего включили в расширение при добавлении таких или схожих обектов с составными типами и подобное. Все текущие типовые решения сейчас идут в режиме совместимости 8.3.12, в прочем и для 8.3.14 (и даже 8.3.15 ничего не поменялось). Что нам нужно было бы сделать при отказе от поддержки: 1) добавить наш документ в Критерий отбора (состав, реквизиты); 2) в раздел Ввод на основании целевого документа. И что с целью сохранения поддержки. Как сделать это же для расширения: 1) Добавить реквизит расширения Документы.ЗаказПоставщику._За