Реклама на этом месте
Форум 1С
Форум 1С
Программистам. Бухгалтерам. Администраторам. Пользователям
Задай вопрос - получи решение проблемы. Без троллинга и флуда.
12 Дек 2017, 09:38
МультиВход
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?
 
collapse

Автор Тема: Проверка остатков на складе перед проведением  (Прочитано 25254 раз)

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

Оффлайн Diakon

  • *
  • Сообщений: 20
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2012-03-15
  • Сайт: 
  • Профессия: Ученик 1С
Добрый день. Начал изучать 1С 8.2
Вопрос такой. Мне в документе "Расходня накладная" перед списанием товара со склада надо проверять наличие доступного товара для списания. Ну чтоб при продаже скажем 10 ручек (при наличии на складе всего 5) документ не проводился и выдовалось сообщение о недостаче. Я написал через запрос получение остатков. И все работает если скажем я списываю эти ручки. Но если я списываю ручки и, скажем, книги (их на складе достаточно для списания) документ проводится. Потом в отчете я вижу что на складе осталось, например: -5 ручек и 10 книг. Подскажите где я ошибся и вообще насколько правильно такое решение которое использую я.

Процедура ОбработкаПроведения(Отказ, Режим)
   Движения.ТоварыНаСкладе.Записывать = Истина;
   Для Каждого ТекСтрокаРасходнаяНакладнаяТЧ Из РасходнаяНакладнаяТЧ Цикл
      Движение = Движения.ТоварыНаСкладе.Добавить();
      Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
      Движение.Период = Дата;
      Движение.Наименование = ТекСтрокаРасходнаяНакладнаяТЧ.Наименование;
      Движение.Количество = ТекСтрокаРасходнаяНакладнаяТЧ.Количество;
   КонецЦикла;
   
   Запрос = Новый Запрос(
    "ВЫБРАТЬ
    |   ТоварыНаСкладеОстатки.Наименование КАК НаименованиеПоРегистру,
    |   ТоварыНаСкладеОстатки.КоличествоОстаток КАК КоличествоПоРегистру,
    |   РасходнаяНакладнаяРасходнаяНакладнаяТЧ.Наименование КАК НаименованиеПоДок,
    |   РасходнаяНакладнаяРасходнаяНакладнаяТЧ.Количество КАК КоличествоПоДок
    |ИЗ
    |   РегистрНакопления.ТоварыНаСкладе.Остатки КАК ТоварыНаСкладеОстатки,
    |   Документ.РасходнаяНакладная.РасходнаяНакладнаяТЧ КАК РасходнаяНакладнаяРасходнаяНакладнаяТЧ
    |ГДЕ
    |   ТоварыНаСкладеОстатки.Наименование = РасходнаяНакладнаяРасходнаяНакладнаяТЧ.Наименование"
   );
    Результат = Запрос.Выполнить();
    ТабЗнач=Результат.Выбрать();
   Пока ТабЗнач.Следующий() Цикл
   СписываемоеКоличествоТовара = ТабЗнач.КоличествоПоРегистру - Движение.Количество;
      Если СписываемоеКоличествоТовара<0 Тогда
         Сообщить ("Товара: "+ТабЗнач.НаименованиеПоРегистру+" недостаточно на складе. Не хватает "+СписываемоеКоличествоТовара+"  единиц товара! Проведение отменено! ", СтатусСообщения.Важное);
         Отказ=Истина;
         Прервать;
      КонецЕсли;
   
   КонецЦикла;

КонецПроцедуры


Заранее спасибо!


Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
Ошиблись во всем, чем тока можно!

1. Почитайте что нибудь про соединения таблиц в запросе. Намекну: вам понадобится левое соединение.
2. Условия накладываются в параметрах виртуальной таблицы а не в секции ГДЕ
3. Получение остатков надо ограничить списком номенклатуры из документа и получать на момент времени документа
4. Запрос получает ВСЕ табличные части ВСЕХ документов! надо добавить условие на ссылку текущего документа
5. Не учитываются дубли строк - т.е. если ваши ручки в ТЧ повторятся...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн Klyacksa

  • Фрилансер. Милости прошу с задачами в личку.
  • Глобальный модератор
  • *****
  • Сообщений: 1325
  • РЕПУТАЦИЯ: 430
  • КПД: 32%
  • Регистрация: 2010-08-20
  • Сайт: 
  • Профессия: Программист 1С
Ну только в данном запросе все же правое соединение получается (по порядку следования таблиц).

