• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Нужна помощь по 1С 8.1

  • Автор темы daffinus
  • Дата начала
D

daffinus

Склады, торговля со скидками,

В качестве исходной использовать каркасную конфигурацию.
Добавить в конфигурацию справочник "МестаХранения" (Склады).
Добавить учет остатков номенклатуры в разрезе складов. Проведение расходной накладной по регистру
"ОстаткиНоменклатуры" организовать с контролем остатка товаров в разрезе складов
и со списанием себестоимости по средневзвешенному (по складу) методу.
Добавить автоматический расчет скидки покупателю при оформлении расходной накладной. Размер скидки зависит от
суммы уже произведенных закупок в предыдущем месяце:
Объем закупки Процент скидки
от 1 000 р 2 %
от 3 000 р 5 %
от 5 000 р 10 %
от 10 000 р 15 %

При подборе товара цена должна рассчитываться следующим образом:
Цена = ЦенаЧист*(100-ПроцСкидки)/100
При изменении клиента должны: устанавливаться соответствующий ему процент скидки;
пересчитываться цены в строках накладной.

Может кто помочь? Нужен код модуля документа «Расходная»
 
W

WildAnther

Это я как понимаю задание по учебе? Чем конкретно попочь то? задачу полностью решить?
Делать что нить пробовал?
 
D

daffinus

Пробовал :) У меня получился такой код, но:
1) Цена не уменьшается (100-15/100),итог суммы не уменьшается.
2) Процент не находится, хотя выборка в конструкторе запроса проходит нормально.

Собственно,код:


Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаДокумента=Товары.Итог("Сумма")+Издержки.Итог("Сумма");
КонецПроцедуры

Процедура ОбработкаПроведения(Отказ, Режим)

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

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


Если Отказ Тогда
Сообщить(ТекстСообщения);
Возврат;
КонецЕсли;


Для Каждого ТекСтрокаТовары Из Товары Цикл
Товар=Новый Структура("Номенклатура",ТекСтрокаТовары.Номенклатура);
КоличествоНаСписание=ТекСтрокаТовары.Количество;

Пока КоличествоНаСписание>0 Цикл
Выборка.НайтиСледующий(Товар);

Если Выборка.ОстатокНаСкладе>=КоличествоНаСписание Тогда
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Контрагент = Контрагент;
Движение.Количество = КоличествоНаСписание;
//Процент = Выборка.Процент;
Движение.Сумма = ТекСтрокаТовары.Цена*((100-15)/100)*КоличествоНаСписание;
// Цена = ЦенаЧист*(100-ПроцСкидки)/100
//ОСтатки
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Количество = КоличествоНаСписание;
Движение.Сумма = КоличествоНаСписание*Выборка.СуммаОстаток/Выборка.ОстатокНаСкладе;

КоличествоНаСписание=0;
Иначе
Движение = Движения.Продажи.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Контрагент = Контрагент;
Движение.Количество = Выборка.КоличествоПартии;
Движение.Сумма = ТекСтрокаТовары.Цена*КоличествоНаСписание;


// регистр ОстаткиНоменклатуры
Движение = Движения.ОстаткиНоменклатуры.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Склад =Склад;
Движение.Количество = ТекСтрокаТовары.Количество;
Движение.Сумма =ТекСтрокаТовары.Сумма ;
//КоличествоНаСписание=КоличествоНаСписание-Выборка.КоличествоПартии;
КонецЕсли;
КонецЦикла;
Выборка.Сбросить();
КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ


//{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
//Для Каждого ТекСтрокаТовары Из Товары Цикл
// регистр ОстаткиНоменклатуры Приход
//Движение = Движения.ОстаткиНоменклатуры.Добавить();
// Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
// Движение.Период = Дата;
// Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
// Движение.Склад = Склад;
// Движение.Количество = ТекСтрокаТовары.Количество;
// Движение.Сумма = ТекСтрокаТовары.Сумма;
//КонецЦикла;
//}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

///
//Запрос = Новый Запрос;
// Запрос.Текст = "ВЫБРАТЬ
Запрос.Текст = " ВЫБРАТЬ
|ВЫБОР
| КОГДА СУММА(ПродажиОбороты.СуммаОборот) > 1000
| И СУММА(ПродажиОбороты.СуммаОборот) <= 3000
| ТОГДА 2
| КОГДА СУММА(ПродажиОбороты.СуммаОборот) > 3000
| И СУММА(ПродажиОбороты.СуммаОборот) <= 5000
| ТОГДА 5
| КОГДА СУММА(ПродажиОбороты.СуммаОборот) > 5000
| И СУММА(ПродажиОбороты.СуммаОборот) <= 10000
| ТОГДА 10
| КОГДА СУММА(ПродажиОбороты.СуммаОборот) > 10000
| ТОГДА 15
| ИНАЧЕ 0
| КОНЕЦ КАК Процент
//|ПродажиОбороты.Контрагент
|ИЗ
|РегистрНакопления.Продажи.Обороты(&НачПериода, &КонПериода, , Контрагент = &Контрагент) КАК ПродажиОбороты";

// |СГРУППИРОВАТЬ ПО
// |ПродажиОбороты.Контрагент";
Запрос.УстановитьПараметр("НачПериода", НачалоМесяца(ДобавитьМесяц(Дата, -1))); // Дата - дата документа
Запрос.УстановитьПараметр("КонПериода", КонецМесяца(ДобавитьМесяц(Дата, -1)));
Запрос.УстановитьПараметр("Контрагент", Контрагент);
// Запрос.УстановитьПараметр("Процент", Процент);
//Процент=2;
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();



/// Выборка = Результат.Выбрать();


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

Заранее спасибо!
 
D

daffinus

Процент считает, но потом никак не использует его и пишет что поле не определено.
 
T

tanat

в первом тексте запроса чтото я не увидел поля с именем "процент"
 
D

daffinus

То есть? Куда его там вставить?
 
H

has

я бы сделал соединение запросов по контрагенту
 
D

DjAlex



посмотри здесь и все поймешь....
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!