Только качественный контент |
Пример расчета даты оплаты в банковских днях
Собственно это только формула расчета, смысл которой сводится к преобразованию банковских дней в календарные для конфигурации без производственного календаря. Если в конфигурации есть календарь, то правильнее использовать его, ведь в праздничные дни банк тоже не работает.
////////////////////////////////////////////////////////////////////////////////
// Расчет даты оплаты при указании периода в банковских днях
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ДатаДокумента, НЕДЕЛЯ), ДЕНЬ, ВЫБОР
КОГДА (ВЫРАЗИТЬ((ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 КАК ЧИСЛО(15, 0)))
- (ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 >= 0
ТОГДА (ВЫРАЗИТЬ((ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 КАК ЧИСЛО(15, 0))) - 1
ИНАЧЕ ВЫРАЗИТЬ((ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 КАК ЧИСЛО(15, 0))
КОНЕЦ * 7 + (ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней - ВЫБОР
КОГДА (ВЫРАЗИТЬ((ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 КАК ЧИСЛО(15, 0)))
- (ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 >= 0
ТОГДА (ВЫРАЗИТЬ((ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 КАК ЧИСЛО(15, 0))) - 1
ИНАЧЕ ВЫРАЗИТЬ((ДЕНЬНЕДЕЛИ(&ДатаДокумента) + &БанковскихДней) / 5 КАК ЧИСЛО(15, 0))
КОНЕЦ * 5) - 1) КАК Дата
Просто календарик в диапазоне дат до 2739 лет
Это очень быстрый вариант формирования списка дат запросом. Если найдете вариант, который работает быстрее в файловой и в SQL версии 1С:Предприятия 8, то сообщите мне пожалуйста.
////////////////////////////////////////////////////////////////////////////////
// Единицы для календаря
ВЫБРАТЬ 0 КАК Цифра ПОМЕСТИТЬ Единицы
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9;
////////////////////////////////////////////////////////////////////////////////
// Десятки для календаря. Диапазон дат 3 месяца
ВЫБРАТЬ Десятки.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Десятки ИЗ Единицы КАК Десятки
ГДЕ Десятки.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Сотни для календаря. Диапазон дат 2,5 года
ВЫБРАТЬ Сотни.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Сотни ИЗ Десятки КАК Сотни
ГДЕ Сотни.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Тысячи для календаря. Диапазон дат 27 лет
ВЫБРАТЬ Тысячи.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Тысячи ИЗ Сотни КАК Тысячи
ГДЕ Тысячи.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Десятки тысяч для календаря. Диапазон дат 273 года
ВЫБРАТЬ ДесяткиТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ ДесяткиТысяч ИЗ Тысячи КАК ДесяткиТысяч
ГДЕ ДесяткиТысяч.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Сотни тысяч для календаря. Диапазон дат 2739 лет
ВЫБРАТЬ СотниТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ СотниТысяч ИЗ ДесяткиТысяч КАК СотниТысяч
ГДЕ СотниТысяч.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Полный ряд до 100
ВЫБРАТЬ Десятки.Цифра + Единицы.Цифра КАК Цифра
ПОМЕСТИТЬ ДоСотни ИЗ Десятки КАК Десятки, Единицы КАК Единицы;
////////////////////////////////////////////////////////////////////////////////
// Старшие до 10000
ВЫБРАТЬ Тысячи.Цифра + Сотни.Цифра КАК Цифра
ПОМЕСТИТЬ ДоДесятиТысяч ИЗ Тысячи КАК Тысячи, Сотни КАК Сотни;
////////////////////////////////////////////////////////////////////////////////
// Полный ряд до 10000
ВЫБРАТЬ ДоДесятиТысяч.Цифра + ДоСотни.Цифра КАК Цифра
ПОМЕСТИТЬ ПолныеДесятьТысяч ИЗ ДоДесятиТысяч КАК ДоДесятиТысяч, ДоСотни КАК ДоСотни;
////////////////////////////////////////////////////////////////////////////////
// Старшие до 1000000
ВЫБРАТЬ СотниТысяч.Цифра + ДесяткиТысяч.Цифра КАК Цифра
ПОМЕСТИТЬ ДоМиллиона ИЗ СотниТысяч КАК СотниТысяч, ДесяткиТысяч КАК ДесяткиТысяч;
////////////////////////////////////////////////////////////////////////////////
// Список дат календаря в диапазоне до 2739 лет
ВЫБРАТЬ ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), ДЕНЬ, ДоМиллиона.Цифра + ПолныеДесятьТысяч.Цифра) КАК ДатаПериода
ИЗ ДоМиллиона КАК ДоМиллиона, ПолныеДесятьТысяч КАК ПолныеДесятьТысяч
ГДЕ ДоМиллиона.Цифра + ПолныеДесятьТысяч.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ)
УПОРЯДОЧИТЬ ПО ДатаПериода;
Строковое представление дат в диапазоне до 2739 лет
Приведенный ниже пакет запросов формирует список строковых представлений дат за указанный период. Получилось забавно. Может быть ещё кому-нибудь пригодится.
////////////////////////////////////////////////////////////////////////////////
// Единицы и их строковое представление для календаря и списка дат
ВЫБРАТЬ 0 КАК Цифра, "0" КАК Образ ПОМЕСТИТЬ Единицы
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 1, "1" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 2, "2" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 3, "3"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 4, "4" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 5, "5" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 6, "6"
ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 7, "7" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 8, "8" ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ 9, "9";
////////////////////////////////////////////////////////////////////////////////
// Десятки и их строковое представление для календаря
ВЫБРАТЬ Десятки.Цифра * 10 КАК Цифра, Десятки.Образ КАК Образ
ПОМЕСТИТЬ ДесяткиДат ИЗ Единицы КАК Десятки;
////////////////////////////////////////////////////////////////////////////////
// Сотни и их строковое представление для календаря
ВЫБРАТЬ Сотни.Цифра * 10 КАК Цифра, Сотни.Образ КАК Образ
ПОМЕСТИТЬ СотниДат ИЗ ДесяткиДат КАК Сотни;
////////////////////////////////////////////////////////////////////////////////
// Тысячи и их строковое представление для календаря
ВЫБРАТЬ Тысячи.Цифра * 10 КАК Цифра, Тысячи.Образ КАК Образ
ПОМЕСТИТЬ ТысячиДат ИЗ СотниДат КАК Тысячи ГДЕ Тысячи.Цифра * 10 <= ГОД(&КонецПериода);
////////////////////////////////////////////////////////////////////////////////
// Представление дней календаря
ВЫБРАТЬ Десятки.Цифра + Единицы.Цифра КАК ЧислоДиапазона,
Десятки.Образ + Единицы.Образ КАК ОбразЧисла ПОМЕСТИТЬ Дни
ИЗ ДесяткиДат КАК Десятки, Единицы КАК Единицы ГДЕ Десятки.Цифра + Единицы.Цифра <= 31;
////////////////////////////////////////////////////////////////////////////////
// Представление месяцев календаря
ВЫБРАТЬ Десятки.Цифра + Единицы.Цифра КАК ЧислоДиапазона,
Десятки.Образ + Единицы.Образ КАК ОбразЧисла ПОМЕСТИТЬ Месяцы
ИЗ ДесяткиДат КАК Десятки, Единицы КАК Единицы ГДЕ Десятки.Цифра + Единицы.Цифра <= 12;
////////////////////////////////////////////////////////////////////////////////
// Представление лет календаря
ВЫБРАТЬ Тысячи.Цифра + Сотни.Цифра + Десятки.Цифра + Единицы.Цифра КАК ЧислоДиапазона,
Тысячи.Образ + Сотни.Образ + Десятки.Образ + Единицы.Образ КАК ОбразЧисла ПОМЕСТИТЬ Года
ИЗ ТысячиДат КАК Тысячи, СотниДат КАК Сотни, ДесяткиДат КАК Десятки, Единицы КАК Единицы
ГДЕ Тысячи.Цифра + Сотни.Цифра + Десятки.Цифра + Единицы.Цифра МЕЖДУ ГОД(&НачалоПериода)
И ГОД(&КонецПериода);
////////////////////////////////////////////////////////////////////////////////
// Тысячи для календаря. Диапазон дат 27 лет
ВЫБРАТЬ Тысячи.Цифра * 10 КАК Цифра ПОМЕСТИТЬ Тысячи ИЗ СотниДат КАК Тысячи
ГДЕ Тысячи.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Десятки тысяч для календаря. Диапазон дат 273 года
ВЫБРАТЬ ДесяткиТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ ДесяткиТысяч ИЗ Тысячи КАК ДесяткиТысяч
ГДЕ ДесяткиТысяч.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Сотни тысяч для календаря. Диапазон дат 2739 лет
ВЫБРАТЬ СотниТысяч.Цифра * 10 КАК Цифра ПОМЕСТИТЬ СотниТысяч ИЗ ДесяткиТысяч КАК СотниТысяч
ГДЕ СотниТысяч.Цифра * 10 <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Полный ряд до 100
ВЫБРАТЬ Десятки.Цифра + Единицы.Цифра КАК Цифра
ПОМЕСТИТЬ ДоСотни ИЗ ДесяткиДат КАК Десятки, Единицы КАК Единицы;
////////////////////////////////////////////////////////////////////////////////
// Старшие до 10000
ВЫБРАТЬ Тысячи.Цифра + Сотни.Цифра КАК Цифра
ПОМЕСТИТЬ ДоДесятиТысяч ИЗ Тысячи КАК Тысячи, СотниДат КАК Сотни;
////////////////////////////////////////////////////////////////////////////////
// Полный ряд до 10000
ВЫБРАТЬ ДоДесятиТысяч.Цифра + ДоСотни.Цифра КАК Цифра
ПОМЕСТИТЬ ПолныеДесятьТысяч ИЗ ДоДесятиТысяч КАК ДоДесятиТысяч, ДоСотни КАК ДоСотни;
////////////////////////////////////////////////////////////////////////////////
// Старшие до 1000000
ВЫБРАТЬ СотниТысяч.Цифра + ДесяткиТысяч.Цифра КАК Цифра
ПОМЕСТИТЬ ДоМиллиона ИЗ СотниТысяч КАК СотниТысяч, ДесяткиТысяч КАК ДесяткиТысяч;
////////////////////////////////////////////////////////////////////////////////
// Список дат в диапазоне до 2739 лет
ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&НачалоПериода, ДЕНЬ, ДоМиллиона.Цифра + ПолныеДесятьТысяч.Цифра) КАК ДатаПериода
ПОМЕСТИТЬ Даты ИЗ ДоМиллиона КАК ДоМиллиона, ПолныеДесятьТысяч КАК ПолныеДесятьТысяч
ГДЕ ДоМиллиона.Цифра + ПолныеДесятьТысяч.Цифра <= РАЗНОСТЬДАТ(&НачалоПериода, &КонецПериода, ДЕНЬ);
////////////////////////////////////////////////////////////////////////////////
// Список со строковыми представлениями дат из списка
ВЫБРАТЬ "Строка: " + Дни.ОбразЧисла + "." + Месяцы.ОбразЧисла + "."
+ Года.ОбразЧисла КАК ПредставлениеСтроки ИЗ Даты КАК Даты
ЛЕВОЕ СОЕДИНЕНИЕ Дни КАК Дни ПО (ДЕНЬ(Даты.ДатаПериода) = Дни.ЧислоДиапазона)
ЛЕВОЕ СОЕДИНЕНИЕ Месяцы КАК Месяцы ПО (МЕСЯЦ(Даты.ДатаПериода) = Месяцы.ЧислоДиапазона)
ЛЕВОЕ СОЕДИНЕНИЕ Года КАК Года ПО (ГОД(Даты.ДатаПериода) = Года.ЧислоДиапазона)
УПОРЯДОЧИТЬ ПО Даты.ДатаПериода
Ещё о хитрых запросах можно почитать здесь.
Для раскрашивания текстов запросов в статье использована Разукрашка.