Есть вот такой запрос
Есть Справочник Взаимозаменяемость в котором содержатся группы товаров.Мне нужно для каждого найденного товара в запросе достать группу товаров в которой он состоит из справочника Взаимозаменяемость.Как это можно сделать? В запросе или уже работать с ТЗ в которую я выгружаю результат запроса. Если можно то с примерным кодом пожалуйста.
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса=" //{{ЗАПРОС(Сформировать)
|Период с Дата1 по Дата2;
|Товар=Регистр.ОстаткиТоваров.Товар;
|Произв=Регистр.ОстаткиТоваров.Товар.Производитель;
|Кол=Регистр.ОстаткиТоваров.Количество;
|Группировка Товар упорядочить по Товар.Код,Товар.Наименование без групп;
|Группировка Произв;
|Группировка Кол;
|Функция Расх=Расход(Кол);
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
ТабРасх1 = СоздатьОбъект("ТаблицаЗначений");
ТабРасх1.НоваяКолонка("Код");
ТабРасх1.НоваяКолонка("Расход1");
ТабРасх1.НоваяКолонка("Расход2");
ТабРасх1.НоваяКолонка("Расход3");
ТабРасх1.НоваяКолонка("Остаток");
Пока Запрос.Группировка(1)=1 Цикл
Код=Запрос.ЗначениеУпорядочивания(1,1);
Товар=Запрос.ЗначениеУпорядочивания(1,2);
СпрНом.НайтиПоКоду(Код);
Ост=СпрНом.ТекущийЭлемент();
ТекОстаток= Рег.СводныйОстаток(Ост,,,"Количество");
НомСтр1=0;
ТабРасх2.НайтиЗначение(СокрЛП(Строка(Код)),НомСтр1,1);
Если НомСтр1>0 Тогда
КолПродаж2=ТабРасх2.ПолучитьЗначение(НомСтр1,2);
Иначе КолПродаж2="";
КонецЕсли;
НомСтр1="";
НомСтр2=0;
ТабРасх3.НайтиЗначение(СокрЛП(Строка(Код)),НомСтр2,1);
Если НомСтр2>0 Тогда
КолПродаж3=ТабРасх3.ПолучитьЗначение(НомСтр2,2);
Иначе КолПродаж3="";
КонецЕсли;
НомСтр2="";
Кол=0;
Пока Запрос.Группировка(2)=1 Цикл
Пока Запрос.Группировка(3)=1 Цикл
Кол=Кол+Запрос.Расх;
КонецЦикла;
КонецЦикла;
ТабРасх1.НоваяСтрока();
ТабРасх1.Код=СокрЛП(Строка(Код));
ТабРасх1.Расход1=Кол;
ТабРасх1.Расход2=КолПродаж2;
ТабРасх1.Расход3=КолПродаж3;
ТабРасх1.Остаток=ТекОстаток;
КонецЦикла;
ПоказатьЕсть Справочник Взаимозаменяемость в котором содержатся группы товаров.Мне нужно для каждого найденного товара в запросе достать группу товаров в которой он состоит из справочника Взаимозаменяемость.Как это можно сделать? В запросе или уже работать с ТЗ в которую я выгружаю результат запроса. Если можно то с примерным кодом пожалуйста.
По теме из базы знаний
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Пытаюсь сделать вот так
Но нечего не выходит...
СсылкаТовар = ТабРасх1.Код;
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
СпрВзаимозаменяемость.ВыбратьЭлементы();
Пока СпрВзаимозаменяемость.ПолучитьЭлемент() = 1 Цикл
СсылкаАналог = СпрВзаимозаменяемость.Товар.Код;
Стр = 0;
Если ТабРасх1.НайтиЗначение(СсылкаАналог,Стр,"Код") = 1 тогда
// Добавим строку в строку в таблицу
ТабРасх1.НоваяСтрока();
ТабРасх1.Код = СсылкаАналог;
ТабРасх1.Расход1=0;
ТабРасх1.Расход2=ТабРасх2.ПолучитьЗначение(Стр,"Расх");
ТабРасх1.Расход3=ТабРасх3.ПолучитьЗначение(Стр,"Расх");
ТабРасх1.Остаток = ТЗ.ПолучитьЗначение(Стр,"КонО");
КонецЕсли;
КонецЦикла;
ПоказатьНо нечего не выходит...
(2) ksardas, что у Вас в качестве параметра в методе СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар) ?
Должно быть выражение со значением элемента справочника-владельца. Если у Вас код элемента, то сначала нужно найти владельца, например, методом НайтиПоКоду, а потом уже передавть его, как параметр.
PS. В тексте модуля СсылкаТовар = ТабРасх1.Код;
Должно быть выражение со значением элемента справочника-владельца. Если у Вас код элемента, то сначала нужно найти владельца, например, методом НайтиПоКоду, а потом уже передавть его, как параметр.
PS. В тексте модуля СсылкаТовар = ТабРасх1.Код;
(6) Должно быть выражение со значением элемента справочника-владельца.
Подробней не могу. Нечего добавить.
(8) В (1) есть такой фрагмент кода:
СпрНом.НайтиПоКоду(Код);
Ост=СпрНом.ТекущийЭлемент();
ТекОстаток= Рег.СводныйОстаток(Ост,,,"Количество");
В методе СводныйОстаток Вы первым параметром использовали значение - элемент справочника, а не код этого элемента. А элемент перед этим нашли по коду.
То же самое нужно проделать в (2), т.е. сначала найти сам элемент по коду, и его уже использовать в ИспользоватьВладельца. Всё есть в описании метода: и список параметров, и их типы и что можно получить в результате применения метода.
Если Вы хотите реальной помощи, то для начала поподробнее напишите о структуре данных. Судя по всему конфигурация не типовая. Вот и опишите ваш справочник Товары (Номенклатура) и справочник Взаимозаменяемость. Объясните, что Вы имеете в виду под термином "группы товаров" в спр.Взаимозаменяемость....
А тогда уже можно пытаться Вам помочь...
А тогда уже можно пытаться Вам помочь...
Конфигурация Альфа-Авто: Автозапчасти+Автосервис.Версия 2.0
В справочнике номенклатура находятся все детали , наименование ,код и тд.В справочники Взаимозаменяемость содержатся аналоги деталей. Например если нужной мне детали нет в наличие я обращаюсь к справочнику взаимозаменяемость и он мне выдает список аналогичных деталей.Эти детали из списка мне и нужны для каждой детали в запросе. Объяснил как смог если что непонятно буду уточнять =)
В справочнике номенклатура находятся все детали , наименование ,код и тд.В справочники Взаимозаменяемость содержатся аналоги деталей. Например если нужной мне детали нет в наличие я обращаюсь к справочнику взаимозаменяемость и он мне выдает список аналогичных деталей.Эти детали из списка мне и нужны для каждой детали в запросе. Объяснил как смог если что непонятно буду уточнять =)
Жаль, что под рукой нет Вашей конфигурации.
ОК, теперь поясните, как связаны справочники Номенклатура и Взаимозаменяемость. Скорее всего Спр.Взаимозаменяемость подчинен спр.Номенклатура. Так?
И последнее - напишите реквизиты спр.Взаимозаменяемость.
Полагаю, там должен быть реквизит "Замена" (или с похожим названием) с типом "спр.Номенклатура"...
ОК, теперь поясните, как связаны справочники Номенклатура и Взаимозаменяемость. Скорее всего Спр.Взаимозаменяемость подчинен спр.Номенклатура. Так?
И последнее - напишите реквизиты спр.Взаимозаменяемость.
Полагаю, там должен быть реквизит "Замена" (или с похожим названием) с типом "спр.Номенклатура"...
Пробовал , пробовал не чего не получилось. Вопрос где мне надо находить текущий элемент в запросе и заносить его в тз или уже после запроса?
(11) Где находить, это "хозяин-барин". Пока будем при изменении кода из (2) отталкиваться от того кода, который в (1)
Ещё раз подробнее:
Сейчас в (2)
СсылкаТовар = ТабРасх1.Код;
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
А нужно:
СпрНоменклатура=СоздатьОбъект("Справочник.Номенклатура");
СпрНоменклатура.НайтиПоКоду(ТабРасх1.Код);
СсылкаТовар = СпрНоменклатура.ТекущийЭлемент();
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
Весь код не вижу, поэтому написал так.
Но если у Вас в той же процедуре уже было ранее СпрНом=СоздатьОбъект("Справочник.Номенклатура");, тогда можно на одну строку короче:
СпрНом.НайтиПоКоду(ТабРасх1.Код);
СсылкаТовар = СпрНом.ТекущийЭлемент();
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
СпрНом.НайтиПоКоду(ТабРасх1.Код);
СсылкаТовар = СпрНом.ТекущийЭлемент();
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
СпрВзаимозаменяемость.ВыбратьЭлементы();
Пока СпрВзаимозаменяемость.ПолучитьЭлемент() =1 Цикл
СсылкаАналог = СпрВзаимозаменяемость.Товар;
Стр = 0;
Если ТабРасх1.НайтиЗначение(СсылкаАналог,Стр,"Код") = 1 тогда
// Добавим строку в строку в таблицу
ТабРасх1.НоваяСтрока();
ТабРасх1.Код = СсылкаАналог.Код;
ТабРасх1.Расход1=0;
КонецЕсли;
КонецЦикла;
ПоказатьНе добавляет строки в тз хоть убей ...
Если ТабРасх1.НайтиЗначение(СсылкаАналог,Стр,"Код") = 1 тогда
У Вас опять смешение понятий Элемент справочника (тип "Справочник") и атрибут справочника (в данном случае атрибут Код с типом "Строка" или "Число"). Вы пытаетесь найти строку таблицы значений по колонке "Код", а первым параметром указываете не код элемента номенклатуры, а сам элемент.
Сдается мне, что кроме этой "технической" ошибки есть и что-то неправильное в логике формирования таблицы. Допустим перебираются строки таблицы ТабРасх1. По коду в очередной строке находится соответствующий товар. Если у него есть аналоги, то идет перебор аналогов. При этом если код аналога уже есть в ТабРасх1, то он почему-то ещё раз добавляется в ТабРасх1 в новую строку. Если даже "повезёт" (используется, например, ПолучитьСтрокуПоНомеру, вместо ВыбратьСтроки - ПолучитьСтроку) и выборка по таблице ТабРасх1 не собъется, то она дойдет до этой новой строки, опять обратится к аналогам этого товара, опять добавит строку и т.п., т.е. пойдет по кругу.
Прежде чем писать тонны кода, попробуйте на бумаге самостоятельно проделать то, что Вы хотите реализовать в коде.
И в теме можно вопрос задать не по каким-то отдельно выхваченным кускам кода, а сформулировать задачу на примере, вроде этого:
Исходные данные:
ТабРасх1: Код Расх
Строка1 1 20
Строка2 2 25
У товара с кодом 1 аналоги с кодом 2 и 3
У товара с кодом 2 аналоги с кодом 1 и 4
Нужно получить:
ТабРасх1: Код Расх
Строка1 1 20
Строка2 2 25
Строка3 3 0
Строка4 4 0
Немного пораскинув мозгами, и покопавшись в конфигураторе. Решил изменить немного задачу а именно:
В ТЗ я добавил Колонку ЕТК(Номер детали).Причем для каждой детали в Справочники Взаимозаменяемость ЕТК одинаковый для всех деталей одной "Группы" а коды разные. Так вот сравнивая ЕТК деталей из ТЗ и СпрВзаимозаменяемость надо все совпадающие детали внести в ТЗ.
Получилось:
Как то так =))
В ТЗ я добавил Колонку ЕТК(Номер детали).Причем для каждой детали в Справочники Взаимозаменяемость ЕТК одинаковый для всех деталей одной "Группы" а коды разные. Так вот сравнивая ЕТК деталей из ТЗ и СпрВзаимозаменяемость надо все совпадающие детали внести в ТЗ.
СпрВзаимозаменяемость
ТабРасх1: Код Расх Етк Код Етк
Строка1 1 20 111 5 111
Строка2 2 25 222 6 555
Строка3 3 10 333 7 888
Строка4 4 5 444 8 444
Получилось:
ТабРасх1: Код Расх Етк
Строка1 1 20 111
Строка2 2 25 222
Строка3 3 10 333
Строка4 4 5 444
Строка5 8 444
Строка6 5 111
ПоказатьКак то так =))
(15) ksardas, пробуй так:
Считал, что Код - числовой. Если строка, то возможно придется кое-где добавить СокрП (ТекЕТК = СокрП(ТЗрасх1.ЕТК), СпрНом.НайтиПоКоду(СокрП(ТабРасх1.Код)) и т.д.)
ТабАналоги=СоздатьОбъект("ТаблицаЗначений");
//создается пустая таблица такой же структуры, как и ТабРасх1
ТабРасх1.Выгрузить(ТабАналоги);
ТабАналоги.УдалитьСтроки();
//
//заполнение ТабАналоги (эл-тами подчин. спр-ка с совпадающими ЕТК)
ТабРасх1.ВыбратьСтроки();
Пока ТабРасх1.ПолучитьСтроку()=1 Цикл
ТекЕТК = ТЗрасх1.ЕТК;
СпрНом.НайтиПоКоду(ТабРасх1.Код);
СсылкаТовар = СпрНом.ТекущийЭлемент();
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
СпрВзаимозаменяемость.ВыбратьЭлементы();
Пока СпрВзаимозаменяемость.ПолучитьЭлемент() =1 Цикл
Если СпрВзаимозаменяемость.ЕТК = ТекЕТК Тогда
// или Если СпрВзаимозаменяемость.Товар.ЕТК = ТекЕТК Тогда
// в зависимости от структуры справочника аналогов
ТабАналоги.НоваяСтрока();
ТабАналоги.Код = СпрВзаимозаменяемость.Товар.Код;
ТабАналоги.ЕТК = ТекЕТК;
КонецЕсли;
КонецЦикла;
КонецЦикла;
ТабАналоги.Свернуть("Код,ЕТК","Расх");
// добавление строк ТабАналоги в таблицу ТабРасх1
// к N строкам ТабРасх1 добавляем M пустых строк (по количеству строк в ТабАналоги)
ТабРасх1.КоличествоСтрок(ТабРасх1.КоличествоСтрок()+ТабАналоги.КоличествоСтрок());
// заполнение таблицы ТабРасх1 строками из ТабАналоги, начиная с N+1-й строки до конца таблицы
ТабРасх1.Заполнить(ТабАналоги,ТабРасх1.КоличествоСтрок()-ТабАналоги.КоличествоСтрок()+1,ТабРасх1.КоличествоСтрок());
ПоказатьСчитал, что Код - числовой. Если строка, то возможно придется кое-где добавить СокрП (ТекЕТК = СокрП(ТЗрасх1.ЕТК), СпрНом.НайтиПоКоду(СокрП(ТабРасх1.Код)) и т.д.)
(16) Pari, Спасибо огромное все отлично находит, но небольшой косяк с заполнением результирующей таблицы.Заполняю Через ПолучитьСтрокуПоНомеру.
Для тех позиции для которых нет количества или остатка он дублирует ЕТК или код а мне надо чтоб были пустые строки или нули
Код Наименование Кол Етк Остаток
00009 ламп 12v 5w 1 07509063578 0
00013 предохран 80а 1 07119978840 9
00019 ламп 12v 21w 07509063574 07509063574 00019
00065 загл крыш двиг м50,52,54 2 11121726089 10
00085 под крыш клап м50,52,54 1 11121730356 5
00233 клапан гидроблока акпп 722.6 1 1402770435- 0
00300 мех нат рем м50,52 1 11281427252 15
00331 датч кол е65 пер 1 34356778037 73
ПоказатьДля тех позиции для которых нет количества или остатка он дублирует ЕТК или код а мне надо чтоб были пустые строки или нули
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот