Вопрос по Запросу и Справочнику.

1. ksardas 22.02.12 08:28 Сейчас в теме
Есть вот такой запрос
  Запрос=СоздатьОбъект("Запрос");
	ТекстЗапроса=" //{{ЗАПРОС(Сформировать)
	|Период с Дата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.Остаток=ТекОстаток;
        КонецЦикла; 
Показать


Есть Справочник Взаимозаменяемость в котором содержатся группы товаров.Мне нужно для каждого найденного товара в запросе достать группу товаров в которой он состоит из справочника Взаимозаменяемость.Как это можно сделать? В запросе или уже работать с ТЗ в которую я выгружаю результат запроса. Если можно то с примерным кодом пожалуйста.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ksardas 22.02.12 09:13 Сейчас в теме
Пытаюсь сделать вот так
   СсылкаТовар = ТабРасх1.Код;
		СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
		СпрВзаимозаменяемость.ВыбратьЭлементы();
		Пока СпрВзаимозаменяемость.ПолучитьЭлемент() = 1 Цикл

			СсылкаАналог = СпрВзаимозаменяемость.Товар.Код;   
			Стр = 0;
				Если ТабРасх1.НайтиЗначение(СсылкаАналог,Стр,"Код") = 1 тогда
					// Добавим строку в строку в таблицу
					ТабРасх1.НоваяСтрока();
					ТабРасх1.Код = СсылкаАналог; 
					ТабРасх1.Расход1=0;
					ТабРасх1.Расход2=ТабРасх2.ПолучитьЗначение(Стр,"Расх");
					ТабРасх1.Расход3=ТабРасх3.ПолучитьЗначение(Стр,"Расх");
					ТабРасх1.Остаток = ТЗ.ПолучитьЗначение(Стр,"КонО");
				КонецЕсли; 
				КонецЦикла;
Показать

Но нечего не выходит...
6. Pari 22.02.12 14:46 Сейчас в теме
(2) ksardas, что у Вас в качестве параметра в методе СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар) ?
Должно быть выражение со значением элемента справочника-владельца. Если у Вас код элемента, то сначала нужно найти владельца, например, методом НайтиПоКоду, а потом уже передавть его, как параметр.

PS. В тексте модуля СсылкаТовар = ТабРасх1.Код;
8. ksardas 22.02.12 14:52 Сейчас в теме
(6) Pari, Параметр СпрВзаимозаменяемость.ИспользоватьВладельца(ТабРасх.Код) Где ТабРасх1 это ТЗ а код Колонка в которой содержится Товар.код. Может быть я не правильно пользуюсь методом можно поподробней =))
9. Pari 22.02.12 15:04 Сейчас в теме
(6) Должно быть выражение со значением элемента справочника-владельца.

Подробней не могу. Нечего добавить.
(8) В (1) есть такой фрагмент кода:
СпрНом.НайтиПоКоду(Код);
Ост=СпрНом.ТекущийЭлемент();
ТекОстаток= Рег.СводныйОстаток(Ост,,,"Количество");

В методе СводныйОстаток Вы первым параметром использовали значение - элемент справочника, а не код этого элемента. А элемент перед этим нашли по коду.
То же самое нужно проделать в (2), т.е. сначала найти сам элемент по коду, и его уже использовать в ИспользоватьВладельца. Всё есть в описании метода: и список параметров, и их типы и что можно получить в результате применения метода.
10. ksardas 22.02.12 15:17 Сейчас в теме
(9) Pari, Спасибо буду пробовать.
3. IgorI 22.02.12 09:50 Сейчас в теме
Если Вы хотите реальной помощи, то для начала поподробнее напишите о структуре данных. Судя по всему конфигурация не типовая. Вот и опишите ваш справочник Товары (Номенклатура) и справочник Взаимозаменяемость. Объясните, что Вы имеете в виду под термином "группы товаров" в спр.Взаимозаменяемость....
А тогда уже можно пытаться Вам помочь...
4. ksardas 22.02.12 10:04 Сейчас в теме
Конфигурация Альфа-Авто: Автозапчасти+Автосервис.Версия 2.0
В справочнике номенклатура находятся все детали , наименование ,код и тд.В справочники Взаимозаменяемость содержатся аналоги деталей. Например если нужной мне детали нет в наличие я обращаюсь к справочнику взаимозаменяемость и он мне выдает список аналогичных деталей.Эти детали из списка мне и нужны для каждой детали в запросе. Объяснил как смог если что непонятно буду уточнять =)
5. IgorI 22.02.12 14:02 Сейчас в теме
Жаль, что под рукой нет Вашей конфигурации.
ОК, теперь поясните, как связаны справочники Номенклатура и Взаимозаменяемость. Скорее всего Спр.Взаимозаменяемость подчинен спр.Номенклатура. Так?
И последнее - напишите реквизиты спр.Взаимозаменяемость.
Полагаю, там должен быть реквизит "Замена" (или с похожим названием) с типом "спр.Номенклатура"...
7. ksardas 22.02.12 14:47 Сейчас в теме
Да Спр.Взаимозаменяемость подчинен Спр.Номенклатура. Реквизит только один Товар с типом справочник номенклатура.
11. ksardas 27.02.12 08:49 Сейчас в теме
Пробовал , пробовал не чего не получилось. Вопрос где мне надо находить текущий элемент в запросе и заносить его в тз или уже после запроса?
12. Pari 27.02.12 13:18 Сейчас в теме
Пробовал , пробовал не чего не получилось. Вопрос где мне надо находить текущий элемент в запросе и заносить его в тз или уже после запроса?

(11) Где находить, это "хозяин-барин". Пока будем при изменении кода из (2) отталкиваться от того кода, который в (1)
Ещё раз подробнее:
Сейчас в (2)
СсылкаТовар = ТабРасх1.Код;
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);

А нужно:
СпрНоменклатура=СоздатьОбъект("Справочник.Номенклатура");
СпрНоменклатура.НайтиПоКоду(ТабРасх1.Код);
СсылкаТовар = СпрНоменклатура.ТекущийЭлемент();
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);

Весь код не вижу, поэтому написал так.
Но если у Вас в той же процедуре уже было ранее СпрНом=СоздатьОбъект("Справочник.Номенклатура");, тогда можно на одну строку короче:
СпрНом.НайтиПоКоду(ТабРасх1.Код);
СсылкаТовар = СпрНом.ТекущийЭлемент();
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
13. ksardas 27.02.12 16:21 Сейчас в теме
СпрНом.НайтиПоКоду(ТабРасх1.Код);
СсылкаТовар = СпрНом.ТекущийЭлемент();
СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
		СпрВзаимозаменяемость.ВыбратьЭлементы();
		Пока СпрВзаимозаменяемость.ПолучитьЭлемент() =1  Цикл

			СсылкаАналог = СпрВзаимозаменяемость.Товар;   
			Стр = 0;
				Если ТабРасх1.НайтиЗначение(СсылкаАналог,Стр,"Код") = 1 тогда
					// Добавим строку в строку в таблицу
					ТабРасх1.НоваяСтрока();
					ТабРасх1.Код = СсылкаАналог.Код; 
					ТабРасх1.Расход1=0;
				КонецЕсли; 
			КонецЦикла;   
Показать

Не добавляет строки в тз хоть убей ...
14. Pari 27.02.12 18:05 Сейчас в теме
Если ТабРасх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
15. ksardas 28.02.12 08:45 Сейчас в теме
Немного пораскинув мозгами, и покопавшись в конфигураторе. Решил изменить немного задачу а именно:
В ТЗ я добавил Колонку ЕТК(Номер детали).Причем для каждой детали в Справочники Взаимозаменяемость ЕТК одинаковый для всех деталей одной "Группы" а коды разные. Так вот сравнивая ЕТК деталей из ТЗ и СпрВзаимозаменяемость надо все совпадающие детали внести в ТЗ.
                           СпрВзаимозаменяемость
ТабРасх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      
Показать

Как то так =))
16. Pari 28.02.12 13:18 Сейчас в теме
(15) ksardas, пробуй так:
ТабАналоги=СоздатьОбъект("ТаблицаЗначений");
	//создается пустая таблица такой же структуры, как и ТабРасх1
	ТабРасх1.Выгрузить(ТабАналоги);
	ТабАналоги.УдалитьСтроки();
	//
	//заполнение ТабАналоги (эл-тами подчин. спр-ка с совпадающими ЕТК)
	ТабРасх1.ВыбратьСтроки();
	Пока ТабРасх1.ПолучитьСтроку()=1 Цикл
		ТекЕТК = ТЗрасх1.ЕТК;
		СпрНом.НайтиПоКоду(ТабРасх1.Код);
		СсылкаТовар = СпрНом.ТекущийЭлемент();
		СпрВзаимозаменяемость.ИспользоватьВладельца(СсылкаТовар);
		СпрВзаимозаменяемость.ВыбратьЭлементы();
		Пока СпрВзаимозаменяемость.ПолучитьЭлемент() =1  Цикл
	  		Если СпрВзаимозаменяемость.ЕТК = ТекЕТК Тогда
	  		// или Если СпрВзаимозаменяемость.Товар.ЕТК = ТекЕТК Тогда
	  		// в зависимости от структуры справочника аналогов
	  			ТабАналоги.НоваяСтрока();
	  			ТабАналоги.Код = СпрВзаимозаменяемость.Товар.Код;
	  			ТабАналоги.ЕТК = ТекЕТК;
	  		КонецЕсли;
		КонецЦикла;   
	КонецЦикла;
	ТабАналоги.Свернуть("Код,ЕТК","Расх");
	// добавление строк ТабАналоги в таблицу ТабРасх1
	// к N строкам ТабРасх1 добавляем M пустых строк (по количеству строк в ТабАналоги)
	ТабРасх1.КоличествоСтрок(ТабРасх1.КоличествоСтрок()+ТабАналоги.КоличествоСтрок());
	// заполнение таблицы ТабРасх1 строками из ТабАналоги, начиная с N+1-й строки до конца таблицы
	ТабРасх1.Заполнить(ТабАналоги,ТабРасх1.КоличествоСтрок()-ТабАналоги.КоличествоСтрок()+1,ТабРасх1.КоличествоСтрок()); 
Показать

Считал, что Код - числовой. Если строка, то возможно придется кое-где добавить СокрП (ТекЕТК = СокрП(ТЗрасх1.ЕТК), СпрНом.НайтиПоКоду(СокрП(ТабРасх1.Код)) и т.д.)
17. ksardas 28.02.12 13:48 Сейчас в теме
(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 
Показать

Для тех позиции для которых нет количества или остатка он дублирует ЕТК или код а мне надо чтоб были пустые строки или нули
18. ksardas 28.02.12 16:19 Сейчас в теме
Все с этим разобрался уже не надо =)
19. ksardas 28.02.12 16:57 Сейчас в теме
Оставьте свое сообщение

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