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

Нужна помощь!!!

Автор Maximoshka, 12 дек 2013, 20:18

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

Maximoshka

Здравствуйте, я являюсь студентом. Изучаю 1С. Может быть я чего-то не понимаю, поэтому мои задачи могут быть немножко не логичными, как и принципы их решения.
Имеется Магазин со складом. При помощи документа  "ТоварнаяНакладная" заносится информация о товарах. Такие свойства как "Цена" заносится в регистр накопления "РегистрТоваров" из табличной части документа .
При продаже товара необходимо что бы в табличной части документа "ПродажаТовара" бралась информация "Наименование", а в этой же строке из регистра накопления автоматически указывалась "Цена".
Я подумал, что можно сделать это через запрос, И в модуле формы документа  "ПродажаТовара" я прописал следующее:


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


Ошибок не выдавалось но Цена не добавляется.

Помогите пожалуйста.

БезПонтов

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

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

Ну как-то так.
Ответ на вопрос - бесплатно!
Ответ на дурацкий вопрос - 5$
Ответ на дурацкий вопрос с обдумыванием - 100$

Maximoshka

Я переделал ваш код под себя, ошибок не выдаёт, но всёрано цену в табличную часть документа не устанавливает. Прошу прощения я не исключаю того, что я сделал что-то не так.
Я всего лишь 3 дня назад начал изучать 1С.
Вот мой код:

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

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

Добавлено: 12 дек 2013, 21:27


Эта строчка лишняя:
Элементы.Товары.ТекущиеДанные.Сумма = Элементы.Товары.ТекущиеДанные.Цена * Элементы.Товары.ТекущиеДанные.Количество;

БезПонтов

Цитата: Maximoshka от 12 дек 2013, 21:25

   Запрос.УстановитьПараметр("Наименование.Товары.ТекущиеДанные.Товар");

   Запрос.УстановитьПараметр("Наименование",Элементы.Товары.ТекущиеДанные.Товар");

Добавлено: 12 дек 2013, 21:45


Повторюсь, использовать наименование не разумно!
Как выглядит регистр-то? Это какая-то конфа 1С или полностью самописная?
Ответ на вопрос - бесплатно!
Ответ на дурацкий вопрос - 5$
Ответ на дурацкий вопрос с обдумыванием - 100$

Maximoshka

Цитата: БезПонтов от 12 дек 2013, 21:43
Повторюсь, использовать наименование не разумно!
Как выглядит регистр-то? Это какая-то конфа 1С или полностью самописная?

Конфигурацию создавал я сам с нуля. Табличная часть документа "ПродажаТоавара" состоит из реквизитов: Наименование, Количество, Цена, Сумма. Регистр "РегистрТоваров" имеет изменение "Товары" которое берётся из "Наименования" и ресурсы Количество, Цена, Сумма, которые подвязаны к табличной части документа, к ресурсам с таким же названием.

Я поправил код так, как вы предложили, ошибок нет, но всё равно ничего не происходит. Код выглядит так:



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

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

БезПонтов

Регистр измерение Наименование или Товар?

Можно попробовать так:

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("В запрос ничего не попало!");
КонецЕсли;

Выборка=Результат.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Результат.Цена);
КонецЦикла;

Так хоть будет понятно очепятка
Добавлено: 13 дек 2013, 16:56


Кстати, Цену пихать в регистр накопления не имеет ваще смысла ибо Регистр НАКАПЛИВАЕТ данные. И Цену можно выдрать только запросом за ПЕРИОД, что не нужно исходя из задачи.
Ещё момент, цена на товар с течением времени может меняться и полученная цена из регистра накопления будет средней по больнице.
Типа
01.12.13 Товар1 поступил 1 шт по 12 руб.
02.12.13 Товар1 поступил за 13 руб.

Цена из запроса получится 12,50 руб
Ответ на вопрос - бесплатно!
Ответ на дурацкий вопрос - 5$
Ответ на дурацкий вопрос с обдумыванием - 100$

Maximoshka

Цитата: БезПонтов от 13 дек 2013, 16:52
Регистр измерение Наименование или Товар?

Можно попробовать так:

Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщить("В запрос ничего не попало!");
КонецЕсли;

Выборка=Результат.Выбрать();
Пока Выборка.Следующий() Цикл
    Сообщить(Результат.Цена);
КонецЦикла;

Так хоть будет понятно очепятка
Добавлено: 13 дек 2013, 16:56


Кстати, Цену пихать в регистр накопления не имеет ваще смысла ибо Регистр НАКАПЛИВАЕТ данные. И Цену можно выдрать только запросом за ПЕРИОД, что не нужно исходя из задачи.
Ещё момент, цена на товар с течением времени может меняться и полученная цена из регистра накопления будет средней по больнице.
Типа
01.12.13 Товар1 поступил 1 шт по 12 руб.
02.12.13 Товар1 поступил за 13 руб.

Цена из запроса получится 12,50 руб
Спасибо)

Теги:

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

Рейтинг@Mail.ru

Поиск