Программирование в 1С
|
|
eXceed | Дата: Понедельник, 16.04.2012, 13:35 | Сообщение # 46 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Поясните позязя этот пример на 1С. А то я мозг сломал.
Quote Трудно пользовать философию Model-view-controller
имхо в 1С MVC не реализуемо.
Quote гонять танками по грязи
За то он успешен. Гоняет на такой то божественной ниве по грязи, а не отращивает геморрой. Хотя...
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
tersus | Дата: Понедельник, 16.04.2012, 14:30 | Сообщение # 47 |
Генералиссимус
Группа: Гости
Сообщений: 2831
Статус: Offline
| Quote (eXceed) А то я мозг сломал.
Переводить,например 01.01.1901 -> 01.01.2001 Проблема 2000 года))))
Судьба даёт нам меньше, чем мы хотим, поэтому если просить мало, можно не получить вообще ничего.
|
|
| |
eXceed | Дата: Понедельник, 16.04.2012, 15:19 | Сообщение # 48 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Я понял что он переводит. Есть пример работы?
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
win32 | Дата: Понедельник, 16.04.2012, 18:22 | Сообщение # 49 |
Генерал-майор
Группа: Проверенные
Сообщений: 499
Статус: Offline
|
|
|
| |
Sanny | Дата: Понедельник, 16.04.2012, 19:07 | Сообщение # 50 |
Правдоборец
Группа: Гости
Сообщений: 6257
Статус: Offline
| Quote (eXceed) Поясните позязя этот пример на 1С. А то я мозг сломал. Сделано конечно топорно, но смысл сразу ясен.
На входе имеется строка например такая "16 04 12". Нужно преобразовать её в тип Дата.
Всё что написано в этой функции можно реализовать, например, вот так: Code Возврат ?(Число(Сред(Дата,7,1))>3,Дата("19"+Сред(Дата,7,2),Сред(Дата,4,2),Сред(Дата,1,2)),Дата("20"+Сред(Дата,7,2),Сред(Дата,4,2),Сред(Дата,1,2))); Нечитабельно, но зато одной строкой
Вот более элегантный вариант: Code Если Число(Сред(Дата,7,1))>3 Тогда Век = "19"; Иначе Век = "20"; КонецЕсли; ДатаЗначение = Дата(Век+Сред(Дата,7,2),Сред(Дата,4,2),Сред(Дата,1,2)); Возврат ДатаЗначение;
Пока это всё, что я придумал. Сейчас спрошу у камрадов 1Сников, может есть ещё более кошерный способ.
Теперь очередь за вами. Покажите как эта задача решается на питоне? Ну или на каких то других правильных языках.
У меня есть план - выпить столько, сколько смогу. Отличный план!
Сообщение отредактировал Sanny - Понедельник, 16.04.2012, 19:39 |
|
| |
Sanny | Дата: Понедельник, 16.04.2012, 21:21 | Сообщение # 51 |
Правдоборец
Группа: Гости
Сообщений: 6257
Статус: Offline
| Quote (eXceed) имхо в 1С MVC не реализуемо. Вполне реализуемо: http://infostart.ru/public/74872/ Просто необходимости как таковой нет.
У меня есть план - выпить столько, сколько смогу. Отличный план!
|
|
| |
tersus | Дата: Понедельник, 16.04.2012, 23:26 | Сообщение # 52 |
Генералиссимус
Группа: Гости
Сообщений: 2831
Статус: Offline
| Quote (Sanny) Пока это всё, что я придумал. Сейчас спрошу у камрадов 1Сников, может есть ещё более кошерный способ.
Теперь очередь за вами. Покажите как эта задача решается на питоне? Ну или на каких то других правильных языках.
Аналогично. ))) Закопайте тему. При быстрой разработке все средства хороши.
Судьба даёт нам меньше, чем мы хотим, поэтому если просить мало, можно не получить вообще ничего.
|
|
| |
Sanny | Дата: Понедельник, 16.04.2012, 23:37 | Сообщение # 53 |
Правдоборец
Группа: Гости
Сообщений: 6257
Статус: Offline
| Quote (tersus) Закопайте тему. Ну уж нет! Не успокоюсь пока не увижу реализации на питоне!
У меня есть план - выпить столько, сколько смогу. Отличный план!
|
|
| |
eXceed | Дата: Вторник, 17.04.2012, 11:41 | Сообщение # 54 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Отвечаю: Code # -*- coding: utf-8 -*-
__author__ = 'nobiiru'
import time
def main(): datestring = '16 04 12' print('Парсим строку и приводим к типу datetime') c = time.strptime(datestring, '%d %m %y') print('Преобразуем в нужный нам формат') print time.strftime('%d %b %Y', c) print('???\nНу ты понял :3')
if __name__ == "__main__": main()
/usr/bin/python /home/nobiiru/developing/python/datetimefun/datetimefun.py Парсим строку и приводим к типу datetime Преобразуем в нужный нам формат 16 Apr 2012 ??? Ну ты понял :3
Process finished with exit code 0
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
tersus | Дата: Вторник, 17.04.2012, 13:31 | Сообщение # 55 |
Генералиссимус
Группа: Гости
Сообщений: 2831
Статус: Offline
| Quote (Sanny) Ну уж нет! Не успокоюсь пока не увижу реализации на питоне! Такой ситуации там не может быть. Дата хранится в "человеческом" виде, а не усечённом. Нет такого "16.04.12", а есть количество миллисекунд со дня рождения UNIX-систем. Штамп времени.
Quote (Sanny) Если Число(Сред(Дата,7,1))>3 Тогда Век = "19"; Иначе Век = "20"; КонецЕсли; ДатаЗначение = Дата(Век+Сред(Дата,7,2),Сред(Дата,4,2),Сред(Дата,1,2)); Возврат ДатаЗначение;
А дату "01.01.40" данный код преобразует в "01.01.1940". Так и будем закладывать кругом бомбы.))) В этом весь 1С.
Судьба даёт нам меньше, чем мы хотим, поэтому если просить мало, можно не получить вообще ничего.
Сообщение отредактировал tersus - Вторник, 17.04.2012, 13:39 |
|
| |
Sanny | Дата: Вторник, 17.04.2012, 14:14 | Сообщение # 56 |
Правдоборец
Группа: Гости
Сообщений: 6257
Статус: Offline
| eXceed, спасибо за пример! Наконец то пошел хоть какой то конструктив. Есть пара вопросов. Quote (eXceed) c = time.strptime(datestring, '%d %m %y') Как функция strptime определяет к какому веку отнести год обозначенный двумя цифрами? Мне пришлось век явно указывать из предположения, что входящая дата является чьей то датой рождения и человек должен быть ныне здравствующим. Соответственно все, что меньше 30 я отношу к 21-му веку, а все что больше к 20-му. И как эта функция определяет разделители между значащими частями строки? Сработает ли код, в случае если строка будет такой '16.04.12' или такой '16/04/12'?
Quote (tersus) Такой ситуации там не может быть. Ты не понял условия задачи. Дата в 1С тоже хранится в нормальном виде, с часами, минутами и секундами. По приведенному тобой в посте #45 примеру быдлокода видно, что человек парсит строку с датой пришедшей извне. Возможно, из текстового файла или какой то таблицы, куда эта дата занесена обычным текстом. Основная проблема в том, что входящие данные не полные - нет указания на век. Остается только его угадывать, применяя здравый смысл. Понятно, что в идеале надо требовать уточнения данных от источника. Но если это невозможно, как бы ты сам решил эту задачу?
У меня есть план - выпить столько, сколько смогу. Отличный план!
Сообщение отредактировал Sanny - Вторник, 17.04.2012, 14:33 |
|
| |
tersus | Дата: Вторник, 17.04.2012, 16:21 | Сообщение # 57 |
Генералиссимус
Группа: Гости
Сообщений: 2831
Статус: Offline
| Quote (Sanny) Дата в 1С тоже хранится в нормальном виде, с часами, минутами и секундами. Ну да? Там специальный костыль, чтобы дату двигать. Указываешь, что с 1942 года считать началом века и усё.
В 8 версии нет такого, ибо там нет dbf.
Quote (Sanny) что человек парсит строку с датой пришедшей извне. Он парсит именно дату, а не строку(Он вообще не проверяет, что это дата, а только на ПУСТОЕ ЗНАЧЕНИЕ). Это известный баг 1С. Только он не читал книгу по 1С языку. Это пример для 1с 7.7. Такая фигня там есть. Возможно пример прискакал из 7.5, но год смущает (2011, дольше видимо он жить не собирался)
Quote (Sanny) Остается только его угадывать, применяя здравый смысл. Ошибка проектирования 1С транслятора. Точнее dbf базы данных.
Quote (Sanny) Но если это невозможно, как бы ты сам решил эту задачу? Внимательно курил манулы и обзвонил 1С. Ибо нужно подумать о следующих поколениях 1С специалистов, которые это будут поддерживать.
Судьба даёт нам меньше, чем мы хотим, поэтому если просить мало, можно не получить вообще ничего.
Сообщение отредактировал tersus - Вторник, 17.04.2012, 16:35 |
|
| |
eXceed | Дата: Вторник, 17.04.2012, 16:59 | Сообщение # 58 |
Генералиссимус
Группа: Гости
Сообщений: 5466
Статус: Offline
| Sanny Никак она не определяет. Пистон сейчас предполагает, что идет 21й век. Потому что век не указан. Тут даже Аллах не поможет, сам понимаешь. Пришлось бы городить какой то костыль. Но он был бы изящней.
Quote И как эта функция определяет разделители между значащими частями строки? Сработает ли код, в случае если строка будет такой '16.04.12' или такой '16/04/12'? c = time.strptime(datestring, '%d %m %y') - '%d %m %y' - шаблон даты, если там точки, то придется менять шаблон на '%d.%m.%y', ну ты понел. Чтоб не городить огород можно регекспом распарить строку и выпилить оттуда все неугодное, кроме цифр.
bda-expert.ru — это система форумов, где можно общаться быстро и свободно, где любая точка зрения имеет право на жизнь.
|
|
| |
Sanny | Дата: Вторник, 17.04.2012, 21:15 | Сообщение # 59 |
Правдоборец
Группа: Гости
Сообщений: 6257
Статус: Offline
| Quote (tersus) Там специальный костыль, чтобы дату двигать. В 1С 8 всю эту муру выпилили нафиг:
Давай обсуждать современную восьмую версию, ибо 7.7 довольно старая и не поддерживается уже с 2005 года.
Quote (tersus) Это пример для 1с 7.7. Написано на 8-ке, потому что в 7.7 нет вот такой конструкции: Quote Если НЕ ПустаяСтрока(Дата) Тогда Я склоняюсь к версии, что он откуда то извне получает эту строку (возможно из 7.7).
У меня есть план - выпить столько, сколько смогу. Отличный план!
Сообщение отредактировал Sanny - Вторник, 17.04.2012, 21:30 |
|
| |
tersus | Дата: Вторник, 17.04.2012, 21:56 | Сообщение # 60 |
Генералиссимус
Группа: Гости
Сообщений: 2831
Статус: Offline
| Quote (Sanny) Если НЕ ПустаяСтрока(Дата) Тогда
Уверен? Это 7.7 )))
НЕ или NOT логическое отрицание (булево отрицание НЕ) (ч.1 стр. 39) ПустаяСтрока(<строка>) (ч.1 стр. 59) Ну не суть, если 8 версия, то говнокод приемлем. Быстро латаем дыру и несемся в ПТО подключать мышку.))
Quote (Sanny) Я склоняюсь к версии, что он откуда то извне получает эту строку
Ну это дата формата "DD.MM.YY" Посему нет проверки. Может так и принимает, но тогда лучше использовать OLE (дату система сконвертирует)
Quote (Sanny) не поддерживается уже с 2005 года.
Это ошибка в архитектуре, это уже не лечится.
Quote (Sanny) В 1С 8 всю эту муру выпилили нафиг: Они пользуют SQL БД и посему ошибки с датами нет. Хотя некоторые sql-запросы сделаны неэффективно.
Судьба даёт нам меньше, чем мы хотим, поэтому если просить мало, можно не получить вообще ничего.
Сообщение отредактировал tersus - Вторник, 17.04.2012, 22:56 |
|
| |