|
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
|
Просьба закрыть тему.проблема решена.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |