7.7 перевести номер месяца в строку

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем trioka, 21 окт 2009.

  1. TopicStarter Overlay
    trioka
    Offline

    trioka Опытный в 1С

    Регистрация:
    21 окт 2009
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    Извините что расплывчато в описании темы, вот задача:
    перевести номер месяца по порядку , тоесть 10 -> октябрь
    конкретная задача выглядит так, есть счет фактура, надо чтобы в шапке печаталось ЗА ОКТЯБРЬ, ЗА НОЯБРЬ
    конечно в зависимости от текущей даты.
  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Проще всего так:
    Код:
    Функция МесяцПрописью(Дат)
    Мес=ДатаМесяц(Дат);
    Если Мес=1 Тогда
    Возврат "Январь";
    ИначеЕсли Мес=2 Тогда
    Возврат "Февраль";
    //и .т.д......
    КонецЕсли;
    КонецФункции
    
    
    
  3. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Я бы делал через массив:
    Код:
    Перем МесяцПрописью[12];
    МесяцПрописью[1] = "Январь";
    //....
    МесяцПрописью[12] = "Декабрь";
    //....
    Сообщить(МесяцПрописью[Мес]);
    
  4. TopicStarter Overlay
    trioka
    Offline

    trioka Опытный в 1С

    Регистрация:
    21 окт 2009
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    Бухгалтерский угодник, помоему проще сделал.
    ну у меня через 2 минуты заработало.
    а с Массивом чета парюсь, 1с говорит что переменная не задана как массив.
    я просто не знаю как правильно массив сделать, и в какой части программы.

    зы. Как вы КОД1С сюда вставляете, чтобы он форматирование сохранял. у меня белеберда получается. и цвета нете
  5. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Переменная должна быть объявлена как массив либо в начале модуля (если для всей формы) либо в начале конкретной функции.
    Код:
    Перем МесяцПрописью[12];
    
    
    Потом задаешь эти значения:
    Код:
    МесяцПрописью[1] = "Январь";
    //....
    МесяцПрописью[12] = "Декабрь";
    
    
    Тут будет нагляднее, чем через если.

    А вызывать значение массива куда быстрее чем функцию (хотя на глаз при небольшой обработке этого не заметишь, только отладчиком.)

    Нужный тебе текст обрамляешь тегами [cоde] [/cоde]. или воспользуйся полной формой ответа.
    ЗЫ хотя пока может не срабатывать по техническим вопросам
  6. TopicStarter Overlay
    trioka
    Offline

    trioka Опытный в 1С

    Регистрация:
    21 окт 2009
    Сообщения:
    52
    Симпатии:
    0
    Баллы:
    26
    код в первых двух сообщениях точно как в 1С выглядит, а вот последний не очень, как и у меня получалось.
    кстати вот еще вариант решения
    Код:
    Месяц=Формат(Дата(ТекущаяДата()),"ДММММ");
    
    и еще
    Код:
    Шаблон("За [Дата(2001,Ном,1)#ДММММ]");
    
    только не могу понять как шаблоном пользоваться потом
  7. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    1. если пользоваться форматом, то функция Дата() там не обязательна, у нас и так тип значения дата.

    Но есть проблема, если тебе надо узнать название Мес = 10 месяца, то придется сначала формировать дату, типа
    Код:
    Дата(2001, Мес, 1);
    
    
    2. Шаблон на выходе имеет строку, т.е. в твоем случае получится
    "За ...."

    А работать с ним как и выше
    Код:
    Месяц = Шаблон("За [Дата(2001,Ном,1)#ДММММ]");
    
    
  8. Niky87
    Offline

    Niky87

    Регистрация:
    21 окт 2009
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Вот интересный способ, придумал вчера на работе, зацените:

    Код:
    // для того, чтобы вытащить текущий месяц строкой !
    ЖЗ=СоздатьОбъект("ЖурналРасчетов.Зарплата");
    // возвращает например "октябрь 2009 г.", главное есть название месяца по текущей дате    
    ТекМес=ЖЗ.ПериодПоДате(РабочаяДата()); 
    
    
    // вытаскиваем название месяца
    СтрДлин=СтрДлина(ТекМес);
    СтрДлин=СтрДлин-8; // надо убрать 8 символов справа, чтобы остался голый месяц!
    ТекМесяц=Лев(ТекМес,СтрДлин);
    
    
    
    :aua:

    Конечно, немного заумно, но с точки зрения программирования верно, потому как гласит закон программирования - "Хуже дублирующегося кода, может быть только ошибка :smile: "

    до этого у меня было вот так

    /
    Код:
    / <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/для')">для того, чтобы вытащить текущий месяц строкой !</span>
    ЖЗ=СоздатьОбъект("ЖурналРасчетов.Зарплата");
    Сообщить(ЖЗ.ПериодПоДате(РабочаяДата()));
    
    // перебор реквизитов для поиска необходимого
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Январь")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Январь"); КонецЕсли;
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Февраль")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Февраль"); КонецЕсли;
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Март")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Март"); КонецЕсли;
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Апрель")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Апрель"); КонецЕсли;
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Май")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Май"); КонецЕсли;	
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Июнь")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Июнь"); КонецЕсли;	
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Июль")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Июль"); КонецЕсли;	
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Август")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Август"); КонецЕсли;
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Сентябрь")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Сентябрь"); КонецЕсли;	
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Октябрь")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Октябрь"); КонецЕсли;	
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Ноябрь")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Ноябрь"); КонецЕсли;	
    Если Найти(ЖЗ.ПериодПоДате(РабочаяДата()),"Декабрь")=1 Тогда
    НормаЧасов=СпрНормЧасов.ПолучитьАтрибут("Декабрь"); КонецЕсли;
    
    Согласитесь, разница очевидна :unsure:
  9. Niky87
    Offline

    Niky87

    Регистрация:
    21 окт 2009
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    У кого ещё есть мысли по этому поводу =)
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Способов еще много.. Можно использовать СписокЗначений, ТаблицуЗначений - у кого какая фантазия.... Но проще и логичнее использовать 2 первых способа: фиункция и массив. Применяю сам в зависимости от потребности. Чаще функцю, т.к. в ней можно учитывать еще и СКЛОНЕНИЯ
  11. WaRDeR
    Offline

    WaRDeR Модераторы Команда форума Модератор

    Регистрация:
    23 ноя 2006
    Сообщения:
    3.263
    Симпатии:
    14
    Баллы:
    29
    Зачем еще мысли? Оптимальнее уже не будет.

Поделиться этой страницей