Регистр сведений АртикулНоменклатурыПоставщика
Здравствуйте..
Имеется справочник ЗаказПоставщику, в нем поля артикул, номенклатура и т.д. и поле Артикул Поставщика
Нужно сделать чтобы поле Артикул Поставщика получало данные из регистра сведений эти данные - НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента.
я написал процедуру :
и передаю значение этой функции в переменную, потом вывожу в поле АртикулКонтрагента..
НО получаю в каждой строке одинаковые данные, которые не соответствуют Наименованию..
Имеется справочник ЗаказПоставщику, в нем поля артикул, номенклатура и т.д. и поле Артикул Поставщика
Нужно сделать чтобы поле Артикул Поставщика получало данные из регистра сведений эти данные - НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента.
я написал процедуру :
Функция ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Контрагент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента КАК АртикулНоменклатурыКонтрагента
|ИЗ
| РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
|ГДЕ
| НоменклатураКонтрагентов.Контрагент = &Контрагент
| И НоменклатураКонтрагентов.Номенклатура = &Номенклатура
|ИТОГИ ПО
| АртикулНоменклатурыКонтрагента";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.АртикулНоменклатурыКонтрагента;
КонецЕсли;
Возврат "!!!!"; // не нашли
Показатьи передаю значение этой функции в переменную, потом вывожу в поле АртикулКонтрагента..
НО получаю в каждой строке одинаковые данные, которые не соответствуют Наименованию..
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Если делаю вот так
то ругается на вызов функции
Функция ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента КАК АртикулНоменклатурыКонтрагента
|ИЗ
| РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
|ГДЕ
| НоменклатураКонтрагентов.Контрагент = &Контрагент
| И НоменклатураКонтрагентов.Номенклатура = &Номенклатура
|ИТОГИ ПО
| АртикулНоменклатурыКонтрагента";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка.АртикулНоменклатурыКонтрагента;
КонецЕсли;
Возврат "!!!!"; // не нашли
КонецФункции
Показатьто ругается на вызов функции
Процедура инициализацияПеременныхДляРаботы()
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
//Сообщить потом уберешь
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
Артикул = "";
КонецЕсли;
КонецПроцедуры
Показать
(6) anton.kislov, в этой функции опять не инициализирована переменная номенклатура. Естественно она будет ругаться. Есть правило: не заставляйте программу делать предположения о значении переменных, параметров и т.п. Все должно быть установлено явно. Тогда не будет такого сюра...
{Документ.ЗаказПоставщику.Форма.ФормаДокумента.Форма(2593,58)}: Переменная не определена (Номенклатура)
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(<<?>>Номенклатура, Контрагент);
в конфигураторе на эту строку
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(<<?>>Номенклатура, Контрагент);
в конфигураторе на эту строку
Процедура инициализацияПеременныхДляРаботы()
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
//Сообщить потом уберешь
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
Артикул = "";
КонецЕсли;
КонецПроцедуры
Показать
(32)"ОНО" работает правильно, это вы не понимаете что пишете.
где в этой процедуре определение переменной Номенклатура?
Процедура инициализацияПеременныхДляРаботы()
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
//Сообщить потом уберешь
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
Артикул = "";
КонецЕсли;
КонецПроцедуры
Показатьгде в этой процедуре определение переменной Номенклатура?
это делается так: Выгружается вся тч в параметр запроса, потом в запросе в первом пакете выбираем всю все поля из ТЧ, во втором пакете объединяем ее с регистром. Потом выгружаем запрос в ТЗ и заполняем таблицу документа из нее
(37)Выкладывайте код целиком, без контекста совершенно непонятно, где и как вызывается инициализацияПеременныхДляРаботы(), и каким образом одной операцией присваивания, вы хотите заполнить различные артикулы для различных строк.
Если же вы выполняете данную процедуру для КАЖДОЙ строки, то для начала стоило бы определиться с методикой решения данной задачи, а затем приступать к реализации.
Если же вы выполняете данную процедуру для КАЖДОЙ строки, то для начала стоило бы определиться с методикой решения данной задачи, а затем приступать к реализации.
(37) anton.kislov, как я поняла из сообщений, АртикулПпоставщика можно определить только по ключу Контрагент+Номенклатура. Хоть как вам надо определить номенклатуру, для которой вы ищите артикулПоставщика. Контрагент определен где-то, раз программка не ругается.
Да если нужен именно Ключ контрагент+номенклатура, иначе берется одно значение и присваивается каждой строке, как показано на скрине...
На данный момент код уже не могу выложить, рабочий день кончился..а дом и работа - два разных места
На данный момент код уже не могу выложить, рабочий день кончился..а дом и работа - два разных места
есть вот такой код
Он выводит эти Артикулы в документе ЗаказПоставщику в процедуре печати документа..(файл ЗаказПост_Печать)
Вот колонку АртикулПоставщика мне необходимо добавить в Табличную часть формы
ТекстИсточникАртикула = "
| ЛЕВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
| ПО НоменклатураКонтрагентов.Номенклатура = ЗаказПоставщику.Номенклатура
| И НоменклатураКонтрагентов.ХарактеристикаНоменклатуры = ЗаказПоставщику.ХарактеристикаНоменклатуры
| И НоменклатураКонтрагентов.Контрагент = &Контрагент";
Он выводит эти Артикулы в документе ЗаказПоставщику в процедуре печати документа..(файл ЗаказПост_Печать)
Вот колонку АртикулПоставщика мне необходимо добавить в Табличную часть формы
Прикрепленные файлы:
(45)Я имел ввиду не это. Вот у вас есть табличная часть Товары в документе Заказ поставщику. Логично предположить, что контрагент в заказе один, и это реквизит формы, так что с ним никаких проблем не должно быть.
Далее, в каждой строчке табличной части номенклатура своя, следовательно есть 2 пути:
1) для каждой строчки табличной части выполнить запрос, в который передать СтрокаТабличнойЧасти.Номенклатура и Контрагент.(это наихудший вариант, так делать НЕ НАДО)
2) выгрузить табличную часть в таблицу значений, передать ее в запрос целиком через менеджер временных таблиц, в запросе получить значения артикулов, и дальше работать уже с ней, а не с самой табличной частью(обход и вывод строчек в табличный документ).
Далее, в каждой строчке табличной части номенклатура своя, следовательно есть 2 пути:
1) для каждой строчки табличной части выполнить запрос, в который передать СтрокаТабличнойЧасти.Номенклатура и Контрагент.(это наихудший вариант, так делать НЕ НАДО)
2) выгрузить табличную часть в таблицу значений, передать ее в запрос целиком через менеджер временных таблиц, в запросе получить значения артикулов, и дальше работать уже с ней, а не с самой табличной частью(обход и вывод строчек в табличный документ).
(46) mymyka, Т.е. вот так не надо делать?
Процедура инициализацияПеременныхДляРаботы()
Для каждого СтрокаТабЧасти Из Товары Цикл
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(СтрокаТабЧасти.Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
//Сообщить потом уберешь
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
Артикул = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(47)можно, но методологически крайне не верно.
Если для 10 строк время выполнения увеличится незначительно, то уже для 1000 строк разница будет на порядок,а мб и на два.
Лучше приучаться создавать методологически правильные и, что более важно, быстрые алгоритмы с самого начала.
Если для 10 строк время выполнения увеличится незначительно, то уже для 1000 строк разница будет на порядок,а мб и на два.
Лучше приучаться создавать методологически правильные и, что более важно, быстрые алгоритмы с самого начала.
(48) mymyka, попытался сделать так..
но всё равно мимо цели((
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
МассивНоменклатуры = Новый Массив;
СоответствиеНоменклатуры = Новый Соответствие;
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
СоответствиеНоменклатуры.Вставить(ОформлениеСтроки.ДанныеСтроки.Номенклатура, ОформлениеСтроки);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураКонтрагентов.Номенклатура,
| НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента
|ИЗ
| РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
|ГДЕ
| НоменклатураКонтрагентов.Контрагент = &Контрагент
| И НоменклатураКонтрагентов.Номенклатура В(&Номенклатура)";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОформлениеСтроки = СоответствиеНоменклатуры.Получить(Выборка.Номенклатура);
Если ОформлениеСтроки <> Неопределено Тогда
ОформлениеСтроки.Ячейки.АртикулКонтрагента.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = Выборка.АртикулНоменклатурыКонтрагента;
Иначе
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показатьно всё равно мимо цели((
(50) mymyka,
1) надо заполнить в документе, в Печатной форме всё заполнено
2)АртикулНоменклатурыКонтрагента - это реквезит РегистраСведений -> НоменклатураКонтрагентов; дополнительная колонка - АртикулКонтрагента, в неё и необходимо(так сказать) заполнить данные из регистра
1) надо заполнить в документе, в Печатной форме всё заполнено
2)АртикулНоменклатурыКонтрагента - это реквезит РегистраСведений -> НоменклатураКонтрагентов; дополнительная колонка - АртикулКонтрагента, в неё и необходимо(так сказать) заполнить данные из регистра
(51)в регистре сведений он хранится справочно. Для табличной части Заказа поставщику, АртикулНоменклатурыКонтрагента это реквизит табличной части или просто колонка на форме?
Если это реквизит, тогда надо заполнять его 1 раз, после этого он будет хранится в документе. Если же просто колонка, его надо будет получать и заполнять при каждом отображении документа. Способы реализации механизма кардинально различаются.
Если это реквизит, тогда надо заполнять его 1 раз, после этого он будет хранится в документе. Если же просто колонка, его надо будет получать и заполнять при каждом отображении документа. Способы реализации механизма кардинально различаются.
(56)Ну тогда из оформления строк получаем массив номенклатуры, запросом получаем таблицу Номенклатура-Артикул(Где что_то.НомеклатураВ(&МассивНоменклатуры)), а потом пробегаемся по ОформлениямСтрок еще раз, ищем в таблице строку с текущей номенклатурой и заполняем из найденной строки артикул.
(57) mymyka,
Типо вот ТАК?
Типо вот ТАК?
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
МассивНоменклатуры = Новый Массив;
МассивЕдиницИзмерения = Новый Массив;
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
МассивЕдиницИзмерения.Добавить(ОформлениеСтроки.ДанныеСтроки.ЕдиницаИзмерения);
КонецЦикла;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураКонтрагентов.Номенклатура,
| НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента
|ИЗ
| РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
|ГДЕ
| НоменклатураКонтрагентов.Контрагент = &Контрагент
| И НоменклатураКонтрагентов.Номенклатура В(&Номенклатура)";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Номенклатура", МассивНоменклатуры);
Результаты = Запрос.Выполнить();
СоответствиеАртикулов = Новый Соответствие;
Выборка = Результаты.Выбрать();
Пока Выборка.Следующий() Цикл
СоответствиеАртикулов.Вставить(Выборка.Номенклатура, Выборка.АртикулНоменклатурыКонтрагента);
КонецЦикла;
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
ДанныеСтроки = ОформлениеСтроки.ДанныеСтроки;
ОформлениеСтроки.Ячейки.АртикулКонтрагента.ОтображатьТекст = Истина;
// ищем артикул
АртикулНоменклатурыКонтрагента = СоответствиеАртикулов.Получить(ДанныеСтроки.Номенклатура);
Если АртикулНоменклатурыКонтрагента <> Неопределено Тогда
// нашли - показываем его
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = АртикулНоменклатурыКонтрагента;
Иначе
// не нашли - показываем пустую строку.
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = "";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показать
(49) anton.kislov, а так:
работать должно, но сам бы я так делать не стал
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| НоменклатураКонтрагентов.АртикулНоменклатурыКонтрагента
|ИЗ
| РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
|ГДЕ
| НоменклатураКонтрагентов.Контрагент = &Контрагент
| И НоменклатураКонтрагентов.Номенклатура = &Номенклатура";
Запрос.УстановитьПараметр("Контрагент", Контрагент);
Запрос.УстановитьПараметр("Номенклатура", ОформлениеСтроки.ДанныеСтроки.Номенклатура);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОформлениеСтроки.Ячейки.АртикулКонтрагента.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = Выборка.АртикулНоменклатурыКонтрагента;
Иначе
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Показатьработать должно, но сам бы я так делать не стал
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот