Имя: Пароль:
1C
1С v8
Поиск "движений" по регистратору
,
0 ksTheme
 
18.02.13
15:29
Здравствуйте, недавно столкнулся с проблемой, о которой сейчас расскажу по порядку :)

Появилась необходимость проверки склада при проведении по регистру накопления "ТоварыНаСкладах".
Первой мыслью пришло в голову создание проверки в модуле самого регистратора в процедуре "ПередЗаписью", но я не смог получить инф-ию по  складам...
После этого решил сделать "подписку" (процедура "обработка проведения")  на все документы-регистраторы этого регистра. Создал новый модуль (в нем все мои изменения) создал подписку и написал простейший запрос:

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

/////////////////////////////////

Результат возвращается пустой! КАК, ПОЧЕМУ? для меня совсем непонятно.
решил поэкспериментировать и в этом модуле обратился к типовой экспортной процедуре:
"ТаблицаДвижений = ПолныеПрава.ОпределитьНаличиеДвиженийПоРегистратору(РегистраторСсылка);"
Результат снова пустой, я уже начал думать что передаваемая ссылка неправильная, но это исключено. Если передавать ссылку на регистратор через реквизит документа (как и реализовано в тип. конф. "на примере перейти-движения по регистрам") все работает.
Теперь сижу ломаю мозг. Помогите если сможете плз)
1 Михаил Козлов
 
18.02.13
15:32
Движения еще не записаны.
2 ksTheme
 
18.02.13
15:38
(1) Записаны конечно.
3 Reset
 
18.02.13
15:40
Наверное, движения еще не записаны.
4 hhhh
 
18.02.13
15:41
Движения еще не записаны, конечно
5 ksTheme
 
18.02.13
15:41
Я извиняюсь, забыл уточнить, у меня две подписки на обработкуПроведения и на ОбработкуУдалениеПроведения и результат пустой во втором случае.
6 Naumov
 
18.02.13
15:43
а что мешает подписку на набор записей регистра сделать?
7 ksTheme
 
18.02.13
15:45
(6) Приведите пример пожалуйста )) И все равно вопрос остается, почему пустой результат, ведь вроде все верно?
8 ksTheme
 
18.02.13
16:24
(6)Подписка на набор записей действует при проведении документа, а как сделать при отмене проведения(набор записей пуст)?
9 Нуф-Нуф
 
18.02.13
16:25
(8) при отмене проведения подписка тоже сработает
10 GANR
 
18.02.13
16:27
(0) Свойство "Удаление движений" у документа во что установлено?
11 GANR
 
18.02.13
16:28
+(10) Если "Удалять автоматически" - тогда понятно.
12 Naumov
 
18.02.13
16:32
(8) Какое вам дело до удаляемых записей?
13 Жан Пердежон
 
18.02.13
16:34
(12) жалко наверно
14 ksTheme
 
18.02.13
16:36
(9) При отмене она работает но набор записей пустой, они не вносятся со знаком минус, просто удаляются уже имеющиеся движения
15 GANR
 
18.02.13
16:37
(14) что в (10)?
16 ksTheme
 
18.02.13
16:38
у нас менеджеры любят проводить и отменять проведение документов по "чужим" складам, а люди материально ответственные из-за этого страдают
17 ksTheme
 
18.02.13
16:39
(15) даже не представляю о чем вы ...((
18 Михаил Козлов
 
18.02.13
16:41
(16) Обработайте в ПередЗаписью
19 GANR
 
18.02.13
16:42
(17) 1С:Конфигуратор \ Документы \ ТвойДокумент
правая кнопка мыши \ свойства

Свойство "Удаление движений" не должно быть "Удалять автоматически" - иначе движения документа очистится до обработки проведения и подписок.
20 ksTheme
 
18.02.13
16:43
(19) конфигурация типовая документ -реализация товаров и услуг
21 GANR
 
18.02.13
16:45
(20) релиз конфигурации какой?
а лучше зайди в конфигуратор и посмотри (19)
22 ksTheme
 
18.02.13
16:45
(18) Перед записью документа, или Регистра? Представляю только как у регистра, но муторно это делать по всем регистраторам, думал есть способ проще, а если перед записью Регистра, то подскажите как потому что набор записей в этом случае отсутствует и как проверить склад я не знаю((
23 ksTheme
 
18.02.13
16:47
(21)  не удалять автоматически
24 Naumov
 
18.02.13
16:49
(16) Не проще РЛС по складу настроить?
И вообще проверять реквизиты документов, а не набор записей регистров. Странная реализация в свете услышанного.
25 ksTheme
 
18.02.13
16:49
+(22) опечатался представляю как у документа а не регистра
26 Serg_1960
 
18.02.13
16:49
(16) "у нас менеджеры любят..." - а вы им ограничения на уровне записей (RLS) - и закончилась их... любовь :) А то, понимаешь, развели тут... любят, не любят...
27 Serg_1960
 
18.02.13
16:50
:)
28 ksTheme
 
18.02.13
16:53
(24) Я об этом и говорю, РЛС в 1С кривой, работает только на роли менеджерпоПродажам там придется все роли переписывать, в табличной части документа может отображаться склад а не только в реквизитах. Если вы прочтете выше я как раз пытался реализовать подписку при УдаленииПроведения в Документах, но не смог...
29 GANR
 
18.02.13
16:55
(23) значит мое предположение неверно
30 ksTheme
 
18.02.13
16:55
(29) а конкретнее?)
31 ksTheme
 
18.02.13
16:57
(27) вы пользовались РЛС? там только одна роль нормально настроена... в других случаях запреты не действуют показывает всю инфу только вместо запрещенных данных пишет (объект не найден)
32 Naumov
 
18.02.13
16:58
(28) Что не смог? перебрать строки ТЧ в цикле?
33 ksTheme
 
18.02.13
17:01
(32) смог бы ) просто у меня есть документы в которых нет ТЧ товары соответственно надо к каждому регистратору подходить индивидуально, что займет не мало времени. Я хотел реализовать этот механизм как можно проще, НО ВОТ ОДНА ПРОБЛЕМА когда в простейшем запросе, написанном как мне кажется без ошибок нет элементарных данных, вот в чем загвоздка.
34 Naumov
 
18.02.13
17:03
Проще и быстрее - РЛС.

Универсально и без РЛС - проверяйте наличие реквизита через метаданные.
35 ksTheme
 
18.02.13
17:08
(34) Подскажите тогда пожалуйста как правильно перенести ограничение доступа на все роли из роли МенеджерПоПродажам и по каким бъектам, т.к. если я поставлю галочку ограничивать доступ на уровне записей, у пользователей с ролями отличными от МенеджерПоПродажам начнется каша
36 Serg_1960
 
18.02.13
17:09
(28) Не буду заострять внимание на том, что из "я не смог" следует "РЛС в 1С кривой" :)

Вернёмся к началу - почему "первая мысль" не удалось реализовать? Потому что "склад" может быть или в реквизитах, или в табличной части документа?

(34) RLS потяжелее будет тормозить. Всегда и везде при обращении к данным. Обход по метаданным - наверное быстрее. В целом - ведь только при проведении документов он будет подтармаживать. Мысль понятна, надеюсь
37 GANR
 
18.02.13
17:14
(30) тогда движения не должны очищаться перед обработкой проведения
38 Михаил Козлов
 
18.02.13
17:16
(22) Документа. Можно подпиской.
39 ksTheme
 
18.02.13
17:16
(36) Первой мыслью вы имеете ввиду написать проверку в модуле регистра? Не удалось реализовать потому, что набор записей пуст соответственно, что проверять не понятно. Проверка производится легко при проведении документа, а при удалении движений как я сказал выше проверять нечего набор пуст.
40 Naumov
 
18.02.13
17:17
(37) Движения трутся в самом начале процедуры ОбработкиПроведения в типовых, где автоудаление убрано. Поэтому и трутся.
41 GANR
 
18.02.13
17:18
(39) см. (40)
42 ksTheme
 
18.02.13
17:20
(38) Спасибо, тоже уже склоняюсь к этому варианту ))
43 ksTheme
 
18.02.13
17:29
(40)  (41) Спасибо,  этого ответа я и ждал)
44 Serg_1960
 
18.02.13
18:08
PS: интереса ради. болванка по метаданным.

Процедура ПередЗаписьюДокументаПроверкаДоступностиСклада(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
   
   Если Отказ ИЛИ Источник.ОбменДанными.Загрузка Тогда
       Возврат;
   КонецЕсли;
   
   СкладПользователя = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(глЗначениеПеременной("глТекущийПользователь"),"ОсновнойСклад");
   
   ИщемТип = ТипЗнч(СкладПользователя);
   
   МетаданныеДокумента = Источник.Метаданные();
   Для Каждого Реквизит Из МетаданныеДокумента.Реквизиты Цикл
       Если Реквизит.Тип.СодержитТип(ИщемТип) Тогда
           ТекЗначение = Источник[Реквизит.Имя];
           Если ТипЗнч(ТекЗначение) = ИщемТип И ЗначениеЗаполнено(ТекЗначение) И ТекЗначение <> СкладПользователя Тогда
               Отказ = Истина;
           КонецЕсли;
       КонецЕсли;
   КонецЦикла;
   
   Если Не Отказ Тогда
       Для Каждого Таблица Из МетаданныеДокумента.ТабличныеЧасти Цикл
           Для Каждого Реквизит Из Таблица.Реквизиты Цикл
               Если Реквизит.Тип.СодержитТип(ИщемТип) Тогда
                   Для Каждого Строка Из Источник[Таблица.Имя] Цикл
                       ТекЗначение = Строка[Реквизит.Имя];
                       Если ТипЗнч(ТекЗначение) = ИщемТип И ЗначениеЗаполнено(ТекЗначение) И ТекЗначение <> СкладПользователя Тогда
                           Отказ = Истина;
                       КонецЕсли;
                   КонецЦикла;
               КонецЕсли;
           КонецЦикла;
       КонецЦикла;
   КонецЕсли;
       
   #Если НЕ ВнешнееСоединение Тогда
       Если Отказ Тогда
           Сообщить("Редактирование документа запрещено - это ""чужой"" склад.", СтатусСообщения.Важное);
       КонецЕсли;
   #КонецЕсли
   
КонецПроцедуры    // ПередЗаписьюДокументаПроверкаДоступностиСклада
45 ksTheme
 
18.02.13
18:08
(44) Спасибо, прочитал мои мысли)
46 Serg_1960
 
18.02.13
18:11
Но есть подлянка одна - документ перемещения товаров между складами - как тут быть? Два склада - один из них, по любому, - чужой :)
47 ksTheme
 
18.02.13
18:17
(46) а у меня по ордерам делается, если не по ордерам соответственно проводится не должен.
48 Serg_1960
 
18.02.13
18:25
Мелочь,но... В (44) не учитывается, что юзвер может исправить документ с "чужим" складом на "свой" склад - по хорошему проверку надо делать дважды - ещё и для Источник.Ссылка запускать.
Болванка - она и есть болванка :)
49 Serg_1960
 
18.02.13
18:26
Ок. Мавр сделал своё дело - мавр может уходить. бб.
50 ksTheme
 
18.02.13
18:29
(49) Сапсибо ))
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс