Имя: Пароль:
1C
1C 7.7
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
спасибо всем
Закон Брукера: Даже маленькая практика стоит большой теории.