Версия для печати темы (https://pro1c.org.ua/index.php?s=d2e4f760af17c15e46318c9cc0570f8b&showtopic=67679)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Запрос по залишкам товару на складі з нульовими залишками

Автор: vovkpro 25.11.24, 22:29

Добрий вечір. Створив запрос для отримання залишку товарів по складу на зараз. 1С 77. Торгівля + склад дороблена.
Виводиться товар по складу із НЕНУЛЬОВИМИ ЗАЛИШКАМИ. Будь ласка підкажітть як вивести весь товар по складу (щоб були і нульові залишки але тільки по вибраному складу?)
В 1с створив новий документ ЗаказНаряд.... все працює... А із запросами чогось не виходить. Колись пропустив цю тему при вивченні 1С....

Процедура ВивЗал()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Обрабатывать НеПомеченныеНаУдаление;
    |Фирма = Регистр.ОстаткиТоваров.Фирма;
    |ФлагУчета=Регистр.ОстаткиТоваров.ФлагУчета;
    |Товар = Регистр.ОстаткиТоваров.Товар.Наименование;
    |Скл = Регистр.ОстаткиТоваров.Склад;
    |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
    |Функция КонОст1 = КонОст(ОстатокТовара) когда((Скл = спрСклад.ТекущийЭлемент()) и (Фирма = спрФирма.ТекущийЭлемент()));
    |Группировка Товар;
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    //Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл //Необходимо что бы в отчёт не лезли названия категорий и подкатегорий. Только товар
            // Заполнение полей Товар
            Таб.ВывестиСекцию("Товар");
          // Сообщить(Запрос.Товар);
    КонецЦикла;
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры

Автор: denis84 26.11.24, 9:24

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 26.11.24, 10:28

vovkpro @ Вчера, 22:29 * ,
Если 0 остаток, его "в регистре не будет" , измените запрос: чтоб делал выборку и по справочнику ( Номенклатура / Товары);

|Товар = Регистр.ОстаткиТоваров.Товар.Наименование,Справочник.Товары.Товар;

Вроде так.

Или как Вариант 2:
Делайте перебор всего справочника, и при выводе строки отчета используйте
СводныйОстаток(<?>,)
Синтаксис:
СводныйОстаток(<Измерен1>,<Измерен2>...,<ИмяРесурса>)
Назначение:
Возвращает значение сводного остатка заданного ресурса регистра.
Параметры:
<Измерен1>,<Измерен2>... - значения измерений регистра;
<ИмяРесурса> - название требуемого ресурса регистра.

Автор: vovkpro 26.11.24, 10:50

denis84 @ Сегодня, 9:24 * ,
Дякую. Зараз буду пробувати. Мене смущаї тут

 Если ПустоеЗначение(выбТМЦ) = 0 Тогда
          ТекстЗапр = ТекстЗапр + "
          |Условие (ТМЦ в выбТМЦ);";
        КонецЕсли;

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

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

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

Автор: Profi_1C77 26.11.24, 10:54

vovkpro @ Сегодня, 10:39 * ,

Цитата(vovkpro @ 26.11.24, 10:39) *
выбТМЦ- це наперед вибраний список товару....? Я не можу наперед вибрати товар...
і ще тут

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

Заг1 = Переменная для вывода в В Заголовке/ Шапке отчета фильтра товаров;

Автор: vovkpro 26.11.24, 10:54

vovkpro @ Сегодня, 10:50 * ,
Можна ченез фокспро або запитом в 1С Вибрати по всій базі по всіх періодах товар який колись був на залишку по цьому складу. Поді пройтися по цьому списку і вибрати залишки на зараз. Якщо товару зараз нема на залишку буде 0....

Автор: denis84 26.11.24, 10:57

vovkpro @ Сегодня, 10:50 * ,
в запросах оператор "в" означає, що по всим ТМЦ буде формуватися

Автор: Profi_1C77 26.11.24, 11:02

vovkpro @ Сегодня, 10:50 * ,
Правильно, Вы ж хотите что выводило и 0. Скажем у Вас новый товар который никогда не был в обороте в по этому складу , логично что остаток будет 0.
Что б наверняка используйте функцию СводныйОстаток


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

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

Отбора по списку не будет.

Автор: vovkpro 26.11.24, 11:05

Profi_1C77 @ Сегодня, 10:58 * ,
Скажем у Вас новый товар который никогда не был в обороте в по этому складу
При такому запиті цей товар буде попадати у звіт по кожному складу і показувати залишок 0 ....?
Мені потрібно щоби по кожному складу був ТІЛЬКИ товар який коли небудь (рік тому) був на цьому складі а зараз його немає там І ЗАЛИШКУ 0 ТЕЖ НЕМАЄ В БАЗІ ПО ЦЬОМУ СКЛАДУ ФІЗИЧНО НА ТЕПЕРІШНІЙ ПЕРІОД. Можливо за якийсь ПЕРІОД (місяць) в базі є запис по ньому із залишком 0. А також щоб був товар який є зараз на цьому складу...

Автор: Profi_1C77 26.11.24, 11:17

vovkpro @ Сегодня, 11:05 * ,
Тогда, анализируем Все варианты остатка, накидал по - быстрому в конструкторе :

Процедура Сформировать()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |Фирма = Регистр.ОстаткиТоваров.Фирма;
    |Товар = Регистр.ОстаткиТоваров.Товар;
    |Склад = Регистр.ОстаткиТоваров.Склад;
    |ОстатокТовара = Регистр.ОстаткиТоваров.ОстатокТовара;
    |Функция ОстатокТовараНачОст = НачОст(ОстатокТовара);
    |Функция ОстатокТовараПриход = Приход(ОстатокТовара);
    |Функция ОстатокТовараРасход = Расход(ОстатокТовара);
    |Функция ОстатокТовараКонОст = КонОст(ОстатокТовара);
    |Группировка Товар;
    |Условие(Склад = ВыбСклад);
    |"//}}ЗАПРОС
;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл
        // Заполнение полей Товар
            Если (Запрос.НачОст<>0)  или (Запрос.Приход<>0) или (Запрос.Расход<>0) или (Запрос.КонОст<>0)  Тогда
                
            Таб.ВывестиСекцию("Товар");
        КонецЕсли;
    КонецЦикла;
    // Заполнение полей "Итого"
    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
КонецПроцедуры

Автор: vovkpro 26.11.24, 11:20

Profi_1C77 @ Сегодня, 11:17 * ,
ЦЕ ХОРОША ІДЕЯ !..... Зараз спробую перенести в 1С і запустити...

Автор: denis84 26.11.24, 11:25

Profi_1C77 @ Сегодня, 11:02 * ,
в мене написано запрос під специфіку нашого довідника ТМЦ. Там не важко викинути ті умови, які Вам не підходять і там все працюватиме.

Автор: Profi_1C77 26.11.24, 11:27

Цитата(Profi_1C77 @ 26.11.24, 11:17) *
Если (Запрос.НачОст<>0)  или (Запрос.Приход<>0) или (Запрос.Расход<>0) или (Запрос.КонОст<>0)  Тогда

Там ошибка - должно быть : Запрос.ОстатокТовараНачОст , Запрос.ОстатокТовараПриход .....

Автор: vovkpro 26.11.24, 11:53

Profi_1C77 @ Сегодня, 11:17 * ,

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

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

Автор: Profi_1C77 26.11.24, 11:59

Цитата(vovkpro @ 26.11.24, 11:53) *
Ніби працює... Дуже Вам Дякую

Спасибо/ Дякую там кнопка есть ) icon_beer17.gif

Автор: vovkpro 26.11.24, 12:04

Profi_1C77 @ Сегодня, 11:59 * ,
Дякую Вам Ще раз. Також Дякую всім хто допомагав.

Автор: vovkpro 26.11.24, 15:35

Profi_1C77, Profi_1C77,
Вибачте, що турбую.... Можна ще в запросі зробити так щоби спочатку виводились лінійки товару потім лінійки його підпапок і потім лінійки головних папок товару...
Під час такого виводу я зможу вибрати із довідника цін Закупочну, помножити її на залишок і отримати вартість товару на складі по цій ціні. Потім просумувати по підпапці і потім по головній папці.

vovkpro @ Сегодня, 15:21 * ,
https://pro1c.org.ua/redirect.php?https://fex.net/uk/s/3mb7d1a

Автор: tibank 26.11.24, 21:54

Да, насколько проще все это делать прямыми запросами. Если есть желание, учите, проще писать запросы и работает на порядок быстрее

Автор: vovkpro 27.11.24, 10:35

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

Автор: vovkpro 27.11.24, 15:41

vovkpro @ Сегодня, 10:35 * ,
Доробив через вигрузку у тз. Дещо криво але працює. Папки і підпапки сумуються по вартості товару. Звіт використовується не часто. Всім хто допомагав дякую.

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua