Имя: Пароль:
1C
1С v8
КД можно ли отменить выгрузку (или загрузку) после выгрузки объектов
0 5jam
 
31.07.13
11:39
КД 2.1.5.1
Из БП в УАТ пользователь выгружает номенклатуру. Чтобы пользователь по ошибке не выгрузил весь справочник хотелось бы установить ограничение:
если количество выгружаемой за раз номенклатуры больше 30, то не выгружать (или хотябы не загружать).

Добавил Параметры.ТаблицаНоменклатуры и заносил туда Номенклатуру ПослеВыгрузки
затем считаю ее там и пытаюсь как то предотвратить выгрузку или хотя бы загрузку.
Если сделать Отказ = Истина ПослеВыгрузкиДанных или ПослеВыгрОбъекта,
то выгрузка прерывается, но выгруженные до этого объекты все же загружаются в Приемник.
Передавал параметр в Приемник, так они доступны только ПослеЗагрузкиДанных (когда они уже нафиг не нужны)

Что подскажите?
1 5jam
 
31.07.13
11:45
По моему в КД сделать не получится. Придется переделывать обработку выгрузки.
2 GenV
 
31.07.13
11:46
(0) Жуть задача. Как пользователь отбор накладывает? Или он никогда не сможет выгрузить номенклатуру с номером п/п 31?
3 5jam
 
31.07.13
11:52
(0) Отбор стандартный, в табличном поле ПостроительОтбор.
Надо чтобы выгрузка (или загрузка) отменялась, если выгружено более 30 элементов спр Номенклатура

Можно попробовать ПередВыгрузкой получить выборку запросом. Надо туда отбор передать...
4 Naumov
 
31.07.13
11:54
добавь числовой параметр и инкрементируй его, как превысится лупи отказы
5 GenV
 
31.07.13
11:55
4+ в обработчике ПВД "Перред выгрузкой". Он последовательно вызывается при выгрузке каждого объекта. После достижения значения Отказ = Истина;
6 5jam
 
31.07.13
11:58
(4)(5) Да, но пользователь несмотря на сообщения при выгрузке попробует загрузить файл. При загрузке возникает ошибка, но перед этим загружается все, что успело выгрузиться до Отказа.
7 GenV
 
31.07.13
11:58
(6) В файле будет только 30 номенклатур ...
8 5jam
 
31.07.13
12:00
(7) выгруженных юзером по ошибке. А желательно полностью предотвратить загрузку ошибочных данных.
9 dk
 
31.07.13
12:01
прикольно будет, если попадется документ с более 30 товарами
10 5jam
 
31.07.13
12:01
Не пойму зачем 1с сделали в КД, что Параметры доступны только ПослеЗагрузкиДанных
11 5jam
 
31.07.13
12:01
(9) ПВД одно - Номенклатура
12 Жан Пердежон
 
31.07.13
12:02
в ПВД код пиши какой хочешь
13 GenV
 
31.07.13
12:02
98) :) Так ему нужно не больше 30 выгружать или что? Или другое хотел? Например, вообще не выгружать, если номенклатур больше 30?
14 Naumov
 
31.07.13
12:03
Ну для гарантии добавь параметр передаваемый в загрузку, его после превышение возводи в какое-то значение, по которому перед загрузкой будешь в отказ уходить
15 Naumov
 
31.07.13
12:03
Я вот одно не пойму: это ж все на поверхности, неужели так трудно?
16 GenV
 
31.07.13
12:05
(14) Т.е. он хотел не загружать больше 30?
ЗЫ Я так понял ты догадался
17 5jam
 
31.07.13
12:05
Уточню задачу: надо, чтобы вообще не было загрузки, если польз попытался выгрузить больше 30 Номенклатур
18 Naumov
 
31.07.13
12:05
(17) Читай (14)
19 Naumov
 
31.07.13
12:06
хотя параметры надо до выгрузки инициализировать.
ну тогда можешь после предела дописать кривой XML-кусок, чтобы  файл стал нечитаемым :)
20 5jam
 
31.07.13
12:07
(18) :) так ведь Параметры ПередЗагрузкой недоступны. Только ПослеЗагрузкиДанных
21 Aleksey
 
31.07.13
12:07
(66)
написать
а=20/0;

и тогда будет ошибка и файл не сформируется
22 Aleksey
 
31.07.13
12:09
посмотри в пко номенклатуры параметр ВыгруженныеОбъекты


Обработчики "Правила конвертации объектов"
Перед выгрузкой
Условия возникновения события
Событие выполняется перед выгрузкой каждого объекта в файл обмена, не зависимо от того как выгружается объект по правилу выгрузки данных либо потому что на него есть ссылки. Событие вызывается, когда узел объекта приемника еще не создан и недоступен. Возможен отказ от выгрузки, например, в случае невыполнения каких-либо условий.

Параметры:


ВыгруженныеОбъекты - Соответствие.  Содержит перечень выгруженных по данному правилу объектов. Ключом соответствия является параметр КлючВыгружаемыхДанных, значением - число-номер объекта в файле. Может использоваться для проверки - выгружен ли объект по ссылкам из других объектов. В целях оптимизации, при выгрузке больших массивов данных, значение параметра может быть очищено - например в обработчике ПослеОбработкиПравилаВыгрузкиДанных
23 5jam
 
31.07.13
12:09
(19) Интересная идея. Пробовал ПослеВыгрузкиДанных УдалитьФайлы(ИмяФайлаОбмена);
Но похоже файл заблокирован
24 GenV
 
31.07.13
12:09
По идее при стандартном алгоритме при выгрузке ссылок в "Перед выгрузкой" ПВД должна быть доступна переменная "ВыборкаДляВыгрузкиДанных" с типом выборка из результата запроса. А у неё есть метод количество
25 Aleksey
 
