Проверка наличия цены у номенклатуры

10.11.14

Разработка - Запросы

Проверка, есть цена у номенклатуры или нет

  Решил поделиться. Для чего это нужно, скажете вы. Это нужно для формирования отчета “Валовая прибыль”.  Данный код поможет реализовать проверку  "Установки цен номенклатуры" при “Реализации Товаров и Услуг” будет проверяться реализуемая номенклатура.

Если в Документе "Установка цен номенклатуры" не рассчитать цену по номенклатуре, при проведении документа выдаст Служебное сообщения вида “Товар не расценен” указав по какой имена номенклатуре не “Установлена цена номенклатуре” рассчитана. Кому-то может это пригодиться для решения данной задачи.

Конфигуратор - Документы - РеализацияТоваровУслуг - Модуль Обьекта - Процедура Перед Записью

 

 

Если РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
        Для Каждого Стр Из Товары Цикл         
            Запрос = Новый Запрос ;
            Запрос.Текст = 
                "ВЫБРАТЬ
                |    ЦеныНоменклатурыСрезПоследних.Цена
                |ИЗ
                |    РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
                |ГДЕ
                |    ЦеныНоменклатурыСрезПоследних.Номенклатура = &Номенклатура
                |    И ЦеныНоменклатурыСрезПоследних.ТипЦен = &ТипЦен";

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


См. также

Инструментарий разработчика Роли и права Запросы СКД Программист Руководитель проекта Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Платные (руб)

Инструменты для разработчиков 1С 8.3: Infostart Toolkit. Автоматизация и ускорение разработки на управляемых формах. Легкость работы с 1С.

12000 руб.

02.09.2020    172014    964    403    

924

Запросы Программист Бесплатно (free)

Увидел cheatsheet по SQL и захотелось нарисовать подобное, но про запросы.

18.10.2024    11759    sergey279    18    

65

Запросы Программист Платформа 1С v8.3 Запросы 1C:Бухгалтерия Бесплатно (free)

Столкнулся с интересной ситуацией, которую хотел бы разобрать, ввиду её неочевидности. Речь пойдёт про использование функции запроса АВТОНОМЕРЗАПИСИ() и проблемы, которые могут возникнуть.

11.10.2024    6715    XilDen    36    

85

Запросы Программист Запросы Бесплатно (free)

Отлаживая взаимодействие с базой данных, мы регулярно сталкиваемся с зависающими или подозрительно долго выполняющимися обращениями, негативно влияющими на производительность. О том, как в PostgreSQL выявить подозрительные запросы, основываясь на доступной о них информации, расскажем в статье.

16.08.2024    9392    user1840182    5    

28

Математика и алгоритмы Запросы Программист Платформа 1С v8.3 Запросы Бесплатно (free)

Рассмотрим быстрый алгоритм поиска дублей с использованием hash функции по набору полей шапки и табличных частей.

08.07.2024    2809    ivanov660    9    

22

Запросы СКД Программист Стажер Система компоновки данных Россия Бесплатно (free)

Часто при разработке отчетов в СКД возникает ситуация, когда не совсем понятно, почему отчет выводит не те данные, которые нужны, либо не выводит вовсе. Возникает потребность увидеть конечный запрос, который формирует СКД. Как это сделать, рассмотрим в этой статье.

15.05.2024    10714    implecs_team    6    

48

Запросы Программист Стажер Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Часто поступают задачи по произвольному распределению общих сумм. После распределения иногда пропадают копейки. Суть решения добавить АвтоНомерЗаписи() в ВТ распределения, и далее используя функции МАКСИМУМ или МИНИМУМ можем положить разницу копеек в первую или последнюю строку знаменателя распределения.

11.04.2024    3679    andrey_sag    10    

38
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. ruskiy1 10.11.14 17:59 Сейчас в теме
слабенькая попытка набить рейтинг.
2. ruskiy1 10.11.14 18:01 Сейчас в теме
запрос в цикле особенно порадовал))
Voland36; +1 Ответить
3. TheBear 5 10.11.14 18:45 Сейчас в теме
при проведении документа выдаст Служебное сообщения вида “Товар не расценен”

Конфигуратор - Документы - РеализацияТоваровУслуг - Модуль Обьекта - Процедура Перед Записью

Так при проведении или перед записью?!
И неужели проведется документ с незаполненной ценой? (на скриншоте)
Какой смысл данной процедуры ? Неужели я не могу вводить цену вручную?
4. prost_white_one 9 11.11.14 08:55 Сейчас в теме
(3) TheBear,
ПередЗаписью, можешь ввести цену вручную, но не даст провести документ.
6. TheBear 5 11.11.14 23:21 Сейчас в теме
(4)
ПередЗаписью, можешь ввести цену вручную, но не даст провести документ.

Конфигуратор - Документы - РеализацияТоваровУслуг - Модуль Обьекта - Процедура Перед Записью


Второй вопрос
Я шибко умный пользователь цена на товар есть, а я изменил ее руками - т.е. товар расценен, но цена другая - ломает необходимость вашей проверки !
8. prost_white_one 9 12.11.14 09:14 Сейчас в теме
(6) TheBear, Если я правильно вас понял, вы хотели бы чтобы была проверка Тип цен контроля. Если вам это нужно могу поделиться кодам для конфигурации.
9. nazik 12.11.14 09:31 Сейчас в теме
(8) проблема в том, что ваш велосипед не нужен в принципе. Т.к. механизм контроля 0 цены в документах продажи в системах УТ10.3, КА, УПП - существует, как и контроль продаж ниже определенного типа цен
5. ekaruk 4992 11.11.14 20:05 Сейчас в теме
Решение плохое потому что:
1. Нельзя в таких проверках использовать отдельный запрос на каждую строчку. Должен быть один общий запрос.
2. Не поняла, зачем эти извраты с количеством. Достаточно проверки "Результат.Пустой()"
3. И вообще для этой проверки нафиг не нужна транзакция. Ее нужно выполнять до транзакции в "ОбработкеПроверкиЗаполнения", а не "ПередЗаписью"
4. Хотя бы номер строки вывел бы.
7. prost_white_one 9 12.11.14 09:12 Сейчас в теме
(5) ekaruk, Подскажите пожалуйста, как правильней выглядел бы мой текст. Я только учусь программированию не судите сильно меня.
10. karapuzzzz 63 12.11.14 15:58 Сейчас в теме
(7) в данном случае код должен выглядеть так:
Конфигуратор - Документы - РеализацияТоваровУслуг - Модуль Обьекта - Процедура Перед Записью
// Типовой код. Ничего не трогать.

Если при проверке необходимо проверять на наличие цены в табличной части, то вообще ничего делать не надо. Типовой механизм уже не дает продавать товар по нулевой стоимости (если там не было шаловливых рук).
В случае валовой прибыли данные берутся из регистра "ПродажиОбороты" и "ПродажиСебестоимость". В первый данные передаются из табличной части. Т.е. какая стоимость будет, такая и занесется. Во вторую таблицу данные заносятся при проведении по данным партий товаров на складах. И проверять на установленную цену нет необходимости вообще. Ваш код не решает поставленной задачи.
11. Артано 796 13.11.14 09:54 Сейчас в теме
Солидарен с предыдущими ораторами. На статью не тянет, сам метод написан весьма слабо
12. Артано 796 27.11.14 10:55 Сейчас в теме
Решил сделать доброе дело и показать пример как можно было бы оптимизировать процедуру приведенную в топике. Конечно абстрагируемся от наличия типовых механизмов, просто возьмем существующую проблему в чистом виде.

Взамен прошу соблюдать принцип lurk moar

Запрос = Новый Запрос;
Запрос.УстановитьПараметр("табТовары",Товары.Выгрузить(,"НомерСтроки,Номенклатура,ХарактеристикаНоменклатуры"));
Запрос.УстановитьПараметр("Склад",Склад));
Запрос.УстановитьПараметр("ДатаЦен",Дата));

Запрос.Текст =

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

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