Регистр сведений АртикулНоменклатурыПоставщика

1. anton.kislov 02.10.13 09:50 Сейчас в теме
Здравствуйте..
Имеется справочник ЗаказПоставщику, в нем поля артикул, номенклатура и т.д. и поле Артикул Поставщика
Нужно сделать чтобы поле Артикул Поставщика получало данные из регистра сведений эти данные - НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента.

я написал процедуру :
Функция ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Контрагент)

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

	Запрос.УстановитьПараметр("Контрагент", Контрагент);
	
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.АртикулНоменклатурыКонтрагента;
    КонецЕсли;

    Возврат "!!!!"; // не нашли
Показать

и передаю значение этой функции в переменную, потом вывожу в поле АртикулКонтрагента..
НО получаю в каждой строке одинаковые данные, которые не соответствуют Наименованию..
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. anton.kislov 02.10.13 09:55 Сейчас в теме
вот скрин..
может кто подскажет что не так я сделал
Прикрепленные файлы:
3. peterxx 22 02.10.13 09:56 Сейчас в теме
Пардон, а параметр "Номенклатура" как устанавливается? В том виде, в котором вы выложили кусок кода, он будет вываливаться на ошибку.
4. anton.kislov 02.10.13 09:58 Сейчас в теме
(3) peterxx,
без него работает..
а если я его оставляю, то да.. ОН ругается..
5. Ponommax 02.10.13 10:00 Сейчас в теме
Без установки параметра &Номенклатура не взлетит.
6. anton.kislov 02.10.13 10:00 Сейчас в теме
Если делаю вот так
Функция ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент)

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

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

    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.АртикулНоменклатурыКонтрагента;
    КонецЕсли;

    Возврат "!!!!"; // не нашли
	
		
	
КонецФункции
Показать

то ругается на вызов функции
Процедура инициализацияПеременныхДляРаботы()
	
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
	//Сообщить потом уберешь
   Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
   Артикул = "";
КонецЕсли;
	
КонецПроцедуры	
Показать
10. AllexSoft 02.10.13 10:05 Сейчас в теме
(6) anton.kislov, Возврат "!!!!"; // не нашли - вот тут надо возвращать Неопределено
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент); - если ругается тут, у вас там случаем не УФ ? если нет то ругаться не должно
11. anton.kislov 02.10.13 10:08 Сейчас в теме
(10) AllexSoft,
ссори, что есть "УФ" ? именно туда и ругается
12. anton.kislov 02.10.13 10:08 Сейчас в теме
14. AllexSoft 02.10.13 10:11 Сейчас в теме
(11) anton.kislov, управляемые формы у тебя ?
13. anton.kislov 02.10.13 10:09 Сейчас в теме
(10) AllexSoft,
по поводу : Возврат "!!!!"; // не нашли - вот тут надо возвращать Неопределено
я это удалю, так как ОНО не используется, это я для проверки вписал
15. anton.kislov 02.10.13 10:20 Сейчас в теме
(10) AllexSoft,
нет, форма не управляемая..
10.3 1с
16. AllexSoft 02.10.13 10:22 Сейчас в теме
(15) anton.kislov, тогда напиши на что ругается... ругаться не должно
22. peterxx 22 02.10.13 10:58 Сейчас в теме
(6) anton.kislov, в этой функции опять не инициализирована переменная номенклатура. Естественно она будет ругаться. Есть правило: не заставляйте программу делать предположения о значении переменных, параметров и т.п. Все должно быть установлено явно. Тогда не будет такого сюра...
7. Ponommax 02.10.13 10:03 Сейчас в теме
Как ругается? Что говорит?
9. anton.kislov 02.10.13 10:04 Сейчас в теме
(7) Ponommax,
Говорит "Переменная не определена (Номенклатура)" именно в этой строке "Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент);"
8. anton.kislov 02.10.13 10:03 Сейчас в теме
А значения переменной Артикул я и передаю в строку АРтикул Контрагента
17. anton.kislov 02.10.13 10:27 Сейчас в теме
{Документ.ЗаказПоставщику.Форма.ФормаДокумента.Форма(2593,58)}: Переменная не определена (Номенклатура)
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(<<?>>Номенклатура, Контрагент);

в конфигураторе на эту строку
Процедура инициализацияПеременныхДляРаботы()
    
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
    //Сообщить потом уберешь
   Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
   Артикул = "";
КонецЕсли;
    