31.07.13
12:10
(23) да заблокирован, приходилось дописывать выгрузку чтобы можно было работать с файлом
26 Aleksey
 
31.07.13
12:10
(24) там будет список документов
27 GenV
 
31.07.13
12:12
(26) У него же только один справочник
28 Naumov
 
31.07.13
12:12
(0) А как пользователь может по ошибке назначить к выгрузке весь справочник? Убери это ПВД и его не выберут.
29 GenV
 
31.07.13
12:13
24+ В любом случае это можно решить на этапе выгрузке. Хоть самому отбор программно наложить на выборку. Код же есть.
30 5jam
 
31.07.13
12:29
(21) а=20/0;
Не пашет, это все равно, что Отказ = Истина. Ошибка вываливается, но то, что до ошибки выгружено в файл обмена успешно загружается в базу приемник

(19) как это "после предела дописать кривой XML-кусок"?
31 5jam
 
31.07.13
12:41
(24) В ПВД ПередВыгрузкой ВыборкаДляВыгрузкиДанных доступна, но ТипЗнч(ВыборкаДляВыгрузкиДанных): Не определено
32 GenV
 
31.07.13
12:42
Для типовой обработки УниверсальныйОбменДаннымиXML можно сделать так:

Если НЕ ЗначениеЗаполнено(Параметры.КоличествоЭлементов) Тогда
    Если Правило.ИспользоватьОтбор Тогда
        Параметры.КоличествоЭлементов = ПостроительОтчета.Результат.Выбрать().Количество();
        Сообщить("Всего элементов: " + Параметры.КоличествоЭлементов);
    Иначе
        Сообщить("Выгрузка без отбора");
    КонецЕсли;
КонецЕсли;
Если Параметры.КоличествоЭлементов > 30 Тогда
    Отказ = Истина;
КонецЕсли;
Сообщить(Объект);
33 Naumov
 
31.07.13
12:50
(32) Этот отказ не отменит выгруженное до этого, а автор хочет именно всю выгрузку отменить.
34 GenV
 
31.07.13
12:52
(0) При выгрузке первого элемента определяется их общее количество. Если их общее количество больше 30, то не выгрузится не первый, не любой другой элемент выборки ...
35 GenV
 
31.07.13
12:52
(34)-(33)
36 Naumov
 
31.07.13
12:59
(34) У тебя есть способ встроить медиума в выгрузку?
37 GenV
 
31.07.13
13:02
(36) В смысле, я тебя не понял?
Автор выгружает только справочник номенклатура (11). Соотв. этот код не даст при установленном отборе выгрузить больше 30 позиций. Без отбора - пусть решает как поступать автор.
38 GenV
 
31.07.13
13:03
37+ если позиций при отборе будет больше 30 - не выгрузиться ничего. Если меньше - каждая
39 Naumov
 
31.07.13
13:05
(37) Это откуда у тебя такая гипотеза по поводу того, что выгружается только справочник номенклатуры?
40 GenV
 
31.07.13
13:06
(39) Хм. Я в уже написал - (11)
41 Naumov
 
31.07.13
13:11
(40) НУ пропустил я этот пост.

Если код из (32) рабочий, то может сработать
42 GenV
 
31.07.13
13:12
(41) Понятно. Код протестил сначала )
43 Aprobator
 
31.07.13
14:02
(0) в кд делается это на раз. Вон только что прописал выгрузку по 10000 элементов.
44 5jam
 
01.08.13
10:33
(32) Спасибо, магистр GenV

ПередВыгрузкой ПВД Номенклатура прописал следующий код и все удалось. Когда отбор отключен или количество номенклатуры превышает 30, выдается предупреждение, а в файл обмена не записывается ничего, кроме правил.

КоличЭлементов = 0;

Если Параметры.КоличествоЭлементов = 0 Тогда
                             
   // Условие ОБЯЗАТЕЛЬНО!!!
   Если Правило.ИспользоватьОтбор Тогда
       
       ВыборкаИзРезультата = ПостроительОтчета.Результат.Выбрать();
       
       Пока ВыборкаИзРезультата.Следующий() Цикл
           
           Если ТипЗнч(ВыборкаИзРезультата[0]) = Тип("СправочникСсылка.Номенклатура") Тогда
               Если Не ВыборкаИзРезультата[0].ЭтоГруппа Тогда
                   КоличЭлементов = КоличЭлементов + 1;
               КонецЕсли;                
           КонецЕсли;
                       
       КонецЦикла;
       
       Параметры.КоличествоЭлементов = КоличЭлементов;
       Сообщить("Элементов для выгрузки:" + КоличЭлементов);
       
   Иначе
       
       Отказ = Истина;
       // Миллион Номенклатур означает, что не установлен отбор. Так выгружать нельзя
       Параметры.КоличествоЭлементов = 1000000;
       Предупреждение("Внимание!!! Не установлен отбор на ""Номеналутуру"". Выгрузка отменена");
       
   КонецЕсли;
       
КонецЕсли;

МаксимальноеКоличНомДляВыгрузки = 30;

Если Параметры.КоличествоЭлементов > МаксимальноеКоличНомДляВыгрузки Тогда
   
   Отказ = Истина;
   Если КоличЭлементов > 0 Тогда
       Предупреждение("Внимание!!! Вы пытаетесь выгрузить из БП в УАТ " + Строка(Параметры.КоличествоЭлементов) + " элементов справочника ""Номенклатура"" и это не считая групп.
       |Запрещено выгружать за один раз более " + Строка(МаксимальноеКоличНомДляВыгрузки) + " позиций. Выгрузка отменена", );
   КонецЕсли;
   
КонецЕсли;