Имя: Пароль:
1C
1С v8
Учет остатков на складе
0 GVS13
 
11.11.17
16:51
Привет всем! Ребятки, помогите пожалуйста. С 0 пишу конфу, учет прихода, расхода и перемещения товаров по складам.
Сделала запрос в документе расход на вывод ошибки, если на остатках не достаточно товара. Подобное действо должно происходить в документе перемещение с одного склада на другой. При отладке ошибка не выскакивает и перемещение проводится в минус((( Посмотрите, пожалуйста, где ошибка в тексте запроса.


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

П.С. я совсем новичок, не судите строго)
1 deaddy64
 
11.11.17
17:04
(0) рекомендую посмотреть как это сделано в типовых. Будет четкое понимание.
в запросе слишком многое не так. Нет фильтров, не используются вирт таблицы, соединение тоже вроде как не совсем верное...
2 deaddy64
 
11.11.17
17:07
(1) "не используются вирт таблицы" = "не используются параметры в вирт таблицах"
3 Фрэнки
 
11.11.17
17:26
если не слишком глубоко ломать голову, то принимаем следующее:
1) документ уже записан.
2) выбираем данные из табчасти документа.
3) левое соединение данных остатков с табчастью документа
4 h-sp
 
11.11.17
17:26
(2) но вроде этот кусок должен работать, ошибка в чем-то другом.
5 jsmith82
 
11.11.17
17:28
зачем внутреннее?!
6 jsmith82
 
11.11.17
17:29
у тебя заранее отсекаются товары, которых нет в остатках на складе
7 jsmith82
 
11.11.17
17:30
табчасть левое остатки
8 AlvlSpb
 
12.11.17
11:54
(0) Ошибка в выборе таблиц для соединения. Ваше ПеремещениеТовара.ТабличнаяЧасть1.(Номенклатура) возвращает не поле, а результат запроса. Нужен либо доп Цикл, чтобы из этого результата извлечь поле или (значительно проще и правильней) обращаться сразу не к документу, а к его таблице

ВЫБРАТЬ
| ОстаткиОстатки.Номенклатура,
|    ОстаткиОстатки.Склад,
|    ОстаткиОстатки.КоличествоОстаток,
|    ПеремещениеТовараТабличнаяЧасть1.Ссылка.СкладОткуда,
|    ПеремещениеТовараТабличнаяЧасть1.Номенклатура
|ИЗ
|    РегистрНакопления.Остатки.Остатки КАК ОстаткиОстатки
|        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.ПеремещениеТовара.ТабличнаяЧасть1 КАК ПеремещениеТовараТабличнаяЧасть1
|        ПО ОстаткиОстатки.Номенклатура = ПеремещениеТовара.ТабличнаяЧасть1.Номенклатура
|            И ОстаткиОстатки.Склад = ПеремещениеТовара.ТабличнаяЧасть1.Ссылка.СкладОткуда
|ГДЕ
|    ОстаткиОстатки.КоличествоОстаток < 0"

Ну и прислушайся к (1).
9 GVS13
 
14.11.17
08:50
Добавила вирт таблицу. Теперь выскакивает ошибка
{(6, 2)}: Таблица не найдена "НоменклатураДокумента"
<<?>>НоменклатураДокумента КАК НоменклатураДокумента

Текст

Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        

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

Поищите видео на ютубах обучающее таким приемам работы в конфигураторе. Там реально визуализация всего обучения нужна, а не текстом в форуме расписывать, что и куда нажимать.
12 Фрэнки
 
14.11.17
09:03
И забудьте уже про это ВНУТРЕННЕЕ СОЕДИНЕНИЕ несчастное - откуда Вам вообще в голову идея пришла, что его в этой задачке нужно приспособить???
13 GVS13
 
14.11.17
09:10
Запрос пишу через конструктор, после выбора необходимых таблиц и установки условий текст запроса выводится в таком виде.
14 Фрэнки
 
14.11.17
09:21
(13) насколько я понимаю, их конструктора просто не получится выйти с таким текстом запроса. В нем нет основной выборки или как там ее правильно называют. После этой конструкции
|ПОМЕСТИТЬ НоменклатураДокумента

где-то дальше должно быть еще раз ВЫБРАТЬ в которой не будет указано ПОМЕСТИТЬ

А у Вас не так - значит это не Конструктор сделал
15 FIXXXL
 
14.11.17
09:45
(14) нормально конструктор сформирует
результатом запроса будет число строк в таблице :)
16 Фрэнки
 
14.11.17
11:27
(13) если это еще нужно, могу скинуть файл чистой базы с решением только данного примера
17 azernot
 
14.11.17
11:46
Ошибка везде. И не только в запросе (даже если его поправить с учётом (8).

На остатке 1 шт (не отрицательный остаток, запрос его не поймает). Перемещение списывает 2 штуки.
Вуаля, отрицательный остаток на складе.
18 azernot
 
14.11.17
11:59
Вот так должен выглядеть ваш запрос, если пытаться решить именно вашу задачу, именно вашим способом.


ВЫБРАТЬ
    ПеремещениеТабличнаяЧасть1.Номенклатура КАК Номенклатура,
    СУММА(ПеремещениеТабличнаяЧасть1.Количество) КАК Количество
ПОМЕСТИТЬ НоменклатураКСписанию
ИЗ
    Документ.Перемещение.ТабличнаяЧасть1 КАК ПеремещениеТабличнаяЧасть1
ГДЕ
    ПеремещениеТабличнаяЧасть1.Ссылка = &Ссылка

СГРУППИРОВАТЬ ПО
    ПеремещениеТабличнаяЧасть1.Номенклатура
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    НоменклатураКСписанию.Номенклатура КАК Номенклатура,
    НоменклатураКСписанию.Количество КАК Количество,
    ЕСТЬNULL(ОстаткиОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
    НоменклатураКСписанию.Количество - ЕСТЬNULL(ОстаткиОстатки.КоличествоОстаток, 0) КАК КоличествоНехватает
ИЗ
    НоменклатураКСписанию КАК НоменклатураКСписанию
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Остатки.Остатки(
                ,
                Склад = &СкладОткуда
                    И Номенклатура В
                        (ВЫБРАТЬ
                            НоменклатураКСписанию.Номенклатура
                        ИЗ
                            НоменклатураКСписанию)) КАК ОстаткиОстатки
        ПО (ОстаткиОстатки.Номенклатура = НоменклатураКСписанию.Номенклатура)
ГДЕ
    ЕСТЬNULL(ОстаткиОстатки.КоличествоОстаток, 0) < НоменклатураКСписанию.Количество
19 GVS13
 
14.11.17
19:31
Да, вопрос все еще актуален, спасибо всем кто помогает!
20 vicof
 
14.11.17
20:29
Почему еще никто не затребовал фотку?
21 Волшебник
 
модератор
14.11.17
21:37
(0) Зачем Вы пишете с нуля конфу, которых уже тысячи?
22 jsmith82
 
14.11.17
21:46
(21) хелловорлд же
23 jsmith82
 
14.11.17
21:47
Просто у 1сников требования повыше к хелловорлду
Как минимум - мини-конфа по складу
24 Фрэнки
 
14.11.17
21:47
(21) вероятно, что изучает программирование. Есть даже целая книга, построенная целиком на разработке простейшей конфигурации "с нуля" для демонстрации основных приемов программирования
25 Фрэнки
 
14.11.17
21:48
правда, книга эта идет в комплекте с учебной версией 1С, но ТС почему то не хочет искать примеры там, а пытается вытащить что-то здесь...
26 Волшебник
 
модератор
14.11.17
21:49
(24) Ага, Митичкин писал ещё по 7.7
http://old.mista.ru/tutor_1c/example_sklad.htm
27 GVS13
 
14.11.17
22:03
Изучаю 1С по пособию Радченко, но не все мне там понятно((
28 Волшебник
 
модератор
14.11.17
22:05
(27) Вы можете задавать вопросы самому Радченко. Не надо плодить на мисте темы по книге Радченко. Имейте совесть!
29 jsmith82
 
14.11.17
22:32
(27) Я даже знаю что. Раздел Зарплата и Планы обмена
30 KSN
 
14.11.17
23:00
(0) Теряют хватку одинесники... ФОТО где???
31 azernot
 
15.11.17
10:14
(19) Чем не устраивает (18)? Почему вопрос ещё актуален?
32 GVS13
 
15.11.17
13:48
Всем спасибо за помощь! Получилось