|
v7: Повторное использование вида субконто | ☑ | ||
---|---|---|---|---|
0
alex_reglament
17.01.12
✎
10:55
|
привет всем немогу найти ошибку в коде помогите пожалуйста
|
|||
1
alex_reglament
17.01.12
✎
10:56
|
Функция Загрузка()
Перем Имя; тз = СоздатьОбъект("ТаблицаЗначений"); тз.НоваяКолонка("Сотрудники"); тз.НоваяКолонка("ТабНом"); тз.НоваяКолонка("Вид"); тз.НоваяКолонка("ВидКод"); тз.НоваяКолонка("СуммаНач","Число"); тз.НоваяКолонка("СуммаУд","Число"); тз.НоваяКолонка("Сальдо","Число"); ПолучТекст = СоздатьОбъект("Текст"); Если СокрЛП(ВыбФайлЗагрузки) = "" Тогда Возврат 1; КонецЕсли; Если ПолучитьИмяФайла(ВыбФайлЗагрузки, Имя) = 0 Тогда Возврат 1; Иначе Проход = ""; Попытка ПолучТекст.Открыть(СокрЛП(Имя)); Для Сч=1 По ПолучТекст.КоличествоСтрок() Цикл Стр=СокрЛП(ПолучТекст.ПолучитьСтроку(Сч)); Если Проход = "" Тогда тз.НоваяСтрока(); Проход =""; КонецЕсли; Если Лев(Стр,4)="SOTR" Тогда тз.Сотрудники = Прав(Стр,СтрДлина(Стр)-4); Проход = 1 ; ИначеЕсли Лев(Стр,4)="TABN" Тогда тз.ТабНом = Прав(Стр,СтрДлина(Стр)-4); Проход = 2 ; ИначеЕсли Лев(Стр,4)="BNUD" Тогда тз.Вид = Прав(Стр,СтрДлина(Стр)-4); Проход = 3 ; ИначеЕсли Лев(Стр,4)="BNUK" Тогда тз.ВидКод = Прав(Стр,СтрДлина(Стр)-4); Проход = 3 ; ИначеЕсли Лев(Стр,2)="KO" Тогда тз.СуммаНач = Прав(Стр,СтрДлина(Стр)-2); Проход = 4 ; ИначеЕсли Лев(Стр,2)="DO" Тогда тз.СуммаУд = Прав(Стр,СтрДлина(Стр)-2); Проход = 5 ; ИначеЕсли Лев(Стр,3)="SNK" Тогда тз.Сальдо = Прав(Стр,СтрДлина(Стр)-3); Проход = "" ; КонецЕсли; КонецЦикла; Исключение Сообщить("Ошибка открытия файла или контрагент уже записан "+Имя+"!"); Возврат 1; КонецПопытки; КонецЕсли; БИ_ = СоздатьОбъект("БухгалтерскиеИтоги"); тзГотовая.НоваяКолонка("Сотрудник_"); тзГотовая.НоваяКолонка("ТабельныйНомер"); тзГотовая.НоваяКолонка("ВидНачУд"); тзГотовая.НоваяКолонка("ВидНачУдКод"); тзГотовая.НоваяКолонка("СуммНач","Число"); тзГотовая.НоваяКолонка("СуммУдер","Число"); тзГотовая.НоваяКолонка("СульдоНач","Число"); спр = СоздатьОбъект("Справочник.ВидыНачисленийУдержаний"); спрсотр = СоздатьОбъект("Справочник.Сотрудники"); тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку() = 1 Цикл Сотрудник_ = ""; ТабНомер = ""; ВидУДНач = ""; ВидКод_ = ""; КО = ""; ДО = ""; СНК = ""; Сотрудник_ = тз.Сотрудники; ТабНомер = тз.ТабНом; ВидУДНач = тз.Вид; ВидКод_ = тз.ВидКод; КО = тз.СуммаНач; ДО = тз.СуммаУд; СНК = тз.Сальдо; Если спрсотр.НайтиПоКоду(ТабНомер) = 0 Тогда Продолжить; Иначе Если спр.НайтиПоКоду(ВидКод_) = 0 Тогда Продолжить; Иначе БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники,спрсотр.ТекущийЭлемент()); БИ_.ИспользоватьСубконто(ВидыСубконто.НачисленияУдержания,спр.ТекущийЭлемент()); БИ_.ВыполнитьЗапрос(НачМесяца(Дата_),КонМесяца(Дата_),"70",,,"Месяц"); БИ_.ВыбратьСубконто(1); Пока БИ_.ПолучитьСубконто(1) = 1 Цикл БИ_.ВыбратьСубконто(2); Пока БИ_.ПолучитьСубконто(2) = 1 Цикл отмена = 0; _Сотрудник_ = ""; _ТабНомер = ""; _ВидУДНач = ""; _ВидУДНачК = ""; _КО = ""; _ДО = ""; _СНК = ""; _Сотрудник_ = БИ_.Субконто(1).Наименование; _ТабНомер = БИ_.Субконто(1).Код; _ВидУДНач = БИ_.Субконто(2).Наименование; _ВидКод_ = БИ_.Субконто(2).Код; _КО = БИ_.КО(); _ДО = БИ_.ДО(); _СНК = БИ_.СНК(); СуммаУд = ""; СуммаНачисл = ""; Если (КО > _КО) Тогда СуммаНачисл = КО - _КО; отмена = 0; Иначе отмена = 1; КонецЕсли; Если ДО > _ДО Тогда СуммаУд = ДО - _ДО; отмена = 0; Иначе отмена = 1; КонецЕсли; Если отмена <> 1 Тогда тзГотовая.НоваяСтрока(); тзГотовая.Сотрудник_ = Сотрудник_; тзГотовая.ТабельныйНомер = ТабНомер; тзГотовая.ВидНачУд = ВидУДНач; тзГотовая.ВидНачУдКод = ВидКод_; тзГотовая.СуммНач = СуммаНачисл; тзГотовая.СуммУдер = СуммаУд; тзГотовая.СульдоНач = СНК; Иначе Продолжить; КонецЕсли; КонецЦикла; КонецЦикла; КонецЕсли; КонецЕсли; КонецЦикла; /////////////////////////////////////////////////////////////////////////////////////////// //тзГотовая.Свернуть("Сотрудник_,ТабельныйНомер,ВидНачУд","СуммНач,СуммУдер,СульдоНач"); Таб = СоздатьОбъект("Таблица"); Таб.ИсходнаяТаблица("Таблица"); Таб.ВывестиСекцию("Шапка"); ном = 0; Итог_ = 0; Таб.Опции(0,0,Таб.ВысотаТаблицы(),0); тзГотовая.ВыбратьСтроки(); Пока тзГотовая.ПолучитьСтроку() = 1 Цикл Если тзГотовая.СуммНач <> 0 Тогда ном = ном +1; Сотрудник = ""; ТАБНом = ""; ВидНачУд = ""; КодВидв = ""; КО = ""; ДО = ""; СНК = ""; Сотрудник = тзГотовая.Сотрудник_; ТАБНом = тзГотовая.ТабельныйНомер; ВидНачУд = тзГотовая.ВидНачУд; КодВидв = тзГотовая.ВидНачУдКод; КО = тзГотовая.СуммНач; ДО = тзГотовая.СуммУдер; Таб.ВывестиСекцию("Строка"); СНК = тзГотовая.СульдоНач; Таб.ВывестиСекцию("итого"); КонецЕсли; КонецЦикла; БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники,спрсотр.ТекущийЭлемент()); {D:\1С\КОНФИГУРАЦИИ 1СV7\ДЛЯ ИСПРАВЛЕНИЯ КОСЯКА НА ТБЗ.ERT(220)}: Повторное использование вида субконто "Сотрудники" в запросе! |
|||
2
alex_reglament
17.01.12
✎
10:56
|
Если спр.НайтиПоКоду(ВидКод_) = 0 Тогда // это строка 220
|
|||
3
PuhUfa
17.01.12
✎
10:58
|
БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники,спрсотр.ТекущийЭлемент());
у тебя в цикле |
|||
4
Дядя Васька
17.01.12
✎
10:58
|
БИ_.ИспользоватьСубконто(ВидыСубконто.НачисленияУдержания,спр.ТекущийЭлемент());
|
|||
5
alex_reglament
17.01.12
✎
10:59
|
и что что в цикле а что нельзя в цикл пихать?
|
|||
6
alex_reglament
17.01.12
✎
10:59
|
как с этим бороться?
|
|||
7
alex_reglament
17.01.12
✎
11:01
|
выходит что мне наоборот сделать сночало формировать би а потом в цикле тз???
|
|||
8
alex_reglament
17.01.12
✎
11:01
|
а без этого ни как?
|
|||
9
Дядя Васька
17.01.12
✎
11:02
|
(5) Ну вообще запрос в цикле это моветон... Чтобы заработало достаточно перед (3),(4) БИ_ = СоздатьОбъект("БухгалтерскиеИтоги"), но по уму код надо оптимизировать чтобы в ИспользоватьСубконто() передавался список элементов и запрос выполнялся один раз, а не столько сколько строк в таблице.
|
|||
10
alex_reglament
17.01.12
✎
11:03
|
не смотрел но скорее всего около 400
|
|||
11
PuhUfa
17.01.12
✎
11:03
|
(5) упростим твой код до:
БИ_ = СоздатьОбъект("БухгалтерскиеИтоги"); Пока тз.ПолучитьСтроку() = 1 Цикл БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники,спрсотр.ТекущийЭлемент()); КонецЦикла; сколько раз будет применяться использоватьсубконто? или выноси использоватьсубконто из цикла или вноси в него СоздатьОбъект("БухгалтерскиеИтоги") |
|||
12
alex_reglament
17.01.12
✎
11:03
|
хотя вру 4000
|
|||
13
1Сергей
17.01.12
✎
11:04
|
(12) тогда вообще нет смысла его фильтровать
|
|||
14
1Сергей
17.01.12
✎
11:05
|
(13)+ ВыбратьСубконто и алга
|
|||
15
alex_reglament
17.01.12
✎
11:05
|
так
спр = СоздатьОбъект("Справочник.ВидыНачисленийУдержаний"); спрсотр = СоздатьОбъект("Справочник.Сотрудники"); тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку() = 1 Цикл Сотрудник_ = ""; ТабНомер = ""; ВидУДНач = ""; ВидКод_ = ""; КО = ""; ДО = ""; СНК = ""; Сотрудник_ = тз.Сотрудники; ТабНомер = тз.ТабНом; ВидУДНач = тз.Вид; ВидКод_ = тз.ВидКод; КО = тз.СуммаНач; ДО = тз.СуммаУд; СНК = тз.Сальдо; Если спрсотр.НайтиПоКоду(ТабНомер) = 0 Тогда Продолжить; Иначе Если спр.НайтиПоКоду(ВидКод_) = 0 Тогда Продолжить; Иначе БИ_ = СоздатьОбъект("БухгалтерскиеИтоги"); БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники,спрсотр.ТекущийЭлемент()); БИ_.ИспользоватьСубконто(ВидыСубконто.НачисленияУдержания,спр.ТекущийЭлемент()); БИ_.ВыполнитьЗапрос(НачМесяца(Дата_),КонМесяца(Дата_),"70",,,"Месяц"); БИ_.ВыбратьСубконто(1); Пока БИ_.ПолучитьСубконто(1) = 1 Цикл БИ_.ВыбратьСубконто(2); Пока БИ_.ПолучитьСубконто(2) = 1 Цикл отмена = 0; _Сотрудник_ = ""; _ТабНомер = ""; |
|||
16
1Сергей
17.01.12
✎
11:07
|
ПолучитьСубконто(<?>,,)
GetSubconto(<?>,,) Синтаксис: ПолучитьСубконто(<Индекс>,<Номер>,<Значение>) Назначение: Получить из выборки следующее субконто. Выборка должна быть предварительно открыта при помощи метода ''ВыбратьСубконто''. Возвращает 1 - следующее субконто выбрано успешно; 0 - следующе субконто не выбрано (отсутствует). Параметры: <Индекс> - число: порядковый номер вызова метода ''ИспользоватьСубконто''. <Номер> - число - номер выборки. Необязательный параметр. <Значение> - значение субконто, на которое нужно спозиционироваться. |
|||
17
alex_reglament
17.01.12
✎
11:07
|
(13) а как мне получить то что мне нужно?
|
|||
18
1Сергей
17.01.12
✎
11:07
|
(17) см (16)
|
|||
19
Дядя Васька
17.01.12
✎
11:07
|
(15) Так-то так, но так будет работать в 4000 раз медленнее чем запрос за циклом )
|
|||
20
alex_reglament
17.01.12
✎
11:08
|
а как мне его за циклом сделать подскажите ато у меня оброзования не хватает
|
|||
21
alex_reglament
17.01.12
✎
11:10
|
а понял нужно вынести из цикла использоватьсубконто
затем фильтровать по условию если равно так?? |
|||
22
Дядя Васька
17.01.12
✎
11:10
|
(20) В цикле собираешь два списка значений, сотрудников и видов начислений, за циклом ИспользоватьСубконто() с условием на вхождение в список, потом сам ВыполнитьЗапрос() и еще один цикл с обходом результатов запроса.
|
|||
23
1Сергей
17.01.12
✎
11:11
|
спр = СоздатьОбъект("Справочник.ВидыНачисленийУдержаний");
спрсотр = СоздатьОбъект("Справочник.Сотрудники"); БИ_ = СоздатьОбъект("БухгалтерскиеИтоги"); БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники); БИ_.ИспользоватьСубконто(ВидыСубконто.НачисленияУдержания); БИ_.ВыполнитьЗапрос(НачМесяца(Дата_),КонМесяца(Дата_),"70",,,"Месяц"); БИ_.ВыбратьСубконто(1); БИ_.ВыбратьСубконто(2); тз.ВыбратьСтроки(); Пока тз.ПолучитьСтроку() = 1 Цикл Сотрудник_ = ""; ТабНомер = ""; ВидУДНач = ""; ВидКод_ = ""; КО = ""; ДО = ""; СНК = ""; Сотрудник_ = тз.Сотрудники; ТабНомер = тз.ТабНом; ВидУДНач = тз.Вид; ВидКод_ = тз.ВидКод; КО = тз.СуммаНач; ДО = тз.СуммаУд; СНК = тз.Сальдо; Если спрсотр.НайтиПоКоду(ТабНомер) = 0 Тогда Продолжить; Иначе Если спр.НайтиПоКоду(ВидКод_) = 0 Тогда Продолжить; Иначе Если БИ_.ПолучитьСубконто(1,,СпрСотр.ТекущийЭлемент()) = 1 Цикл Если БИ_.ПолучитьСубконто(2,,спр.ТекущийЭлемент()) = 1 Цикл отмена = 0; _Сотрудник_ = ""; _ТабНомер = ""; кактотак, не помню уже |
|||
24
alex_reglament
17.01.12
✎
11:12
|
за циклом ИспользоватьСубконто() с условием на вхождение в список
с условием на вхождение в список//это как? |
|||
25
Дядя Васька
17.01.12
✎
11:13
|
(24) Вместо БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники,спрсотр.ТекущийЭлемент()); БИ_.ИспользоватьСубконто(ВидыСубконто.Сотрудники,СписокСотрудников,2); как-то так...
|
|||
26
alex_reglament
17.01.12
✎
11:14
|
(23) в этом коде я получу точные данные и он будет бустрей работать?
|
|||
27
alex_reglament
17.01.12
✎
11:18
|
(25) но при этом после (25) мне нужно будет дополнительно условия типа
если Сотрудник = СписокСотрудников тогда так???? |
|||
28
1Сергей
17.01.12
✎
11:20
|
(27) обрати внимание Если БИ_.ПолучитьСубконто(1,,СпрСотр.ТекущийЭлемент()) = 1
|
|||
29
Дядя Васька
17.01.12
✎
11:33
|
(27) Ну немного не такого типа, но да, если нужна например зарплата и премия по иванову и только зарплата по петрову, то он вернет и зарплату и премию по обоим и лишнее надо будет пропустить при обходе. Но все же с отбором по спискам отработает быстрее чем вообще по всем, ну если конечно по условиям задачи у тебя в те списки все не попадают, тогда одинаково.
|
|||
30
alex_reglament
17.01.12
✎
12:06
|
све ок со старым тоже не долго формируется но советы к сведению приняты
|
|||
31
alex_reglament
17.01.12
✎
12:07
|
спасибо всем
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |