Простите отче, ибо я согрешил

1. D_e_X_T_e_R 573 11.10.18 18:26 Сейчас в теме
Доброго времени. Сразу скажу, что каюсь, виноват, нет мне прощения...я сделал запросы в циклах!
Просто не знаю, как сделать по другому.

Суть в следующем:

1) В УПП есть справочник номенклатура, у элементов номенклатуры или у ее родителя, или у родителя родителя (6 уровней максимум) есть счета учета номенклатуры(Регистры сведений с ссылкой на счета бу).

2) Все это дело нужно перенести в ERP и в зависимости от счета, выбрать нужное условие заполнение другого реквизита.

3) Использую КД. Реквизит есть только в приемнике, соответственно указал его в приемнике и перед выгрузкой написал запрос:

ЭлОтбора = Источник.Ссылка; //Ссылка на номенклатуру

Запрос = Новый Запрос;
Запрос.Текст = 
"ВЫБРАТЬ
|	СчетаУчетаНоменклатуры.СчетУчетаБУ КАК СЧ
|ИЗ
|	РегистрСведений.СчетаУчетаНоменклатуры КАК СчетаУчетаНоменклатуры
|ГДЕ
|	СчетаУчетаНоменклатуры.Номенклатура = &Номенклатура";

Запрос.УстановитьПараметр("Номенклатура", ЭлОтбора);

Результат = Запрос.Выполнить();

Выборка = Результат.Выбрать();
Выборка.Следующий();


Счет = Выборка.СЧ;

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


Все отрабатывает, но медленно.

Смысл в чем, у номенклатуры счета учета могут быть не заполнены, но заполнены у родителя или у родителя родителя, ну как и писал собственно.

В КД еще учусь, поэтому прошу помощи, как сделать правильно? Запрос в цикле - это зло! Но другого решения пока не вижу.
+
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. TODD22 18 11.10.18 18:36 Сейчас в теме
(1)Если запрос в цикле то хотя бы не пере создавать объект Запрос каждый раз в цикле и текст запроса вынести за цикл.
То есть в цикле оставить только установку параметра и само выполнение запроса.

То есть не писать Запрос = Новый Запрос в цикле, один раз создал объект запрос и работай с ним. текст запроса то же вынести за цикл, что бы анализатор каждый раз не отрабатывал.
А так посмотреть как можно одним запросом получить все данные, затолкать их в ТЗ, потом искать в ТЗ, а не чтением из базы. Может ещё есть какие то варианты.
D_e_X_T_e_R; +1
5. D_e_X_T_e_R 573 11.10.18 18:51 Сейчас в теме
(2)
А так посмотреть как можно одним запросом получить все данные, затолкать их в ТЗ, потом искать в ТЗ, а не чтением из базы. Может ещё есть какие то варианты.


Было бы здорово, но как отобрать одним запросом счета по номенклатуре или до 6 уровня родителю?
+
8. TODD22 18 11.10.18 18:59 Сейчас в теме
(5)Поискать глобальным поиском по имени регистра запросы и посмотреть может где то попадётся пример того как определяются счета в типовой.
+
10. Dream_kz 129 11.10.18 19:51 Сейчас в теме
(1)
я сделал запросы в циклах!

Открою тайну, только тсс, на ноль делить можно, если понимаешь что получится в итоге и зачем это нужно.

По вопросу: КД под рукой нету, проверить не могу, идея примерно следующая, где нибудь в глобальных обработчиках перед выгрузкой делаем запрос ко всем счетам учета, грузим в тз и кэшируем в параметрах, затем уже в ПКО обращаемся к этой тз из параметров, и также циклом, но уже ищем нужные данные в тз.
Климов Сергей; +1
12. vadim1011985 99 12.10.18 02:00 Сейчас в теме
(1) Если логично подумать то : раз в УПП есть регистр Счета учета Номенклатуры , значит есть функция которая заполняет эти счета в документах - почему бы не найти эту функция и взять за основу она ведь экспортная и ее можно использовать и не изобретать свой велосипед ?
alex-l19041; +1
13. Fox-trot 157 12.10.18 02:24 Сейчас в теме
(1)
ЭлОтбора = ЭлОтбора.Родитель;

самое простое это прервать цикл
Если ПустаяСтрока(ЭлОтбора) Тогда
 Прервать;
КонецЕсли:
+
3. TODD22 18 11.10.18 18:38 Сейчас в теме
   Запрос = Новый Запрос;
        Запрос.Текст = 
        "ВЫБРАТЬ                                                                         
        |    СчетаУчетаНоменклатуры.СчетУчетаБУ КАК СЧ,
        |   СчетаУчетаНоменклатуры.СчетДоходовОтРеализацииБУ КАК СЧД
        |ИЗ
        |    РегистрСведений.СчетаУчетаНоменклатуры КАК СчетаУчетаНоменклатуры
        |ГДЕ
        |    СчетаУчетаНоменклатуры.Номенклатура = &Номенклатура";

 Пока Счет <> Неопределено ИЛИ Сч = 7 Цикл
        //Запрос в цикле. Докатился!
        
        ЭлОтбора = ЭлОтбора.Родитель;
        
    
        
        Запрос.УстановитьПараметр("Номенклатура", ЭлОтбора);
        
        Результат = Запрос.Выполнить();
        
        Выборка = Результат.Выбрать();
        Выборка.Следующий();
        
        
        Счет = Выборка.СЧ;
        
        Сч = Сч + 1;
        
    КонецЦикла;    
Показать
+
4. acanta 11.10.18 18:45 Сейчас в теме
Куда в ЕРП вы это планируете это применить? Группа фин.учета у номенклатуры одна, в ней счета разные есть по ситуации.
Будете ли вы создавать разные элементы номенклатуры под каждый возможный счет учета?
Я бы сделала один запрос к бух.итогам, на каких счетах ТМЦ фактически числится.
+
6. D_e_X_T_e_R 573 11.10.18 18:55 Сейчас в теме
(4)Не совсем понял мысль, а что это даст в моем случае?
В зависимости от выбранного счета будет ставится определенная группа фин учета, там порядка 15 вариаций.
+
7. D_e_X_T_e_R 573 11.10.18 18:57 Сейчас в теме
У меня возникла мысль сначала написать обработку, плюс создать в номенклатуре в УПП доп реквизит счет, обработкой заполнить у номенклатуры этот счет, а потом переносить уже через КД.
+
9. acanta 11.10.18 19:01 Сейчас в теме
А еще можно сделать СКД, в вычисляемое поле загнать формулу из типового модуля с определением счета учета, сохранить в файл и подхватывать этот файл в конвертации, а таблицу получать при помощи компоновщика данных. Медленнее, но в полном соответствии с заданием.
+
Внимание! Тема сдана в архив

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот