[РЕШЕНО] Регистр Накопления (остатки)

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

  1. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Всем доброго времени суток!
    Платформа: 8.3.5.1231

    Подскажите как в результат запроса, вывести нулевые остатки.

    Есть регистр накопления СН(СерийныеНомера) .
    Есть документы Регистраторы: ПоступлениеТоваровУслуг и ПеремещениеТоваров
    Поступление товаров, делает движение приход
    Документ перемещение делает расход
    Вот в документе перемещение, прежде чем делать расход, мне нужно проверить остаток и если остаток 0, запретить проведение.
    Как это лучше сделать?
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    если нет номенклатуры в результате запроса - остаток по этой номенклатуре на выбранном складе = 0
  3. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    У меня в регистре накопления есть Измерения:
    Номенклатура,Склад, СерийныйНомер

    Мне в принципе, измерение Номенклатура, нужен только при выводе отчета.
    По этому, остатки можно отбирать только по СерийныйНомер.

    Оно кстати понятно, что если результат запроса пустой, то остаток 0.
    Но! Как не делать запрос внутри цикла?
    Вот листинг движения:

    Код:
        Движения._СерийныеНомераОстатки.Очистить();
        Для Каждого ТекСтрокаСерийныеНомера Из СерийныеНомера Цикл
            Движение = Движения._СерийныеНомераОстатки.Добавить();
            Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
            Движение.Период = Дата;
            Движение.Склад = СкладОтправитель;
            Движение.Номенклатура = ТекСтрокаСерийныеНомера.СерийныйНомер.Владелец;
            Движение.СерийныйНомер = ТекСтрокаСерийныеНомера.СерийныйНомер;
            Движение.Количество = 1;
        КонецЦикла;
    
    Мне нужно в него воткнуть проверку на наличие остатков.
    --- Объединение сообщений, 20 июл 2015 ---
    И как всё таки в запрос вывести нулевые остатки (нужно будет для отчета)?
    Последнее редактирование: 20 июл 2015
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Если серийные номера уникальны, то советую сделать измерение "СерийныйНомер" первым в списке.

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

    Для отчета 0-е остатки получают путем соединения таблицы номенклатуры с таблицей остатков левым соединением, в вашем случае это будет таблица серийных номеров с таблицей остатков.
  5. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Да найдите в инете где нить пример решения задачи на специалиста по платформе - там такая зада есть.
  6. vartanet
    Offline

    vartanet Опытный в 1С Команда форума

    Регистрация:
    16 ноя 2010
    Сообщения:
    2.698
    Симпатии:
    15
    Баллы:
    29
    сначала получите номенклатуру по справочнику, а затем левым соединением прилепите остатки.
    --- Объединение сообщений, 20 июл 2015 ---
    что-то типа:

    ВЫБРАТЬ
    Номенклатура.Ссылка КАК Ссылка
    ПОМЕСТИТЬ вт1
    ИЗ
    Справочник.Номенклатура КАК Номенклатура

    ИНДЕКСИРОВАТЬ ПО
    Ссылка
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    ТоварыВПутиОстатки.Номенклатура КАК Номенклатура,
    ТоварыВПутиОстатки.КоличествоОстаток
    ПОМЕСТИТЬ вт2
    ИЗ
    РегистрНакопления.ТоварыВПути.Остатки КАК ТоварыВПутиОстатки

    ИНДЕКСИРОВАТЬ ПО
    Номенклатура
    ;

    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
    вт1.Ссылка,
    вт2.Номенклатура,
    вт2.КоличествоОстаток
    ИЗ
    вт1 КАК вт1
    ЛЕВОЕ СОЕДИНЕНИЕ вт2 КАК вт2
    ПО вт1.Ссылка = вт2.Номенклатура
  7. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Вот вам пример.

    Код:
    ВЫБРАТЬ
        СпрНоменклатура.Ссылка КАК Номенклатура,
        0 КАК Количество
    ИЗ
        Справочник.Номенклатура КАК СпрНоменклатура
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
            ПО СпрНоменклатура.Ссылка = ТоварыНаСкладахОстатки.Номенклатура
    ГДЕ
        СпрНоменклатура.ПометкаУдаления = ЛОЖЬ
        И СпрНоменклатура.ЭтоГруппа = ЛОЖЬ
        И ТоварыНаСкладахОстатки.ВНаличииОстаток ЕСТЬ NULL 
    --- Объединение сообщений, 21 июл 2015 ---
    А где условие на ноль?
  8. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    Чет я смысл последнего примера не совсем понял.
    1. мы сейчас речь ведем о документах и номенклатуру надо брать из ТЧ документа
    2. И не совсем понятен ТоварыНаСкладахОстатки.ВНаличииОстаток ЕСТЬ NULL
  9. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Ну Андрей кофе еще только пью.. сам топ не читал.. к заголовку то ответ подходит).

    Тогда предлагаю после проведения проверять остатки по документу и при условии присутствия отрицательных делать отказ.. так сейчас делается в последних конфигурациях УТ 11 и ERP , сначало проводит потом проверяет.

    Код:
    ВЫБРАТЬ
        ПеремещениеТоваровТовары.Номенклатура,
        ТоварыНаСкладахОстатки.ВНаличииОстаток
    ИЗ
        Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
            ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
            ПО ПеремещениеТоваровТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
                И ПеремещениеТоваровТовары.Серия = ТоварыНаСкладахОстатки.Серия
                И ПеремещениеТоваровТовары.Ссылка.СкладОтправитель = ТоварыНаСкладахОстатки.Склад
    ГДЕ
        ТоварыНаСкладахОстатки.ВНаличииОстаток < 0
        И ПеремещениеТоваровТовары.Ссылка.Ссылка = &Документ
    --- Объединение сообщений, 21 июл 2015 ---
    Немного уточню.. вам точно нужен нулевой остаток а не отрицательный?
    Последнее редактирование: 21 июл 2015
  10. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    А характеристика?
    Вот недавно как раз обсуждали характеристики и об этом писал. вот в коде нет соединения по характеристики, а захотят люди вести по характеристикам номенкалтуру и тогда неверно будет работать.
  11. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Андрей в топике нет, но ТС и не просит за него задачу решить,я показал как пример.. а по каким полям связывать сам решает пусть.. у него может и конфа другая и поля по другому называются.
  12. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.649
    Симпатии:
    948
    Баллы:
    204
    ТЫ просто серию добавил, я характеристику нет - вот я и написал.
    Почему такая изберательность. либо когда ты писал, добавляя серию ты какм то принципом руководствовался, почему тогда характеристики нет. либо код откудо то скопирован, а значит он сне совсем правильный и требует правки.
    А автору топика - будет как раз полезно знать.
    И кстати ТоварыНаСкладахОстатки.ВНаличииОстаток -это то же не везде есть
    --- Объединение сообщений, 21 июл 2015 ---
    И смысл этого реквизита не совсем понятен, остаток он либо есть либо нет. прием тут значенеи истина.
    Возьму я РегистрНакопления.ТоварыНаСкладах.Остатки(&Дата,)
    Если по товару нет остатка, то ничего не выдаст, какой смысл в этом реквизите тогда?
  13. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Блин Андрей , а если смысл не понятен то и нефиг лезть в обработку проведения.. научиться сначала запросы писать

    Это так для информации

    [​IMG]

    Второе, я не знаю что за база у ТС+мне честно влом руками писать запрос(хотя по его движениям структуру понять можно, есть у него там характеристики? Не знаю!! ибо нет конфы в которой он пишет, может самопис.)+Я привел пример на том регистре на котором смог, это ресурсы моего регистра(УТ 11). Если мой пример не помог ТС сорри)) ни на что не претендую.. Жду решений от вас.)
  14. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Во вы стратеги. Тут тему развернули. :)
    Мне то всего и надо было что, сделать так:

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

    Что до отчета, то до него ещё далеко. Но! Мне в отчете номенклатура особо-то и не нужна, а нужен отчет по серийным номерам. Т.е. отчет должен выглядеть, примерно так:

    Номенклатура ДатаПоступления ДатаПеремещения СкладПеремещения ДатаПродажи
    СН1 01.01.2000 02.01.2000 Склад1 03.01.2000
    СН2
    СН3

    Для этого у меня есть Регистры ОстаткиСН(остатки), ОстаткиСНВРОзнице(остатки) и ПродажиСН(обороты) - вот из них я впринципе и буду тянуть данные в отчет, может в один, а может это будет разделено на несколько разных отчетов, я пока не знаю. Но напомню, до этого пока ещё далеко :).

    За примеры, спасибо.
  15. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    А партионка по средней взвешенной что ли всегда?
  16. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    А зачем мне, по серийным номерам, вести учёт в разрезе партий? Цены у СН нету, а количество всегда 1, так как СН уникален.
  17. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.581
    Симпатии:
    717
    Баллы:
    204
    Не совсем понятно,почему проверка на наличие идет по всем складам, а не по СкладуОтправителю.
    Peroman нравится это.
  18. TopicStarter Overlay
    Peroman
    Offline

    Peroman Опытный в 1С

    Регистрация:
    26 май 2009
    Сообщения:
    879
    Симпатии:
    13
    Баллы:
    29
    Во. А тут кстати верное замечание, тем боле что мне не надо давать делать перемещение между розничными складами. Нужно ещё несколько проверок добавить в проведение.
    Спасибо за мысль
  19. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Смотри
    Не в проведение , а в запрос.
Похожие темы
  1. desintegrer
    Ответов:
    11
    Просмотров:
    1.586
Загрузка...

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