Имя: Пароль:
1C
1С v8
Контроль отрицательных остатков
0 rowflag
 
09.11.12
12:32
При создании дока и первом проведении все работает. Отрицательные остатки контролируются.
Если же открыть созданный док и нажать "Провести и закрыть", то выдает ошибку. Срабатывает отказ. Как доработать?
Модуль объекта:


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

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

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

               ВыборкаДетальныеЗаписи = Результат.Выбрать();
               
               ЕстьНулевойОстаток = Истина;
               Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
                   ЕстьНулевойОстаток = Ложь;
                   Если ВыборкаДетальныеЗаписи.КоличествоОстаток = 1 Тогда
                       ОстатокРавенЕдинице = Истина;
                   Иначе
                       ОстатокРавенЕдинице = Ложь; //
                       Сообщить("Остаток " + ТекСтрокаТЧСписок.Наименование + " равен " + ВыборкаДетальныеЗаписи.КоличествоОстаток + ". Проведение документа невозможно. Необходимо проверить предыдущие операции. Остаток может быть либо 0 либо 1.");
                   КонецЕсли;
               КонецЦикла;
               
               Если ЕстьНулевойОстаток Тогда
                   ПроводитьНельзя = Истина;
               ИначеЕсли ОстатокРавенЕдинице Тогда
                   ПроводитьНельзя = Ложь;
               Иначе
                   ПроводитьНельзя = Истина;
               КонецЕсли;
               
   
   КонецЦикла;
   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ

   Если ПроводитьНельзя Тогда
       Отказ = Истина;
   КонецЕсли;
1 zak555
 
09.11.12
12:34
> Движение.Количество = 1;

это что ?
2 Wobland
 
09.11.12
12:34
>ОстатокРавенЕдинице
а почему именно единице? почему вы сказали не килограмм, не тонна, а именно фунт?
3 Spieluhr
 
09.11.12
12:34
на курсы 1С идти нужно, узнать про параметры виртуальных таблиц и МоментВремени
4 Wobland
 
09.11.12
12:35
и вообще, такие забавы с булевыми переменными как в конце - это грязно и низко
5 zak555
 
09.11.12
12:35
(0) это типовая УТ ?
6 Spieluhr
 
09.11.12
12:35
(5) похоже на задание при приеме на работу
7 Wobland
 
09.11.12
12:36
ГДЕ
                   |    ОстаткиНаСкладахОстатки.Наименование = &Наименование

о, боже!
8 Wobland
 
09.11.12
12:36
+(7) две разных тубаретки будет, что делать станешь?
9 Web00001
 
09.11.12
12:36
(5)Очень похоже, что это типовое УГ
10 zak555
 
09.11.12
12:37
(6) значит оно провалено
11 Wobland
 
09.11.12
12:37
(0) в общем, диагноз такой: переписывать всё заново
12 zak555
 
09.11.12
12:38
в 7ке ипали за запрос в цикле, а тут...
13 Web00001
 
09.11.12
12:39
(7) и это рядом с
|    И ОстаткиНаСкладахОстатки.Склад = &Склад";
вот как он разделил, там по наименованию, а тут по ссылке
14 rowflag
 
09.11.12
12:39
(скажите лучше чем отличается первое проведение от второго (когда док открыли и заново провели))
15 rowflag
 
09.11.12
12:40
Наименование имеет тип Справочник.ссылка.
16 Cunni
 
09.11.12
12:40
(14) удалить движения?
17 Spieluhr
 
09.11.12
12:41
(14) а хоть одно свое предположение есть?
18 shuhard
 
09.11.12
12:41
(14) а чё, так не понятно, что в останках сидят движения самого документа ?
19 Wobland
 
09.11.12
12:41
(15) браво!
20 rowflag
 
09.11.12
12:43
Почему тогда при таком варианте все проходит нормально?


// регистр ОстаткиНаСкладах Приход
   Движения.ОстаткиНаСкладах.Записывать = Истина;
   Для Каждого ТекСтрокаТЧСписок Из ТЧСписок Цикл
       Движение = Движения.ОстаткиНаСкладах.Добавить();
       Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
       Движение.Период = Дата;
       Движение.Наименование = ТекСтрокаТЧСписок.Наименование;
       Движение.Склад = СкладНазначения;
       Движение.Количество = ТекСтрокаТЧСписок.Количество;
   КонецЦикла;

   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ


   
   
   
   
       
   движения.ОстаткиНаСкладах.Записать();

   // Создать менеджер временных таблиц
   МенеджерВТ = Новый МенеджерВременныхТаблиц;
       
   Запрос = Новый Запрос;
   
   // Укажем, какой менеджер временных таблиц использует этот запрос
   Запрос.МенеджерВременныхТаблиц = МенеджерВТ;
   
   Запрос.Текст = "ВЫБРАТЬ
                  |    картриджи_Отправка_в_филиалТЧСписок.Наименование
                  |ПОМЕСТИТЬ НоменклатураДокумента
                  |ИЗ
                  |    Документ.картриджи_Отправка_в_филиал.ТЧСписок КАК картриджи_Отправка_в_филиалТЧСписок
                  |ГДЕ
                  |    картриджи_Отправка_в_филиалТЧСписок.Ссылка = &Ссылка";
                 
   Запрос.УстановитьПараметр("Ссылка", Ссылка);                  
   Результат = Запрос.Выполнить();

   // для отладки
   // ТЗ - Таблица Значений. Отладка - промотр результата запроса - Временной Таблицы
   ТЗ = ДанныеВнутреннейТаблицыЗапроса(Запрос,"НоменклатураДокумента");
   
   Если Режим = РежимПроведенияДокумента.Оперативный Тогда
       //проверить отрицательные остатки
       
       Запрос1 = Новый Запрос;
       
       Запрос1.МенеджерВременныхТаблиц = МенеджерВТ;
   
       Запрос1.Текст =    "ВЫБРАТЬ
                           |    ОстаткиНаСкладахОстатки.КоличествоОстаток,
                           |    ОстаткиНаСкладахОстатки.Наименование,
                           |    ОстаткиНаСкладахОстатки.Склад
                           |ИЗ
                           |    РегистрНакопления.ОстаткиНаСкладах.Остатки(
                           |            ,
                           |            Наименование В
                           |                    (ВЫБРАТЬ
                           |                        НоменклатураДокумента.Наименование
                           |                    ИЗ
                           |                        НоменклатураДокумента)
                           |                И Склад = &Склад) КАК ОстаткиНаСкладахОстатки
                           |ГДЕ
                           |    ОстаткиНаСкладахОстатки.КоличествоОстаток < 0";
                   
       //Запрос.УстановитьПараметр("Наименование", "" + Наим + "");
       //Запрос.УстановитьПараметр("Склад", "" + Скл + "");
       
       Запрос1.УстановитьПараметр("Склад", СкладИсточник);
       
       Результат = Запрос1.Выполнить();  
       ТЗ = Результат.Выгрузить();
       ВыборкаДетальныеЗаписи = Результат.Выбрать();
       пока ВыборкаДетальныеЗаписи.Следующий() Цикл
           //Сообщение = новый СообщениеПользователю();
           //Сообщение.Текст = "Количество - " + Строка(ВыборкаДетальныеЗаписи.Количество());
           //Сообщение.Сообщить();
           Сообщение = Новый СообщениеПользователю();
           Сообщение.Текст = "Остаток " + ВыборкаДетальныеЗаписи.наименование + " = " + Строка(ВыборкаДетальныеЗаписи.КоличествоОстаток);
           Сообщение.Сообщить();
           Отказ = Истина;
       КонецЦикла;
21 Web00001
 
09.11.12
12:44
(14) тем что в первом случае у документа еще нет движений а во втором есть?
(15) Что??? Ну что же вы курите а? Как такое изящное решение пришло в голову?
22 Cunni
 
09.11.12
12:44
он троллит, не ведитесь.
23 Cunni
 
09.11.12
12:45
(22) во всяком случае я на это надеюсь, что он просто троллит...
24 Гефест
 
09.11.12
12:46
(20) Контроль отрицательных остатков при приходе - это мощно!
25 rowflag
 
09.11.12
12:46
(21) Какое решение?
26 rowflag
 
09.11.12
12:46
(24) расход выше - не скопировал.
27 zak555
 
09.11.12
12:49
Очистить(); Записать();
28 Spieluhr
 
09.11.12
12:49
(25) решение написали в (16), (18) и (21)
29 Serg_1960
 
09.11.12
12:49
(0) Описание ошибок займёт строк больше, чем сам... эээ... алгоритмом это назвать нельзя.
30 samozvanec
 
09.11.12
12:51
(0) аххах выложи еще кода пожалуйста
31 rowflag
 
09.11.12
12:51
(16)(18)(21) Спасибо!
32 rowflag
 
09.11.12
17:11
А всего то надо было в свойствах дока - Движения - Удаление движений поставить "Автоматически" (стояло "Автоматически, при про отмене удаления")
Я не хочу быть самым богатым человеком на кладбище. Засыпать с чувством, что за день я сделал какую-нибудь потрясающую вещь — вот что меня интересует. Стив Джобс