Имя: Пароль:
1C
1C 7.7
v7: Заполнение документа на основании уже существующего
0 whitewolf87
 
28.09.17
12:21
Здравствуйте!
Помогите с кодом пожалуйста,
суть такова: у меня есть рассчитанный документ в программе, мне нужно с него взять количество, лицевые счета и в другом документе пересчитать данный объем.
Во вложении обработка которой я хочу это сделать.
ПО 1С 7.7.0.25.

Где ошибка? Не могу заполнить!
1 2S
 
28.09.17
12:22
1. добавить реквизит документоснование, включить галку ввода на основании.
2. Добавить соответствующий обработчик
илм
1. позвать спеца
2 whitewolf87
 
28.09.17
12:23
Процедура Заполнить()
    Если ТабЛС.КоличествоСтрок()>0 Тогда
        Если Вопрос("Очистить табличную часть перед заполнением?",4)=6 Тогда
            ТабЛС.УдалитьСтроки();
        КонецЕсли;
    КонецЕсли;
    
    Док=СоздатьОбъект("Документ.Перерасчет");
    Док.ВыбратьДокументы(НачМесяца(Дата1),КонМесяца(Дата2));            
    Пока Док.ПолучитьДокумент() > 0 Цикл
        Если Док.Комментарий<>"Начало отопительного периода" Тогда
            Продолжить;
        КонецЕсли;
        Если Док.Проведен()=0 Тогда
            Продолжить;
        КонецЕсли;
        Если Док.ПометкаУдаления()=1 Тогда
            Продолжить;
        КонецЕсли;          
        Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку()=1 Цикл                  
            Количество=Док.Количество;
        КонецЦикла;
        
        Гл_ТаблЗаполнения.ВыбратьСтроки();
        Пока Гл_ТаблЗаполнения.ПолучитьСтроку()=1 Цикл
            л_адрес=Гл_ТаблЗаполнения.Адрес;
            
            спрБлаг.ИспользоватьВладельца(л_адрес);
            Если спрБлаг.НайтиПоРеквизиту("Услуга",пл_Услуга,0)=0 Тогда
                Продолжить;
                
            КонецЕсли;
            ТабЛС.НоваяСтрока();
            ТабЛС.Адрес=л_адрес;    
        КонецЦикла;
        РассчитатьСтроку();
    КонецЦикла;
    Гл_ТаблЗаполнения.Очистить();
КонецПроцедуры
3 whitewolf87
 
28.09.17
12:24
Помочь можешь?
4 2S
 
28.09.17
12:24
инфокрафт?
5 2S
 
28.09.17
12:25
(3) у тебя не ввод на основании, а просто функция заполнения
6 whitewolf87
 
28.09.17
12:26
нет у меня 1С просто обычная, конфа самописная, писал не я
7 2S
 
28.09.17
12:27
Пока Док.ПолучитьСтроку()=1 Цикл                  
            Количество=Док.Количество;
        КонецЦикла;

ничего не смущает?
8 whitewolf87
 
28.09.17
12:28
обработка выходит из помощника из документа перерасчёт
9 whitewolf87
 
28.09.17
12:30
вместо количество ТабЛС.Количество ?
10 whitewolf87
 
28.09.17
12:30
чувак можешь по ТимВивер помочь? Очень надо.
11 2S
 
28.09.17
12:32
(10) чувак, не могу, извини
12 whitewolf87
 
28.09.17
12:33
(11) а как тогда правильно сделать?
13 Ёпрст
 
28.09.17
12:34
(0) всё в топку.
По человечьи объяснить что нужно сделать.
14 Lazy Stranger
 
28.09.17
12:36
(13) +1, из приведенного кода вообще нельзя понять что пытался добиться его автор
15 2S
 
28.09.17
12:37
(14) да все там понятно, просто у ТС каша в голове.
Из ТЧ документов основания заполнить ТЧ текущего документа.
Но код конечно....
16 whitewolf87
 
28.09.17
12:39
(13) из документа основания заполнить табличную часть текущего документа и сосчитать...
17 whitewolf87
 
28.09.17
12:39
(15) да я не спорю что я ламер, в отличии от Вас, на то и сюда залез
18 2S
 
28.09.17
12:41
(17) все были такими, не переживай
ВыгрузитьТабличнуюЧасть();
Обработай полученный ТЗ
ЗагрузитьТабличнуюЧАсть()
19 Ёпрст
 
28.09.17
12:41
(16)
1.Где у тебя в коде документОснование ?
2.Зачем ты перебираешь документы определенного вида за целый месяц ?
3.Где у тебя в коде заполнение табличной части дока ?
4.Зачем в коде Таблица значений?
5.Что есть Гл_ТаблЗаполнения и чем она заполнена и откуда взялась ?
20 whitewolf87
 
28.09.17
12:41
(18) я не переживаю, я с прошлого года только 1с 7 юзаю
21 2S
 
28.09.17
12:43
(19) там видимо по списку документов нужно собрать один
22 whitewolf87
 
28.09.17
12:43
(21) всё верно
23 2S
 
28.09.17
12:44
(22) ну тогда юзай запрос
24 whitewolf87
 
28.09.17
12:44
просто у нас 1 услуга начисляется на основании другой, потому сначала объем по 1 слуге в одной обработке обсчитать потом в другой обработке тех же людей их объем взять и умножить на норму и обсчиатть
25 2S
 
28.09.17
12:45
(24) переходите на готовые решения.
поддержку онлайн касс реализовали в самописке?
26 aka AMIGO
 
28.09.17
12:45
(21) + и срочно закомментировать вот это:
       //Док.ВыбратьСтроки();
        //Пока Док.ПолучитьСтроку()=1 Цикл                  
            //Количество=Док.Количество;
        //КонецЦикла;
27 whitewolf87
 
28.09.17
12:48
(25) и что толку от них от готовых решений? привет большие растраты на техподдержку?

онлайн кассы делает другая фирма в другой базе мне на них до фени
28 2S
 
28.09.17
12:49
(27) гугли "черный запрос" в 1С и работа с ТЗ
29 whitewolf87
 
28.09.17
12:52
(28) я это понимаю, попробую по вашему методу (18) я не знаю как на основании документа заполнить таб часть, перемножение и деление и прочее я знаю
30 aka AMIGO
 
28.09.17
12:52
инфы маловато.. Нет всего кода обработки.
Может, стала бы ясней задачка
31 whitewolf87
 
28.09.17
12:53
могу на почту кинуть ert шку могу тимвивер дать, причина в том что знаний у меня не много год работаю программером на 7ке
32 whitewolf87
 
28.09.17
12:53
счас дам код
33 2S
 
28.09.17
12:53
(29) метод не мой
- тупая выборка из документа основания и добавление строк в документ
- метод по (18), ТЗ - прокладка
- запрос
34 whitewolf87
 
28.09.17
12:53
Перем пл_Услуга, Конт, спрБлаг, Количество, л_адрес;

//________________________________________________________________________
Процедура ОбработкаПодбора(Элем)
    Если ПустаяСтрока(Элем)=0 Тогда
        ТабЛС.НоваяСтрока();
        ТабЛС.Адрес=Элем;
    КонецЕсли;
КонецПроцедуры

//________________________________________________________________________
Процедура ДобавитьАдрес()
    ОткрытьПодбор("Справочник.Жилье","ВыборЛС",);
КонецПроцедуры  

//________________________________________________________________________
Процедура ОбработатьТабЛС()
    Если ТабЛС.КоличествоСтрок()=0 Тогда
        ОткрытьПодбор("Справочник.Жилье","ВыборЛС",,0);    
    Иначе
        Если ТабЛС.ТекущаяКолонка()="Адрес" Тогда
            л_зн=ТабЛС.Адрес;
            Если ВвестиЗначение(л_зн,"Выберите лицевой счет","Справочник.Жилье.ВыборЛС")=1 Тогда
                ТабЛС.Адрес=л_зн;
            КонецЕсли;
        ИначеЕсли ТабЛС.ТекущаяКолонка()="Количество" Тогда
            л_зн=ТабЛС.Количество;
            Если ВвестиЧисло(л_зн,"Кол-во потребл. за период",8,3)=1 Тогда
                ТабЛС.Количество=л_зн;
            КонецЕсли;
        ИначеЕсли ТабЛС.ТекущаяКолонка()="Начислено" Тогда
            л_зн=ТабЛС.Начислено;
            Если ВвестиЧисло(л_зн,"Начислено за период",8,2)=1 Тогда
                ТабЛС.Начислено=л_зн;
                ТабЛС.Перерасчет=ТабЛС.Начислено-ТабЛС.Расчет;
            КонецЕсли;
        ИначеЕсли ТабЛС.ТекущаяКолонка()="Расчет" Тогда
            л_зн=ТабЛС.Расчет;
            Если ВвестиЧисло(л_зн,"Расчет по новому тарифу",8,2)=1 Тогда
                ТабЛС.Расчет=л_зн;
                ТабЛС.Перерасчет=ТабЛС.Начислено-ТабЛС.Расчет;
            КонецЕсли;
        ИначеЕсли ТабЛС.ТекущаяКолонка()="Перерасчет" Тогда
            л_зн=ТабЛС.Перерасчет;
            Если ВвестиЧисло(л_зн,"Сумма перерасчета",8,2)=1 Тогда
                ТабЛС.Перерасчет=л_зн;
            КонецЕсли;    
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

//________________________________________________________________________
Процедура УдалитьСтрокуТаб()
    Если ТабЛС.КоличествоСтрок()>2 Тогда
        Т=ТабЛС.ТекущаяСтрока();
        ТабЛС.УдалитьСтроку();
        Если ТабЛС.КоличествоСтрок()>=Т Тогда
            ТабЛС.ТекущаяСтрока(Т);
        Иначе
            ТабЛС.ТекущаяСтрока(Т-1);    
        КонецЕсли;
    ИначеЕсли ТабЛС.КоличествоСтрок()=0 Тогда
        Сообщить("Нет строк для удаления!","i");
    Иначе
        ТабЛС.УдалитьСтроку();
    КонецЕсли;
КонецПроцедуры
//________________________________________________________________________
Функция Подбор()
    А=Конт;
    ОткрытьФормуМодально("Обработка.Заполнить",);    
    Возврат Гл_ТаблЗаполнения;
КонецФункции

//_______________________________________________________________________
Процедура РассчитатьСтроку()
    
    Если ПустоеЗначение(ТабЛС.Адрес)=1 Тогда
        Возврат;
    КонецЕсли;
    //Ит=СоздатьОбъект("БухгалтерскиеИтоги");  
    //Ит.ПериодД(НачМесяца(Дата1),КонМесяца(Дата2));
    
    ТабЛС.Количество=0;
    ТабЛС.Сумма=0;
    //    ТабЛС.ОбъемМ=0;
    //    ТабЛС.НачислениеМ=0;
    //Если пк_1=1 Тогда
    //л_СчетК=ПоУслуги.СчетК;
    //Иначе
    //    л_СчетК=СчетПоКоду("ОДН");
    //КонецЕсли;
    
    
    
    спрБлаг.ИспользоватьВладельца(ТабЛС.Адрес);
    Если спрБлаг.НайтиПоРеквизиту("Услуга",пл_Услуга,0)=1 Тогда
        
        
        //Если (спрБлаг.СпособНачисления.получить(Дата1)=2)и(спрБлаг.СпособНачисления.получить(Дата2)=2) Тогда
        //    ТабЛС.К="+";
        //    Возврат;
        //ИначеЕсли (спрБлаг.СпособНачисления.получить(Дата1)=1)и(спрБлаг.СпособНачисления.получить(Дата2)=1) Тогда
        //    ТабЛС.К="-";
        //ИначеЕсли (спрБлаг.СпособНачисления.получить(Дата1)=3)и(спрБлаг.СпособНачисления.получить(Дата2)=3) Тогда
        //    Возврат;
        //Иначе
        //    ТабЛС.К="<>";
        //КонецЕсли;
    Иначе
        Сообщить(ТабЛС.Адрес.Наименование+" не найдена услуга: "+пл_Услуга.Наименование);
        Возврат;
    КонецЕсли;
    
    Док=СоздатьОбъект("Документ.Перерасчет");
    Док.ВыбратьДокументы(НачМесяца(Дата1),КонМесяца(Дата2));            
    Пока Док.ПолучитьДокумент() > 0 Цикл
        Если Док.Комментарий<>"Начало отопительного периода" Тогда
            Продолжить;
        КонецЕсли;
        Если Док.Проведен()=0 Тогда
            Продолжить;
        КонецЕсли;
        Если Док.ПометкаУдаления()=1 Тогда
            Продолжить;
        КонецЕсли;          
        Док.ВыбратьСтроки();
        Пока Док.ПолучитьСтроку()=1 Цикл                  
            //Если Док.Жилье=л_адрес Тогда  
            //ТабЗнач.НоваяСтрока();
            //ТабЗнач.Услуга=Док.Услуга;
            //ТабЗнач.Комментарий=Док.Комментарий;
            //ТабЗнач.Количество=-Док.Количество;
            Количество=Док.Количество;
            //ТабЗнач.Сумма=-Док.Сумма;
            //    КонецЕсли;    
        КонецЦикла;      
    КонецЦикла;
    
    
    Т=спрБлаг.Тариф.Получить(Дата2);
    л_Тариф=Т.Тариф.Получить(Дата2);
    Норматив=Т.Норма.Получить(Дата2);
    //Если ПустоеЗначение(Тариф)=1 Тогда
    //    Возврат;
    //КонецЕсли;
    
    //Если пл_Услуга.СпособРасчета=Перечисление.СпособРасчета.Теплоноситель Тогда
    //ТабЛС.ОбъемМ=Окр(ТабЛС.Чел*Норматив,4);
    //    ТабЛС.НачислениеМ=Окр(ТабЛС.ОбъемМ*Тариф,2);    
    //КонецЕсли;
    
    л_Дней=Дата2-Дата1+1;
    
    //Если л_Дней<>ДатаЧисло(КонМесяца(Дата2)) Тогда
    //Сообщить(л_Дней);  
    днейМ=ДатаЧисло(КонМесяца(Дата2));
    
    //ТабЛС.Количество=Окр((Норматив/днейМ*л_Дней)*ТабЛС.Чел,4);
    //Иначе
    //    ТабЛС.Количество=ТабЛС.ОбъемМ;
    //КонецЕсли;
    ТабЛС.Количество=Окр(Количество*Норматив,4);
    ТабЛС.Сумма=Окр(ТабЛС.Количество*л_Тариф,2);
КонецПроцедуры

//_______________________________________________________________________
Процедура ПерерасчетСтрок()
    Если ТабЛС.КоличествоСтрок()=0 Тогда
        Возврат;
    КонецЕсли;
    //Если пл_Тариф=0 Тогда
    //    Предупреждение("Укажите новый тариф по услуги!",5);
    //    Возврат;
    //КонецЕсли;
    ТабЛС.ВыбратьСтроки();
    Пока ТабЛС.ПолучитьСтроку()=1 Цикл
        РассчитатьСтроку();    
    КонецЦикла;
КонецПроцедуры

//_______________________________________________________________________
Процедура Заполнить()
    Если ТабЛС.КоличествоСтрок()>0 Тогда
        Если Вопрос("Очистить табличную часть перед заполнением?",4)=6 Тогда
            ТабЛС.УдалитьСтроки();
        КонецЕсли;
    КонецЕсли;
    
    //Док=СоздатьОбъект("Документ.Перерасчет");
    //Док.ВыбратьДокументы(НачМесяца(Дата1),КонМесяца(Дата2));            
    //Пока Док.ПолучитьДокумент() > 0 Цикл
    //    Если Док.Комментарий<>"Начало отопительного периода" Тогда
    //        Продолжить;
    //    КонецЕсли;
    //    Если Док.Проведен()=0 Тогда
    //        Продолжить;
    //    КонецЕсли;
    //    Если Док.ПометкаУдаления()=1 Тогда
    //        Продолжить;
    //    КонецЕсли;          
    //    Док.ВыбратьСтроки();
    //    Пока Док.ПолучитьСтроку()=1 Цикл                  
    //        ТабЛС.Количество=Док.Количество;
    //    КонецЦикла;
    //    
    //    Гл_ТаблЗаполнения.ВыбратьСтроки();
    //    Пока Гл_ТаблЗаполнения.ПолучитьСтроку()=1 Цикл
    //        л_адрес=Гл_ТаблЗаполнения.Адрес;
    
    спрБлаг.ИспользоватьВладельца(л_адрес);
    Если спрБлаг.НайтиПоРеквизиту("Услуга",пл_Услуга,0)=0 Тогда
        Продолжить;
        
    КонецЕсли;
    ТабЛС.НоваяСтрока();
    ТабЛС.Адрес=л_адрес;    
КонецЦикла;
РассчитатьСтроку();
КонецЦикла;
//Гл_ТаблЗаполнения.Очистить();
КонецПроцедуры

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


