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