()Да, есть такое дело, каюсь.. Субконто3 - довольно редко используется.
Перем Субк[3], СпрФ, Сч, РасчРег[30];
//_____________________________________________________________________________
Процедура СформПроводки(Субк1="",Субк2="",Субк3="",СндК=0,СндС=0,СнкК=0,СнкС=0)
Если (СндК<>0) или (СндС<>0) Тогда
//Делаем проводку по ДЕБЕТУ - кредит 00
Операция.НоваяПроводка();
Кол=Кол+1;
Операция.Дебет.Счет=Сч;
Если ПустоеЗначение(Субк1)=0 Тогда
Операция.Дебет.Субконто(1,Субк1);
КонецЕсли;
Если ПустоеЗначение(Субк2)=0 Тогда
Операция.Дебет.Субконто(2,Субк2);
КонецЕсли;
Если ПустоеЗначение(Субк3)=0 Тогда
Операция.Дебет.Субконто(3,Субк3);
КонецЕсли;
Если Сч.Забалансовый=0 Тогда
//корреспонденция по кредиту 00
Операция.Кредит.Счет=СчетПоКоду("00");
КонецЕсли;
Операция.Сумма=СндС;
Если Сч.Количественный=1 Тогда
Операция.Количество=СндК;
КонецЕсли;
Операция.ФирмаУчета=СпрФ.ТекущийЭлемент();
Операция.СодержаниеПроводки="ввод ост. АРХИВ №"+Строка(НомерДок);
Сообщить("Д "+Строка(Операция.Дебет.Счет)+" К"+Строка(Операция.Кредит.Счет));
КонецЕсли;
Если (СнкК<>0) или (СнкС<>0) Тогда
//Делаем проводку по КРЕДИТУ - дебет 00
Операция.НоваяПроводка();
Кол=Кол+1;
Операция.Кредит.Счет=Сч;
Если ПустоеЗначение(Субк1)=0 Тогда
Операция.Кредит.Субконто(1,Субк1);
КонецЕсли;
Если ПустоеЗначение(Субк2)=0 Тогда
Операция.Кредит.Субконто(2,Субк2);
КонецЕсли;
Если ПустоеЗначение(Субк3)=0 Тогда
Операция.Кредит.Субконто(3,Субк3);
КонецЕсли;
Если Сч.Забалансовый=0 Тогда
//корреспонденция по дебету 00
Операция.Дебет.Счет=СчетПоКоду("00");
КонецЕсли;
Операция.Сумма=СнкС;
Если Сч.Количественный=0 Тогда
Операция.Количество=СнкК;
КонецЕсли;
Операция.ФирмаУчета=СпрФ.ТекущийЭлемент();
Операция.СодержаниеПроводки="ввод ост. АРХИВ №"+Строка(НомерДок);
Сообщить("Д "+Строка(Операция.Дебет.Счет)+" К"+Строка(Операция.Кредит.Счет));
КонецЕсли;
КонецПроцедуры //Проводка
//_____________________________________________________________________________
Процедура ОбработкаПроведения()
Если Проведен()=1 Тогда
Сообщить("НЕВОЗМОЖНО ПЕРЕПРОВЕДЕНИЕ ЭТОГО ДОКУМЕНТА !!!","!!!");
Если Право[73] = 0 Тогда
СтатусВозврата(0);
Возврат;
КонецЕсли;
КонецЕсли;
Если Право[73]=0 Тогда //НЕ АДМИН!
СтатусВозврата(0);
Возврат;
ИначеЕсли ГрупповаяОбработка()=1 Тогда//Случайно попал в список
СтатусВозврата(0);
Возврат;
КонецЕсли;
//*********************************************************
//******************** "СЧЕТА БУ" *************************
//*********************************************************
Если флСчБУ=1 Тогда
Сообщить("ПЕРЕНОС ОСТАТКОВ ПО СЧЕТАМ БУХГАЛТЕРСКОГО УЧЕТА","!!!");
//**** "поиск Пометок" ****
лСписСч = СоздатьОбъект("СписокЗначений");
Если СокрЛП(стрСчБУ) <> "" Тогда лСписСч.ИзСтрокиСРазделителями(стрСчБУ); КонецЕсли;
//теперь здесь ТОЛЬКО ПОМЕЧЕННЫЕ счета
тзПров = СоздатьОбъект("ИндексированнаяТаблица");
тзПров.НоваяКолонка("СпрФ");//,"Справочник.Фирмы");
тзПров.НоваяКолонка("Сч");//,"Счет");
тзПров.НоваяКолонка("Субк1");
тзПров.НоваяКолонка("Субк2");
тзПров.НоваяКолонка("Субк3");
тзПров.НоваяКолонка("СНДк");//,"Число",14,3);
тзПров.НоваяКолонка("СНДс");//,"Число",14,2);
тзПров.НоваяКолонка("СНКк");//,"Число",14,3);
тзПров.НоваяКолонка("СНКс");//,"Число",14,2);
Кол=0;
СпрФ=СоздатьОбъект("Справочник.Фирмы");
СпрФ.ВыбратьЭлементы();
Пока СпрФ.ПолучитьЭлемент()=1 Цикл
Сообщить(Строка(СпрФ));
ОбСч=СоздатьОбъект("Счет");
ОбСч.ВыбратьСчета();
БИ=СоздатьОбъект("БухгалтерскиеИтоги");
Пока ОбСч.ПолучитьСчет()=1 Цикл
Если ОбСч.ЭтоГруппа()=1 Тогда
продолжить;
КонецЕсли;
Если лСписСч.Принадлежит(ОбСч.Код) = 0 Тогда
продолжить;
КонецЕсли;
Сч=ОбСч.ТекущийСчет();
КолСубк=Сч.КоличествоСубконто();
Для i=1 по КолСубк цикл
БИ.ИспользоватьСубконто(Сч.ВидСубконто(i),,1);
КонецЦикла;
Сообщить("Обрабатывается счет "+Строка(Сч.Код)+" .....");
БИ.ИспользоватьРазделительУчета(СпрФ.ТекущийЭлемент());
БИ.ВыполнитьЗапрос(ТекущийДокумент(),ТекущийДокумент(),Сч.Код,,,,,"СК");
//если в целом по счету 0 - пропускаем!
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
продолжить;
КонецЕсли;
//**** ""экономичный", И ПРЯМОЙ!)) вариант" ****
Если КолСубк>=1 Тогда
//Первое Субконто
Если БИ.ВыбратьСубконто(1)=1 Тогда
Пока БИ.ПолучитьСубконто(1)=1 Цикл
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
//таблица проводки
тзПров.УдалитьСтроки();
тзПров.НоваяСтрока();
тзПров.СпрФ = СпрФ.ТекущийЭлемент();
тзПров.Сч = Сч;
тзПров.Субк1 = БИ.Субконто(1);
тзПров.СНДк = П1;
тзПров.СНДс = П2;
тзПров.СНКк = П3;
тзПров.СНКс = П4;
Если КолСубк>=2 Тогда
//Второе Субконто
Если БИ.ВыбратьСубконто(2) = 1 Тогда
//Есть остатки
Пока БИ.ПолучитьСубконто(2)=1 Цикл
флНетСубк3 = 1;
~ЕслиНетСубк3: Если (КолСубк=3) или (флНетСубк3 = 1) Тогда
Если КолСубк<3 Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3; КонецЕсли;
//Третье Субконто
Если БИ.ВыбратьСубконто(3) = 1 Тогда
//Есть остатки
Пока БИ.ПолучитьСубконто(3)=1 Цикл
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
тзПров.Субк2 = БИ.Субконто(2);
тзПров.Субк3 = БИ.Субконто(3);
Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(3) = 0) Тогда
//УчетПоСумме = 0, значит делаем проводку по Субк1 - по СУММЕ
//БЕЗ Количества!
СформПроводки(тзПров.Субк1,,,0,тзПров.СНДс,0,тзПров.СНКс);
//и для проводки по Субк2 - ставим ТОЛЬКО Количество
тзПров.СНДк = П1;
тзПров.СНДс = 0;
тзПров.СНКк = П3;
тзПров.СНКс = 0;
Иначе
//меняем суммы и количество
тзПров.СНДк = П1;
тзПров.СНДс = П2;
тзПров.СНКк = П3;
тзПров.СНКс = П4;
КонецЕсли;
Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
продолжить;
КонецЕсли;
////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
//// //" //С3: "+Строка(БИ.Субконто(3))+
//// " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
СформПроводки(тзПров.Субк1,тзПров.Субк2,тзПров.Субк3,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
Кол=Кол+1;
КонецЦикла;
Иначе
//субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
//делаем по ветке Иначе для Субконто(2)
флНетСубк3 = 0;
Перейти ~ЕслиНетСубк3;
//СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
//Кол=Кол+1;
КонецЕсли;
Иначе
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
тзПров.Субк2 = БИ.Субконто(2);
Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(2) = 0) Тогда
//УчетПоСумме = 0, значит делаем проводку по Субк1 - по СУММЕ
//БЕЗ Количества!
СформПроводки(тзПров.Субк1,,,0,тзПров.СНДс,0,тзПров.СНКс);
//и для проводки по Субк2 - ставим ТОЛЬКО Количество
тзПров.СНДк = П1;
тзПров.СНДс = 0;
тзПров.СНКк = П3;
тзПров.СНКс = 0;
//тзПров.СНДк = П1;
//тзПров.СНКк = П3;
Иначе
//меняем суммы и количество
тзПров.СНДк = П1;
тзПров.СНДс = П2;
тзПров.СНКк = П3;
тзПров.СНКс = П4;
КонецЕсли;
Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
продолжить;
КонецЕсли;
////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
//// //" //С3: "+Строка(БИ.Субконто(3))+
//// " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
СформПроводки(тзПров.Субк1,тзПров.Субк2,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
Кол=Кол+1;
КонецЕсли;
КонецЦикла;
Иначе
//субконто(2) есть, но остатков по нему нет, или флаг "только обороты" = 1
СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
Кол=Кол+1;
КонецЕсли;
Иначе//Только Субконто(1)
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
продолжить;
КонецЕсли;
СформПроводки(БИ.Субконто(1),,,П1,П2,П3,П4);
Кол=Кол+1;
КонецЕсли;
КонецЦикла;//По Субконто(1)
Иначе//субконто(1) есть, но остатков по нему нет, или флаг "только обороты" = 1
//это ИСКЛЮЧЕНИЕ для конфигурации БухТорг -
//счет 50 - Субконто(2) ДОЛЖНО БЫТЬ на ПЕРВОМ МЕСТЕ!!!
//Сообщить("ЧУДО-СЧЕТ! "+Строка(Сч),"!!!");
//СНОВА Второе Субконто! по Метке не получается, ибо прыгать надо внутрь цикла...(((
Если КолСубк>=2 Тогда
Если БИ.ВыбратьСубконто(2) = 1 Тогда
//Есть остатки
Пока БИ.ПолучитьСубконто(2)=1 Цикл
флНетСубк3 = 1;
~ЕслиНетСубк3_: Если (КолСубк=3) или (флНетСубк3 = 1) Тогда
Если КолСубк<3 Тогда флНетСубк3 = 0; Перейти ~ЕслиНетСубк3_; КонецЕсли;
//Третье Субконто
Если БИ.ВыбратьСубконто(3) = 1 Тогда
//Есть остатки
Пока БИ.ПолучитьСубконто(3)=1 Цикл
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
тзПров.Субк3 = БИ.Субконто(3);
Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(3) = 0) Тогда
//УчетПоСумме = 0, значит меняем только количество
тзПров.СНДк = П1;
тзПров.СНКк = П3;
Иначе
//меняем суммы и количество
тзПров.СНДк = П1;
тзПров.СНДс = П2;
тзПров.СНКк = П3;
тзПров.СНКс = П4;
КонецЕсли;
Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
продолжить;
КонецЕсли;
////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
//// //" //С3: "+Строка(БИ.Субконто(3))+
//// " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
СформПроводки(тзПров.Субк1,тзПров.Субк2,тзПров.Субк3,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
Кол=Кол+1;
КонецЦикла;
Иначе
//субконто(3) есть, но остатков по нему нет, или флаг "только обороты" = 1
//делаем по ветке Иначе для Субконто(2)
флНетСубк3 = 0;
Перейти ~ЕслиНетСубк3_;
//СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
//Кол=Кол+1;
КонецЕсли;
Иначе
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
тзПров.Субк2 = БИ.Субконто(2);
Если (Сч.Количественный = 1) и (Сч.УчетПоСумме(2) = 0) Тогда
//УчетПоСумме = 0, значит меняем только количество
тзПров.СНДк = П1;
тзПров.СНКк = П3;
Иначе
//меняем суммы и количество
тзПров.СНДк = П1;
тзПров.СНДс = П2;
тзПров.СНКк = П3;
тзПров.СНКс = П4;
КонецЕсли;
Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
продолжить;
КонецЕсли;
////Сообщить(" //С1: "+Строка(БИ.Субконто(1))+" //С2: "+Строка(БИ.Субконто(2))+
//// //" //С3: "+Строка(БИ.Субконто(3))+
//// " //СНД_к: "+Строка(П1)+" //СНД_с: "+Строка(П2)+" //СНК_к: "+Строка(П3)+" //СНК_с: "+Строка(П4));
СформПроводки(тзПров.Субк1,тзПров.Субк2,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
Кол=Кол+1;
КонецЕсли;
КонецЦикла;
Иначе
//субконто(2) есть, но остатков по нему нет, или флаг "только обороты" = 1
тзПров.СНДк = П1;
тзПров.СНДс = П2;
тзПров.СНКк = П3;
тзПров.СНКс = П4;
СформПроводки(тзПров.Субк1,,,тзПров.СНДк,тзПров.СНДс,тзПров.СНКк,тзПров.СНКс);
Кол=Кол+1;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Иначе//Счет НЕ ИМЕЕТ СУБКОНТО
П1=БИ.СНД("К");П2=БИ.СНД("С");
П3=БИ.СНК("К");П4=БИ.СНК("С");
Если (П1=0) и (П2=0) и (П3=0) и (П4=0) Тогда
продолжить;
КонецЕсли;
СформПроводки(,,,П1,П2,П3,П4);
Кол=Кол+1;
КонецЕсли;
Сообщить("...сформировано "+Строка(Кол)+" проводок");
Кол=0;
КонецЦикла;//по СЧЕТАМ
КонецЦикла;//по ФИРМАМ
//тзПров.Группировать("индСпрФ:СпрФ;индСч:Сч;индСубк1:Субк1;индСубк2:Субк2;индСубк3:Субк3","СНДк,СНДс,СНКк,СНКс",1);
//лисхТЗ = тзПров;
//Парам = СоздатьОбъект("СписокЗначений");
//Парам.ДобавитьЗначение("лисхТЗ","ЗаголовокОбъекта_");
//Парам.ДобавитьЗначение(лисхТЗ,"Объект_");
//ОткрытьФорму("Отчет#", Парам, КаталогИБ()+"\Extforms\служб_ПросмотрСЗ_ТЗ_ИТЗ.ert");
//**** "КОНТРОЛЬ ПРОВЕДЕНИЯ" ****
Если ФС.СуществуетФайл(КаталогИБ()+"\КонтрольПроведения_ДокАрхив.mxl") = 1 Тогда
//Таб=СоздатьОбъект("Таблица");
//Таб.ИсходнаяТаблица(КаталогИБ()+"\КонтрольПроведения_ДокАрхив.mxl");
//
//Таб.ВывестиСекцию("Шапка");
//Таб.Опции(0,0,Таб.ВысотаТаблицы(),0);
//
//тзПров.ВыбратьСтроки();
//Пока тзПров.ПолучитьСтроку() = 1 Цикл
// Таб.ВывестиСекцию("Строка");
//КонецЦикла;
//Таб.ВывестиСекцию("Подвал");
//Таб.ПараметрыСтраницы(,,,2,2,2,2,0,0,1,,);
//Таб.ТолькоПросмотр(1);
//Таб.Показать("Таблица","");
КонецЕсли;
КонецЕсли;//если флСчБУ = 1
Операция.Содержание="Архив № "+СокрЛП(Строка(НомерДок));
Состояние("Запись операции документа...");
Операция.Записать();
//*********************************************************
//******************** "РЕГИСТРЫ" *************************
//*********************************************************
Если флРег=1 Тогда
Сообщить("ПЕРЕНОС ОСТАТКОВ ПО РЕГИСТРАМ ОПЕРАТИВНОГО УЧЕТА","!!!");
//**** "поиск Пометок" ****
лСписРег = СоздатьОбъект("СписокЗначений");
Если СокрЛП(стрРег) <> "" Тогда лСписРег.ИзСтрокиСРазделителями(стрРег); КонецЕсли;
//теперь здесь ТОЛЬКО ПОМЕЧЕННЫЕ Регистры
ЕстьРег = 0;
Для й=1 по Метаданные.Регистр() Цикл
//только регистры "Остатков"
Если Метаданные.Регистр(й).ТипРегистра <> "Остатки" Тогда Продолжить; КонецЕсли;
ИмяРег = Метаданные.Регистр(й).Идентификатор;
ПолноеИмяРег = Метаданные.Регистр(й).ПолныйИдентификатор();
РасчРег[й] = СоздатьОбъект(ПолноеИмяРег);
Если лСписРег.Принадлежит(ИмяРег) = 1 Тогда
ЕстьРег = 1;
РасчРег[й].ВременныйРасчет(1);
КонецЕсли;
КонецЦикла;
Если ЕстьРег = 1 Тогда
Состояние("Расчет РЕГИСТРОВ.....................");
РассчитатьРегистрыНа(ТекущийДокумент());
КонецЕсли;
Для й=1 по Метаданные.Регистр() Цикл
ИмяРег = Метаданные.Регистр(й).Идентификатор;
Если лСписРег.Принадлежит(ИмяРег) = 0 Тогда
продолжить;
КонецЕсли;
РасчРег[й].ВыбратьИтоги();
КолДвиж = 0;
Пока РасчРег[й].ПолучитьИтог() = 1 Цикл
Состояние("обрабатывается регистр: "+ИмяРег);
ТекРег = Регистр.ПолучитьАтрибут(ИмяРег);
Для ц=1 по Метаданные.Регистр(й).Измерение() Цикл
Имя=Метаданные.Регистр(й).Измерение(ц);
Значение=РасчРег[й].ПолучитьАтрибут(Имя);
ТекРег.УстановитьАтрибут(Имя,Значение);
КонецЦикла;
Для ц=1 по Метаданные.Регистр(й).Ресурс() Цикл
Имя=Метаданные.Регистр(й).Ресурс(ц);
Значение=РасчРег[й].ПолучитьАтрибут(Имя);
ТекРег.УстановитьАтрибут(Имя,Значение);
КонецЦикла;
// вообще цикл по реквизитам не имеет смысла,
// т.к. нельзя добыть остаток по реквизиту
Для ц=1 по Метаданные.Регистр(й).Реквизит() Цикл
Имя=Метаданные.Регистр(й).Реквизит(ц);
Значение=РасчРег[й].ПолучитьАтрибут(Имя);
ТекРег.УстановитьАтрибут(Имя,Значение);
КонецЦикла;
ТекРег.ДвижениеПриходВыполнить();
КолДвиж = КолДвиж + 1;
КонецЦикла;
Сообщить("По регистру: "+ИмяРег+" сформировано "+Строка(КолДвиж)+" движений","i");
КонецЦикла;//по регистрам
КонецЕсли;//если флРег = 1
КонецПроцедуры //ОбработкаПроведения()
//************************************************************
// ОбработкаУдаленияПроведения()
//
Процедура ОбработкаУдаленияПроведения()
Если Проведен()=1 Тогда
Если Право[73] = 0 Тогда
Сообщить("НЕВОЗМОЖНО ОТМЕНИТЬ ПРОВЕДЕНИЕ ЭТОГО ДОКУМЕНТА !!!","!!!");
СтатусВозврата(0);
Возврат;
Иначе
Сообщить("ДОКУМЕНТ СДЕЛАН НЕПРОВЕДЕННЫМ!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ОбработкаУдаленияПроведения()
Показать