Курилка на тему нытья некоторых обитателей форума, что де им никто не хочет помогать.....

Тема в разделе "Курилка", создана пользователем nomad_irk, 22 сен 2015.

  1. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Преамбула.

    Досталась мне БУХ 2.0 с доработками на поддержку.

    Лично я не буду давать характеристику квалификации выполнявших доработки специалистов, но чтобы вы смогли сами оценить масштабы "авгиевых конюшен", я выложу тексты модулей, на переделывание которых я потратил около рабочей недели, т.к. ТЗ если изначально и было, то оно давно и благополучно кануло в лету.

    Вся драматичность ситуации в том, что всю проделанную мной работу вообще никто НЕ оценит, ну разве что Профессионалы(именно с большой буквы "П"), обитающие на данном форуме, прочитавшие этот пост :)

    Мне пришлось это сделать потому, что другие алгоритмы прямо или косвенно зависели от этого.

    Выполнив всю эту работу я рискую выхватить звиздюлей от бухов/главбухов, т.к. я мог что-то где-то упустить, а "вчера оно работало".


    Амбула.

    Есть некий документ. На сколько я понял из имеющегося до переделывания кода, задача этого документа выгрести все остатки Кт по определенным счетам, проверить было ли изменение коэффициента за месяц, если было, то рассчитать количество дней между изменениями и посчитать числовое значение по определенной формуле, используя курс валюты на дату документа, если есть остаток валютного счета.

    Все это дело заполнить в ТЧ, чтобы потом по этим данным сформировать проводки.
    --- Объединение сообщений, 22 сен 2015 ---
    Итак, модуль формы документа:

    Код:
    
    Перем вр_тз;
    
    //Расчет
    Процедура ЗаполнениеТабличнойЧасти()
    
        ТабличнаяЧасть1.Очистить();
        Запрос=Новый Запрос;
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ХозрасчетныйОстаткиИОбороты.Счет,
        |    ХозрасчетныйОстаткиИОбороты.Субконто1,
        |    ХозрасчетныйОстаткиИОбороты.Субконто2,
        |    ХозрасчетныйОстаткиИОбороты.Субконто3,
        |    ХозрасчетныйОстаткиИОбороты.Организация,
        |    ХозрасчетныйОстаткиИОбороты.Валюта,
        |    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйРазвернутыйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаОборот,
        |    ХозрасчетныйОстаткиИОбороты.СуммаОборотДт,
        |    ХозрасчетныйОстаткиИОбороты.СуммаОборотКт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйРазвернутыйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйРазвернутыйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйРазвернутыйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйРазвернутыйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаОборот,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаОборотДт,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаОборотКт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйРазвернутыйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоНачальныйРазвернутыйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйРазвернутыйОстатокДт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоКонечныйРазвернутыйОстатокКт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоОборот,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоОборотДт,
        |    ХозрасчетныйОстаткиИОбороты.КоличествоОборотКт
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ДЕНЬ, , Счет В ИЕРАРХИИ (&УсловиеСчета), ,Организация = &Организация ) КАК ХозрасчетныйОстаткиИОбороты";
    
        Запрос.УстановитьПараметр("НачалоПериода",НачалоМесяца(Дата));
        Запрос.УстановитьПараметр("КонецПериода",КонецМесяца(Дата));
        Запрос.УстановитьПараметр("Организация",ЭлементыФормы.Организация.Значение);
        Массив = Новый Массив;
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеКредиты);//66,01
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеЗаймы);//66,03
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеКредитыВал);//66,21
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеЗаймыВал);//66,23
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеКредиты);//67,01
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеЗаймы);//67,03
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеКредитыВал);//67,21
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеЗаймыВал);//67,23
        Запрос.УстановитьПараметр("УсловиеСчета", Массив);
    
        Отработка=Запрос.Выполнить().Выгрузить();
        ЭлементыФормы.Индикатор1.МаксимальноеЗначение=отработка.Количество();
        количество=1;
        кол1=0;
        Для Каждого вр из отработка цикл
            ЭлементыФормы.Индикатор1.Значение=количество;
            количество=количество+1;
            ЭлементыФормы.ТабличнаяЧасть1.ДобавитьСтроку();
            Если кол1=0 тогда
                первая=ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока;
                кол1=1;
            КонецЕсли;
            ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.договор=вр.субконто2;
            ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.Валюта=вр.Валюта;
            Если вр.счет.код="66.01" тогда
          ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымКредитам;
            КонецЕсли;
            Если вр.счет.код="66.03" тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымЗаймам;
            КонецЕсли;
            Если вр.счет.код="66.21" тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымКредитамВал;
            КонецЕсли;
            Если вр.счет.код="66.23" тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымЗаймамВал;
            КонецЕсли;
            Если вр.счет.код="67.01" тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымКредитам;
            КонецЕсли;
            Если вр.счет.код="67.03" тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымЗаймам;
            КонецЕсли;
            Если вр.счет.код="67.21" тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымКредитамВал;
            КонецЕсли;
            Если вр.счет.код="67.23" тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымЗаймамВал;
            КонецЕсли;
            Если ПустаяСтрока(ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.счетПроцентов)=ложь тогда
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.Тип="Проценты";
            КонецЕсли;
        КонецЦикла;
        //ЭлементыФормы.ТабличнаяЧасть1.НачальноеОтображениеСписка=НачальноеОтображениеСписка.Начало;
        Если первая<>неопределено тогда
            ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока=первая;
        КонецЕсли;
    КонецПроцедуры
    
    Процедура ОсновныеДействияФормыРасчитать(Кнопка)
    
        ТабличнаяЧасть1.Очистить();
        врем1 = обработки.Расчет_Процентов2.ПолучитьФорму();
        врем1.ПараметрЗапуска=Дата;
        врем1.Дата1=Началомесяца(дата);
        врем1.Дата2=КонецМесяца(дата);
        врем1.ДелатьРасшифровку=ложь;
        врем1.Организация=Организация;
        врем1.Открыть();
        врем1.Закрыть();
        кол1=0;
        Для каждого стр из врем1.тз_конечная цикл
            Если стр.суммаПроцентов<>0 тогда
                ЭлементыФормы.ТабличнаяЧасть1.ДобавитьСтроку();
                Если кол1=0 тогда
                    первая=ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока;
                    кол1=1;
                КонецЕсли;
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.Контрагент=стр.Контрагент;
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.договор=стр.Договор;
                ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.Валюта=стр.Договор.ВалютаВзаиморасчетов;
    ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.СуммаПроцентов=стр.СуммаПроцентов;
    ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.СчетПроцентов=стр.СчетПроцентов;
    ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.СуммаПроцентовВалюта=стр.СуммаПроцентовВалюты;
            КонецЕсли;
        КонецЦикла;
        Если первая<>неопределено тогда
            ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока=первая;
        КонецЕсли;
        вр_тз=врем1.тз_конечная.Скопировать();
    КонецПроцедуры
    
    Процедура ТабличнаяЧасть1ПередНачаломИзменения(Элемент, Отказ)
        отказ=истина;
        врем1 = обработки.Расчет_Процентов2.ПолучитьФорму();
        врем1.ПараметрЗапуска=Неопределено;
        врем1.Дата1=Началомесяца(дата);
        врем1.Дата2=КонецМесяца(дата);
        врем1.Контрагент2=ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.Контрагент;
        врем1.договор2=ЭлементыФормы.ТабличнаяЧасть1.ТекущаяСтрока.Договор;
        врем1.ДелатьРасшифровку=истина;
        врем1.Организация=Организация;
        врем1.Открыть();
        врем1.Закрыть();
    КонецПроцедуры
    
    Процедура ДействияФормыЗаполнить(Кнопка)
        ЗаполнениеТабличнойЧасти();
    КонецПроцедуры
    
    Процедура ДействияФормыПроводкиДтКт(Кнопка)
    
        авг_ОбщегоНазначения.РучнаяКорректировкаОсновнаяФорма(ЭтоНовый(), Ссылка, ЭтотОбъект);
    
    КонецПроцедуры
    
    
    --- Объединение сообщений, 22 сен 2015 ---
    Внутри кода обработчика нажатия на кнопку "Расчитать" происходит вызов обработки, открытие ее формы, где и происходит собственно сам расчет числовых значений.


    Вот структура метаданных этой обработки:

    upload_2015-9-22_11-23-42.png
    Последнее редактирование: 24 сен 2015
  2. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Код модуля формы:

    Код:
    Перем проценты,Организация1,тз,тз_список,отработка,период_Конец, период_начало,Валюта_проценты;
    
    //Получаем 2 ТЗ
    //тз_список = общий список с полями Контрагент,Договор
    //Отработка = общий список со всеми движениями по счетам
    Процедура ЗапросОбщий(ДопДанные)
        Запрос=Новый Запрос;
        Если ПустаяСтрока(ДопДанные)=Истина тогда
            строка="РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ДЕНЬ, , Счет В ИЕРАРХИИ (&УсловиеСчета), ,Организация = &Организация )";
        иначе
            строка=СокрЛП(допДанные);
        Конецесли;
        ТекстЗапроса =
        "ВЫБРАТЬ
        |    ХозрасчетныйОстаткиИОбороты.Период,
        |    ХозрасчетныйОстаткиИОбороты.Счет,
        |    ХозрасчетныйОстаткиИОбороты.Субконто1,
        |    ХозрасчетныйОстаткиИОбороты.Субконто2,
        |    ХозрасчетныйОстаткиИОбороты.Субконто3,
        |    ХозрасчетныйОстаткиИОбороты.Организация,
        |    ХозрасчетныйОстаткиИОбороты.Валюта,
        |    ХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.СуммаОборот,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаНачальныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаКонечныйОстаток,
        |    ХозрасчетныйОстаткиИОбороты.ВалютнаяСуммаОборот
        |ИЗ
        |    "+строка+" КАК ХозрасчетныйОстаткиИОбороты";
    
        Если ПустаяСтрока(ДопДанные)=ложь тогда
            Запрос.УстановитьПараметр("Контрагент",Контрагент2);
            Запрос.УстановитьПараметр("Договор",Договор2);
        Конецесли;
        запрос.текст=Текстзапроса;
        Запрос.УстановитьПараметр("НачалоПериода",период_начало);
        Запрос.УстановитьПараметр("КонецПериода",период_конец);
        Запрос.УстановитьПараметр("Организация",Организация1);
    
        Массив = Новый Массив;
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеКредиты);//66,01
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеЗаймы);//66,03
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеКредитыВал);//66,21
        Массив.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеЗаймыВал);//66,23
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеКредиты);//67,01
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеЗаймы);//67,03
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеКредитыВал);//67,21
        Массив.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеЗаймыВал);//67,23
        Запрос.УстановитьПараметр("УсловиеСчета", Массив);
        Отработка=Запрос.Выполнить().Выгрузить();
        Отработка.Колонки.Добавить("Проценты");
        тз_список=отработка.Скопировать();
        тз_список.Свернуть("Субконто1,Субконто2");
        Для Каждого вр из отработка цикл
            Если вр.счет.код="66.01" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымКредитам;
            КонецЕсли;
            Если вр.счет.код="66.03" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымЗаймам;
            КонецЕсли;
            Если вр.счет.код="66.21" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымКредитамВал;
            КонецЕсли;
            Если вр.счет.код="66.23" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымЗаймамВал;
            КонецЕсли;
    
            Если вр.счет.код="67.01" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымКредитам;
            КонецЕсли;
            Если вр.счет.код="67.03" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымЗаймам;
            КонецЕсли;
            Если вр.счет.код="67.21" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымКредитамВал;
            КонецЕсли;
            Если вр.счет.код="67.23" тогда
                вр.Проценты=ПланыСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымЗаймамВал;
            КонецЕсли;
        КонецЦикла;
    КонецПроцедуры
    
    Функция расчётПроцентов(Ставка,колДней,СуммаКредита,Валюта1)
        колвоВГоду=окр((КонецГода(период_конец)-НачалоГода(период_конец))/86400);
        Если ставка=неопределено тогда
            ставка=0;
        КонецЕслИ;
        Если Валюта1=Справочники.Валюты.НайтиПоКоду("643") или валюта1=null тогда
            Проценты=(СуммаКредита*ставка)/КолвоВГоду/100*колДней;
            Возврат Проценты;
        иначе
            //Если вексель валютный, то просто тупо делаем расчёт, но пр курсу на дату документа
            Проценты=СуммаКредита/КолвоВГоду*колДней*(ставка/100)*РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ПараметрЗапуска, Новый Структура("Валюта", Валюта1)).Курс;
            Валюта_проценты=СуммаКредита/КолвоВГоду*колДней*(ставка/100);
            Возврат Проценты;
        КонецЕсли;
    КонецФункции
    
    //Процедура выбирает из тз Отработка данные только по нашему договору
    //получаем даты с которых поменялись данные
    //Сворачиваем на отсутствие дублей
    //делаем начальное заполнение тз по полям ПериодНачала,ПериодКонца,Тело(кредита))
    Процедура ОтборДоговора(Контрагент1,Дон1)
        //Отбор на таблицу значений
        Отбор = Новый Структура();
        Отбор.Вставить("Субконто1",Контрагент1);
        Отбор.Вставить("Субконто2",Дон1);
        Строки = Отработка.НайтиСтроки(Отбор);
        тз1= новый ТаблицаЗначений;
        тз1.Колонки.Добавить("Период1");
        тз1.Колонки.Добавить("Период2");
        тз1.Колонки.Добавить("Тело");
        тз1.Колонки.Добавить("Счет");
        тз1.Колонки.Добавить("СчетПроцентов");
        тз1.Колонки.Добавить("Валюта");
        первый=0;
        //изменено для валютных вескелей
        тело1Вал=0;
        //конец изменений для валютных вескелей
        Для каждого стр из строки цикл
            Если первый=0 тогда
                первый=1;
                дата1=Стр.Период;
                тело1=стр.СуммаНачальныйОстаток*(-1);
                //изменено для валютных вескелей
                тело1Вал=стр.ВалютнаяСуммаНачальныйОстаток*(-1);
                //конец изменений для валютных вескелей
            КонецЕслИ;
            Если (стр.СуммаОборот<>0) И (тело1<>0) тогда
                вр2=тз1.Добавить();
                вр2.Счет=стр.Счет;
                вр2.СчетПроцентов=стр.Проценты;
                вр2.Период1=дата1;
                //изменено для валютных вескелей
                Если Стр.Валюта=Справочники.Валюты.НайтиПоКоду("643") или стр.Валюта=Null Тогда
                    вр2.Тело=тело1;
                иначе
                    вр2.Тело=тело1Вал;
                КонецЕсли;
                //конец изменений для валютных вескелей
                вр2.Период2=стр.Период+86400;
                вр2.Валюта=стр.Валюта;
                дата1=стр.Период+86400;
                тело1=стр.СуммаКонечныйОстаток*(-1);
                //тело1=стр.СуммаНачальныйОстаток*(-1);
                иначе если     (стр.СуммаОборот<>0) И (тело1=0) тогда
                    дата1=стр.Период+86400;
                    тело1=стр.СуммаКонечныйОстаток*(-1);
                    //тело1=стр.СуммаНачальныйОстаток*(-1);
                    тело1Вал=стр.ВалютнаяСуммаОборот*(-1);
                КонецЕсли;    
            КонецЕсли;
            Если (НачалоДня(Стр.Период)=НачалоДня(период_Конец)) и (НачалоДня(дата1)<=НачалоДня(стр.Период)) тогда
                вр2=тз1.Добавить();
                вр2.Счет=стр.Счет;
                вр2.СчетПроцентов=стр.Проценты;
                вр2.Период1=дата1;
                //изменено для валютных вескелей
                Если Стр.Валюта=Справочники.Валюты.НайтиПоКоду("643") или стр.Валюта=Null Тогда
                    вр2.Тело=тело1;
                иначе
                    вр2.Тело=тело1Вал;
                КонецЕсли;
                //конец изменений для валютных вескелей
                вр2.Период2=период_Конец;
               вр2.Валюта=стр.Валюта;
                тело1=стр.СуммаКонечныйОстаток*(-1);
                //тело1=стр.СуммаНачальныйОстаток*(-1);
                тело1Вал=стр.ВалютнаяСуммаКонечныйОстаток*(-1);
            КонецеслИ;
        КонецЦикла;
    
        //Теперь подключим изменения ставки и резальтаты занесём в результатирующую таблицу "тз"
        //с полностью заполненными данными для окончательных проводок по данному договору
        кол1=0;
        Для каждого стр из тз1 цикл
            Отбор1=Новый Структура("Договор");
            Отбор1.договор=дон1;
            ставка_вр=РегистрыСведений.ПроцентнаяСтавка.СрезПоследних(стр.Период1,Отбор1);
            Для каждого стр1 из ставка_вр цикл
                ставка1=стр1.Ставка;
            КонецЦикла;
            Выборка=РегистрыСведений.ПроцентнаяСтавка.Выбрать(стр.Период1,стр.Период2-1,Отбор1);
            дата1=Стр.Период1;
            дата2=Стр.Период1;
            Пока Выборка.Следующий() цикл
                Если стр.Период1<>Выборка.Период тогда
                    Если (Выборка.Период>дата1) И (Выборка.Период<стр.Период2) тогда
                        вр7=тз.Добавить();
                        вр7.Договор=Дон1;
                        вр7.Контрагент=Контрагент1;
                        вр7.ПериодНачала=дата1;
                        вр7.ПериодКонец=Выборка.Период;
                        вр7.Тело=стр.Тело;
                        вр7.ставка=ставка1;
                        вр7.КоличествоДней=окр((Выборка.Период-дата1)/86400);
                        вр7.Счет=стр.Счет;
                        вр7.Валюта=стр.Валюта;
                        вр7.СчетПроцентов=стр.СчетПроцентов;
                        дата1=Выборка.Период;
                        дата2=Выборка.Период;
                        ставка1=Выборка.Ставка
                    иначе
                        вр7=тз.Добавить();
                        вр7.Договор=Дон1;
                        вр7.Контрагент=Контрагент1;
                        вр7.ПериодНачала=стр.Период1;
                        вр7.ПериодКонец=стр.Период2;
                        вр7.ставка=ставка1;
                        вр7.Тело=стр.Тело;
                        вр7.Счет=стр.Счет;
                        вр7.СчетПроцентов=стр.СчетПроцентов;
                        вр7.Валюта=стр.Валюта;
                        вр7.КоличествоДней=окр((стр.Период2-стр.Период1)/86400);
                        дата2=стр.Период2;
                        ставка1=Выборка.Ставка
                    КонецЕсли;
                КонецЕсли;
                //Закрываем то что не попало в расчёт
            КонецЦикла;
            Если дата2<стр.Период2 тогда
                вр7=тз.Добавить();
                вр7.Договор=Дон1;
                вр7.Контрагент=Контрагент1;
                вр7.ПериодНачала=дата2;
                вр7.ПериодКонец=стр.Период2;
                вр7.ставка=ставка1;
                вр7.Тело=стр.Тело;
                вр7.Счет=стр.Счет;
                вр7.Валюта=стр.Валюта;
                вр7.СчетПроцентов=стр.СчетПроцентов;
                //данные были изменены по согласованию 15 августа 2008 года
                //Добавлен параметр КонецДня
                вр7.КоличествоДней=окр((стр.Период2-дата2)/86400);
                дата2=стр.Период2;
                ставка1=Выборка.Ставка
            КонецЕсли;
        КонецЦикла;
    
        //Для каждого стр из тз цикл
        //    вр=1;
        //    Сообщить("-----------------------------------------------------");
        //    Сообщить("|  "+стр.ПериодНачала+" |  "+стр.ПериодКонец+" | +стр.КоличествоДней+" | "+стр.Ставка+" | "+стр.Тело);
        //КонецЦикла;
    КонецПроцедуры
    
    //Процедура перебора всей информации на базе запроса сформированного в данной обработке
    Процедура Обработка1(запрос2)
        Если ДелатьРасшифровку=Истина тогда
            ТабДокумент = Новый ТабличныйДокумент;
            Макет=ПолучитьМакет("макет");
            ОбластьМакета = Макет.ПолучитьОбласть("Шапка");
            ТабДокумент.Вывести(ОбластьМакета);
        КонецеслИ;
        тз= новый ТаблицаЗначений;
        тз.Колонки.Добавить("ПериодНачала");
        тз.Колонки.Добавить("ПериодКонец");
        тз.Колонки.Добавить("Контрагент");
        тз.Колонки.Добавить("Договор");
        тз.Колонки.Добавить("Тело");
        тз.Колонки.Добавить("Ставка");
        тз.Колонки.Добавить("Счет");
        тз.Колонки.Добавить("СчетПроцентов");
        тз.Колонки.Добавить("КоличествоДней");
        тз.Колонки.Добавить("Валюта");
        тз.Колонки.Добавить("ТелоВалюта");
        тз.Колонки.Добавить("СуммаПроцентов");
        //тз_конечная= новый ТаблицаЗначений;
        тз_конечная.Колонки.Добавить("Контрагент");
        тз_конечная.Колонки.Добавить("Договор");
        тз_конечная.Колонки.Добавить("Дата1");
        тз_конечная.Колонки.Добавить("дата2");
        тз_конечная.Колонки.Добавить("КолВоДней");
        тз_конечная.Колонки.Добавить("СуммаПроцентов");
        тз_конечная.Колонки.Добавить("счетПроцентов");
        тз_Конечная.Колонки.Добавить("Счет");
        тз_конечная.Колонки.Добавить("Валюта2");
        тз_конечная.Колонки.Добавить("СуммаПроцентовВалюты");
        период_конец=Дата2;
        период_начало=дата1;
        Организация1=Организация;
        ЗапросОбщий(запрос2);
        ЭлементыФормы.Индикатор1.МаксимальноеЗначение=тз_список.Количество();
        Для каждого стр1 из тз_список цикл
            временная_начало=Неопределено;
            временная_конец=Неопределено;
            Счет_Процентов=Неопределено;
            счет=Неопределено;
            кол_дней=0;
            сум_проц=0;
            сум_вал=0;
            первая=0;
            тз.Очистить();
            ОтборДоговора(стр1.Субконто1,стр1.Субконто2);
            Если ДелатьРасшифровку=Истина тогда
                ОбластьМакета = Макет.ПолучитьОбласть("СтрокаКонтрагент");
                ОбластьМакета.Параметры.Контрагент1=стр1.Субконто1;
                ТабДокумент.Вывести(ОбластьМакета);
                ОбластьМакета = Макет.ПолучитьОбласть("СтрокаДоговор");
                ОбластьМакета.Параметры.Договор1=стр1.Субконто2;
                ТабДокумент.Вывести(ОбластьМакета);
            Конецесли;
            //получаем доп.данные
            для каждого стр из тз цикл
                Если первая=0 тогда
                    временная_начало=стр.ПериодНачала;
                    счет_процентов=Стр.СчетПроцентов;
                    счет=стр.Счет;
                    первая=1;
                КонецЕсли;
                Валюта_проценты=0;
                стр.СуммаПроцентов=расчётПроцентов(стр.Ставка,стр.КоличествоДней,стр.Тело,стр.Валюта);
                сум_проц=сум_проц+стр.СуммаПроцентов;
                сум_вал=сум_вал+Валюта_проценты;
                кол_дней=кол_дней+стр.КоличествоДней;
                временная_конец=стр.ПериодКонец;
                Если ДелатьРасшифровку=Истина тогда
                    ОбластьМакета=Макет.ПолучитьОбласть("Строка1");
                    ОбластьМакета.Параметры.ПериодНачала=стр.ПериодНачала;
                    ОбластьМакета.Параметры.ПериодКонец=стр.ПериодКонец;
                    ОбластьМакета.Параметры.Тело=стр.Тело;
                    ОбластьМакета.Параметры.Ставка=СокрЛП(стр.Ставка)+"%";
                    ОбластьМакета.Параметры.КоличествоДней=стр.КоличествоДней;
                    ОбластьМакета.Параметры.Валюта1=стр.Валюта;
                    Валюта_проценты=0;
                    ОбластьМакета.Параметры.СуммаПроцентов=расчётПроцентов(стр.Ставка,стр.КоличествоДней,стр.Тело,Стр.Валюта);
                    ТабДокумент.Вывести(ОбластьМакета);
                Конецесли;
            КонецЦикла;
            вр3=тз_конечная.Добавить();
            Если временная_начало<>Неопределено тогда
                вр3.Дата1=временная_начало;
            иначе
                вр3.Дата1=дата1;
            КонецЕсли;
            Если временная_конец<>Неопределено тогда
                вр3.дата2=временная_конец;
            иначе
                вр3.Дата2=Дата2;
            Конецесли;
            вр3.КолВоДней=кол_дней;
            вр3.СуммаПроцентов=сум_проц;
            вр3.Контрагент=стр1.Субконто1;
            вр3.Договор=Стр1.Субконто2;
            //вр3.СуммаПроцентовВалюты=Валюта_проценты;
            вр3.СуммаПроцентовВалюты=сум_вал;
            Если Счет_процентов<>Неопределено тогда
                вр3.СчетПроцентов=Счет_Процентов;
            КонецЕсли;
            Если Счет<>Неопределено тогда
                вр3.счет=Счет;
            Конецесли;
        КонецЦикла;
        Если ДелатьРасшифровку=Истина тогда
            ТабДокумент.ОтображатьСетку = Ложь;
            ТабДокумент.ОтображатьЗаголовки=ложь;
            ТабДокумент.Защита = Ложь;
            ТабДокумент.ТолькоПросмотр = Истина;
            ТабДокумент.Показать("Отчет по печати процентов в расшифровке");
        КонецеслИ;
    КонецПроцедуры
    
    Процедура ПриОткрытии()
        Если ПараметрЗапуска<> Неопределено тогда
            Текст2="";
            Обработка1(текст2);
        иначе
            текст2=
            "РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, ДЕНЬ, , Счет В ИЕРАРХИИ (&УсловиеСчета), ,(Организация = &Организация) И (Субконто1=&Контрагент) И (Субконто2=&Договор))";
            Обработка1(текст2);
        КонецЕсли;
    КонецПроцедуры
    
    
    --- Объединение сообщений, 22 сен 2015 ---
    Замер производительности всего этого безобразия:
    upload_2015-9-22_11-24-48.png
    Последнее редактирование: 24 сен 2015
  3. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Коль уж взялся переделывать, то сделал все на управляемых формах.


    Модуль формы документа:

    Код:
    &НаСервере
    Функция ПолучитьОбъект()
    
        Возврат ДанныеФормыВЗначение(Объект, Тип("ДокументОбъект.НачислениеПроцентов"));
    
    КонецФункции
    
    &НаКлиенте
    Процедура РезультатПроведения(Команда)
    
        Прочитать();
        авг_ОбщегоНазначения.РучнаяКорректировкаОсновнаяФорма(НЕ ЗначениеЗаполнено(Объект.Ссылка), Объект.Ссылка, ПолучитьОбъект());
    
    КонецПроцедуры
    
    &НаСервере
    
    Процедура ЗаполнитьТЧНаСервере()
        МассивСубконто = Новый Массив;
         МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Контрагенты);  МассивСубконто.Добавить(ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Договоры);
    
        МассивСчетов = Новый Массив;
        МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеКредиты);//66,01
        МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеЗаймы);//66,03
       МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеКредитыВал);//66,21
       МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.КраткосрочныеЗаймыВал);//66,23
        МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеКредиты);//67,01
        МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеЗаймы);//67,03
       МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеКредитыВал);//67,21
       МассивСчетов.Добавить(ПланыСчетов.Хозрасчетный.ДолгосрочныеЗаймыВал);//67,23
    
        Запрос = Новый Запрос;
        Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(Объект.Дата));
        Запрос.УстановитьПараметр("КонПериода", КонецМесяца(Объект.Дата));
        Запрос.УстановитьПараметр("МоментВремени", Новый Граница(КонецДня(Объект.Дата), ВидГраницы.Включая));
        Запрос.УстановитьПараметр("Субконто", МассивСубконто);
        Запрос.УстановитьПараметр("СписокСчетов", МассивСчетов);
        Запрос.УстановитьПараметр("Организация", Объект.Организация);
    
        Запрос.Текст =
        "ВЫБРАТЬ
        |    ПроцентнаяСтавкаСрезПоследних.Договор,
        |    ПроцентнаяСтавкаСрезПоследних.Ставка,
        |    &НачПериода КАК Период,
        |    ИСТИНА КАК ПрошлыйПериод
        |ПОМЕСТИТЬ ВТ_ДоговорыДляОбработкиНачалоПериода
        |ИЗ
        |    РегистрСведений.ПроцентнаяСтавка.СрезПоследних(
        |            &НачПериода,
        |            Договор.Организация = &Организация
        |                И Ставка > 0) КАК ПроцентнаяСтавкаСрезПоследних
        |ГДЕ
        |    ПроцентнаяСтавкаСрезПоследних.Период < &НачПериода
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ПроцентнаяСтавкаСрезПоследних.Договор,
        |    ПроцентнаяСтавкаСрезПоследних.Ставка
        |ПОМЕСТИТЬ ВТ_ДоговорыДляОбработкиКонецПериода
        |ИЗ
        |    РегистрСведений.ПроцентнаяСтавка.СрезПоследних(
        |            &КонПериода,
        |            Договор.Организация = &Организация
        |                И Ставка > 0) КАК ПроцентнаяСтавкаСрезПоследних
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ПроцентнаяСтавка.Договор,
        |    ПроцентнаяСтавка.Период,
        |    ПроцентнаяСтавка.Ставка
        |ПОМЕСТИТЬ ВТ_ИзменениеПроцентнойСтавкиЗаПериод
        |ИЗ
        |    РегистрСведений.ПроцентнаяСтавка КАК ПроцентнаяСтавка
        |ГДЕ
        |    ПроцентнаяСтавка.Период МЕЖДУ &НачПериода И &КонПериода
        |    И ПроцентнаяСтавка.Ставка > 0
        |    И ПроцентнаяСтавка.Договор.Организация = &Организация
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.Договор,
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.Период КАК ИзменениеСтавкиНачало,
        |    МИНИМУМ(ЕСТЬNULL(ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Период, &КонПериода)) КАК ИзменениеСтавкиКонец,
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.Ставка КАК Ставка,
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.ПрошлыйПериод
        |ПОМЕСТИТЬ ВТ_ИзменениеСтавокЗаПериод
        |ИЗ
        |    ВТ_ДоговорыДляОбработкиНачалоПериода КАК ВТ_ДоговорыДляОбработкиНачалоПериода
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИзменениеПроцентнойСтавкиЗаПериод КАК ВТ_ИзменениеПроцентнойСтавкиЗаПериод
        |        ПО ВТ_ДоговорыДляОбработкиНачалоПериода.Договор = ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Договор
        |            И ВТ_ДоговорыДляОбработкиНачалоПериода.Период < ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Период
        |
        |СГРУППИРОВАТЬ ПО
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.Договор,
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.Период,
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.Ставка,
        |    ВТ_ДоговорыДляОбработкиНачалоПериода.ПрошлыйПериод
        |
        |ОБЪЕДИНИТЬ ВСЕ
        |
        |ВЫБРАТЬ
        |    ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Договор,
        |    ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Период,
        |    МИНИМУМ(ЕСТЬNULL(ВТ_ИзменениеПроцентнойСтавкиЗаПериод1.Период, &КонПериода)),
        |    ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Ставка,
        |    ЛОЖЬ
        |ИЗ
        |    ВТ_ИзменениеПроцентнойСтавкиЗаПериод КАК ВТ_ИзменениеПроцентнойСтавкиЗаПериод
        |        ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИзменениеПроцентнойСтавкиЗаПериод КАК ВТ_ИзменениеПроцентнойСтавкиЗаПериод1
        |        ПО ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Договор = ВТ_ИзменениеПроцентнойСтавкиЗаПериод1.Договор
        |            И ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Период < ВТ_ИзменениеПроцентнойСтавкиЗаПериод1.Период
        |
        |СГРУППИРОВАТЬ ПО
        |    ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Договор,
        |    ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Ставка,
        |    ВТ_ИзменениеПроцентнойСтавкиЗаПериод.Период
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВложенныйЗапрос.Договор,
        |    СУММА(ВЫБОР
        |            КОГДА ВложенныйЗапрос.ПрошлыйПериод
        |                ТОГДА РАЗНОСТЬДАТ(ВложенныйЗапрос.ИзменениеСтавкиНачало, ВложенныйЗапрос.ИзменениеСтавкиКонец, ДЕНЬ) + 1
        |            ИНАЧЕ РАЗНОСТЬДАТ(ВложенныйЗапрос.ИзменениеСтавкиНачало, ВложенныйЗапрос.ИзменениеСтавкиКонец, ДЕНЬ)
        |        КОНЕЦ) КАК КоличествоДней,
        |    ДЕНЬГОДА(КОНЕЦПЕРИОДА(ВложенныйЗапрос.ИзменениеСтавкиНачало, ГОД)) КАК КоличествоДнейВГоду,
        |    ВложенныйЗапрос.Ставка
        |ПОМЕСТИТЬ ВТ_СтавкиПоДням
        |ИЗ
        |    (ВЫБРАТЬ
        |        ВТ_ДоговорыДляОбработки.Договор КАК Договор,
        |        НАЧАЛОПЕРИОДА(ЕСТЬNULL(ВТ_ИзменениеСтавокЗаПериод.ИзменениеСтавкиНачало, &НачПериода), ДЕНЬ) КАК ИзменениеСтавкиНачало,
        |        НАЧАЛОПЕРИОДА(ЕСТЬNULL(ВТ_ИзменениеСтавокЗаПериод.ИзменениеСтавкиКонец, &КонПериода), ДЕНЬ) КАК ИзменениеСтавкиКонец,
        |        ЕСТЬNULL(ВТ_ИзменениеСтавокЗаПериод.Ставка, ВТ_ДоговорыДляОбработки.Ставка) КАК Ставка,
        |        ВТ_ИзменениеСтавокЗаПериод.ПрошлыйПериод КАК ПрошлыйПериод
        |    ИЗ
        |        ВТ_ДоговорыДляОбработкиКонецПериода КАК ВТ_ДоговорыДляОбработки
        |            ЛЕВОЕ СОЕДИНЕНИЕ ВТ_ИзменениеСтавокЗаПериод КАК ВТ_ИзменениеСтавокЗаПериод
        |            ПО ВТ_ДоговорыДляОбработки.Договор = ВТ_ИзменениеСтавокЗаПериод.Договор) КАК ВложенныйЗапрос
        |
        |СГРУППИРОВАТЬ ПО
        |    ВложенныйЗапрос.Договор,
        |    ВложенныйЗапрос.Ставка,
        |    ДЕНЬГОДА(КОНЕЦПЕРИОДА(ВложенныйЗапрос.ИзменениеСтавкиНачало, ГОД))
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |    ВЫБОР
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КраткосрочныеКредиты)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымКредитам)
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КраткосрочныеЗаймы)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымЗаймам)
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КраткосрочныеКредитыВал)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымКредитам)
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.КраткосрочныеЗаймыВал)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоКраткосрочнымЗаймамВал)
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ДолгосрочныеКредиты)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымКредитам)
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ДолгосрочныеЗаймы)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымЗаймам)
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ДолгосрочныеКредитыВал)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымКредитамВал)
        |        КОГДА ХозрасчетныйОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ДолгосрочныеЗаймыВал)
        |            ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПроцентыПоДолгосрочнымЗаймамВал)
        |        ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)
        |    КОНЕЦ КАК СчетПроцентов,
        |    ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
        |    ХозрасчетныйОстатки.Субконто2 КАК Договор,
        |    ХозрасчетныйОстатки.Валюта,
        |    ХозрасчетныйОстатки.СуммаОстатокКт / ЕСТЬNULL(ВТ_СтавкиПоДням.КоличествоДнейВГоду, 1) * ЕСТЬNULL(ВТ_СтавкиПоДням.КоличествоДней, 0) * ЕСТЬNULL(ВТ_СтавкиПоДням.Ставка, 0) / 100 КАК СуммаПроцентов,
        |    ХозрасчетныйОстатки.ВалютнаяСуммаОстатокКт / ЕСТЬNULL(ВТ_СтавкиПоДням.КоличествоДнейВГоду, 1) * ЕСТЬNULL(ВТ_СтавкиПоДням.КоличествоДней, 0) * ЕСТЬNULL(ВТ_СтавкиПоДням.Ставка, 0) / 100 КАК СуммаПроцентовВалюта
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.Остатки(&МоментВремени, Счет В (&СписокСчетов), &Субконто, Организация = &Организация) КАК ХозрасчетныйОстатки
        |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ_СтавкиПоДням КАК ВТ_СтавкиПоДням
        |        ПО ХозрасчетныйОстатки.Субконто2 = ВТ_СтавкиПоДням.Договор
        |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&КонПериода, ) КАК КурсыВалютСрезПоследних
        |        ПО ХозрасчетныйОстатки.Валюта = КурсыВалютСрезПоследних.Валюта";
    
        Объект.ТабличнаяЧасть1.Загрузить(Запрос.Выполнить().Выгрузить());
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ЗаполнитьТЧ(Команда)
    
        ЗаполнитьТЧНаСервере();
    
    КонецПроцедуры
    
    &НаКлиенте
    Процедура ДатаПриИзменении(Элемент)
    
        Объект.Дата = КонецДня(Объект.Дата);
    
    КонецПроцедуры
    
    --- Объединение сообщений, 22 сен 2015 ---
    Все. Весь тот трэш и угар, что был до переделывания, превратился в пакетный запрос.

    Замер производительности:
    upload_2015-9-22_11-25-56.png


    Мальчишки и девчонки, дочитавшие пост до этих строк, прежде, чем постить очередную тему на форуме в стиле "ничего не понятно, но надо сделать завтра" просто вспомните про этот пост.
    Последнее редактирование: 24 сен 2015
  4. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Я первый дочитал..

    Вадим а как же развеять интригу.. Покажи победителя в номинации "Процедура года" ЗаполнитьТЧНаСервере()

    P.S. Прошу прощения нашёл. Ну а что козырно.. 14-15 кратный прирост.
  5. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.978
    Симпатии:
    397
    Баллы:
    104
    У меня похлеще ситуация была. Я взялся переписать механизм один, причем инициатива была моя. Механизм по заполнению ТЧ и расчету себестоимости товара. По наследству от старого "супер программиста" досталось. Почти также как и у тебя. Запрос1, алкоЛголь, дата1, дата2, дата3 и т.д. Глаза резало от этого. Выполнялось все минут 10. Т.е. каждый документ заполнялся около 10 минут. Я 2 месяца потратил чтобы переписать. Все сделал четко. А после того как внедрил, мне бухгалтерша сказал точно такие же слова. Цитирую: "Нахера ты туда полез, вчера все работало". Мне даже спасибо никто не сказал. Обидно иногда бывает. Понимаю тебя.
    nomad_irk нравится это.
  6. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Да дело даже не в приросте как таковом, а в том говнокоде, с которым пришлось разбираться. Там львиная доля времени потрачена именно на понимание происходящего.
    И таких документов там еще штук 6 + обработка загрузки данных из оракула, работающая на клиенте.....ближайший месяц загрузка меня - обеспечена :)
  7. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Ну тут как.. 2 программиста сейчас уволились.. Один 3 года отработал.. Говорят перейми у него всё что он знает..

    -- Что скажешь за партии?
    --Да хз.. Провел документы 3 месяца назад, никто не проверял.

    Всё..

    Сейчас руководство: Да вот у него всё работало, спросите у него.. задал вопрос: А кто нибудь за ним проверял? Я видела всё работало и всё.. разобраться с последними 2 месяцами.. а то что партии не распределены с апреля всем по барабану. Но в июне еще хоть как то 18 не распределено документов, в июле 18 тысяч.
  8. nbIpKuH_BaH9I
    Offline

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.978
    Симпатии:
    397
    Баллы:
    104
    Ну на счет говнокода это вообще отдельная тема. Это могут оценить только единицы.
  9. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    В учетных данных я вообще не разбираюсь, даже права убрал бы себе на просмотр, если бы можно было бы :)
    Именно говнокод, т.к. работать-то в основном в коде, а не разбираться в кривых остатках на складах.
  10. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    В этом соль данной темы, т.к. приведен всего лишь 1 пример рабочей недели....
  11. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Ты один что ли остался?
  12. TerANik
    Offline

    TerANik Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    997
    Симпатии:
    70
    Баллы:
    54
    Да нет еще один остался.. молчун .. зато на нас двоих у нас три методолога))
  13. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Не многовато?
  14. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    вот чего нарыл в модуле формы одного документа:

    Код:
    Функция СальдоПоВекселю(Сч58,Векселедатель,Вексель,ВексельныйДоговор)
        Отбор = Новый Структура();
        Отбор.Вставить("Субконто1",Векселедатель);
        Если Сч58.ВексельныйДоговор.Пустая()=истина тогда
        //Если ПланыСчетов.Хозрасчетный.ДолговыеЦенныеБумаги = Сч58 Тогда
            Отбор.Вставить("Субконто2",Вексель);
        Иначе
            Отбор.Вставить("Субконто2",ВексельныйДоговор);
        КонецЕсли;   
        Строки = Отработка.НайтиСтроки(Отбор);   
        кол=0;
        Для каждого стр из строки цикл
            кол=стр.СуммаОстаток;
        КонецЦикла;   
        Возврат кол;
       
    КонецФункции //СальдоПоВекселю
    
    Код:
    Процедура ТабличнаяЧасть1ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
        ДанныеСтроки.Сальдо58_2=СальдоПоВекселю(ДанныеСтроки,ДанныеСтроки.Векселедатель,ДанныеСтроки.Вексель,ДанныеСтроки.ВексельныйДоговор);
        ДанныеСтроки.Сальдо58_6=СальдоПоВекселю(ДанныеСтроки,ДанныеСтроки.Векселедатель,ДанныеСтроки.Вексель,ДанныеСтроки.ВексельныйДоговор);
    КонецПроцедуры
    
    Это вызывает зацикливание. !!! НЕ ДЕЛАЙТЕ ТАК НИКОГДА !!!
  15. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Можно то же пожалуюсь :)
    Досталась рукоблудная база. В ней программист сделал расчёт начисления бонусных баллов.
    Через вызов процедуры в которой указан процент скидки. Теперь что бы изменить процент начисления баллов нужно написать свою новую процедуру. В которой указать свой процент скидки.
    Он назвал это "гибким механизмом настройки начисления баллов"... Офигеть как гибко....
    --- Объединение сообщений, 24 сен 2015 ---
    При чём в справочнике настройки скидок вместо процента скидки нужно указать имя процедуры.... Как вообще можно до такого додуматься.
  16. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Мля....это каким извращенным складом ума надо обладать, чтобы вообще до такого додуматься :)
  17. TopicStarter Overlay
    nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Кстати, это мысль: жаловаться в данном топике на либерастический подход к решению стандартных задач :)
  18. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    21.520
    Симпатии:
    407
    Баллы:
    104
    Тогда я и начну.... Люди выгружают из розницы данные о розничных из розницы в ТиС. Часть оплат идет по банку. Так вместо того чтобы грузить обычной банковской выпиской - изобретают новый документ. Теперь когда я внедряю обмен с бухгалтерией - разумеется этот документ в обмен не попадает т.к. не типовой.
    Спрашиваю автора документа "зачем изобретал велосипед"? Он только пожимает плечами т.к. и сам не знает зачем.
  19. shurikvz
    Offline

    shurikvz Модераторы Команда форума Модератор

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    Я так понимаю на с++ ты не программируешь и понятие указателя на функцию тебе не знакомо? :)
    ладно, шучу. Для 1с действительно не очень стандартный подход.
    alexburn нравится это.
  20. TODD22
    Online

    TODD22 Профессионал в 1С Команда форума

    Регистрация:
    23 фев 2009
    Сообщения:
    4.755
    Симпатии:
    146
    Баллы:
    104
    Да когда ты в справочнике "Скидки" в элементе указываешь не размер скидки в процентах числом а имя функции находящейся в общем модуле это очень не стандартно :) И что бы тебе увеличить скидку с 5% до 7% тебе нужно зайти в общий модуль и написать свою вторую процедуру в которой расчёт будет идти от 7% и её имя указать в форме справочника.
    И там за что не возьмись всё такое вот нестандартное... Типовые сроду не открывал. Зато в резюме гордо пишет разработка конфигураций с нуля.
    И всё это у тебя в РИБе на 120+ узлов....

Поделиться этой страницей