1. yadexter1986 352 11.10.18 18:26 Сейчас в теме

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

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

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


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

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

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

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

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

Вакансии

Программист 1С
Салехард
зарплата от 80 000 руб. до 200 000 руб.
Полный день

Программист 1С
Казань
Полный день

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

Ведущий программист 1С
Екатеринбург
зарплата от 100 000 руб.
Полный день

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