|   |   | 
| 
 | Помогите разобраться с контролем остатков | ☑ | ||
|---|---|---|---|---|
| 0
    
        RICK 05.05.14✎ 11:26 | 
        Здравствуйте!
 Делал контроль остатков по Радченко, вроде бы код такой же писал только по своей теме но что то у меня не получилось. При поступлении 1 товара я могу его списать больше чем он есть на складе Помогите пожалуйста вот код: Процедура ОбработкаПроведения(Отказ, Режим) //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ // Данный фрагмент построен конструктором. // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!! // регистр ОстаткиАвтомобилей Расход Движения.ОстаткиАвтомобилей.Записывать = Истина; Для Каждого ТекСтрокаАвтомобили Из Автомобили Цикл Движение = Движения.ОстаткиАвтомобилей.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Автомобили = ТекСтрокаАвтомобили.Автомобиль; Движение.МестоХранения = МестоХранения; Движение.Количество = ТекСтрокаАвтомобили.Количество; КонецЦикла; // регистр Продажи Движения.Продажи.Записывать = Истина; Для Каждого ТекСтрокаАвтомобили Из Автомобили Цикл Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Автомобили = ТекСтрокаАвтомобили.Автомобиль; Движение.Клиент = Покупатель; Движение.Сотрудник = Менеджер; Движение.Количество = ТекСтрокаАвтомобили.Количество; Движение.Выручка = ТекСтрокаАвтомобили.Сумма; Движение.Стоимость = ТекСтрокаАвтомобили.Цена; КонецЦикла; //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ МенеджерВТ = Новый МенеджерВременныхТаблиц; Запрос = Новый Запрос; // Укажем, какой менеджер временных таблиц использует этот запрос Запрос.МенеджерВременныхТаблиц = МенеджерВТ; Запрос.Текст ="ВЫБРАТЬ | РасходнаяАвтомобили.Автомобиль, | СУММА(РасходнаяАвтомобили.Количество) КАК Количество, | СУММА(РасходнаяАвтомобили.Сумма) КАК Сумма |ПОМЕСТИТЬ АвтомобилиДокумента |ИЗ | Документ.Расходная.Автомобили КАК РасходнаяАвтомобили |ГДЕ | РасходнаяАвтомобили.Автомобиль.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | РасходнаяАвтомобили.Автомобиль"; Запрос.УстановитьПараметр("Ссылка", Ссылка); Результат = Запрос.Выполнить(); Движения.Записать(); Если Режим = РежимПроведенияДокумента.Оперативный Тогда // Проверить отрицательные остатки Запрос3 = Новый Запрос; Запрос3.МенеджерВременныхТаблиц = МенеджерВТ; Запрос3.Текст = "ВЫБРАТЬ | ОстаткиАвтомобилейОстатки.Автомобили, | ОстаткиАвтомобилейОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиАвтомобилей.Остатки( | , | Автомобили В | (ВЫБРАТЬ | АвтомобилиДокумента.Автомобиль ИЗ | АвтомобилиДокумента) | И МестоХранения = &МестоХранения) КАК ОстаткиАвтомобилейОстатки |ГДЕ | ОстаткиАвтомобилейОстатки.КоличествоОстаток < 0"; Запрос3.УстановитьПараметр("МестоХранения", МестоХранения); Результат = Запрос3.Выполнить(); ВыборкаДетальныеЗаписи = Результат.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Не хватает " + Строка(- ВыборкаДетальныеЗаписи.КоличествоОстаток) + " единиц материала """ + ВыборкаДетальныеЗаписи.Материал + """"; Сообщение.Сообщить(); Отказ = Истина; КонецЦикла; КонецЕсли; КонецПроцедуры Платформа 8.3 | |||
| 1
    
        shuhard 05.05.14✎ 11:30 | 
        (0) у Радченко есть свой форум, там мозг ему и высасывай     | |||
| 2
    
        МойКодУныл 05.05.14✎ 11:36 | 
        Радченко теперь так советует проверять?
 Создать движения, а потом проверить отрицательный остаток. Что-то мне кажется, что запись, а потом чтение в одной неоконченной транзакции проведение одного и того же регистра - это не очень. Даже термин противный - грязное чтение. Раньше просто проверялось до. Получил остаток - сравнил, ч тем что хошь списать - отсек. А то движения сначала сделай, потом проверь, потом транзакцию откати... | |||
| 3
    
        ДенисЧ 05.05.14✎ 11:36 | 
        (2) Грязное чтение - это из другой оперы     | |||
| 4
    
        Defender aka LINN 05.05.14✎ 11:38 | 
        (2) Ащета 1С нынче советует (и делает в типовых) именно так.     | |||
| 5
    
        МойКодУныл 05.05.14✎ 11:40 | 
        (3) он читает в транзакции, которая не завершена и может быть откачена. это не то?
 (4) Пичаль тоска. А если документ на 10000 строк и там еще их по партиям разобрать надо? Легче же сразу общее количество проверить. Устарел я. | |||
| 6
    
        Лодырь 05.05.14✎ 11:43 | 
        (5) На самом деле не легче. Поскольку в контроле тебе придется повторить логику проведения. И не факт что она проста и банальна. А так - сделал движения, проверил какие хошь остатки - откатил если надо.     | |||
| 7
    
        fisher 05.05.14✎ 11:43 | 
        (5) Это не то. Грязное чтение, это когда транзакция читает данные еще не зафиксированные ДРУГОЙ транзакцией.
 Это методика абсолютно правильная, хотя выглядит сложнее и неестественнее. При оптимистическом подходе, который имеет место быть в реальной жизни (остатков обычно хватает) - минимизируются блокировки и повышается параллелизм транзакций. | |||
| 8
    
        МойКодУныл 05.05.14✎ 11:45 | 
        (6) Согласен, если для контроля нужно повторять логику проведения. А не просто оценить достаточность общего количества.
 (7) Учту. Не смотрел новых типовых давно. | |||
| 9
    
        Ненавижу 1С гуру 05.05.14✎ 11:48 | 
        записи у тебя нет перед чтением     | |||
| 10
    
        fisher 05.05.14✎ 11:50 | 
        (8) Но классическая партионка в эту схему укладывается плохо. Вернее - вообще не укладывается. Ведь перед списанием партий все равно придется блокировать весь их возможный диапазон. Т.е. выигрыша никакого. Поэтому РАУЗ и рулит. А до него - отложенное проведение по партиям.     | |||
| 11
    
        Timon1405 05.05.14✎ 11:51 | 
        Дату остатков в витруальной таблице установить не помешает     | |||
| 12
    
        ДенисЧ 05.05.14✎ 11:52 | 
        (5) Грязное - это когда ты читаешь данные другой транзакции     | |||
| 13
    
        saaken 05.05.14✎ 11:52 | 
        (11) помешает     | |||
| 14
    
        saaken 05.05.14✎ 11:52 | 
        (9) движения.записать() перед проверкой на оперативность     | |||
| 15
    
        saaken 05.05.14✎ 11:53 | 
        он возможно проводит не оперативно, или просто оперативность у документа выключил, а код весь правильный     | |||
| 16
    
        saaken 05.05.14✎ 11:57 | 
        (0) заремь условие и отпишись     | |||
| 17
    
        FireAlex 05.05.14✎ 12:29 | 
        надо же ещё остатки заблокировать перед 
 Движения.Записать(); а то кто нить пока проверяешь возьмет и изменит их. скорей всего режим неоперативный. по идее при любом режиме надо проверять остатки. просто в одном случае дату можно не указывать, а в другом на момент времени документа, включая его движения (через границу) | |||
| 18
    
        RICK 05.05.14✎ 12:52 | 
        (17) В документе стоит разрешить оперативное проведение
 Может вам на почту скинуть базу?Чтобы нагляднее было | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |