Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
17 июн 2024, 16:21

Артикул Контрагента

Автор anton.kislov, 23 мая 2013, 10:07

0 Пользователей и 1 гость просматривают эту тему.

mixqn

Цитата: anton.kislov от 03 окт 2013, 03:22Из табличной части, документа ЗаказПоставщику
Из какой конкретно строки? И где собственно обращение к табличной части? Как по вашему система должна понять, что вы имеете ввиду именно номенклатуру из табличной части?

Напишу плохой (но рабочий и понятный) вариант решения:
Процедура инициализацияПеременныхДляРаботы()

Для каждого СтрокаТабЧасти Из ИмяТабЧасти Цикл
Артикул = ПолучитьИзРегистраАртикулПоКонтрагентуЗапросом(СтрокаТабЧасти.Номенклатура, Контрагент);
Если Артикул = Неопределено тогда
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
Артикул = "";
КонецЕсли;
КонецЦикла;

КонецПроцедуры

вместо "ИмяТабЧасти" подставьте имя табличной части как оно задано в конфигураторе.
Такой код должен работать.

Почему вариант плохой (рабочий, но плохой): потому что в этом случае происходит выполнение запроса в цикле. На экзамене в 1С за это сразу ставят неуд и не дают сертификат :)
Правильно заранее выполнить запрос по списку номенклатуры, а потом в цикле обращаться к результатам запроса.

anton.kislov

Как такой код?
Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)

МассивНоменклатуры = Новый Массив;
СоответствиеНоменклатуры = Новый Соответствие;
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл
МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
СоответствиеНоменклатуры.Вставить(ОформлениеСтроки.ДанныеСтроки.Номенклатура, ОформлениеСтроки);
КонецЦикла;

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

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

Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл

ОформлениеСтроки = СоответствиеНоменклатуры.Получить(Выборка.Номенклатура);
Если ОформлениеСтроки <> Неопределено Тогда
ОформлениеСтроки.Ячейки.АртикулКонтрагента.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.АртикулКонтрагента.Текст = Выборка.АртикулНоменклатурыКонтрагента;

Иначе
Сообщить("Не удалось найти артикул по контрагенту - "+Контрагент.Наименование);
КонецЕсли;

КонецЦикла;

КонецПроцедуры

Yura063

Цитата: anton.kislov от 03 окт 2013, 10:37
МассивНоменклатуры = Новый Массив;   
СоответствиеНоменклатуры = Новый Соответствие;   
Для Каждого ОформлениеСтроки Из ОформленияСтрок Цикл       МассивНоменклатуры.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);       СоответствиеНоменклатуры.Вставить(ОформлениеСтроки.ДанныеСтроки.Номенклатура, ОформлениеСтроки);    КонецЦикла;
Зачем перебирать в цикле, когда можно просто выгрузить колонку из таб. части! ну это так для упрощения.

Добавлено: 03 окт 2013, 12:18


Табличная часть (Tabular section)
ВыгрузитьКолонку (UnloadColumn)
Синтаксис:

ВыгрузитьКолонку(<Колонка>)
Параметры:

<Колонка> (обязательный)

Тип: Число; Строка.
Колонка, из которой нужно выгрузить значения. В качестве значения параметра может быть передан индекс колонки, имя колонки.
Возвращаемое значение:

Тип: Массив.

Описание:

Создает массив и копирует в него значения, содержащиеся в колонке табличной части.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Примечание:

Значения из колонки выгружаются в порядке индексов строк в табличной части.
Пример:

Товары = Состав.ВыгрузитьКолонку("Номенклатура");


Добавлено: 03 окт 2013, 12:20


и в принципе получится:

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

anton.kislov

спс, посмотрел..

Но тут дело такое, что дописал даже свою процедуру, и столкнулся с тем, что ОНА просто не вызывается..
Запрос данные получает - проверил в консолизапросов, а вот что с процедурой не пойму...

Yura063

Как вы вызываете процедуру?
Помогли, отблагодари!

mixqn

процедура указана как обработчик события ПриПолученииДанных элемента формы Товары (настраивается в свойствах элемента управления)?

anton.kislov

да уже понял...
прописать то я ее прописал, а вот в эту форму не добавил(в свойства)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru

Поиск