Имя: Пароль:
1C
1С v8
Ошибка в коде. Результат в неправильном месте. Нужна помощь.
0 Sefuirotsu
 
26.08.13
19:40
[code]Процедура ОбработкаПроведения(Отказ, РежимПроведения)
    
           Движения.ОстаткиТоваров.Записывать = Истина;
        Движения.ОстаткиТоваров.Очистить();

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

    Запрос.УстановитьПараметр("МоментВремени", МоментВремени() );
    Запрос.УстановитьПараметр("Ссылка", Ссылка);
  
    Результат = Запрос.Выполнить();
    Выборка = Результат.Выбрать();

    Пока Выборка.Следующий() Цикл
        
        Если Выборка.Количество > Выборка.КоличествоОстаток Тогда
            Сообщение = Новый СообщениеПользователю;
            Сообщение.Текст = "Не хватает товара """ + Выборка.Продукция
                + """, из необходимых " +
                Выборка.Количество + " в наличии осталось только " +
                Выборка.КоличествоОстаток + "!";
                
                Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки = 2) + "].Количество";            
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
                
            Отказ = Истина;
            Движения.ОстаткиТоваров.Записывать = Ложь;        
        КонецЕсли;
        
        Если Отказ Тогда
            Продолжить;        
        КонецЕсли;
        
        Движение = Движения.ОстаткиТоваров.ДобавитьРасход();
        Движение.Период = Дата;
        Движение.Продукция = Выборка.Продукция;
        Движение.Количество = Выборка.Количество;
        Движение.Стоимость =
            Выборка.Количество / Выборка.КоличествоОстаток * Выборка.СтоимостьОстаток;

    КонецЦикла;
            
КонецПроцедуры[/code]

Всем доброго времени суток!
В форме мне необходимо, чтобы сообщение об ошибке указывало на ячейку с ошибкой (количество 50 000), а, вместо этого, облако указывает на ползунок прокрутки. Бьюсь с этим уже долго и не могу понять, в чем моя ошибка. Нужен свежий взгляд в код :) Большое спасибо за помощь!

Вот скрин того, что выходит у меня:

[spoiler]
[img]http://i053.radikal.ru/1308/e4/b9fe6359084f.jpg[/img]
[/spoiler]
1 Sefuirotsu
 
26.08.13
19:44
Прощу прощение за ошибки в составлении :)

Правильная ссылка на картинку: http://i053.radikal.ru/1308/e4/b9fe6359084f.jpg
2 banco
 
26.08.13
19:50
(0) (Выборка.НомерСтроки = 2) - что это такое?
3 НаборДанных
 
26.08.13
19:52
http://v8.1c.ru/metod/faq2/answer.jsp?id=656
Тут все подробно изложено.
Скорее всего у тебя поле формируется как
Сообщение.Поле = "Товары["Ложь"].Количество"; - бред, согласись?
4 Sefuirotsu
 
26.08.13
20:07
(2) Прошу прощения, это я игрался с точкой останова, чтобы понять, правильно ли определяется значение.

Изначальный код с ошибкой был такой:

Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки - 1) + "].Количество";

(3) Спасибо, сейчас гляну!
5 Sefuirotsu
 
26.08.13
20:21
Вот что у меня получается:

1) Я делаю запрос на первую ошибку в списке здесь:

        "ВЫБРАТЬ
        |   МИНИМУМ(ДокТЧ.НомерСтроки) КАК НомерСтроки,

Соответственно, если у меня сразу несколько ошибок, подхватывается строка из самой первой. Например, если я ввожу кол-во товара = 50 тыс для 4 строчки, а у меня там только 1000 в наличии, то, согласно точке останова, значение Выборка.НомерСтроки подхватывается верно, и равно цифре 4.

Однако, у меня все-равно облако выскакивает не на 4 строчке, для колонки "Количество", а как на скриншоте. Посмотрел ссылку, и все-равно не могу найти ошибку. Мне кажется, что код у меня верный, но, раз облако глючит, значит, я где-то все-таки ошибаюсь.

P.S:

Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки) + "].Количество";    
или
Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки - 1) + "].Количество";
или
Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки + 1) + "].Количество";
На ошибку никак не влияет. Меняется только значение Выборка.НомерСтроки, согласно точке останова, но облако не перемещается ни выше, ни ниже... :(
6 НаборДанных
 
26.08.13
20:24
Сообщение.Поле = "Товары["+4+"].Количество";
Так что будет у тебя?
Следующее, напиши версию платформы и собственно в какой среде ты все это запускаешь?
7 Sefuirotsu
 
26.08.13
20:33
(6) Да, получается так, как ты написал. В случае, если ошибка в 4 строчке.

Версия: 1С:Предприятие 8.2 (8.2.18.61)

Среда тоже предприятие, база данных написанная с нуля, без использования каких-либо конфигураций.
8 Sefuirotsu
 
26.08.13
20:38
Попробовал сделать вот так (согласно ссылке, которую ты мне дал):

            Сообщение = Новый СообщениеПользователю;
                Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки) + "].Количество";
                Сообщение.Текст = "Не хватает товара """ + Выборка.Продукция
                + """, из необходимых " +
                Выборка.Количество + " в наличии осталось только " +
                Выборка.КоличествоОстаток + "!";
                //Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();

В результате облако вообще перестало появляться, а текст сообщения выводится только сбоку, в виде сообщения.
9 НаборДанных
 
26.08.13
20:52
(8)Ну это ты зря, убрал то установитьданные.
10 НаборДанных
 
26.08.13
20:53
Я имел в виду в какой ОС все это у тебя работает, на другом ПК пробовал, может мы тут гадаем над правильным кодом, а та позиционирование гоняет или еще какая магия.
11 Sefuirotsu
 
26.08.13
21:06
Конкретно сейчас на ОС: Windows XP SP 3 версия 5.1
сборка 2600.xpsp_sp3_qfe.100427-1650. Гоняю все это на простой, однофайловой базе.

Попробовать больше сегодня не на чем, завтра требуется уже готовый код внедрять на работе, так сказать, в "боевых условиях" :)

Как вариант, попробую еще другую сборку самой 1С...
12 Dmitry1c
 
26.08.13
21:08
Спец по платформе. Бедняга.
13 Dmitry1c
 
26.08.13
21:10
Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки = 2) + "].Количество";            
                

Попробуй не .Поле, а .ПутьКДанным
14 Dmitry1c
 
26.08.13
21:13
Нет. Надо так:

Сообщение.ПутьКДанным = "Объект";
Сообщение.Поле = "Товары[" + (Выборка.НомерСтроки = 2) + "].Количество";  

Тогда все получится.
15 НаборДанных
 
26.08.13
21:18
&НаКлиенте
Процедура Команда1(Команда)
    
    Сообщение = Новый СообщениеПользователю;
    Сообщение.Поле = "Объект.ТабличнаяЧасть1[" + 3 + "].Реквизит3";
    Сообщение.Текст = "Не хватает товара """ + """, из необходимых " +
    " в наличии осталось только " +
    "!";
    Сообщение.УстановитьДанные(Объект);
    
    Сообщение.Сообщить();
КонецПроцедуры

Накидал 1 документ с ТЧ, неужели самому было сложно проверить?
Глазастых сегодня не было, ищи отличия в коде.
Кстати у меня крутая отрисовка гг,
http://screencast.com/t/dPaef6YX