Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с данными из запроса
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.3
rpodgornyy
Платформа 1С 8.3. Конфигурация - самописная.

Доброе время суток коллеги!

Завис на следующем вопросе. Есть регистр сведений "ПлатежиПоКоду": Измерения - Договор; Ресурсы - КодПлатежа и СуммаПлатежа. В документе, который будет делать запись в этом регистре, в "ОбработкеПроведения" пишу следующий код:

Запрос = Новый Запрос;
    Запрос.Текст =
     "ВЫБРАТЬ
     |    ПлатежиПоКодуСрезПоследних.КодПлатежа
     |ИЗ
     |    РегистрСведений.ПлатежиПоКоду.СрезПоследних КАК ПлатежиПоКодуСрезПоследних
     |ГДЕ
     |    ПлатежиПоКодуСрезПоследних.Договор = &Договор";
    Запрос.УстановитьПараметр("Договор", Договор);
    Запрос = Запрос.Выполнить().Выбрать();
    
Если Запрос.Количество() = 0 Тогда    
    КодПлатежа = 1;
Иначе
    КодПлатежа = Запрос.КодПлатежа + 1;
КонецЕсли;
    
    Движения.ПлатежиПоКоду.Записывать = Истина;
    Движение = Движения.ПлатежиПоКоду.Добавить();
    Движение.Период = Дата;
    Движение.Договор = Договор;
    Движение.СуммаПлатежа = Сумма;
    Движение.КодПлатежа = КодПлатежа;


При проведении первого документа в КодПлатежа регистра записывается 1. При проведении второго - выдаётся "Преобразование значения к типу Число не может быть выполнено". При отладке остановка получается на строке: "КодПлатежа = Запрос.КодПлатежа + 1". Сам запрос в консоле работает корректно, выдаёт последнее значение записи регистра.
Vofka
Что находится в переменной Запрос.КодПлатежа ? Похоже, что NULL. Попробуйте запрос написать так:

Запрос.Текст = 
"ВЫБРАТЬ
|    ЕСТЬNULL(ПлатежиПоКодуСрезПоследних.КодПлатежа, 0) КАК КодПлатежа
|ИЗ
|    РегистрСведений.ПлатежиПоКоду.СрезПоследних КАК ПлатежиПоКодуСрезПоследних
|ГДЕ
|    ПлатежиПоКодуСрезПоследних.Договор = &Договор";
rpodgornyy
Цитата(Vofka @ 11.05.15, 21:00) необходимо зарегистрироваться для просмотра ссылки
Что находится в переменной Запрос.КодПлатежа ? Похоже, что NULL. Попробуйте запрос написать так:

Запрос.Текст = 
"ВЫБРАТЬ
|    ЕСТЬNULL(ПлатежиПоКодуСрезПоследних.КодПлатежа, 0) КАК КодПлатежа
|ИЗ
|    РегистрСведений.ПлатежиПоКоду.СрезПоследних КАК ПлатежиПоКодуСрезПоследних
|ГДЕ
|    ПлатежиПоКодуСрезПоследних.Договор = &Договор";


Пробовал таким образом - проблема аналогичная. В переменной Запрос.КодПлатежа изначально ничего нет. После проведения первого документа записывается "1". И в консоли запросов выдаётся "1". А дальше - ошибка...
Vofka
Перед блоком

Если Запрос.Количество() = 0 Тогда


Напишите:

КодПлатежа = 0;
rpodgornyy
Увы, без изменений...
Irzik
посмотрите тип Запрос.КодПлатежа , который получаете из запроса, мне кажется строка.
sava1
После ИНаче :
Выборка.Получить; Выборка.Следующий.

Вы пытаетесь получить данные без позиционирования...
rpodgornyy
Цитата(Irzik @ 12.05.15, 5:30) необходимо зарегистрироваться для просмотра ссылки
посмотрите тип Запрос.КодПлатежа , который получаете из запроса, мне кажется строка.


Число 3.0

Цитата(sava1 @ 12.05.15, 8:20) необходимо зарегистрироваться для просмотра ссылки
После ИНаче :
Выборка.Получить; Выборка.Следующий.

Вы пытаетесь получить данные без позиционирования...


"Ошибка времени выполнения"... А можно немного подробнее, что означает получить данные без позиционирования?
sava1
Цитата(rpodgornyy @ 13.05.15, 23:13) необходимо зарегистрироваться для просмотра ссылки
что означает получить данные без позиционирования

Есть выборка данных - вы проверяете количество записей, потом хотите что-то получить, но не указываете из какой строки.

пробуйте так
//   Запрос = Запрос.Выполнить().Выбрать();
   Запрос = Запрос.Выполнить().Выгрузить();
    
Если Запрос.Количество() = 0 Тогда    
    КодПлатежа = 1;
Иначе
    КодПлатежа = Запрос[0].КодПлатежа + 1;
КонецЕсли;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.