Добро пожаловать,
Расходы на производство (счета 20, 25, 26)
Отчет по расходам на производство в разрезе статей затрат и подразделений.
Отчет формирует сводную информацию по счетам 20, 25, 26 в разрезе статей затрат и подразделений. Статьи затрат формируются на основании данных по справочникам "Ст.затр. на производ-во", "Общехоз-е затр.", "Обще-производ-е затр".
Позволяет гибко настроить порядок колонок ("подразделений").
Отчет может быть сформирован по группам подразделений, с расшифровкой содержимого и детализацией по конкретному счету затрат и виду деятельности.
Код
//*****************************Контрольная область****************************
перем //необходимы т.к расчет и печать выполняется раздельно.
пар1,пар2,пар3,пар4,пар5,пар6,пар7,пар8,пар9,пар10,флРасчета,
Период1,Период2,сп1,сп2;
//возвращает 1 при совпадении списка и пометок.
//функции аналогичны, но их нельзя объединить, т.к используются пометки списка
//расположенного на форме
функция ПроверкаСпискаСпРазделы();
флаг = 1; //считаем что совпадение
для инд=1 по СпРазделы.РазмерСписка() цикл
сп1.Выбратьстроки();
пока сп1.ПолучитьСтроку()=1 цикл
если (спРазделы.ПолучитьЗначение(инд) = сп1.Данные) тогда
если спРазделы.Пометка(инд) <> сп1.Пометка тогда
флаг=0;
конецесли;
прервать;
конецесли;
конеццикла;
конеццикла;
возврат флаг;
конецфункции
функция ПроверкаСпискаСпПодр();
флаг = 1; //считаем что совпадение
для инд=1 по спПодр.РазмерСписка() цикл
сп2.Выбратьстроки();
пока сп2.ПолучитьСтроку()=1 цикл
если (спПодр.ПолучитьЗначение(инд) = сп2.Данные) тогда
если спПодр.Пометка(инд) <> сп2.Пометка тогда
флаг=0;
конецесли;
прервать;
конецесли;
конеццикла;
конеццикла;
возврат флаг;
конецфункции
функция ПолучитьСнимокСписка(список) //список к-й нужно скопировать в таблицу
ТЗ = создатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Данные");
ТЗ.НоваяКолонка("Пометка");
для инд=1 по список.РазмерСписка() цикл
ТЗ.НоваяСтрока();
ТЗ.Данные = список.ПолучитьЗначение(инд);
ТЗ.Пометка= список.Пометка(инд);
конеццикла;
возврат ТЗ;
конецфункции
//*****************************Интерфейсная область****************************
процедура СортироватьСписок(флаг)
если (спПодрПеч.РазмерСписка()>0) и (ПустоеЗначение(спПодрПеч.ТекущаяСтрока())=0) тогда
спПодрПеч.СдвинутьЗначение(флаг,спПодрПеч.ТекущаяСтрока());
конецесли;
конецпроцедуры
процедура ПриВыбореЗакладки(номерЗакл,значЗакл)
если номерЗакл = 1 тогда
Форма.ИспользоватьСлой("Основной");
иначе
Форма.ИспользоватьСлой("Дополнительный");
конецесли;
конецпроцедуры
процедура ПроверкаСписков(список)
если СпРазделы.РазмерСписка()<1 тогда
список.УдалитьВсе();
конецесли;
конецпроцедуры
процедура УдалениеЕдиничныхЗначений(список)
флРасчета=0;
если список.РазмерСписка()<>0 тогда
список.УдалитьЗначение(список.ТекущаяСтрока());
конецесли;
ПроверкаСписков(СпПодр);
ПроверкаСписков(СпВидДеят);
ПроверкаСписков(СпПодрПеч);
конецпроцедуры
процедура УдалитьВсе(список)
флРасчета=0;
список.УдалитьВсе();
ПроверкаСписков(СпПодр);
ПроверкаСписков(СпВидДеят);
ПроверкаСписков(СпПодрПеч);
конецпроцедуры
Процедура ОбработкаПодбора(ВыбранноеЗначение,Конт)
флаг = Конт.Форма.Параметр.флаг;
список = Конт.Форма.Параметр.список;
ВыбранныйЭлемент = ВыбранноеЗначение.ТекущийЭлемент();
э=0;
для инд = 1 по список.РазмерСписка() цикл
если список.получитьЗначение(инд).Родитель = ВыбранноеЗначение тогда
э=1;
конецесли;
конеццикла;
Если (список.НайтиЗначение(ВыбранныйЭлемент) =0)
и (список.НайтиЗначение(ВыбранныйЭлемент.Родитель)=0) и
(э=0) тогда
список.ДобавитьЗначение(ВыбранныйЭлемент);
Конецесли;
КонецПроцедуры
//флаг - 0 снять.
процедура ПометитьСписок(список,флаг)
флРасчета=0;
для инд =1 по список.РазмерСписка() цикл
Список.Пометка(инд,флаг);
конеццикла;
конецпроцедуры
Процедура РедактироватьОтбор(Спр,список,флаг)
флРасчета=0;
ТЗ = создатьОбъект("ТаблицаЗначений");
ТЗ.НоваяКолонка("Список");
ТЗ.НоваяКолонка("Флаг");
ТЗ.НоваяСтрока();
ТЗ.Список = список;
ТЗ.Флаг = флаг;
Конт = ТЗ;
ОткрытьПодбор(Спр,,Конт);
Конт.ВыборГруппы(флаг);
КонецПроцедуры
функция ЗагрузитьСписокПодр(список)
если СпРазделы.РазмерСписка()<0 тогда //не пустой
возврат 0;
конецесли;
для инд=1 по СпРазделы.РазмерСписка() цикл
сп = создатьОбъект("Справочник.Подразделения");
если СпРазделы.ПолучитьЗначение(инд).ЭтоГруппа()=1 тогда
сп.ИспользоватьРодителя(СпРазделы.ПолучитьЗначение(инд));
иначе
список.ДобавитьЗначение(СпРазделы.ПолучитьЗначение(инд));
конецесли;
сп.ВыбратьЭлементы();
пока сп.ПолучитьЭлемент()=1 цикл
если СпРазделы.ПолучитьЗначение(инд).ЭтоГруппа()=1 тогда
список.ДобавитьЗначение(сп.ТекущийЭлемент());
конецесли;
конеццикла;
конеццикла;
конецфункции
процедура ДобавитьОтбор(список)
перем значение;
флРасчета=0;
СпПодрОтбор= создатьОбъект("СписокЗначений");
ЗагрузитьСписокПодр(СпПодрОтбор);
если (СпПодрОтбор.ВыбратьЗначение(значение,
"Выборка разворачиваемых подразделений")= 1) и
(список.НайтиЗначение(значение)=0) тогда
список.ДобавитьЗначение(значение);
конецесли;
конецпроцедуры
//*****************************Расчетная область****************************
Процедура ПриОткрытии()
НачДата = НачМесяца(РабочаяДата());//НачалоПериодаБИ();
КонДата = КонМесяца(РабочаяДата());//КонецПериодаБИ();
КонецПроцедуры
//формирует ТабЗнач по указанному счету в разрезе 2-х субконто.
функция ФормированиеТЗ(ТЗ,Сч,субк1,субк2)
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
БИ.ИспользоватьПланСчетов(ПланыСчетов.Основной);
БИ.ИспользоватьСубконто(субк1);
БИ.ИспользоватьСубконто(субк2);
БИ.ВыполнитьЗапрос(НачДата,КонДата,Сч,,,,,"С");
ТЗ.Очистить();
ТЗ.НоваяКолонка("СтЗатрат");
//ТЗ.НоваяКолонка("ГрСт");
ТЗ.НоваяКолонка("Подр");
//ТЗ.НоваяКолонка("ГрПодр");
ТЗ.НоваяКолонка("Счет");
ТЗ.НоваяКолонка("Сумма","Число",10,2);
БИ.ВыбратьСубконто(1);
Пока БИ.ПолучитьСубконто(1)=1 Цикл
БИ.ВыбратьСубконто(2);
Пока БИ.ПолучитьСубконто(2)=1 Цикл
//проверка на пустые поля (статей и подразделений,ДО) их не включаем
если (ПустоеЗначение(БИ.Субконто(1).Наименование)=1) или
(ПустоеЗначение(БИ.Субконто(2).Наименование)=1) или
(ПустоеЗначение(БИ.ДО(Сч))=1)тогда
продолжить;
конецесли;
//фильтр для исключения 2-х статей по жесткой привязке к названию
если (БИ.Субконто(1).Наименование="Общепроизводственные затраты") или
(БИ.Субконто(1).Наименование="Общехозяйственные затраты") тогда
продолжить;
конецесли;
//отберем выбранные группы
если (СпРазделы.НайтиЗначение(БИ.Субконто(2).Родитель) <> 0)
или (СпРазделы.НайтиЗначение(БИ.Субконто(2)) <> 0)
тогда
ТЗ.НоваяСтрока();
ТЗ.СтЗатрат =БИ.Субконто(1);
//ТЗ.ГрСт =БИ.Субконто(1).Родитель;
ТЗ.Подр =БИ.Субконто(2);
//ТЗ.ГрПодр =БИ.Субконто(2).Родитель;
ТЗ.Счет =Сч; //строка
ТЗ.Сумма =БИ.ДО(Сч);
конецесли;
КонецЦикла;
Конеццикла;
возврат ТЗ;
Конецфункции
функция ФормированиеТЗ20(ТЗ,Сч,субк1,субк2,субк3)
БИ = СоздатьОбъект("БухгалтерскиеИтоги");
БИ.ИспользоватьПланСчетов(ПланыСчетов.Основной);
БИ.ИспользоватьСубконто(субк1);
БИ.ИспользоватьСубконто(субк2);
БИ.ИспользоватьСубконто(субк3);
БИ.ВыполнитьЗапрос(НачДата,КонДата,Сч,,,,,"С");
ТЗ.Очистить();
ТЗ.НоваяКолонка("СтЗатрат");
//ТЗ.НоваяКолонка("ГрСт");
ТЗ.НоваяКолонка("Подр");
//ТЗ.НоваяКолонка("ГрПодр");
ТЗ.НоваяКолонка("Счет");
ТЗ.НоваяКолонка("ВидДеят");
ТЗ.НоваяКолонка("Сумма","Число",10,2);
БИ.ВыбратьСубконто(1);
Пока БИ.ПолучитьСубконто(1)=1 Цикл
БИ.ВыбратьСубконто(2);
Пока БИ.ПолучитьСубконто(2)=1 Цикл
БИ.ВыбратьСубконто(3);
Пока БИ.ПолучитьСубконто(3)=1 Цикл
//проверка на пустые поля (статей и подразделений,ДО) их не включаем
если (ПустоеЗначение(БИ.Субконто(1).Наименование)=1) или
(ПустоеЗначение(БИ.Субконто(2).Наименование)=1) или
(ПустоеЗначение(БИ.Субконто(3).Наименование)=1) или
(ПустоеЗначение(БИ.ДО(Сч))=1)тогда
продолжить;
конецесли;
//фильтр для исключения 2-х статей по жесткой привязке к названию
если (БИ.Субконто(1).Наименование="Общепроизводственные затраты") или
(БИ.Субконто(1).Наименование="Общехозяйственные затраты") тогда
продолжить;
конецесли;
//отберем выбранные группы
если (СпРазделы.НайтиЗначение(БИ.Субконто(2).Родитель) <> 0)
или (СпРазделы.НайтиЗначение(БИ.Субконто(2)) <> 0)
тогда
ТЗ.НоваяСтрока();
ТЗ.СтЗатрат =БИ.Субконто(1);
//ТЗ.ГрСт =БИ.Субконто(1).Родитель;
ТЗ.Подр =БИ.Субконто(2);
//ТЗ.ГрПодр =БИ.Субконто(2).Родитель;
ТЗ.Счет =Сч; //строка
ТЗ.Сумма =БИ.ДО(Сч);
инд = СпПодр.НайтиЗначение(БИ.Субконто(2));
если инд <> 0 тогда
если СпПодр.Пометка(инд) = 1 тогда
если (СпВидДеят.НайтиЗначение(БИ.Субконто(3))<>0) тогда
ТЗ.ВидДеят =БИ.Субконто(3);
иначе
ТЗ.ВидДеят ="";
конецесли;
иначе
ТЗ.ВидДеят ="";
конецесли;
иначе
ТЗ.ВидДеят ="";
конецесли;
конецесли;
Конеццикла;
КонецЦикла;
Конеццикла;
возврат ТЗ;
Конецфункции
процедура ДобавлениеТЗ(ТЗОбщ,ТЗ)
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку()=1 Цикл
ТЗОбщ.НоваяСтрока();
ТЗОбщ.СтЗатрат =ТЗ.СтЗатрат;
//ТЗОбщ.ГрСт =ТЗ.ГрСт;
ТЗОбщ.Подр =ТЗ.Подр;
//ТЗОбщ.ГрПодр =ТЗ.ГрПодр;
ТЗОбщ.Счет =ТЗ.Счет;
ТЗОбщ.Сумма =ТЗ.Сумма;
конеццикла;
конецпроцедуры
//возвращает успешность получения данных - 1, 0-отсутствие данных
Функция ОбъединениеТабЗн(ТЗ,ТЗ20,ТЗ25,ТЗ26)
кол20 = ТЗ20.КоличествоСтрок();
кол25 = ТЗ25.КоличествоСтрок();
кол26 = ТЗ26.КоличествоСтрок();
если (кол20<1) и (кол25<1) и (кол26<1) тогда
возврат 0;
конецесли;
ТЗ.НоваяКолонка("СтЗатрат");
//ТЗ.НоваяКолонка("ГрСт");
ТЗ.НоваяКолонка("Подр");
//ТЗ.НоваяКолонка("ГрПодр");
ТЗ.НоваяКолонка("Счет");
ТЗ.НоваяКолонка("ВидДеят");
ТЗ.НоваяКолонка("Сумма","Число",10,2);
ТЗ.