8.х Преобразование к типу число

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

  1. TopicStarter Overlay
    solnce
    Offline

    solnce Опытный в 1С

    Регистрация:
    16 июл 2009
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Доброе время суток.
    У меня есть документ посещение,он заполняется в кпк,затем данные выгружаются в 1С, включая такие параметры как широта и долгота(В регистр сведений СведенияДокумента,в регистре ресурсы широта и долгота имеют тип число,длина 4 точность 10 ) и на основании этих данных мне нужно в отчете отразить отклонение
    Вот как я описываю
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	кпкСведенияДокументаСрезПервых.кпкГПСШирота КАК Широта,
    |	кпкСведенияДокументаСрезПервых.кпкГПСДолгота КАК Долгота
    |ИЗ
    |	РегистрСведений.кпкСведенияДокумента.СрезПервых(, ) КАК кпкСведенияДокументаСрезПервых";
    Результат2=Запрос.Выполнить();	
    Значение2 = Результат2.Выбрать();
    а =Число(Значение2.Широта);
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	кпкСведенияДокументаСрезПоследних.кпкГПСШирота КАК Широта,
    |	кпкСведенияДокументаСрезПоследних.кпкГПСДолгота КАК Долгота
    |ИЗ
    |	РегистрСведений.кпкСведенияДокумента.СрезПоследних(, ) КАК кпкСведенияДокументаСрезПоследних";
    
    
    Результат3=Запрос.Выполнить();	
    Значение3 = Результат3.Выбрать();
    б=Число(Значение3.Широта);
    в=а-б;
    
    ОбластьДетальныхЗаписей.Параметры.откл = в;	
    
    
    Но у меня выдается ошибка:Преобразование к типу число не может быть выполнено. что у меня не так?
  2. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    У вас запрос вообще что то взвращает? Т.к. Виртуальные таблицы СрезПервых И СредПоследних они получаются на определенную дату. СрезПоследних на какую дату?
    РегистрСведений.кпкСведенияДокумента.СрезПервых(&ДатаСреза, )
    2.Если у вас нет необходимости в датах и регистр нужен для хранения данных то его надо сделать непереодическим.
  3. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Просто позиционироваться надо в выборке. Используйте после "Выбрать" метод "Следующий()"
  4. TopicStarter Overlay
    solnce
    Offline

    solnce Опытный в 1С

    Регистрация:
    16 июл 2009
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое!Исправила на:
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	кпкСведенияДокументаСрезПервых.кпкГПСШирота КАК Широта,
    |	кпкСведенияДокументаСрезПервых.кпкГПСДолгота КАК Долгота
    |ИЗ
    |	РегистрСведений.кпкСведенияДокумента.СрезПервых(, ) КАК кпкСведенияДокументаСрезПервых";
    Результат2=Запрос.Выполнить();	
    Значение2 = Результат2.Выбрать();
    Пока Значение2.Следующий() Цикл
    а =Число(Значение2.Широта);
    КонецЦикла;	
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	кпкСведенияДокументаСрезПоследних.кпкГПСШирота КАК Широта,
    |	кпкСведенияДокументаСрезПоследних.кпкГПСДолгота КАК Долгота
    |ИЗ
    |	РегистрСведений.кпкСведенияДокумента.СрезПоследних(&ДатаКонца, ) КАК кпкСведенияДокументаСрезПоследних";
    Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаНачала));
    
    Результат3=Запрос.Выполнить();	
    Значение3 = Результат3.Выбрать();
    Пока Значение3.Следующий() Цикл
    б=Число(Значение3.Широта);
    в=а-б;
    КонецЦикла; 
    ОбластьДетальныхЗаписей.Параметры.откл = в;	
    
    Значение появляется и вроде даже правильное,но почему то ставится не для каждого клиента отдельно, а для всех....
    то есть у меня 1 Вася Пупкин у него отклонение 50 и значение 50 не только для Васи Пупкина,но у всех...
  5. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    По Вашему кусочку кода не видно как Вы клиентов выбираете и заполняете. Так же непонятно как Ваш регистр связан с клиентами вообще. Может у Вас измерение есть "Клиент" в регистре? Тогда условие в запрос добавьте. И про сам результат запроса... То, что Вы делаете в цикле с выборкой смысла не имеет, так как в переменные а и б попадут последние значения из выборки, а все предыдущие значения никак не учитываются у Вас. В общем, запрос, скорее всего, составлен неверно. Покажите структуру регистра и отчет.
  6. TopicStarter Overlay
    solnce
    Offline

    solnce Опытный в 1С

    Регистрация:
    16 июл 2009
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    регистр имеет измерения: КПКДокумент(тип: ДокументСсылка),Агент(Указывается в документе посещения) тип: Справочник.Пользователи) и ИДДокумента (тип:строка,длина 40) и ресурсы ДатаВремяСоздания,кпкГПСШирота,кпкГПСДолгота(тип число,длина 4 точность 10
    а вот собственно описание самого отчета:
    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	кпкПосещение.Дата КАК Дата,
    |	кпкПосещение.хб,
    |	кпкПосещение.хбНеНаше,
    |	кпкПосещение.всего,
    |	кпкПосещение.виды,
    |	кпкПосещение.Выполнение,
    |	кпкПосещение.выручка,
    |	кпкПосещение.Акт,
    |	кпкПосещение.Примечание,
    |	кпкСведенияДокумента.ДатаВремяСоздания КАК время,
    |	кпкСведенияДокумента.кпкГПСШирота КАК широта,
    |	кпкСведенияДокумента.кпкГПСДолгота КАК долгота
    |ИЗ
    |	Документ.кпкПосещение КАК кпкПосещение
    |		ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.кпкСведенияДокумента КАК кпкСведенияДокумента
    |		ПО кпкПосещение.Контрагент = кпкСведенияДокумента.КПКДокумент.Контрагент
    |ГДЕ
    |	кпкПосещение.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
    |	И кпкПосещение.Контрагент.Менеджер = &Менеджер
    |	И кпкПосещение.Контрагент = &Контр
    |
    |УПОРЯДОЧИТЬ ПО
    |	Дата";
    
    Запрос.УстановитьПараметр("ДатаНачала",    НачалоДня(ДатаНачала));
    Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаНачала));
    Запрос.УстановитьПараметр("Контр", Справочники.Контрагенты.НайтиПоКоду(ВыборкаДетали.Код));
    Запрос.УстановитьПараметр("Менеджер", Менеджер);
    Результат1=Запрос.Выполнить();
    
    Значение = Результат1.Выбрать();
    Пока Значение.Следующий() Цикл
    ////////////////////////////
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	кпкСведенияДокументаСрезПервых.кпкГПСШирота КАК Широта,
    |	кпкСведенияДокументаСрезПервых.кпкГПСДолгота КАК Долгота
    |ИЗ
    |	РегистрСведений.кпкСведенияДокумента.СрезПервых(, ) КАК кпкСведенияДокументаСрезПервых";
    Результат2=Запрос.Выполнить();	
    Значение2 = Результат2.Выбрать();
    Пока Значение2.Следующий() Цикл
    а =Число(Значение2.Широта);
    КонецЦикла;	
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |	кпкСведенияДокументаСрезПоследних.кпкГПСШирота КАК Широта,
    |	кпкСведенияДокументаСрезПоследних.кпкГПСДолгота КАК Долгота
    |ИЗ
    |	РегистрСведений.кпкСведенияДокумента.СрезПоследних(&ДатаКонца, ) КАК кпкСведенияДокументаСрезПоследних";
    Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаНачала));
    
    Результат3=Запрос.Выполнить();	
    Значение3 = Результат3.Выбрать();
    Пока Значение3.Следующий() Цикл
    б=Число(Значение3.Широта);
    в=а-б;
    КонецЦикла; 
    ОбластьДетальныхЗаписей.Параметры.откл = в;	 
    /////////////////////////////	
    ОбластьДетальныхЗаписей.Параметры.хб = Значение.хб;
    ОбластьДетальныхЗаписей.Параметры.хбНеНаше = Значение.хбНеНаше;
    ОбластьДетальныхЗаписей.Параметры.всего = Значение.всего;
    ОбластьДетальныхЗаписей.Параметры.виды = Значение.виды;
    Если Значение.Выполнение=Истина Тогда
    ОбластьДетальныхЗаписей.Параметры.Выполнение = "+";
    КонецЕсли;
    Если Значение.выручка= Истина Тогда
    ОбластьДетальныхЗаписей.Параметры.выручка = "+";
    КонецЕсли;
    Если Значение.Акт =Истина Тогда
    ОбластьДетальныхЗаписей.Параметры.Акт = "+";
    КонецЕсли;	
    ОбластьДетальныхЗаписей.Параметры.Прим = Значение.Примечание;
    КонецЦикла;	
    ОбластьДетальныхЗаписей.Параметры.время= Значение.время;
    ОбластьДетальныхЗаписей.Параметры.широта= Значение.широта;
    ОбластьДетальныхЗаписей.Параметры.долгота= Значение.долгота;
    
  7. Senya
    Offline

    Senya Опытный в 1С

    Регистрация:
    6 июн 2006
    Сообщения:
    594
    Симпатии:
    0
    Баллы:
    26
    Ну попробуйте так (выбор для Васи Перепетюйкина)

    Код:
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ
    |          кпкСведенияДокументаСрезПервых.Клиент как клиент,
    |	ВЫРАЗИТЬ (кпкСведенияДокументаСрезПервых.кпкГПСШирота КАК Число (15,3)) КАК ШиротаА, 
    |	ВЫРАЗИТЬ (кпкСведенияДокументаСрезПервых.кпкГПСДолгота КАК Число (15,3)) КАК ДолготаА,
    |	ВЫРАЗИТЬ (кпкСведенияДокументаСрезПоследних.кпкГПСШирота КАК Число (15,3)) КАК ШиротаВ,
    |	ВЫРАЗИТЬ (кпкСведенияДокументаСрезПоследних.кпкГПСДолгота КАК Число (15,3)) КАК ДолготаВ
    |ИЗ
    |	РегистрСведений.кпкСведенияДокумента.СрезПоследних(&ДатаКонца, ) КАК кпкСведенияДокументаСрезПоследних
    | ВНУТРЕННЕЕ СОЕДИНЕНИЕ  РегистрСведений.кпкСведенияДокумента.СрезПервых(, ) КАК кпкСведенияДокументаСрезПервых
    | ПО  кпкСведенияДокументаСрезПервых.Клиент  =  пкСведенияДокументаСрезПоследних.Клиент";
    
    //  Реквизит клиент в запросе (ну или как он там называется регистре сведений) как раз и будет соответствовать Вашему Васе Пупкину
    
    Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаНачала));
    
    Результат3=Запрос.Выполнить();	
    Значение3 = Результат3.Выбрать();
    Пока Значение3.Следующий() Цикл
    в=ЗначениеЗ. ШиротаА - ЗначениеЗ. ШиротаВ;
    ОбластьДетальныхЗаписей.Параметры.откл = в;
    КонецЦикла; 
    
    
    
  8. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Лучше, наверно, сразу все переделать. Ссылка на документ в регистре есть, поэтому лучше с регистра все данные тянуть сразу, без соединений с документами. Смысл воторого и третьего запроса тоже непонятен. Опишите задачу отчета.
  9. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Переделывайте регистр.
    Ставте периодичность -"По позиции регистратора".
    КПКДокумент и - убирайте. Всегда есть Регистратор.
    Добавте измерение Контрагент
    ДатаВремяСоздания - то же. Период в регистре и есть дата создания.
    ИДДокумента - то же ворос если это номер то то же убирайте. Есть Регистратор.Номер

    2. В запросе на срезПоследних параметр дата среза есть, а в срезе первых нет. То же не хорошо. Эти виртуальныетабл без параметров не имеют смысла.

    И вообще согласен какойто запрос немного обсурдный.
    В первом запросе у вас стоит отбор по Менеджеру и контрагенту а во втором и третьем вообще все скопом. И соединение мне там не нравиться

    Код:
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.кпкСведенияДокумента КАК кпкСведенияДокумента	|		ПО кпкПосещение.Контрагент = кпкСведенияДокумента.КПКДокумент.Контрагент
    
    Задучу Друг Задачу
  10. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    У регистра сведений далеко не всегда есть регистратор. И если все это в боевой базе, то структуру регистра менять затруднительно.
  11. TopicStarter Overlay
    solnce
    Offline

    solnce Опытный в 1С

    Регистрация:
    16 июл 2009
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    Опишите задачу отчета.
  12. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    Есть возможность изменить структуру регистра?
  13. TopicStarter Overlay
    solnce
    Offline

    solnce Опытный в 1С

    Регистрация:
    16 июл 2009
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    это крайне не желательно делать,лучше его вообще не трогать
  14. ASh
    Offline

    ASh Опытный в 1С

    Регистрация:
    10 сен 2008
    Сообщения:
    568
    Симпатии:
    0
    Баллы:
    26
    А контрагент в документе и агент в регистре - это одно и тоже?
  15. TopicStarter Overlay
    solnce
    Offline

    solnce Опытный в 1С

    Регистрация:
    16 июл 2009
    Сообщения:
    61
    Симпатии:
    0
    Баллы:
    26
    да

    я не знаю точную дату внесения первых координат, у одного манагера много точек и заполняться она будут по мере работы....а отклонение высчитывается Широта(Самое первое значение)-Широта(Последнее значение) если последние я могу описать,то как описать первое я незнаю....еще могут быть и промежуточные значения, поэтому дату в первом запросек я не поставила

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