Имя: Пароль:
1C
 
Оптимизация кода?
, ,
0 pro3ri
 
17.08.15
11:58
доброго дня!
Как можно оптимизировать код?
Делаю механизм чтобы бухи не могли выбирать групповые счета плана счетов.

ТЗ = Выгрузить();
        
                

        Для каждого СтрокаТЗ Из ТЗ Цикл
            
            
            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    Управленческий.Ссылка
                |ИЗ
                |    ПланСчетов.Управленческий КАК Управленческий
                |ГДЕ
                |    Управленческий.Родитель = &Родитель";
            
            Запрос.УстановитьПараметр("Родитель", СтрокаТЗ.СчетДт);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            Если НЕ РезультатЗапроса.Пустой() Тогда
            
                СчетСДеревомДт = Истина;
                
            Иначе
                СчетСДеревомДт = Ложь;
            
            КонецЕсли;
            
            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    Управленческий.Ссылка
                |ИЗ
                |    ПланСчетов.Управленческий КАК Управленческий
                |ГДЕ
                |    Управленческий.Родитель = &Родитель";
            
            Запрос.УстановитьПараметр("Родитель", СтрокаТЗ.СчетКт);
            
            РезультатЗапроса = Запрос.Выполнить();
            
            Если НЕ РезультатЗапроса.Пустой() Тогда
            
                СчетСДеревомКт = Истина;
            Иначе
                СчетСДеревомКт = Ложь;
            
            КонецЕсли;
            
            
            Если НЕ ЗначениеЗаполнено(СтрокаТЗ.СчетДт.Родитель) И СчетСДеревомДт Тогда
            
                Отказ = Истина;
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Нельзя указывать групповой счет в строке дебита № " + СтрокаТЗ.НомерСтроки;
                //Сообщение.Поле = "";
                //Сообщение.УстановитьДанные();
                Сообщение.Сообщить();
            ИначеЕсли Не ЗначениеЗаполнено(СтрокаТЗ.СчетКт.Родитель) И СчетСДеревомКт Тогда
                Отказ = Истина;
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "Нельзя указывать групповой счет в строке кредита № " + СтрокаТЗ.НомерСтроки;
                //Сообщение.Поле = "";
                //Сообщение.УстановитьДанные();
                Сообщение.Сообщить();

            КонецЕсли;    
        
        КонецЦикла;
1 zak555
 
17.08.15
11:59
убрать запрос из цикла
2 zak555
 
17.08.15
12:00
запросом сразу получать счет или по дебету, или по кредиту
3 Aswed
 
17.08.15
12:00
(1) Убрать ДВА запроса из цикла.
4 ДенисЧ
 
17.08.15
12:01
Ctrl-A, Del, Ctrl-S
5 Aswed
 
17.08.15
12:02
(4) А Ctrl-S это что?
6 ДенисЧ
 
17.08.15
12:02
(5) Волшебная кнопочка. Без неё оптимизации не будет
7 DmitriyDI
 
17.08.15
12:02
(5) сохранить)
8 Aswed
 
17.08.15
12:03
(7) Блин точно)
9 Бубка Гоп
 
17.08.15
12:06
10 Kurbash
 
17.08.15
12:07
проиндексируй ТЗ для скорости
11 Kurbash
 
17.08.15
12:08
+запрос из цикла убери
12 cw014
 
17.08.15
12:08
ШЕДЕВР
13 cw014
 
17.08.15
12:08
Скажите, а назачем тут запрос?
14 zak555
 
17.08.15
12:21
(13) 1с-ник просто обязан всюду использовать запросы
15 Бубка Гоп
 
17.08.15
12:22
(14) Желательно в цикле. Вложенным. В попытках.
16 cw014
 
17.08.15
12:23
(15) + обязательное создание временных таблиц без их уничтожения
17 zak555
 
17.08.15
12:23
(15) без циклом разумеется
18 kosts
 
17.08.15
12:30
(0) В типовых в плане счетов обычно встречается реквизит ЗапретитьИспользоватьВПроводках


Для каждого СтрокаТЗ Из ТЗ Цикл
    Если СтрокаТЗ.СчетДт.ЗапретитьИспользоватьВПроводках Тогда
            
        Отказ = Истина;
        
    КонецЕсли;    
КонецЦикла;
19 pro3ri
 
17.08.15
12:59
(18) благодарю.,

(1)
все как смог сделать  это:

        ТЗ = Выгрузить();
        
        
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    Управленческий.Ссылка
            |ИЗ
            |    ПланСчетов.Управленческий КАК Управленческий
            |ГДЕ
            |    Управленческий.Родитель В(&Родитель)";
            
        Массив = Новый Массив;
        
        Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетДт"));
    
        Запрос.УстановитьПараметр("Родитель", Массив);
        
        РезультатПустой = Запрос.Выполнить().Пустой();
        
        Если РезультатПустой Тогда
            СчетаДтБезИерархии = Истина;
        Иначе
            СчетаДтБезИерархии = Ложь;
        КонецЕсли;
        
        
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    Управленческий.Ссылка
            |ИЗ
            |    ПланСчетов.Управленческий КАК Управленческий
            |ГДЕ
            |    Управленческий.Родитель В(&Родитель)";
            
        Массив = Новый Массив;
        
        Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетКт"));
        
        Запрос.УстановитьПараметр("Родитель", Массив);
        
        РезультатПустой = Запрос.Выполнить().Пустой();
        
        Если РезультатПустой Тогда
            СчетаКтБезИерархии = Истина;
        Иначе
            СчетаКтБезИерархии = Ложь;
        КонецЕсли;
            
        Для каждого СтрокаТЗ Из ТЗ Цикл
            
            Если НЕ ЗначениеЗаполнено(СтрокаТЗ.СчетДт.Родитель) И Не СчетаДтБезИерархии Тогда
            
                Отказ = Истина;
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетДт"" нельзя указывать групповой счет!!!";
                //Сообщение.Поле = "";
                //Сообщение.УстановитьДанные();
                Сообщение.Сообщить();
            ИначеЕсли Не ЗначениеЗаполнено(СтрокаТЗ.СчетКт.Родитель) И Не СчетаКтБезИерархии Тогда
                Отказ = Истина;
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетКт"" нельзя указывать групповой счет!!!";
                //Сообщение.Поле = "";
                //Сообщение.УстановитьДанные();
                Сообщение.Сообщить();

            КонецЕсли;    
        
        КонецЦикла;
20 pro3ri
 
17.08.15
13:01
а вот можно ли 1 запросом все сразу, только чтобы была указка на конкретную строку...
21 kosts
 
17.08.15
13:17
(20) Первым шагом, загоняешь в таблицу все счета, которые встречаются.
Вторым, делаешь запрос с отбором по этим счетам. Выгружаешь результат в ТЗ.
Третьим, обходишь исходную таблицу и ищешь счет в результате запроса.
22 kosts
 
17.08.15
13:23
(21) + Для ускорения результат запроса можно поместить в соответствие, т.к. оно индексируется.
23 pro3ri
 
17.08.15
14:01
(21) спасибо
ТЗ = Выгрузить();
        
        Запрос = Новый Запрос;
        Запрос.Текст =
            "ВЫБРАТЬ
            |    Управленческий.Ссылка,
            |    Управленческий.Родитель
            |ИЗ
            |    ПланСчетов.Управленческий КАК Управленческий
            |ГДЕ
            |    Управленческий.Родитель В(&Родитель)";
            
        Массив = Новый Массив;
        
        Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетДт"));
        Массив.Добавить(ТЗ.ВыгрузитьКолонку("СчетКт"));
        
        Запрос.УстановитьПараметр("Родитель", Массив);
        
        ТЗЗапроса = Запрос.Выполнить().Выгрузить();
        //Соответствие = Новый Соответствие;
        //Соответствие.Вставить(ТЗ, Запрос.Выполнить().Выгрузить());
        Для каждого СтрокаТЗ Из ТЗ Цикл
            
            Если НЕ ЗначениеЗаполнено(СтрокаТЗ.СчетДт.Родитель) И ЗначениеЗаполнено(ТЗЗапроса.Найти(СтрокаТЗ.СчетДт)) Тогда
            
                Отказ = Истина;
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетДт"" нельзя указывать групповой счет!!!";
                Сообщение.Поле = "ДвиженияРегистрБухгалтерии1[СтрокаТЗ.НомерСтроки].СчетДт";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();
            ИначеЕсли Не ЗначениеЗаполнено(СтрокаТЗ.СчетКт.Родитель) И ЗначениеЗаполнено(ТЗЗапроса.Найти(СтрокаТЗ.СчетКт)) Тогда
                Отказ = Истина;
                Сообщение = Новый СообщениеПользователю;
                Сообщение.Текст = "В строке табличной части № " + СтрокаТЗ.НомерСтроки + " в поле ""СчетКт"" нельзя указывать групповой счет!!!";
                Сообщение.Поле = "ДвиженияРегистрБухгалтерии1[СтрокаТЗ.НомерСтроки].СчетКт";
                Сообщение.УстановитьДанные(ЭтотОбъект);
                Сообщение.Сообщить();

            КонецЕсли;    
        
        КонецЦикла;

только с соответствием ничего не понял
24 kosts
 
17.08.15
14:43
Что-то в этом роде

Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
    |    Хозрасчетный.Ссылка
    |ИЗ
    |    ПланСчетов.Хозрасчетный КАК Хозрасчетный
    |        ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ РАЗЛИЧНЫЕ
    |            Хозрасчетный.Родитель КАК Ссылка
    |        ИЗ
    |            ПланСчетов.Хозрасчетный КАК Хозрасчетный
    |        ГДЕ
    |            Хозрасчетный.Родитель <> ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ПустаяСсылка)) КАК Родители
    |        ПО Хозрасчетный.Ссылка = Родители.Ссылка
    |ГДЕ
    |    Родители.Ссылка ЕСТЬ NULL " // Разрешенные счета
    ;

Выборка = Запрос.Выполнить().Выбрать();

Стру = Новый Соответствие;
Пока Выборка.Следующий() Цикл
    Стру.Вставить(Выборка.Ссылка, Выборка.Ссылка);
КонецЦикла;

Для каждого т Из ТЗ Цикл
    Если Стру.Получить(т.СчетДт) = Неопределено Тогда
        Отказ = Истина;
    КонецЕсли;
КонецЦикла;