Имя: Пароль:
1C
1С v8
КД2 произвольный алгоритм объектов из плана обмена
0 Csar
 
28.10.14
21:00
Всем привет!
Я написал правила для обмена, в котором в ПВД для Расходной накладной указываю произвольный алгоритм выборки. На всякий случай привожу код ниже:
ВходящиеДанные = Новый ТаблицаЗначений;
ВходящиеДанные.Колонки.Добавить("Товары");
ВходящиеДанные.Колонки.Добавить("Услуги");

ТЗТовары = Новый ТаблицаЗначений;
ТЗТовары.Колонки.Добавить("ЕдиницаИзмерения");
ТЗТовары.Колонки.Добавить("Номенклатура");
ТЗТовары.Колонки.Добавить("Сумма");
ТЗТовары.Колонки.Добавить("Количество");
ТЗТовары.Колонки.Добавить("СуммаНДС");
ТЗТовары.Колонки.Добавить("Цена");

ТЗУслуги = Новый ТаблицаЗначений;
ТЗУслуги.Колонки.Добавить("Номенклатура");
ТЗУслуги.Колонки.Добавить("Содержание");
ТЗУслуги.Колонки.Добавить("Сумма");
ТЗУслуги.Колонки.Добавить("Количество");
ТЗУслуги.Колонки.Добавить("СуммаНДС");
ТЗУслуги.Колонки.Добавить("Цена");

Дата1 = '20150101';
Дата2 = '20150303';
СтруктурныеЕдиницы = Новый Массив;
СтруктурныеЕдиницы.Добавить(Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000005")); //Склад Б ПЦ1
СтруктурныеЕдиницы.Добавить(Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000003")); //Склад Б ПЦ2

Узел = ПланыОбмена.ОбменСБух.НайтиПоНаименованию("центр");
Выборка = ПланыОбмена.ВыбратьИзменения(Узел, Узел.НомерОтправленного);

Пока Выборка.Следующий() Цикл
    Док = Выборка.Получить();
    Если Док.СтруктурнаяЕдиница <> Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000005") //Склад Б ПЦ1
        И Док.СтруктурнаяЕдиница <> Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000003") //Склад Б ПЦ2
        И Док.СтруктурнаяЕдиница <> Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000008") Тогда //Склад Б ПЦ3
        
        ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Док);
        Продолжить;
        
    КонецЕсли;
    
    ТЧЗапасы = Док.Запасы;
    Для каждого стрТЧ Из ТЧЗапасы Цикл
        Если стрТЧ.Номенклатура.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Услуга
            И стрТЧ.Номенклатура.ТипНоменклатуры <> Перечисления.ТипыНоменклатуры.Работа Тогда
            СтрТЗТовары = ТЗТовары.Добавить();
            СтрТЗТовары.ЕдиницаИзмерения = стрТЧ.ЕдиницаИзмерения;
            СтрТЗТовары.Номенклатура     = стрТЧ.Номенклатура;
            СтрТЗТовары.Сумма             = стрТЧ.Сумма;
            СтрТЗТовары.Количество         = стрТЧ.Количество;
            СтрТЗТовары.СуммаНДС         = стрТЧ.СуммаНДС;
            СтрТЗТовары.Цена             = стрТЧ.Цена;
        Иначе
            СтрТЗУслуги = ТЗУслуги.Добавить();
            СтрТЗУслуги.Номенклатура     = стрТЧ.Номенклатура;
            СтрТЗУслуги.Сумма             = стрТЧ.Сумма;
            СтрТЗУслуги.Количество         = стрТЧ.Количество;
            СтрТЗУслуги.СуммаНДС         = стрТЧ.СуммаНДС;
            СтрТЗУслуги.Цена             = стрТЧ.Цена;
        КонецЕсли;
    КонецЦикла;
    
    СтрВхДанные = ВходящиеДанные.Добавить();
    Если ТЗТовары.Количество() > 0  Тогда
        СтрВхДанные.Товары = ТЗТовары;
    КонецЕсли;
    Если ТЗУслуги.Количество() > 0  Тогда
        СтрВхДанные.Услуги = ТЗУслуги;
    КонецЕсли;
    
    ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Док);
    
    ВыгрузитьПоПравилу(Док.Ссылка,, ВходящиеДанные, , "РеализацияТоваровУслуг");
    ВходящиеДанные.Очистить();
КонецЦикла;


Я сначала писал не для плана обмена, а просто за период брал документы и все получалось (там массив складов определял для отбора в запросе выборки). Но теперь понял, что надо обрабатывать именно план обмена, т.е. все, что попало в план обмена, а не за период. И то, не совсем все, а с определенным условием, но это уже не так важно. Так вот с планом обмена не хочет работать. Подскажите, пожалуйста, какой принцип написания произвольного алгоритма для случая, когда данные надо брать из плана обмена и их обрабатывать, что бы послать в ПКО (в ПКО  у меня нет Источника - туда я посылаю данные как ВходящиеДанные).
1 Csar
 