КонецПроцедуры    
Показать
18. M.Flint 02.10.13 10:29 Сейчас в теме
(17) anton.kislov, Заполните переменную "Номенклатура" до вызова функции.
AllexSoft; +1 Ответить
19. anton.kislov 02.10.13 10:40 Сейчас в теме
(18) M.Flint, это каким образом..??
20. M.Flint 02.10.13 10:42 Сейчас в теме
(19) anton.kislov, Вы же сами пишите
Имеется справочник ЗаказПоставщику, в нем поля артикул, номенклатура
21. anton.kislov 02.10.13 10:46 Сейчас в теме
(20) M.Flint, так он заполнен под завязку!
в сообщении 2 скрин с маленьким числом данных
23. M.Flint 02.10.13 10:58 Сейчас в теме
(21) anton.kislov,
Нужно сделать чтобы поле Артикул Поставщика получало данные из регистра сведений эти данные - НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента.

Где находится поле, которое вам надо заполнить?
24. anton.kislov 02.10.13 11:00 Сейчас в теме
(23) M.Flint, поле находится в документе ЗаказПоставщику и называется АртикулКонтрагента
25. M.Flint 02.10.13 11:01 Сейчас в теме
(24) anton.kislov, В табличной части?
26. anton.kislov 02.10.13 11:10 Сейчас в теме
(25) M.Flint, да в разделе товары
27. M.Flint 02.10.13 11:14 Сейчас в теме
(26) anton.kislov, там же находится поле "Номенклатура"?
Если ответ "да", то делайте цикл по табличной части и заполняйте поле "Артикул".
28. tango 543 02.10.13 11:19 Сейчас в теме
(27) M.Flint, не надо делать цикл по табличной части. желательно никогда. в этом случае - точно
Bukaska; AllexSoft; +2 Ответить
30. M.Flint 02.10.13 11:24 Сейчас в теме
(28) tango, Согласна, но пока пусть хоть так напишет. Потом начнется оптимизация кода.
31. AllexSoft 02.10.13 11:35 Сейчас в теме
(30) M.Flint, надо сразу делать правильно, иначе так и научится запросы в циклах писать... а потом тут будут темы почему у меня тормозит...
32. anton.kislov 02.10.13 11:43 Сейчас в теме
(31) AllexSoft, если бы получилось правильно, я бы не писал..
а тут понимаю что нужно сделать, а ОНО просто не хочет писать как мне надо
33. peterxx 22 02.10.13 11:46 Сейчас в теме
(32) anton.kislov, ОНО у Кинга детей убивало, а вас всего лишь не пишет как надо. Измельчали монстры...)
35. anton.kislov 02.10.13 11:47 Сейчас в теме
(33) peterxx, ну я образно написал "ОНО"..
34. AllexSoft 02.10.13 11:47 Сейчас в теме
(32) anton.kislov, ты изначально делаешь не то... нужно не по каждой номенклатуре запрашивать артикулы, а для всей твоей ТЧ целиком одним запросом!
36. mymyka 02.10.13 11:48 Сейчас в теме
(32)"ОНО" работает правильно, это вы не понимаете что пишете.
Процедура инициализацияПеременныхДляРаботы()
    
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
    //Сообщить потом уберешь
   Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
   Артикул = "";
КонецЕсли;
    
КонецПроцедуры 
Показать

где в этой процедуре определение переменной Номенклатура?
29. AllexSoft 02.10.13 11:23 Сейчас в теме
это делается так: Выгружается вся тч в параметр запроса, потом в запросе в первом пакете выбираем всю все поля из ТЧ, во втором пакете объединяем ее с регистром. Потом выгружаем запрос в ТЗ и заполняем таблицу документа из нее
37. anton.kislov 02.10.13 12:16 Сейчас в теме
Да я как бы вижу что она там не определена!! Но она мне там и не нужна!! Мне нужен параметр Артикулпоставщика выдранный в запросы и передать его в переменную...
38. mymyka 02.10.13 12:20 Сейчас в теме
(37)Выкладывайте код целиком, без контекста совершенно непонятно, где и как вызывается инициализацияПеременныхДляРаботы(), и каким образом одной операцией присваивания, вы хотите заполнить различные артикулы для различных строк.
Если же вы выполняете данную процедуру для КАЖДОЙ строки, то для начала стоило бы определиться с методикой решения данной задачи, а затем приступать к реализации.
44. anton.kislov 03.10.13 03:28 Сейчас в теме
(38) mymyka, Код целиком всего модуля?
40. M.Flint 02.10.13 12:29 Сейчас в теме
(37) anton.kislov, как я поняла из сообщений, АртикулПпоставщика можно определить только по ключу Контрагент+Номенклатура. Хоть как вам надо определить номенклатуру, для которой вы ищите артикулПоставщика. Контрагент определен где-то, раз программка не ругается.
39. tango 543 02.10.13 12:23 Сейчас в теме
в целом тс заслуживает плюса
41. AllexSoft 02.10.13 12:33 Сейчас в теме
(39) tango, почему у них так все сложно ?( работы реально на минуты 3..
43. tango 543 02.10.13 12:43 Сейчас в теме
(41) AllexSoft, см (42): определенно четко все разложил
42. anton.kislov 02.10.13 12:35 Сейчас в теме
Да если нужен именно Ключ контрагент+номенклатура, иначе берется одно значение и присваивается каждой строке, как показано на скрине...
На данный момент код уже не могу выложить, рабочий день кончился..а дом и работа - два разных места
45. anton.kislov 03.10.13 03:33 Сейчас в теме
есть вот такой код
   ТекстИсточникАртикула = "
            |    ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
            |    ПО НоменклатураКонтрагентов.Номенклатура = ЗаказПоставщику.Номенклатура
            |   И НоменклатураКонтрагентов.ХарактеристикаНоменклатуры = ЗаказПоставщику.ХарактеристикаНоменклатуры
            |    И НоменклатураКонтрагентов.Контрагент = &Контрагент";

Он выводит эти Артикулы в документе ЗаказПоставщику в процедуре печати документа..(файл ЗаказПост_Печать)
Вот колонку АртикулПоставщика мне необходимо добавить в Табличную часть формы
Прикрепленные файлы:
46. mymyka 03.10.13 08:34 Сейчас в теме
(45)Я имел ввиду не это. Вот у вас есть табличная часть Товары в документе Заказ поставщику. Логично предположить, что контрагент в заказе один, и это реквизит формы, так что с ним никаких проблем не должно быть.
Далее, в каждой строчке табличной части номенклатура своя, следовательно есть 2 пути:
1) для каждой строчки табличной части выполнить запрос, в который передать СтрокаТабличнойЧасти.Номенклатура и Контрагент.(это наихудший вариант, так делать НЕ НАДО)
2) выгрузить табличную часть в таблицу значений, передать ее в запрос целиком через менеджер временных таблиц, в запросе получить значения артикулов, и дальше работать уже с ней, а не с самой табличной частью(обход и вывод строчек в табличный документ).
47. anton.kislov 03.10.13 08:45 Сейчас в теме
(46) mymyka, Т.е. вот так не надо делать?
  Процедура инициализацияПеременныхДляРаботы()
Для каждого СтрокаТабЧасти Из Товары Цикл
	 
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(СтрокаТабЧасти.Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
	//Сообщить потом уберешь
   Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
   Артикул = "";
КонецЕсли;
КонецЦикла;	
КонецПроцедуры
Показать
48. mymyka 03.10.13 10:07 Сейчас в теме
(47)можно, но методологически крайне не верно.
Если для 10 строк время выполнения увеличится незначительно, то уже для 1000 строк разница будет на порядок,а мб и на два.
Лучше приучаться создавать методологически правильные и, что более важно, быстрые алгоритмы с самого начала.
49. anton.kislov 03.10.13 10:11 Сейчас в теме
(48) mymyka, попытался сделать так..
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
	
	МассивНоменклатуры = Новый Массив;
	СоответствиеНоменклатуры = Новый Соответствие;
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
		СоответствиеНоменклатуры.Вставить(ОформлениеСтроки.ДанныеСтроки.Номенклатура, ОформлениеСтроки);
	КонецЦикла;
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	НоменклатураКонтрагентов.Номенклатура,
		|	НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента
		|ИЗ
		|	РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
		|ГДЕ
		|	НоменклатураКонтрагентов.Контрагент = &Контрагент
		|	И НоменклатураКонтрагентов.Номенклатура В(&Номенклатура)";
	
	Запрос.УстановитьПараметр("Контрагент", Контрагент);
	Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры);
	
	Выборка = Запрос.Выполнить().Выбрать();
	Пока Выборка.Следующий() Цикл
		
		ОформлениеСтроки = СоответствиеНоменклатуры.Получить(Выборка.Номенклатура);
		Если ОформлениеСтроки <> Неопределено Тогда
			ОформлениеСтроки.Ячейки.АртикулКонтрагента.ОтображатьТекст = Истина;
			ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = Выборка.АртикулНоменклатурыКонтрагента;
		
	Иначе 
		Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
		КонецЕсли;
		
	КонецЦикла;
	
КонецПроцедуры
Показать

но всё равно мимо цели((
50. mymyka 03.10.13 10:18 Сейчас в теме
(49)Дак все таки надо в Документе заполнить артикул, или в печатной форме?
АртикулНоменклатурыКонтрагента это реквизит табличной части, или просто доп.колонка?
51. anton.kislov 03.10.13 10:26 Сейчас в теме
(50) mymyka,
1) надо заполнить в документе, в Печатной форме всё заполнено
2)АртикулНоменклатурыКонтрагента - это реквезит РегистраСведений -> НоменклатураКонтрагентов; дополнительная колонка - АртикулКонтрагента, в неё и необходимо(так сказать) заполнить данные из регистра
55. mymyka 03.10.13 10:54 Сейчас в теме
(51)в регистре сведений он хранится справочно. Для табличной части Заказа поставщику, АртикулНоменклатурыКонтрагента это реквизит табличной части или просто колонка на форме?
Если это реквизит, тогда надо заполнять его 1 раз, после этого он будет хранится в документе. Если же просто колонка, его надо будет получать и заполнять при каждом отображении документа. Способы реализации механизма кардинально различаются.
56. anton.kislov 03.10.13 11:19 Сейчас в теме
(55) mymyka, просто колонка добавленная мной.
57. mymyka 03.10.13 11:25 Сейчас в теме
(56)Ну тогда из оформления строк получаем массив номенклатуры, запросом получаем таблицу Номенклатура-Артикул(Где что_то.НомеклатураВ(&МассивНоменклатуры)), а потом пробегаемся по ОформлениямСтрок еще раз, ищем в таблице строку с текущей номенклатурой и заполняем из найденной строки артикул.
58. anton.kislov 03.10.13 11:38 Сейчас в теме
(57) mymyka,
Типо вот ТАК?
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
	
		
	МассивНоменклатуры = Новый Массив;
	
	МассивЕдиницИзмерения = Новый Массив;
	
	Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
		МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
		МассивЕдиницИзмерения.Добавить(ОформлениеСтроки.ДанныеСтроки.ЕдиницаИзмерения);
		
	
		
	КонецЦикла;
	

	Запрос = Новый Запрос;
	Запрос.Текст =  
			"ВЫБРАТЬ
		|	НоменклатураКонтрагентов.Номенклатура,
		|	НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента
		|ИЗ
		|	РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
		|ГДЕ
		|	НоменклатураКонтрагентов.Контрагент = &Контрагент
		|	И НоменклатураКонтрагентов.Номенклатура В(&Номенклатура)";
		
		Запрос.УстановитьПараметр("Контрагент", Контрагент);
	
	
	Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры);
	
		Результаты = Запрос.Выполнить();
	
	СоответствиеАртикулов = Новый Соответствие;
	
	
	Выборка = Результаты.Выбрать();
	Пока Выборка.Следующий() Цикл
		
		СоответствиеАртикулов.Вставить(Выборка.Номенклатура, Выборка.АртикулНоменклатурыКонтрагента);
	КонецЦикла;
	
		
		Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
		
				ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
		
		ОформлениеСтроки.Ячейки.АртикулКонтрагента.ОтображатьТекст = Истина;
			
		// ищем артикул
		АртикулНоменклатурыКонтрагента = СоответствиеАртикулов.Получить(ДанныеСтроки.Номенклатура);
		Если АртикулНоменклатурыКонтрагента <> Неопределено Тогда
			
			// нашли - показываем его
			ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = АртикулНоменклатурыКонтрагента;
			
		Иначе
			
			// не нашли - показываем пустую строку.
			ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = "";
			
		КонецЕсли;
		
		
	КонецЦикла;
	
	КонецПроцедуры
Показать
59. mymyka 03.10.13 12:01 Сейчас в теме
(58)Ага, тип того. Только еще стоит проверить тип НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента. Он может быть и не строковый, тогда
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = АртикулНоменклатурыКонтрагента;

не сработает.
52. brodya 03.10.13 10:27 Сейчас в теме
(49) anton.kislov, а так:
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)

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

работать должно, но сам бы я так делать не стал
53. anton.kislov 03.10.13 10:30 Сейчас в теме
(52) brodya, тоже самое..
пустота((
54. brodya 03.10.13 10:42 Сейчас в теме
(53) anton.kislov, я там цикл забыл дописать в (52), сейчас исправил. Но присоединяюсь ко всем кто написал, что запросы в цикле это плохо.
60. anton.kislov 03.10.13 12:08 Сейчас в теме
Ну помойму строка...хотя могу ошибаться(((
А как проверить точно?:)
61. mymyka 03.10.13 12:25 Сейчас в теме
(60)Добавить ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = Строка(АртикулНоменклатурыКонтрагента); для надежности )
62. anton.kislov 03.10.13 13:03 Сейчас в теме
Оставьте свое сообщение

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