fixin (fixin) wrote,
fixin
fixin

Category:

Красота 1С-кода

Некоторым кажется, что 1С - это просто.

Но на самом деле там есть где применить свои умения алгоритмизации.

Вот, например, я писал код по расчету норм естественной убыли для УТ10. Это когда нужно посчитать, сколько товара уходит на усушку/утруску.

Посмотрите, как элегантно рассчитывается КоэффициентДней, учитываются случаи когда хранение товара происходит в разных месяцах с разными количествами дней!

И как вишенка на торте - при необходимости показ пользователю протокола расчета.


Функция РассчитатьНормыУбыли(Источник, ТЧ) Экспорт
   
З = Новый Запрос(
   
"ВЫБРАТЬ
    |   ВЫРАЗИТЬ(ТЧ.Номенклатура КАК Справочник.Номенклатура) КАК Номенклатура,
    |   ТЧ.СерияНоменклатуры,
    |   ТЧ.ХарактеристикаНоменклатуры,
    |   ВЫРАЗИТЬ(ТЧ.Количество КАК ЧИСЛО(19, 5)) КАК Количество,
    |   ВЫРАЗИТЬ(ТЧ.Коэффициент КАК ЧИСЛО(19, 5)) КАК Коэффициент,
    |   ТЧ.ЕдиницаИзмерения
    |ПОМЕСТИТЬ ТЧ
    |ИЗ
    |   &ТЧ КАК ТЧ
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   Закупки.Номенклатура КАК Номенклатура,
    |   МАКСИМУМ(НАЧАЛОПЕРИОДА(Закупки.Период, ДЕНЬ)) КАК Дата
    |ПОМЕСТИТЬ ПоследниеПриходы
    |ИЗ
    |   РегистрНакопления.Закупки КАК Закупки
    |ГДЕ
    |   Закупки.Номенклатура В
    |           (ВЫБРАТЬ
    |               ТЧ.Номенклатура
    |           ИЗ
    |               ТЧ)
    |   И Закупки.Организация = &Организация
    |   И &УсловиеРегистратора
    |
    |СГРУППИРОВАТЬ ПО
    |   Закупки.Номенклатура
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |   ТЧ.Номенклатура КАК Номенклатура,
    |   ТЧ.СерияНоменклатуры,
    |   ТЧ.ХарактеристикаНоменклатуры,
    |   ТЧ.Количество,
    |   ТЧ.Коэффициент,
    |   ТЧ.ЕдиницаИзмерения,
    |   ПоследниеПриходы.Дата КАК ДатаПрихода,
    |   &Дата КАК ТекущаяДата,
    |   ВЫРАЗИТЬ(0 КАК ЧИСЛО(17, 5)) КАК КоэффициентДней,
    |   ВЫРАЗИТЬ(&ПроцентЕстественнойУбыли КАК ЧИСЛО(17, 5)) КАК ПроцентЕстественнойУбыли,
    |   ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки1 КАК Сутки1,
    |   ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки2 КАК Сутки2,
    |   ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки3 КАК Сутки3,
    |   ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки4 КАК Сутки4,
    |   ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки5 КАК Сутки5,
    |   ВЫРАЗИТЬ(&ПроцентЕстественнойУбыли КАК ЧИСЛО(21, 7)) КАК КоэффициентЕстественойУбыли,
    |   ВЫРАЗИТЬ(0 КАК ЧИСЛО(15, 3)) КАК КоличествоЕстественнойУбыли
    |ИЗ
    |   ТЧ КАК ТЧ
    |       ЛЕВОЕ СОЕДИНЕНИЕ ПоследниеПриходы КАК ПоследниеПриходы
    |       ПО ТЧ.Номенклатура = ПоследниеПриходы.Номенклатура
    |ГДЕ
    |   &ПроцентЕстественнойУбыли <> 0"
);

   
З.Текст = СтрЗаменить(З.Текст, "&РазностьДат",
   
"Закупки.Регистратор.МоментВремени < &МоментДокумента");

   
З.Текст = СтрЗаменить(З.Текст, "&ПроцентЕстественнойУбыли",
   
"ВЫБОР
    |       КОГДА &РазностьДат = 0
    |           ТОГДА 0
    |       КОГДА &РазностьДат <= 1
    |           ТОГДА ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки1
    |       КОГДА &РазностьДат <= 2
    |           ТОГДА ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки2
    |       КОГДА &РазностьДат <= 3
    |           ТОГДА ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки3
    |       КОГДА &РазностьДат <= 4
    |           ТОГДА ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки4
    |       ИНАЧЕ ТЧ.Номенклатура.НормаЕстественнойУбыли.Сутки5
    |   КОНЕЦ "
);

   
З.Текст = СтрЗаменить(З.Текст, "&РазностьДат",
   
"РАЗНОСТЬДАТ(ПоследниеПриходы.Дата, &Дата, День)");

   
З.Текст = СтрЗаменить(З.Текст, "&УсловиеРегистратора",
   
"Закупки.Регистратор.МоментВремени < &МоментДокумента");

   
З.УстановитьПараметр("ТЧ", ТЧ);
   
З.УстановитьПараметр("Организация", Источник.Организация);
   
З.УстановитьПараметр("Дата", НачалоДня(Источник.Дата));
   
З.УстановитьПараметр("МоментДокумента", Новый МоментВремени(Источник.Дата, Источник.Ссылка));
   
ТЗ = З.Выполнить().Выгрузить();


    Для Каждого
Строка ИЗ ТЗ Цикл
       
//Подсчитываем коэффициент
       
Если НЕ ЗначениеЗаполнено(Строка.ДатаПрихода) Тогда
           
КоличествоДнейВМесяце = День(КонецМесяца(Источник.Дата));
           
КоличествоДнейХранения = 0;
           
КоэффициентДней = 0;
        Иначе
           
ПредДата = Строка.ДатаПрихода;
           
Дата1 = КонецДня(ПредДата) + 1; //Берем следующий день, это будут одни сутки
           
Дата2 = НачалоДНя(Источник.Дата);
           
КоэффициентДней = 0;
           
УчМесяц = Неопределено;
           
ДнейВМесяце = Неопределено;
           
КоличествоДнейХранения = 0;

           
//Идем по датам...
           
Пока Дата1 <= Дата2 Цикл
               
//Дата хранения увеличивается на один день
               
КоличествоДнейХранения = КоличествоДнейХранения + 1;

               
//Если новый месяц или последняя итерация
               
НовыйМесяц = НачалоМесяца(Дата1) <> НачалоМесяца(ПредДата);
                Если
НовыйМесяц ИЛИ Дата1 = Дата2 Тогда
                   
ДнейВМесяце = День(КонецМесяца(ПредДата));
                    Если
НовыйМесяц Тогда
                       
//Ошибочно посчитали лишний день, убавляем
                       
КоличествоДнейХранения = КоличествоДнейХранения - 1;
                    КонецЕсли;
                   
КоэффициентДней = КоэффициентДней + КоличествоДнейХранения / ДнейВМесяце;
                   
КоличествоДнейХранения = 1; //На следующий месяц количество дней сбрасываем в 1
               
КонецЕсли;
               
ПредДата = Дата1; //Запоминаем прошлую дату
               
Дата1 = КонецДня(Дата1) + 1; //Переходим к следующей дате
           
КонецЦикла;
        КонецЕсли;



       
//Строка.ПроцентЕстественнойУбыли = Строка.ПроцентЕстественнойУбылиИсходный / КоличествоДнейВМесяце;
       
Строка.КоэффициентДней = КоэффициентДней;
       
Строка.КоличествоЕстественнойУбыли = Строка.Количество * КоэффициентДней * Строка.ПроцентЕстественнойУбыли ;
    КонецЦикла;

    Если
Источник.ДополнительныеСвойства.Свойство("ВыводитьРасшифровкуНормЕстественнойУбыли") И
       
Источник.ДополнительныеСвойства.ВыводитьРасшифровкуНормЕстественнойУбыли = истина Тогда
           
ВывестиТаблицуЗначений(Новый Структура("ТЗ", ТЗ));
    КонецЕсли;

    Возврат
ТЗ;
КонецФункции

 

 

Tags:
Subscribe
promo fixin december 31, 2037 16:57 1417
Buy for 30 tokens
UPD: Друзья, в августе 2019 года блог переехал на http://fixinchik.ru. Welcome! Добро пожаловать в журнал Осипова Сергея Александровича, известного также как Fixin и Гений 1С. Рекомендую ознакомиться с Часто Задаваемыми Вопросами обо мне. Что я хочу в подарок - список. Мой проект "…
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 55 comments