Имя: Пароль:
1C
1С v8
Порядок выгрузки объектов в файл по плану обмена
0 Dwarrior
 
24.01.13
09:03
Здравствуйте уважаемые!

Вопрос наверное теоретический, поэтому начнем с конца - как можно управлять порядком выгрузки объектов в файл обмена (Message_000_001) по плану обмена? Функция ПланыОбмена.ЗаписатьИзменения() не предполагает нужных параметров.
Зачем это нужно? Потому что в приемнике, при загрузке данных, стоит триггер, который отбирает загружаемые данные. Например, загружаемый документ "Накладная" анализируется по полю "Получатель". А сам получатель идет в этом же файле обмена, но позже накладной. При загрузке документа он ессно еще не виден.
Мне видится единственное пока решение - упорядочить объекты внутри файла обмена.
Каково ваше мнение?
1 zender
 
24.01.13
09:10
как вариант самому формировать файл обмена, см.
ВыбратьИзменения(<Узел>, <НомерСообщения>, <ФильтрВыборки>)
2 Галахад
 
гуру
24.01.13
09:10
А что делает триггер?
3 Jolly Roger
 
24.01.13
09:22
(0) наше мнение таково: триггеры при загрузке - не самая лучшая идея...
4 Sammo
 
24.01.13
09:24
Типовые выгрузки не поддерживают
Варианта 2
1. На стороне выгрузки делать свою нетиповую настраиваемую выгрузку - выгружать через запрос + настройка метаданных для выгрузки.
2. На стороне загрузки предполагать, что данные могут приходит в неправильном порядке. В данном случае, например, либо грузить дважды, либо объекты с недостающей информацией агрегировать и обрабатывать в конце загрузки
5 Dwarrior
 
24.01.13
09:39
(2) Триггер принимает решение, выгружать ли документ в другие базы на основании поля Получатель.
(3) Без триггеров не обойтись, т.к. там каскадная цепочка - документ попадает в получатель, а у того еще свои получатели есть, куда нужно выгружать этот же документ
(4) спасибо, мудрый совет. Если действовать по второму варианту - будет ли в конце первого прохода выгрузки видны результаты? Или это надо обработать транзакциями?
6 Aleksey
 
24.01.13
09:42
(0) "При загрузке документа он ессно еще не виден. "
Это не так. Загружается сразу и ссылка на получатель. В твоем случае получателя не будет только в одном случае. Если получатель - новый элемент. Но у тебя это не так, ибо количество получателей фиксированно и оно однозначно уже есть в базе
7 Dwarrior
 
24.01.13
09:46
(6) Поверьте, такие ситуации могут быть. Я упростил пример, для лучшего понимания. В реальности, анализ идет каскадно - У Накладной есть поле Контрагент, у которого есть поле Получатель. Как-то так. Да, сам получатель известен, но контрагент может быть новым элементом.
8 Aleksey
 
24.01.13
09:47
(7) Перенести контрагент в реквизит документа и заполнять автоматом при выборе контрагента
9 Jolly Roger
 
24.01.13
09:48
(5) сложная схема обмена - потенциальный гемор. но, в любом случае, информации в (1) уже достаточно...
10 Sammo
 
24.01.13
09:48
(5) Тут еще такой момент. Если рулить на стороне загрузке, то удобнее, чтобы был не 1 файл на все, а отдельный файл на каждый объект. Тогда сначала прогружаешь только то, что без ошибок, а вторым проходом идешь по незагруженному. Но тоже не без недостатков.
Если идет 1 блоком, то все грузить в 1 большой транзакции не стоит (транзакция на запись пары сотен документов будет забавна). Значит вполне реально сохранить документ (например) с битой ссылкой, закинуть в массив для пост обработки. А в конце загрузки обработать массив - там уже получатель должен быть заполнен.
Как вариант еще пытаться обработать документ при загрузке и если проблемы (нет получателя, например), то только в этом случае писать в массив.
Еще может быть вариант, что система отправитель сама будет отдавать кому надо в зависимости от получателя при выгрузке.
11 Sammo
 
24.01.13
09:49
(7) Если нетиповая выгрузка - выгружать получателя как виртуальный реквизит или как 8
12 Aleksey
 
24.01.13
09:49
(10) Т.е. при загрузки писать в РС "Загруженные обеъекты"
А при выгрузки анализировать этот РС и выгружать при необходимости
13 Dwarrior
 
24.01.13
09:51
(1)(9) - Пробовал так, но в этом случае не срабатывает триггер  ПриОтправкеДанныхПодчиненному() на стороне отправителя. А это тоже нужно:) Если заставить срабатывать это событие при такой "ручной" выгрузке - было бы замечательным решением!
14 Dwarrior
 
24.01.13
09:57
Самым приемлимым, на мой взгляд, управлением на стороне загрузки - это собирать непонятные объекты в конце выгрузки и анализировать еще раз.
А вот вариант с управлением на стороне выгрузки - я писал уже, что пробовал. Через ВЫбратьИзменения(), потом ЗаписатьXML(). Но при этом не срабатывает событие ПриОтправкеДанныхПодчиненному(). Может я что-то не так делаю?
15 hhhh
 
24.01.13
10:14
(14) может ничего не предпринимать? Просто запустить два обмена подряд. В первом обмене получатель подхватится, накладная не пройдет, поэтому она автоматом на следующий обмен зарегистрируется. НУ и во второй раз спокойно загрузится.
16 hhhh
 
24.01.13
10:15
(15)+ при этом новые получатели у вас наверняка не каждый день появляются, а так, изредка.
17 Dwarrior
 
24.01.13
10:38
(15) Тоже вариант, не столь красивый, но все же
(16) Да верно, но какое это отношение имеет к алгоритму? Алгоритм должен обрабатывать все возможные варианты

С управлением выгрузкой никто ничего не подскажет? ВыбратьИзменения() позволяет выбирать изменения конфигурации? Наверное нет? План обмена у меня распределенный, или как правильно выразиться.
Программист всегда исправляет последнюю ошибку.