28.10.14
22:22
Стоит добавить, что использую конф УНФ 1.4.9.41 и платформу 8.3.5.1231, вылезает ошибка:
{Документ.РасходнаяНакладная.МодульОбъекта(1376,2)}: Переменная не определена (УправлениеНебольшойФирмойЭлектронныеДокументыСервер)
    <<?>>УправлениеНебольшойФирмойЭлектронныеДокументыСервер.ОчиститьДатуНомерВходящегоДокумента(ЭтотОбъект);

Вот куда ссылается:
////////////////////////////////////////////////////////////////////////////////
// ОБРАБОТЧИКИ СОБЫТИЙ

// Процедура - обработчик события ПриКопировании объекта.
//
Процедура ПриКопировании(ОбъектКопирования)
    
    УправлениеНебольшойФирмойЭлектронныеДокументыСервер.ОчиститьДатуНомерВходящегоДокумента(ЭтотОбъект);
    Предоплата.Очистить();
    
КонецПроцедуры // ПриКопировании()

В упор не понимаю как там оказывается универсальная обработка выгрузки. Отладчик не останавливается там, что бы посмотреть.
2 Csar
 
28.10.14
22:52
Загнал произвольный алгоритм ПВД во внешнюю обработку и выяснил, что вылетает на методе Получить() из ВыборкиДанных:
Пока Выборка.Следующий() Цикл
    Док = Выборка.Получить();
    ...

У меня в плане обмена номенклатура и расходные накладные. Обработка корректно проходоит номенклатурные позиции, а как доходит до первой расходной накладной, то выдается ошибка. Причем отладчик по-прежнему не может зафиксировать ошибку.
3 GreyK
 
28.10.14
22:57
(2) Ты хоть отбор на тип в выборке по изменениям установи.
4 Csar
 
28.10.14
23:09
(3) Согласен, тип нужно установить, но это для правил КД. А тут это ничем не поможет.
5 Csar
 
28.10.14
23:14
(3) В ПВД объекта Расходная накладная пробегается ВыборкаПланаОбмена и на методе Получить() вываливается ошибка, адресованная в модуль Объекта РасходнаяНакладная. Откуда она там? И почему я не могу отладчиком ее зафиксировать - не пойму. Подскажите, пожалуйста.
6 GreyK
 
28.10.14
23:17
(4) У тебя у всех объектов зарегистрированных в изменениях есть реквизит "СтруктурнаяЕдиница", судя по "Если Док.СтруктурнаяЕдиница <>"?
7 Csar
 
28.10.14
23:19
(6) У меня до этого не доходит - только первая строка, еще до проверки на нужный тип. Там еще не важно есть ли этот реквизит
8 Csar
 
28.10.14
23:19
(6) Вылетает на:
Док = Выборка.Получить();
9 Csar
 
28.10.14
23:42
Любопытно, код, что указал в (0) вываливается с ошибкой, а такой же ниже отрабатывает корректно:
    Узел = ПланыОбмена.ОбменСБух.НайтиПоНаименованию("центр");
    
    Выборка = ПланыОбмена.ВыбратьИзменения(Узел, Узел.НомерОтправленного);
    
    ТЗс = Новый ТаблицаЗначений;
    ТЗс.Колонки.Добавить("Данные");
    ТЗс.Колонки.Добавить("НомерСтроки");
    
    Отчет.ТЗ.Очистить();
    
    ъ = 1;
    Пока Выборка.Следующий() Цикл
        Док = Выборка.Получить();
        СтрокаТЗ = Отчет.ТЗ.Добавить();
        СтрокаТЗ.Данные = Док.Ссылка;
        Если Имя = "УИБ7" Тогда
            СтрокаТЗ.Код = Док.Код;
        КонецЕсли;
        ъ = ъ + 1;
    КонецЦикла;
10 Csar
 
28.10.14
23:58
UPD. Причину похоже нашел. Дело в том, что в моем случае Док = Выборка.Получить(); не хочет корректно выполняться в толстом клиенте. Хотя в СП написано, что толстый клиент поддерживается.
11 GreyK
 
29.10.14
00:22
(10) Добавь в (9)
Если Док.СтруктурнаяЕдиница <> Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000005") //Склад Б ПЦ1

        И Док.СтруктурнаяЕдиница <> Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000003") //Склад Б ПЦ2

        И Док.СтруктурнаяЕдиница <> Справочники.СтруктурныеЕдиницы.НайтиПоКоду("000000008") Тогда //Склад Б ПЦ3

        
        ПланыОбмена.УдалитьРегистрациюИзменений(Узел, Док);
        Продолжить;
        
    КонецЕсли;
12 Csar
 
29.10.14
00:36
(11) У меня до этого не доходит код. Метод не может выполниться, и на следующую строчку не переходит.
13 GreyK
 
29.10.14
00:53
(12) Тогда я не понял (9)
14 hhhh
 
29.10.14
00:53
(12) ну вот это подозрительно

Узел = ПланыОбмена.ОбменСБух.НайтиПоНаименованию("центр");

наверно надо


Узел = ПланыОбмена.ОбменСБух.НайтиПоНаименованию("периферия");