(1) в дополнительных правах пользователя снять соответствующие галочки по товарным регистрам и разрешить только оперативное проведение, убрать у пользователей полные права.
(1) Nur, И еще помнить обязательно, что контроль остатков ведется только в том случае, если документ проводиться оперативно. При не оперативном проведении никаких контролей не производиться :)
(1) Nur, И еще помнить обязательно, что контроль остатков ведется только в том случае, если документ проводиться оперативно. При не оперативном проведении никаких контролей не производиться :)
В этом-то и беда: нужно контролировать отрицательные остатки и при этом проводить документы неоперативно...
(7) Тогда нужно править конфигурацию. Самый простой способ - закомментировать проверку на оперативность, тогда остатки будут проверяться всегда. Особенности - проверка будет на текущую дата, т.е. проводить можно и год назад, но проверять будет текущие остатки. При повторном проведении нужно сначала отменить проведение, а потом провести, иначе списание остатков будет засчитываться 2 раза.
Более сложный способ - писать самому процедуру проверки в подписке на событие.
Необычный способ - обработка, которая будет мониторить отрицательные остатки и если они появляются отсылать заинтересованным лицам сообщение. Например, письмом.
Nur пишет:
Как в УПП 8.2 настроить контроль отрицательных остатков, чтобы если нет на складе, программа не проводила документ.
Сделать доработку обработки проведения
Если СтруктураШапкиДокумента.ОтражатьВУправленческомУчете тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| РеализацияТоваровУслугТовары.СерияНоменклатуры КАК СерияНоменклатуры,
| СУММА(РеализацияТоваровУслугТовары.Количество * РеализацияТоваровУслугТовары.Коэффициент) КАК КоличествоНужно,
| СУММА(ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ВремяДока, Склад = &Склад) КАК ТоварыНаСкладахОстатки
| ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
| И РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
| И РеализацияТоваровУслугТовары.СерияНоменклатуры = ТоварыНаСкладахОстатки.СерияНоменклатуры
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
| И РеализацияТоваровУслугТовары.Склад = &Склад
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.НомерСтроки,
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры,
| РеализацияТоваровУслугТовары.СерияНоменклатуры
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
(10) fibrsb, только я чуть-чуть подправила в документе реализации в обработке проведения, так как если единица базовая и единица хранения остатков разные и коэффициенты соответственно, возникает ошибочка. в общем вот так исправила, протестила, все пашет, и пользователи довольны
// моя доработка
Если СтруктураШапкиДокумента.ОтражатьВУправленческомУчете тогда
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| РеализацияТоваровУслугТовары.НомерСтроки КАК НомерСтроки,
| РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
| РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент КАК Коэффициент,
| РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
| РеализацияТоваровУслугТовары.СерияНоменклатуры КАК СерияНоменклатуры,
| СУММА(РеализацияТоваровУслугТовары.Количество*РеализацияТоваровУслугТовары.Коэффициент) КАК КоличествоНужно,
| СУММА(ЕСТЬNULL(ТоварыНаСкладахОстатки.КоличествоОстаток, 0)) КАК КоличествоОстаток
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&ВремяДока, Склад = &Склад) КАК ТоварыНаСкладахОстатки
| ПО РеализацияТоваровУслугТовары.Номенклатура = ТоварыНаСкладахОстатки.Номенклатура
| И РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры = ТоварыНаСкладахОстатки.ХарактеристикаНоменклатуры
| И РеализацияТоваровУслугТовары.СерияНоменклатуры = ТоварыНаСкладахОстатки.СерияНоменклатуры
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
| И РеализацияТоваровУслугТовары.Склад = &Склад
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.НомерСтроки,
| РеализацияТоваровУслугТовары.Номенклатура,
| РеализацияТоваровУслугТовары.Номенклатура.ЕдиницаХраненияОстатков.Коэффициент,
| РеализацияТоваровУслугТовары.ХарактеристикаНоменклатуры,
| РеализацияТоваровУслугТовары.СерияНоменклатуры
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Запрос.УстановитьПараметр("ВремяДока", Ссылка.МоментВремени());
Запрос.УстановитьПараметр("Склад", Склад);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.КоличествоНужно > (Выборка.КоличествоОстаток*Выборка.Коэффициент) Тогда
Сообщить("На складе недостаточно номенклатуры "+Выборка.Номенклатура.Наименование+", характеристика "+Выборка.ХарактеристикаНоменклатуры.Наименование);
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Конецесли;
У вас РАУЗ? При РАУЗ нет контроля отрицательных остатков. Вернее нет ограничение на порядок ввода первичных документов. То есть мы можем списать раньше чем оприходуем.
При партионном учёте контроль остатков выполняется всегда: и при оперативном, и при неоперативном проведении. Разницу видела в том, что при проведении "Отчёта о розничных продажах" в оперативном режиме документ не проводится при отриц.остатках, а в неоперативном - проводится, лишь выдавая ошибку в окно служебных сообщений.
(13) мммм... не путайте КОНТРОЛЬ и просто формирование движений по партионному учету. Если при проведении ему не хватит остатков на складе на момент документа, то он просто не создаст движения партий, т.к. у него нет необходимой информации и предупредит об этом. А если осуществляется контроль отрицательных остатков, то он происходит в первую голову по регистру товары на складах с учетом резервов и т.д. или если включено, то по регистру Свободные остатки. При неоперативном проведении система НЕ смотрит эти регистры и свободно загоняет их в минус без всяческого контроля. Если есть расхождения между регистрами товары на складах, товары в резерве или свободные остатки и регистром Партии товаров на складах, то вполне возможна ситуации, когда по партиям всё спокойно проведется, а вот по другим регистрам уйдет в минус. Разница существует хотя бы из-за резервов, учет которые по партиям не ведется (да и не должен)
(14) anig99, для меня понятие "контроль" - это то, что программа в любом случае проверит и выдаст сообщение, если документы проводятся в минус. А не давать проводить вообще - это уже не по мне :)
Впрочем, на вкус и цвет...
(15)(16) даже если не обязателен запрет, то проверка только по партиям - вещь неполная и не всегда правильная в силу особенностей учета. Если нет запрета, то это не контроль, а проверка.
Кстати, если отключить проведение по партиям (т.е. партии будут формироваться штатной обработкой), то опять-таки такая система обломится.
У нас перед закрытием месяца, после полного перепроведения всех материалных документов, для контроля выводится отчет по 10 счету, который показывает все некорректные остатки на конец месяца. Условиия отбора в этом отчете такие: "(КоличествоОст < 0) ИЛИ (СуммаОстаток < 0) ИЛИ (КоличествоОст = 0 И СуммаОстаток <> 0) ИЛИ (КоличествоОст <> 0 И СуммаОстаток = 0)". Как правило каждый месяц по тем или иным причинам попадаются материалы с некорректными остатками выявленные таким образом.
Новая методика контроля отрицательных остатков в системе 1С:Предприятие 8.2
Имеем конфигурацию с одним регистром накопления «ОстаткиТоваров», регистр имеет 2 измерения: «Номенклатура» и «Склад» и один ресурс «Количество». По регистру движения формируют 2 документа: «Приходная» и «Расходная». Справочники, реквизиты документов и типы данных надеюсь очевидны.
Про «Приходную» писать нечего, там просто формируются в «плюс» остатки. Про «Расходную поговорим подробнее. Для начала вспомним, как формировалась процедура проведения в 8.1.
Для начала мы получали запросом данные табличной части документа, группировали ее, чтобы исключить дубли строк, и соединяли с таблицей остатков регистра:
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| РасходнаяТовары.Номенклатура,
| СУММА(РасходнаяТовары.Количество) КАК Количество
|ПОМЕСТИТЬ ДокТЧ
|ИЗ
| Документ.Расходная.Товары КАК РасходнаяТовары
|ГДЕ
| РасходнаяТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РасходнаяТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДокТЧ.Номенклатура,
| ДокТЧ.Количество,
| ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток,0) КАК Остаток
|ИЗ
| ДокТЧ КАК ДокТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиТоваров.Остатки(
| ,
| Склад = &Склад<
| И Номенклатура В
| (ВЫБРАТЬ
| ДокТЧ.Номенклатура
| ИЗ
| ДокТЧ КАК ДокТЧ)) КАК ОстаткиТоваровОстатки
| ПО ДокТЧ.Номенклатура = ОстаткиТоваровОстатки.Номенклатура";
Запрос.УстановитьПараметр("Склад", Склад);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
РезультатЗапроса = Запрос.Выполнить();
Показать
Кроме этого данные табличной части документа мы использовали для дополнительного отбора при расчете виртуальной таблицы.
Обратите также внимание на функцию ЕСТЬNULL которую мы использовали для гарантии избавления от типа значения NULL в результате запроса. Остатки, которых на складе нет, не присоединятся в таблице документа, и мы поля с остатком заполним значением 0 (ноль).
После того как данные запросом были получены нам оставалось проверить остатки и сформировать движения по регистру. Причем в нашем случае никто не мешает сделать это за один проход.
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Количество < Выборка.Остаток Тогда
Сообщить("Не хватает товара " + Выборка.Номенклатура + ", из необходимых " + Выборка.Количество + " в наличие имеется только " + Выборка.Остаток;
Отказ = Истина;
КонецЕсли;
Если Не Отказ Тогда
Движение = Движения.ОстаткиТоваров.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Номенклатура = Выборка.Номенклатура;
Движение.Склад = Склад;
Движение.Количество = Выборка.Количество;
КонецЕсли;
КонецЦикла;
Показать
Вроде бы, куда уж проще и быстрее? Однако есть куда!
Разберем новую методику контроля остатоков.
Для начала получим сгруппированную табличную часть документа.
Запрос = Новый Запрос;Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;Запрос.Текст = "ВЫБРАТЬ| РасходнаяТовары.Номенклатура,| СУММА(РасходнаяТовары.Количество) КАК Количество|ПОМЕСТИТЬ ДокТЧ|ИЗ| Документ.Расходная.Товары КАК РасходнаяТовары|ГДЕ| РасходнаяТовары.Ссылка = &Ссылка||СГРУППИРОВАТЬ ПО| РасходнаяТовары.Номенклатура|;||////////////////////////////////////////////////////////////////////////////////|ВЫБРАТЬ| ДокТЧ.Номенклатура,| ДокТЧ.Количество|ИЗ| ДокТЧ КАК ДокТЧ";Запрос.УстановитьПараметр("Ссылка", Ссылка);РезультатЗапроса = Запрос.Выполнить();
Временная таблица ДокТЧ нам еще пригодится в дальнейшем, для ее использования мы подключили к запросу менеджер временных таблиц.
Далее сформируем движения по регистру.
Движения.ОстаткиТоваров.Записывать = Истина;Выборка = РезультатЗапроса.Выбрать();Пока Выборка.Следующий() Цикл Движение = Движения.ОстаткиТоваров.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Номенклатура = Выборка.Номенклатура; Движение.Склад = Склад; Движение.Количество = Выборка.Количество;КонецЦикла;Движения.Записать();
В приведенном примере я подразумеваю, что для документа установлен режим записи движений «Записывать выбранные». Именно поэтому я перед циклом установил пометку необходимости записи движений (на самом деле это можно было сделать и после цикла).
Движения записываем в регистр. Причем при записи движений я обращаюсь не к конкретному набору записей (Движения.ОстаткиТоваров.Записать()), а ко всей коллекции «Движения». Подобный вызов записи гарантирует запись данных в регистры в той последовательности, в которой они расположены на дереве метаданных, что в свою очередь резко уменьшает взаимные блокировки и как следствие ошибки DeadLock.
После того как я записал движения в регистр я получу остатки. Обратите внимание, что при чтении данных из регистра у меня сейчас будут обновленные данные с учетом движений самого документа.
Запрос.Текст = "ВЫБРАТЬ| Номенклатура,| КоличествоОстаток КАК Остаток|ИЗ| РегистрНакопления.ОстаткиТоваров.Остатки(| ,| Склад = &Склад| И Номенклатура В| (ВЫБРАТЬ| ДокТЧ.Номенклатура| ИЗ| ДокТЧ КАК ДокТЧ))|ГДЕ| КоличествоОстаток < 0";Запрос.УстановитьПараметр("Склад", Склад);РезультатЗапроса = Запрос.Выполнить();
Посмотрите, мы избавились от соединений, и, что не маловажно, от проверки типа значения NULL. Запрос получит данные только по отрицательным остаткам и покажет их пользователю!
Обратимся к результату запроса и известим пользователя о минусах на складе.
Выборка = РезультатЗапроса.Выбрать();Пока Выборка.Следующий() Цикл Сообщение = Новый СообщениеПользователю; Сообщение.Текст = "Не хватает товара " + Выборка.Номенклатура + ", после проведения | документа остаток составит " + Выборка.Остаток; Сообщение.Сообщить(); Отказ = Истина;КонецЦикла;
Вот собственно и вся новая методика контроля остатков. Перечислим плюсы этого метода:
Нет необходимости соединять в запросе таблицу документа и данными регистров
Не надо производить проверку на NULL
Нет необходимости получать излишние данные (остатки) для проведения документа. Ведь мы чаще все же записываем документ с правильными цифрами и он проводится, чем документы которые уводят остатки в минус.
Однако не стоит думать, что такая технология может быть применена повсеместно. На секунду задумайтесь, что в этой задаче необходимо еще и себестоимость рассчитать при списании, и Вы придете к выводу, что необходим «старый» метод контроля остатков.
(28) А Вы когда-нибудь задумывались сколько может быть алгоритмов контроля остатков при проведении документов задним числом, причем для разных пользователей нужны разные алгоритмы. Кроме того как контролировать резервы и потребности в товарах? 1С рассматривает ( как и все производители учетных систем ) проведение задним числом не как стандартную операцию, а как исключение из правил, которым пользуются лишь в исключительных случаях.
(28) ola007, 1C пишет программу по стандартам. и по ним следует что все движения должны быть отражены в учете как минимум в конце дня (смены). а то что на предприятиях порой документы оформляются, дай Бог в конце месяца, то это уже проблемы предприятия.
Без изменений в УПП при проведении документов, если нет остатков на складе выдается сообщение, что списано без суммовой оценки, вот и весь контроль, бухи сразу видят, что на складе нет товара.
Без изменений в УПП при проведении документов, если нет остатков на складе выдается сообщение, что списано без суммовой оценки, вот и весь контроль, бухи сразу видят, что на складе нет товара.
бывает так, что не бухи делают документы и потом начинается игра найди того кто это сделал)