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