ТиС 9.2
Т.к. некоторые товары на нашей фирме периодически пропадают у поставщиков на неопределенное время, возникла задача запретить продавать такие товары по оптовым ценам.
Делаю на форме номенклатуры окошко для ввода числа, добавляю реквизит-число (к примеру, МинОстОпт), а вот что дальше с этим делать не знаю.
Предполагаю, что можно реализовать это двумя способами:
1. При выборе контрагента, проверять установленный у него Тип Цен (кроме закупочной и розничной) и в Подборе Товара уменьшать видимое количество товара на фирме и складе, у которого установлен МинОстОпт, на это МинОстОпт.
Например: остаток товара на складе и фирме равен 5, МинОстОпт установлен 2; в Подборе Товара видим на складе и фирме, что остаток этого товара равен 3.
2. Все тоже самое, что и п.1 только, количество товара не меняется, а идет замена любого Типа Цен, кроме закупочной и розничной) на розничную.
Например: количество товара на фирме и складе остается прежним 5 шт, а вот цена вместо 3 руб.(как в опте) устанавливается равной 5 руб.(как в рознице).
---
Самоделкин, Ну что-ж, удачи.
Мелкий советик: В глобальнике есть функция глВернутьЦену. Когда в конфигурации что-то либо хочет получить цену, вызывает эту функцию или обёртку над ней глПолучитьЦену. В самом начале глВернутьЦену определяется тип цены, из которого реально будут браться цены

```1c
    НужныйТипЦен = ?(ПустоеЗначение(Рассчетная) = 1, ТипЦены, ТипЦены.БазовыйТипЦен);
```

Можно в этом месте вставить определение наличного остатка и, если он меньше указанного в номенклатуре, брать другой тип цен. Только обязательно проверить работу обработок ФормированиеЦен и ОбновлениеЦенИзДокумента. При их работе проверка остатка и подмена типа цен не должна делаться. Можно передавать дополнительный параметр в функцию, показывающий, нужен или нет контроль наличного остатка.
---
Для приличной реализации варианта 1, лучше пригласить специалиста. Сам, уже извини, на мой взгляд не потянешь.
Можно воспользоваться вариантом два даже без программирования. Просто ставить в оптовый прайс розничную цену. Цену можно ставить штатной обработкой "Формирование цен", отбирая товары с остатком ниже минимального.
---
vcv, в прайсе, сделать не большая проблема.
Я все-таки попробую реализовать п.1.
---
Самоделкин, Ну что-ж, удачи.
Мелкий советик: В глобальнике есть функция глВернутьЦену. Когда в конфигурации что-то либо хочет получить цену, вызывает эту функцию или обёртку над ней глПолучитьЦену. В самом начале глВернутьЦену определяется тип цены, из которого реально будут браться цены

```1c
    НужныйТипЦен = ?(ПустоеЗначение(Рассчетная) = 1, ТипЦены, ТипЦены.БазовыйТипЦен);
```

Можно в этом месте вставить определение наличного остатка и, если он меньше указанного в номенклатуре, брать другой тип цен. Только обязательно проверить работу обработок ФормированиеЦен и ОбновлениеЦенИзДокумента. При их работе проверка остатка и подмена типа цен не должна делаться. Можно передавать дополнительный параметр в функцию, показывающий, нужен или нет контроль наличного остатка.
---
vcv, СПАСИБО, за совет! Будет время, буду пробовать.
Странно, вознаграждение было 2$m вчера, сегодня уже 1$m.
---
vcv,решил сделать немного по другому, т.к. не разобрался как определить ТипЦены, это сделал в Глоб.модуле:

```1c
    // Получим остаток.
    Если ПустоеЗначение(Склад) = 0 Тогда
    Если ТипЗначенияСтр(ФирмаДляОстатковТМЦ) = "Справочник" Тогда // нужны сводные остатки только по одной фирме
    Если Номенклатура.МинОстОпт <> 0 Тогда
    ОстатокНаСкладе = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,Склад,,"Количество") - Номенклатура.МинОстОпт;
    ОстатокПоФирме = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,"Количество") - Номенклатура.МинОстОпт;
    Иначе
    ОстатокНаСкладе = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,Склад,,"Количество");
    ОстатокПоФирме = ОстаткиТМЦ.СводныйОстаток(ФирмаДляОстатковТМЦ,Номенклатура,,,"Количество");
    КонецЕсли;
```

работает правильно, но как это связать с контрагентом?
---
Самоделкин,
но как это связать с контрагентом?
Если вы уже стали исправлять глобальный модуль, то можно попробовать изменить количество параметров процедуры "глПолучитьОстаткиНоменклатуры".
Например сейчас:

```1c
    Процедура глПолучитьОстаткиНоменклатуры(ФирмаДляОстатковТМЦ, Номенклатура, Единица, ОстаткиТМЦ, ОстатокНаСкладе, ОстатокПоФирме, Склад,
    РезервыТМЦ = 0, УчитыватьРезерв = 0, Договор = 0, Заявка = 0) Экспорт
```

У вас может быть

```1c
    Процедура глПолучитьОстаткиНоменклатуры(ФирмаДляОстатковТМЦ, Номенклатура, Единица, ОстаткиТМЦ, ОстатокНаСкладе, ОстатокПоФирме, Склад,
    РезервыТМЦ = 0, УчитыватьРезерв = 0, Договор = 0, Заявка = 0, ПараметрКонтрагента=0) Экспорт
```
.
В коде процедуры разбирать тип значения параметра "ПараметрКонтрагента": если это не число, то выполнять нужные вам действия, если число, то должно работать по стандартной схеме.
Затем исправить вызов процедуры "глПолучитьОстаткиНоменклатуры" в тех местах, где вам нужно.
Обратите внимание, что это только пример реализации.
---
l_user, спасибо.
---
Самоделкин, Я видимо не врубился в исходную задачу. Зачем связывать с контрагентом? Есть дефицитный товар, на остатки которого нужно автоматически увеличить цену. Например, вместо оптовой цены продавать по розничной.
Предполагаю такое решение:
- В справочнике типов цен добавляем реквизит ТипЦенДефицитныхОстатков типа "Справочник.ТипыЦен".
- В справочнике номенклатуры реквизит МинОстОпт (взят из (1)) для хранения границы остатка, ниже которой нужно продавать по другой цене.
- Функцию глВернутьЦену меняем примерно следующим образом, вставляя изменения после строки

```1c
    НужныйТипЦен = ?(ПустоеЗначение(Рассчетная) = 1, ТипЦены, ТипЦены.БазовыйТипЦен);
```

```1c
    НужныйТипЦен = ?(ПустоеЗначение(Рассчетная) = 1, ТипЦены, ТипЦены.БазовыйТипЦен);
    ТипЦенДефицитныхОстатков = НужныйТипЦен.ТипЦенДефицитныхОстатков;
    Если ПустоеЗначение(ТипЦенДефицитныхОстатков) = 0 Тогда
    Если ПустоеЗначение(Номенклатура.МинОстОпт) = 0 Тогда
    времРегистры = СоздатьОбъект("Регистры");
    времОстаткиТМЦ = времРегистры.ОстаткиТМЦ;
    времОстаткиТМЦ.УстановитьЗначениеФильтра("Номенклатура",Номенклатура);
    Если ДатаЦен < ПолучитьДатуТА() Тогда
    времОстаткиТМЦ.ВременныйРасчет();
    времОстаткиТМЦ.РассчитатьРегистрыПо(ДатаЦен);
    КонецЕсли;
    ОстатокНоменклатуры = времОстаткиТМЦ.СводныйОстаток(,,,,"Количество");
    Если ОстатокНоменклатуры <= Номенклатура.МинОстОпт Тогда
    НужныйТипЦен = ТипЦенДефицитныхОстатков;
    КонецЕсли;
    КонецЕсли;
    КонецЕсли;
```
---
Дополнительно к (8). Так может подойти только если у вас учет дефицитных товаров в целом по всем возможным фирмам. Если имеется несколько фирм и нужно учитывать остаток отдельно по фирме документа, тогда нужно передавать в функцию параметром, например, контекст документа.
И не забудь допилить для корректной работы обработок, помянутых в (4).
---
vcv, нет, Вы все правильно поняли - это я уже начал мудрить.
Не догадался до дополнительно реквизита в справочнике цен.
Вообще-то, страшновато менять что-то в Глоб.модуле - это все-равно, что, если плохо разбираешься в двигателях авто, залезть туда и что-то переделать, другое дело подтянуть ремень генератора.
Вот было бы хорошо в самой реализации делать подмену, но похоже выбора у меня нет.
Спасибо, за помощь!
---
Вариант 1 -дырявый
В форме подбора незавимо от того что вы там показываете на форме -не существует запрета ввести любое количество. Так что я тупо введу заведомо больше чес вижу в форме подбора и все
---
Туплю по страшному, почему не сохраняется реквизит?
---
Ужас какой!
Угробит базу (0), могу на деньги поспорить, что угробит ...
Наверное, в сложившейся критической для базы ситуации можно посоветовать использовать для этой задачи штатные возможности конфигурации - т.е. переместить эти товары на розничный склад, а с других складов не отгружать.
---
Кошки рулят, чью базу, где и когда?
Нужен был бы розничный склад, он бы был.
---
Кошки рулят, Спокойно. Все учились когда-то. От таких ошибок база не пострадает.
(13) Самоделкин, Не там реквизит. Для справочника ТипыЦен включено редактирование в диалоге (второй скриншот). Соответственно размещать новые реквизиты нужно именно в форме элемента.
---
vcv, спасибо, т.е. тогда каждому типа цен я смогу присвоить свою цену?
К примеру: оптовая 1 - розница, оптовая 2 - оптовая, оптовая - розница.
Или там для всех типов цен будет одна?
Просто комп отобрали, проверить нет возможности.
---
vcv, Вы просто кудесник, все работает как в (17).

Еще раз, ОГРОМНОЕ СПАСИБО!!!!!!