//__________________________________________________________________
Процедура ПриОткрытии()  
Конт=Форма.Параметр;
Если ПустоеЗначение(Конт)=1 Тогда
Сообщить("Обработка доступна только из документа Перерасчет по услуге!","i");
СтатусВозврата(0);
Возврат;
Иначе
Если Конт.Вид()<>"Перерасчет" Тогда
    Сообщить("Обработка не может быть открыта из документа: "+СокрЛП(Конт));
    СтатусВозврата(0);
    Возврат;
КонецЕсли;
КонецЕсли;
спрБлаг=СоздатьОбъект("Справочник.Благоустройство");
Дата1=Конт.Дата1;
Дата2=Конт.Дата2;
Если (Дата1='..')или(Дата2='..') Тогда
Предупреждение("Не задан период для перерасчета!",5);
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если Дата1>Дата2 Тогда
Предупреждение("Не верно задан период для перерасчета!",5);
СтатусВозврата(0);
Возврат;
КонецЕсли;
Если Дата2>КонецРассчитанногоПериодаБИ() Тогда
Предупреждение("Период за пределами рассчитанного периода БИ!",5);
СтатусВозврата(0);
Возврат;
КонецЕсли;
пл_Услуга=Конт.Услуга;  

Если ПустоеЗначение(пл_Услуга)=1 Тогда
Предупреждение("Не определена услуга!",5);
СтатусВозврата(0);
Возврат;
КонецЕсли;  

пл_ДатаДок=Конт.ДатаДок;
//Тариф=пл_Услуга.БазовыйТариф.Получить(Дата1);

//ПоДате=пл_ДатаДок;
ПоУслуги=пл_Услуга;
//СучетомОДН=Конт.СучетомОДН;  
ТабЛС.НоваяКолонка("Иконка",,,,"",3);
ТабЛС.НоваяКолонка("Адрес","Справочник.Жилье",,,,30);  
//ТабЛС.НоваяКолонка("Чел","Число",,,"Чел.",6,,2);  
ТабЛС.НоваяКолонка("Количество","Число",,,"Кол-во",8,,2);
ТабЛС.НоваяКолонка("Сумма","Число",8,2,"Сумма",8,,2);

ТабЛС.ВыводитьПиктограммы("Иконка",1);

//Если пл_Услуга.Выбран()=1 Тогда
//    Если пл_Услуга.ТипУслуги=Перечисление.ТипУслуги.Коммунальная Тогда
//        ТабЛС.ВидимостьКолонки("Количество",1);
//    Иначе
//        ТабЛС.ВидимостьКолонки("Количество",0);
//    КонецЕсли;
//КонецЕсли;
КонецПроцедуры
35 Vol71
 
28.09.17
13:06
Пиши в почту, посмотрю.
36 aka AMIGO
 
28.09.17
13:09
(34) Да, дружок.. Поскольку ты в цикле перебираешь ВСЕ документы, и в каждом ищешь Док.Количество, то в результате получишь последнее Количество из последнего документа, т.е. вообще непонятное значение.
https://i.paste.pics/47bbd1db4060e9b8ac624425827fb171.png

В результате вот тут ты считаешь что-то, используя невесть какое Количество:

https://i.paste.pics/29a6b10b1a75774e6a522dd2029c0a02.png

Как-бы я сделал: распечатал бы код, с карандашиком построчно проанализировал критически каждую строчку, стало-б понятно, где что искать, чтоб что-то получилось.
37 aka AMIGO
 
28.09.17
13:13
В 1998 году я еще и граф-алгоритм рисовал, чтобы была ясная картина перед глазами.
Но способ кодирования - у каждого свой.
Это всё - не советы, а просто размышлизмы по теме.
38 aka AMIGO
 
28.09.17
13:15
+37 в 1с-Конфигурации присутствует нужная каждому прогеру спасалка - Отладчик. Научился-б ТС шагать по Отладчику..
39 whitewolf87
 
28.09.17
15:06
(38) я умею это, но не умею например загружать, как это, документы в существующий документ, что-то я умею что-то нет, я всего год программист, с мая того года,а так я сис админ.
40 whitewolf87
 
28.09.17
15:08
Смена профессии кардинально, потому и потому и проблемы у меня с кодом...
41 whitewolf87
 
28.09.17
15:08
(35) пишу
42 whitewolf87
 
28.09.17
16:17
Просьба закрыть тему.проблема решена.