Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с запросами. (Временные таблицы)
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 8.2 > Программирование обычных форм 1С 8.2 и не интерфейсной логики
beber
Всем Добрый день. Я только начал изучать программирование на 1С для собственных целей. Пишу свою конфигурацию для своего предприятия. Написал немного, но уже столкнулся с одной проблемой. Хочу сделать контроль отрицательных остатков при перемещении по складах, а никак не получается. Нашел в книге пример, как это сделать, игрался игрался - не получается.
Вот код:
Процедура ОбработкаПроведения(Отказ, Режим)
    
    Движения.ПриходТовара.Записывать = Истина;
    
    МенеджерВТ = Новый МенеджерВременныхТаблиц;
        
    Запрос = Новый Запрос;
    Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ВыполненаяРаботаТовары.Товар КАК Товар,
        |    ВыполненаяРаботаТовары.Количество КАК Количество
        |ПОМЕСТИТЬ НоменклатураДокумента
        |ИЗ
        |    Документ.ВыполненаяРабота.Товары КАК ВыполненаяРаботаТовары
        |ГДЕ
        |    ВыполненаяРаботаТовары.Ссылка = &Ссылка
        |
        |СГРУППИРОВАТЬ ПО
        |    ВыполненаяРаботаТовары.Товар,
        |    ВыполненаяРаботаТовары.Количество";

    Запрос.УстановитьПараметр("Ссылка", Ссылка);

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

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Движение = Движения.ПриходТовара.Добавить();
        Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
        Движение.Период = Дата;
        Движение.Склад = СкладКуръера;
        Движение.Товар = ВыборкаДетальныеЗаписи.Товар;
        Движение.Количество = ВыборкаДетальныеЗаписи.Количество;
    КонецЦикла;

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


По реквизитам вроде все правильно. При включенных временных таблицах пишет ошибку:

Ошибка при выполнении обработчика - 'ОбработкаПроведения'
по причине:
{Документ.ВыполненаяРабота.МодульОбъекта(35)}: Поле объекта не обнаружено (Товар)
Движение.Товар = ВыборкаДетальныеЗаписи.Товар;

Помогите разобраться.
Vofka
Цитата
Я только начал изучать программирование на 1С для собственных целей. Пишу свою конфигурацию для своего предприятия.

faceoff.gif

В регистре ПриходТовара измерения (ресурса) Товар нету.
beber
Спасибо, но не помогло. У меня в регистре ПриходТовара есть измерение Товар.

Все работает если не использовать Временные таблицы. Но без них я не могу контролировать отрицательные остатки.
logist
Уберите это:
        Запрос3.МенеджерВременныхТаблиц = МенеджерВТ;
Домовик
Понятия не имею о временных таблицах. Но в примере еще Запрос.Выполнить() перед ТЕкстом, а потом опять выполнить.
Но синтаксиз аналогичен.

МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблиц;

Запрос.Выполнить();
Запрос.Текст="ВЫБРАТЬ * из ВременнаяОсновная";
ТзПередано=Запрос.Выполнить().Выгрузить();


Beber, повторюсь, а в отладчике через табло посмотреть чего там в Движения?

Розбираюсь потихеньку
"Если временная таблица создается, используется и уничтожается в рамках одного пакета запросов, менеджер временных таблиц создавать не нужно". схоже, не потрібно їх вам використовувати.
Домовик
Менеджер временных таблиц дає змогу утримувати запросом зразу кілька тимчасових таблиць. У вашому першому випадку, здається, їх створилось дві. Одна пуста, і друга ваша, яку ви створили на основі фізичної таблиці. Тут проблема, можливо з позиціонуванням на потрібній таблиці. Взагалі. В першому випадку не потрібно ніяких менеджерів.

ой-ой-ой! А по количеству нащо групуєте? Там уже у вашій тимчасовій колонки Товар немає. А я тут "Размышляю"..... )

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