8.х Как получить количество номенклатуры на складе?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем Dimka77, 19 янв 2010.

  1. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Как УТ 10.3 получить количество определенной номенклатуры на определенном складе? :unsure:
  2. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Отчеты "Остатуи товаров на складах", "Анализ доступности товаров на складах" - с учетом резерва, "Ведомость по партиям товаров на складах" - с себестоимостью.
  3. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Спасибо за ответ, но я хотел получить остаток программно, обработку пишу, а как получить остаток не знаю, я ещё учусь :)
  4. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Запрос по вирт. таблице "ТоварыНаСкладах.Остатки":
    Код:
    ВЫБРАТЬ
    ТоварыНаСкладахОстатки.Склад,
    ТоварыНаСкладахОстатки.Номенклатура,
    ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры,
    ТоварыНаСкладахОстатки.СерияНоменклатуры,
    ТоварыНаСкладахОстатки.Качество,
    ТоварыНаСкладахОстатки.КоличествоОстаток
    ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
    
    
    условия, построитель, группировки сам добаишь. Используй конструктор запросов.

    В догонку. если есть возможность лучше использовать метод регистра накопления "Остатки", вроде этого
    Код:
    Остатки = РегистрыНакопления.ТоварыНаСкладах;
    Фильтр = Новый Структура;
    Фильтр.Вставить("Номенклатура",ВыбНоменклатура);
    Фильтр.Вставить("Склад", ВыбСклад);
    ТабОстатков = Остатки.Остатки(ВыбДата,Фильтр,
    "Номенклатура,Склад", "Количество");
    
    
    почитай в СП, пример оттуда, чуть поправленный
  5. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    А чем первый вариант хуже второго?
  6. Draco
    Online

    Draco Модераторы Команда форума Модератор

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Ребята не забываем в виртуальных таблицах про ограничения, а в данном случае Дату на которые остатки берем.А то потом люди и на экзаменах и в регистрах сведений забывают все это.
    Ведь во втором варианте Вы то пишете параметр ВыбДата.
    Код:
    |ИЗ
    |	РегистрНакопления.ТоварыНаСкладах.Остатки(КОНЕЦПЕРИОДА(&ДатаОстатков, ДЕНЬ), ) КАК ТоварыНаСкладахОстатки
    
    Ну если не указывать условия в виртуальной таблице то 1й вариант хуже. А так вообще он более распространен и используем. И в большенстве случаев далее остатки приходится проверять в запросах, так что лучше 1й. Запрос он и в африке запрос
  7. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Что-то не получается, вставил такой код:
    Код:
    Для каждого Номенклатура из Строки Цикл
    Остатки = РегистрыНакопления.ТоварыНаСкладах;
    Фильтр = Новый Структура;
    Фильтр.Вставить("Номенклатура",ВыбТовар);
    ТабОстатков = Остатки.Остатки(,Фильтр);
    ТоварОст =    ТабОстатков.Итог("Количество");
    Сообщить("Количество товара: код-"+ВыбТовар.Код+ ТоварОст);
    КонецЦикла;
    
    
    
    Результат:
    Хотя, я уверен, что остаток больше ноля.
  8. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    ВыбТовар - что в себе хранит?
  9. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    ВыбТовар = Справочники.Номенклатура.НайтиПоНаименованию("Товар1");
  10. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Вообще, нежелательно использовать метод "Остатки" в цикле. Откуда получаешь "Строки"? При получении "Строки" сразу находи и остаток. Выкладывай обработку.
  11. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Мой код интегрирую в отчет "Анализ точки заказа", что бы заявка поставщику формировалась исходя из того, что и сколько у него есть на складах, остатки поставщика хранятся на отдельном складе, по нему и хочу задавать условие на формирование заявки.
    Вот фрагмент кода отчета:
    Код:
    Для каждого Номенклатура из Поставщик.Строки Цикл
    
    Если Номенклатура.Пометка = 1 И Номенклатура.ЗаказатьКоличество > 0 Тогда
    //Начало ВСТАВКИ------------------------------------------------------------------------	
    ВыбТовар = Справочники.Номенклатура.НайтиПоНаименованию(Номенклатура.СкладПоставщикНоменклатура);
    Остатки = РегистрыНакопления.ТоварыНаСкладах;
    Фильтр = Новый Структура();
    Фильтр.Вставить("Номенклатура",ВыбТовар);
    //Фильтр.Вставить("Склад", ВыбСклад);
    ТабОстатков = Остатки.Остатки(,Фильтр);
    ТоварОст =  ТабОстатков.Количество();
    //ТоварОст =    ТабОстатков.Итог("Количество");
    Сообщить("Количество товара: код-"+ВыбТовар.Код+ ТоварОст); 
    
    //Конец ВСТАВКИ------------------------------------------------------------------------
    НоваяСтрокаТовара = ЗаполняемыйДокумент.Товары.Добавить();
    
    НоваяСтрокаТовара.Номенклатура = Номенклатура.СкладПоставщикНоменклатура;
    НоваяСтрокаТовара.ХарактеристикаНоменклатуры = Номенклатура.Характеристика;
    НоваяСтрокаТовара.ЕдиницаИзмерения = Номенклатура.СкладПоставщикНоменклатура.ЕдиницаХраненияОстатков;
    НоваяСтрокаТовара.Количество = Номенклатура.ЗаказатьКоличество;
    НоваяСтрокаТовара.Коэффициент = НоваяСтрокаТовара.ЕдиницаИзмерения.Коэффициент;
    НоваяСтрокаТовара.СтавкаНДС = НоваяСтрокаТовара.Номенклатура.СтавкаНДС;
    
    ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(НоваяСтрокаТовара, ЗаполняемыйДокумент);
    ОбработкаТабличныхЧастей.ЗаполнитьЦенуПокупкиТабЧасти(НоваяСтрокаТовара, ЗаполняемыйДокумент, СтруктураШапкиДокумента, ВалютаРегламентированногоУчета);
    
    // Рассчитываем реквизиты табличной части.
    ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(НоваяСтрокаТовара, ЗаполняемыйДокумент);
    ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(НоваяСтрокаТовара, ЗаполняемыйДокумент);
    
    // Рассчитываем плановую себестоимость.
    ОбработкаТабличныхЧастей.РассчитатьПлановуюСебестоимостьВСтрокеТабЧасти(НоваяСтрокаТовара, ЗаполняемыйДокумент, ВалютаРегламентированногоУчета);
    
    КонецЕсли;
    
    КонецЦикла;
    
    
  12. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Показывай, откуда берется Поставщик.Строки - туда и нужно добавлять поиск остатка.
  13. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Поставщик.Строки берется из кода отчета "Анализ точка заказа" типовой конфигурации УТ 10.3
    Вы думаете если туда засунуть мою вставку, то мой код заработает?
  14. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Нет, туда в запрос нужно добавить, сча посмотрю

    Хм, так там же есть остаток... выкладывай обработку.
  15. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Дык, самой обработки ещё нет, я хочу засунуть в существующий код отчета свой код, что б формировались заявки в соответствие с наличием товара у поставщика:


    Если НужнаяНоменклатураНаСладе1Постащика.Количество > 0 Тогда
    Добавить НужнаяНоменклатура(в том количестве, что есть на Складе1) в ЗаявкуНаСлад1
    Иначе НужнаяНоменклатура.Количество = НужнаяНоменклатура.Количеств - НоменклатураНаСладе1Постащика.Количество
    Если НужнаяНоменклатураНаСладе2Постащика.Количество > 0 Тогда
    Добавить НужнаяНоменклатура в ЗаявкуНаСлад2
    КонецЕсли
    КонецЕсли

    Примерно так.

    Для этого мне и надо достать остаток товара на складе, что б сравнить с заявленным количеством.
  16. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Напиши пока обработку без учета остатков на складах, а потом выкладывай.
  17. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Хорошо, вот я создал обработку, в модуле формы такой код:
    Код:
    
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    ВыбТовар = Справочники.Номенклатура.НайтиПоКоду(2081);
    Остатки = РегистрыНакопления.ТоварыНаСкладах;
    Фильтр = Новый Структура();
    Фильтр.Вставить("Номенклатура",ВыбТовар);
    ТабОстатков = Остатки.Остатки(,Фильтр);
    Сообщить(ВыбТовар.Код+ ТабОстатков.Количество());
    КонецПроцедуры
    
    
    
    Запускаю её, и что я получаю:
    Что не так?
  18. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    Код:
    Процедура КнопкаВыполнитьНажатие(Кнопка)
    
    ВыбТовар = Справочники.Номенклатура.НайтиПоКоду("011919");
    Остатки = РегистрыНакопления.ТоварыНаСкладах;
    Фильтр = Новый Структура();
    Фильтр.Вставить("Номенклатура",ВыбТовар);
    ТабОстатков = Остатки.Остатки(,Фильтр);
    Количество = ТабОстатков.Итог("Количество");
    Сообщить(ВыбТовар.Код + " " + Количество);
    
    КонецПроцедуры
    
    У меня работает. Код, наверное, все-таки строковый.
  19. TopicStarter Overlay
    Dimka77
    Offline

    Dimka77 Опытный в 1С

    Регистрация:
    6 июн 2009
    Сообщения:
    279
    Симпатии:
    0
    Баллы:
    26
    Stack_G, вставляю твой код, только код номенклатуры меняю на свой и опять всё по нулям, да что ж такое???
    А можно как-то просмотреть, что находится в ТабОстатков? Меня смущают пробелы между кодом и количеством, откуда они?
  20. Stack_G
    Offline

    Stack_G Опытный в 1С

    Регистрация:
    10 дек 2007
    Сообщения:
    786
    Симпатии:
    2
    Баллы:
    26
    перепиши перввую строчку:
    Код:
    ВыбТовар = Справочники.Номенклатура.НайтиПоКоду("2081       ");
    
    (семь пробелов после 2081) - у тебя код справочника строковый, вот он ничего не находит, т.к. не находит номенклатуру.

Поделиться этой страницей