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

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

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование в 1С Предприятие 7.7 _ Отчет ОстаткиДвижениеСтоимость для 1с77 бух

Автор: inna.innainna84 25.08.16, 8:50

Прошу помощи с отчетом. Сортирует данные в общем , не выбирает движение товара по выбранной фирме.
Код

//astonvilla@rambler.ru
//Костецкий В.А. aka astonvilla
//
// ===============================
// ОПИСАНИЕ МОДУЛЬНЫХ ПЕРЕМЕННЫХ
// ===============================

// используются для стандартного механизма кнопок "Обновить" и "Настройка"
Перем Таб;

// переменные предназначены для запроса по периодам
Перем Запрос;
Перем Язык, УкрГруппировки;

Перем ОтчетСформирован;  

Перем ПечОстаток,ПечСтоимость,ИтПечСтоимость;

Перем Ит, ТекЗакладка;

Перем СписокПодбора,СправочникПодбора;
Перем СписокТоваров;         // список товаров, удовлетворяющих фильтру по ТМЦ

Перем ЕстьГруппыТМЦ, СпСчетов;
// ===============================
// ПРОЦЕДУРЫ И ФУНКЦИИ, ВЫЗЫВАЕМЫЕ ИЗ ФОРМУЛ ЭЛЕМЕНТОВ ДИАЛОГА
// ===============================

Функция МножественныйФильтрЗадан(СпЗнач_)      
    Если СпЗнач_.РазмерСписка()>0 Тогда
        Возврат 1;
    КонецЕсли;
    Возврат 0;
КонецФункции // МножественныйФильтрЗадан    

Процедура РаботаСоСписком(Режим,Список,ТипСправочника)
    Перем ТекПоз;
    Перем ТекЭлемент;
    Перем Фрм;
    
    ТекПоз = Список.ТекущаяСтрока();
    Если ТекПоз>0 Тогда
        ТекЭлемент=Список.ПолучитьЗначение(ТекПоз);
    КонецЕсли;
    
    Если Режим="Добавить" Тогда        // добавляем в список один элемент
        СписокПодбора = Список;
        СправочникПодбора = ВРег(ТипСправочника);
        // открываем окно подбора
        ОткрытьПодбор("Справочник."+ТипСправочника,,Фрм,0,ТекЭлемент);
        Фрм.ВыборГруппы(1);
        
    ИначеЕсли Режим="ДобавитьНесколько" Тогда  // добавляем в список несколько элементов
        СписокПодбора = Список;
        СправочникПодбора = ВРег(ТипСправочника);
        // открываем окно подбора
        ОткрытьПодбор("Справочник."+ТипСправочника,,Фрм,1,ТекЭлемент);
        Фрм.ВыборГруппы(1);
        
    ИначеЕсли Режим="УдалитьВсе" Тогда    // удаляем все элементы из списка
        Список.УдалитьВсе();
        Если ВРег(ТипСправочника) = "НОМЕКЛАТУРА" Тогда
            ЕстьГруппыТМЦ = 0;
        КонецЕсли;
    ИначеЕсли Режим="Удалить" Тогда    // удаляем из списка один элемент
        Если ТекПоз>0 Тогда
            Если ВРег(ТипСправочника) = "НОМЕКЛАТУРА" Тогда
                ЕстьГруппыТМЦ = ЕстьГруппыТМЦ-ТекЭлемент.ЭтоГруппа();
            КонецЕсли;
            Список.УдалитьЗначение(ТекПоз);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры        // работа со списком

//******************************************************************************
Процедура ОбработкаПодбора(Значение)  // Предопределенная процедура
    Если ПустоеЗначение(СправочникПодбора)=1 Тогда
        Возврат;
    КонецЕсли;
    
    Если (Найти(СправочникПодбора,",")>0)И(Найти(СправочникПодбора,ВРег(Значение.Вид()))>0)ИЛИ
    (ВРег(Значение.Вид())=СправочникПодбора) Тогда
        Если (СписокПодбора.НайтиЗначение(Значение)=0) Тогда
            Если ВРег(СправочникПодбора) = "НОМЕКЛАТУРА" Тогда
                ЕстьГруппыТМЦ = ЕстьГруппыТМЦ+Значение.ЭтоГруппа();
            КонецЕсли;
            СписокПодбора.ДобавитьЗначение(Значение);
            СписокПодбора.ТекущаяСтрока(СписокПодбора.РазмерСписка());
        КонецЕсли;    
    КонецЕсли;
КонецПроцедуры  // ОбработкаПодбора

//******************************************************************************
// Процедура изменяет состояние отметок вывода таблицы группировок отчета
Процедура глПометкаТаблицыГруппировок(Группировки,Флаг)
    
    Для индГруп = 1 По Группировки.РазмерСписка() Цикл
        Если Флаг = -1 Тогда
            Группировки.Пометка(индГруп, 1 - Группировки.Пометка(индГруп));
        Иначе
            Группировки.Пометка(индГруп, Флаг);
        КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры // глПометкаТаблицыГруппировок()  

//******************************************************************************
Процедура глОживить(ДобСтрок) Экспорт
    глЧислоСтрок = глЧислоСтрок + ДобСтрок;
    Состояние("В отчет выведено "+глЧислоСтрок+" строк.");
КонецПроцедуры

// ===============================

Процедура ОстаткиТоваров()        
    Загол="";
    ПечФорма = "Таблица";
    глУстПропись(Гривня);
    Таб.ИсходнаяТаблица(ПечФорма);
    //============================================================
    ///Итоги по счету учета товара
    Ит = СоздатьОбъект("БухгалтерскиеИтоги");
    
    Если МножественныйФильтрЗадан(СписокТоваров) = 0 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,, 1,1);
        Загол=""+"По всем ТМЦ";
    Иначе
        Если ЕстьГруппыТМЦ > 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 2);
        КонецЕсли;    
        Загол=""+"Включен фильтр по ТМЦ";
    КонецЕсли;
    
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);
        Загол=Загол+", по всем складам";
    Иначе
        Если ВыбМестоХранения.ЭтоГруппа() = 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 2);
        КонецЕсли;    
        Загол=Загол+", по складу - "+ВыбМестоХранения;
    КонецЕсли;
    Ит.ВыполнитьЗапрос(Дата2, Дата2,СпСчетов,,, 1,, "К");
    //============================================================
    
    // выводим шапку отчета
    Таб.ВывестиСекцию("Отчет");  
    глОживить(Таб.ВысотаСекции("Отчет"));
    
    Таб.ВывестиСекцию("Шапка|ТоварРезерв");
    
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        Таб.ПрисоединитьСекцию("Шапка|ВсеСклады");
    КонецЕсли;
    
    //------------------------------------------------
    ///Определим, на каких складах есть остаток
    ТаблСкладов = СоздатьОбъект("ТаблицаЗначений");
    ТаблСкладов.НоваяКолонка("Склад");
    Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл ///
        Если ПустоеЗначение(Ит.Субконто(2)) = 1 Тогда
            Продолжить;
        КонецЕсли;
        //// отбираем неправильные значения
        //Если нулДА = 0 Тогда
        //    Если Ит.СКД(3)<=0 Тогда
        //        Продолжить;
        //    КонецЕсли;    
        //КонецЕсли;
        Если ТаблСкладов.НайтиЗначение(Ит.Субконто(2),,"Склад") = 0 Тогда
            ТаблСкладов.НоваяСтрока();
            ТаблСкладов.Склад = Ит.Субконто(2);
        КонецЕсли;
    КонецЦикла;
    //------------------------------------------------
    
    ТаблСкладов.ВыбратьСтроки();
    Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
        Таб.ПрисоединитьСекцию("Шапка|Склад");
    КонецЦикла;
    
    Ном = 0;
    
    //------------------------------------------------
    ////Формируем сам отчет
    Ит.ВыбратьСубконто(ВидыСубконто.ТМЦ);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.ТМЦ) = 1 Цикл   ///Выбираем наши товары
        Ном = Ном+1;
        Если Ит.Субконто(1).ЭтоГруппа()=1 Тогда
            ПечТовар = Ит.Субконто(1);
            ПечОстаток = Ит.СКД(3);
            Таб.ВывестиСекцию("Группа|ТоварРезерв");
            Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
                Таб.ПрисоединитьСекцию("Группа|ВсеСклады");
            КонецЕсли;
            
            Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
            
            ТаблСкладов.ВыбратьСтроки();
            Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
                Если Ит.ПолучитьСубконто(2,,ТаблСкладов.Склад) = 1 Тогда
                    ПечОстаток = Ит.СКД(3);
                Иначе
                    ПечОстаток = 0;
                КонецЕсли;
                Таб.ПрисоединитьСекцию("Группа|Склад");
            КонецЦикла;
            Продолжить;
        КонецЕсли;
        
        ////// отбираем неправильные значения
        //Если нулДА = 0 Тогда
        //    Если Ит.СКД(3)<=0 Тогда
        //        Продолжить;
        //    КонецЕсли;    
        //КонецЕсли;
        //// выводим группу ТМЦ
        
        ПечТовар = СокрЛП(Ит.Субконто(1).ПолнНаименование);
        ПечОстаток = Ит.СКД(3);
        
        Таб.ВывестиСекцию("Товар|ТоварРезерв");
        Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
            Таб.ПрисоединитьСекцию("Товар|ВсеСклады");
        КонецЕсли;
        
        Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
        
        ТаблСкладов.ВыбратьСтроки();
        Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
            Если Ит.ПолучитьСубконто(2,,ТаблСкладов.Склад) = 1 Тогда
                ПечОстаток = Ит.СКД(3);
            Иначе
                ПечОстаток = 0;
            КонецЕсли;
            Таб.ПрисоединитьСекцию("Товар|Склад");
        КонецЦикла;
        Состояние("Обработка строки отчета - "+Ном);
    КонецЦикла;
    
    //-------------------------------------------------------------------
    // Итоговые суммы
    //-------------------------------------------------------------------
    
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);
    Иначе
        Если ВыбМестоХранения.ЭтоГруппа() = 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 2);
        КонецЕсли;    
    КонецЕсли;
    
    Если МножественныйФильтрЗадан(СписокТоваров) = 0 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,, 1,1);
    Иначе
        Если ЕстьГруппыТМЦ > 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 2);
        КонецЕсли;    
    КонецЕсли;
    
    //------------------------------------------------------
    Ит.ВыполнитьЗапрос(Дата2, Дата2,СпСчетов,,, 1,, "К");
    Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
    
    Таб.ВывестиСекцию("Итого|ТоварРезерв");
    //=======================
    ТаблСкладов.ВыбратьСтроки();
    Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
        Если Ит.ПолучитьСубконто(1,,ТаблСкладов.Склад) = 1 Тогда
            ПечОстаток = ПечОстаток+Ит.СКД(3);
        КонецЕсли;
    КонецЦикла;

    Таб.ПрисоединитьСекцию("Итого|ВсеСклады");
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        //=======================
        ТаблСкладов.ВыбратьСтроки();
        Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
            Если Ит.ПолучитьСубконто(1,,ТаблСкладов.Склад) = 1 Тогда
                ПечОстаток = Ит.СКД(3);
            Иначе
                ПечОстаток = 0;
            КонецЕсли;
            Таб.ПрисоединитьСекцию("Итого|Склад");
        КонецЦикла;
    КонецЕсли;
    
    //------------------------------------------------------
    // Вывод заполненной формы
    Таб.Защита(Константа.ФлагЗащитыТаблиц);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("ПЕЧАТЬ: Остатки ТМЦ на складах (На "+Дата2+?(ТипЗначения(ВыбФирма)=0, "", ", "+ВыбФирма)+")","");
    ОтчетСформирован = 1;
    
КонецПроцедуры        // ОстаткиТоваров

// ===============================
Процедура ВывестиДокументыДвиженияТоваров(Запрос,Таб)  
    ПечКонКол=Запрос.СНД(3);
    Запрос.ВыбратьПериоды();
    Пока Запрос.ПолучитьПериод() = 1 Цикл
        Док=Запрос.Операция.Документ;
        Если ПустоеЗначение(Док) = 1 Тогда
            Продолжить;
        КонецЕсли;
        Наим = Док;
        ПечПрихКол = Запрос.ДО(3);
        ПечРасхКол = Запрос.КО(3);
        ПечКонКол    = ПечКонКол + ПечПрихКол - ПечРасхКол;
        Таб.ВывестиСекцию("Док");
    КонецЦикла;    
КонецПроцедуры // ВывестиДокументыДвиженияТоваров

// ===============================
Процедура ДвиженияТоваров()
    //                  
    ПечФорма = "ДвиженияТоваров";
    глУстПропись(Гривня);
    Таб.ИсходнаяТаблица(ПечФорма);
    
    //============================================================
    ///Итоги по счету учета товара
    Ит = СоздатьОбъект("БухгалтерскиеИтоги");
    
    Если МножественныйФильтрЗадан(СписокТоваров) = 0 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,, 1,1);
        Загол=""+"По всем ТМЦ";
    Иначе
        Если ЕстьГруппыТМЦ > 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 2);
        КонецЕсли;    
        Загол=""+"Включен фильтр по ТМЦ";
    КонецЕсли;
    
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);
        Загол=Загол+", по всем складам";
    Иначе
        Если ВыбМестоХранения.ЭтоГруппа() = 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 2);
        КонецЕсли;    
        Загол=Загол+", по складу - "+ВыбМестоХранения;
    КонецЕсли;
    
    Если ДеталПоДокументам=1 Тогда
        Ит.ВыполнитьЗапрос(Дата1, Дата2,СпСчетов,,, 1,"Операция", "К");
    Иначе
        Ит.ВыполнитьЗапрос(Дата1, Дата2,СпСчетов,,, 1,, "К");
    КонецЕсли;
    //==========================================================
    
    ПечЗаголСтолбца = "Товар";
    Если ДеталПоДокументам=1 Тогда // детализируем по складам
        ПечЗаголСтолбца = ПечЗаголСтолбца + "/Документ движения";
    КонецЕсли;
    
    //// выводим шапку отчета
    Таб.ВывестиСекцию("Отчет");  
    глОживить(Таб.ВысотаСекции("Отчет"));
    
    Ном = 0;
    
    //-------------------------------------------------------
    Ит.ВыбратьСубконто(ВидыСубконто.ТМЦ);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.ТМЦ) = 1 Цикл       ///Выбираем наши товары
        Ном = Ном+1;
        Состояние("Обработка строки отчета - "+Ном);
        //// выводим группу ТМЦ
        Если Ит.Субконто(1).ЭтоГруппа()=1 Тогда
            Наим = СокрЛП(Ит.Субконто(1).Наименование);
            Таб.ВывестиСекцию("Группа");
            глОживить(1);
            Продолжить;
        Иначе
            Наим = СокрЛП(Ит.Субконто(1).ПолнНаименование);  
            Код   = СокрЛП(Ит.Субконто(1).КодСоответствия);
            ПечНачКол    = Ит.СНД(3);
            ПечПрихКол    = Ит.ДО(3);
            ПечРасхКол    = Ит.КО(3);
            ПечКонКол    = Ит.СКД(3);
            Таб.ВывестиСекцию("Товар");
            глОживить(1);
        КонецЕсли;
        Если ДеталПоСкладам=1 Тогда // детализируем по складам
            Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
            Пока Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл ///
                Если ПустоеЗначение(Ит.Субконто(2)) = 1 Тогда
                    Продолжить;
                КонецЕсли;
                Ном = Ном+1;
                Состояние("Обработка строки отчета - "+Ном);
                Наим = Ит.Субконто(2).Наименование;
                
                ПечНачКол    = Ит.СНД(3);
                ПечПрихКол    = Ит.ДО(3);
                ПечРасхКол    = Ит.КО(3);
                ПечКонКол    = Ит.СКД(3);
                
                Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
                    Таб.ВывестиСекцию("Склад");
                    глОживить(1);
                КонецЕсли;
                Если ДеталПоДокументам=1 Тогда
                    ВывестиДокументыДвиженияТоваров(Ит,Таб);  
                КонецЕсли;
            КонецЦикла;
        Иначе
            Если ДеталПоДокументам=1 Тогда    // не детализируем по складам
                ВывестиДокументыДвиженияТоваров(Ит,Таб);  
            КонецЕсли;
        КонецЕсли;    
    КонецЦикла;
    //----------------------------------------------
    
    // Вывод заполненной формы
    Таб.Защита(Константа.ФлагЗащитыТаблиц);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("ПЕЧАТЬ: Отчет о движении ТМЦ на складах ("+ПериодСтр(Дата1, Дата2)+?(ТипЗначения(ВыбФирма)=0, "", ", "+ВыбФирма)+")","");
    
    ОтчетСформирован = 1;
КонецПроцедуры

// ===============================
Процедура ОстаткиТоваровСЦенами()
    Загол="";
    ПечФорма = "ОстаткиСЦенами";
    глУстПропись(Гривня);
    Таб.ИсходнаяТаблица(ПечФорма);
    
    ИтПечСтоимость = 0;
    //--------------------------------------------------
    /////Итоги по счету учета товара
    Ит = СоздатьОбъект("БухгалтерскиеИтоги");
    
    Если МножественныйФильтрЗадан(СписокТоваров) = 0 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,, 1,1);
        Загол=""+"По всем ТМЦ";
    Иначе
        Если ЕстьГруппыТМЦ > 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.ТМЦ,СписокТоваров, 2);
        КонецЕсли;    
        Загол=""+"Включен фильтр по ТМЦ";
    КонецЕсли;
    
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,, 1);
        Загол=Загол+", по всем складам";
    Иначе
        Если ВыбМестоХранения.ЭтоГруппа() = 1 Тогда
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 1);
        Иначе
            Ит.ИспользоватьСубконто(ВидыСубконто.МестаХранения,ВыбМестоХранения, 2);
        КонецЕсли;    
        Загол=Загол+", по складу - "+ВыбМестоХранения;
    КонецЕсли;
    Ит.ВыполнитьЗапрос(Дата2, Дата2,СпСчетов,,, 1,, "СК");
    //-------------------------------------------------
    Категория = "";
    Загол=Загол+", в учетной стоимости (грн.)";
    
    // выводим шапку отчета
    Таб.ВывестиСекцию("Отчет");  
    глОживить(Таб.ВысотаСекции("Отчет"));
    
    Таб.ВывестиСекцию("Шапка|ТоварЦена");
    
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        Таб.ПрисоединитьСекцию("Шапка|ИтогСтолбец");
    КонецЕсли;
    
    ТаблСкладов = СоздатьОбъект("ТаблицаЗначений");
    ТаблСкладов.Очистить();
    ТаблСкладов.НоваяКолонка("Склад");
    ТаблСкладов.НоваяКолонка("Себестоимость","Число",12,2);
    
    ТаблСкладовИтого = СоздатьОбъект("ТаблицаЗначений");
    ТаблСкладовИтого.Очистить();
    ТаблСкладовИтого.НоваяКолонка("Склад");
    ТаблСкладовИтого.НоваяКолонка("Себестоимость","Число",12,2);
    //------------------------------------------------
    ///Определим, на каких складах есть остаток
    Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.МестаХранения) = 1 Цикл ///
        Если ПустоеЗначение(Ит.Субконто(2)) = 1 Тогда
            Продолжить;
        КонецЕсли;
        ////// отбираем неправильные значения
        //Если нулДА = 0 Тогда
        //    Если Ит.СКД(3)<=0 Тогда
        //        Продолжить;
        //    КонецЕсли;    
        //КонецЕсли;
        Если ТаблСкладов.НайтиЗначение(Ит.Субконто(2),,"Склад") = 0 Тогда
            ТаблСкладов.НоваяСтрока();
            ТаблСкладов.Склад = Ит.Субконто(2);
            ТаблСкладовИтого.НоваяСтрока();
            ТаблСкладовИтого.Склад = Ит.Субконто(2);
        КонецЕсли;
    КонецЦикла;
    //------------------------------------------------
    
    ТаблСкладов.ВыбратьСтроки();
    Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
        Таб.ПрисоединитьСекцию("Шапка|СкладСтоимость");
    КонецЦикла;
    
    Ном = 0;
    НомСтроки = 0;
    //------------------------------------------------
    ////Формируем сам отчет
    Ит.ВыбратьСубконто(ВидыСубконто.ТМЦ);
    Пока Ит.ПолучитьСубконто(ВидыСубконто.ТМЦ) = 1 Цикл       ///Выбираем наши товары
        
        ////// отбираем неправильные значения
        //Если нулДА = 0 Тогда
        //    Если Ит.СКД(3)<=0 Тогда
        //        Продолжить;
        //    КонецЕсли;    
        //КонецЕсли;
        
        Ном = Ном+1;
        //-------------------------------------------------------
        ////// выводим группу ТМЦ
        Если Ит.Субконто(1).ЭтоГруппа()=1 Тогда
            Если Ит.Субконто(1).Уровень() > 1 Тогда
                Продолжить;
            КонецЕсли;    
            ПечТовар = Ит.Субконто(1);
            ПечОстаток = Ит.СКД(3);
            // --------------------------------------------------
            // себест. (грн)
            ПечСтоимость = Ит.СКД(1);
            ПечЦена = ?(Ит.СКД(3) = 0,0,Окр(Ит.СКД(1)/Ит.СКД(3),2));
            Таб.ВывестиСекцию("Группа|ТоварЦена");
            Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
                Таб.ПрисоединитьСекцию("Группа|ИтогСтолбец");
            КонецЕсли;
            
            Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
            ТаблСкладов.ВыбратьСтроки();
            Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
                Если Ит.ПолучитьСубконто(2,,ТаблСкладов.Склад) = 1 Тогда
                    ПечОстаток = Ит.СКД(3);
                    // ---------------------------------------------
                    // себест. (грн)
                    ПечСтоимость = Ит.СКД(1);
                    ПечЦена = ?(Ит.СКД(3) = 0,0,Окр(Ит.СКД(1)/Ит.СКД(3),2));
                    Таб.ПрисоединитьСекцию("Группа|СкладСтоимость");
                Иначе
                    ПечОстаток = 0;
                    ПечСтоимость = 0;
                    Таб.ПрисоединитьСекцию("Группа|СкладСтоимость");
                КонецЕсли;
            КонецЦикла;
            Продолжить;
        КонецЕсли;
        //Конец обработки группы
        //-------------------------------------------------------------
        Если ПустоеЗначение(Ит.Субконто(1))=1 Тогда
            Продолжить;
        КонецЕсли;
        
        //-------------------------------------------------------------
        //Обработка обычного товара (не группы)
        //-------------------------------------------------------------
        ПечТовар = Ит.Субконто(1);
        ПечОстаток = Ит.СКД(3);
        
        ПечСтоимость = Ит.СКД(1);
        ПечЦена = ?(Ит.СКД(3) = 0,0,Окр(Ит.СКД(1)/Ит.СКД(3),2));
        
        Таб.ВывестиСекцию("Товар|ТоварЦена");
        Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
            Таб.ПрисоединитьСекцию("Товар|ИтогСтолбец");
        КонецЕсли;
        
        Ит.ВыбратьСубконто(ВидыСубконто.МестаХранения);
        
        ТаблСкладов.ВыбратьСтроки();
        Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
            Если Ит.ПолучитьСубконто(2,,ТаблСкладов.Склад) = 1 Тогда
                ПечОстаток = Ит.СКД(3);
                ПечСтоимость = Ит.СКД(1);
                ПечЦена = ?(Ит.СКД(3) = 0,0,Окр(Ит.СКД(1)/Ит.СКД(3),2));
                //=========================================
                НомСтроки = 0;
                Если ТаблСкладовИтого.НайтиЗначение(ТаблСкладов.Склад,НомСтроки,"Склад") = 1 Тогда
                    ТаблСкладовИтого.ТекущаяСтрока(НомСтроки);
                    ТаблСкладовИтого.Себестоимость = ТаблСкладовИтого.Себестоимость+ПечСтоимость;
                КонецЕсли;
                //=========================================
                Таб.ПрисоединитьСекцию("Товар|СкладСтоимость");
            Иначе
                ПечОстаток = 0;
                ПечСтоимость = 0;
                Таб.ПрисоединитьСекцию("Товар|СкладСтоимость");
            КонецЕсли;
        КонецЦикла;
        //---------------------------------------------------------------
        //Конец обработки товара
        //---------------------------------------------------------------
        Состояние("Обработка строки отчета - "+Ном);
    КонецЦикла;
    
    //-------------------------------------------------------------------
    // Итоговые суммы
    //-------------------------------------------------------------------
    Таб.ВывестиСекцию("Итого|ТоварЦена");
    Если ПустоеЗначение(ВыбМестоХранения) = 1 Тогда
        ///======================
        ПечОстаток =  0;
        //=======================
        ТаблСкладов.ВыбратьСтроки();
        Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
            Если Ит.ПолучитьСубконто(2,,ТаблСкладов.Склад) = 1 Тогда
                ПечОстаток = ПечОстаток+Ит.СКД(3);
                //=========================================
                НомСтроки = "";
                Если ТаблСкладовИтого.НайтиЗначение(ТаблСкладов.Склад,НомСтроки,"Склад") = 1 Тогда
                    ТаблСкладовИтого.ТекущаяСтрока(НомСтроки);
                    ПечСтоимость = ТаблСкладовИтого.Себестоимость;
                Иначе
                    ПечСтоимость = 0;
                КонецЕсли;
            Иначе
                ПечОстаток = ПечОстаток+0;
                ПечСтоимость = 0;
            КонецЕсли;
        КонецЦикла;
        ПечСтоимость = ТаблСкладовИтого.Итог("Себестоимость");
        Таб.ПрисоединитьСекцию("Итого|ИтогСтолбец");
    КонецЕсли;
    ТаблСкладов.ВыбратьСтроки();
    Пока ТаблСкладов.ПолучитьСтроку() = 1 Цикл
        Если Ит.ПолучитьСубконто(2,,ТаблСкладов.Склад) = 1 Тогда
            ПечОстаток = Ит.СКД(3);
            ПечСтоимость = Ит.СКД(1);
            Таб.ПрисоединитьСекцию("Итого|СкладСтоимость");
        Иначе
            ПечОстаток = 0;
            ПечСтоимость = 0;
            Таб.ПрисоединитьСекцию("Итого|СкладСтоимость");
        КонецЕсли;
    КонецЦикла;
    //-------------------------------------------------------------------
    // Вывод заполненной формы
    Таб.Защита(Константа.ФлагЗащитыТаблиц);
    Таб.ТолькоПросмотр(1);
    Таб.Показать("ПЕЧАТЬ: Стоимость ТМЦ на складах (На "+Дата2+?(ТипЗначения(ВыбФирма)=0, "", ", "+ВыбФирма)+")","");
    ОтчетСформирован = 1;
КонецПроцедуры        // ОстаткиТоваровСЦенами


// ===============================
// ПРОЦЕДУРЫ И ФУНКЦИИ, ВЫЗЫВАЕМЫЕ ИЗ ФОРМУЛ ЭЛЕМЕНТОВ ДИАЛОГА
// ===============================

// ===============================
Функция ДоступностьЭлементов(ВсеЭлементы=0)          
    Если ТекЗакладка = 1 Тогда
        Если ВидОтчета.ТекущаяСтрока() = 1 Тогда    // движения ТМЦ
            Форма.тПериод.    Видимость(1);
            Форма.тС.        Видимость(1);
            Форма.Дата1.    Видимость(1);
            Форма.кПериод.    Видимость(1);
            Форма.тПо.Заголовок("по");
            
            Форма.Заголовок("Движения товаров по складам");
            Форма.тНазвание.Заголовок("Движения товаров по складам");
            
            Форма.рДетализация.        Доступность(1);
            Форма.ДеталПоСкладам.    Доступность(1);
            Форма.ДеталПоДокументам.Доступность(1);
            
        ИначеЕсли ВидОтчета.ТекущаяСтрока() = 2 Тогда  // остатки ТМЦ
            Форма.тПериод.    Видимость(0);
            Форма.тС.        Видимость(0);
            Форма.Дата1.    Видимость(0);
            Форма.кПериод.    Видимость(0);
            Форма.тПо.Заголовок("На");
            
            Форма.Заголовок("Остатки товаров на складах");
            Форма.тНазвание.Заголовок("Остатки товаров на складах");
            
            Форма.рДетализация.        Доступность(0);
            Форма.ДеталПоСкладам.    Доступность(0);
            Форма.ДеталПоДокументам.Доступность(0);
            ДеталПоСкладам        = 1;
            ДеталПоДокументам    = 0;
            
        Иначе    // стоимость ТМЦ на складах
            Форма.тПериод.    Видимость(0);
            Форма.тС.        Видимость(0);
            Форма.Дата1.    Видимость(0);
            Форма.кПериод.    Видимость(0);
            Форма.тПо.Заголовок("На");
            
            Форма.Заголовок("Суммовые остатки товаров на складах");
            Форма.тНазвание.Заголовок("Суммовые остатки товаров на складах");
            
            Форма.рДетализация.        Доступность(0);
            Форма.ДеталПоСкладам.    Доступность(0);
            Форма.ДеталПоДокументам.Доступность(0);
            ДеталПоСкладам        = 0;
            ДеталПоДокументам    = 0;
        КонецЕсли;
        
        Форма.кХВыбФирма.Доступность(ВыбФирма.Выбран());
        Форма.кХВыбМестоХранения.Доступность(ВыбМестоХранения.Выбран());
        Форма.кХВыбНоменклатура.Доступность(ВыбНоменклатура.Выбран());
    Иначе
        Форма.тПериод.    Видимость(0);
        Форма.тС.        Видимость(0);
        Форма.Дата1.    Видимость(0);
        Форма.кПериод.    Видимость(0);
        
    КонецЕсли;
    
КонецФункции     // ДоступностьЭлементов

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

    ТЗЗапроса = СоздатьОбъект("ТаблицаЗначений");
    
    Запрос.Выгрузить(ТЗЗапроса);
    СписокТоваров.УдалитьВсе();
    ТЗЗапроса.Выгрузить(СписокТоваров,,,"ТекущийЭлемент");
КонецПроцедуры


// ===============================
Процедура Сформировать(ЗакрытьЭкран=0)
    //  Создание Таблицы для выходного отчета
    Таб = СоздатьОбъект("Таблица");
    
    ОтчетСформирован = 0;
    
    СписокТоваров = СоздатьОбъект("СписокЗначений");                                        
    СписокТоваров.УдалитьВсе();
    Если МФВыбТовары.РазмерСписка()>0 Тогда
        Позиция = 0;
        Пока Позиция<МФВыбТовары.РазмерСписка() Цикл
            Позиция = Позиция+1;
            СписокТоваров.ДобавитьЗначение(МФВыбТовары.ПолучитьЗначение(Позиция));
        КонецЦикла;
    КонецЕсли;    
    Если ПустоеЗначение(ВыбНоменклатура) = 0 Тогда
        Если (СписокТоваров.НайтиЗначение(ВыбНоменклатура)=0) Тогда
            СписокТоваров.ДобавитьЗначение(ВыбНоменклатура);
        КонецЕсли;    
    КонецЕсли;    
    
    Если СписокТоваров.РазмерСписка()>0 Тогда
        ВыберемВсеЭлементыСписка(СписокТоваров);
    КонецЕсли;
    
    СпСчетов = "";
    Для А = 1 По Товар.РазмерСписка() Цикл
        Если Товар.Пометка(А) = 1 Тогда
           СпСчетов = СпСчетов + ?(ПустаяСтрока(СпСчетов) = 1,"",",")+Товар.ПолучитьЗначение(А);    
        КонецЕсли;
    КонецЦикла;
    
    Если ПустаяСтрока(СпСчетов) = 1 Тогда
        Сообщить("Не выбран ни один вид ТМЦ для отчета!");
        Возврат;
    КонецЕсли;          
    
    
    Если ВидОтчета.ТекущаяСтрока()=1 Тогда        // движения ТМЦ
        ДвиженияТоваров();
    ИначеЕсли ВидОтчета.ТекущаяСтрока()=2 Тогда    // остатки ТМЦ
        ОстаткиТоваров();
    ИначеЕсли ВидОтчета.ТекущаяСтрока()=3 Тогда    // остатки с себестоимостью
        ОстаткиТоваровСЦенами();
    КонецЕсли;          
    
    Если ОтчетСформирован = 0 Тогда
        Возврат;
    КонецЕсли;    
    
КонецПроцедуры


// ===============================
// ПРЕДОПРЕДЕЛЕННЫЕ ПРОЦЕДУРЫ
// ===============================
Процедура ПриВыбореЗакладки(Номер,Значение)    // Предопределенная процедура
    // закладки
    ТекЗакладка = Номер;
    Форма.ИспользоватьСлой(Значение+",Кнопки",2);
КонецПроцедуры    // ПриВыбореЗакладки


// ===============================
Процедура ПриОткрытии()    
    ВыбВалюта = Гривня;
    
    ВидОтчета.ТекущаяСтрока(2);
    
    Форма.тПериод.    Видимость(0);
    Форма.тС.        Видимость(0);
    Форма.Дата1.    Видимость(0);
    Форма.кПериод.    Видимость(0);
    Форма.тПо.Заголовок("На");
    
    Форма.Заголовок("Остатки товаров на складах");
    Форма.тНазвание.Заголовок("Остатки товаров на складах");
    
    Форма.рДетализация.        Доступность(0);
    Форма.ДеталПоСкладам.    Доступность(0);
    Форма.ДеталПоДокументам.Доступность(0);
    ДеталПоСкладам        = 1;
    ДеталПоДокументам    = 0;

    Товар.ДобавитьЗначение("281,","Товары на опт. складе");
    Товар.ДобавитьЗначение("282","Товары в рознице");
    Товар.ДобавитьЗначение("283","Товары на комиссии");
    Товар.ДобавитьЗначение("284","Тара под товарами");
    Товар.ДобавитьЗначение("20","Производственные запасы");  
    Товар.ДобавитьЗначение("22","Малоценные и быстроизнашивающиеся предметы");
    Товар.ДобавитьЗначение("24","Брак в производстве");
    Товар.ДобавитьЗначение("25","Полуфабрикаты");
    Товар.ДобавитьЗначение("26","Готовая продукция");
    Товар.ДобавитьЗначение("27","Продукция сельского хозяйства");
    
    глПометкаТаблицыГруппировок(Товар,1);
    // будем отслеживать только реальные изменения этих реквизитов
    Форма.ВидОтчета.ВыполнятьФормулуТолькоПриИзменении(1);
    
    Форма.Обновить(1);
КонецПроцедуры        // ПриОткрытии()  


// ===============================
Процедура ВводНового()    // Предопределенная процедура
КонецПроцедуры            // ВводНового


// ===============================
// ТЕЛО МОДУЛЯ
// ===============================

// Инициализируем закладки
Форма.ИспользоватьЗакладки(1);
Форма.Закладки.ДобавитьЗначение("Основной","Основной");
Форма.Закладки.ДобавитьЗначение("Счета","Множественный Фильтр");
Форма.ИспользоватьСлой("Основной,Кнопки",2);
ТекЗакладка = 1;

// инициализация границ периодов
Дата2=ТекущаяДата();
Дата1=ТекущаяДата();

ВыбФирма = Константа.БазФирма;
ВыбМестоХранения = глВосстановитьЗначение(,"БазМестоХранения");

// инициализация списков                          
ВидОтчета.УдалитьВсе();
ВидОтчета.ДобавитьЗначение("движения ТМЦ");
ВидОтчета.ДобавитьЗначение("остатки ТМЦ");
ВидОтчета.ДобавитьЗначение("стоимость ТМЦ на складах");
ВидОтчета.ТекущаяСтрока(2);                        

ЕстьГруппыТМЦ = 0;



 ! 

http://pro1c.org.ua/index.php?act=announce&id=2: 3, 4
 


 ! 

Раздел "Хранилище" предназначен для выкладывания готовых решений, а не для вопросов!
 

Автор: Sharzem 28.08.16, 9:46

Цитата(inna.innainna84 @ 25.08.16, 9:50) *
не выбирает движение товара по выбранной фирме

В отчете ВыбФирма не отбирается. Выборка есть только по складам.
Т.е., у Вас 1 склад не может принадлежать 2-м фирмам. Думаю что у Вас это не единственный отчет в конфигурации - порвало где-то еще.
Если у Вас имеется принадлежность одного и того ж склада 2-м разным фирмам, то как вариант (если небольшой период ведения совместного учета):
1. создайте новый склад;
2. С помощью Uchoice.ert отберите документы по новой фирме где совмещен склад и установите новый;
3) Перепроведите документы за этот период.


Есть и другой вариант: можно переписать все подобные отчеты smile.gif

Автор: mister-x 29.08.16, 16:00

Використайте у виборці конструкцію

...ИспользоватьРазделительУчета(<РазделительУчета>)


Звичайно у формі звіту має здійснюватись вибір фірми.

Автор: inna.innainna84 29.08.16, 20:58

mister-x @ Сегодня, 17:00 *,
Разделитель учета выставлен. Сам отчет не хочет формировать данные по конкретной фирме, формирует по всем не зависимо от выбраной фирмы.

Автор: mister-x 30.08.16, 13:32

Цитата(inna.innainna84 @ 29.08.16, 20:58) *
Разделитель учета выставлен.

я не бачу в коді звіту (вибірка по бух. запиту) викор. цієї конструкції, почитайте в синтакс-помічнику для чого вона використовується.

Автор: Sharzem 30.08.16, 13:55

Цитата(mister-x @ 30.08.16, 14:32) *
я не бачу в коді звіту (вибірка по бух. запиту) викор. цієї конструкції


Думаю для користувача це проблема.
Пропоную Вам вставити необхідний код в потрібні місця та відмітити їх. Автор сам не впорається (є досвід).

Автор: mister-x 31.08.16, 17:14

Цитата(Sharzem @ 30.08.16, 13:55) *
Думаю для користувача це проблема.

тема створена в розділі для програмістів "каг-бе" icon_beer17.gif

Автор: inna.innainna84 14.09.16, 20:30

Извините пожалуйста, так кто нибудь сможет помочь?

Автор: logist 14.09.16, 20:52

офф

Цитата(mister-x @ 31.08.16, 18:14) *
тема створена в розділі для програмістів "каг-бе"

Наверное надо создавать раздел "Помогите люди добрые, кто чем может"

Автор: inna.innainna84 14.09.16, 21:40

Ну наверно есть еще такие ребята которые могут безвозмездно помочь. спасибо им огромное.

Автор: logist 14.09.16, 22:08

Конечно есть. Только, что бы не вызывать подобные разговоры и сразу получить желаемый ответ, надо писать сразу - ребята, я ни в чем не разбираюсь, вот проблема, подправьте в коде, что бы работало так то.

Автор: inna.innainna84 15.09.16, 20:05

logist @ Вчера, 23:08 * ,
Sharzem да вы правы
""""""В отчете ВыбФирма не отбирается. Выборка есть только по складам""""""
но не хотелось бы создавать множество складов и стыковать по ним остатки тмц.

logist ------Да я не разбираюсь в дописании 1с, и прошу помощи подправьте пожалуйста этот код с выборкой по фирме.

Автор: inna.innainna84 22.09.16, 23:29

Sharzem @ 28.08.16, 10:46 * ,
Эта программа Uchoice.ert только отбирает документы и нужно в ручную все менять?


Пожалуйста уж очень нравится этот отчет, если не тяжело исправте его. Выборка не через склад, а по фирме.

Автор: Sharzem 23.09.16, 12:41

Если автор отчета (astonvilla), не предусмотрел разделить учет в этом отчете, то нет гарантии того что это вообще в конфигурации предусмотрено.

Я Вам пытаюсь донести что исправление только этого отчета не решит проблему.
Конфигурация Ваша скорее всего "самописка" и Вы даже понятия не имеете как там все устроено.
Поймите, Вам будет гораздо проще разделить места хранения чем "нарываться" в процессе дальнейшей работы на новые и новые проблемы.
Исправить отчет не тяжело, тяжело будет Вам потом, когда дойдет наконец-то что с самого начала у Вас организовано что-то неправильно.

Uchoice.ert - не только отбирает но и устанавливает реквизиты. Если это касается документов, то все измененные документы нужно будет после обработки перепровести, поскольку Uchoice.ert не изменяет значения регистров или проводок. Для перепроведения можно воспользоваться штатной обработкой Проведение документов (она правда перепроведет все выбранные виды, т.е. не только проведенные).

Автор: inna.innainna84 23.09.16, 17:14

Sharzem @ Сегодня, 13:41 * ,
Этот отчет нашла в нете и он мне очень нравится. Все остальное работает с разделителем учета (оборотки по счетам взаиморасчеты акты сверок и тд). Вы представляете сколько нужно будет дописывать документов, чтобы при создании нового дока при выборе фирмы выбирался другой склад, а не тот что по умолчанию, бух просто запутается в этих 7 складах. Это будет проблематично, чем просто исправить один отчет.

Автор: Cthulhu 14.10.16, 16:53

Ваша уверенность в том, что Вы верно оцениваете трудоемкость действия "просто исправить отчет" - умиляет.
не каждый отчет подходит к любой конфигурации. даже если он "очень красивый". я Вам даже больше скажу: чем "красивее" отчет тем он "привередливее" (ну совсем как девушки!), и тем меньше шансов на то, что он подойдет именно к Вашей конфигурации. Это я Вам как людовед, душелюб и программист - со всей ответственностью заявляю.
ещё раз. по слогам. "пригласите специалиста".

Автор: inna.innainna84 17.10.16, 12:41

Cthulhu @ 14.10.16, 17:53 * ,
Спасибо всем. Я нашла нужный мне отчет.

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