7.7 Преобразование Строки

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем djyarilo, 13 июл 2011.

  1. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    Задача следующая, пройтись циклом по журналу регистрации с фильтром по определенному пользователю. И высчитать разницу во времени простоя. Например пользователь на протяжении 30 минут не чего не делал следовательно сообщить что он трухля. Фильтр по пользователю все удачно.
    Но когда пытаюсь отнять 15 либо 30 минут от пВремя=сп.ПолучитьЗначение(2); Он пишет что типо строка от строки нельзя вычесть число. И я вот не знаю как правильно преобразовать строку либо к времени либо к числу((( вот как то так. Что посоветуете?
    Код:
    ф_тз.Очистить();
    ф_тз.НоваяКолонка("Дата","Дата");
    ф_тз.НоваяКолонка("Время","Строка",8);
    ф_тз.НоваяКолонка("Пользователь","Строка");
    ф_тз.НоваяКолонка("Где","Строка",1);
    ф_тз.НоваяКолонка("Действие","Строка",8);
    ф_тз.НоваяКолонка("Событие","Строка",20);
    ф_тз.НоваяКолонка("ДопКод","Число",5);
    ф_тз.НоваяКолонка("Описание","Строка");
    ф_тз.НоваяКолонка("ИД","Строка");
    ф_тз.НоваяКолонка("Представление","Строка");
    ф_тз.НоваяКолонка("Объект");
    
    Если ПустоеЗначение(НачДата)=1 Тогда
    Предупреждение("Укажите начальную дату.");
    Возврат;
    КонецЕсли;
    Если ПустоеЗначение(КонДата)=1 Тогда
    Предупреждение("Укажите конечную дату.");
    Возврат;
    КонецЕсли;
    сч=0;
    
    fso=СоздатьОбъект("Scripting.FileSystemObject");
    
    ИмяФайла=КаталогИБ()+"SYSLOG\1cv7.mlg";
    
    file=fso.OpenTextFile(ИмяФайла, 1, 0, 0); //Открываем файл в режиме "только чтение"           
    
    стрНачДата=ДатаВСтроку(НачДата);
    стрКонДата=ДатаВСтроку(КонДата);
    
    Пока file.AtEndOfStream=0 Цикл  //Читаем следующую строку файла
    сч=сч+1;
    стр=file.ReadLine(); 
    
    стрДата1=Лев(стр,17);
    стрДата=Лев(стр,8);
    
    Если сч%10=0 Тогда
    Состояние(стрДата1);
    КонецЕсли;
    
    //Пропускаем события вне указанного диапазона
    
    Если стрДата<стрНачДата Тогда
    Продолжить;
    КонецЕсли;
    Если стрДата>стрКонДата Тогда
    Продолжить;
    КонецЕсли;
    
    
    стр=СтрЗаменить(стр,";",""",""");
    стр=""""+стр+"""";
    сп=СоздатьОбъект("СписокЗначений");
    сп.ИзСтрокиСРазделителями(стр);
    пДата=СтрокаВДату(сп.ПолучитьЗначение(1));
    пВремя=сп.ПолучитьЗначение(2);
    
    
    пГде=сп.ПолучитьЗначение(4);
    пДействие=сп.ПолучитьЗначение(5);
    пСобытие=СокрЛП(сп.ПолучитьЗначение(6));
    пДопКод=сп.ПолучитьЗначение(7);
    пОписание=сп.ПолучитьЗначение(8);
    Если сп.РазмерСписка()>=9 Тогда
    пИД=сп.ПолучитьЗначение(9);
    КонецЕсли;
    Если сп.РазмерСписка()>=10 Тогда
    пПредставление=сп.ПолучитьЗначение(10);
    КонецЕсли;
    
    Если сп.ПолучитьЗначение(3) = ВыбПользователи.Наименование Тогда
    
    
    пПользователь= ВыбПользователи.Наименование;
    ф_тз.НоваяСтрока();
    ф_тз.Дата=пДата;
    ф_тз.Время=пВремя;
    ф_тз.Пользователь=пПользователь;
    ф_тз.Где=пГде;
    ф_тз.Действие=пДействие;
    ф_тз.Событие=пСобытие;
    ф_тз.ДопКод=пДопКод;
    ф_тз.Описание=пОписание;
    ф_тз.ИД=пИД;
    ф_тз.Представление=пПредставление;
    ф_тз.Объект=ОбъектПоСтроке(пИД);
    КонецЕсли;	
    
    
    КонецЦикла;
    
    
    
  2. kavak
    Offline

    kavak Опытный в 1С

    Регистрация:
    13 май 2010
    Сообщения:
    703
    Симпатии:
    0
    Баллы:
    26
    Ну как пример преобразования
    ВашаЧисло = Число(ВашаСтрока)

    Или

    Формат();
    Как то так...
  3. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    я делал число, но он тогда пишет первые две цифры.
    в переменную пвремя у меня возвращает
    11:43:42, когда преобразую в число он пишет 11
  4. kavak
    Offline

    kavak Опытный в 1С

    Регистрация:
    13 май 2010
    Сообщения:
    703
    Симпатии:
    0
    Баллы:
    26
    ТОгда используйте тип данных дата...
  5. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    в дате 12 месяцев )))
    следовательно если
    11.43.43
    преобразовать в дату :angry: он выдает : : )) и не преобразует. так как числа превышают
  6. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    я конечно могу сделать так:
    Код:
    вырезаем = СтрЗаменить(пВремя, ":", "");
    вчисло = Число(вырезаем);
    
    
    вопрос только в том если получится число 113454 как от него отнять например 15 минут :angry:
  7. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    я немного не правильно начал делать. я щас только понял.
    у меня например цифры
    53525
    53726
    53716
    53816
    мне нужно чтобы в цикле 53726 - 53525, 53816-53716. как это можно сделать? не че то я жестко туплю
  8. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    1) Или пишем свою функцию преобразования (раскладываем на сеунды для универсальности / разницу отнимаем / снова преобразовываем)
    2) Можно "извратится" - через установку времени в документе (создать типа служебного)
  9. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    так я все норм сделал.Только единственное у меня так:
    я 53256-52256, и т.д. сравниваю если ответ например меньше 10 тогда сообщить, хочу сделать так:
    532556 522556 просто

    у меня выводит
    50322 простой.

    возможно ли сделать вывод как я хочу?
  10. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Ничего не понял из написанного
  11. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    у меня время пишется так:
    53215
    54516
    71518
    81518

    я беру вычитаю 54516-53215 , 71518-54516. в цикле, смотрю разницу между ними например разница ровно 1211. Мне нужно высчитать есть ли простой больше 10 минут я беру 10*100 получается 1000.
    Сравниваю 1000 с 1211 если меньше то делаю следующий вывол:
    71518 |||| 54516|||| простой. что типо в этот временной промежуток простой больше 10 минут.


    у меня выводит так:
    50322 простой
    50332 простой
    50352 простой
    92450 простой
    92847 простой
    92900 простой
    93029 простой
    95530 простой
    95531 простой .


    как мне сделать вывод как я хочу.
  12. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Перебор надо организовывать в цикле в обратном порядке по таблице значений...

    Покажите кусок как вы делаете....
  13. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    Код:
    
    Если сп.ПолучитьЗначение(3) = ВыбПользователи.Наименование Тогда
    
    вырезаем = СтрЗаменить(пВремя, ":", "");
    вчисло = Число(вырезаем);
    а = вчисло -а;
    б=минута*100;
    Сообщить(б);
    если а> б Тогда
    
    <span style='cursor: pointer; color:red' Onclick="window.open('http://www.1c-pro.ru/wiki/index.php/сообщить')">			Сообщить(""+вчисло+" простой ");</span>
    КонецЕсли;
    
    
    и я так понял что он у меня не делает перебор(((
  14. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Правильно.... Не делает....
    Нужно сначала все значения поместить в таблицу значений, а ее уже перебирать... Ну или присваивать переменной предыдущее значение...

    Относительно преобразования мне кажется ваш способ не правильный. Я бы сделал так

    Код:
    ВремыВСекундах=Число(Лев(пВремя,2))*3600+Число(Сред(пВремя,4,2))*60+Число(Прав(пВремя,2));
    
    
    
    к тому же вы не смотрите на дату...
  15. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    дата у меня только за Сегодня. Сижу не много пока не вкуриваю как организовать перебор в ТЗ. типо тз.свернуть?
    кстати выгрузку в тз я осуществляю в
    Код:
    пПользователь= ВыбПользователи.Наименование;
    ф_тз.НоваяСтрока();
    ф_тз.Дата=пДата;
    ф_тз.Время=пВремя;
    ф_тз.Пользователь=пПользователь;
    ф_тз.Где=пГде;
    ф_тз.Действие=пДействие;
    ф_тз.Событие=пСобытие;
    ф_тз.ДопКод=пДопКод;
    ф_тз.Описание=пОписание;
    ф_тз.ИД=пИД;
    ф_тз.Представление=пПредставление;
    ф_тз.Объект=ОбъектПоСтроке(пИД);
    
    
    следовательно уже поэтому тз я могу делать выборку строк и вычитать их между собой так?
  16. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Приблизительно так.

    Код:
    Для к=-ф_тз.КоличествоСтрок() По -2 Цикл
    Поз=-к;
    А=ф_тз.ПолучитьЗначение(Поз,"пВремя");
    Б=ф_тз.ПолучитьЗначение(Поз-1,"пВремя");
    //тут сравниваем А и Б
    КонецЦикла;
    
    
    
  17. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    а то я не много не в ту степь пошел DDd начал из тз вычитывать список занчений
  18. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Не нужно списка.... Все проще

    ПолучитьЗначение(<Строка>,<Колонка>)
    Назначение:
    Получить значение заданной ячейки таблицы значений. Возвращает значение заданной ячейки.
  19. TopicStarter Overlay
    djyarilo
    Offline

    djyarilo Опытный в 1С

    Регистрация:
    18 апр 2011
    Сообщения:
    435
    Симпатии:
    0
    Баллы:
    26
    только значения А и Б все равно придется переводить в числа чтобы сделать разницу между этими числами.
  20. Бухгалтерский угодник
    Offline

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

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Пример как бы я это делал приведен в 14м посте

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