Имя: Пароль:
1C
1С v8
Как сделать покороче код
0 DonJon
 
11.06.16
23:06
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ХозрасчетныйДвиженияССубконто.Регистратор
        |ИЗ
        |    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто КАК ХозрасчетныйДвиженияССубконто
        |ГДЕ
        |    ХозрасчетныйДвиженияССубконто.СчетКт = &СчетКт
        |    И ХозрасчетныйДвиженияССубконто.СчетДт = &СчетДт
        |    И НЕ ХозрасчетныйДвиженияССубконто.СубконтоДт2 = ХозрасчетныйДвиженияССубконто.СубконтоКт2
        |
        |СГРУППИРОВАТЬ ПО
        |    ХозрасчетныйДвиженияССубконто.Регистратор";
    
    Запрос.УстановитьПараметр("СчетДт", ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.05"));
    Запрос.УстановитьПараметр("СчетКт", ПланыСчетов.Хозрасчетный.НайтиПоКоду("86.01"));
    
    РезультатЗапроса = Запрос.Выполнить();
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
        Движения = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
        Движения.Отбор.Регистратор.Установить(ВыборкаДетальныеЗаписи.Регистратор);
        Движения.Прочитать();
        Для Каждого Проводка Из Движения Цикл
            Если Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.05") И Проводка.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("86.01")
                И НЕ Проводка.СубконтоДт.Договоры = Проводка.СубконтоКт.Договоры Тогда
                Проводка.СубконтоКт.Договоры = Проводка.СубконтоДт.Договоры;
            КонецЕсли;                
        КонецЦикла;
        Движения.ОбменДанными.Загрузка = Истина;
        Попытка
            Движения.Записать();
            Сообщить("Исправлен - "+ВыборкаДетальныеЗаписи.Регистратор);
        Исключение
            Сообщить(ОписаниеОшибки());
        КонецПопытки;
    КонецЦикла;
    
    //приходники
    ВыборкаПКО = Документы.ПриходныйКассовыйОрдер.Выбрать();
    Пока ВыборкаПКО.Следующий() Цикл
        ДокПКО = ВыборкаПКО.ПолучитьОбъект();
        Если ДокПКО.СчетУчетаРасчетовСКонтрагентом = ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.05") ИЛИ ДокПКО.СчетУчетаРасчетовСКонтрагентом.Родитель = ПланыСчетов.Хозрасчетный.НайтиПоКоду("76") Тогда
            Если НЕ ДокПКО.СубконтоКт1 = ДокПКО.СубконтоКт2.Владелец Тогда
                Договор = Справочники.ДоговорыКонтрагентов.Выбрать(,ДокПКО.СубконтоКт1);
                Если Договор.Следующий() Тогда
                    ДокПКО.СубконтоКт2 = Договор.Ссылка;
                    Попытка
                        ДокПКО.Записать(?(ДокПКО.Проведен,РежимЗаписиДокумента.Проведение,РежимЗаписиДокумента.Запись),РежимПроведенияДокумента.Неоперативный);
                        Сообщить("Исправлен - "+ДокПКО.Ссылка);
                    Исключение
                        Сообщить(ОписаниеОшибки());
                    КонецПопытки;
                КонецЕсли;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    
КонецПроцедуры
1 Defender aka LINN
 
11.06.16
23:32
Что платишь?
2 Матиус III
 
12.06.16
00:03
(0) Могу подсказать как сделать быстрее, как короче не скажу - уже некуда сжимать.
3 Матиус III
 
12.06.16
00:05
(0) Хотя в одну строку можно запилить, по вертикали короче будет.
4 ShAV
 
12.06.16
08:50
(3) :)
или как вариант настроить в конфигураторе сервис -> параметры -> модуль -> группировка
5 PR
 
12.06.16
09:47
(0) Зачем?
6 hhhh
 
12.06.16
09:51
(0)  Если Проводка.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.05")

тысячу раз поиск по коду фигачишь? А про использование переменных в языке 1с никогда не слышал?

В начале кода пишешь

Сч_7605 = ПланыСчетов.Хозрасчетный.НайтиПоКоду("76.05");

и потом уже везде пишешь Сч_7605. Это конечно будет длиннее, но зато быстрее.
7 Armando
 
12.06.16
10:05
(6) ты не понял - автору покороче надо. Странно что вообще запросы используются, это же очень длинно получается.
8 ILM
 
гуру
12.06.16
10:07
Алгоритм правки ПКО неверный. Сделайте запрос сразу же к ПКО, исправляйте документ.
9 Лефмихалыч
 
12.06.16
10:13
(0) там чинить нечего - только начисто переписывать.

Общая идея такова - надо, чтобы запрос вернул только то, что надо обрабатывать, чтобы не приходилось проверки в цикле крутить. Кроме того, значения, которые надо поставить в данные, тоже должен запрос вернуть, чтобы не приходилось запросы в цикле делать.

И запросы в цикле должен ни когда не делай. От запросов в цикле шерсть на ладошках вырастает и слепошарие образовывается
10 Лефмихалыч
 
12.06.16
10:16
+(9) по первому циклу - запрос должен тебе вернуть регистраторы и номера строк проводок, которые надо обработать. Тогда ты в цикле по регистрторам получаешь набор, а в цикле по номерам строк получаешь Набор[Выборка.НомерСтроки].ЧтоТамНадо = Выборка.ЧтоУгодно;
11 ILM
 
гуру
12.06.16
10:16
Тоже и с движениями - выгрузили в запросе с исправленными данными и загрузили сразу в набор.
12 RomanYS
 
12.06.16
10:22
(10) +100
главное ещё не забыть сделать бэкап, чтобы потом была возможность запустить
Набор[Выборка.НомерСтроки - 1]....
Без "минус один" результат может быть неожиданным )).
13 Лефмихалыч
 
12.06.16
10:53
(12) минусодин надо в запросе делать
14 RomanYS
 
12.06.16
17:42
(13) тоже согласен, толь тогда надо называть "это" индекс, а не номерстроки
15 DonJon
 
15.06.16
13:39
(13)Спасибо всем за ценные советы.
AdBlock убивает бесплатный контент. 1Сергей