Имя: Пароль:
1C
1C 7.7
v7: ПолучитьЭлемент в произвольном алгоритме ПВД из 1С v7
0 PiotrLoginov
 
31.10.12
11:48
Здравствуйте всем. Набросал алгоритм для выборки данных из справочника. Запихнул в ПВД, сформировал внешнюю обработку, запустил. Ошибок не выскочило, но и данные никакие не выгрузились. Надо бы отладчиком проверить, какие данные в какой момент куда помещаются.. мб и нашлась бы причина, но я не знаком с механизмом отладки внешних обработок в семерке.

Мб уже взглянув на код, гуру скажут, в чем причина? Аналогичный код в другом ПВД работал без проблем. Сообщения понатыканы в начале чтобы понять,в какой момент прекращается выполнение. В итоге "получен элемент" не сообщается:

Начало выгрузки:   31.10.12 11:45:56
Запущено ПВД
Создана ТЗ
Создан объект справочника
Выбраны элементы
Выгружено объектов:   0
Окончание выгрузки:   31.10.12 11:45:56

Сообщить("Запущено ПВД");
ВыборкаДанных = СоздатьОбъект("ТаблицаЗначений");
ВыборкаДанных.НоваяКолонка("Номер");
ВыборкаДанных.НоваяКолонка("ПометкаУдаления");
ВыборкаДанных.НоваяКолонка("Дата");
ВыборкаДанных.НоваяКолонка("Наименование");
ВыборкаДанных.НоваяКолонка("Статус");
ВыборкаДанных.НоваяКолонка("ДатаНачалаДействия");
ВыборкаДанных.НоваяКолонка("ДатаОкончанияДействия");
ВыборкаДанных.НоваяКолонка("НаименованиеДляПечати");
ВыборкаДанных.НоваяКолонка("Партнер");
ВыборкаДанных.НоваяКолонка("Контрагент");
ВыборкаДанных.НоваяКолонка("ОграничиватьСуммуЗадолженности");
ВыборкаДанных.НоваяКолонка("ДопустимаяСуммаЗадолженности");
Сообщить("Создана ТЗ");

Договоры = СоздатьОбъект("Справочник.Договора");
Сообщить("Создан объект справочника");
Договоры.ВыбратьЭлементы();
Сообщить("Выбраны элементы");
Пока Договоры.ПолучитьЭлемент() > 0 Цикл
   Сообщить("получен элемент");
   Если (НЕ (Договоры.ТекущийЭлемент().Владелец.Родитель.Наименование = "Поставщики")) Тогда
       ПроверкаТиповой=Лев(Договоры.ТекущийЭлемент().Наименование,12);
       Если (НЕ (ПроверкаТиповой = "Без договора")) Тогда
           ИсторияЛимитов = СоздатьОбъект("Периодический");
           ИсторияЛимитов.ИспользоватьОбъект("СуммаКредита",Договоры.ТекущийЭлемент().Владелец);
           ДатаНетипового = Договоры.ТекущийЭлемент().датадоговора;
...
...
1 1Сергей
 
31.10.12
11:50
Полиэтилен высокого давления?
2 viktor_vv
 
31.10.12
11:51
Договоры.ВыбратьЭлементы(0);
3 viktor_vv
 
31.10.12
11:51
Я так понимаю Договоры это подчиненный справочник, надо выбирать без учета иерархии.
4 Скользящий
 
31.10.12
11:56
>>но я не знаком с механизмом отладки внешних обработок в семерке.

Открываешь отладчик, ставишь замер производительности. запускаешь выгрузку. Отжимаешь кнопочку замера производительности. Получишь окно замера производительности, по щелчку в которой отроется отработавщий код в отладчике. Ну и потом можно стоп поставить где надо по F9
5 Скользящий
 
31.10.12
11:57
Я так делаю, потому что у меня весь код выгрузки загрузки во внешний файл вынесен, чтобы из 8ки сделать в текстовик выгрузку и семерка ее сразу подцепила.
6 viktor_vv
 
31.10.12
12:00
(5) Можно проще. Ставишь курсор в коде в нужном месте, нажимаешь кнопочку внизу на панеле Открыть модуль в отладчике.

Для текстовиков в модуле ставишь курсор перед #ЗагрузитьИзФайла и жмешь ту же кнопочку.
7 PiotrLoginov
 
31.10.12
12:02
(3) да, подчиненный. а как выбрать "без учета иерархии"?
8 1Сергей
 
31.10.12
12:02
(7) см (2)
9 viktor_vv
 
31.10.12
12:03
Уже и иконку к нику купил соотвествующую, все равно не помогает :).
10 Скользящий
 
31.10.12
12:07
(6) Про фичу установки курсора перед Загрузить из файла не знал, хотя мне с замером все равно проще, я сразу вижу отработавший код.
11 PiotrLoginov
 
31.10.12
12:11
попытался следовать (4) .  С ходу не въехал. Сейчас еще покумекаю.

Скопировал из (2). Дело пошло :) . Спасибо за подсказку. Теперь пишет "Ошибка исполнения обработчика:  ПВД_ПередОбработкойПравила_ДоговорыКонтрагентов
 - Поле агрегатного объекта не обнаружено (ПометкаУдаления)"

Что, в подчиненных справочниках не бывает пометки удаления?
12 Voronve
 
31.10.12
12:12
.ПометкаУдаления()
13 1Сергей
 
31.10.12
12:12
(11) бывает, но это функция
14 PiotrLoginov
 
31.10.12
12:13
(12) Аа-а, блин, совсем я плох. Спасибо.
15 Ёпрст
 
31.10.12
12:14
(11) ПометкаУдаления - это функция ПометкаУдаления(), а не свойство объекта.
16 PiotrLoginov
 
31.10.12
12:17
Так. поставил курсор в модуле внешней обработки. Нажал "Открыть модуль в отладчике". Выскочил отладчик с деревом модулей, в том числе "Внешние отчеты(обработки) и текст модуля внешки. Далее выбрать в меню "отладка - замер производительности" ?
17 PiotrLoginov
 
31.10.12
12:17
(15) да, да , я понял.
18 viktor_vv
 
31.10.12
12:18
Далее ставишь точку останова где тебе надо и выполняешь обработку.
19 PiotrLoginov
 
31.10.12
12:20
(18)  да, получилось.  гениально.
20 PiotrLoginov
 
31.10.12
12:24
Если можно еще такой вопрос. То, что выборка происходит "без учета иерархии", накладывает какие-то ограничения? Например, там я обращаюсь к владельцу текущего элемента:

ИсторияЛимитов.ИспользоватьОбъект("СуммаКредита",Договоры.ТекущийЭлемент().Владелец);

или даже

Договоры.ТекущийЭлемент().Владелец.СуммаКредита.Получить("2011-11-01T00:00:00");

Нормально?
21 PiotrLoginov
 
31.10.12
12:25
Т.е. у владельца текущего элемента есть периодический реквизит, и я пытаюсь получить его значение на определенную дату. Такое возможно?
22 viktor_vv
 
31.10.12
12:27
Нормально. Многова-то обращений через точку правда.

ТекущийКонтрагент = Договоры.Владелец ;

ИсторияЛимитов.ИспользоватьОбъект("СуммаКредита",ТекущийКонтрагент);

// Вот здесь с датой че-то фигня
ТекущийКонтрагент.СуммаКредита.Получить('01.11.2011');
23 1Сергей
 
31.10.12
12:29
Откройте уже секрет. Что такое ПВД?
24 PiotrLoginov
 
31.10.12
12:30
ок, огромное спасибо.  Попробую. Еще раз спасибо. Долго бы я без помощи кумекал.

(23) ну правило выгрузки данных в КД ...
25 Simod
 
31.10.12
12:31
(20) В 7.7 дата не содержит времени.
26 PiotrLoginov
 
31.10.12
12:32
(25) не знал )
27 PiotrLoginov
 
01.11.12
13:43
Сегодня вернулся к этой теме. Код работает. По выполнению кода в ПВД формируется ВыборкаДанных (ТаблицаЗначений), каждая строка которой должна по идее передаваться в ПКО для конвертации и записи в файл. Так вот, судя по логу таблица значений формируется, но в файл записывается только один элемент. По итогам процесса проверяю сформированный файл - и действительно там только одна запись.

Упростил код, стер лишние ПКО, удалил часть ПКС в текущем ПКО. Не помогло. Надеюсь, мож подскажет кто, куда копать.
28 PiotrLoginov
 
01.11.12
13:49
Повторюсь, перенос данных с формированием выгрузки по произвольному алгоритму реализую не первый раз. Но то лди реквизитов в этот раз болшьше, то ли что... не выходит каменный цветок.

Вписал в конец кода ПВД строку "ВыборкаДанных.ВыбратьСтроку();" Сформировал внешнюю обработку, запустил выполнение - в конце на экран выскочила таблица значений. В ней больше десятка строк. Выбрал первую попавшуюся (кажется пятую), нажал ОК. Процесс завершился с формированием файла, в котором опять лишь один элемент - из первой строки таблицы значений.
29 Ёпрст
 
01.11.12
13:50
Жуколов - наше всё.
30 PiotrLoginov
 
01.11.12
14:06
Потыкался еще немного. Выяснил и без жуколова, что сначала выполняется код в ПВД, затем показывается на экране сформированная таблица значений, затем по нажатии "ОК" на экран выводится строка:
Выгрузка объекта выборки:  ТаблицаЗначений  (ТаблицаЗначений)
Конвертация объекта или получение ссылки:  ТаблицаЗначений  (ТаблицаЗначений)
- в количестве, соответствующем количеству строк сформированной таблицы - видимо выгрузка - передача в ПКО, а конвертация - конвертация данных в текущей строке и запись результата в файл.

У меня в логе несколько таких строк. Почему же запись в файле лишь одна? Жуколов пригодился бы, если б проблема была в коде, который я написал в ПВД, а в данном случае надо копаться в остальном коде внешки, сформированной автоматически... мне это не по зубам, да и не нужно, проще знать правила настройки ПКО наверное...
31 PiotrLoginov
 
01.11.12
14:48
удалил те ПКС, что были отключены. Заработало - перенеслось 15 объектов... Охо-хо, не первый раз замечаю: в КД отключить объект не значит изъять его из процесса. Ну будем искать потихоньку, какое ПКС виновато... :)