Версия для печати темы (https://pro1c.org.ua/index.php?s=a4130f4a5a0e32ba08fc780ab3426b97&showtopic=23202)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 8.3 _ Проблема с данными из запроса

Автор: rpodgornyy 11.05.15, 19:40

Платформа 1С 8.3. Конфигурация - самописная.

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

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

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


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

Автор: Vofka 11.05.15, 20:00

Что находится в переменной Запрос.КодПлатежа ? Похоже, что NULL. Попробуйте запрос написать так:

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

Автор: rpodgornyy 11.05.15, 20:05

Цитата(Vofka @ 11.05.15, 21:00) *
Что находится в переменной Запрос.КодПлатежа ? Похоже, что NULL. Попробуйте запрос написать так:

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


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

Автор: Vofka 11.05.15, 20:37

Перед блоком

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


Напишите:

КодПлатежа = 0;

Автор: rpodgornyy 11.05.15, 21:37

Увы, без изменений...

Автор: Irzik 12.05.15, 4:30

посмотрите тип Запрос.КодПлатежа , который получаете из запроса, мне кажется строка.

Автор: sava1 12.05.15, 7:20

После ИНаче :
Выборка.Получить; Выборка.Следующий.

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

Автор: rpodgornyy 13.05.15, 22:13

Цитата(Irzik @ 12.05.15, 5:30) http://pro1c.org.ua/index.php?act=findpost&pid=98858
После ИНаче :
Выборка.Получить; Выборка.Следующий.

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


"Ошибка времени выполнения"... А можно немного подробнее, что означает получить данные без позиционирования?

Автор: sava1 14.05.15, 7:36

Цитата(rpodgornyy @ 13.05.15, 23:13) *
что означает получить данные без позиционирования

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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua