PDA

Просмотр полной версии : ПОМОГИТЕ



витал1980
02.09.2019, 11:31
У документа продажа товаров есть реквизит ПоСчету Тип ДокументСсылка.Счет
Документ продажа вводиться на основании документа счет, нужно сделать так чтоб пользователь не поставил количество больше чем в документе основании счет. Я учусь на программиста, не опытный в обработке проведения продажи товаров вот кусок кода, который пишу для этого механизма: без этого куска, проведение все свои функции выполняет, не знаю как обратиться к счету основанию количеству, ошибки выдает, или цикл с условным не правильно построил?:
2322

витал1980
02.09.2019, 18:55
ИМХО в общем случае лучше работать в запросе. Нужно сделать две таблицы из табличных частей документа счет и документа продажи, сгруппировать табличную часть с товарами по наименованию ("схлопнуть" строки с одинаковым товаром), далее левым соединением двух таблиц по номенклатуре получить разницу, исключить пустые строки. Далее, просто уведомление пользователя и разрешить/запретить и т.д. Если документ продажи записан, то вообще все несложно.



Сделал так, но условие не соблюдает, все равно проводит, если указываю в продаже заполненной на основании счета количество больше чем в счете
Ошибка такая
{Документ.ПродажаТоваров.М� �дульОбъекта(374)}: Операции сравнения на больше-меньше допустимы только для значений совпадающих примитивных типов (Булево, Число, Строка, Дата)
ИначеЕсли ВыборкаДетальныеЗаписи.Ко� �ичествоПродажа >= ВыборкаДетальныеЗаписи.Ко� �ичествоСчет Тогда //кол дока < кол в счете


Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ПродажаТоваровТовары.Номе� �клатура,
| СУММА(ПродажаТоваровТовар� �.Количество) КАК КоличествоПродажа,
| ПродажаТоваровТовары.Ссыл� �а.Склад,
| СУММА(СчетТовары.Количеств о) КАК КоличествоСчет
|ИЗ
| Документ.ПродажаТоваров.То вары КАК ПродажаТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Счет.Товары КАК СчетТовары
| ПО ПродажаТоваровТовары.Номе� �клатура = СчетТовары.Номенклатура
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоваровТовары.Номе� �клатура,
| ПродажаТоваровТовары.Ссыл� �а.Склад";
//Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();

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

// регистр СвободныеОстатки Расход
Движение = Движения.СвободныеОстатки. Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Рас� �од;
Движение.Период = Дата;
Движение.Номенклатура = ВыборкаДетальныеЗаписи.Но� �енклатура;
Движение.Склад = Склад;
Движение.КоличествоВСвобо� �номОстатке = ВыборкаДетальныеЗаписи.Ко� �ичествоПродажа;
КонецЕсли;

витал1980
02.09.2019, 20:46
Все заработало, ошибка в деталях в запросе не указал, счет и документ ссылку в условиях, чтоб по конкретным докам отбиралось. Все заработало, спасибо.