Имя: Пароль:
1C
1С v8
Выборочная миграция РИБ
0 mirror1982
 
09.04.14
23:45
ГлавныйУзел=ПланыОбмена.ГлавныйУзел();
    Если ГлавныйУзел=Неопределено Тогда    //это центральная база
         ПланОбмена=ПланыОбмена.Полный.Выбрать();
         Пока ПланОбмена.Следующий() Цикл
              Если ПланОбмена.Ссылка=ПланыОбмена.Полный.ЭтотУзел() тогда
                   Продолжить;
              КонецЕсли;    
              Если ПланОбмена.ОрганизацииУзла.Найти(Объект.Организация,"Организация")<>Неопределено Тогда
                   Объект.ОбменДанными.Получатели.Добавить(ПланОбмена.Ссылка);
              КонецЕсли;
         КонецЦикла;
         Иначе
              Объект.ОбменДанными.Получатели.Добавить(ГлавныйУзел);
    КонецЕсли;

Этот код дает ошибку, не пойму в чем дело?

Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{МодульОбычногоПриложения(1224)}: Ошибка при вызове метода контекста (Добавить)

по причине:
Несоответствие типов (параметр номер '1')
1 Tarlich
 
09.04.14
23:52
2 mirror1982
 
10.04.14
00:01
второй способ я пробовал, но работает он очень медленно, у меня 11 магазинов. слишком долго записывается файл (проходит фильтрация данных по организациям в момент записи файла изменения)
3 hhhh
 
10.04.14
00:16
(2) ну, с типовой возьми обмен по организациям. А эту поделку выкинь.
4 mirror1982
 
10.04.14
00:20
(3) с типовой какой? у меня УТ переделанная
5 mirror1982
 
10.04.14
01:50
(3) посмотрел в типовой, но там приотправке подчиненному, это медленно будет. хочется все же разобраться почему дает ошибку?
6 alkov
 
10.04.14
07:16
Объект не включён в состав плана обмена Полный
7 Рэйв
 
10.04.14
07:27
(0)Что не понятно в словах "Несоответствие типов "?
8 Рэйв
 
10.04.14
07:27
посмотри тип ГлавныйУзел и сравни в СП что ждет параметром
.Добавить()
9 mirror1982
 
10.04.14
13:30
(8) при чем здесь главныйУзел?
10 mirror1982
 
10.04.14
13:31
(8) он ошибку дает в цикле
11 mirror1982
 
10.04.14
14:05
помогите с кодом!
12 Рэйв
 
10.04.14
14:14
(9)При том, что ты ГлавныйУзел передаешь параметром в .Добавить()

И его тип не нравится системе. С логикой дружить надо.
13 Рэйв
 
10.04.14
14:14
или смотри  на ПланОбмена.Ссылка в том же ракурсе
14 mirror1982
 
10.04.14
14:16
(13) как код должен выглядить?
15 Рэйв
 
10.04.14
14:18
(14)Причем тут код? Ты неправильно передаешь параметр в метод.
Посмотри какой тип нужен в .Добавить() и передавай такой как требуется
16 mirror1982
 
10.04.14
14:20
НаборУзлов (NodeSet)
Добавить (Add)
Синтаксис:

Добавить(<Узел>)
Параметры:

<Узел> (обязательный)

Тип: ПланОбменаСсылка.
Ссылка на узел плана обмена, который надо добавить к набору узлов.
Описание:

Добавляет узел к набору узлов. Если узел уже входит в набор, то он не будет добавлен.

Доступность:

Сервер, толстый клиент, внешнее соединение.
Пример:

Узел = ПланыОбмена.ПО1.НайтиПоКоду("Маг11");
Об.ОбменДанными.Получатели.Добавить(Узел);




Тип: ПланОбменаСсылка.

ПланОбмена=ПланыОбмена.Полный.Выбрать();
         Пока ПланОбмена.Следующий() Цикл
              Если ПланОбмена.Ссылка=ПланыОбмена.Полный.ЭтотУзел() тогда
                   Продолжить;
              КонецЕсли;    
              Если ПланОбмена.ОрганизацииУзла.Найти(Объект.Организация,"Организация")<>Неопределено Тогда
                   Объект.ОбменДанными.Получатели.Добавить(ПланОбмена.Ссылка);
              КонецЕсли;
17 mirror1982
 
10.04.14
14:20
не понимаю, передаю сслыку
18 Рэйв
 
10.04.14
14:21
(16)Глянь в табло
ТипЗнч(ГлавныйУзел) и заодно ГлавныйУзел.Пустая()
19 mirror1982
 
10.04.14
14:22
ну причем тут ГлавныйУзел (тут я понял), я тебе говорю про Объект.ОбменДанными.Получатели.Добавить(ПланОбмена.Ссылка);
20 Рэйв
 
10.04.14
14:23
(19)А с чего ты решил что именно на это .Добавить() ругается?
Оно же строку не указывает.
21 Рэйв
 
10.04.14
14:24
аа..вообщето указывает:-)
22 Рэйв
 
10.04.14
14:24
тогда проверь
Объект.ОбменДанными.Получатели  - это точно НаборУзлов?
23 Фрэнки
 
10.04.14
14:52
Стоп, но ведь этот весь код в каком контексте?

Объект.ОбменДанными.Получатели - это контекст только для чтения.

Я, например, делаю выборочную РЕГИСТРАЦИЮ изменений по узлам, а не корректировку Получателей в объектах.

Вот что написано в СП на объект справочник:

СправочникОбъект.<Имя справочника> (CatalogObject.<Имя справочника>)
ОбменДанными (DataExchange)
Использование:

Только чтение.
Описание:

Тип: ПараметрыОбменаДанными.
Используется для управления обменом данных.
С помощью данного свойства настраивается состав узлов-получателей, для которых будут регистрироваться изменения данных, узел-отправитель, из которого получена записываемая информация, а также устанавливается режим Загрузка, указывающий, что выполняется перенос информации.

Доступность:

Сервер, толстый клиент, внешнее соединение.
24 mirror1982
 
10.04.14
15:10
(23) образец можешь дать, у тебя какая задача была?
25 Фрэнки
 
10.04.14
15:26
Процедура РегистрацияПоПодразделениюДокументаПриЗаписи(ПараметрДокумент, Отказ) Экспорт
    Если ПараметрДокумент.ОбменДанными.Загрузка = Истина Тогда
        Возврат;
    КонецЕсли;
    
    // Составной тип элемента СправочникОбъект (параметр процедуры-обработчика события):
    
    // Все объекты содержат реквизит ОсновноеПодразделение и обработка построена только на его значениях
    
    ПодразделениеДокумента = ПараметрДокумент.ОсновноеПодразделение;
    Если НЕ ЗначениеЗаполнено(ПодразделениеДокумента) Тогда
        Возврат;
    КонецЕсли;
    
    МассивУзловДляОбмена = ПолучитьМассивУзловДляОбмена(ПодразделениеДокумента);
    Если МассивУзловДляОбмена.Количество()>0 Тогда
        ПланыОбмена.ЗарегистрироватьИзменения(МассивУзловДляОбмена, ПараметрДокумент);
        Для Каждого НаборЗаписей Из ПараметрДокумент.Движения Цикл
            ПланыОбмена.ЗарегистрироватьИзменения(МассивУзловДляОбмена, НаборЗаписей);
        КонецЦикла;
    КонецЕсли;
    
КонецПроцедуры

Функция ПолучитьМассивУзловДляОбмена(ПодразделениеОбъекта)
    Запрос = Новый Запрос;
    Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
|    ДЭ_БюджетЦФОПодразделения.Ссылка КАК Узел
|ИЗ
|    ПланОбмена.ДЭ.Подразделения КАК ДЭ
|ГДЕ
|    ДЭ.Подразделение = &ПодразделениеОбъекта
|    И ДЭ.Ссылка <> &ТекущийУзел";

    Запрос.УстановитьПараметр("ПодразделениеОбъекта", ПодразделениеОбъекта);
    Запрос.УстановитьПараметр("ТекущийУзел", ПланыОбмена.ДЭ.ЭтотУзел());
    
    Возврат Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Узел");
КонецФункции
26 Фрэнки
 
10.04.14
15:28
текст запроса с ошибкой в слове ДЭ_БюджетЦФОПодразделения
Еси смотреть по всему тексту запроса, то должно быть только ДЭ
27 mirror1982
 
10.04.14
15:41
(26) в твоем коде ты убираешь авторегистрацию в обмене у этих документов? и убираешь ли авторегистрацию у регистров, по которым идут движения при проведении этих документов?
28 Фрэнки
 
10.04.14
15:48
(27) да.
все, что хочется регистрировать выборочно, приходится в плане обмена ставить с запретом на авторегистрацию.
29 mirror1982
 
10.04.14
15:51
т.е. регистры тоже да?
30 mirror1982
 
10.04.14
15:52
а как дела обстоят с созданием начального образа нового узла РИБ? этот код прокатывает?
31 Фрэнки
 
10.04.14
16:00
Да, регистры тоже с запретом авторегистрации.

Я вот не точно помню насчет нового узла.
Обычно, при создании узла все объекты в базе должны иметь отметку о регистрации в таблицу изменений. Смысл создавать эти отметки? Поэтому в создании начального образа опросы таблиц регистрации изменений по выбранному узлу просто отсутствуют. Ну мне так помнится. Если доверия этому нет, то можно просто после записи образа посмотреть, при необоходимости отметить ВСЕ по выбранному узлу ПланыОбмена.ЗарегистрироватьИзменения(ВыбУзел);
затем выполнить обмен.
32 SUA
 
10.04.14
16:05
(0)возможен вызов регистрации для объекта не входящего в план обмена
33 mirror1982
 
10.04.14
16:12
(31) я переделал твой код, вот что у меня получилось:

Процедура ПриЗаписи(Отказ)// (записываем документ Отчет о розничных продажах)
    
    Если (ЭтотОбъект.ОбменДанными.Получатели.АвтоЗаполнение)И(НЕ ЭтотОбъект.ОбменДанными.Загрузка) Тогда
          глРегистрацияИзменений(ЭтотОбъект);
    КонецЕсли;
    
КонецПроцедуры

Процедура глРегистрацияИзменений(ПараметрДокумент) Экспорт
    
    ПланОбмена=ПланыОбмена.Полный.Выбрать();
    Пока ПланОбмена.Следующий() Цикл
         Если ПланОбмена.Ссылка=ПланыОбмена.Полный.ЭтотУзел() тогда
              Продолжить;
         КонецЕсли;    
         Если ПланОбмена.ОрганизацииУзла.Найти(ПараметрДокумент.Организация,"Организация")<>Неопределено Тогда
              ПланыОбмена.ЗарегистрироватьИзменения(ПланОбмена.Ссылка,ПараметрДокумент.Ссылка);
              Для Каждого НаборЗаписей Из ПараметрДокумент.Движения Цикл
                  ПланыОбмена.ЗарегистрироватьИзменения(ПланОбмена.Ссылка,НаборЗаписей);
              КонецЦикла;
         КонецЕсли;
    КонецЦикла;
    
КонецПроцедуры


Выдает ошибку:

Ошибка при выполнении обработчика - 'ПриЗаписи'
по причине:
{МодульОбычногоПриложения(1222)}: Ошибка при вызове метода контекста (ЗарегистрироватьИзменения)

по причине:
Недопустимое значение параметра (параметр номер '2')
34 mirror1982
 
10.04.14
16:23
все разобрался
35 mirror1982
 
10.04.14
17:04
(31) достаточно ли регистрировать изменения в процедуре модуля документа ПриЗаписи() ? в модуле объекта регистра надо?
36 hhhh
 
10.04.14
22:57
(35) вообще-то в подписках регистрируют
37 mirror1982
 
11.04.14
02:13
(36) какие подписки? где?
38 Фрэнки
 
11.04.14
09:49
(37) Процедура РегистрацияПоПодразделениюДокументаПриЗаписи(ПараметрДокумент, Отказ) Экспорт

это процедура у меня прицеплена к подписке на событие. Создаешь новую подписку, там указываешь событие и документы, какие нужны, в нее же цепляешь сслку на процедуру... Смысл использования подписки в этом случае в том, что дает возможность один раз определить сразу несколько видов документов, а не вписывать код процедуры в модулях объектов каждого вида.
39 mirror1982
 
11.04.14
18:49
(38) спасибо!