Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запрос по залишкам товару на складі з нульовими залишками
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 > Программисту > Программирование в 1С Предприятие 7.7
vovkpro
Добрий вечір. Створив запрос для отримання залишку товарів по складу на зараз. 1С 77. Торгівля + склад дороблена.
Виводиться товар по складу із НЕНУЛЬОВИМИ ЗАЛИШКАМИ. Будь ласка підкажітть як вивести весь товар по складу (щоб були і нульові залишки але тільки по вибраному складу?)
В 1с створив новий документ ЗаказНаряд.... все працює... А із запросами чогось не виходить. Колись пропустив цю тему при вивченні 1С....
Процедура ВивЗал()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Обрабатывать НеПомеченныеНаУдаление;
    |Фирма = Регистр.ОстаткиТоваров.Фирма;
    |ФлагУчета=Регистр.ОстаткиТоваров.ФлагУчета;
    |Товар = Регистр.ОстаткиТоваров.Товар.Наименование;
    |Скл = Регистр.ОстаткиТоваров.Склад;
    |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
    |Функция КонОст1 = КонОст(ОстатокТовара) когда((Скл = спрСклад.ТекущийЭлемент()) и (Фирма = спрФирма.ТекущийЭлемент()));
    |Группировка Товар;
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    //Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл //Необходимо что бы в отчёт не лезли названия категорий и подкатегорий. Только товар
            // Заполнение полей Товар
            Таб.ВывестиСекцию("Товар");
          // Сообщить(Запрос.Товар);
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
denis84
vovkpro @ Вчера, 22:29 необходимо зарегистрироваться для просмотра ссылки ,
//*******************************************
Процедура Сформировать()
    Перем ИндСкл;
    Запр = СоздатьОбъект("Запрос");
    Таб = СоздатьОбъект("Таблица");
        Таб.ИсходнаяТаблица("Таблица");

    ТекстЗапр = "";
    Заг = "";
    Заг1 = "";
    Заг2 = "";

    ПозицияОтчета = ДатаПо;

    ТекстЗапр = "
    |Период с ДатаС по ДатаПо;
    |Фир = Регистр.Остатки.Фирма;
    |Скл = Регистр.Остатки.МестоХранения;
    |ТМЦ = Регистр.Остатки.ТМЦ;
    |УчЦена = Регистр.Остатки.ТМЦ.УчетнаяЦена;
    |Кво = Регистр.Остатки.ОстатокТовара;
    |Условие (Скл.Тип = Перечисление.ТипыМестХранения.Склад);";
    
    Если ПустоеЗначение(выбФирма) = 0 Тогда
              ТекстЗапр = ТекстЗапр + "
                 |Условие (Фир = выбФирма);";
    КонецЕсли;
    
    Если ПустоеЗначение(выбСклад) = 0 Тогда
          ТекстЗапр = ТекстЗапр + "
         |Условие ((Скл в выбСклад) ИЛИ (Скл = выбСклад));";
        КонецЕсли;
    
    Если ПустоеЗначение(выбТМЦ) = 0 Тогда
          ТекстЗапр = ТекстЗапр + "
          |Условие (ТМЦ в выбТМЦ);";
        КонецЕсли;
    
    ТекстЗапр = ТекстЗапр + "
    |Функция НОКво = НачОст(Кво);    
    |Функция ПКво = Приход(Кво);
    |Функция РКво = Расход(Кво);
    |Функция КОКво = КонОст(Кво);
    |Группировка Скл Без Групп Упорядочить по Скл.Код;
    |Группировка ТМЦ упорядочить по ТМЦ.Код;";


    Если ВыбТМЦ.РазмерСписка() = 0 Тогда
        Заг1 = Заг1 + "По всім ТМЦ. ";
    Иначе
        Заг1 = Заг1 + "По ТМЦ зі списку: " + ВыбТМЦ.ВСтрокуСРазделителями() + ". ";
    КонецЕсли;
    Если ВыбСклад.Выбран() = 0 Тогда
        Заг2 = Заг2 + "По всім складам.";
    Иначе
        Заг2 = Заг2 + "По складу " + ВыбСклад.Наименование + ".";
    КонецЕсли;

    Если Запр.Выполнить(ТекстЗапр) = 0 Тогда
        Возврат;
    КонецЕсли;

    Таб.ВывестиСекцию("Шапка");
    
    Пока Запр.Группировка("Скл") = 1 Цикл
        ИндСкл = 0;
        текНом = 0;
        Пока Запр.Группировка("ТМЦ") = 1 Цикл
            Если Запр.ТМЦ.ЭтоГруппа()=0 Тогда
                УчЦена = Запр.ТМЦ.УчетнаяЦена.Получить(ДатаПо);
                КвоОст = (Запр.НОКво+Запр.ПКво)-Запр.РКво;
                
                Если КвоОст = 0 Тогда
                    Если ИндСкл = 0 Тогда
                        Таб.ВывестиСекцию("Скл");
                        ИндСкл = 1;
                    КонецЕсли;
                    текНом = текНом + 1;
                    Таб.ВывестиСекцию("ТМЦ");    
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
    КонецЦикла;
    Таб.Опции(0,0,Таб.ВысотаСекции("Шапка"),0);
    Таб.ТолькоПросмотр(1);
    Таб.ПараметрыСтраницы(2,100,,10,5,5,,,,,,);
    Таб.Показать("Залишки ТМЦ по складам");
КонецПроцедуры


щось типу такого колись писав. Спробуйте!
Profi_1C77
vovkpro @ Вчера, 22:29 необходимо зарегистрироваться для просмотра ссылки ,
Если 0 остаток, его "в регистре не будет" , измените запрос: чтоб делал выборку и по справочнику ( Номенклатура / Товары);
|Товар = Регистр.ОстаткиТоваров.Товар.Наименование,Справочник.Товары.Товар;

Вроде так.

Или как Вариант 2:
Делайте перебор всего справочника, и при выводе строки отчета используйте
СводныйОстаток(<?>,)
Синтаксис:
СводныйОстаток(<Измерен1>,<Измерен2>...,<ИмяРесурса>)
Назначение:
Возвращает значение сводного остатка заданного ресурса регистра.
Параметры:
<Измерен1>,<Измерен2>... - значения измерений регистра;
<ИмяРесурса> - название требуемого ресурса регистра.
vovkpro
denis84 @ Сегодня, 9:24 необходимо зарегистрироваться для просмотра ссылки ,
Дякую. Зараз буду пробувати. Мене смущаї тут
 Если ПустоеЗначение(выбТМЦ) = 0 Тогда
          ТекстЗапр = ТекстЗапр + "
          |Условие (ТМЦ в выбТМЦ);";
        КонецЕсли;

выбТМЦ- це наперед вибраний список товару....? Я не можу наперед вибрати товар...
і ще тут
Если ВыбТМЦ.РазмерСписка() = 0 Тогда
        Заг1 = Заг1 + "По всім ТМЦ. ";

Де і Як Змінна Заг1 використовується.... тут вона тільки визначається...
Дякую

Profi_1C77 @ Сегодня, 10:28 необходимо зарегистрироваться для просмотра ссылки ,
Дякую за відповідь.
На мою думку при таких запитах буде виводитись весь товар із довідника Номенклатура. Тобто той якого ніколи не було по цьому складу. Хоч він був і може бути зараз на іншому складі.
Мене цікавить вибірка по одному конкретно вибраному сладу. Щоб вивод нульові залишки і не нульові. Думаю такий звіт неможливо зробити..... 1С не тримає (регіст залишки товарів) таблиця (Ra123.dbf- зміна залишків при провед доків) або (Rg123.dbf - зал по періодах (місяцях)). Коли відбувається відкриття наступного місяця. То лінійки дбф з товаром складом і фірмою не переносяться на наступний місяць якщо залиш = 0...
Profi_1C77
vovkpro @ Сегодня, 10:39 необходимо зарегистрироваться для просмотра ссылки ,
Цитата(vovkpro @ 26.11.24, 10:39) необходимо зарегистрироваться для просмотра ссылки
выбТМЦ- це наперед вибраний список товару....? Я не можу наперед вибрати товар...
і ще тут

Если список пустой, должен быть в модуле как СписокЗначений, то условие отбора не выполнится, т.е будут все элементы;
Цитата(vovkpro @ 26.11.24, 10:39) необходимо зарегистрироваться для просмотра ссылки
Если ВыбТМЦ.РазмерСписка() = 0 Тогда
        Заг1 = Заг1 + "По всім ТМЦ. ";

Заг1 = Переменная для вывода в В Заголовке/ Шапке отчета фильтра товаров;
vovkpro
vovkpro @ Сегодня, 10:50 необходимо зарегистрироваться для просмотра ссылки ,
Можна ченез фокспро або запитом в 1С Вибрати по всій базі по всіх періодах товар який колись був на залишку по цьому складу. Поді пройтися по цьому списку і вибрати залишки на зараз. Якщо товару зараз нема на залишку буде 0....
denis84
vovkpro @ Сегодня, 10:50 необходимо зарегистрироваться для просмотра ссылки ,
в запросах оператор "в" означає, що по всим ТМЦ буде формуватися
Profi_1C77
vovkpro @ Сегодня, 10:50 необходимо зарегистрироваться для просмотра ссылки ,
Правильно, Вы ж хотите что выводило и 0. Скажем у Вас новый товар который никогда не был в обороте в по этому складу , логично что остаток будет 0.
Что б наверняка используйте функцию СводныйОстаток


Цитата(denis84 @ 26.11.24, 10:57) необходимо зарегистрироваться для просмотра ссылки
в запросах оператор "в" означає, що по всим ТМЦ буде формуватися

Верно, но если Список пустой ( там стоит условие)
Цитата(vovkpro @ 26.11.24, 10:50) необходимо зарегистрироваться для просмотра ссылки
Если ПустоеЗначение(выбТМЦ) = 0 Тогда

Отбора по списку не будет.
vovkpro
Profi_1C77 @ Сегодня, 10:58 необходимо зарегистрироваться для просмотра ссылки ,
Скажем у Вас новый товар который никогда не был в обороте в по этому складу
При такому запиті цей товар буде попадати у звіт по кожному складу і показувати залишок 0 ....?
Мені потрібно щоби по кожному складу був ТІЛЬКИ товар який коли небудь (рік тому) був на цьому складі а зараз його немає там І ЗАЛИШКУ 0 ТЕЖ НЕМАЄ В БАЗІ ПО ЦЬОМУ СКЛАДУ ФІЗИЧНО НА ТЕПЕРІШНІЙ ПЕРІОД. Можливо за якийсь ПЕРІОД (місяць) в базі є запис по ньому із залишком 0. А також щоб був товар який є зараз на цьому складу...
Profi_1C77
vovkpro @ Сегодня, 11:05 необходимо зарегистрироваться для просмотра ссылки ,
Тогда, анализируем Все варианты остатка, накидал по - быстрому в конструкторе :
Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Фирма = Регистр.ОстаткиТоваров.Фирма;
    |Товар = Регистр.ОстаткиТоваров.Товар;
    |Склад = Регистр.ОстаткиТоваров.Склад;
    |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
    |Функция ОстатокТовараНачОст = НачОст(ОстатокТовара);
    |Функция ОстатокТовараПриход = Приход(ОстатокТовара);
    |Функция ОстатокТовараРасход = Расход(ОстатокТовара);
    |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
    |Группировка Товар;
    |Условие(Склад = ВыбСклад);
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей Товар
            Если (Запрос.НачОст<>0)  или (Запрос.Приход<>0) или (Запрос.Расход<>0) или (Запрос.КонОст<>0)  Тогда
                
            Таб.ВывестиСекцию("Товар");
        КонецЕсли;
    КонецЦикла;
    // Заполнение полей "Итого"
    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры
vovkpro
Profi_1C77 @ Сегодня, 11:17 необходимо зарегистрироваться для просмотра ссылки ,
ЦЕ ХОРОША ІДЕЯ !..... Зараз спробую перенести в 1С і запустити...
denis84
Profi_1C77 @ Сегодня, 11:02 необходимо зарегистрироваться для просмотра ссылки ,
в мене написано запрос під специфіку нашого довідника ТМЦ. Там не важко викинути ті умови, які Вам не підходять і там все працюватиме.
Profi_1C77
Цитата(Profi_1C77 @ 26.11.24, 11:17) необходимо зарегистрироваться для просмотра ссылки
Если (Запрос.НачОст<>0)  или (Запрос.Приход<>0) или (Запрос.Расход<>0) или (Запрос.КонОст<>0)  Тогда

Там ошибка - должно быть : Запрос.ОстатокТовараНачОст , Запрос.ОстатокТовараПриход .....
vovkpro
Profi_1C77 @ Сегодня, 11:17 необходимо зарегистрироваться для просмотра ссылки ,

Вискочило....
Если (Запрос.НачОст<>0) или (Запрос.Приход<>0) или (Запрос.Расход<>0) или (Запрос.КонОст<>0) Тогда
{Обработка.OstatkiRozprodazhi.Форма.Модуль(188)}: Поле агрегатного объекта не обнаружено (НачОст)
Вже побачив зараз виправлю

vovkpro @ Сегодня, 11:35 необходимо зарегистрироваться для просмотра ссылки ,
Ніби працює... Дуже Вам Дякую. Зараз піду до бухів. Хай Глянуть чи їм підходить.... Можливо ще прийдеться вивести ціну у гривні...
Profi_1C77
Цитата(vovkpro @ 26.11.24, 11:53) необходимо зарегистрироваться для просмотра ссылки
Ніби працює... Дуже Вам Дякую

Спасибо/ Дякую там кнопка есть ) icon_beer17.gif
vovkpro
Profi_1C77 @ Сегодня, 11:59 необходимо зарегистрироваться для просмотра ссылки ,
Дякую Вам Ще раз. Також Дякую всім хто допомагав.
vovkpro
Profi_1C77, Profi_1C77,
Вибачте, що турбую.... Можна ще в запросі зробити так щоби спочатку виводились лінійки товару потім лінійки його підпапок і потім лінійки головних папок товару...
Під час такого виводу я зможу вибрати із довідника цін Закупочну, помножити її на залишок і отримати вартість товару на складі по цій ціні. Потім просумувати по підпапці і потім по головній папці.

vovkpro @ Сегодня, 15:21 необходимо зарегистрироваться для просмотра ссылки ,
необходимо зарегистрироваться для просмотра ссылки
tibank
Да, насколько проще все это делать прямыми запросами. Если есть желание, учите, проще писать запросы и работает на порядок быстрее
vovkpro
tibank @ Вчера, 21:54 необходимо зарегистрироваться для просмотра ссылки ,
Замість запросів у мене є багато звітів на фокспро якщо мова йде про великі обєми інформаціїї. Фокспро в десятки разів скоріше працює із таблицями .dbf В яких 1С 7 зберігає свої дані. Особливо коли в базі велика кількість документів і сама по собі база виростає протягом року.
Також на фокспро я кожного року обрізаю базу із декількох гігабайт до 400 мегабайт.... (обрізка відбувається протягом 30 хвилин) Єдине що в 1с кращий інтерфейс у звітах...
vovkpro
vovkpro @ Сегодня, 10:35 необходимо зарегистрироваться для просмотра ссылки ,
Доробив через вигрузку у тз. Дещо криво але працює. Папки і підпапки сумуються по вартості товару. Звіт використовується не часто. Всім хто допомагав дякую.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.