Имя: Пароль:
1C
1С v8
событие ПриИзменении()
,
0 Dmitry017
 
16.03.13
20:35
Имеется документ "ПриходнаяНакладная". В этом документе присутствует реквизит "Склад" И табличная часть. В табличной части есть поля:
НаименованиеТовара
Цена
Количество
Стоимость.
Есть 2 справочника: "Колбасы" и "ХлебобулочныеИзделия", в которых наименования товаров берутся из справочника "Номенклатура". Так вот, в этих справочника есть очень интересный реквизит "Цена".
Задача: как только пользователь выберет НаименованиеТовара, чтобы в нужном поле автоматически выставилась цена.
Я решил попробовать реализовать данный механизм с помощью запросов (запрос и его обработку пока что до конца недописал (хочу для начала всё под отладчиком прогнать).
&НаКлиенте
Процедура ТоварыНаименованиеТовараПриИзменении(Элемент)
   // Вставить содержимое обработчика.
   ПолучитьЦену(Элемент);
КонецПроцедуры

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



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

   


&НаКлиенте
Процедура ТоварыНаименованиеТовараПриИзменении(Элемент)
   // Вставить содержимое обработчика.
   ПолучитьЦену(Элемент);
КонецПроцедуры

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


ОШИБКА:
{Документ.ПриходнаяНакладная.Форма.ФормаДокумента.Форма(5)}: Ошибка при вызове метода контекста (ПолучитьЦену)
ПолучитьЦену(Элемент);
по причине:
Ошибка передачи данных между клиентом и сервером. Значение недопустимого типа.
по причине:
Ошибка преобразования данных XDTO:
Запись значения свойства 'param':
форма: Элемент
имя: {http://v8.1c.ru/8.2/managed-application/modules}param
по причине:
1 Lelic
 
16.03.13
20:47
Дмитрий, извините конечно, но я бы советовала вам купить книжку Радченко "Практическое пособие разработчика", там все доступно написано. Вам многое пригодится. Сейчас у вас сам подход неверный. Не хочу вас обидеть. Искренне советую.
2 ic-kat
 
16.03.13
21:00
вы на сервер передаете сам элемент формы. передайте значение. и саму функцию как процедуру вызываете. у вас значение куда возвращаться будет?
3 Dmitry017
 
16.03.13
21:07
ну вот решил для начала без извращений с запросами сделать. Нет такого Элемент.Значение
&НаКлиенте
Процедура ТоварыНаименованиеТовараПриИзменении(Элемент)
   // Вставить содержимое обработчика.
   //ПолучитьЦену(Элемент);
   ТекущаяЦена = ПолучитьЦенуБезЗапросов(Элемент.Значение);
   Объект.Товары.Цена.ТекущиеДанные = ТекущаяЦена;
КонецПроцедуры

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


&НаСервере
Функция ПолучитьЦенуБезЗапросов(Наименование)
     Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(Наименование);
    //так как имеются 2 справочника то 2 варианта развития событий
    Если Номенклатура.Родитель = "Колбасы" Тогда
        Цена = Справочники.Колбасы.НайтиПоНаименованию(Номенклатура).Цена;
    Иначе
        Цена = Справочники.ХлебобулочныеИзделия.НайтиПоНаименованию(Номенклатура).Цена;

    КонецЕсли;
    Возврат Цена;
   

КонецФункции // ПолучитьЦенуБезЗапросов()
4 hhhh
 
16.03.13
21:14
Номенклатура.Родитель  это не текст, а "Колбасы" - это текст. Как вы сравниваете так тупо?

Номенклатура.Родитель = "Колбасы"
5 Dmitry017
 
16.03.13
21:15
Номенклатура.Родитель.Наименование = "Колбасы"
6 zladenuw
 
16.03.13
21:16
(3) проверять нужно тип или по ссылке.
Если  ТипЗнч(Номенклатура.Родитель) = ТИп("СправочникСсылка.Колбасы") Тогда
7 Dmitry017
 
16.03.13
21:18
собственно ошибка при вызове серверной функции.
{Документ.ПриходнаяНакладная.Форма.ФормаДокумента.Форма(6)}: Поле объекта не обнаружено (Значение)
   ТекущаяЦена = ПолучитьЦенуБезЗапросов(Элемент.Значение);
8 ic-kat
 
16.03.13
21:20
я имела в виду не буквально, а значение измененного элемента. если реквизит, то текущее значение реквизита, если реквизит тч то что-то типа:
текСтрока = ЭлементыФормы.Товары.ТекущаяСтрока;
номенклатура = текСтрока.Номенклатура;
ТекущаяЦена = ПолучитьЦенуБезЗапросов(номенклатура);
9 ic-kat
 
16.03.13
21:20
вместо товары имя вашей тч
10 Dmitry017
 
16.03.13
21:21
табличная часть называется Товары
11 ic-kat
 
16.03.13
21:22
увидела, что у вас и реквизиты тч есть, значит вторая строка вот так:

номенклатура = текСтрока.НаименованиеТовара;
12 Dmitry017
 
16.03.13
21:23
Очень странно что сейчас с Элемент.Значение не получается работать. Об этом я читал в Радченко. И тогда работало. Хотя может я что-то путаю. Если что, подскажите, пожалуйста, что не так.
Вот, даже заскринил
http://zalil.ru/34353169
13 ic-kat
 
16.03.13
21:29
у радченко про 8.1
а вы делаете на 8.2? и пытаетесь разделить интерфейсные команды и те, что будут выполняться на сервере.
и кстати, опять передаете сам элемент на сервер.
попробуйте
Ном = элемент.значение;
ТекущаяЦена = ПолучитьЦену(ном);
14 ic-kat
 
16.03.13
21:31
или убрать директиву &НаСервере.
на клиенте все выполнится, если у вас функция ПолучитьЦену тут же
15 Dmitry017
 
16.03.13
21:43
Процедура ТоварыНаименованиеТовараПриИзменении(Элемент)
   // Вставить содержимое обработчика.
   //ПолучитьЦену(Элемент);
   ЗначениеЭлемента = Элемент.Значение;
   ТекущаяЦена = ПолучитьЦенуБезЗапросов(ЗначениеЭлемента);
   Объект.Товары.Цена.ТекущиеДанные = ТекущаяЦена;
КонецПроцедуры

Результат - ошибка - Поле Значение не обнаружено.та же самая ошибка
16 ic-kat
 
16.03.13
21:47
не хочу уже запускать базу, поставь точку, посмотри, что в элементе
17 Dmitry017
 
16.03.13
21:48
Элемент    ПолеФормы    ПолеФормы
АвтоВыборНезаполненного        Неопределено
АвтоВысотаЯчейки    Ложь    Булево
АвтоОтметкаНезаполненного        Неопределено
АвтоПереносСтрок    Истина    Булево
АктивизироватьПоУмолчанию    Ложь    Булево
БыстрыйВыбор        Неопределено
ВертикальноеПоложение    Авто    ВертикальноеПоложениеЭлемента
Вид    Поле ввода    ВидПоляФормы
Видимость    Истина    Булево
ВыбиратьТип    Истина    Булево
ВыборГруппИЭлементов    Авто    ГруппыИЭлементы
ВыделенныйТекст    ""    Строка
ВыделятьОтрицательные        Неопределено
Высота    0    Число
ВысотаЗаголовка    0    Число
ВысотаСпискаВыбора    0    Число
ГиперссылкаЯчейки    Ложь    Булево
ГоризонтальноеПоложение    Авто    ГоризонтальноеПоложениеЭлемента
ГоризонтальноеПоложениеВПодвале    Авто    ГоризонтальноеПоложениеЭлемента
ГоризонтальноеПоложениеВШапке    Лево    ГоризонтальноеПоложениеЭлемента
Доступность    Истина    Булево
ДоступныеТипы        ОписаниеТипов
Заголовок    ""    Строка
Имя    "ТоварыНаименованиеТовара"    Строка
КартинкаКнопкиВыбора    Картинка    Картинка
КартинкаПодвала    Картинка    Картинка
КартинкаШапки    Картинка    Картинка
КнопкаВыбора        Неопределено
КнопкаОткрытия        Неопределено
КнопкаОчистки        Неопределено
КнопкаРегулирования        Неопределено
КнопкаСпискаВыбора        Неопределено
КонтекстноеМеню    ГруппаФормы    ГруппаФормы
МаксимальноеЗначение        Неопределено
Маска    ""    Строка
МинимальноеЗначение        Неопределено
МногострочныйРежим        Неопределено
ОбновлениеТекстаРедактирования    Авто    ОбновлениеТекстаРедактирования
ОграничениеТипа        ОписаниеТипов
ОтметкаНезаполненного    Ложь    Булево
ОтображатьВПодвале    Истина    Булево
ОтображатьВШапке    Истина    Булево
ОтображениеПредупрежденияПриРедактировании    Авто    ОтображениеПредупрежденияПриРедактировании
ПараметрыВыбора    ФиксированныйМассив    ФиксированныйМассив
Подсказка    ""    Строка
ПоложениеЗаголовка    Авто    ПоложениеЗаголовкаЭлементаФормы
ПредупреждениеПриРедактировании    ""    Строка
ПропускатьПриВводе        Неопределено
ПутьКДанным    Ошибка чтения значения    
ПутьКДаннымПодвала    Ошибка чтения значения    
РазрешитьСоставнойТип    Истина    Булево
РастягиватьПоВертикали        Неопределено
РастягиватьПоГоризонтали        Неопределено
РасширенноеРедактирование        Неопределено
РедактированиеТекста    Истина    Булево
РежимВыбораИзСписка    Ложь    Булево
РежимВыбораНезаполненного    При нажатии Enter    РежимВыбораНезаполненного
РежимПароля        Неопределено
РежимРедактирования    Вход при вводе    РежимРедактированияКолонки
Родитель    ТаблицаФормы    ТаблицаФормы
СвязиПараметровВыбора    ФиксированныйМассив    ФиксированныйМассив
СвязьПоТипу    СвязьПоТипу    СвязьПоТипу
СочетаниеКлавиш    СочетаниеКлавиш    СочетаниеКлавиш
СписокВыбора        СписокЗначений
ТекстПодвала    ""    Строка
ТекстРедактирования    "Булочка с повидлом"    Строка
ТолькоПросмотр    Ложь    Булево
ФиксацияВТаблице    Нет    ФиксацияВТаблице
ФормаВыбора    Ошибка чтения значения    
Формат    ""    Строка
ФорматРедактирования    ""    Строка
ЦветРамки    Авто    Цвет
ЦветТекста    Авто    Цвет
ЦветТекстаЗаголовка    Авто    Цвет
ЦветТекстаПодвала    Авто    Цвет
ЦветФона    Авто    Цвет
ЦветФонаЗаголовка    Авто    Цвет
ЦветФонаПодвала    Авто    Цвет
Ширина    0    Число
ШиринаСпискаВыбора    0    Число
Шрифт    Авто    Шрифт
ШрифтЗаголовка    Авто    Шрифт
ШрифтПодвала    Авто    Шрифт
18 Dmitry017
 
16.03.13
21:55
Странно. Наверно раньше в 1С 8.1 было поле "Значение", а теперь убрали. Как я понял, надо через поле ТекстРедактирования работать
19 ic-kat
 
16.03.13
21:57
а в поле НаименованиеТовара у тебя что? наименование или ссылка?
20 Dmitry017
 
16.03.13
22:01
В справочниках Колбасы и ХлебобулочныеИзделия есть поле НаименованиеТовара, которое имеет тип СправочникСсылка.Номенклатура
21 ic-kat
 
16.03.13
22:01
похоже, что наименование. естественно у строки какое значение может быть. запихивай ссылку туда
22 ic-kat
 
16.03.13
22:02
..... табличная часть. В табличной части есть поля:
НаименованиеТовара
Цена
Количество


это из первого поста.

НаименованиеТовара - тип какой?
23 ic-kat
 
16.03.13
22:03
в НаименованиеТовара ссылку запихай
24 Dmitry017
 
16.03.13
22:14
А! Да, конечно, там ссылка на справочник Номенклатура.
Изначально и была ссылка.
25 Dmitry017
 
16.03.13
22:16
вот проблема
СтрокаСправочника = Справочники.ХлебобулочныеИзделия.НайтиПоНаименованию(Наименование);
        Цена = СтрокаСправочника.Цена;

При выполнении этого кода все поля в СтрокаСправочника оказываются пустыми. Хотя такое наименование 100% присутствует в справочнике ХлебобулочныеИзделия.
Наименование    "Булочка с маком"    Строка

А вот значение СтрокаСправочника:

       
СтрокаСправочника        СправочникСсылка.ХлебобулочныеИзделия
ВерсияДанных    "            "    Строка
Владелец        Неопределено
Код    ""    Строка
Количество    0    Число
Наименование    ""    Строка
НаименованиеТовара        СправочникСсылка.Номенклатура
ВерсияДанных    "            "    Строка
Владелец        Неопределено
Код    ""    Строка
Наименование    ""    Строка
ПометкаУдаления    Ложь    Булево
Предопределенный    Ложь    Булево
Родитель        СправочникСсылка.Номенклатура
ВерсияДанных    "            "    Строка
Владелец        Неопределено
Код    ""    Строка
Наименование    ""    Строка
ПометкаУдаления    Ложь    Булево
Предопределенный    Ложь    Булево
Родитель        СправочникСсылка.Номенклатура
ВерсияДанных    "            "    Строка
Владелец        Неопределено
Код    ""    Строка
Наименование    ""    Строка
ПометкаУдаления    Ложь    Булево
Предопределенный    Ложь    Булево
Родитель        СправочникСсылка.Номенклатура
Ссылка        СправочникСсылка.Номенклатура
ЭтоГруппа    Ложь    Булево
Ссылка        СправочникСсылка.Номенклатура
ЭтоГруппа    Ложь    Булево
Ссылка        СправочникСсылка.Номенклатура
ВерсияДанных    "            "    Строка
Владелец        Неопределено
Код    ""    Строка
Наименование    ""    Строка
ПометкаУдаления    Ложь    Булево
Предопределенный    Ложь    Булево
Родитель        СправочникСсылка.Номенклатура
Ссылка        СправочникСсылка.Номенклатура
ВерсияДанных    "            "    Строка
Владелец        Неопределено
Код    ""    Строка
Наименование    ""    Строка
ПометкаУдаления    Ложь    Булево
Предопределенный    Ложь    Булево
Родитель        СправочникСсылка.Номенклатура
Ссылка        СправочникСсылка.Номенклатура
ВерсияДанных    "            "    Строка
Владелец        Неопределено
Код    ""    Строка
Наименование    ""    Строка
ПометкаУдаления    Ложь    Булево
Предопределенный    Ложь    Булево
Родитель        СправочникСсылка.Номенклатура
Ссылка        СправочникСсылка.Номенклатура
ЭтоГруппа    Ложь    Булево
ЭтоГруппа    Ложь    Булево
ЭтоГруппа    Ложь    Булево
ЭтоГруппа    Ложь    Булево
ПометкаУдаления    Ложь    Булево
Поставщик        ПеречислениеСсылка.Поставщики
Предопределенный    Ложь    Булево
Родитель        СправочникСсылка.ХлебобулочныеИзделия
Ссылка        СправочникСсылка.ХлебобулочныеИзделия
Цена    0    Число
ЭтоГруппа    Ложь    Булево
26 Dmitry017
 
16.03.13
22:18
вот скрин со справочника ХлебобулочныеИзделия http://zalil.ru/34353344
27 zladenuw
 
16.03.13
22:50
и что ты хочешь сделать ? у тебя цена находится в самой ссылке товара.
28 Dmitry017
 
16.03.13
23:02
а как правильно тогда сделать? Я честно говоря не совсем понял
29 zladenuw
 
16.03.13
23:03
погугли книгу что тебе посоветовали. ее можно скачать.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший