Имя: Пароль:
1C
1С v8
Редактирвание РТиУ задним числом
0 nvhost
 
03.06.14
21:50
Зачем делать программу разрешать неоперативное проведение и при этом не проверять остатки на складе!!!Не вижу ни какой логики!КТО нибудь может мне объяснить, еще при все при этом вообще пропадает смысл галочки "Разрешать превышение остатком на складе", хоть ставь ее, хоть не ставь........в чем смысл?
1 Banned
 
03.06.14
22:02
групповое перепроведение, например.
Или тупизна разработчиков.

Выбирай.
2 Wobland
 
03.06.14
22:04
крик души, да? бахни 100грамм и отправляйся спать
3 Banned
 
03.06.14
22:09
(2) Если он по каждому вопросу в 1с будет бахать 100, то он очень быстро сопьётся...
Пожалей человека, а вдруг у него семя?
4 Banned
 
03.06.14
22:09
*семья....
5 nvhost
 
04.06.14
00:45
Эта статья помогла http://infostart.ru/public/205097/ и немного допилил

Процедура ЗапретНеоперативногоПроведения(Источник, Отказ, РежимЗаписи, РежимПроведения, СтруктураШапкиДокумента, ЭтотОбъект, Движения) Экспорт
    
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение И РежимПроведения = РежимПроведенияДокумента.Неоперативный Тогда
       Если РольДоступна("ЗаведующийСкладом") Тогда
                
        Для Каждого СтрокаТЧ Из Источник.Товары Цикл        
           //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

            Запрос.УстановитьПараметр("Номенклатура",СтрокаТЧ.Номенклатура);
            Запрос.УстановитьПараметр("Склад", Источник.Склад);
            Запрос.УстановитьПараметр("Дата", Источник.Дата);


            Результат = Запрос.Выполнить();

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                // Вставить обработку выборки ВыборкаДетальныеЗаписи
            КонецЦикла;

            //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
                Если ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток <=0 Тогда  
                
                      СписываемоеКоличествоТовара = СтрокаТЧ.Количество - ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток;
                      Сообщить ("Товара: "+СтрокаТЧ.Номенклатура+" недостаточно на складе. Не хватает "+СписываемоеКоличествоТовара+"  единиц товара! Проведение отменено! ", СтатусСообщения.Важное);
                      Отказ=Истина;
                КонецЕсли;
            КонецЦикла;  
              КонецЕсли;
    Иначе                
            Отказ = Истина;
            Сообщить("У вас нет прав на Неоперативное проведение");
    КонецЕсли;
    
КонецПроцедуры
6 Pasha
 
04.06.14
00:58
(0) В настройках ролей неоперативное проведение можно отключить...  Все б вам, молодым, код покорежить дай...
7 nvhost
 
04.06.14
01:13
Ок буду иметь ввиду, только бывает что товар вернулся на след день от покупателя и приходится Менять РТиУ
8 MiniMuk
 
04.06.14
04:06
(7) Отражать факт возврата отдельным документом религия не позволяет? Зачем проверять остатки если ты уменьшаешь количество отпущенного товара по РТиУ и на вчера у тебя было 10 шт значить сегодня вчерашним чилом 8 тоже будет
9 jsmith82
 
04.06.14
04:30
был крупный клиент, который попросил сделать контроль при НП.
по идее там всё по-другому надо, но это тема отдельной дискуссии
а пока так, есть суп вилкой
10 jsmith82
 
04.06.14
04:31
при правильном подходе даже не надо было бы делать восстановление по партиям
рауз уже хорошая идея. но та, про которую думаю, выстрелит через 1-2 года
11 Godofsin
 
04.06.14
06:19
(10) И про какую ты думаешь?
12 nvhost
 
04.06.14
08:20
Каким??Возврат товара от покупателя?Или Корректировка РТиУ?Дело в том, что надо распечат весь пакет заново Торг12, Счет фактуру и т.д. в итоге в этих документа должна быть правильная сумма по факту без номенклатуры которую не принял клиент или наоборот бывает отпустят меньше чем надо и приходится довозить а клиент хочет чтоб у него именно в этом заказе был весь товар....Кстати про дату я проверяю на дату документа, а надо на текущею проверять чтоб уж точно скахать хватит товара чтоб данную РТиУ провести
13 vitanimka
 
04.06.14
08:55
(12) сделай двойную проверку, на момент проведения документа и на "сейчас", у меня этого контроля вполне хватает.
14 PLUT
 
04.06.14
09:18
(0) почему-почему - тыщу раз обсуждалось

навскидку
v8: УТ 10.3 - контроль остатков при неоперативном проведении
15 Hans
 
04.06.14
09:34
(14) За один день можно сделать контроль остатков добавив в запросы параметр период и включив контроль в докуменентах при ниоперативном проведении, это по 10.3. в 11 там есть такой контроль, специфический.
16 catena
 
04.06.14
10:28
(15)Не достаточно проверять на период, при неоперативном необходимо еще проверять на конец истории.
17 nvhost
 
04.06.14
23:42
Допилил еще

Процедура ЗапретНеоперативногоПроведения(Источник, Отказ, РежимЗаписи, РежимПроведения, СтруктураШапкиДокумента, ЭтотОбъект, Движения) Экспорт
    
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение И РежимПроведения = РежимПроведенияДокумента.Неоперативный Тогда
       Если РольДоступна("ЗаведующийСкладом") Тогда
                
        Для Каждого СтрокаТЧ Из Источник.Товары Цикл        
           //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

            Запрос.УстановитьПараметр("Номенклатура",СтрокаТЧ.Номенклатура);
            Запрос.УстановитьПараметр("Склад", Источник.Склад);
            Запрос.УстановитьПараметр("Дата", ТекущаяДата());


            Результат = Запрос.Выполнить();

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                // Вставить обработку выборки ВыборкаДетальныеЗаписи
            КонецЦикла;
            КоличествоКонечныйОстаток = ?(ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток),ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток,"0");            
            
            //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
                    
            //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
            // Данный фрагмент построен конструктором.
            // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

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

            Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);

            Результат = Запрос.Выполнить();

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                // Вставить обработку выборки ВыборкаДетальныеЗаписи
            КонецЦикла;
            КоличествоРеализованногоТовара = ВыборкаДетальныеЗаписи.Количество;
            //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
            КоличествоДляСписания = КоличествоРеализованногоТовара - СтрокаТЧ.Количество;
            
            Если КоличествоДляСписания < 0 Тогда
            
            СписываемоеКоличествоТовара = КоличествоКонечныйОстаток - (СтрокаТЧ.Количество - КоличествоРеализованногоТовара);
                Если СписываемоеКоличествоТовара < 0 Тогда  
                    НеХватаетТовара = СтрокаТЧ.Количество - (КоличествоРеализованногоТовара- КоличествоКонечныйОстаток);
                      Сообщить ("Товара: "+СтрокаТЧ.Номенклатура+" недостаточно на складе. Не хватает "+НеХватаетТовара+"  единиц товара! Проведение отменено! ", СтатусСообщения.Важное);
                      Отказ=Истина;
                КонецЕсли;
            КонецЕсли;
            КонецЦикла;  
        Иначе
            Отказ = Истина;
            Сообщить("У вас нет прав на Неоперативное проведение");
        КонецЕсли;
                          
    КонецЕсли;
    
КонецПроцедуры
18 nvhost
 
21.06.14
23:27
Подправил может кому пригодится

Процедура ПроверкаНеОперативногоПроведенияПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение И РежимПроведения = РежимПроведенияДокумента.Неоперативный Тогда
       Если РольДоступна("ЗаведующийСкладом") Тогда
                
        Для Каждого СтрокаТЧ Из Источник.Товары Цикл        
           //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
        // Данный фрагмент построен конструктором.
        // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    ТоварыНаСкладахОстаткиИОбороты.Склад,
                |    ТоварыНаСкладахОстаткиИОбороты.Номенклатура,
                |    ТоварыНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток
                |ИЗ
                |    РегистрНакопления.ТоварыНаСкладах.ОстаткиИОбороты(&Дата, &Дата, , , ) КАК ТоварыНаСкладахОстаткиИОбороты
                |ГДЕ
                |    ТоварыНаСкладахОстаткиИОбороты.Склад = &Склад
                |    И ТоварыНаСкладахОстаткиИОбороты.Номенклатура = &Номенклатура"
                
                +?(ЗначениеЗаполнено(СтрокаТЧ.СерияНоменклатуры),"
                |    И ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры = &СерияНоменклатуры","")
                            
                +?(ЗначениеЗаполнено(СтрокаТЧ.ХарактеристикаНоменклатуры),"
                |    И ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры","");

            Запрос.УстановитьПараметр("Номенклатура",СтрокаТЧ.Номенклатура);
            Запрос.УстановитьПараметр("Склад", Источник.Склад);
            Запрос.УстановитьПараметр("Дата", ТекущаяДата());
            Если ЗначениеЗаполнено(СтрокаТЧ.ХарактеристикаНоменклатуры)Тогда
                Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", СтрокаТЧ.ХарактеристикаНоменклатуры);
            КонецЕсли;
            Если ЗначениеЗаполнено(СтрокаТЧ.СерияНоменклатуры) Тогда
                Запрос.УстановитьПараметр("СерияНоменклатуры", СтрокаТЧ.СерияНоменклатуры);
            КонецЕсли;


            Результат = Запрос.Выполнить();

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                // Вставить обработку выборки ВыборкаДетальныеЗаписи
            КонецЦикла;
            КоличествоКонечныйОстаток = ?(ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток),ВыборкаДетальныеЗаписи.КоличествоКонечныйОстаток,"0");            
            
            //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
                    
            //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
            // Данный фрагмент построен конструктором.
            // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

            Запрос = Новый Запрос;
            Запрос.Текст =
                "ВЫБРАТЬ
                |    РеализацияТоваровУслугТовары.Количество
                |ИЗ
                |    Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
                |ГДЕ
                |    РеализацияТоваровУслугТовары.Ссылка = &Ссылка
                |    И РеализацияТоваровУслугТовары.Номенклатура = &Номенклатура"
                
                +?(ЗначениеЗаполнено(СтрокаТЧ.СерияНоменклатуры),"
                |    И ТоварыНаСкладахОстаткиИОбороты.СерияНоменклатуры = &СерияНоменклатуры","")
                            
                +?(ЗначениеЗаполнено(СтрокаТЧ.ХарактеристикаНоменклатуры),"
                |    И ТоварыНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры = &ХарактеристикаНоменклатуры","");



            Запрос.УстановитьПараметр("Ссылка", Источник.Ссылка);
            Запрос.УстановитьПараметр("Номенклатура", СтрокаТЧ.Номенклатура);
            Если ЗначениеЗаполнено(СтрокаТЧ.ХарактеристикаНоменклатуры)Тогда
                Запрос.УстановитьПараметр("ХарактеристикаНоменклатуры", СтрокаТЧ.ХарактеристикаНоменклатуры);
            КонецЕсли;
            Если ЗначениеЗаполнено(СтрокаТЧ.СерияНоменклатуры) Тогда
                Запрос.УстановитьПараметр("СерияНоменклатуры", СтрокаТЧ.СерияНоменклатуры);
            КонецЕсли;
                         
            Результат = Запрос.Выполнить();

            ВыборкаДетальныеЗаписи = Результат.Выбрать();

            Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                // Вставить обработку выборки ВыборкаДетальныеЗаписи
            КонецЦикла;
            КоличествоРеализованногоТовара = ВыборкаДетальныеЗаписи.Количество;
            //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
            КоличествоДляСписания = КоличествоРеализованногоТовара - СтрокаТЧ.Количество;
            
            Если КоличествоДляСписания < 0 Тогда
            
            СписываемоеКоличествоТовара = КоличествоКонечныйОстаток - (СтрокаТЧ.Количество - КоличествоРеализованногоТовара);
                Если СписываемоеКоличествоТовара < 0 Тогда  
                    НеХватаетТовара = СтрокаТЧ.Количество - (КоличествоРеализованногоТовара- КоличествоКонечныйОстаток);
                      Сообщить ("Товара: "+СтрокаТЧ.Номенклатура+" недостаточно на складе. Не хватает "+НеХватаетТовара+"  единиц товара! Проведение отменено! ", СтатусСообщения.Важное);
                      Отказ=Истина;
                КонецЕсли;
            КонецЕсли;
            КонецЦикла;  
        Иначе
            Отказ = Истина;
            Сообщить("У вас нет прав на Неоперативное проведение");
        КонецЕсли;
                          
    КонецЕсли;
КонецПроцедуры
19 ДемонМаксвелла
 
22.06.14
03:05
(17)(18) Покритикую.
1) Запрос в цикле - фуу
2) Запрос.УстановитьПараметр("Дата", ТекущаяДата()); - нафига на текущую? а не на момент проведения? или не на любой момент между?
20 ДемонМаксвелла
 
22.06.14
03:05
короче, говн0код
21 ДемонМаксвелла
 
22.06.14
03:09
и ситуация с повтором в ТЧ Товары тоже не предусмотрена. По 3-й и по 4-й строке хватит на складе по отдельности, а вместе нет.
22 Aleksey
 
22.06.14
03:21
(12) И что это проблема? У меня давно в 7-ке реализовано печать документов с учетом возврата. Неужели в 8-ке нельзя такое сделать?
23 nvhost
 
28.06.14
10:17
Ребят помогите рализовать эту проверку для других документов которые делают расход Возврат поставщику, спсание и перемещение, как сделать?В Запросе?или ставить условие в текст запроса?
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.