Имя: Пароль:
1C
1С v8
Помогите улучшить код
0 1CVERYGOOD
 
22.03.14
12:58
Подозреваю что написано криво. Подскажите как можно оптимизировать ?


    Зап = новый Запрос;
    зап.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
    |     ТИПЗНАЧЕНИЯ(ХозрасчетныйОборотыДтКт.Регистратор) как ТипДок,
    |     ХозрасчетныйОборотыДтКт.Регистратор.Организация,
    |    ХозрасчетныйОборотыДтКт.Регистратор,
    |    ХозрасчетныйОборотыДтКт.СчетДт,
    |    ХозрасчетныйОборотыДтКт.СчетКт,
    |    ХозрасчетныйОборотыДтКт.ПодразделениеДт КАК ПодразделениеДт,
    |    ХозрасчетныйОборотыДтКт.ПодразделениеКт КАК ПодразделениеКт,
    |    ХозрасчетныйОборотыДтКт.СуммаОборот КАК СуммаОборот
    |    ИЗ
    |    РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&датаначала, &датаокончания, Регистратор, , , , , ) КАК ХозрасчетныйОборотыДтКт
    |ГДЕ
    |    (ХозрасчетныйОборотыДтКт.СчетДт =&СчетДт  
    |    ИЛИ ХозрасчетныйОборотыДтКт.СчетКт=&СчетКт)
    |//И ТИПЗНАЧЕНИЯ(ХозрасчетныйОборотыДтКт.Регистратор) = ТИП(Документ.ВводНачальныхОстатков)
    |И ТИПЗНАЧЕНИЯ(ХозрасчетныйОборотыДтКт.Регистратор) = ТИП(Документ.СписаниеСРасчетногоСчета)
    |//И ТИПЗНАЧЕНИЯ(ХозрасчетныйОборотыДтКт.Регистратор) = ТИП(Документ.ОтражениеЗарплатыВРеглУчете)
    |//И ТИПЗНАЧЕНИЯ(ХозрасчетныйОборотыДтКт.Регистратор) = ТИП(Документ.ОперацияБух)";
    зап.Параметры.Вставить("датаначала",'20110101');
    зап.Параметры.Вставить("датаокончания",'20140322');
    зап.Параметры.Вставить("СчетДт",ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.01"));
    зап.Параметры.Вставить("СчетКт",ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.01"));
    рез = Зап.Выполнить().Выбрать();
    Пока рез.Следующий() ЦИКЛ
        ОбработкаПрерыванияПользователя();
        об = рез.Регистратор.ПолучитьОбъект();          
        Для каждого НаборЗаписейРегистра из об.Движения  Цикл
            НаборЗаписейРегистра.Прочитать();
            Для каждого зап  из НаборЗаписейРегистра  Цикл
                ЕСЛИ ТипЗнч(зап)= тип("РегистрБухгалтерииЗапись.Хозрасчетный") ТОГДА
                    зап.ПодразделениеДт = об.ПодразделениеДт;                    
                    Сообщить(об.ссылка);
                    НаборЗаписейРегистра.Записать();
                КОНЕЦЕСЛИ;    
            КОНЕЦЦИКЛА;             
        КонецЦикла;
    КОНЕЦЦИКЛА;
1 vicof
 
22.03.14
13:02
ГДЕ можно удалить.
Параметры виртуальных таблиц - классика
проверять тип можно раньше
2 1CVERYGOOD
 
22.03.14
13:02
Задача в том, чтобы проставить подразделениеДт в проводках по 68.01, где документ = СписаниеСРасчетногоСчета из соотв. реквизита.
3 vicof
 
22.03.14
13:03
набор записей в цикле записывать не круто
4 1CVERYGOOD
 
22.03.14
13:03
Запрос то быстро выполняется. Цикл очень медленно работает.
5 Kookish
 
22.03.14
13:17
(0), (4) Подозреваю, что без цикла вообще можно обойтись. Одним запросом.
И да, (1). См. http://kb.1c.ru/articleView.jsp?id=44
6 Kookish
 
22.03.14
13:27
(4) Он и будет долго выполняться. Вы ж за три с лишним года документы перелопачиваете. А еще по-моему, можно не перебирать все движения, а сразу обратиться к движениям по хозрасчетному, через точку или квадратные скобки.
7 mehfk
 
22.03.14
15:03
(0) ТИПЗНАЧЕНИЯ(ХозрасчетныйОборотыДтКт.Регистратор) = ТИП(...)

Заменить на ХозрасчетныйОборотыДтКт.Регистратор ССЫЛКА ...
8 mehfk
 
22.03.14
15:05
(ХозрасчетныйОборотыДтКт.СчетДт =&СчетДт  
    |    ИЛИ ХозрасчетныйОборотыДтКт.СчетКт=&СчетКт)

Вставить в условия в виртуальной таблице
9 rphosts
 
22.03.14
15:42
(4) тебе-ж в (3) написали что вынеси запись после цикла и пиши всего 1 раз.... запись в циткле оно как запрос в цикле
10 1CVERYGOOD
 
22.03.14
15:51
об = рез.Регистратор.ПолучитьОбъект();
об.Движения["Хозрасчетный"].Прочитать();
Для каждого зап  из об.Движения["Хозрасчетный"]  Цикл
    зап.ПодразделениеКт = об.ПодразделениеОрганизации;                    
КОНЕЦЦИКЛА;            об.Движения["Хозрасчетный"].Записать();

Вот так сделал.
11 grate
 
22.03.14
16:02
Зап = новый Запрос;
    зап.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
                |    ХозрасчетныйОбороты.Регистратор
                |ПОМЕСТИТЬ ВТ_Документы
                |ИЗ
                |    РегистрБухгалтерии.Хозрасчетный.Обороты(&датаначала, &датаокончания, Регистратор, Счет = &Счет6801, , , , ) КАК ХозрасчетныйОбороты
                |ГДЕ
                |    ХозрасчетныйОбороты.Регистратор ССЫЛКА Документ.СписаниеСРасчетногоСчета
                |;
                |
                |////////////////////////////////////////////////////////////////////////////////
                |ВЫБРАТЬ
                |    ВТ_Документы.Регистратор,
                |    СписаниеСРасчетногоСчета.ПодразделениеДт
                |ИЗ
                |    ВТ_Документы КАК ВТ_Документы
                |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.СписаниеСРасчетногоСчета КАК СписаниеСРасчетногоСчета
                |        ПО ВТ_Документы.Регистратор = СписаниеСРасчетногоСчета.Ссылка";

    зап.Параметры.Вставить("ДатаНачала",'20110101');
    зап.Параметры.Вставить("ДатаОкончания",'20140322');
    
    Счет6801 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("68.01");
    зап.Параметры.Вставить("Счет6801", Счет6801);
    
    рез = Зап.Выполнить().Выбрать();
    НЗ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
    
    Пока рез.Следующий() ЦИКЛ
        ОбработкаПрерыванияПользователя();
        НЗ.Отбор.Регистратор.Установить(рез.Регистратор);
        НЗ.Прочитать();
        Для Каждого зап Из НЗ Цикл
            Если зап.СчетДт = Счет6801 ИЛИ зап.СчетКт = Счет6801 Тогда
                зап.ПодразделениеДт = рез.ПодразделениеДт;
            КонецЕсли;
        КонецЦикла;
        НЗ.Записать();
    КОНЕЦЦИКЛА;
12 jsmith82
 
22.03.14
17:18
Почему капс перемежается с обычным кеглем
13 jsmith82
 
22.03.14
17:18
Наименование переменной то с маленькой, то с большой буквы
Что за деревенский стайл?
Ошибка? Это не ошибка, это системная функция.