Посчитать количество месяцев между датами 1с
Это почему? Потому что проверку не сделал, если НачДата > КонДата??
Тесты показали следующее: 1. Если первая дата равна к примеру 01.01.21, а вторая 01.01.05, то твоя функция виснет в бесконечном цикле. =) (хотя, конечно, и моя выдаёт отрицательное значение). 2. Замер производительности. Дата1 = 01.01.60, Дата2 = 31.12.05. Тест субъективен, конечно, т.к. запускался 1 раз, но всё равно, результат говорит сам за себя. Моя строка отрабатывает за 0,000520, а твоя за 0,000840!
Далеко копаешь, его функция на простом примере сыпется. ЗЫ Но в БЗ!
Тогда доработаем. Получаем: Сообщить((ДатаГод(КонДата)-ДатаГод(НачДата))*12+(ДатаМесяц(КонДата)-ДатаМесяц(НачДата))-?(ДатаЧисло(КонДата)<ДатаЧисло(НачДата),1,0));
Частный случай можно описать.. =) Нуу, давай ещё отдельными инструментами вычислять. =)))
а) на порядок медленней б) кое-где может и не заработать в) сертификацию не пройдёт
Тогда напрямую через ие, тока ие в самом начале конфы определить На порядок не медленнее, проверь
Гы. =) 1 тест. дата1 = 01.01.60, дата2 = 01.01.05. Результаты: моя за 0,000690, твоя за 0,000609. Супер! =) Жмём руки друг другу?
Воттттт такой толщины. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ____. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .____ . . . . . . . . . . . . . . ____(. . . . . . . . . . . . . . . ,
, . . . . . . . . / . . . . ) ____ . . . . . . _(____. . . . . . . _________/. . .(O . . . O). . ______/. . . . . . ._____). . . . . (______. . . . . . . . ________ < . . . . . .L . . . . . >_____ . . . . . . ._____) . . . . . . . (____ . . . . . . . / . . . . . . . . . . ______/. . ./. . . . . . .. . . . . . _____). . . . . . . . . (_________ /. . . . . . . . . . .’-, . . . . . . . ,-‘ . . . . . . . . _________) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .``
Добавишь проверку , проиграешь в скорости . Да и код твой куда более поганей моего .
Ты свою функцию то проверял, если . В цикле вешается. В курсе? А красивость кода - это личное дело каждого.
Нет. Просто перепутал местами даты. Попробуй Дата1=01.01.05, а дата2=01.01.60. Висяк гарантирую.. =)
+ Рупор, сегодня тяпница, давай не будем уже спорить, а? Или тебе надо, чтобы я признался, что твоё решение оптимизировано для читаемости и скорости работы? Аллилуя! Твоя функция - рулез, а моя - кривая недоделка. Чес слово! =)
Извини конечно но эти минусы и кучи скобок это лажа.
Твой монстр выполнялся 87.9%, Рупора - 6.11%, моя - 6% ровно. Делайте выводы.
Чего какие проценты, я не понял. ты его что в цикле крутил вместе с созданием объекта ?
Какой цикл? Твой вариант по определению будет тормозом. Чего спорить то? Скриншот выслать?
Я не спорю, что за проценты то ? Да и создание объекта недолжно входить в код, это должнобыть определено до(в начале конфы или обработки)
2 Давай для точности прокрути в цикле раз 10000, а создание объекта вынеси оттуда
Конечно! Я субъективно оценил решение в целом, а не отдельные операторы! полностью прав, но у меня сейчас нет времени это сделать. Тело модуля я уже запостил, так что кто-то из вас может поэкспериментировать.. Результаты в студию!
>>создание объекта недолжно входить в код Без создания объекта не работает .
Добрый день!Необходимо получить количество недель,месяцев,кварталов в периоде. Может кто сталкивался с такой задачей и сможет подсказать идею?Или может есть какая то стандартная функция?конфигурация не особо важна.
(1)неделя = 60*60*24*7 секунд
месяц = 60*60*24*7*4 секунд
квартал = 60*60*24*7*4*4 секунд
ДлительностьПериода = КонецДня(КонецПериода) - НачалоДня(НачалоПериода) (в секундах)
Если нужны полные недели месяцы кварталы, то сложнее.
Есть еще функция День(Дата), возвращающая номер дня в году. Количество недель в таком случае будет
(День(КонецПериода ) - День(НачалоПериода)+1)/7
(2) mymyka, Неа. А если период большой? Есть високосный год. не так все просто.
(3)это уже скорее к расчету количества полных периодов, вряд ли такая задача стоит.
ВЫБРАТЬ
РАЗНОСТЬДАТ(&Нач, &Кон, ГОД) КАК Лет,
РАЗНОСТЬДАТ(&Нач, &Кон, МЕСЯЦ) КАК Месяцев,
РАЗНОСТЬДАТ(&Нач, &Кон, ДЕНЬ) КАК Дней
(1) revril, ЗУП-овский производственный календарь и своя обработка, может так. Можно даже без своей обработки календарь, графики, ну и отчеты по ним.
РАЗНОСТЬДАТ - не стоит пользоваться для периодов типа РАЗНОСТЬДАТ(15.01.2015,01.02.2015, МЕСЯЦ) результат будет 1 хотя разница нифига не месяц РАЗНОСТЬДАТ(31.12.2014,01.01.2015, ГОД) будет 1 хотя разница нифига не полноценный год. Написал за 5 минут не особо парясь (аляповато но работает):
И опять изобретатели велосипедов учатся исключительно на своих ошибках.
НЕТ единого алгоритма расчета разницы дат в единицах крупнее недели, НЕТ! Ибо единицы эти не имеют фиксированного размера и потому в разных областях деятельности существуют свои, под свою специфику заточенные, РАЗНЫЕ алгоритмы расчет таких периодов, с разными правилами определения количества дней в единице измерения и разными же правилами определения полноты единицы измерения.
В качестве домашнего задания определите правильный ответ для вопроса: сколько месяцев и дней между 28 января и 28 марта?
1. Ровно 2 месяца.
2. 1 месяц и 28 дней.
3. 1 месяц и 29 дней.
2 месяца и 1 день (меня в задаче интересуют только полноценные календарные месяцы). Точнее чтобы было понятно если взять календарик и по нему посчитать.
с 28 по 31 января - 4 дня
1 полноценный февраль (насрать 28 или 29 дней)
28 дней марта (в марте 31)
28 + 4 = 32 (полноценный март 31 день)
Итого 2 месяца 1 день.
(11) GYlgamesh, и сколько будет между 01.01.2014 00:00:00 И 01.01.2015 00:00:00 ?
(13) spacecraft, Хах :))) Уел, такой вариант я не предусмотрел.
И кстати всё это видно из кода этой функции. Прежде чем трындеть про велосипеды потрудитесь на будущее хоть слегка изучить предмет критики. По коду видно что я даже не пытаюсь высчитывать количество дней месяца (ни среднее ни какое-либо ещё).
(12) GYlgamesh, прежде чем хамить разберитесь в вопросе. То, что вы не в теме не означает отсутствия темы. В моем вопросе ВСЕ ответы правильные. Просто они посчитаны по разным методикам. Если вы их не знаете, то это ваши проблемы, а не тех, кто вам про них рассказывает.
которая рассчитывает разность дат "как в запросе".
Преподаватель 1С
Санкт-Петербург
зарплата от 100 000 руб. до 120 000 руб.
Временный (на проект)
Разместил: E_Migachev Версии: | 7.x | 8.x | Дата: 18.03.2009 Прочитано: 24905
Похожие FAQ
Внешние источники данных 0
Почему данная возможность вызывает такой интерес? Любой человек, который программировал в 1С при этом достаточно неплохо знаком с SQL и хотя бы в общих чертах знаком с архитектурой и принципами разработки других технологических платформ для бизнес пр Заполнение табличного поля данными таблицы значений, полученной из SQL - Запроса 1
Процедура ЗаполнитьНажатие(Элемент) запрос = СоставитьЗапрос(); //Функция СоставитьЗапрос() возвращает строку запроса ТаблицаВывода = Новый ТаблицаЗначений; ТаблицаВывода.Очистить(); ТаблицаВывода = ЗапросКСкуль(CRM_MSSQL_Сервер,CRM_MSSQL_БазаДа Как программно изменить текст, цвет, фон ячейки или области табличного документа? 6
Ниже приведено несколько полезных шаблонов кода по работе с табличным документом: //Пример получения текста ячейки ПолеТабДок = ЭлементыФормы.тдПолеТабличногоДокумента; ПолеТабДок.Область("R1C2").Текст = спрНоменклатура.Наименование; ПолеТабДок Как соединить дату и время? 1
Функция СоединитьДатуИВремя(Дата, Время) Экспорт ДатаСтрока = Формат(Дата, " ДФ=" " ггггММдд" " " ); ВремяСтрока = Формат(Время, " ДФ=" " ЧЧммсс" " " ); Результат = Дата(ДатаСтрока + ВремяСтрока); Возврат Результат; КонецФункции Как сохранить значение в реестр Windows? 0
RegProv=ПолучитьCOMОбъект( " winmgmts:! . root default:StdRegProv" ); // Создадим ключ, установив значение в текущую дату RegProv.CreateKey(" 2147483649" ," Software 1C 1Cv8 Report" ); // создание раздела // Посмотреть все результаты поиска похожих
Еще в этой же категории
Момент Времени и Граница, назначение, примеры использования 38
Момент времени: Фирма 1С описывает так: Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методо Преобразование даты 1С в unixtime (Unix Time Stamp) 17
Как известно, unixtime содержит количество секунд, прошедших с 1 января 1970 года. Поэтому, для преобразования даты 1С в дату unixtime нам всего то нужно от нашей даты отнять дату 01.01.1970 и перевести получившееся значения в удобоваримый формат. Функция месяц прописью 11
// пример от glory01 А = Формат(20020820153309, " ДФ=ММММ" ) // А = " Август" А = Формат(ТекущаяДата(), " ДФ=ММММ" ) // А = " Март" Функция МесяцПрописью(НомерМесяца) Экспорт НомерМесяца=Число(НомерМесяца); Если НомерМесяца = 1 Тогда Воз Как вычислить разницу между двумя датами в месяцах 11
Функция РазницаДатВМесяцах(Дата1, Дата2) Экспорт ДатаНач = ?(Дата1 Дата2, Дата1, Дата2); ДатаКон = ?(Дата1 Дата2, Дата2, Дата1); Годы = Год( датаКон ) - Год( датаНач ); Месяцы = Месяц( датаКон ) - Месяц( датаНач ); Разность = месяцы + Как вычислить разницу между двумя датами в часах и минутах 10
Функция РазностьВремени(Время1, Время2); Разность = Время1 - Время2; Если Разность 0 Тогда Часов = Цел(Разность / 3600); Минут = Цел((Разность - Часов * 3600) / 60); Возврат Дата(1, 1, 1, Часов, Минут, 0); Иначе Возврат Дата(1,1,1,0,0,0); Посмотреть все в категории Работа с Датами (Временем)
17 правил для составления оптимального ЗАПРОСа к данным базы 1С 42
Для формирования и выполнения запросов к таблицам базы данных в платформе 1С используется специальный объект языка программирования Запрос . Создается этот объект вызовом конструкции Новый Запрос . Запрос удобно использовать, когда требуется получ 1C и Google Maps 20
была поставлена задача отображения на географической карте медицинских учреждений. После обзора предлагаемых решений был выбран сервис google. Но так же подобного рода подход будет работать и с картами сервиса yandex. Во время решения задачи было реш COM-подключение к базе 7.7 из 8.2 1С 6
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе=" D: ВашаБаза 1с77 " ; Пользователь= Cклонения по падежам 6
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) Результат = " " ; Google maps : вывод точек на карту и режим панорамы 7
В отличие от яндекс карт в GMaps можно использовать панорамы - за что им большой плюс! Надеюсь в яндексе прочитают этот пост и тоже когда-нибудь это сделают! Для клиента нужно было сделать вывод объектов на карту С возможностью просмотра панора Посмотреть все результаты поиска похожих
Еще в этой же категории
Момент Времени и Граница, назначение, примеры использования 38
Момент времени: Фирма 1С описывает так: Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методо Преобразование даты 1С в unixtime (Unix Time Stamp) 17
Как известно, unixtime содержит количество секунд, прошедших с 1 января 1970 года. Поэтому, для преобразования даты 1С в дату unixtime нам всего то нужно от нашей даты отнять дату 01.01.1970 и перевести получившееся значения в удобоваримый формат. Функция месяц прописью 11
// пример от glory01 А = Формат(20020820153309, " ДФ=ММММ" ) // А = " Август" А = Формат(ТекущаяДата(), " ДФ=ММММ" ) // А = " Март" Функция МесяцПрописью(НомерМесяца) Экспорт НомерМесяца=Число(НомерМесяца); Если НомерМесяца = 1 Тогда Воз Как вычислить разницу между двумя датами в месяцах 11
Функция РазницаДатВМесяцах(Дата1, Дата2) Экспорт ДатаНач = ?(Дата1 Дата2, Дата1, Дата2); ДатаКон = ?(Дата1 Дата2, Дата2, Дата1); Годы = Год( датаКон ) - Год( датаНач ); Месяцы = Месяц( датаКон ) - Месяц( датаНач ); Разность = месяцы + Как вычислить разницу между двумя датами в часах и минутах 10
Функция РазностьВремени(Время1, Время2); Разность = Время1 - Время2; Если Разность 0 Тогда Часов = Цел(Разность / 3600); Минут = Цел((Разность - Часов * 3600) / 60); Возврат Дата(1, 1, 1, Часов, Минут, 0); Иначе Возврат Дата(1,1,1,0,0,0); Посмотреть все в категории Работа с Датами (Временем)
Читайте также: