Страница 1 из 3 1 2 3 ПоследняяПоследняя
Показано с 1 по 12 из 30
  1. #1
    Продвинутый пользователь Аватар для Гарольд
    Регистрация
    17.11.2006
    Возраст
    52
    Сообщений
    7,838
    Положительные оценки/Отрицательные оценки
    Получено: 5,792/26
    Дано: 6,041/14
    Вес репутации
    60

    По умолчанию Индийский код в 1-с

    Столкнулся намедни, перетряхивая "Рарус" на 1с-7

    Программисту нужно было посчитать время работы транспорта в ночное время.
    Разобрал алгоритм, вот как то так :)

    Цикл по минута от временивыезда до времениприбытия;

    Если время(Минута) находится в интервале времени (от 22 вечера до 24 вечера)или(от 0 до 6 утра) то Ночные=Ночные+1; КонецЕсли;
    Минута=минута+1;

    КонецЦикла;
    Не, оно работает (там потом еще прикол в том, что минуты считаются в десятичном формате,сотыми долями и предварительно приводятся к десятичному счислению (типа 100 минут, вероятно дабы не проверять на больше 60)..

    Но каким пОтом дается машине пересчет например обработка рейсов гаража с начала года ...процессор на глазах раскаляется :)

    Ведь можно было вычислить гораздо проще и без перебора всего времени работы..

    Вот пока будут платить за количество строк - будем недоумевать - чего оно так долго считается...:)

    3 Недоступно! Недоступно!
    Я не храплю! Мне снятся мотоциклы!


  2. #2
    Пользователь Аватар для ElSonador
    Регистрация
    06.11.2012
    Возраст
    35
    Сообщений
    332
    Положительные оценки/Отрицательные оценки
    Получено: 250/69
    Дано: 372/185
    Вес репутации
    0

    По умолчанию

    Экономия на условиях.

    Элегантное решение в своём роде.

    0 Недоступно! Недоступно!

  3. #3
    Продвинутый пользователь Аватар для Мать Тереза
    Регистрация
    09.08.2008
    Возраст
    54
    Сообщений
    3,894
    Положительные оценки/Отрицательные оценки
    Получено: 5,050/20
    Дано: 5,497/30
    Вес репутации
    47

    По умолчанию

    Долговато будет.
    Если отказаться от перебора, то условий больше придется нарисовать. Но они же не будут работать в цикле. Поэтому в итоге меньше сравнений будет.

    1 Недоступно! Недоступно!
    О женской логике хотя бы говорят! О мужской - вообще ничего не известно!

  4. #4
    Продвинутый пользователь Аватар для Гарольд
    Регистрация
    17.11.2006
    Возраст
    52
    Сообщений
    7,838
    Положительные оценки/Отрицательные оценки
    Получено: 5,792/26
    Дано: 6,041/14
    Вес репутации
    60

    По умолчанию

    Цитата Сообщение от ElSonador Посмотреть сообщение
    Экономия на условиях.

    Элегантное решение в своём роде.
    Ну не знаю! Заменил на НочноеВремя = 8*(ДатаПрибытия - ДатаВыезда) - полные часы ночные.
    Ну и 4 условия (Если) на день выезда и приезда, если выехал-приехал ночью и для обсчёта минут. И никаких циклов :)

    0 Недоступно! Недоступно!
    Я не храплю! Мне снятся мотоциклы!

  5. #5
    Продвинутый пользователь Аватар для Мать Тереза
    Регистрация
    09.08.2008
    Возраст
    54
    Сообщений
    3,894
    Положительные оценки/Отрицательные оценки
    Получено: 5,050/20
    Дано: 5,497/30
    Вес репутации
    47

    По умолчанию

    Грубо так:
    Если (ВремяДатаНачала не в интервале) и (ВремяДатаКонца не в Интервале) и (ДатаНачала = ДатаКонца) Тогда
    Ночные = 0;
    ИначеЕсли (ВремяДатаНачала не в Интервале) и (ВремяДатаКонца в Интервала) Тогда
    Ночные = ВремяДатаКонца - ВремяДатаНачалаИнтервала;
    ИначеЕсли (ВремяДатаНачала в Интервале) и (ВремяДатаКонца не в Интервала) Тогда
    Ночные = ВремяДатаКонцаИнтервала - ВремяДатаНачала;
    ИначеЕсли (ВремяДатаНачала в Интервале) и (ВремяДатаКонца в Интервала) Тогда
    Ночные = ВремяДатаКонца - ВремяДатаНачала;
    Иначе
    Ночные = 28800;
    КонецЕсли;

    Ночные = Ночные/3600;

    - - - Добавлено - - -

    Правда, многосуточные рейсы не учитывала.

    1 Недоступно! Недоступно!
    О женской логике хотя бы говорят! О мужской - вообще ничего не известно!

  6. #6
    Пользователь Аватар для ElSonador
    Регистрация
    06.11.2012
    Возраст
    35
    Сообщений
    332
    Положительные оценки/Отрицательные оценки
    Получено: 250/69
    Дано: 372/185
    Вес репутации
    0

    По умолчанию

    Да, как-то так.

    Цитата Сообщение от Мать Тереза Посмотреть сообщение
    Правда, многосуточные рейсы не учитывала.
    В духе исходного кода: разбить по суткам и... дальше вы поняли.

    0 Недоступно! Недоступно!

  7. #7
    Продвинутый пользователь Аватар для Гарольд
    Регистрация
    17.11.2006
    Возраст
    52
    Сообщений
    7,838
    Положительные оценки/Отрицательные оценки
    Получено: 5,792/26
    Дано: 6,041/14
    Вес репутации
    60

    По умолчанию

    Я не стал ломать систему целое-часы, дробное-минуты( в путевом листе так заводится время), получилось вот что..

    НочныеЧасы = 8*(ДатаВозврата-ДатаВыезда); // Целых суток

    // Далее - только день отлёта-день прилёта :)

    Если ВремяВыезда < 6 Тогда //Выехал утром
    НочныеЧасы=НочныеЧасы+(6 - ВремяВыезда);
    Если (ВремяВыезда-Цел(ВремяВыезда) <> 0) Тогда
    НочныеЧасы=НочныеЧасы-0.4 ;// корректируем, десятичные минуты после минусовки вылазят в 0.40-0.99
    КонецЕсли;
    КонецЕсли;
    Если ВремяВыезда >=22 Тогда //Выехал вечером
    НочныеЧасы=НочныеЧасы+(24 - ВремяВыезда);
    Если (ВремяВыезда-Цел(ВремяВыезда) <> 0) Тогда
    НочныеЧасы=НочныеЧасы-0.4 ;//минуты 0.40-0.99
    КонецЕсли;
    Конецесли;

    Если ВремяВозврата <=6 Тогда // Приехал утром
    НочныеЧасы=НочныеЧасы+(ВремяВозврата-6);
    КонецЕсли;
    Если ВремяВозврата >22 Тогда
    НочныеЧасы=НочныеЧасы+(ВремяВозврата-22); // Приехал ночью
    Конецесли;

    Если (НочныеЧасы-Цел(НочныеЧасы)) = 0.6 Тогда
    // когда минуты выезда=минутам приезда - просчитывает как 0.60 минут = 1 час.
    НочныеЧасы=НочныеЧасы+0.4;
    КонецЕсли;

    //****

    Мож и корявенько, но все таки быстрее чем по минутке :)
    Многовложенные конструкции ИначеЕсли не очень нравятся... Если можно - стараюсь без них..

    0 Недоступно! Недоступно!
    Я не храплю! Мне снятся мотоциклы!

  8. #8
    Продвинутый пользователь Аватар для Гарольд
    Регистрация
    17.11.2006
    Возраст
    52
    Сообщений
    7,838
    Положительные оценки/Отрицательные оценки
    Получено: 5,792/26
    Дано: 6,041/14
    Вес репутации
    60

    По умолчанию

    Касательно обновления валюты в 1с7.
    В исходнике привязка к сайту РБК.
    Но там не всегда вовремя обновляют список. Особенно в последнее время..

    Сделал свой "Индийский код" по разбору ХТМЛ-кода (вернее, по выкидыванию тегов и добыче цифирок) с сайта ЦБ РФ, мож кому пригодится.. Обновляются только USD и EUR, можно любые другие - код валюты надо указать.
    На основе первоначальной обработки ИППКурсыВалютРБК. В принципе можно объединить, брать валюты там и там (где получится :) ).

    "Какая разница..Главное - взяли" (с) Соловейчик "Особенности охоты"

    Функция ВыделитьПодСтроку(ИсхСтр,Символ)
    Перем Стр;
    Поз=Найти(ИсхСтр,Символ);
    Если Поз>0 Тогда
    Стр=Лев(ИсхСтр,Поз-1);
    ИсхСтр=Сред(ИсхСтр,Поз+1);
    Иначе
    Стр=ИсхСтр;
    ИсхСтр="";
    КонецЕсли;
    Возврат Стр;
    КонецФункции // ВыделитьПодСтроку

    Процедура Загрузить()

    Валюта=СоздатьОбъект("Справочник.Валюты");
    Стр = "";
    МахДата = Дата(0);
    Для Н=1 По СписокВалют.РазмерСписка() Цикл
    Если СписокВалют.Пометка(Н)=0 Тогда
    Продолжить;
    КонецЕсли;
    ВалютаТМП = СписокВалют.ПолучитьЗначение(Н);
    Если (Результат=1)И(Авто=0) Тогда
    Сообщить("Загрузка курсов валюты: "+ВалютаТМП+" с сайта ЦБРФ");
    Сообщить("Дата"+СимволТабуляции+СимволТабуляции+"Курс"+СимволТабуляции+"Кратность");
    КонецЕсли;
    Если Авто=1 Тогда
    Состояние("Загрузка курсов валюты: "+ВалютаТМП+" с сайта ЦБРФ");
    КонецЕсли;

    Если (ВалютаТМП.Наименование="EUR") Тогда
    КодВалюты="R01239";
    КонецЕсли;
    Если (ВалютаТМП.Наименование="USD") Тогда
    КодВалюты="R01235";
    КонецЕсли;
    Адрес = "http://www.cbr.ru/scripts/XML_dynamic.asp?VAL_NM_RQ="; //
    АдресНачДата ="&date_req1="+Формат(ДатаЧисло(НачДата),"Ч(0)2.0")+"/"+Формат(ДатаМесяц(НачДата),"Ч(0)2.0")+"/"+ДатаГод(КонДата);
    АдресКонДата ="&date_req2="+Формат(ДатаЧисло(КонДата),"Ч(0)2.0")+"/"+Формат(ДатаМесяц(КонДата),"Ч(0)2.0")+"/"+ДатаГод(КонДата);
    Адрес = Адрес + КодВалюты + АдресНачДата + АдресКонДата ;
    Попытка
    Соединение.ПолучитьКакСтроку(Адрес,Стр);
    Исключение
    Сообщить("Неудачная попытка соединения.");
    КонецПопытки;
    Текст=СоздатьОбъект("Текст");
    Текст.ДобавитьСтроку(Стр);


    Курсы=СоздатьОбъект("Периодический");
    Курсы.ИспользоватьОбъект("Курс",ВалютаТМП);
    Кратности=СоздатьОбъект("Периодический");
    Кратности.ИспользоватьОбъект("Кратность",ВалютаТМП);

    НачальныйКурс=0;
    НачальнаяКратность=0;
    НачальнаяДатаКурса=Дата(0);
    НачатьТранзакцию();

    // <ValCurs ID="R01235" DateRange1="02/03/2015" DateRange2="04/03/2015" name="Foreign Currency Market Dynamic">

    Для Инд=3 По Текст.КоличествоСтрок() Цикл //первые две строки пропускаем, заголовок.

    Стр=Текст.ПолучитьСтроку(Инд);

    //Получаем дату курса
    ДатаКурсаСтр=ВыделитьПодстроку(Стр,Симв(34));
    ДатаКурсаСтр=ВыделитьПодстроку(Стр,Симв(34));

    Если НачДата=КонДата Тогда
    ДатаКурса=КонДата;
    Иначе
    ДатаКурса=Дата(ДатаКурсаСтр);
    КонецЕсли;
    //Кратность
    КратностьСтр=ВыделитьПодстроку(Стр,">");
    КратностьСтр=ВыделитьПодстроку(Стр,">");
    КратностьСтр=ВыделитьПодстроку(Стр,"<");
    Кратность=Число(КратностьСтр);
    //Собственно курс
    КурсСтр=ВыделитьПодстроку(Стр,">");
    КурсСтр=ВыделитьПодстроку(Стр,">");
    КурсСтр=ВыделитьПодстроку(Стр,"<");
    КурсСтр=СтрЗаменить(КурсСтр,",", "."); // заменяем запятые на точку (дробь)
    Курс=Число(КурсСтр);

    Если ДатаКурса>КонДата Тогда
    Прервать;
    КонецЕсли;

    Если ДатаКурса<НачДата Тогда //Запоминание курса на начало интервала
    Продолжить;
    КонецЕсли;

    Курсы.ВыбратьЗначения(ДатаКурса,ДатаКурса);
    Курсы.ПолучитьЗначение();
    Кратности.ВыбратьЗначения(ДатаКурса,ДатаКурса);
    Кратности.ПолучитьЗначение();
    Если (Курс<>Курсы.Значение) или (Кратность<>ВалютаТМП.Кратность.Получить(ДатаКурса)) Тогда
    Курсы.ДатаЗнач=ДатаКурса;
    Курсы.Значение=Курс;
    Курсы.Записать();
    Кратности.ДатаЗнач=ДатаКурса;
    Кратности.Значение=Кратность;
    Если ВалютаТМП.Кратность.Получить(ДатаКурса)<>Кратность Тогда
    Кратности.Записать();
    КонецЕсли;
    Если (Результат=1)И(Авто=0) Тогда
    Сообщить(Строка(ДатаКурса)+СимволТабуляции+Курс +СимволТабуляции+СимволТабуляции+ Кратность,"I");
    КонецЕсли;
    МахДата = макс(ДатаКурса,МахДата);
    КонецЕсли;
    Если (Результат=1)И(Авто=0) Тогда
    Состояние("Загрузка курса на "+ДатаКурса+" - "+Курс);
    КонецЕсли;
    КонецЦикла;
    ЗафиксироватьТранзакцию();
    КонецЦикла;
    ОбновитьСписокВалют();
    Если Авто=0 Тогда
    Предупреждение("Загрузка курсов закончена!",3);
    Иначе
    Состояние("Загрузка курсов закончена!");
    КонецЕсли;
    СохранитьЗначение("ДатаСкачиванияКурсовВалют",МахДата);
    КонецПроцедуры // Загрузить

    0 Недоступно! Недоступно!
    Я не храплю! Мне снятся мотоциклы!

  9. #9
    Продвинутый пользователь
    Регистрация
    14.05.2011
    Сообщений
    1,168
    Положительные оценки/Отрицательные оценки
    Получено: 2,503/31
    Дано: 743/8
    Вес репутации
    35

    По умолчанию

    )) ничего не имею против 1С, но выглядит забавно, особенно обработка исключений))

    Попытка
    Соединение.ПолучитьКакСтроку(Адрес,Стр);
    Исключение
    Сообщить("Неудачная попытка соединения.");
    КонецПопытки;
    Попытка - Конец попытки)) Надо будет запомнить и при случае употребить)

    1 Недоступно! Недоступно!

  10. #10
    Пользователь Аватар для Ahton
    Регистрация
    07.11.2008
    Сообщений
    255
    Положительные оценки/Отрицательные оценки
    Получено: 210/0
    Дано: 7/0
    Вес репутации
    39

    По умолчанию

    Синтаксис на питона похож, просто пипец :)
    Мне в питоне нравится как исключения построены - очень приятно писать код :)

    0 Недоступно! Недоступно!

  11. #11
    Продвинутый пользователь Аватар для Гарольд
    Регистрация
    17.11.2006
    Возраст
    52
    Сообщений
    7,838
    Положительные оценки/Отрицательные оценки
    Получено: 5,792/26
    Дано: 6,041/14
    Вес репутации
    60

    По умолчанию

    Цитата Сообщение от Ahton Посмотреть сообщение
    Синтаксис на питона похож, просто пипец :)
    Вообщето это не синтаксис, а структурирование модуля для более удобочитаемости.
    Можно и в одну строку нашлёпать, как письмо без абзацев.
    Но будет очень нечитаемо.



    Цитата Сообщение от ireg Посмотреть сообщение
    ) ничего не имею против 1С, но выглядит забавно, особенно обработка исключений))

    Попытка - Конец попытки)) Надо будет запомнить и при случае употребить)
    Это делается чтоб код не завис на ожидании события (например в данном случае - соединение с сайтом)

    0 Недоступно! Недоступно!
    Я не храплю! Мне снятся мотоциклы!

  12. #12
    Продвинутый пользователь
    Регистрация
    14.05.2011
    Сообщений
    1,168
    Положительные оценки/Отрицательные оценки
    Получено: 2,503/31
    Дано: 743/8
    Вес репутации
    35

    По умолчанию

    Цитата Сообщение от Гарольд Посмотреть сообщение
    Это делается чтоб код не завис на ожидании события
    Гарольд, я не о задаче, не об алгоритме и способе обработки ошибок) я именно про синтаксис самого языка.

    0 Недоступно! Недоступно!

Страница 1 из 3 1 2 3 ПоследняяПоследняя

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •