Имя: Пароль:
1C
1С v8
КД и ВыборкаДанных
0 Медведик
 
02.07.14
16:49
Доброго дня, уважаемые.
В КД хочу сделать правило для БП 3, по которому все операции за период будут перенесены в БП же, но по операции на организацию.
Создаю ПКО, источник не указан, получатель – «ОперацияБух», галку «Не запоминать выгруженные объекты» - ставлю.
Создаю ПВД со способом выборки «Произвольный алгоритм», в «Перед обработкой» вставляю код (извините, под кат убирать не умею):
ВыборкаДанных = новый ТаблицаЗначений;
ВыборкаДанных.Колонки.Добавить("Дата");
ВыборкаДанных.Колонки.Добавить("Комментарий");
ВыборкаДанных.Колонки.Добавить("Организация");
ВыборкаДанных.Колонки.Добавить("Номер");
ВыборкаДанных.Колонки.Добавить("Хозрасчетный");

Запрос = новый Запрос;
Запрос.УстановитьПараметр("ДатаНач",Дата("20140109000000"));
Запрос.УстановитьПараметр("ДатаКон",Дата("20140109235959"));
Запрос.Текст =
"ВЫБРАТЬ
|    ХозрасчетныйДвиженияССубконто.Период,
|    ХозрасчетныйДвиженияССубконто.Регистратор,
|    ХозрасчетныйДвиженияССубконто.НомерСтроки,
|    ХозрасчетныйДвиженияССубконто.Активность,
|    ХозрасчетныйДвиженияССубконто.СчетДт,
|    ХозрасчетныйДвиженияССубконто.СубконтоДт1,
|    ХозрасчетныйДвиженияССубконто.ВидСубконтоДт1,
|    ХозрасчетныйДвиженияССубконто.СубконтоДт2,
|    ХозрасчетныйДвиженияССубконто.ВидСубконтоДт2,
|    ХозрасчетныйДвиженияССубконто.СубконтоДт3,
|    ХозрасчетныйДвиженияССубконто.ВидСубконтоДт3,
|    ХозрасчетныйДвиженияССубконто.СчетКт,
|    ХозрасчетныйДвиженияССубконто.СубконтоКт1,
|    ХозрасчетныйДвиженияССубконто.ВидСубконтоКт1,
|    ХозрасчетныйДвиженияССубконто.СубконтоКт2,
|    ХозрасчетныйДвиженияССубконто.ВидСубконтоКт2,
|    ХозрасчетныйДвиженияССубконто.СубконтоКт3,
|    ХозрасчетныйДвиженияССубконто.ВидСубконтоКт3,
|    ХозрасчетныйДвиженияССубконто.Организация КАК Организация,
|    ХозрасчетныйДвиженияССубконто.ВалютаДт,
|    ХозрасчетныйДвиженияССубконто.ВалютаКт,
|    ХозрасчетныйДвиженияССубконто.ПодразделениеДт,
|    ХозрасчетныйДвиженияССубконто.ПодразделениеКт,
|    ХозрасчетныйДвиженияССубконто.Сумма,
|    ХозрасчетныйДвиженияССубконто.ВалютнаяСуммаДт,
|    ХозрасчетныйДвиженияССубконто.ВалютнаяСуммаКт,
|    ХозрасчетныйДвиженияССубконто.КоличествоДт,
|    ХозрасчетныйДвиженияССубконто.КоличествоКт,
|    ХозрасчетныйДвиженияССубконто.СуммаНУДт,
|    ХозрасчетныйДвиженияССубконто.СуммаНУКт,
|    ХозрасчетныйДвиженияССубконто.СуммаПРДт,
|    ХозрасчетныйДвиженияССубконто.СуммаПРКт,
|    ХозрасчетныйДвиженияССубконто.СуммаВРДт,
|    ХозрасчетныйДвиженияССубконто.СуммаВРКт,
|    ХозрасчетныйДвиженияССубконто.Содержание,
|    ХозрасчетныйДвиженияССубконто.НеКорректироватьСтоимостьАвтоматически,
|    ХозрасчетныйДвиженияССубконто.МоментВремени
|ИЗ
|    РегистрБухгалтерии.Хозрасчетный.ДвиженияССубконто(&ДатаНач, &ДатаКон, Регистратор ССЫЛКА Документ.ВводНачальныхОстатков ИЛИ Регистратор ССЫЛКА Документ.ОперацияБух, , ) КАК ХозрасчетныйДвиженияССубконто
|ИТОГИ ПО
|    Организация";

Результат = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкам);
Результат.колонки.Добавить("СубконтоДт");
Результат.колонки.Добавить("СубконтоКт");

Для Каждого Организация ИЗ Результат.Строки Цикл
НоваяСтрока = ВыборкаДанных.Добавить();
    НоваяСтрока.Организация    = Организация.Организация;
    НоваяСтрока.Дата = Дата("20140109235959");

    Для Каждого СтрокаТЧ ИЗ Организация.Строки Цикл
        СубконтоДт = Новый Соответствие;
        Если  НЕ СтрокаТЧ.ВидСубконтоДт1=null И ЗначениеЗаполнено(СтрокаТЧ.СубконтоДт1) Тогда
            СубконтоДт.Вставить(СтрокаТЧ.ВидСубконтоДт1,СтрокаТЧ.СубконтоДт1);
        КонецЕсли;
        Если  НЕ СтрокаТЧ.ВидСубконтоДт2=null И ЗначениеЗаполнено(СтрокаТЧ.СубконтоДт2) Тогда
            СубконтоДт.Вставить(СтрокаТЧ.ВидСубконтоДт2,СтрокаТЧ.СубконтоДт2);
        КонецЕсли;
        Если  НЕ СтрокаТЧ.ВидСубконтоДт3=null И ЗначениеЗаполнено(СтрокаТЧ.СубконтоДт3) Тогда
            СубконтоДт.Вставить(СтрокаТЧ.ВидСубконтоДт3,СтрокаТЧ.СубконтоДт3);
        КонецЕсли;
        
        СтрокаТЧ.СубконтоДт = СубконтоДт;
        
        СубконтоКт = Новый Соответствие;
        Если  НЕ СтрокаТЧ.ВидСубконтоКт1=null И ЗначениеЗаполнено(СтрокаТЧ.СубконтоКт1) Тогда
            СубконтоКт.Вставить(СтрокаТЧ.ВидСубконтоКт1,СтрокаТЧ.СубконтоКт1);
        КонецЕсли;
        Если  НЕ СтрокаТЧ.ВидСубконтоКт2=null И ЗначениеЗаполнено(СтрокаТЧ.СубконтоКт2) Тогда
            СубконтоКт.Вставить(СтрокаТЧ.ВидСубконтоКт2,СтрокаТЧ.СубконтоКт2);
        КонецЕсли;
        Если  НЕ СтрокаТЧ.ВидСубконтоКт3=null И ЗначениеЗаполнено(СтрокаТЧ.СубконтоКт3) Тогда
               СубконтоКт.Вставить(СтрокаТЧ.ВидСубконтоКт3,СтрокаТЧ.СубконтоКт3);
        КонецЕсли;
        СтрокаТЧ.СубконтоКт = СубконтоКт;
    КонецЦикла;
    
    ВТабл = Новый ТаблицаЗначений;
    Для Каждого Колонка Из Результат.Колонки Цикл
        ВТабл.Колонки.Добавить(Колонка.Имя, Колонка.ТипЗначения);
    КонецЦикла;
    Для Каждого СтрокаДерева Из Организация.Строки Цикл
        ЗаполнитьЗначенияСвойств(ВТабл.Добавить(), СтрокаДерева);
    КонецЦикла;
    НоваяСтрока.Хозрасчетный = ВТабл.Скопировать();
    Сообщить(""+НоваяСтрока.Хозрасчетный.Количество());
КонецЦикла;

В результате выходят сообщения с количествами проводок в выгружаемых операциях, т.е. данные в таблицу «ВыборкаДанных» попадают верно.
Однако файл выгрузки не содержит свойство «Хозрасчетный».
Прошу помочь понять, где допущена ошибка.
1 Медведик
 
02.07.14
16:55
В контрольном примере у меня две операции по друм организациям, т.е. в результате я должен получить во второй базе две такие же операции.

Просматривая выгруженный XML файл с данными, вижу оба объекта (операции), у каждого из которых есть только одно свойство "Дата" и нет "Хозрасчетный".
2 Alex S D
 
02.07.14
17:07
а ПКГС в ПКО настроено вообще?
3 Медведик
 
02.07.14
17:13
(2) С КД редко пересекаюсь, расшифруйте мне аббривиатуру ПКГС, пожалуйста
4 Медведик
 
02.07.14
17:18
(2),(3) Намек понял, спасибо, сейчас доработаю.
5 Alex S D
 
02.07.14
17:25
что уже сам разобрался? В общем правило для конвертации самого регистра бухгалтерии нужно еще
6 Медведик
 
02.07.14
17:33
(4) Да, гугл разъяснил, что такое ПКГС. ПКО я создал, а ПКГС не заполнил. Сейчас файл выгрузки содержит нужные данные.

Пока, правда, движения не загружаются, но это уже другой вопрос )
Еще раз СПАСИБО!
7 Alex S D
 
02.07.14
17:42
да не за что, там еще камни с видами субконто и правилами конвертации этих субконто
8 Paul_Nevada
 
02.07.14
17:43
С загрузкой движений - все просто)
9 Paul_Nevada
 
02.07.14
17:44
(6) намекнуть?
10 Медведик
 
02.07.14
17:47
(9) Нет, с этим разобрался ))

Прошу помочь с другими траблами:
1) по ссылкам (видимо) выгружаются все те операции, движения которых я аккумулирую;
2) загружается только одна операция, но это (подозреваю) из-за пустого номера.
11 Медведик
 
02.07.14
17:49
(7) У меня почти идентичные конфы с т.з. метаданных.
Проблема с разным составом субконто на счетах, но тут локальный случай - в источнике их больше.

Вся заморочка - из-за необходимости по ряду счетов в субконто1 приемника подставлять субконто2 источника.
12 Alex S D
 
02.07.14
17:49
самое время погуглить "КлючВыгружаемыхДанных" )
13 Медведик
 
02.07.14
17:53
(12) Спасибо, читаю )
14 Медведик
 
07.07.14
09:13
Доброго дня, уважаемые.

Возвращаюсь к коду из (1). Фактически там формируется таблица движений РБ Хозрасчетный и в результате переносится движения этого РБ.

Вопрос: есть ли "элегантное и незатратное" решение по переносу дополнительно всех движений всех РС и РН? Или придется для каждого РС и РН писать подобную таблицу? (что затруднительно по всем РС и РН в БП)
15 Paul_Nevada
 
07.07.14
09:49
(14) присоединяюсь к вопросу автора!
16 GenV
 
07.07.14
09:58
(14) Если ты движения хочешь переносить, то все равно в КД придется описывать все свойства этого регистра, чтобы КД знала, что нужно заполнять эти движения.
Такая таблица из (0) нужна, если источник не определен или исходные движения документа не совпадают с конечными движениями и эту таблицу вполне можно заполнить создав её колонки по метаданным и заполнив движения через ЗаполнитьЗначенияСвойств.
17 Медведик
 
07.07.14
10:17
(16) Проводки не совпадают, из-за этого сыр-бор. Нужно менять очередность и состав субконто.

При этом движения РС и РН менять не нужно! Их хочу перенести as is.

Вопрос: как перенести проводки правилом (1) + движения РС и РН без заморочек из (1)?
18 Йохохо
 
07.07.14
11:45
(17) через алгоритмы
Проводки = Параметры.ПараметрыАлгоритмов.Получить("Проводки");
БухИт = Параметры.ПараметрыАлгоритмов.Получить("БухИт");
ТекНомерСубконто = Параметры.ПараметрыАлгоритмов.Получить("ТекНомерСубконто");
КоличествоУровней = Параметры.ПараметрыАлгоритмов.Получить("КоличествоУровней");

ОстатокДтС = Параметры.ПараметрыАлгоритмов.Получить("ОстатокДтС");
ОстатокДтВ = Параметры.ПараметрыАлгоритмов.Получить("ОстатокДтВ");
ОстатокДтК = Параметры.ПараметрыАлгоритмов.Получить("ОстатокДтК");

ОстатокКтС = Параметры.ПараметрыАлгоритмов.Получить("ОстатокКтС");
ОстатокКтВ = Параметры.ПараметрыАлгоритмов.Получить("ОстатокКтВ");
ОстатокКтК = Параметры.ПараметрыАлгоритмов.Получить("ОстатокКтК");
19 Медведик
 
07.07.14
12:50
(18) К сожалению, не понял пока идею. Можно ее как-то словесно описать (саму идею) или, если это был только кусок кода, привести больше для понимания?
20 Йохохо
 
07.07.14
13:18
идея  - создать автоматом правила конвертации и перед выгрузкой вызывать один универсальный алгоритм, подменяющий все как надо. то есть код тупо копипастится между обработчиками разных объектов, а на субконто например "получать из входящих данных"
21 Медведик
 
07.07.14
13:37
(20) Прошу еще мне "разжевать".
Есть ПКО, ПВД, ПКС...
Где должна находиться точка входа - вызова этого универсального алгоритма? В каком обработчике кого из ПКО/ПВД/...?
22 Йохохо
 
07.07.14
13:39
(21) ПередВыгрузкой ПКО или ПГКС, где удобней будет
23 Йохохо
 
07.07.14
13:40
ПКГС, упс
24 Медведик
 
15.07.14
13:15
Доброго дня, уважаемые.

Подскажите пожалуйста, в ПКО документа в обработчик "После загрузки" хочу вставить запись объекта с проведением.
Мне нужно понять, был ли объект в источнике проведен.
Свойство "Проведен" Объекта использовать не могу, поскольку Объект на момент обработчика еще не записан.
Как?
25 Wobland
 
15.07.14
13:20
(24) Объект.Проведён
26 Медведик
 
15.07.14
13:37
(25) Объект на момент обработчика НЕ записан, ответом всегда будет Ложь
27 Медведик
 
15.07.14
13:40
(24) Пока есть вариант добавлять в ПКС каждого документа новое свойство и в него при выгрузке писать значение признака проведения, но это как-то топорно.
Может есть более элегантное решение?
28 Wobland
 
15.07.14
13:41
(26) ну хорошо
29 Медведик
 
15.07.14
13:42
(28) Намекаете, что я в (26) заблуждаюсь?
30 Wobland
 
15.07.14
13:46
(29) да сходи уже проверь
31 ДенисЧ
 
15.07.14
13:48
(30) Ну ты и мастер издеваться над человеком...
32 Медведик
 
15.07.14
13:52
(30) Проверю, спасибо
33 Йохохо
 
15.07.14
13:56
(32) все верно, только в цикл не попади, кд и сама этот проведен обрабатывает, можешь получить двойное проведение с срабатывание каких то алгоритмов два раза
34 Медведик
 
18.07.14
09:31
Доброго дня, уважаемые.

Подскажите по поиску документов по дате.
Насколько я понимаю, время тоже влияет. Если полями поиска будут номер и дата документа, то возможна (и нормальна с т.з. правил) ситуация:
1. документ перенесли с текущим временем 12:00
2. документ в источнике провели повторно, оперативно, время изменилось на 14:09
3. документ перенесли с новым временем 14:09
4. в приемнике образовалось два одинаковых документа с разным временем.

Выход из этой ситуации каков, только вмешательством в обработчики (вешать документы в приемнике строго на одно время / писать алгоритм поиска при загрузке) или есть элегантные варианты?
35 Медведик
 
18.07.14
09:36
(34) Почему документ не определяется по идентификатору - пока понять не могу.
36 Медведик
 
21.07.14
13:03
(34),(35) Хорошо, понял, что глупость сморозил. Поскольку план обмена я не использую, сопоставления по внутреннему идентификатору просто нет.

Переформулирую вопрос: возможно ли _простым_ способом настроить правила на сопоставление по полю поиска (дата со временем) только в части даты без учета времени, не меняя время новых документов (т.е. поставить всем 10:00 не устраивае)?
Или только вмешиваться с кодом в обработчики и самому реализовывать поиск?
37 Йохохо
 
21.07.14
13:26
сопоставление между восьмерками есть на вкладке настройки и, если не отключено, приоритетнее полей поиска
38 Wobland
 
21.07.14
14:07
(36) даты без времени не бывает, она устроена так. потребностей твоих тоже не бывает, это чушь
39 Медведик
 
22.07.14
11:27
Спасибо, в (38) вердикт прописан. Придется задействовать план обмена, отскочить не удается.
40 Йохохо
 
22.07.14
11:36
(39) просто поставь галку и выгрузи с отбором по одному документу. поменяй время и еще раз
41 Медведик
 
22.07.14
14:14
(40) Не понимаю (( Можно чуть подробнее, о какой галке речь?
42 Медведик
 
22.07.14
15:48
(40) Правильно понимаю, что речь идет о галке "Искать объект приемника по внутреннему идентификатору"?
Так стоит...

Проблема в том, что (почему-то) документы, несмотря на эту галку, не ищутся по внутреннему идентификатору. Т.е. при повторном переносе документа создается дубль, если изменилось время документа.
При поиске по внутреннему идентификатору изменение времени документа не сбило бы обработку. Получается, что обработка не отрабатывает поиск по внутреннему идентификатору.

Обработка Универсальный обмен данными в формате XML 2.1.8.
План обмена и механизм БСП не используются.
43 Йохохо
 
22.07.14
16:03
(42) может еще стоит не замещать существующие?
44 Медведик
 
22.07.14
16:06
(43) А вот тут интересно, почему же не стоит? Данные меняются задним числом (российский бизнес, ага) и документы приходится загружать повторно.

Технически не понимаю проблемы - уникальный идентификатор документа НЕ меняется при его корректировке, верно? Если да, какие проблемы возникают при замещении существующего?
45 Йохохо
 
22.07.14
16:09
напутал, в общем просто выгрузи два раза и посмотри в xml
46 Медведик
 
23.07.14
11:07
Доброго дня, уважаемые.

Прошу консультации по вопросу переноса уникального идентификатора.

Я переношу из источника несколько типов отраслевых документов в Операцию приемника БП 3. В ПВД способ выборки - произвольный алгоритм, ссылку на документ-источник оставляю для сопоставления по уникальному идентификатору.

Правильно ли я понимаю, что есть вероятность совпадения уникальных идентификаторов РАЗНЫХ типов документов, при которой из двух документов в источнике я получу одну ОперациюБух в приемнике?
Насколько это опасно?
47 _KaA
 
23.07.14
11:20
УникальныйИдентификатор (UUID)
Конструкторы:

Из строки
По умолчанию

Описание:

Предназначен для создания и хранения глобального уникального идентификатора GUID.
___________________________

УникальныйИдентификатор - уникален в пределах базы, то есть у расходной накладной и акта выполенных работ не может быть одинаковых УИДов.
48 Медведик
 
23.07.14
12:06
(47) Спасибо, успокоили. С GUID, значит, проблемы упоминались.
49 _KaA
 
23.07.14
12:28
(48) Не за что.
Иначе не работал бы поиск объектов по УИДу.
50 Йохохо
 
23.07.14
12:33
(49) он и не работает, работает по тип+уид
51 _KaA
 
23.07.14
16:58
(50) Думаю указание типа служит для оптимизации.

Когда мы пишем Новый УникальныйИдентификатор() - конструктор нас не просит указывать тип или ссылку нового, кому мы его потом назначим.

Наверно так ...
52 Медведик
 
18.08.14
08:06
Есть версия, что УИДы в разных базах могут совпасть.
Т.е. если сливать в одну базу данные из нескольких - могут придти разные документы из разных баз с одинаковым УИДом, который уникален в рамках каждой отдельной базы-источника.
53 Медведик
 
18.08.14
08:11
Вопрос еще один имею по КД.

Перенос документа ОперацияБух, конфа БП 3.
КД прописала в ПКО (ПКС) все возможные регистры (сведений, накопления) помимо Хозрасчетного.

При переносе ОперацияБух с движениями только по Хозрасчетному результат успешный, но если в операции есть движения еще по какому-нибудь регистру - вылетает ошибка Поле объекта не обнаружено (Хозрасчетный).

В чем дело, как побороть?