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

1. D_e_X_T_e_R 572 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 572 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 156 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 572 11.10.18 18:55 Сейчас в теме
(4)Не совсем понял мысль, а что это даст в моем случае?
В зависимости от выбранного счета будет ставится определенная группа фин учета, там порядка 15 вариаций.
7. D_e_X_T_e_R 572 11.10.18 18:57 Сейчас в теме
У меня возникла мысль сначала написать обработку, плюс создать в номенклатуре в УПП доп реквизит счет, обработкой заполнить у номенклатуры этот счет, а потом переносить уже через КД.
9. acanta 11.10.18 19:01 Сейчас в теме
А еще можно сделать СКД, в вычисляемое поле загнать формулу из типового модуля с определением счета учета, сохранить в файл и подхватывать этот файл в конвертации, а таблицу получать при помощи компоновщика данных. Медленнее, но в полном соответствии с заданием.
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)