Реализация ежедневной переоценки активов и обязательств в 1С 7.7 по Пост.Мин.Фин.РБ от 26.12.2022 N61 - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

Реализация ежедневной переоценки активов и обязательств в 1С 7.7 по Пост.Мин.Фин.РБ от 26.12.2022 N61

Данные > Статьи и инструкции > Программирование
В процедуре ПриНачалеРаботыСистемы() в 1С 7.7 Бухгалтерия предприятия:
Если СтрЧислоВхождений(НазваниеНабораПрав(),"ГлБухгалтер")<>0 Тогда
       ТекДата = Макс('01.01.23', РабочаяДата()-90);
       Если ПустоеЗначение(Константа.ДатаЗапретаРедактирования)=0 Тогда
           ТекДата = Макс(Константа.ДатаЗапретаРедактирования, ТекДата);
       КонецЕсли;
       КонДата = РабочаяДата()-1;

       КаталогИнфоУПДАТЕ=КаталогПользователя()+"InfoUpdate";
       ИмяИнфоУПДАТЕ=СокрЛП("ezhednevnye_kursovye_raznicy");
       ПутьИнфо=КаталогИнфоУПДАТЕ+"\"+ИмяИнфоУПДАТЕ+".txt";

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

       Если ЗапускаемВопрос = 1 Тогда
           Если Вопрос("Провести автоматически ежедневные курсовые разницы
                                |с "+ТекДата+" по "+КонДата+"
                                |согласно Пост. Мин.фин.РБ от 26.12.2022 N61?","Да+Нет")="Да" Тогда
               глПровестиАвтоматическиЕжедневныеКурсовыеРазницы(ТекДата, КонДата);

               Если ФС.СуществуетФайл(ПутьИнфо)=0 Тогда
                   Если ФС.СуществуетФайл(КаталогИнфоУПДАТЕ)=0 Тогда
                       ФС.СоздатьКаталог(КаталогИнфоУПДАТЕ);
                   КонецЕсли;
               КонецЕсли;

               НашФайл=СоздатьОбъект("Текст");
               НашФайл.ДобавитьСтроку(СокрЛП(РабочаяДата()));
               НашФайл.Записать(ПутьИнфо);
           КонецЕсли;
       КонецЕсли;
   КонецЕсли;

Процедура №1 в глобальном модуле в 1С 7.7 Бухгалтерия предприятия:
Процедура глПровестиАвтоматическиЕжедневныеКурсовыеРазницы(ТекДата, КонДата)

   СписокСчетов = СоздатьОбъект("СписокЗначений");

   Сч52 = СчетПоКоду("52");       СписокСчетов.ДобавитьЗначение(Сч52);
   Сч554 = СчетПоКоду("55.4");    СписокСчетов.ДобавитьЗначение(Сч554);
   Сч558 = СчетПоКоду("55.8");    СписокСчетов.ДобавитьЗначение(Сч558);
   Сч559 = СчетПоКоду("55.9");    СписокСчетов.ДобавитьЗначение(Сч559);
   Сч5511 = СчетПоКоду("55.11");  СписокСчетов.ДобавитьЗначение(Сч5511);
   Сч5522 = СчетПоКоду("55.22");  СписокСчетов.ДобавитьЗначение(Сч5522);
   Сч572 = СчетПоКоду("57.2");    СписокСчетов.ДобавитьЗначение(Сч572);
   Сч574 = СчетПоКоду("57.4");    СписокСчетов.ДобавитьЗначение(Сч574);

   Пока ТекДата<=КонДата Цикл;
       //Сообщить("... проверка курса валютных остатков по сч. 52, 55, 57 за "+ТекДата);

       Для Номер = 1 По СписокСчетов.РазмерСписка() Цикл
           СчЗнач = СписокСчетов.ПолучитьЗначение(Номер); //получить значение и представление

           ПереоценкаПоСубконто=0;
           Если СчЗнач.КоличествоСубконто() > 0 Тогда
               СубкОбор=1;
               Для с=1 По СчЗнач.КоличествоСубконто() Цикл
                   Если СчЗнач.ТолькоОбороты(с)=0 Тогда
                       СубкОбор=0;
                   КонецЕсли;
               КонецЦикла;
               Если СубкОбор=0 Тогда
                   ПереоценкаПоСубконто=1;
               Иначе
                   ПереоценкаПоСубконто=0;
               КонецЕсли;
           Иначе
               ПереоценкаПоСубконто=0;
           КонецЕсли;

           Если ПереоценкаПоСубконто=1 Тогда
               БИ_Вал = СоздатьОбъект("БухгалтерскиеИтоги");
               БИ_Вал.Опции(0,0);
               КолОборотСубкСч=0;
               Для ИСб = 1 По СчЗнач.КоличествоСубконто() Цикл
                   Если СчЗнач.ТолькоОбороты(ИСб)=0 Тогда
                       БИ_Вал.ИспользоватьСубконто(СчЗнач.ВидСубконто(ИСб),,1,0);
                   Иначе
                       КолОборотСубкСч=КолОборотСубкСч+1;
                   КонецЕсли;
               КонецЦикла;
               БИ_Вал.ВыполнитьЗапрос(ТекДата,ТекДата,СчЗнач,,,1,,3);

               У = 1;
               БИ_Вал.ВыбратьСубконто(У);
               Фл = БИ_Вал.ПолучитьСубконто(У);
               СуммаРасхожденияСКурсом=0;
               Пока Фл=1 Цикл
                   КолСубкСч=СчЗнач.КоличествоСубконто()-КолОборотСубкСч;
                   Если У = КолСубкСч Тогда // ВОТ ЗДЕСЬ -1

                       БИ_Вал.ВыбратьВалюты();
                       Пока БИ_Вал.ПолучитьВалюту()=1 Цикл
                           ОстВал = БИ_Вал.СКД("В")-БИ_Вал.СКК("В");
                           Если ОстВал>0 Тогда
                               ОстТек = БИ_Вал.СКД("С")-БИ_Вал.СКК("С");
                               Курс = БИ_Вал.Валюта.Курс.Получить(ТекДата);
                               Кратность = БИ_Вал.Валюта.Кратность.Получить(ТекДата);
                               ОстНов = Окр(ОстВал*Курс/Кратность, 2);
                               КурсРазн = ОстНов-ОстТек;

                               Если  (Курс <>  0) И (Кратность <>  0)  Тогда
                                   ВалСуммаРасч = Окр(ОстТек / Курс,2);
                                   СуммаРасхожденияСКурсом= СуммаРасхожденияСКурсом + КурсРазн;
                                   //Если СуммаРасхожденияСКурсом<>0 Тогда
                                   //Сообщить(СокрЛП(СчЗнач)+" Сумма (по субконто) расхождения с курсом="+КурсРазн+" по вал.сумме="+(ОстВал)+" "+БИ_Вал.Валюта);
                                   //КонецЕсли;
                               Иначе
                                   ВалСуммаРасч = 0;
                                   СуммаРасхожденияСКурсом=0;
                                   Сообщить("Ошибка в учёте на "+ТекДата+" по счету "+СокрЛП(СчЗнач)+" вал.сумма="+(ОстВал)+""+БИ_Вал.Валюта+" не                                                              определен курс! ","!!!");
                               КонецЕсли;
                           ИначеЕсли ОстВал<0 Тогда
                               Сообщить("Ошибка в учёте на "+ТекДата+" по счету "+СокрЛП(СчЗнач)+" вал.сумма="+(ОстВал)+""+БИ_Вал.Валюта+"                                                              меньше нуля! ","!!!");
                           КонецЕсли;
                       КонецЦикла;
                   КонецЕсли;

                   Если У < КолСубкСч Тогда
                       У = У+1;
                       Если СчЗнач.ТолькоОбороты(У)=0 Тогда
                           БИ_Вал.ВыбратьСубконто(У);
                       КонецЕсли;
                   КонецЕсли;

                   Если СчЗнач.ТолькоОбороты(У)=0 Тогда
                       Фл = БИ_Вал.ПолучитьСубконто(У);
                       Пока (Фл = 0) И (У > 1) Цикл
                           У = У-1;
                           Фл = БИ_Вал.ПолучитьСубконто(У);
                       КонецЦикла;
                   КонецЕсли;

               КонецЦикла;

               Если СуммаРасхожденияСКурсом<>0 Тогда
                   //Сообщить(СокрЛП(СчЗнач)+" Сумма (по субконто) расхождения с курсом="+(СуммаРасхожденияСКурсом)+" по вал.сумме="+                               (ОстВал)+" "+БИ_Вал.Валюта);
                   глСоздатьДокументПереоценкаВалюты(ТекДата, БИ_Вал);
               КонецЕсли;
           Иначе
               БИ_Вал = СоздатьОбъект("БухгалтерскиеИтоги");
               БИ_Вал.Опции(0,0);
               БИ_Вал.ВыполнитьЗапрос(ТекДата,ТекДата,СчЗнач,,,1,,3);

               БИ_Вал.ВыбратьВалюты();
               Пока БИ_Вал.ПолучитьВалюту()=1 Цикл
                   ОстВал = БИ_Вал.СКД("В")-БИ_Вал.СКК("В");
                   Если ОстВал>0 Тогда
                       ОстТек = БИ_Вал.СКД("С")-БИ_Вал.СКК("С");
                       Курс = БИ_Вал.Валюта.Курс.Получить(ТекДата);
                       Кратность = БИ_Вал.Валюта.Кратность.Получить(ТекДата);
                       ОстНов = Окр(ОстВал*Курс/Кратность, 2);
                       КурсРазн = ОстНов-ОстТек;

                       Если  (Курс <>  0) И (Кратность <>  0)  Тогда
                           ВалСуммаРасч = Окр(ОстТек / Курс,2);
                           СуммаРасхожденияСКурсом= СуммаРасхожденияСКурсом + КурсРазн;

                           Если СуммаРасхожденияСКурсом<>0 Тогда
                               //Сообщить(СокрЛП(СчЗнач)+" Сумма расхождения с курсом="+КурсРазн+" по вал.сумме="+(ОстВал)+" "+БИ_Вал.Валюта);
                               глСоздатьДокументПереоценкаВалюты(ТекДата, БИ_Вал);
                           КонецЕсли;
                       Иначе
                           ВалСуммаРасч = 0;
                           СуммаРасхожденияСКурсом=0;
                           Сообщить("Ошибка в учёте на "+ТекДата+" по счету "+СокрЛП(СчЗнач)+" вал.сумма="+(ОстВал)+""+БИ_Вал.Валюта+" не                                                              определен курс! ","!!!");
                       КонецЕсли;
                   ИначеЕсли ОстВал<0 Тогда
                       Сообщить("Ошибка в учёте на "+ТекДата+" по счету "+СокрЛП(СчЗнач)+" вал.сумма="+(ОстВал)+""+БИ_Вал.Валюта+" меньше                                                              нуля! ","!!!");
                   КонецЕсли;
               КонецЦикла;
           КонецЕсли;

       КонецЦикла;
       ТекДата = ТекДата + 1;
       //КонецЦикла;

   КонецЦикла;

КонецПроцедуры
Процедура №2 в глобальном модуле в 1С 7.7 Бухгалтерия предприятия:
Процедура глСоздатьДокументПереоценкаВалюты(ТекДата, БИ)

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

   Если НайденПодходящийДокумент=0 Тогда
       ДокП = СоздатьОбъект("Документ.ПереоценкаВалюты");
       ДокП.Новый();
       ДокП.ДатаДок = ТекДата;
       ДокП.ВыбСчет = БИ.Счет;
       ДокП.СчетКурсРазниц=Константа.СчетКурсовыхРазниц.Получить(ДокП.ДатаДок);

       Если ДокП.СчетКурсРазниц.Выбран()=1 Тогда
           Если (СокрЛП(ДокП.СчетКурсРазниц.ВидСубконто(1))="Виды деят.") Или   //    90
           (СокрЛП(ДокП.СчетКурсРазниц.ВидСубконто(1))="Операц. доходы и расходы") Или   //    91
           (СокрЛП(ДокП.СчетКурсРазниц.ВидСубконто(1))="Внереализ. доходы и расходы") Тогда   //    92
               //ДокП.НазначитьТип("Субконто_1", "Справочник."+Строка(СчетКурсРазниц.ВидСубконто(1).Идентификатор()));
               Если ДокП.СчетКурсРазниц.ПринадлежитГруппе(СчетПоКоду("91"))=1 Тогда
                   СуммовыеРазницы = "";
                   СпрСумРазн = СоздатьОбъект("Справочник.ОперационныеДоходыИРасходы");
                   Если СпрСумРазн.НайтиПоНаименованию("Курсовые разницы",0,1)=1 Тогда
                       СуммовыеРазницы = СпрСумРазн.ТекущийЭлемент();
                       Если СпрСумРазн.НайтиПоКоду("2007")=1 Тогда
                           Если СокрЛП(СпрСумРазн.Наименование)="Курсовые разницы" Тогда
                               СуммовыеРазницы = СпрСумРазн.ТекущийЭлемент();
                           КонецЕсли;
                       КонецЕсли;
                   ИначеЕсли СпрСумРазн.НайтиПоНаименованию("Курсовая разница",0,1)=1 Тогда
                       СуммовыеРазницы = СпрСумРазн.ТекущийЭлемент();
                   КонецЕсли;

                   Субконто_1=СуммовыеРазницы;
               КонецЕсли;
           КонецЕсли;
       КонецЕсли;
       ДокП.СтатьяДДС=Перечисление.СтатьяДДС.операционнаядеятельность;
       ДокП.ДокументСозданАвтоматически = 1;
       ДокП.Руководитель=Константа.Руководитель.Получить(ТекДата);
       ДокП.Записать();
       ДокП.Провести();
       Сообщить("Создан документ "+СокрЛП(ДокП.ТекущийДокумент())+" по счету "+СокрЛП(БИ.Счет)+" для корректировки остатка по курсу                            НБРБ","i");
   КонецЕсли;

КонецПроцедуры // глСоздатьДокументПереоценкаВалюты()
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 16.02.2023
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому