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

Автор Тема: расчитывает остатки без учета текущего документа....  (Прочитано 8918 раз)

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

Оффлайн Андрей Тимофеев

  • *
  • Сообщений: 1
  • РЕПУТАЦИЯ: 0
  • Регистрация: 2016-08-03
  • Сайт: 


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

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

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


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

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

Оффлайн vitasw

  • *****
  • Сообщений: 2546
  • РЕПУТАЦИЯ: 309
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
не может быть.
Чет вы заработались. При "удалять движения автоматически" - всегда без учета текущего документа.

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

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

а это?
КонецЦикла;
   
   Движения.Записать();
   
   
   Если Режим = РежимПроведенияДокумента.Оперативный Тогда

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

Оффлайн LexaK

  • *****
  • Сообщений: 1251
  • РЕПУТАЦИЯ: 344
  • КПД: 27%
  • Регистрация: 2012-05-16
  • Сайт: 
  • Профессия: Программист 1С
и вообще идиотизм какой-то! все перевернуто с ног на голову
какой дурак придумал,
сначала сделать проводки, сформировать и записать движения, а потом уже проверить остатки и если они отрицательные все откатить!!! :ehtwj:

все нормальные проведения делают наоборот
1.Сначала выполняются все нужные проверки, проверяются остатки и т.д. выводятся информационные сообщения и ВСЕ, дальше документ не проводится!
2.если проверки прошли сделать движения

поэтому совет Андрей Тимофеев,

если это оперативное проведение, сделайте сначала проверку количества остатков.
если их не хватает, выдайте сообщение, выйдите из проведения.

если все ОК, сделайте проводки.

Помогло? - Нажми СПАСИБО!!!
                       :)

Оффлайн vitasw

  • *****
  • Сообщений: 2546
  • РЕПУТАЦИЯ: 309
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
какой дурак придумал, сначала сделать проводки, сформировать и записать движения, а потом уже проверить остатки и если они отрицательные все откатить

:D вообще-то это официальные рекомендации 1С.
Именно так и рекомендуется делать, когда это возможно. Вначале пишутся движения, а затем проверяются остатки. - это оптимистическая модель проведения, т.е. в процентном отношении число удачных проведений будет больше чем число откатов. + время выполнения такого проведения в общем случае будет меньше чем традиционная схема проведения.
Другое дело, что в данном случае организация проведения выполнена неправильно.



Добавлено: 04 Авг 2016, 10:35

в начале обработки проведения движения пусть и потерлись, но потом они явно записываются...

Упс, согласен.

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

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

Оффлайн LexaK

  • *****
  • Сообщений: 1251
  • РЕПУТАЦИЯ: 344
  • КПД: 27%
  • Регистрация: 2012-05-16
  • Сайт: 
  • Профессия: Программист 1С
cska-fanat-kz,
не пойму где логика

Вариант с постпроверкой

1.Делаем движения - т1
2.выполняем проверку - т2
3.откат транзакции - т3

если условие не прошло, сумма действий = т1 + т2 + т3

Вариант с предпроверкой

1.выполняем проверку - т2
2.Делаем движения - т1

если условие не прошло, сумма действий = т2

где здесь оптимальность первого варианта? :dfbsdfbsdf:

Помогло? - Нажми СПАСИБО!!!
                       :)

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

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

Оффлайн vitasw

  • *****
  • Сообщений: 2546
  • РЕПУТАЦИЯ: 309
  • КПД: 12%
  • Регистрация: 2015-02-10
  • Сайт: 
  • Профессия: Программист 1С
cska-fanat-kz,
не пойму где логика

Вариант с постпроверкой

1.Делаем движения - т1
2.выполняем проверку - т2
3.откат транзакции - т3

если условие не прошло, сумма действий = т1 + т2 + т3

Вариант с предпроверкой

1.выполняем проверку - т2
2.Делаем движения - т1

если условие не прошло, сумма действий = т2

где здесь оптимальность первого варианта?
Некорректное описание.

хоть я этого перца терпеьь не могу, но.. : http://1c.chistov.pro/2010/06/1-82.html


Теги:
 

Не открывает форму сохраненного документа, открывает форму нового.

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

Ответов: 1
Просмотров: 4197
Последний ответ 13 Апр 2012, 23:26
от Vit1501
Автоматическое заполнение табличной части документа из табличной части другого

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

Ответов: 6
Просмотров: 14704
Последний ответ 16 Авг 2012, 12:07
от Will
Заполнение поля табличной части документа из табличной части справочника.

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

Ответов: 3
Просмотров: 3783
Последний ответ 06 Апр 2015, 20:08
от Kurt_Wagner
Заполнение табличной части документа реквизитами табличной части справочника

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

Ответов: 1
Просмотров: 307
Последний ответ 10 Май 2017, 20:44
от ilnur75
Добавление сведений в графу "основание" документа "ТОРГ-12"

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

Ответов: 4
Просмотров: 7244
Последний ответ 20 Авг 2013, 18:45
от Ярослав1984

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

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

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


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

* Реклама

* Поиск

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

* Реклама

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

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

alex0402
92 Сообщений
oleg-x
73 Сообщений
Геннадий ОбьГЭС Геннадий ОбьГЭС
65 Сообщений
Golickoff Golickoff
51 Сообщений
AIFrame
46 Сообщений
ilyay ilyay
40 Сообщений
Амал
30 Сообщений
MuI_I_Ika MuI_I_Ika
27 Сообщений
lansy
22 Сообщений
Dethmontt Dethmontt
22 Сообщений

* Кто онлайн

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

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

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

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

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

Поиск

 
SimplePortal 2.3.5 © 2008-2012, SimplePortal