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

Код не работает

Автор FARO15ful, 24 июн 2017, 15:21

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

FARO15ful

привет. хотел создал форму для документа который дает сообщения когда выбранный товар отсутствует в складе. все норм. был 1-2 ошибок все исправил. но сам и код не работает. вот код: что с ним не так?:D

&НаСервере

Процедура QapıSayПриИзменении(Элемент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| QaiməОстатки.SayОстаток КАК SayОстаток
|ИЗ
| РегистрНакопления.Qaimə.Остатки(&ДатаДокумента, ) КАК QaiməОстатки
|ГДЕ
| QaiməОстатки.Qapı = &Qapı";

Запрос.УстановитьПараметр("Qapı", Элементы.Qapı.ТекушиеДаныые.Qapı);
Запрос.УстановитьПараметр("ДатаДокумента", Объект.Дата - 1);

РезультатЗапроса = Запрос.Выполнить();

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Если ВыборкаДетальныеЗаписи.SayОстаток >= Элементы.Qapı.ТекушиеДаныые.Say Тогда
//  VAR
Иначе
Сообщить("Yetərli Sayda yoxdur");
КонецЕсли;
Иначе
Сообщить("Bu məhsuldan yoxdur");
КонецЕсли;
КонецПроцедуры

oleg-x

Что вы подразумеваете под словом "не работает". Выдает ошибку, некорректно отрабатывает или еще что то.
А вообще мог бы пройтись отладчиком или выдать сообщения как выполняется од и все сразу понятно станет.
Добавлено: 24 июн 2017, 16:17


И еще, я так понимаю изменения на форме (на клиенте), вы сразу обрабатываете на сервере, не передавая с клиента на сервер данных.
Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

FARO15ful

Цитата: oleg-x от 24 июн 2017, 16:14Что вы подразумеваете под словом "не работает".

когда назначаю количество больше чем есть в складе не дает сообщения о том что данном количество нету в складе.


Цитата: oleg-x от 24 июн 2017, 16:14И еще, я так понимаю изменения на форме (на клиенте), вы сразу обрабатываете на сервере, не передавая с клиента на сервер данных.

потому что когда ставлю &НаКлиенте выдает вот такой ошибку: {Документ.Satış.Форма.ФормаДокумента.Форма(4,17)}: Тип не определен (Запрос)
Запрос = Новый <<?>>Запрос; (Проверка: Тонкий клиент)


oleg-x

Запрос надо выполнять на сервере, а с клиента передать текущие данные.
&НаКлиенте
ПриИзменение()
ТвояПроцедураНаСервере(ТекущиеДанные);

&НаСервере
ТвояПроцедураНаСервере(ТекущиеДанные)
//Твой запрос с сообщениями

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

ilyay

Отбор на товар надо не в ГДЕ размещать, а в условии виртуальной таблицы. Кстати, если товара 0, тогда запрос вернет пустой результат. Я бы не выбирал товар, а потом проверял кодом достаточно ли его, а сразу бы в запрос передал и товар и количество, которое запрашивается. Если товара недостаточно, тогда будет возвращаться пустой набор, и не надо будет выборку создавать вообще.

Например:

    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ИСТИНА КАК Поле1
        |ИЗ
        |    РегистрНакопления.Qaimə.Остатки(&ДатаДокумента, Qapı = &Qapı) КАК QaiməОстатки
        |ГДЕ
        |    QaiməОстатки.SayОстаток >= &Say ";
   
    Запрос.УстановитьПараметр("Qapı", Элементы.Qapı.ТекушиеДаныые.Qapı);
    Запрос.УстановитьПараметр("Say", Элементы.Qapı.ТекушиеДаныые.Say);
    Запрос.УстановитьПараметр("ДатаДокумента", Новый Граница(Объект.МоментВремени(), ВидГраницы.Исключая));
   
    РезультатЗапроса = Запрос.Выполнить();
   
    Если РезультатЗапроса.Пустой() Тогда
        Сообщить("Bu məhsuldan yoxdur");  // не достаточно товара     
    КонецЕсли;   


oleg-x

Помог, нажми спасибо. Не помог, нажми спасибо :-)
Если у Вас есть проблема, то её уже кто то решил @Yandex, @Google

ilyay

Примерно так. Ошибся в том, что это форма, и у реквизита объект нет метода МоментВремени().
Проверки такого рода надо делать в модуле объекта, вот там метод работает. Причем делать в обработке проведения, когда объект уже записан, иначе у нового объекта не будет ссылки, и момент времени неоткуда будет получать. При нехватке выдавать отказ и сообщениепользователю со ссылкой на некорректные строки. А в форме я бы ставил первым параметром неопределено вместо даты для проверки на текущее время, если документ новый, а если существующий, тогда Объект.Ссылка.МоментВремени(). Пользователь же может и дату документа поменять! Уменьшать дату на секунду некорректно, потому что могут быть другие документы с той же датой и временем, которые раньше проведены. Да и пока документ редактируется, кто-то может тоже парарллельно отредактировать другой документ и при проведении вы уйдете в минус. Если нужно, можно получать количество при открытии формы (в ПриЧтенииНаСервере) и хранить его в той же табличной части отдельной колонкой. На форме можно добавить колонку, которая будет отсутствовать в объекте информационной базы.

А при проведении, если не по партиям списываете, тогда лучше воспользоваться новой методикой, когда сначала записываете списание, потом проверяете, не ушли ли в минус. И если ушли, тогда делаете откат транзакции.

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

Теги: код форма 

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

Рейтинг@Mail.ru

Поиск