Первая половина алгоритма переопределяемой процедуры — типовая, и все же я представляю полный листинг процедуры — чтобы можно было скопировать в свою конфигурацию. А в следующем абзаце описана суть изменений — по сути ядро модели.
Процедура ПроверитьДопустимостьЦенОтпуска(ДокументОбъект, ИмяТабличнойЧасти, Отказ) Экспорт
Запрос = Новый Запрос;
МетаданныеДокумента = ДокументОбъект.Метаданные();
ИмяДокумента = МетаданныеДокумента.Имя;
ЕстьХарактеристикаНоменклатуры = ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("ХарактеристикаНоменклатуры", МетаданныеДокумента, ИмяТабличнойЧасти);
ДополнительныеПоля = "";
ЛевоеСоединение = "";
ПоляДляОбъединенияЗапросов = "";
СписокФильтров = УправлениеПользователями.ПолучитьЗначениеПраваДляТекущегоПользователя(ПланыВидовХарактеристик.ПраваПользователей.НеОтпускатьТоварСЦенойНижеОпределенногоТипа, Неопределено);
НомерТипаЦен = 0;
Для Каждого ТипЦены Из СписокФильтров Цикл
Если НЕ ЗначениеЗаполнено(ТипЦены.Значение) Тогда
// Если хотя бы для одного набора прав не задан тип цен, ниже которого нельзя продавать,
// то значит можно продавать по любой цене.
Возврат;
КонецЕсли;
НомерТипаЦен = НомерТипаЦен + 1;
Запрос.УстановитьПараметр("ДатаСреза", ДокументОбъект.Ссылка.Дата);
Запрос.УстановитьПараметр("ЦенаВключаетНДС" + НомерТипаЦен, ТипЦены.Значение.ЦенаВключаетНДС);
Если ТипЦены.Значение.Рассчитывается Тогда
Запрос.УстановитьПараметр("ТипЦен" + НомерТипаЦен, ТипЦены.Значение.БазовыйТипЦен);
Запрос.УстановитьПараметр("ТипЦенДинамический" + НомерТипаЦен, ТипЦены.Значение);
Запрос.УстановитьПараметр("Коэффициент" + НомерТипаЦен, ТипЦены.Значение.ПроцентСкидкиНаценки);
Иначе
Запрос.УстановитьПараметр("ТипЦен" + НомерТипаЦен, ТипЦены.Значение);
Запрос.УстановитьПараметр("Коэффициент" + НомерТипаЦен, 0);
КонецЕсли;
ЛевоеСоединение = ЛевоеСоединение + "
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦен" + НомерТипаЦен + " И (Номенклатура" + ?(ЕстьХарактеристикаНоменклатуры, ", ХарактеристикаНоменклатуры", "") + ") В (ВЫБРАТЬ РАЗЛИЧНЫЕ Док.Номенклатура " + ?(ЕстьХарактеристикаНоменклатуры, ", Док.ХарактеристикаНоменклатуры", "")+ " ИЗ Документ." + ИмяДокумента + "."+ИмяТабличнойЧасти+" КАК Док ГДЕ Док.Ссылка = &ДокументСсылка)) КАК ЦеныКомпании" + НомерТипаЦен + "
| ПО ЦеныКомпании" + НомерТипаЦен + ".Номенклатура = Док.Номенклатура";
Если ЕстьХарактеристикаНоменклатуры Тогда
Запрос.УстановитьПараметр("ПустаяХарактеристикаНоменклатуры" , Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка());
ЛевоеСоединение = ЛевоеСоединение + "
| И
| ЦеныКомпании" + НомерТипаЦен + ".ХарактеристикаНоменклатуры = Док.ХарактеристикаНоменклатуры
|
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦен" + НомерТипаЦен + " И (Номенклатура, ХарактеристикаНоменклатуры) В (ВЫБРАТЬ РАЗЛИЧНЫЕ Док.Номенклатура , ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры ИЗ Документ." + ИмяДокумента + "."+ИмяТабличнойЧасти+" КАК Док ГДЕ Док.Ссылка = &ДокументСсылка)) КАК ЦеныКомпанииБезХарактеристики" + НомерТипаЦен + "
| ПО ЦеныКомпанииБезХарактеристики" + НомерТипаЦен + ".Номенклатура = Док.Номенклатура
| И
| ЦеныКомпанииБезХарактеристики" + НомерТипаЦен + ".ХарактеристикаНоменклатуры = &ПустаяХарактеристикаНоменклатуры
|";
ДополнительныеПоля = ДополнительныеПоля + "," + "
| &ЦенаВключаетНДС" + НомерТипаЦен +" КАК ЦенаВключаетНДС" + НомерТипаЦен +",
| &Коэффициент" + НомерТипаЦен +" КАК ПроцентСкидкиНаценкиИзСправочника" + НомерТипаЦен +",
| ВЫБОР КОГДА ЦеныКомпании" + НомерТипаЦен + ".Цена ЕСТЬ NULL ТОГДА
| ЦеныКомпанииБезХарактеристики" + НомерТипаЦен + ".Цена
| ИНАЧЕ ЦеныКомпании" + НомерТипаЦен + ".Цена КОНЕЦ КАК Цена" + НомерТипаЦен;
Если ТипЦены.Значение.Рассчитывается Тогда
ДополнительныеПоля = ДополнительныеПоля + "," + "
| ВЫБОР КОГДА ЦеныКомпании" + НомерТипаЦен + ".Цена ЕСТЬ NULL ТОГДА
| ВложенныйЗапросБезХарактеристики" + НомерТипаЦен +".ПроцентСкидкиНаценкиБезХарактеристики
| ИНАЧЕ ВложенныйЗапрос" + НомерТипаЦен +".ПроцентСкидкиНаценки КОНЕЦ КАК ПроцентСкидкиНаценки" + НомерТипаЦен;
КонецЕсли;
ДополнительныеПоля = ДополнительныеПоля + "," + "
| ВЫБОР КОГДА ЦеныКомпании" + НомерТипаЦен + ".Цена ЕСТЬ NULL ТОГДА
| ЦеныКомпанииБезХарактеристики" + НомерТипаЦен + ".Валюта
| ИНАЧЕ ЦеныКомпании" + НомерТипаЦен + ".Валюта КОНЕЦ КАК Цена" + НомерТипаЦен + "Валюта,
| ВЫБОР КОГДА ЦеныКомпании" + НомерТипаЦен + ".Цена ЕСТЬ NULL ТОГДА
| ЦеныКомпанииБезХарактеристики" + НомерТипаЦен + ".ЕдиницаИзмерения
| ИНАЧЕ ЦеныКомпании" + НомерТипаЦен + ".ЕдиницаИзмерения КОНЕЦ КАК Цена" + НомерТипаЦен + "Единица
|";
Иначе
ДополнительныеПоля = ДополнительныеПоля + "," + "
| &ЦенаВключаетНДС" + НомерТипаЦен +" КАК ЦенаВключаетНДС" + НомерТипаЦен;
Если ТипЦены.Значение.Рассчитывается Тогда
ДополнительныеПоля = ДополнительныеПоля + "," + "
| ЦеныКомпании" + НомерТипаЦен + ".Цена * (1 + ВложенныйЗапрос" + НомерТипаЦен +".ПроцентСкидкиНаценки / 100) КАК Цена" + НомерТипаЦен + ",
| ЦеныКомпании" + НомерТипаЦен + ".Валюта КАК Цена" + НомерТипаЦен + "Валюта,
| ЦеныКомпании" + НомерТипаЦен + ".ЕдиницаИзмерения КАК Цена" + НомерТипаЦен + "Единица";
Иначе
ДополнительныеПоля = ДополнительныеПоля + "," + "
| ЦеныКомпании" + НомерТипаЦен + ".Цена КАК Цена" + НомерТипаЦен + ",
| ЦеныКомпании" + НомерТипаЦен + ".Валюта КАК Цена" + НомерТипаЦен + "Валюта,
| ЦеныКомпании" + НомерТипаЦен + ".ЕдиницаИзмерения КАК Цена" + НомерТипаЦен + "Единица";
КонецЕсли;
КонецЕсли;
Если ТипЦены.Значение.Рассчитывается Тогда
ЛевоеСоединение = ЛевоеСоединение + "
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ДинамическиеЦеныКомпании" + НомерТипаЦен + ".ПроцентСкидкиНаценки КАК ПроцентСкидкиНаценки,
| ДинамическиеЦеныКомпании" + НомерТипаЦен + ".Номенклатура КАК Номенклатура";
Если ЕстьХарактеристикаНоменклатуры Тогда
ЛевоеСоединение = ЛевоеСоединение + ",
| ДинамическиеЦеныКомпании" + НомерТипаЦен + ".ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры";
КонецЕсли;
ЛевоеСоединение = ЛевоеСоединение + "
| ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦенДинамический" + НомерТипаЦен + " И (Номенклатура" + ?(ЕстьХарактеристикаНоменклатуры, ", ХарактеристикаНоменклатуры", "") + ") В (ВЫБРАТЬ РАЗЛИЧНЫЕ Док.Номенклатура " + ?(ЕстьХарактеристикаНоменклатуры, ", Док.ХарактеристикаНоменклатуры", "")+ " ИЗ Документ." + ИмяДокумента + "."+ИмяТабличнойЧасти+" КАК Док ГДЕ Док.Ссылка = &ДокументСсылка)
| ) КАК ДинамическиеЦеныКомпании" + НомерТипаЦен;
ЛевоеСоединение = ЛевоеСоединение + "
| )КАК ВложенныйЗапрос" + НомерТипаЦен +"
| ПО ЦеныКомпании" + НомерТипаЦен + ".Номенклатура = ВложенныйЗапрос" + НомерТипаЦен +".Номенклатура";
Если ЕстьХарактеристикаНоменклатуры Тогда
ЛевоеСоединение = ЛевоеСоединение + "
| И ЦеныКомпании" + НомерТипаЦен + ".ХарактеристикаНоменклатуры = ВложенныйЗапрос" + НомерТипаЦен +".ХарактеристикаНоменклатуры";
КонецЕсли;
Если ЕстьХарактеристикаНоменклатуры Тогда
ЛевоеСоединение = ЛевоеСоединение + "
| ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
| ДинамическиеЦеныКомпанииБезХарактеристики" + НомерТипаЦен + ".Номенклатура КАК Номенклатура,
| ДинамическиеЦеныКомпанииБезХарактеристики" + НомерТипаЦен + ".ПроцентСкидкиНаценки
| КАК ПроцентСкидкиНаценкиБезХарактеристики
| ИЗ
| РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&ДатаСреза, ТипЦен = &ТипЦенДинамический" + НомерТипаЦен + " И (Номенклатура, ХарактеристикаНоменклатуры) В (ВЫБРАТЬ РАЗЛИЧНЫЕ Док.Номенклатура , ЗНАЧЕНИЕ(Справочник.ХарактеристикиНоменклатуры.ПустаяСсылка) КАК ХарактеристикаНоменклатуры ИЗ Документ." + ИмяДокумента + "."+ИмяТабличнойЧасти+" КАК Док ГДЕ Док.Ссылка = &ДокументСсылка)
| ) КАК ДинамическиеЦеныКомпанииБезХарактеристики" + НомерТипаЦен;
ЛевоеСоединение = ЛевоеСоединение + "
| )КАК ВложенныйЗапросБезХарактеристики" + НомерТипаЦен +"
| ПО ЦеныКомпании" + НомерТипаЦен + ".Номенклатура = ВложенныйЗапрос" + НомерТипаЦен +".Номенклатура";
КонецЕсли;
КонецЕсли;
КонецЦикла;
ВалютаРегламентированногоУчета = глЗначениеПеременной("ВалютаРегламентированногоУчета");
Запрос.УстановитьПараметр("ВалютаРеглУчета", ВалютаРегламентированногоУчета);
Запрос.Текст = "
|ВЫБРАТЬ
| Док.Номенклатура,
| "+?(ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("ЕдиницаИзмерения", МетаданныеДокумента, ИмяТабличнойЧасти),"Док.ЕдиницаИзмерения", "Док.Номенклатура.ЕдиницаХраненияОстатков")+" КАК ЕдиницаИзмерения,
| "+?(ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("СтавкаНДС", МетаданныеДокумента, ИмяТабличнойЧасти),"Док.СтавкаНДС,", "")+"
| ВЫБОР КОГДА Количество = 0 ТОГДА Док.Цена ИНАЧЕ Док.Сумма/Док.Количество КОНЕЦ КАК Цена,
| "+?(ОбщегоНазначения.ЕстьРеквизитДокумента("ВалютаДокумента", МетаданныеДокумента),"Док.Ссылка.ВалютаДокумента", "&ВалютаРеглУчета")
+" КАК ВалютаДокумента,
| Док.НомерСтроки
|" + ДополнительныеПоля + "
|
|ИЗ
| Документ." + ИмяДокумента + "."+ИмяТабличнойЧасти+" КАК Док
|" + ЛевоеСоединение + "
|ГДЕ
| Док.Ссылка = &ДокументСсылка
|";
// Установим параметры запроса.
Запрос.УстановитьПараметр("ДокументСсылка" , ДокументОбъект.Ссылка);
РезультатЗапроса = Запрос.Выполнить();
ПроверилиНаличиеЦенВЗапросе = Ложь;
СоответствиеКурсыВалют = Новый Соответствие;
ТабличнаяЧастьТовары = Неопределено;
Контрагент = Неопределено;
Если ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.СчетНаОплатуПокупателю")
ИЛИ ТипЗнч(ДокументОбъект) = Тип("ДокументОбъект.ЗаказПокупателя") Тогда
ТабличнаяЧастьТовары = ДокументОбъект.Товары;
Контрагент = ДокументОбъект.Контрагент;
ИначеЕсли ЗначениеЗаполнено(ДокументОбъект.Сделка) Тогда //РеализацияТоваровУслуг, ДокументОбъект.Сделка — это Заказ
ТабличнаяЧастьТовары = ДокументОбъект.Сделка.Товары;
Контрагент = ДокументОбъект.Сделка.Контрагент;
КонецЕсли;
КатегорияЦенКонтрагента = Неопределено;
Если ЗначениеЗаполнено(Контрагент) И ТипЗнч(Контрагент) = Тип("СправочникСсылка.Контрагенты") Тогда
КатегорияЦенКонтрагента = Контрагент.КатегорияЦен;
КонецЕсли;
ТЗ = РезультатЗапроса.Выгрузить();
ТЗ.Колонки.Добавить("НовыйМинимумЦены"); //при согласовании руководителем
ТЗ.ЗаполнитьЗначения(0, "НовыйМинимумЦены");
ТЗ.Колонки.Добавить("ЦенаКонтрагента"); //цена контрагента, если задана
ТЗ.ЗаполнитьЗначения(1000000, "ЦенаКонтрагента");
Если ТабличнаяЧастьТовары<>Неопределено Тогда
//определим по документу-основанию согласованные цены
Для Каждого Стр Из ТабличнаяЧастьТовары Цикл
//при согласовании руководителем
Если ЗначениеЗаполнено(Стр.ОтветственныйЗаСогласование) И Стр.Согласовано Тогда
мНовыйМинимумЦены = МодульДоработок.ПолучитьНовыйМинимумЦены(Стр.ОтветственныйЗаСогласование, ДокументОбъект.Дата, Стр.Номенклатура);
ПараметрыОтбора = Новый Структура("Номенклатура");
ПараметрыОтбора.Вставить("Номенклатура", Стр.Номенклатура);
НайденныеСтрокиТЗ = ТЗ.НайтиСтроки(ПараметрыОтбора);
Для Каждого СтрТЗ Из НайденныеСтрокиТЗ Цикл
СтрТЗ.НовыйМинимумЦены = мНовыйМинимумЦены;
КонецЦикла;
КонецЕсли;
//цена контрагента, если задана
Если ЗначениеЗаполнено(КатегорияЦенКонтрагента) Тогда
ОтборЦен = Новый Структура("ТипЦен, Номенклатура");
//Прайсовые цены — Справочники.ТипыЦенНоменклатуры.НайтиПоКоду("УТ0000004")
//подразумевается, что базовый тип цен для цен контрагента — прайсовые цены
ОтборЦен.Вставить("ТипЦен", КатегорияЦенКонтрагента.БазовыйТипЦен);
ОтборЦен.Вставить("Номенклатура", Стр.Номенклатура);
ПрайсоваяЦена = РегистрыСведений.ЦеныНоменклатуры.ПолучитьПоследнее(ДокументОбъект.Дата, ОтборЦен).Цена;
//или так:
//Если ПрайсоваяЦена = 0 Тогда
// ЦенаКонтрагента = 0;
//КонецЕсли;
//или так:
Если ПрайсоваяЦена = 0 Тогда
//ничего не проверяем
Продолжить;
КонецЕсли;
//округление по арифмет. правилам
ЦенаКонтрагента = Окр(ПрайсоваяЦена * (1 + КатегорияЦенКонтрагента.ПроцентСкидкиНаценки / 100), 2);
Если ЦенаКонтрагента>0 Тогда
ПараметрыОтбора = Новый Структура("Номенклатура");
ПараметрыОтбора.Вставить("Номенклатура", Стр.Номенклатура);
НайденныеСтрокиТЗ = ТЗ.НайтиСтроки(ПараметрыОтбора);
Для Каждого СтрТЗ Из НайденныеСтрокиТЗ Цикл
СтрТЗ.ЦенаКонтрагента = ЦенаКонтрагента;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Выборка = РезультатЗапроса.Выбрать();
//Пока Выборка.Следующий() Цикл
Для Каждого Выборка Из ТЗ Цикл
Если НЕ ПроверилиНаличиеЦенВЗапросе Тогда
Если РезультатЗапроса.Колонки.Найти("Цена") <> Неопределено Тогда
ПроверилиНаличиеЦенВЗапросе = Истина;
Иначе
Возврат;
КонецЕсли;
КонецЕсли;
НомерТипаЦен = 1;
ЦенаТовара = ?(НЕ ЗначениеЗаполнено(Выборка.Цена), 0, Окр(Выборка.Цена,2));
ВалютаТовара = Выборка.ВалютаДокумента;
Если СоответствиеКурсыВалют[ВалютаТовара] = Неопределено Тогда
СтруктураКурсаЦеныТовара = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаТовара, ДокументОбъект.Дата);
КурсЦеныТовара = СтруктураКурсаЦеныТовара.Курс;
КратностьЦеныТовара = СтруктураКурсаЦеныТовара.Кратность;
СоответствиеКурсыВалют[ВалютаТовара] = СтруктураКурсаЦеныТовара;
Иначе
СтруктураКурсаЦеныТовара = СоответствиеКурсыВалют[ВалютаТовара];
КурсЦеныТовара = СтруктураКурсаЦеныТовара.Курс;
КратностьЦеныТовара = СтруктураКурсаЦеныТовара.Кратность;
КонецЕсли;
МинимальнаяЦена = 0;
Пока НомерТипаЦен <> 0 Цикл
Если РезультатЗапроса.Колонки.Найти("Цена" + НомерТипаЦен) <> Неопределено
И РезультатЗапроса.Колонки.Найти("Цена" + НомерТипаЦен + "Валюта") <> Неопределено
И РезультатЗапроса.Колонки.Найти("Цена" + НомерТипаЦен + "Единица") <> Неопределено Тогда
ЦенаПроверки = Выборка["Цена" + НомерТипаЦен];
ВалютаПроверки = Выборка["Цена" + НомерТипаЦен + "Валюта"];
ЕдиницаПроверки = Выборка["Цена" + НомерТипаЦен + "Единица"];
ЦенаВключаетНДС = Выборка["ЦенаВключаетНДС" + НомерТипаЦен];
// Считаем, что если не задана цена или валюта цены
// (нет цены данного типа для данной номенклатуры), то
// проверка прошла
Если НЕ ЗначениеЗаполнено(ВалютаПроверки)
Или НЕ ЗначениеЗаполнено(ЦенаПроверки) Тогда
МинимальнаяЦена = 0;
Прервать;
КонецЕсли;
Если РезультатЗапроса.Колонки.Найти("ПроцентСкидкиНаценки" + НомерТипаЦен) <> Неопределено Тогда
ПроцентСкидкиНаценки = Выборка["ПроцентСкидкиНаценки" + НомерТипаЦен];
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ПроцентСкидкиНаценки)
И РезультатЗапроса.Колонки.Найти("ПроцентСкидкиНаценкиИзСправочника" + НомерТипаЦен) <> Неопределено Тогда
ПроцентСкидкиНаценки = Выборка["ПроцентСкидкиНаценкиИзСправочника" + НомерТипаЦен];
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ПроцентСкидкиНаценки) Тогда
ПроцентСкидкиНаценки = 0;
КонецЕсли;
ЦенаПроверки = Окр(ЦенаПроверки * (1 + ПроцентСкидкиНаценки / 100), 2);
Если СоответствиеКурсыВалют[ВалютаПроверки] = Неопределено Тогда
СтруктураКурсаЦеныПроверки = МодульВалютногоУчета.ПолучитьКурсВалюты(ВалютаПроверки, ДокументОбъект.Дата);
КурсЦеныПроверки = СтруктураКурсаЦеныПроверки.Курс;
КратностьЦеныПроверки = СтруктураКурсаЦеныПроверки.Кратность;
СоответствиеКурсыВалют[ВалютаПроверки] = СтруктураКурсаЦеныПроверки;
Иначе
СтруктураКурсаЦеныПроверки = СоответствиеКурсыВалют[ВалютаПроверки];
КурсЦеныПроверки = СтруктураКурсаЦеныПроверки.Курс;
КратностьЦеныПроверки = СтруктураКурсаЦеныПроверки.Кратность;
КонецЕсли;
ЦенаПроверки = Ценообразование.ПересчитатьЦенуПриИзмененииЕдиницы(ЦенаПроверки, ЕдиницаПроверки, Выборка.ЕдиницаИзмерения);
ПересчитаннаяЦенаПроверки = МодульВалютногоУчета.ПересчитатьИзВалютыВВалюту(ЦенаПроверки,
ВалютаПроверки, ВалютаТовара,
КурсЦеныПроверки, КурсЦеныТовара,
КратностьЦеныПроверки, КратностьЦеныТовара);
ПересчитаннаяЦенаПроверки = Ценообразование.ПересчитатьЦенуПриИзмененииФлаговНалогов(ПересчитаннаяЦенаПроверки,
Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры,
// ДокументОбъект.ТипЦен.ЦенаВключаетНДС,
ЦенаВключаетНДС,
ОбщегоНазначения.ЕстьРеквизитДокумента("УчитыватьНДС",МетаданныеДокумента)
И ДокументОбъект.УчитыватьНДС,
ОбщегоНазначения.ЕстьРеквизитДокумента("СуммаВключаетНДС",МетаданныеДокумента)
И ДокументОбъект.СуммаВключаетНДС,
?(ОбщегоНазначения.ЕстьРеквизитТабЧастиДокумента("СтавкаНДС",МетаданныеДокумента, ИмяТабличнойЧасти),
УчетНДС.ПолучитьСтавкуНДС(Выборка.СтавкаНДС),0));
ПересчитаннаяЦенаПроверки = Окр(ПересчитаннаяЦенаПроверки, 2);
МинимальнаяЦена = ?(НомерТипаЦен = 1, ПересчитаннаяЦенаПроверки, Мин(МинимальнаяЦена, ПересчитаннаяЦенаПроверки));
Если МинимальнаяЦена = 0 Тогда
НомерТипаЦен = 0;
Иначе
НомерТипаЦен = НомерТипаЦен + 1;
КонецЕсли;
Иначе
НомерТипаЦен = 0;
КонецЕсли;
КонецЦикла;
МинимальнаяЦенаМенеджера = МинимальнаяЦена; //или по категории или 0, если не задана
МинимальнаяЦенаРуководителя = Выборка.НовыйМинимумЦены; //или по категории или 0, если не задана
МинимальнаяЦенаКонтрагента = Выборка.ЦенаКонтрагента; //или по категории или 1000000, если не задана
МинимальноВозможнаяЦена = Мин( Мин(МинимальнаяЦенаМенеджера, МинимальнаяЦенаРуководителя), МинимальнаяЦенаКонтрагента);
Если ЦенаТовара < МинимальноВозможнаяЦена Тогда
ТекстСообщения = "Строка " + Выборка.НомерСтроки + ": "
+ "Для товара " + Выборка.Номенклатура
+ Символы.ПС + " цена за единицу ниже порогового значения (цена: "
+ Формат(ЦенаТовара, "ЧДЦ=2; ЧН=0") + " " + ВалютаТовара
+ ", минимально возможное значение должно быть: "
+ Формат(МинимальноВозможнаяЦена, "ЧДЦ=2; ЧН=0") + " " + ВалютаТовара
+ ")";
ОбщегоНазначения.СообщитьОбОшибке(ТекстСообщения, Отказ);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
(0) нормально , делал подобную штуку с использованием РС , даже где то видео есть
(1) сложно представить , как это можно сделать с РС
(2) для ут 10.3 привязка по ключу строки тч
(2) там удалось сделать даже без изменения самой тч через ДополнительныеСвойства благо не управляемый интерфейс
(3) привязка к документу как осуществляется? а если один и тот же товар в двух строках в документе?
(4) для меня ДополнительныеСвойства пусть останутся в прошлом, в настоящем только для базовых версий… С Доп.Свойствами начинаются другие проблемы — в запросах — да и регистр ДопСвойства растет как на дрожжах… Поэтому я ушел от этой практики — использовать ДопСвойства…
(6) ДополнительныеСвойства (эм. может неправильно назвал) имелся в виду не регистр а структура привязанная к объекту
(6) там вообще интересная штука получилась , т.е изначально не хотелось редактировать ТЧ
как оказалось в заказе пок-ля и еще паре документов событие ПриВыводеСтроки обращается к общему модулю
само по себе привыводестроки довольно тормознутое если считывать данные из бд ,
но в обычных формах можно сделать такой финт , при открытии считать нужные данные в ДопСвойства (как соответствие) и обновлять из него
работает довольно шустро даже в тяжелых (больше 200 строк заказах) видимо берет из кэша
(8)
какие сведения считать? какие считаются нужными?
(8)
что обновлять?
(8)
согласен, есть, в ряде задач удобно использовать
(8)
согласен — я в одном проекте использовал Соответствие так — при проведении по партиям — сразу позиционировался на строке , по которой не хватает остатков, и все такие строки прокрашивал оранжевым — через Соответствие строк — и также использовал вызов ПриВыводеСтрок
(9) приложил скриншот
(10) прикольно
(9)
обновлять данные строк «при выводе строки «
(12) картинку увидел и все понял 🙂
правда , у вас и у меня задачи разные — цели разные, но ваша идея и подход мне нравятся, запомню это !
(6) зря кстати ушли
очень хорошо рисовать доп. реквизиты документов без изменения в кф
(14) да, интересно получается — напишите публикацию с деталями — у вас интересный проект
(15) ок руки дойдут напишу
(15) вернее была уже с деталями и проч , особого интереса не вызвала я и удалил ))
не умею рекламировать
(17)Тоже интересно. Статью можно не писать специально, может можно посмотреть черновики или какие -то примеры?
(18) интересно что ? Про согласование , есть видео вэтой статье ,
по поводу доп реквизитов , тут работает через перехват вызова общих модулей (немного соврал что без редактирования кф :), но сами документы остаются на замке )
(19)Спасибо
(20) вобще есть в планах сделать платную и бесплатную версии доработки УТ 10
в бесплатной основной функционал по доп реквизитам , в платной
помимо этого статусы заказов , платежные бокументы для БП настройка правил + бух. счета + выгрузка , может быть согласование , работа по комиссии , авансы и еще всякие плюшки по мелочи типа печати от разных подразделений итп , такая вот солянка )