И еще:
6. В регистрах/документах хранят не наименование строкой, а ссылку на справочник Номенклатура
7. Нужно отрабатывать на NULL все количественные показатели регистра, ибо если остаток товара 0, то записи в виртуальной таблице Остатки по такому товару не будет.
8. При перепроведении в запросе учтутся старые записи этого же документа, что даст совершенно кривые остатки. Например, на складе есть 10 ручек, наш документ списал 6. Мы спохватились, хотим списать все-таки 7  ручек. Вот в таком случае остаток мы получим не 10, как хотелось бы, а 4. Соответственно, документ не проведется.
9. Условие, которые написано в разделе ГДЕ, по-хорошему уйдет в соединение таблиц. Ну и, конечно, условия на виртуальную таблицу надо бы написать. Нам же не нужно получать все-все остатки по всем-всем товарам, правда же? Нам достаточно получить остатки только по используемым нами товарам. (но это уже есть в п.2)
10. Не нужно при Отказе сразу прерывать цикл. Если Отказ=Истина, документ и так не проведется, зато сли в таб.части не хватает двух товаров - Ручек и Карандашей, в Вашем случае пользователь увидит только сообщение о Ручках. А ему нужно знать обо всех нехватках документа.
11. Ну и, наконец, мы в самом запросе можем получить только те товары, по которым нехватка, а затем уже проверять - если результат запроса пустой, то минусов нет. Для этого в запрос нужно передать таблицу (Товар,Количество) и поставить условие сравнения с реальным остатком.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
Ну это то да.
Просто я уже привык: сперва брать ТЧ документа и СЛЕВА присоединять остатки ;)
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
п. 11 конечно немного по другому делается: записываются движения документа, затем считываются получившиеся остатки и отбираются ушедшие в минус...
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.

Оффлайн Klyacksa

  • Фрилансер. Милости прошу с задачами в личку.
  • Глобальный модератор
  • *****
  • Сообщений: 1325
  • РЕПУТАЦИЯ: 430
  • КПД: 32%
  • Регистрация: 2010-08-20
  • Сайт: 
  • Профессия: Программист 1С
2cska-fanat-kz, зная твою любовь к новой методике, не думаю, что стОит сейчас спорить по поводу методик проведения ;)

Но соглашусь, что в данном случае "по-новому" было бы проще всего

2Diakon
Методика проведения "по-новому" появилась с платформой 8.2 и заключается в том, что мы в начале записываем движения документа, а потом смотрим - не ушли ли мы в минус. И если ушли, отменяем проведение.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Оффлайн Diakon

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


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


   //}}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры

Так?

Оффлайн Klyacksa

  • Фрилансер. Милости прошу с задачами в личку.
  • Глобальный модератор
  • *****
  • Сообщений: 1325
  • РЕПУТАЦИЯ: 430
  • КПД: 32%
  • Регистрация: 2010-08-20
  • Сайт: 
  • Профессия: Программист 1С
Вы получаете остатки по всем-всем товарам, а достаточно получать только по тем, которые есть в документе.
xxx: Спасибо! Я бы загуглил, но ты интересней. Материшься. Злишься. Послать можешь...

Мысль - это оргазм мозга. Кто способен его испытать - получают истинное наслаждение, остальным приходится имитировать

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
Хоть и опередили - не стал удалять ))

Уже лучше )

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

Оффлайн cska-fanat-kz

  • 1С:Специалист
  • Глобальный модератор
  • *****
  • Сообщений: 5745
  • РЕПУТАЦИЯ: 1099
  • КПД: 19%
  • Красная армия всех сильней!
  • Регистрация: 2010-11-06
    • Skype: cska-fanat-kz81
  • Сайт: cska-fanat-kz.ucoz.kz
  • Профессия: Разработчик 1С
И количество нехватки вычисляется неправильно!
Движение.Количество - не меняется!
Получил помощь - скажи СПАСИБО.
Разобрался сам - расскажи другим.


Теги:
 

Отчеты "Ведомость ОС, НМА" и "Ведомость остатков материалов"

Автор OlegatorOGРаздел Пользователям "1С - Предприятие 8"

Ответов: 0
Просмотров: 2599
Последний ответ 04 Апр 2015, 06:15
от OlegatorOG
«Единица для отчетов» и «Единица хранения остатков»

Автор tranceferРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 7544
Последний ответ 14 Фев 2012, 02:29
от Dethmontt
В чем отличие регистра оборотов и регистра остатков

Автор Dmitry QweРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 2
Просмотров: 327
Последний ответ 20 Сен 2017, 11:03
от ilyay
Просмотр остатков из документа "Заказ Покупателя"

Автор Игорь ПолищукРаздел Пользователям "1С - Предприятие 8"

Ответов: 1
Просмотров: 2840
Последний ответ 24 Авг 2011, 20:29
от Eugeneer
Отображение остатков брак. товара в "Рабочем месте менеджера по продажам"

Автор LittleHedgehogРаздел Конфигурирование, программирование в "1С - Предприятие 8"

Ответов: 0
Просмотров: 2892
Последний ответ 16 Фев 2010, 11:15
от LittleHedgehog

* Живое общение

Не устроил ответ?

Зарегистрируйся и задай свой вопрос. Живое общение приносит результат намного быстрее.


Зарегистрироваться

* Реклама

* Поиск

* Последние задачи на разработку (фриланс)

* Реклама

* Последние вакансии

* Топ 10 авторов за месяц

Геннадий ОбьГЭС Геннадий ОбьГЭС
168 Сообщений
ilyay ilyay
75 Сообщений
oleg-x
55 Сообщений
alex0402
46 Сообщений
andron81_81
42 Сообщений
AIFrame
37 Сообщений
MuI_I_Ika MuI_I_Ika
31 Сообщений
BuhRust
29 Сообщений
Golickoff Golickoff
28 Сообщений
Dima Dddd Dima Dddd
26 Сообщений

* Кто онлайн

  • Точка Гостей: 700
  • Точка Скрытых: 0
  • Точка Пользователей: 12
  • Точка Сейчас на форуме:

* Облако тэгов

* Форум 1С с мобильного

* Инструменты

* Дополнительно

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal