Имя: Пароль:
1C
1С v8
Оптимизация запросов
,
0 Данил Сергеевич
 
13.06.13
00:14
Навоял такой код, во внешней обработке, который заполняет ревкизит "Проект" во всех документах определенного типа, с запросами сегодня первый день работаю, знаю, что как то это все дело можно оптимизировать, а вот как не могу понять... подскажите как запросы объединить или типо того... кто разбирается?

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


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


Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Док = Выборка.Ссылка.ПолучитьОбъект();
       Для каждого Строка Из Док.РасшифровкаПлатежа Цикл
           Строка.Проект = Строка.ДоговорКонтрагента.ОсновнойПроект;
       КонецЦикла;
   Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;
1 Данил Сергеевич
 
13.06.13
00:14
///////////////////////////РАСХОДНЫЙ КАССОВЫЙ ОРДЕР////////////////////
2 Данил Сергеевич
 
13.06.13
00:15
///////////////////////////РАСХОДНЫЙ КАССОВЫЙ ОРДЕР////////////////////
 Запрос = Новый Запрос;
    Запрос.Текст = " ВЫБРАТЬ
       |    Ссылка
       |ИЗ
       |    Документ.РасходныйКассовыйОрдер КАК РасходныйКассовыйОрдер
       |ГДЕ
       |    РасходныйКассовыйОрдер.Организация = &Организация
       |    И РасходныйКассовыйОрдер.Дата МЕЖДУ &НачДата И &КонДата
       |    И РасшифровкаПлатежа.Проект =  НЕОПРЕДЕЛЕНО
       |   И РасходныйКассовыйОрдер.Проведен = ИСТИНА";
       

Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("НачДата", ДатаНачалаПериода);
Запрос.УстановитьПараметр("КонДата", КонецДня(ДатаКонцаПериода));


Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Док = Выборка.Ссылка.ПолучитьОбъект();
       Для каждого Строка Из Док.РасшифровкаПлатежа Цикл
           Строка.Проект = Строка.ДоговорКонтрагента.ОсновнойПроект;
       КонецЦикла;
   Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;

//////////////////////////////ПРИХОДНЫЙ КАССОВЫЙ ОРДЕР////////////////////
 Запрос = Новый Запрос;
    Запрос.Текст = " ВЫБРАТЬ
       |    Ссылка
       |ИЗ
       |    Документ.ПриходныйКассовыйОрдер   КАК ПриходныйКассовыйОрдер
       |ГДЕ
       |    ПриходныйКассовыйОрдер.Организация = &Организация
       |    И ПриходныйКассовыйОрдер.Дата МЕЖДУ &НачДата И &КонДата
       |    И РасшифровкаПлатежа.Проект =  НЕОПРЕДЕЛЕНО
       |   И ПриходныйКассовыйОрдер.Проведен = ИСТИНА";

       

Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("НачДата", ДатаНачалаПериода);
Запрос.УстановитьПараметр("КонДата", КонецДня(ДатаКонцаПериода));


Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Док = Выборка.Ссылка.ПолучитьОбъект();
       Для каждого Строка Из Док.РасшифровкаПлатежа Цикл
           Строка.Проект = Строка.ДоговорКонтрагента.ОсновнойПроект;
       КонецЦикла;
   Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;

/////////////////////////////АКТ ОБ ОКАЗАНИИ ПРОИЗВОДСТВЕННЫХ УСЛУГ///////////////////
 Запрос = Новый Запрос;
    Запрос.Текст = " ВЫБРАТЬ
       |    Ссылка
       |ИЗ
       |    Документ.АктОбОказанииПроизводственныхУслуг КАК АктОбОказанииПроизводственныхУслуг
       |ГДЕ
       |    АктОбОказанииПроизводственныхУслуг.Организация = &Организация
       |    И АктОбОказанииПроизводственныхУслуг.Дата МЕЖДУ &НачДата И &КонДата
       |    И Проект =  НЕОПРЕДЕЛЕНО
       |   И АктОбОказанииПроизводственныхУслуг.Проведен = ИСТИНА";

       

Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("НачДата", ДатаНачалаПериода);
Запрос.УстановитьПараметр("КонДата", КонецДня(ДатаКонцаПериода));


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

Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("НачДата", ДатаНачалаПериода);
Запрос.УстановитьПараметр("КонДата", КонецДня(ДатаКонцаПериода));


Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
    Док = Выборка.Ссылка.ПолучитьОбъект();
       
       Док.Проект = Док.ДоговорКонтрагента.ОсновнойПроект;
   
   Док.Записать(РежимЗаписиДокумента.Проведение);
КонецЦикла;


Сообщить("Операция проведена успешно!");
КонецПроцедуры




Вот и всё. Конфигурация УПП
4 Reaper_1c
 
13.06.13
00:21
В предприятии идешь: Сервис - Универсальные обработки - групповая обработка справочников и документов. Дальше по интерфейсу разберешься.
5 hhhh
 
13.06.13
00:23
|    И Проект =  НЕОПРЕДЕЛЕНО

проект там никогда не будет неопределено. Сравнивайте с пустой ссылкой.
6 viktor_vv
 
13.06.13
00:24
Объединить Все.

Ну и Основной проект из договора в запросе получай, чтобы в цикле через две точки не тянуть.
7 Данил Сергеевич
 
13.06.13
00:24
(4) Раз такой умный, то попробуй сделать это сам, а когда будешь пробывать поймешь почему надо делать свою внешнюю обработку...
8 Данил Сергеевич
 
13.06.13
00:26
(5) Пробывал по всякому, но с запросами совсем не знаком по этому сравнивать с пустой ссылкой не получилось, а как у меня есть всё работает, хотя и понимаю что где то может не правильно отыграть( если например тип будет определён а значение стоять не будет). Если скажишь правильный вариант буду признателен)
9 hhhh
 
13.06.13
00:26
(7) не, если проектов меньше 10, твоя внешняя обработка в заднице, групповая обработка рулит. (4) прав.
10 hhhh
 
13.06.13
00:27
(8) = ЗНАЧЕНИЕ(Справочник.Проекты.ПустаяСсылка)
11 Данил Сергеевич
 
13.06.13
00:27
(9) В ней не задать значение другого реквизита
12 hhhh
 
13.06.13
00:28
(11) как это не задать? Не гони.
13 Данил Сергеевич
 
13.06.13
00:34
(6) Про договор понятно, а вот про Объединить всё нет(
14 mistеr
 
13.06.13
00:38
(7) И почему же?
15 mistеr
 
13.06.13
00:39
(7) Как вариант, в продвинутой консоли запросов "Выполнить алгоритм"
16 mistеr
 
13.06.13
00:39
(11) В настройки загляни...
17 Данил Сергеевич
 
13.06.13
00:47
(16) Там можно менять реквизит на значение... а как прописать чтоб это значение бралось с другого реквизита???
18 Андрей Федотов
 
13.06.13
01:07
Даниил, напишите лично.
В запросе в конструкторе см закладку Объединение. Вам нужно Все ваши маленькие запросы объединить в один и смотреть только за тем, чтобы количество выбираемых полей в каждом запросе было одинаковым.
Или второй вариант - сделать цикл по виду объекта.
19 Данил Сергеевич
 
13.06.13
01:13
(18) Спасибо за желание, но я помоему разобрался, да эксперементировать уже поздно...пора спать...
20 Reaper_1c
 
13.06.13
02:00