//*******************************************
Функция глВычислитьНомерБлокаС(ммЧас, ммМинуты) Экспорт
// Алгоритм: // сколько минут со 00:00 = 9*60 + (0.30*100)
// 12:45 - 9:00 = 3:45
// (3:45 / мп) - 1 = БлокС
ммЧасЧисло = Число(ммЧас);
ммМинутыЧисло = Число(ммМинуты);
ммВремяВМинутахТочка = ммЧасЧисло * 60 + ммМинутыЧисло;
ммВремяВМинутахНачало = Цел(глНачалоРаботы) * 60 + ((глНачалоРаботы - Цел(глНачалоРаботы)) * 100);
ммРазницаВМинутах = ммВремяВМинутахТочка - ммВремяВМинутахНачало;
ммРазницаВБлоках = Цел(ммРазницаВМинутах / глШагРасписания);
ммБлокС = ммРазницаВБлоках + 1;
Возврат ммБлокС;
КонецФункции
//*******************************************
Функция глВычислитьНомерБлокаПо(ммЧас, ммМинуты) Экспорт
ммЧасЧисло = Число(ммЧас);
ммМинутыЧисло = Число(ммМинуты);
ммВремяВМинутахТочка = ммЧасЧисло * 60 + ммМинутыЧисло;
ммВремяВМинутахНачало = Цел(глНачалоРаботы) * 60 + ((глНачалоРаботы - Цел(глНачалоРаботы)) * 100);
ммРазницаВМинутах = ммВремяВМинутахТочка - ммВремяВМинутахНачало;
ммРазницаВБлоках = Цел(ммРазницаВМинутах / глШагРасписания);
ммБлокПо = ммРазницаВБлоках + 0;
Возврат ммБлокПо;
КонецФункции
//*******************************************
Функция глВычислитьВремяНачПоБлоку(НомерБлока) Экспорт
ммВремяВМинутахНачало = Цел(глНачалоРаботы) * 60 + ((глНачалоРаботы - Цел(глНачалоРаботы)) * 100); // 540
ммВремяВМинутахТочка = ммВремяВМинутахНачало + ((НомерБлока - 1) * глШагРасписания); // 570
ммВремяВЧасахТочка = ммВремяВМинутахТочка / 60; // 9.5
ммТочкаВремяЧасы = Цел(ммВремяВЧасахТочка); // 9
ммТочкаВремяМинуты = Цел((ммВремяВЧасахТочка - ммТочкаВремяЧасы) * 60); // 0.30
ммТочкаВремяЧасы = Прав("00" + ммТочкаВремяЧасы, 2);
ммТочкаВремяМинуты = Прав("00" + ммТочкаВремяМинуты, 2);
Результат = ммТочкаВремяЧасы + ":" + ммТочкаВремяМинуты;
Возврат Результат;
КонецФункции
//*******************************************
Функция глВычислитьВремяКонПоБлоку(НомерБлока) Экспорт
ммВремяВМинутахНачало = Цел(глНачалоРаботы) * 60 + ((глНачалоРаботы - Цел(глНачалоРаботы)) * 100); // 540
ммВремяВМинутахТочка = ммВремяВМинутахНачало + ((НомерБлока + 0) * глШагРасписания); // 570
ммВремяВЧасахТочка = ммВремяВМинутахТочка / 60; // 9.5
ммТочкаВремяЧасы = Цел(ммВремяВЧасахТочка); // 9
ммТочкаВремяМинуты = Цел((ммВремяВЧасахТочка - ммТочкаВремяЧасы) * 60); // 0.30
ммТочкаВремяЧасы = Прав("00" + ммТочкаВремяЧасы, 2);
ммТочкаВремяМинуты = Прав("00" + ммТочкаВремяМинуты, 2);
Результат = ммТочкаВремяЧасы + ":" + ммТочкаВремяМинуты;
Возврат Результат;
КонецФункции
В конфигурации 1с7.7 Аналит.Стоматология используется причудливое хранение моментов записи на прием в виде номеров блоков времени с шагом в заданную минимальную продолжительность времени приема от времени начала приема. Ничего не понятно? Мне тоже было непонятно, пока суровая реальность не заставила разбираться с этим вопросом.
Итак, имеем константы: НачалоРаботы, КонецРаботы и МинимальнаяПродолжительность.
Например, дано НачалоРаботы = 9, КонецРаботы = 21 и МинимальнаяПродолжительность 30;
Итого получаем 21-9 -> 12*2 -> 24 блока в расписании рабочего дня.
Или, например, дано НачалоРаботы = 10, КонецРаботы = 18 и МинимальнаяПродолжительность 15;
Итого получаем 18-10 -> 8*4 -> 32 блока в расписании рабочего дня.
Итого: если пациент записан в первую клинику с 10:00 до 11:00, то запись о его приеме в первой базе будет храниться как: ВремяНач = 3 блок и ВремяКон = 4 блок.
Во второй же базе будет храниться как: ВремяНач = 1 блок и ВремяКон = 4 блок.
И этот замечательный пирог украшается хранением данных о приеме в реквизитах табличной части документа ЗаписьНаПрием, где время нач названо БлокС, а время кон БлокПо.
Я выше набросал 4 функции, которые позволяют конвертировать эту иезуитскую систему счисления в нормальное читабельное время и обратно. Если столкнетесь с задачами по этой конфигурации, то добавьте эти функции в глобальный модуль - их использование спасет немного вашего драгоценного времени.
Алоха. Всем добра и красивых, понятных алгоритмов.