Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
28 мар 2024, 23:08

Null в результате запроса.

Автор Iwrestledabear, 22 янв 2016, 00:14

0 Пользователей и 1 гость просматривают эту тему.

Iwrestledabear

Собственно, вот. Задача 2.2 1с специалист. Виновник проблемы вот этот код. В результате запроса Null при любом варианте. Вдруг кто-нибудь сможет помочь.


Процедура ОбработкаПроведения(Отказ, РежимПроведения)
   Движения.Хозрасчеты.Записывать = Истина;

   //Блокировки
   Блокировка = Новый БлокировкаДанных;
   ЭлементБлокировки = Блокировка.Добавить("РегистрБухгалтерии.Хозрасчеты");
   ЭлементБлокировки.УстановитьЗначение("Счет",ПланыСчетов.Хозрасчеты.Покупатели);
   ЭлементБлокировки.УстановитьЗначение("Субконто1",Контрагент);
   ЭлементБлокировки.Режим = РежимБлокировкиДанных.Исключительный;
   Блокировка.Заблокировать();

   Движения.Хозрасчеты.Записать();

//Запрос к регистру бухгалтерии   
   Запрос = Новый Запрос;
   Запрос.Текст =
      "ВЫБРАТЬ
      |   ХозрасчетыОстатки.Субконто2 КАК Договор,
      |   ХозрасчетыОстатки.Субконто3 КАК РасходнаяНакладная,
      |   ЕСТЬNULL(ХозрасчетыОстатки.ОтгрузкаОстатокДт, 0) КАК ДолгКонтрагента,
      |   ЕСТЬNULL(ХозрасчетыОстатки.ОплатаОстатокДт, 0) КАК ОплаченоКонтрагентом
      |ИЗ
      |   РегистрБухгалтерии.Хозрасчеты.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчеты.Покупатели), &ВидыСубконто, Субконто1 = &Контрагент) КАК ХозрасчетыОстатки
      |
      |УПОРЯДОЧИТЬ ПО
      |   ХозрасчетыОстатки.Субконто2.ДатаОкончания,
      |   ХозрасчетыОстатки.Субконто3.МоментВремени";
   Запрос.УстановитьПараметр("ВидыСубконто", ПланыСчетов.Хозрасчеты.Покупатели.ВидыСубконто.ВыгрузитьКолонку("ВидСубконто"));
   Запрос.УстановитьПараметр("Контрагент", Контрагент);
   Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
//Какая то ошибка в запросе, во всех полях null
   Результат = Запрос.Выполнить();
   
   Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
      //Проверка не больше ли сумма оплаты, чем долг
      //Запрос возвращает null, поэтому я не уверен можно ли использовать Итог
   Если Сумма > (Выборка.ДолгКонтрагента.Итог - Выборка.ОплаченоКонтрагентом.Итог) Тогда
      Сообщить("Сумма оплаты " + Строка(Сумма)+ " превышает долг конрагента "+Строка(Выборка.ДолгКонтрагента.Итог - Выборка.ОплаченоКонтрагентом.Итог));
      Отказ = Истина;
   КонецЕсли;
   
           //Из реквизита документа
         СуммаПлатежа = Сумма;
   //В цикле для выборки
   Пока Выборка.Следующий() Цикл
          //Если долг больше чем уже оплачено
         Если Выборка.ДолгКонтрагента > Выборка.ОплаченоКонтрагентом Тогда
            //выясняем сколько надо оплатить
            Оплатить = Выборка.ДолгКонтрагента - Выборка.ОплаченоКонтрагентом;
            //Оплачиваем
             Оплачено = Выборка.ОплаченоКонтрагентом + Оплатить;
            //уменьшаем сумму платежа
            СуммаПлатежа = СуммаПлатежа - Оплатить;
            //добавляем движения
            Движение = Движения.Хозрасчеты.Добавить();
            Движение.СчетДт = ПланыСчетов.Хозрасчеты.Касса;
            Движение.СчетКт = ПланыСчетов.Хозрасчеты.Покупатели;
            Движение.Период = Дата;
            Движение.Оплата = Оплачено;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Выборка.Контрагент;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Договоры] = Выборка.Договор;
            Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.РасходныеНакладные] = Выборка.РасходнаяНакладная;
            Иначе Продолжить;//Иначе переходим к следующей записи цикла
         КонецЕсли;   
   КонецЦикла;

КонецПроцедуры

Андрей Сисюкин

   Открываешь выборку и сразу обращаешься к ней, без позиционирования на первую запись!  (выборка.Следующий())

    Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
      //Проверка не больше ли сумма оплаты, чем долг
      //Запрос возвращает null, поэтому я не уверен можно ли использовать Итог
   Если Сумма > (Выборка.ДолгКонтрагента.Итог - Выборка.ОплаченоКонтрагентом.Итог) Тогда

Добавлено: 22 янв 2016, 06:31


Да, личное мнение:
С такой конструкцией ты вряд ли сдашь экзамен:
Запрос.УстановитьПараметр("ВидыСубконто", ПланыСчетов.Хозрасчеты.Покупатели.ВидыСубконто.ВыгрузитьКолонку("ВидСубконто"));

Это в даном случае ты знаешь ,что у тебя за субконто, и проверил ка они выгружаются.. А если их 100 штук? и в хаотическом порядке?

Iwrestledabear

Спасибо за совет, однако не стоит всерьез воспринимать допущенные мной недочеты, я только начинаю учиться.
Скажите самое главное, запрос составлен верно?
Цитата: Андрей Сисюкин от 22 янв 2016, 06:29
   Открываешь выборку и сразу обращаешься к ней, без позиционирования на первую запись!  (выборка.Следующий())

    Выборка = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
      //Проверка не больше ли сумма оплаты, чем долг
      //Запрос возвращает null, поэтому я не уверен можно ли использовать Итог
   Если Сумма > (Выборка.ДолгКонтрагента.Итог - Выборка.ОплаченоКонтрагентом.Итог) Тогда

Добавлено: 22 янв 2016, 06:31


Да, личное мнение:
С такой конструкцией ты вряд ли сдашь экзамен:
Запрос.УстановитьПараметр("ВидыСубконто", ПланыСчетов.Хозрасчеты.Покупатели.ВидыСубконто.ВыгрузитьКолонку("ВидСубконто"));

Это в даном случае ты знаешь ,что у тебя за субконто, и проверил ка они выгружаются.. А если их 100 штук? и в хаотическом порядке?

Андрей Сисюкин

Цитата: Iwrestledabear от 22 янв 2016, 13:36
Спасибо за совет, однако не стоит всерьез воспринимать допущенные мной недочеты, я только начинаю учиться.
Скажите самое главное, запрос составлен верно?
В принципе, да. Но конкретно в данном случае устанавливать виды субконто не обязательно. Выборка идёт только с одного счета.
Данный параметр, а точнее, список параметров, пригождается, когда выбираешь данные с нескольких счетов, а на них, скажем, "контрагент" - это разный номер субконто. Тогда ставишь в массив его первым и обращаешься к контрагенту как к первому субконто.

Ну и вопрос в необходимости блокировки.
Если смотреть на подходы 1С в последнее время - они везде избегают исключительности и блокировок..

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск