Публикации

БСП
Разработки

Найдено результатов: 478


Добавить к дате и разность дат

Функции для работы с датами как в языке запросов

Автор: ildarovich

FastCode 66 8
Функция ДобавитьКДате(Дата1, Количество, Период) Экспорт
    Шаг = Новый Структура("Год, Квартал, Месяц, Неделя, День, Час, Минута, Секунда", 12, 3, 1, -604800, -86400, -3600, -60, -1);
    Возврат ?(Шаг[Период] > 0, ДобавитьМесяц(Дата1, Количество * Шаг[Период]), Дата1 - Количество * Шаг[Период])
КонецФункции
Функция РазностьДат(Дата1, Дата2, Период) Экспорт
    Шаг = Новый Структура("Год, Квартал, Месяц, Неделя, День, Час, Минута, Секунда", 12, 3, 1, -604800, -86400, -3600, -60, -1);
    Возврат Цел(?(Шаг[Период] > 0, Год(Дата2) * 12 + Месяц(Дата2) - 1, '00010101' - Дата2) / Шаг[Период]) 
          - Цел(?(Шаг[Период] > 0, Год(Дата1) * 12 + Месяц(Дата1) - 1, '00010101' - Дата1) / Шаг[Период])
КонецФункции

//Функция Квартал

Функция Квартал(Дата) Экспорт  
    Возврат Цел((Месяц(Дата) - 1) / 3) + 1
КонецФункции

//Названия месяцев прописью

Формат(Дата(1, НомерМесяца, 1),"ДФ=ММММ")

//Название дней недели прописью

Формат(Дата(1, 1, 2 + НомерДняНедели),"ДФ=дддд")

Прибавить к дате день

Прибавить, добавить, дата, день
&НаСервереБезКонтекста
Функция ПрибавитьКДатеДень(Дата, КоличествоДней = 1)
	
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Дата", Дата);
	Запрос.УстановитьПараметр("КоличествоДней", КоличествоДней);
	Запрос.Текст =
		"ВЫБРАТЬ
		|	ДОБАВИТЬКДАТЕ(&Дата, ДЕНЬ, &КоличествоДней) КАК Дата";
		
	Результат = Запрос.Выполнить().Выбрать();
	Результат.Следующий();
	Возврат  Результат.Дата;
	
КонецФункции

Раскрасить даты календаря

Процкдура раскрашивает даты в календаре
ROXy 25 1 2
Процедура ПроизводственныйКалендарьПриВыводеПериода(Элемент, ОформлениеПериода)
	Попытка 
		МассивДат = ПоискДатВРегистреСведениийДатыКурсов ();
		Для Каждого ДатаПериода Из ОформлениеПериода.Даты Цикл
			Если МассивДат.Найти(ДатаПериода.Дата) <> Неопределено Тогда
				ДатаПериода.ЦветФона = webЦвета.БледноЗеленый;
			КонецЕсли;
			Если ДеньНедели(ДатаПериода.Дата)>=6 Тогда
				ДатаПериода.ЦветТекста = webЦвета.Красный; 
			КонецЕсли;
		КонецЦикла;
	Исключение
	КонецПопытки;
КонецПроцедуры

Получить дату файла

Функция определяет дату последней модификации существующего файла на диске
bolsun 37 4
// Функция определяет дату последней модификации существующего файла на диске
// Параметры
//  ИмяФайла  – Строка, содержащая полный путь к файла на диске.
//
// Возвращаемое значение:
//   Дата – Дата последней модификации файла
//
Функция ПолучитьДатуФайла(Знач ИмяФайла) Экспорт
	
	Файл = Новый Файл(ИмяФайла);
	Возврат Файл.ПолучитьВремяИзменения();
	 
КонецФункции

Строка в дату по форматной строке

Преобразование строки в дату по форматной строке
Функция СтрокаВДату(ФорматДаты, Дано, Ошибка = Ложь)
	
	Попытка
		
		ТестоваяДата = Формат('00010101', "ДФ=" + ФорматДаты); // — необязательная проверка первого правильности параметра
		
	Исключение
		
		Ошибка = Истина;
		Возврат '00010101';
		
	КонецПопытки;
	
	СтруктураДаты = Новый Соответствие;
	
	Для Счетчик = 1 По СтрДлина(ФорматДаты) + 7 Цикл
		
		СтруктураДаты[Сред(ФорматДаты + "dMyHhms", Счетчик, 1)] = 0; // — инициализация частей даты
		
	КонецЦикла;
	
	Для Счетчик = 1 По 12 Цикл
		
		Дано = СтрЗаменить(Дано, Формат(Дата(1, Счетчик, 1), "ДФ=MMММ"), Формат(Счетчик, "ЧЦ=4; ЧВН=")); // — замена названий месяцев числами
		Дано = СтрЗаменить(Дано, Формат(Дата(1, Счетчик, 1), "ДФ=MMМ" ), Формат(Счетчик, "ЧЦ=3; ЧВН="));
		
	КонецЦикла;
	
	Для Счетчик = 1 По СтрДлина(ФорматДаты) Цикл
		
		СтруктураДаты[Сред(ФорматДаты, Счетчик, 1)] = 10 * СтруктураДаты[Сред(ФорматДаты, Счетчик, 1)] + Найти("123456789", Сред(Дано, Счетчик, 1)); // — накопление частей даты
		Ошибка = Ошибка ИЛИ Найти("dMyHhms", Сред(ФорматДаты, Счетчик, 1)) И НЕ Найти("0123456789", Сред(Дано, Счетчик, 1)); // — необязательная проверка на цифры
		
	КонецЦикла;
	
	СтруктураДаты["y"] = СтруктураДаты["y"] + ?(СтруктураДаты["y"] < 50, 2000, ?(СтруктураДаты["y"] < 100, 1900, 0)); // — дополнение двух цифр года до четырех
	
	Попытка
		
		Возврат Дата(СтруктураДаты["y"], СтруктураДаты["M"], СтруктураДаты["d"], СтруктураДаты["H"] + СтруктураДаты["h"], СтруктураДаты["m"], СтруктураДаты["s"])
		
	Исключение
		
		Ошибка = Истина;
		Возврат '00010101';
		
	КонецПопытки;
	
КонецФункции

Как по GUID определить время и дату создания ссылки?

Как по GUID определить время и дату создания ссылки?
Yashar 21 1 1
Функция UUID_Timestamp(Ссылка)
	
	ГУИД = Ссылка.УникальныйИдентификатор();
    // Например ГУИД равен: bdb62d89-cede-11e4-b12b-d4ae52b5e909
    // Дата содержится в первых символах, bdb62d89-cede-11e4 которые нужно переставить задом наперед: 11e4-cede-bdb62d89
    Строка16 = Сред(ГУИД, 15, 4) + Сред(ГУИД, 10, 4) + Сред(ГУИД, 1, 8);
    
    // Убираем "лишние" знаки "-"(тире).
    Строка16 = СтрЗаменить(Строка16, "-", "");
    
    // Убираем первый символ, так как в нем содержится версия стандарта (зашит в седьмой октет)
    Строка15 = Сред(Строка16, 2);
    
    // Получаем timestamp в 60 бит : 1E4 CEDE BDB6 2D89
    ЧислоСек = 0;
    Для Позиция = 1 По СтрДлина(Строка15) Цикл
        ЧислоСек = ЧислоСек + Найти("123456789abcdef",Сред(Строка15,Позиция,1))*Pow(16,СтрДлина(Строка15) - Позиция);
    КонецЦикла;
    ЧислоСек = ЧислоСек / 10000000;
    
    // Прибавляем к дате начала Григореанского календаря
    Возврат Дата(1582, 10, 15, 00, 00, 00) + ЧислоСек + СмещениеСтандартногоВремени() + СмещениеЛетнегоВремени();;
    
КонецФункции

ПустаяДата

Возвращает дату, соответствующую пустой дате в реестре кластера серверов.
ОбщийМодуль.АдминистрированиеКластера
Автор: 1С
// Возвращает дату, соответствующую пустой дате в реестре кластера серверов.
//
// Возвращаемое значение: 
//   Дата - Дата и время.
//
Функция ПустаяДата() Экспорт
	
	Возврат Дата(1, 1, 1, 0, 0, 0);
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ПустаяДата

Возвращает дату, соответствующую пустой дате в реестре кластера серверов.
ОбщийМодуль.АдминистрированиеКластераКлиентСервер
Автор: 1С
// Возвращает дату, соответствующую пустой дате в реестре кластера серверов.
//
// Возвращаемое значение:
//   Дата(Дата и время) - пустая дата.
//
Функция ПустаяДата() Экспорт
	
	Возврат Дата(1, 1, 1, 0, 0, 0);
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ДатаПоГрафику

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ДатаУниверсальная

Возвращает универсальную дату сеанса, получаемую из текущей даты сеанса.
ОбщийМодуль.ОбщегоНазначенияКлиент
Автор: 1С
// Возвращает универсальную дату сеанса, получаемую из текущей даты сеанса.
//
// Функция возвращает время, близкое к результату функции УниверсальноеВремя() в серверном контексте.
// Погрешность обусловлена временем выполнения серверного вызова.
// Предназначена для использования вместо функции УниверсальноеВремя().
//
// Возвращаемое значение:
//  Дата - универсальная дата сеанса.
//
Функция ДатаУниверсальная() Экспорт
	
	Если СтандартныеПодсистемыКлиент.ЗапускПрограммыЗавершен() Тогда
		ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиента();
	Иначе
		ПараметрыКлиента = СтандартныеПодсистемыКлиент.ПараметрыРаботыКлиентаПриЗапуске();
	КонецЕсли;
	
	ДатаСеанса = ТекущаяДата() + ПараметрыКлиента.ПоправкаКВремениСеанса;
	Возврат ДатаСеанса + ПараметрыКлиента.ПоправкаКУниверсальномуВремени;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ДатаПоКалендарю

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ДатаЗапретаПоОписанию

Возвращает дату запрета, рассчитанную по описанию относительной даты запрета.
ОбщийМодуль.ДатыЗапретаИзмененияСлужебный
Автор: 1С
// Возвращает дату запрета, рассчитанную по описанию относительной даты запрета.
//
// Параметры:
//  ОписаниеДатыЗапрета - Строка - содержит описание относительной даты запрета.
//  ДатаЗапрета         - Дата - абсолютная дата, полученная из регистра.
//  НачалоДня           - Дата - текущая дата сеанса на начало дня.
//                      - Неопределено - вычислить автоматически.
//
Функция ДатаЗапретаПоОписанию(ОписаниеДатыЗапрета, ДатаЗапрета, НачалоДня = '00010101') Экспорт
	
	Если Не ЗначениеЗаполнено(ОписаниеДатыЗапрета) Тогда
		Возврат ДатаЗапрета;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(НачалоДня) Тогда
		НачалоДня = НачалоДня(ТекущаяДатаСеанса());
	КонецЕсли;
	
	Сутки = 60*60*24;
	КоличествоДнейРазрешения = 0;
	
	ВариантДатыЗапрета    = СтрПолучитьСтроку(ОписаниеДатыЗапрета, 1);
	КоличествоДнейСтрокой = СтрПолучитьСтроку(ОписаниеДатыЗапрета, 2);
	
	Если ЗначениеЗаполнено(КоличествоДнейСтрокой) Тогда
		ОписаниеТипа = Новый ОписаниеТипов("Число");
		КоличествоДнейРазрешения = ОписаниеТипа.ПривестиЗначение(КоличествоДнейСтрокой);
	КонецЕсли;
	
	Если ВариантДатыЗапрета = "КонецПрошлогоГода" Тогда
		ТекущаяДатаЗапрета    = НачалоГода(НачалоДня)          - Сутки;
		ПредыдущаяДатаЗапрета = НачалоГода(ТекущаяДатаЗапрета) - Сутки;
		
	ИначеЕсли ВариантДатыЗапрета = "КонецПрошлогоКвартала" Тогда
		ТекущаяДатаЗапрета    = НачалоКвартала(НачалоДня)          - Сутки;
		ПредыдущаяДатаЗапрета = НачалоКвартала(ТекущаяДатаЗапрета) - Сутки;
		
	ИначеЕсли ВариантДатыЗапрета = "КонецПрошлогоМесяца" Тогда
		ТекущаяДатаЗапрета    = НачалоМесяца(НачалоДня)          - Сутки;
		ПредыдущаяДатаЗапрета = НачалоМесяца(ТекущаяДатаЗапрета) - Сутки;
		
	ИначеЕсли ВариантДатыЗапрета = "КонецПрошлойНедели" Тогда
		ТекущаяДатаЗапрета    = НачалоНедели(НачалоДня)          - Сутки;
		ПредыдущаяДатаЗапрета = НачалоНедели(ТекущаяДатаЗапрета) - Сутки;
		
	ИначеЕсли ВариантДатыЗапрета = "ПредыдущийДень" Тогда
		ТекущаяДатаЗапрета    = НачалоДня(НачалоДня)          - Сутки;
		ПредыдущаяДатаЗапрета = НачалоДня(ТекущаяДатаЗапрета) - Сутки;
	Иначе
		Возврат '00030303'; // Неизвестный формат.
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ТекущаяДатаЗапрета) Тогда
		СрокРазрешения = ТекущаяДатаЗапрета + КоличествоДнейРазрешения * Сутки;
		Если Не НачалоДня > СрокРазрешения Тогда
			ТекущаяДатаЗапрета = ПредыдущаяДатаЗапрета;
		КонецЕсли;
	КонецЕсли;
	
	Возврат ТекущаяДатаЗапрета;
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ДатыПоКалендарю

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ДатаОбновленияКлассификатора

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ДатыПоГрафику

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

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

УстановитьУсловноеОформлениеПоляДата

Устанавливает представление поля Дата в списках, содержащих реквизит с составом даты Дата и время.
ОбщийМодуль.СтандартныеПодсистемыСервер
Автор: 1С
// Устанавливает представление поля Дата в списках, содержащих реквизит с составом даты Дата и время.
// Подробнее см. стандарт "Поле "Дата" в списках".
//
// Параметры:
//   ЭтотОбъект - ФормаКлиентскогоПриложения - форма со списком.
//   ПолноеИмяРеквизита - Строка - полный путь к реквизиту типа "Дата" в формате "<ИмяСписка>.<ИмяПоля>".
//   ИмяЭлемента - Строка - имя элемента формы, связанного с реквизитом списка типа "Дата".
//
// Пример:
//
//	Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//		СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект);
//
Процедура УстановитьУсловноеОформлениеПоляДата(ЭтотОбъект, 
	ПолноеИмяРеквизита = "Список.Дата", ИмяЭлемента = "Дата") Экспорт
	
	ОбщегоНазначенияКлиентСервер.ПроверитьПараметр(
		"СтандартныеПодсистемыСервер.УстановитьУсловноеОформлениеПоляДата",
		"ЭтотОбъект", 
		ЭтотОбъект, 
		Тип("ФормаКлиентскогоПриложения"));
	
	ЧастиПолногоИмени = СтрРазделить(ПолноеИмяРеквизита, ".");
	
	Если ЧастиПолногоИмени.Количество() <> 2 Тогда 
		// Недопустимое значение параметра ПолноеИмяРеквизита.
		// Имя реквизита должно быть в формате ""<ИмяСписка>.<ИмяПоля>""'");
		Возврат;
	КонецЕсли;
	
	ИмяСписка = ЧастиПолногоИмени[0];
	РеквизитСписок = ЭтотОбъект[ИмяСписка];
	
	Если ТипЗнч(РеквизитСписок) = Тип("ДинамическийСписок") Тогда 
		// ДинамическийСписок позволяет установить условное оформление с помощью собственного компоновщика.
		// При этом параметр ИмяЭлемента игнорируется, потому что компоновщик динамического списка
		// не знает как будут отображены реквизиты списка, потому путем к реквизиту и значения отбора и оформления 
		// является имя реквизита динамического списка.
		УсловноеОформление = РеквизитСписок.УсловноеОформление;
		ПутьКРеквизиту = ЧастиПолногоИмени[1];
		ИмяОформляемогоПоля = ПутьКРеквизиту;
	Иначе 
		// Остальные списки, например, ДанныеФормыДерево:
		// не имеют собственного компоновщика, потому используют компоновщик самой формы.
		УсловноеОформление = ЭтотОбъект.УсловноеОформление;
		ПутьКРеквизиту = ПолноеИмяРеквизита;
		ИмяОформляемогоПоля = ИмяЭлемента;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(УсловноеОформление.ИдентификаторПользовательскойНастройки) Тогда
		УсловноеОформление.ИдентификаторПользовательскойНастройки = "ОсновноеОформление";
	КонецЕсли;
	
	// По умолчанию используется представление "10.06.2012".
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Использование = Истина;
	ЭлементОформления.Представление = НСтр("ru = 'Представление даты: ""10.06.2012""'");
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Формат", "ДЛФ=D");
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяОформляемогоПоля);
	
	// Для сегодняшнего дня используется представления "09:46".
	ЭлементОформления = УсловноеОформление.Элементы.Добавить();
	ЭлементОформления.Использование = Истина;
	ЭлементОформления.Представление = НСтр("ru = 'Представление даты сегодня: ""09:46""'");
	ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Формат", "ДФ=ЧЧ:мм");
	
	ОформляемоеПоле = ЭлементОформления.Поля.Элементы.Добавить();
	ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(ИмяОформляемогоПоля);
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ПутьКРеквизиту);
	ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.БольшеИлиРавно;
	ЭлементОтбора.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоЭтогоДня);
	
	ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
	ЭлементОтбора.ЛевоеЗначение  = Новый ПолеКомпоновкиДанных(ПутьКРеквизиту);
	ЭлементОтбора.ВидСравнения   = ВидСравненияКомпоновкиДанных.Меньше;
	ЭлементОтбора.ПравоеЗначение = Новый СтандартнаяДатаНачала(ВариантСтандартнойДатыНачала.НачалоСледующегоДня);
	
КонецПроцедуры

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

ТекущаяДатаНаСервере

ОбщийМодуль.УправлениеДоступомСлужебный
Автор: 1С
Функция ТекущаяДатаНаСервере() Экспорт
	
	Возврат ТекущаяДата(); // Тут должна быть ТекущаяДата сервера, т.к. именно она записывается в журнал регистрации.
	
КонецФункции

///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

Конвертация даты из формата ISO8601 в дату 1С с учетом миллисекунд

Возвращает структуру с полями "Дата" и "Миллисекунды", стандартный способ преобразования даты округляет время, а в некоторых случаях важна особая точность
Функция КонвертироватьДатуISO8601ВДату(Дата) Экспорт

	КонвертированнаяДата = Новый Структура("Дата, Миллисекунды");
	
	АвтоконвертированнаяДата = XMLЗначение(Тип("Дата"), Дата);

	Миллисекунды = Сред(Дата, 21);
	Миллисекунды = СокрЛП(СтрЗаменить(Миллисекунды, "Z", ""));

	Если НЕ ПустаяСтрока(Миллисекунды) Тогда
		
		ЧислоМиллисекунд = Число(Миллисекунды);
		
		Если ЧислоМиллисекунд >= 500 Тогда
			
			АвтоконвертированнаяДата = АвтоконвертированнаяДата - 1;
			
		КонецЕсли;
		
	КонецЕсли;
	
	КонвертированнаяДата.Дата = АвтоконвертированнаяДата;
	
	КонвертированнаяДата.Миллисекунды = Миллисекунды;
	
	Возврат КонвертированнаяДата;

КонецФункции 

описание даты в таблице значений

описание даты в таблице значений
Андрей 23 4
Новый ОписаниеТипов ("Дата", , , Новый КвалификаторыДаты(ЧастиДаты.Дата))

Дата создания ссылки

Получение даты и времени по ГУИДу ссылки
acsent 82 15
Функция ДатаСозданияСсылки(Ссылка) Экспорт
	
	Если НЕ ЗначениеЗаполнено(Ссылка) Тогда
		Возврат Неопределено;
	КонецЕсли;	
		
	Момент = Дата(1, 1, 1);
	Попытка
		
        УИ = Строка(Ссылка.УникальныйИдентификатор());
        УИ = ВРег(СтрЗаменить(УИ,"-",""));
		
		Если Сред(УИ, 13, 1) = "1" Тогда
			
            Значение16 = ВРег(Сред(УИ, 14, 3) + Сред(УИ, 9, 4) + Сред(УИ, 1, 8));
            Цифры16    = "123456789ABCDEF";
            Значение10 = 0;
            Длина16    = СтрДлина(Значение16);
			
			Для Ном = 1 По Длина16 Цикл
                Значение10 = Значение10 + Pow(16, Длина16-Ном)*Найти(Цифры16, Сред(Значение16, Ном, 1));
			КонецЦикла;
			
            Значение10 = Значение10/10000000;
            Момент     = Дата(1582, 10, 15, 3, 0, 0) + Значение10;
			
		КонецЕсли;
		
    Исключение
    КонецПопытки;
	
	Возврат Момент;
		
КонецФункции