Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
19 апр 2024, 06:30

Расход\Приход 8.0

Автор warshadow, 24 фев 2011, 19:42

0 Пользователей и 1 гость просматривают эту тему.

warshadow

Вообщем вот как получилось:

Процедура ОбработкаПроведения(Отказ, Режим)
   
   //{{__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
   // Данный фрагмент построен конструктором.
   // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
   Для Каждого ТекСтрокаТаблРеализКниКонтр Из ТаблРеализКниКонтр Цикл
      


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

Вроде работает!

warshadow

Но фишка в том, что он не списывает только по количеству, например:
Книга Война и Мир 2шт
Книга Анна Каренина 1шт
Я могу списать Война и Мир 3шт.
Т.е нету ограничения на ту самую книгу

warshadow

Попробовал сделать так:
1)добавить в запрос
ПоступлениеРеализацияСписаниеКнигОстатки.НаименованиеКниги КАК НаименованиеНаСкладе
Сделать условие:

Если Выборка.НаименованиеКнигиПоДокументу = Выборка.НаименованиеНаСкладе Тогда
               Продолжить;
               

            ИначеЕсли Выборка.НаименованиеКнигиПоДокументу <> Выборка.НаименованиеНаСкладе Тогда
               Сообщить("нет");
               Отказ= Истина;
                    КонецЕсли;
,но что-то я не так делаю..

cska-fanat-kz

Простите, ща начну ругаться...

"Запросом вы получили список книг из табличной части документа плюс количество, которое надо списать плюс количество данной книги на складе.

Загонять его теперь в цикл "Для каждого" не требуется.
Теперь достаточно обойти результат запроса."

Какое слово в цитате не понятно?

Зачем вы упорно загоняете цикл в цикл Для Каждого - цикл обхода строк табличной части??!!

Запрос нужен не только для контроля остатка на складе!
Обходом его результата вы и остаток контролируете и непосредственно движения по регистру формируете.

В одном из постов я ВСЮ ПРОЦЕДУРУ проведения написал (даже втык от Klyacksa заслуженный получил!).
Просто копируете\вставляете (естественно названия объектов своими поменяв).
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

warshadow

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

Выборка=Запрос.Выполнить().Выбрать();
                  
         Пока Выборка.Следующий() Цикл
                                     
            Если Выборка.КоличествоПоДокументу > Выборка.КоличествоНаСкладе Тогда
               Сообщить("Всего "+Выборка.КоличествоНаСкладе+"книг(и)");
               Отказ= Истина;
            КонецЕсли;
Движение = Движения.ПоступлениеРеализацияСписаниеКниг.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
      Движение.Период = Дата;
      Движение.НаименованиеКниги=Выборка.НаименованиеКниги;
      Движение.Издательство = Выборка.Издательство;
      Движение.Количество = Выборка.КоличествоПоДокументу;
      КонецЦикла;
   
   Движения.ПоступлениеРеализацияСписаниеКниг.Записать();
   
КонецПроцедуры
но, все равно на наименование книги - он не обращает внимание.
Так же, проверку на ввод полей-реквизитов:
Если  ТекСтрокаТаблРеализКниКонтр.Дата ='00010101' Тогда
         Сообщить("Не заполнен реквизит поля ""Дата"" ",СтатусСообщения.Важное);
         Отказ= Истина;
      КонецЕсли;
      
      Если  ТекСтрокаТаблРеализКниКонтр.НаименованиеКниги.Пустая() Тогда
         Сообщить("Не заполнен реквизит поля ""Наименование Книги"" ",СтатусСообщения.Важное);
         Отказ= Истина;
      КонецЕсли;
      
      Если  ТекСтрокаТаблРеализКниКонтр.Издательство.Пустая() Тогда
         Сообщить("Не заполнен реквизит поля ""Издательство"" ",СтатусСообщения.Важное);
         Отказ= Истина;
      КонецЕсли;
      
      Если  ТекСтрокаТаблРеализКниКонтр.ЕдиницыИзмерения.Пустая() Тогда
         Сообщить("Не заполнен реквизит поля ""Единицы Измерения"" ",СтатусСообщения.Важное);
         Отказ= Истина;
      КонецЕсли;
      
      Если ТекСтрокаТаблРеализКниКонтр.Количество <=0 Тогда
         Сообщить("Не заполнен реквизит поля ""Количество"" ",СтатусСообщения.Важное);
         Отказ= Истина;
      КонецЕсли;
не работает уже, т.к цикл Для каждого ушел.
//////////////////////////////////////////////////////////////////
Загонять его теперь в цикл "Для каждого" не требуется.
Теперь достаточно обойти результат запроса.
//////////////////////////////////////////////////////////////////
Для чего используется обход рез-та запроса?




cska-fanat-kz

Втык №2

Посмотрите внимательно на последний запрос.
Куда делось левое соединение?
Верните как было. Раньше было правильно, а сейчас нет.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Параллельное замечание

вот это

"Движения.ПоступлениеРеализацияСписаниеКниг.Записать();"

уберите
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Проверка заполнения реквизитов - это отдельная тема...

Как вариант прогнать перед запросом ваш любимый цикл Для каждого.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

cska-fanat-kz

Нет. Передумал.

Проверку реквизитов выполнять в событии ПередЗаписью.
Либо в модуле форме либо в модуле объекта (что лучше).

Но опять же вашим любимым циклом Для каждого.
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

warshadow

Так сделал Левое Соединение:

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

Теперь ругается, что нету ничего

Теги:
Рейтинг@Mail.ru

Поиск