Версия для печати темы (https://pro1c.org.ua/index.php?s=7aaee026c17c3b4e81b25f8256c90e80&showtopic=3000)

Нажмите сюда для просмотра этой темы в обычном формате

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7 _ Программирование обычных форм 1С 8.2 и не интерфейсной логики _ Как вытянуть данные из справочника в документе

Автор: pashik 21.02.11, 10:02

Всем привет!
Я новичек в 1С. Пишу себе конфу на 8.2.
Есть справочник номенклатура с реквизитами: Наименование, единицы измерения.
Есть документ - Приход товара с табличной частью.
Как сделать, чтоб при выборе в табличной части какойто номенклатуры, единицы измерения подставлялись автоматически (из справочника Номенклатура).
Заранее благодарен.

Автор: Vofka 21.02.11, 10:15

Ну это ж в каждом учебнике есть, читайте книги.

ЕдиницаИзмерения = Номенклатура.ЕдиницаИзмерения

Автор: Flexy 21.02.11, 10:20

Я думаю надо сделать обработчик события

Процедура НоменалктураПриИзменении()
...

И дальше уже подставлять алгоритм подставления единиц.

Автор: pashik 21.02.11, 11:29

Вот такпытаюсь:

&НаКлиенте
Процедура СписокТоваровНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.СписокТоваров.ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.ИзвлечЦену(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура, Объект.ВидЦены);
    
    
    СтрокаТабличнойЧасти.ЕдиницыИзмерения = Номенклатура.ЕдиницыИзмерения;
    
КонецПроцедуры


Выдает ошибку: "{Документ.ЗаказТоваров.Форма.ФормаДокумента.Форма(8,42)}: Переменная не определена (Номенклатура)
СтрокаТабличнойЧасти.ЕдиницыИзмерения = <<?>>Номенклатура.ЕдиницыИзмерения; (Проверка: Тонкий клиент)"

тоесть где фукции процедуры писать я в курсе.
не могу понять откуда вытащить ссылку на выбраный с справочнике объект.

Автор: Flexy 21.02.11, 11:32

Прежде чем работать со справочником его надо создать.
Т.е.

Спр = СоздатьОбъект("Справочник.Номенклатура");

И дальше уже манипулировать различными его элементами с помощью методов.
С 8.2 я практически не работал.Возможно я ошибаюсь.Но попробуйте так. wink.gif

Автор: DartRomanius 21.02.11, 11:37

Цитата(pashik @ 21.02.11, 12:29) *
Вот такпытаюсь:
&НаКлиенте
Процедура СписокТоваровНоменклатураПриИзменении(Элемент)
СтрокаТабличнойЧасти = Элементы.СписокТоваров.ТекущиеДанные;
СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.ИзвлечЦену(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура, Объект.ВидЦены);


СтрокаТабличнойЧасти.ЕдиницыИзмерения = Номенклатура.ЕдиницыИзмерения;

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

Выдает ошибку: "{Документ.ЗаказТоваров.Форма.ФормаДокумента.Форма(8,42)}: Переменная не определена (Номенклатура)
СтрокаТабличнойЧасти.ЕдиницыИзмерения = <<?>>Номенклатура.ЕдиницыИзмерения; (Проверка: Тонкий клиент)"

тоесть где фукции процедуры писать я в курсе.
не могу понять откуда вытащить ссылку на выбраный с справочнике объект.



Сходить на сервер за данными.

Что-то типа

&НаКлиенте
Процедура ПриИзмененииНоменклатуры(.....)
.......
    ЗадатьИзменитьЕдиницуНаСервере();
.......
КонецПроцедуры

&НаСервере
Процедура ЗадатьИзменитьЕдиницуНаСервере()
    Номенклатура.Единицы......

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

Автор: Vofka 21.02.11, 11:57

&НаКлиенте
Процедура СписокТоваровНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.СписокТоваров.ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.ИзвлечЦену(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура, Объект.ВидЦены);
    
    
    СтрокаТабличнойЧасти.ЕдиницыИзмерения = СтрокаТабличнойЧасти.Номенклатура.ЕдиницыИзмерения;
    
КонецПроцедуры


Так?

Автор: DartRomanius 21.02.11, 12:02

Не думаю что в 8.2 прокатит такая схема.
На 8.1 (8.0) наверное да.

Форма не имеет прямого доступа к данным.
Еще вроде как можно покурить:

ДанныеФормыВЗначение(<Объект>, <Тип>) 
ЗначениеВДанныеФормы(<Значение>, <Объект>)

Автор: pashik 21.02.11, 12:49

Цитата(Vofka @ 21.02.11, 12:57) *
&НаКлиенте
Процедура СписокТоваровНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.СписокТоваров.ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.ИзвлечЦену(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура, Объект.ВидЦены);
    
    
    СтрокаТабличнойЧасти.ЕдиницыИзмерения = СтрокаТабличнойЧасти.Номенклатура.ЕдиницыИзмерения;
    
КонецПроцедуры


Так?



При выборе объекта выдает ошибку: "Поле объекта не обнаружено: Единицы измерения".

А правильно ли такое обращение - СтрокаТабличнойЧасти.Номенклатура.ЕдиницыИзмерения ?
Здесь Номенклатура - это реквизит табличной части ("СписокТоваров") документа.

Автор: torrensen 22.02.11, 7:49

&НаКлиенте
Процедура СписокТоваровНоменклатураПриИзменении(Элемент)
    ДанныеСтруктура = новый Структура(Цена,ЕдиницаИзмерения);

    СтрокаТабличнойЧасти = Элементы.СписокТоваров.ТекущиеДанные;
    РаботаСоСправочниками.ИзвлечьЦенуИНдиницеИзмерения(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура, Объект.ВидЦены, ДанныеСтруктура);
    
    
    СтрокаТабличнойЧасти.Цена = ДанныеСтруктура.Цена;
    СтрокаТабличнойЧасти.ЕдиницыИзмерения = ДанныеСтруктура.ЕдиницыИзмерения;
  
КонецПроцедуры


&НаСервереБезКонтекста
Процедура ИзвлечьЦенуИНдиницеИзмерения(Дата,Товар,ВидЦена,Данные)
// получить цену и единицу измерения и засунуть их в струтктру Данные
КонецПроцедуры

Автор: pashik 22.02.11, 10:13

Всем спасибо за то, что отозвались. Сегодня утром, перечитав все посты, - меня осенило!!! Все получилось вот так:

&НаКлиенте
Процедура СписокТоваровНоменклатураПриИзменении(Элемент)
    СтрокаТабличнойЧасти = Элементы.СписокТоваров.ТекущиеДанные;
    СтрокаТабличнойЧасти.Цена = РаботаСоСправочниками.ИзвлечЦену(Объект.Дата, СтрокаТабличнойЧасти.Номенклатура, Объект.ВидЦены);
КонецПроцедуры

&НаКлиенте
Процедура СписокТоваровНоменклатураОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
    СтрокаТабличнойЧасти = Элементы.СписокТоваров.ТекущиеДанные;
    СтрокаТабличнойЧасти.ЕдиницыИзмерения = ИзвлечЕдиницыИзмерения(ВыбранноеЗначение);
КонецПроцедуры

//Функция - извлечение единицы измерения из справочника
&НаСервереБезКонтекста
Функция ИзвлечЕдиницыИзмерения(ВыбранноеЗначение)
    Возврат ВыбранноеЗначение.ЕдиницыИзмерения;    
КонецФункции

Автор: logist 22.02.11, 14:51

Я бы сделал так:

&НаСервереБезКонтекста
Функция ПолучитьЕдиницуИзмерения(Номенклатура)
             Возврат Номенклатура.ЕдиницыИзмерения;
КонецФункции

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

Автор: torrensen 23.02.11, 15:33

Цитата(logist @ 22.02.11, 15:51) *
Я бы сделал так:
&НаСервереБезКонтекста
Функция ПолучитьЕдиницуИзмерения(Номенклатура)
             Возврат Номенклатура.ЕдиницыИзмерения;
КонецФункции

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



Я бы не стал так делать.
У вас 2 серверных вызова РаботаСоСправочниками.ИзвлечьЦену и ПолучитьЕдиницуИзмерения

В моем варианте выше только 1

Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua