Консультация № 162478
16.03.2009, 10:18
0.00 руб.
0 3 2
Добрый день, уважаемые эксперты! Есть пара небольших нюансов, которые я, в силу своей неопытности, понять не могу. Буду очень благодарен если кто-нибудь поделится опытом. Подскажите что необходимо сделать, чтобы поле Дата документа Приходная содержало только дату без времени? И как можно отловить пустые результаты нижеприведённого запроса:

ВЫБРАТЬ
Константы.МаксПроцентПрибыли,
РасходнаяТовары.Количество,
ПартииТоваровОстатки.Партия,
ПартииТоваровОстатки.КоличествоОстаток,
РасходнаяТовары.Номенклатура,
ПартииТоваровОстатки.СтоимостьОстаток,
РасходнаяТовары.Цена
ИЗ
Константы КАК Константы,
Документ.Расходная.Товары КАК РасходнаяТовары
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ПартииТоваров.Остатки КАК ПартииТоваровОстатки
ПО РасходнаяТовары.Номенклатура = ПартииТоваровОстатки.Номенклатура
ГДЕ
ПартииТоваровОстатки.СтоимостьОстаток * (1 + Константы.МаксПроцентПрибыли / 100) <= РасходнаяТовары.Цена

Если я в документе Расходная выбираю Номенклатуру прихода которой не было или указываю цену ( РасходнаяТовары.Цена), которая не вписывается в условие ПартииТоваровОстатки.СтоимостьОстаток * (1 + Константы.МаксПроцентПрибыли / 100) <= РасходнаяТовары.Цена, то документ спокойно проводится( Как этого можно избежать! Уже исчерпал все варианты(

Обсуждение

Неизвестный
16.03.2009, 11:11
общий
это ответ
Здравствуйте, Mastak06!
Не вижу смысла использовать в запросе таблицу РасходнаяТовары так как Вы во-первых не указываете конкретный документ Расходная накладная, и, что самое важное, в регистрах нет информации по текущему документу до его проведения.
Рекомендации: 1 Использовать в запросе данные табличного поля документа (Например, выгрузить данные из табличного поля документа в таблицу значений, передав ее запросу в качестве параметра) ИЛИ

2
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
МаксимальныйПроцентПрибыли = Константы.МаксПроцентПрибыли.Получить();
Для Каждого ТекущаяСтрока Из Товары Цикл
Отбор = Новый Структура;
Отбор.Вставить("Номенклатура", ТекущаяСтрока.Номенклатура);
Отбор.Вставить("СкладКомпании", СкладКомпании);
Стоимость = РегистрыНакопления.ПартииТоваровОстатки.Остатки(Дата, Отбор).Получить(0).СтоимостьОстаток;
ХорошоПродаем = Истина;
Если Стоимость* (1 + МаксимальныйПроцентПрибыли / 100) <= ТекущаяСтрока.Цена Тогда
Сообщить("Товар " + ТекущаяСтрока.Номенклатура + " плохо продаем!", СтатусСообщения.Важное);
ХорошоПродаем = Ложь;
КонецЕсли;
Если ХорошоПродаем = Ложь Тогда
Отказ = Истина;
КонецЕсли;
КонецПроцедуры()


КонецЦикла

Неизвестный
16.03.2009, 12:19
общий
Денис, спасибо за совет. На самом деле полный текст выглядит так:
Процедура ОбработкаПроведения(Отказ, Режим)
Запрос = Новый Запрос;

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

Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Выборка = Запрос.Выполнить().Выбрать();

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

Если Отказ Тогда
Возврат;
КонецЕсли;

То был вложенный запрос где я выбираю партии, стоимость которых проходит по условию ПартииТоваровОстатки.СтоимостьОстаток * (1 + Константы.МаксПроцентПрибыли / 100) <= РасходнаяТовары.Цена. А вообще весь вышеприведённый запрос мне необходим для получения полного количества остатка товаров во всех партиях, которые удовлетворяют этому условию. Но вот только если я выбираю наименование товара, который не был ни разу оприходован или устанавливаю Цену в Расходной по которой вообще остатков в партиях нет, то вместо значения полей запроса содержат "ошибка чтения значение" без типа. В итоге расходная проводится( Пробовал использовать ЕстьNull(), но ничего тоже не вышло(
Неизвестный
16.03.2009, 20:33
общий
это ответ
Здравствуйте, Mastak06!

1. Для того, чтобы выделить _дату_ из даты, воспользуйтесь функцией НачалоПериода(РасходнаяТовары.Ссылка.Дата, ДЕНЬ)
2. Для фильтрации пустых записей в виртуальной таблице регистра партий лучше воспользоваться внутренним соединением. Если все же требуется левое соединение, то добавьте проверку ЕСТЬ NULL (не путать с функцией ЕСТЬNULL() )
Форма ответа