Автор Тема: Задача 1.01  (Прочитано 176985 раз)

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

provadyuga

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Вадим М.
Re: Задача 1.01
« Ответ #480 : Сентябрь 16, 2015, 11:50:14 am »
Добрый день!
Подскажите пожалуйста.
В обработке проведения расходной накладной платформа ругается на такую строчку:

   Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;

При проведении  расходной накладной из дебрей платформы выходит вот такое сообщение:


В свойствах каркасной конфигурации режим управления блокировкой выставлен в «Автоматический».


Режим работы — файловый.
В опубликованных примерах решения задачи строка по блокировке есть.
Что не так ?
Изначально в каркасной  в свойствах конфигурации режим управления блокировкой выставлен в «Автоматический».
Можно ли в решении задачи изменить на «Управляемый» ?
Или категорически нельзя менять т.к.это как бы исходные данные не подлежащие изменению в ходе решения ?
« Последнее редактирование: Сентябрь 16, 2015, 12:13:35 pm от provadyuga »

zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
Re: Задача 1.01
« Ответ #481 : Сентябрь 16, 2015, 02:52:39 pm »
Нужно ставить в "Управляемый". Каркасную вообще много где менять можно и Нужно. Тут на форуме много про это написано, щас лень искать )) Это ещё от 2010 года сообщения поглядите.


provadyuga

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Вадим М.
Re: Задача 1.01
« Ответ #482 : Сентябрь 19, 2015, 07:39:44 am »
Подскажите пожалйста нужно ли ставить в обработке проведения Приходной накладной строку

   Движения.ОстаткиНоменклатуры.Очистить();         ?

Свойство   Приходной накладной Удаление движений выставлено в «Удалять автоматически при отмене проведения».

         
Из статьи П.Чистова "Методика оперативного проведения и управляемые блокировки", если я правильно понял, выходит, что нужно, т.к. при  данном  значении свойства документа его движения будут удаляться автоматически только при событии «Отмена проведения». А при событии «Проведение»  никакого автоматического удаления движений не будет происходить. Отсюда и возникает необходимость в вышеуказаной строке кода.

Однако и без этой строки в режиме предприятия при перепроведении дублей строк движений в регистре ОстаткиНоменклатуры не образуется. Т.е. что с этой строкой, что без нее — без разницы. На результат проведения это никак не влияет.

Может кто-нибудь объяснит почему ? И нужна ли эта строка в этом документе ?
« Последнее редактирование: Сентябрь 19, 2015, 07:55:48 am от provadyuga »

zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
Re: Задача 1.01
« Ответ #483 : Сентябрь 19, 2015, 12:49:31 pm »
в Приходной нет, там только запись без чтения, поэтому движения перезапишутся.
В Расходной нужно, там читаем из регистра, старые движения при перепроведении(если изменили док-т, поменяли измерения,ресурсы) соединятся Левым Соединением с РегистромНакопления, получатся искажённые данные...Вроде того по моему, может кто чётче объяснит? )))
Иногда требуются 2 блокировки, как у Павла в задаче 1.6 - посмотрите, если сможете просто и на пальцах объяснить ЗАЧЕМ - буду рад, сам пока разбираюсь!!!! )



И встречный вопрос, кто подскажет:
есть обычный код:

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

   Блок = Новый БлокировкаДанных;
   ЭлБлока = Блок.Добавить("РегистрНакопления.ОстаткиНоменклатуры");
   ЭлБлока.ИсточникДанных=Результат;
   ЭлБлока.ИспользоватьИзИсточникаДанных("Номеcvbcvbcbнклатур","ааиииаир");
   ЭлБлока.ИспользоватьИзИсточникаДанных("Паапvbvпапати","Парти");
   ЭлБлока.Режим=РежимБлокировкиДанных.Исключительный;
   Блок.Заблокировать();

1) в "ИспользоватьИзИсточникаДанных" - пишу всякую хрень, всё отрабатывает норм, без ошибок. Получается что просто блокировка НЕ СРАБАТЫВАЕТ? или как.
2) а второй вопрос, можно ли написать если хотим заблокировать по 2-м измерениям:
   ЭлБлока.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");
   ЭлБлока.ИспользоватьИзИсточникаДанных("Партия","Партия");
ИЛИ можно ТАК:
        ЭлБлока.ИспользоватьИзИсточникаДанных(("Номенклатура","Партия"),("Номенклатура","Партия") );
Но судя по первому вопросу, ИспользоватьИзИсточникаДанных - ему вообще пофиг, что в параметрах написано  :-)))
Подскажите кто как думает.

А ещё вопросик:

  |      ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
       |            &Момент,
       |            (Номенклатура, Партия) В
       |               (ВЫБРАТЬ
       |                  ДокТЧ.Номенклатура,
       |                  ДокТЧ.Партия
       |               ИЗ
       |                  ДокТЧ КАК ДокТЧ)) КАК ОстаткиНоменклатурыОстатки
       |      ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
       |         И ДокТЧ.Партия = ОстаткиНоменклатурыОстатки.Партия

В Параметрах ВТ Остатки можно так писать(работает) или писать через "И" т.е:

   ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
       |            &Момент,
       |            (Номенклатура В
       |               (ВЫБРАТЬ
       |                  ДокТЧ.Номенклатура,
       |               ИЗ
       |                  ДокТЧ КАК ДокТЧ))
                                                И
                                         (Партия В
       |               (ВЫБРАТЬ
       |                  ДокТЧ.Партия,
       |               ИЗ
       |                  ДокТЧ КАК ДокТЧ))
                                                 КАК ОстаткиНоменклатурыОстатки
       |      ПО ДокТЧ.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
       |         И ДокТЧ.Партия = ОстаткиНоменклатурыОстатки.Партия

И если есть разница то в чем, мне как раз нужно что была пара: Номенклатура-Партия - как одно ЦЕЛОЕ, т.е.
Номенклатура-ДругаяПартия - уже не должна попадать в параметры.

Quantum81

  • Проверенный
  • ***
  • Сообщений: 117
Re: Задача 1.01
« Ответ #484 : Сентябрь 19, 2015, 12:50:31 pm »
Хотел отправить в документацию, да там все запутано-то как :)
provadyuga, у вас ощущуается пробел в теории. Объяснять долго. Попробуйте сделать движения документа используя лишь у примеру РегистрНакопленияНаборЗаписей. Может тогда станет понятней.
 Т.е. отобрать, прочитать, поменять, записать.

provadyuga

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Вадим М.
Re: Задача 1.01
« Ответ #485 : Сентябрь 19, 2015, 01:57:36 pm »
Насколько я понял из вышеупомянутой статьи П.Чистова  в обработке проведения РасходнойНакладной на регистр ОстаткиНоменклатуры нужно ставить две блокировки:

1-я — с помощью объекта БлокировкаДанных,  чтобы блокировку  установить еще перед запросом, чтобы не допустить  чтения данных другим клиентом, когда проводится документ т.е. еще до записи, когда еще только читаем данные запросом, чтобы получить остатки.
А метод   Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
блокирует только в момент записи, т. е. , например, при выполнении метода Движения.ОстаткиНоменклатуры.Записать();

и 2-я — на случай оперативного проведения. В этом случае нужно очистить старые движения., иначе система вылетит с ошибкой.
   // Отследим оперативное проведение и очистим старые движения.
   Если РежимПроведения = РежимПроведенияДокумента.Оперативный Тогда
   
      Движения.ОстаткиНоменклатуры.Очистить();
      Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;
      Движения.ОстаткиНоменклатуры.Записать();
      
   КонецЕсли;

В 2-м случае  Движения.ОстаткиНоменклатуры.БлокироватьДляИзменения = Истина;  достаточно. Не нужно ваять  объект БлокировкаДанных.

Вот только тут походу возникает вопрос: А нужно ли блокировать 2-й блокировкой, если перед ней  1-я уже заблокировала регистр?
« Последнее редактирование: Сентябрь 19, 2015, 02:24:01 pm от provadyuga »

provadyuga

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Вадим М.
Re: Задача 1.01
« Ответ #486 : Сентябрь 19, 2015, 03:09:50 pm »
Т.е. отобрать, прочитать, поменять, записать.
Ну вот тут попробуем т.сказать логически порассуждать. Все эти четыре действия должны выполняться в ОбработкеПроведения. Причем   «поменять»   - это будет «очистить» и «добавить новые». Если свойство документа выставлено в «Удалять автоматически», то это значит, что  «очистить» будет выполнено автоматически. А если — в «Удалять автоматически при отмене проведения», то при выполнении  ОбработкиПроведения  действие «очистить» уже не будет выполняться автоматически, а будет только «добавить новые». И с каждым новым перепроведением пойдут дубли движений в регистре. В этом случае движения  удаляются с помощью строки типа: Движения.ОстаткиНоменклатуры.Очистить();

Ладно, пойду устранять пробел в теории.

zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
Re: Задача 1.01
« Ответ #487 : Сентябрь 19, 2015, 03:39:15 pm »
Да !
А что скажете на мой вопрос?  А то никого нету ответить...Тишина) Суббота чтоль.

alex1248

  • Призрак форума
  • *****
  • Сообщений: 714
Re: Задача 1.01
« Ответ #488 : Сентябрь 19, 2015, 04:39:04 pm »
Но судя по первому вопросу, ИспользоватьИзИсточникаДанных - ему вообще пофиг, что в параметрах написано  :-)))
У меня работает. Вот только что сфоткал с двумя вариантами ошибок (скрины внизу сообщения).
В чем может быть проблема причина у вас, не представляю, у меня в БУ регулярно ошибки выдает.
ЭлБлока.ИспользоватьИзИсточникаДанных("Номенклатура","Номенклатура");
ЭлБлока.ИспользоватьИзИсточникаДанных("Партия","Партия");
Я написал бы так. Но это не боле, чем личное мнение.
       |            (Номенклатура, Партия) В
       |               (ВЫБРАТЬ
       |                  ДокТЧ.Номенклатура,
       |                  ДокТЧ.Партия
       |               ИЗ
       |                  ДокТЧ КАК ДокТЧ)) КАК ОстаткиНоменклатурыОстатки
Раз нужна пара, должно быть так.

provadyuga

  • Новичок
  • *
  • Сообщений: 5
  • ФИО: Вадим М.
Re: Задача 1.01
« Ответ #489 : Сентябрь 19, 2015, 04:46:35 pm »
Попробую выдвинуть такую версию в качестве ответа ваш  вопрос.
В статье П.Чистова написано:
Цитировать
Установили блокировку. Теперь параллельно с нами никто не прочитает остатки по указанным товарам из регистра "СтоимостьТоваров". Обращаю внимание, так как мы не знаем заранее какие партии будут выбраны запросом, то фильтр по ним установить мы не можем и блокируем все партии. Чем меньше фильтров описано, тем больше данных блокируется.

Цитировать
Устанавливаем свойство "БлокироватьДляИзменения". Это позволит заблокировать от чтения те данные которые сейчас будут удалены из регистра, вдруг транзакция будет отменена, не хотим чтобы кто-либо вместе с нами работал с этими данными.
Подобное действие не помешает и при смене даты или времени документа, а не только при оперативном проведении.

Т.е. у вас просто меняется область в регистре по которой устанавливается блокировка в зависимости от того что вы пишите.
Тут также походу ответ на мой же вопрос вырисовывается.
Вот только тут походу возникает вопрос: А нужно ли блокировать 2-й блокировкой, если перед ней  1-я уже заблокировала регистр?
У управляемой блокировки и блоктировки по "БлокироватьДляИзменения" разные области данных, которые блокируются.   
По "БлокироватьДляИзменения" блокируется сугубо по движениям документа. А у управлемой область шире: по определенному перечню номенклатуры, по определенным номенклатуре и партиям, и т.д.
« Последнее редактирование: Сентябрь 19, 2015, 04:52:35 pm от provadyuga »

alex1248

  • Призрак форума
  • *****
  • Сообщений: 714
Re: Задача 1.01
« Ответ #490 : Сентябрь 19, 2015, 04:52:18 pm »
Да !
А что скажете на мой вопрос?  А то никого нету ответить...Тишина) Суббота чтоль.
Может быть у вас такая ситуация (по части кода этого понять нельзя)?

Quantum81

  • Проверенный
  • ***
  • Сообщений: 117
Re: Задача 1.01
« Ответ #491 : Сентябрь 19, 2015, 05:29:05 pm »
Т.е. отобрать, прочитать, поменять, записать.
Ну вот тут попробуем т.сказать логически порассуждать. Все эти четыре действия должны выполняться в ОбработкеПроведения. Причем   «поменять»   - это будет «очистить» и «добавить новые». Если свойство документа выставлено в «Удалять автоматически», то это значит, что  «очистить» будет выполнено автоматически. А если — в «Удалять автоматически при отмене проведения», то при выполнении  ОбработкиПроведения  действие «очистить» уже не будет выполняться автоматически, а будет только «добавить новые». И с каждым новым перепроведением пойдут дубли движений в регистре. В этом случае движения  удаляются с помощью строки типа: Движения.ОстаткиНоменклатуры.Очистить();

Ладно, пойду устранять пробел в теории.
Движения.ОстаткиНоменклатуры
это наборзаписей в оперативной памяти.
После  Движения.ОстаткиНоменклатуры.Записать(); этот набор будет перенесен в регистр. Все лишнее оттуда будет удалено и так.
Удалять автоматически делает это перед проведением.
А действие Очистить() имеет отношение только к наборузаписей в оперативной памяти.



zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
Re: Задача 1.01
« Ответ #492 : Сентябрь 19, 2015, 06:28:28 pm »
Да !
А что скажете на мой вопрос?  А то никого нету ответить...Тишина) Суббота чтоль.
Может быть у вас такая ситуация (по части кода этого понять нельзя)?

Ничего не блокируется перед этим, обычная расходка по "старой". ))
Вот, щас проверил (это задача 1.3 из сборника)   - нормально всё проводит не ругается)))
если заменить тут: ЭлБлока = Блок.Добавить("РегистрНакопления.ОстаткиНоменклатуры111111111"); например -
то сразу ругается)))
Я выгружу файл с решением, можете убедится сами. Давайте всё же выясним эти моменты, ну а в правильности решения-уверен ;)
 И на 2-ой вопрос хочется ответа - обсудить...
« Последнее редактирование: Сентябрь 19, 2015, 06:38:42 pm от zorky »

ID443

  • Пользователь
  • **
  • Сообщений: 24
Re: Задача 1.01
« Ответ #493 : Октябрь 08, 2015, 10:27:37 am »
В условиях запроса часто вот такая строка попадается: "РасходнаяНакладнаяСписокНоменклатуры.Ссылка = Ссылка". Что это условие означает?

zorky

  • Проверенный
  • ***
  • Сообщений: 222
  • ФИО: ЗЖВ
Re: Задача 1.01
« Ответ #494 : Октябрь 08, 2015, 10:41:56 am »
В условиях запроса часто вот такая строка попадается: "РасходнаяНакладнаяСписокНоменклатуры.Ссылка = Ссылка". Что это условие означает?

Это условие ГДЕ , для того чтобы в отбор попали записи ТОЛЬКО этого документа т.е  равные текущей Ссылке.
Если убрать это условие -то в результат попадут ВСЕ записи ВСЕХ Расходных Накладных, которых будет(или есть) много.