Имя: Пароль:
1C
1С v8
вывести КодНоменклатурыКонтрагента в ТЧ
,
0 Pavel55555
 
24.01.17
15:03
Доброго дня!
Платформа 8.3 Толстый клиент. УТ 10.3
Данные:
Документ Заказ поставщику, необходимо вывести в ТЧ в колонку КодПост вывести КодНоменклатурыКонтрагента
То что создал выводит нули:
Процедура ПоказатьКодПост(КолонкиТабПоля, ЯчейкиСтрокиТабПоля, Номенклатура) Экспорт
Если КолонкиТабПоля.КодПост.Видимость Тогда
      Если ТипЗнч(Номенклатура) = Тип("СправочникСсылка.Номенклатура") Тогда
          КодПост = ПолучитьКодПост(Номенклатура);
         ЯчейкиСтрокиТабПоля.КодПост.УстановитьТекст(КодПост);
      Иначе
         ЯчейкиСтрокиТабПоля.КодПост.УстановитьТекст("");
      КонецЕсли;
КонецЕсли;  
КонецПроцедуры

Функция ПолучитьКодПост(Контрагент, Код = Неопределено, Артикул = Неопределено, НаименованиеНоменклатурыКонтрагента = Неопределено, ЕдиницаИзмерения = Неопределено)
    
    //СтруктураВозврата = Новый Структура("Номенклатура", Справочники.Номенклатура.ПустаяСсылка());
    
    Запрос = Новый Запрос;
    Запрос.Текст =
    "ВЫБРАТЬ РАЗРЕШЕННЫЕ РАЗЛИЧНЫЕ ПЕРВЫЕ 1
    |    НоменклатураКонтрагентов.Номенклатура,
    |    НоменклатураКонтрагентов.КодНоменклатурыКонтрагента
    |ИЗ
    |    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
    |ГДЕ
    |    НоменклатураКонтрагентов.КодНоменклатурыКонтрагента = &Код
    |    И НоменклатураКонтрагентов.Номенклатура.Ссылка = &Номенклатура";
    
    //Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Код", Код);
    //Запрос.УстановитьПараметр("НаименованиеНоменклатурыКонтрагента", НаименованиеНоменклатурыКонтрагента);
    
    Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Код = ?(Выборка.Следующий(),Выборка.Выбрать,0);
Возврат Код;

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

Функция из другого модуля, пытаюсь изменить.
Может просто запросом создать?
1 Pavel55555
 
25.01.17
10:06
Ребята кто нибудь мне поможет решить эту задачу?
Хотя бы подсказать что не так...
2 Lexey_
 
25.01.17
10:16
(1) отладчика нет что ли?
3 Pavel55555
 
26.01.17
10:16
Функция ПолучитьКодПост(Номенклатура, Код = Неопределено) Экспорт
Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    НоменклатураКонтрагентов.Номенклатура,
                   |    НоменклатураКонтрагентов.Контрагент,
                   |    НоменклатураКонтрагентов.КодНоменклатурыКонтрагента
                   |ИЗ
                   |    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                   |ГДЕ
                   |    НоменклатураКонтрагентов.Номенклатура.Ссылка = &Номенклатура
                   |    И НоменклатураКонтрагентов.КодНоменклатурыКонтрагента = &Код
                   |    И НоменклатураКонтрагентов.Контрагент = &Номенклатура";
                  
                  
    Запрос.УстановитьПараметр("Номенклатура", Номенклатура);
    Запрос.УстановитьПараметр("Контрагент", Контрагент);
    Запрос.УстановитьПараметр("Код", Код);
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Возврат Выборка.Код;    
    //Иначе
    //  Возврат неопределено
    КонецЕсли;

КонецФункции

Не пойму что не так, где я что пропустил?
4 Альбатрос
 
26.01.17
10:17
|    И НоменклатураКонтрагентов.Контрагент = &Номенклатура";
5 Альбатрос
 
26.01.17
10:18
Так и должно быть?
6 Pavel55555
 
26.01.17
10:25
В ТЧ товар же по контрагенту (поставщику) и у каждого свой код товара... у кого его нет.
7 Альбатрос
 
26.01.17
10:28
(6) Ааа... То есть у тебя одинаковые измерения в регистре, да?
                  |    НоменклатураКонтрагентов.Номенклатура.Ссылка = &Номенклатура
                   |    И НоменклатураКонтрагентов.Контрагент = &Номенклатура";
8 Альбатрос
 
26.01.17
10:29
и .ссылка убери
9 Pavel55555
 
26.01.17
10:30
Поменял
|    И НоменклатураКонтрагентов.Контрагент = &Номенклатура";
На
|    И НоменклатураКонтрагентов.Контрагент = &Контрагент";

Ссылка - убрал
10 Альбатрос
 
26.01.17
10:31
(9) Ну и чо, работает?
11 Pavel55555
 
26.01.17
10:32
Пустые ячейки.
А вызов такой
Процедура ТоварыПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)

Если ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
        КодПост = ПолучитьКодПост(ДанныеСтроки.Номенклатура);
        Если НЕ КодПост = Неопределено Тогда
            ОформлениеСтроки.Ячейки.КодПост.УстановитьТекст(КодПост);
        КонецЕсли;
    КонецЕсли;
12 Pavel55555
 
26.01.17
10:35
Меня смущает Функция ПолучитьКодПост(Номенклатура, Код = Неопределено)
Неопределено!
Но без неё выдает ошибку, недостаточно фактический данных
13 Альбатрос
 
26.01.17
10:41
(12) Ты с программированием недавно познакомился, да?
14 Альбатрос
 
26.01.17
10:41
КодПост = ПолучитьКодПост(ДанныеСтроки.Номенклатура, <ДобавьСюдаКод>);
15 Альбатрос
 
26.01.17
10:42
Хотя я сомневаюсь, что он вообще нужен, я бы его убрал из условий запроса просто и все
16 Pavel55555
 
26.01.17
11:11
Да 1С недавно начал изучать, есть книга, но тонкий клиент там немного не то.
17 Pavel55555
 
26.01.17
11:12
Можно вызвать и
ПолучитьКодПост(мКолонкиТовары, ОформлениеСтроки.Ячейки, ДанныеСтроки.Номенклатура);

Но от пишет:
Слишком много фактических параметров (ПолучитьКодПост)
18 Pavel55555
 
26.01.17
11:14
Здесь ячейка не указывается
ПолучитьКодПост(мКолонкиТовары, ОформлениеСтроки.Ячейки.КодПост, ДанныеСтроки.Номенклатура);
19 Альбатрос
 
26.01.17
11:23
Чувак, у тебя объявлена функция с 2 параметрами. Один из этих параметров модно не заполнять при вызове этой функции и тогда он будет равен неопределено. Но твой запрос в любом случае использует этот параметр в своем условии. И вот теперь у тебя 2 выхода: либо не использовать параметр в запросе, либо указывать этот параметр при вызове функции.
20 Pavel55555
 
26.01.17
12:12
Если ЗначениеЗаполнено(ДанныеСтроки.Номенклатура) Тогда
        КодПост = ПолучитьКодПост (ДанныеСтроки.Номенклатура);
        Если НЕ КодПост = Неопределено Тогда
            ОформлениеСтроки.Ячейки.КодПост.УстановитьТекст(КодПост);
    КонецЕсли;
    КонецЕсли;

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

КонецФункции


Ни черта.... :(

Перем Код; в голове модуля
21 Альбатрос
 
27.01.17
09:19
Убери вот эту строку из запроса:
  |    И НоменклатураКонтрагентов.КодНоменклатурыКонтрагента = &Код
22 Pavel55555
 
02.02.17
09:33
(21) Убрал, безрезультатно...
А зачем её убирать в ней же и есть сам смысл, нужен же Код?
23 Ёпрст
 
02.02.17
09:49
(20) полный ПЭ.

>>>Возврат Выборка.Код; вот это вообще зачет, учитывая, что в запросе нет таких псевдонимов и имён полей.

А так, всё в топку, весь код запихать в ПриПолученииДанных.
Там для всей Номенклатуры из табличной части одним запросом поиметь код номенклатуры поставщика и в обходе оформления строк его установить в ячейку табличного поля. Усё.
24 Pavel55555
 
02.02.17
14:20
(23) Такого плана?
Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ЗаказПоставщикуТовары.Номенклатура,
        |    НоменклатураКонтрагентов.КодНоменклатурыКонтрагента
        |ИЗ
        |    Документ.ЗаказПоставщику.Товары КАК ЗаказПоставщикуТовары,
        |    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
        |ГДЕ
        |    НоменклатураКонтрагентов.Номенклатура = &Номенклатура
        |    И НоменклатураКонтрагентов.КодНоменклатурыКонтрагента = &Код";
    
    РезультатЗапроса = Запрос.Выполнить();
    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    
    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
25 Ёпрст
 
02.02.17
14:21
(24) нет.
1. фильтровать нужно по списку номенклатуры
2.Зачем ты делаешь условие на КодНоменклатурыКонтрагента ? И его же потом получаешь ?
26 Ёпрст
 
02.02.17
14:23
+25 + зачем тебе все табличные части всех документов ?
27 vicof
 
02.02.17
14:27
(24) Предлагаю заплатить программисту и посмотреть за его работой.
28 Ёпрст
 
02.02.17
14:37
На вот, развлекайся
ЗЫ: можно и оптимальнее написать, но мне лень.
На табличное поле не забудь событие повесить ПриПолученииДанных в свойствах


Процедура ТоварыПриПолученииДанных(Элемент, ОформленияСтрок)
    Если Не ЗначениеЗаполнено(Контрагент) Тогда
        Возврат;
    КонецЕсли;
    СписокНоменклатура = Новый СписокЗначений;
    Для каждого ОформлениеСтроки ИЗ ОформленияСтрок Цикл
        СписокНоменклатура.Добавить(ОформлениеСтроки.ДанныеСтроки.Номенклатура);
    КонецЦикла;
    Если СписокНоменклатура.Количество()=0 Тогда
        Возврат;
    КонецЕсли;
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                     |    НоменклатураКонтрагентов.Номенклатура,
                     |    НоменклатураКонтрагентов.КодНоменклатурыКонтрагента
                     |ИЗ
                     |    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                     |ГДЕ
                     |    НоменклатураКонтрагентов.Номенклатура В(&СписокНоменклатура)";
    Запрос.УстановитьПараметр("СписокНоменклатура",СписокНоменклатура);
    ТабличкаТоваров = Запрос.Выполнить().Выгрузить();
    Если ТабличкаТоваров.Количество()=0 Тогда
        Возврат;
    КонецЕсли;
    Для каждого ОформлениеСтроки ИЗ ОформленияСтрок Цикл
        СтрокаПоиска = ТабличкаТоваров.Найти(ОформлениеСтроки.ДанныеСтроки.Номенклатура, "Номенклатура");
        Если СтрокаПоиска <> Неопределено Тогда
            ОформлениеСтроки.Ячейки.КодПост.Значение = СтрокаПоиска.КодНоменклатурыКонтрагента;
            ОформлениеСтроки.Ячейки.КодПост.ЦветФона = WebЦвета.СветлоЗеленый;
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры
29 Ёпрст
 
02.02.17
14:38
Чорт, поправочка, клиентоса забыл:

    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    НоменклатураКонтрагентов.Номенклатура,
                   |    НоменклатураКонтрагентов.КодНоменклатурыКонтрагента
                   |ИЗ
                   |    РегистрСведений.НоменклатураКонтрагентов КАК НоменклатураКонтрагентов
                   |ГДЕ
                   |    НоменклатураКонтрагентов.Номенклатура В(&СписокНоменклатура)
                   |    И НоменклатураКонтрагентов.Контрагент = &Контрагент";
    Запрос.УстановитьПараметр("СписокНоменклатура",СписокНоменклатура);
    Запрос.УстановитьПараметр("Контрагент",Контрагент);
30 Pavel55555
 
07.02.17
15:06
(29) Класс высший уровень! Большое спасибо!
Я бы сам до пенсии ковырял это кусок модуля.
Подскажите хорошую книгу по 1С 8.3 Толстый клиент.
У меня есть 1С:ПРЕДПРИЯТИЕ 8.3 Практическое пособие разработчика (примеры и типовые приемы) 2013 М.Г. Радченко, Е.Ю. Хрусталева - мне не очень то и понравилась. во-первых тонкий клиент, во-вторых не очень и подробно написано, всё поверхностно, я не доволен.