Ошибка выбора объектов коллекции

(6) Типовой из КД «Перенос остатков товара» =)

Запрос = Новый запрос();

Запрос.текст = «ВЫБРАТЬ

|        ОстаткиТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура,

|        ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток КАК Количество

|    ИЗ

|        РегистрНакопления.ОстаткиТоваровНаСкладах.Остатки КАК ОстаткиТоваровНаСкладахОстатки»;

Выборка = запрос.Выполнить().Выбрать();

ТоварыНаСкладах = Новый ТаблицаЗначений();

ТоварыНаСкладах.Колонки.Добавить(«Номенклатура»);

ТоварыНаСкладах.Колонки.Добавить(«Количество»);

ТоварыНаСкладах.Колонки.Добавить(«Период»);

ДатаВыгрузки = ТекущаяДата();

Пока Выборка.Следующий() Цикл

    
    СтрокаТоваров = ТоварыНаСкладах.Добавить();

    СтрокаТоваров.Номенклатура = Выборка.Номенклатура;

    СтрокаТоваров.Количество = Выборка.Количество;

    СтрокаТоваров.Период = ДатаВыгрузки;

    
КонецЦикла;

ТаблицаИменРегистров = Новый ТаблицаЗначений();

ТаблицаИменРегистров.Колонки.Добавить(«Имя»);

ТаблицаИменРегистров.Колонки.Добавить(«Представление»);

СтрокаТаблицы = ТаблицаИменРегистров.Добавить();

СтрокаТаблицы.Имя = «ОстаткиТоваровНаСкладах»;

СтрокаТаблицы.Представление = «Остатки товаров на складах»;

ИсходящиеДанные = Новый Структура;

ИсходящиеДанные.Вставить(«Номер», «001»);

ИсходящиеДанные.Вставить(«Дата», ДатаВыгрузки);

ИсходящиеДанные.Вставить(«Комментарий», «Перенос остатков товаров на » + Строка(ДатаВыгрузки));

ИсходящиеДанные.Вставить(«ТаблицаРегистровНакопления», ТаблицаИменРегистров);

ИсходящиеДанные.Вставить(«ОстаткиТоваровНаСкладах», ТоварыНаСкладах);

ВыгрузитьПоПравилу(, , ИсходящиеДанные, , «ПереносОстатковТоваров»);

(6) Типовой из КД «Перенос остатков товара» =)

Запрос = Новый запрос();

Запрос.текст = «ВЫБРАТЬ

|        ОстаткиТоваровНаСкладахОстатки.Номенклатура КАК Номенклатура,

|        ОстаткиТоваровНаСкладахОстатки.КоличествоОстаток КАК Количество

|    ИЗ

|        РегистрНакопления.ОстаткиТоваровНаСкладах.Остатки КАК ОстаткиТоваровНаСкладахОстатки»;

Выборка = запрос.Выполнить().Выбрать();

ТоварыНаСкладах = Новый ТаблицаЗначений();

ТоварыНаСкладах.Колонки.Добавить(«Номенклатура»);

ТоварыНаСкладах.Колонки.Добавить(«Количество»);

ТоварыНаСкладах.Колонки.Добавить(«Период»);

ДатаВыгрузки = ТекущаяДата();

Пока Выборка.Следующий() Цикл

    

    СтрокаТоваров = ТоварыНаСкладах.Добавить();

    СтрокаТоваров.Номенклатура = Выборка.Номенклатура;

    СтрокаТоваров.Количество = Выборка.Количество;

    СтрокаТоваров.Период = ДатаВыгрузки;

    
КонецЦикла;

ТаблицаИменРегистров = Новый ТаблицаЗначений();

ТаблицаИменРегистров.Колонки.Добавить(«Имя»);

ТаблицаИменРегистров.Колонки.Добавить(«Представление»);

СтрокаТаблицы = ТаблицаИменРегистров.Добавить();

СтрокаТаблицы.Имя = «ОстаткиТоваровНаСкладах»;

СтрокаТаблицы.Представление = «Остатки товаров на складах»;

ИсходящиеДанные = Новый Структура;

ИсходящиеДанные.Вставить(«Номер», «001»);

ИсходящиеДанные.Вставить(«Дата», ДатаВыгрузки);

ИсходящиеДанные.Вставить(«Комментарий», «Перенос остатков товаров на » + Строка(ДатаВыгрузки));

ИсходящиеДанные.Вставить(«ТаблицаРегистровНакопления», ТаблицаИменРегистров);

ИсходящиеДанные.Вставить(«ОстаткиТоваровНаСкладах», ТоварыНаСкладах);

ВыгрузитьПоПравилу(, , ИсходящиеДанные, , «ПереносОстатковТоваров»);

Рекомендовать в новости

Гость

0

02.11.2015 — 14:36


Добрый день.
Переношу сильно дописанную Тис в не менее дописанную УТ
Выгружаю один справочник. В восьмерке есть таб часть ТОВАРЫ, в 77 есть реквизит КодыТоваров — строка, в которой лежат коды товаров.
В правилах у этого справочника создаю Группу свойств. Источник — пустой, Приемник — Товары.
Так же создаю свойство Приемник-Номенклатура
Пытаюсь выгрузить этот справочник. Получаю ошибку
«Ошибка выбора объектов коллекции»
Я в ступоре. Лезу в код обработки выгрузки. Вижу что семерка пытается получить свойство:
Объект.ТОВАРЫ — но почему она это делает???
Если убрать таблицу свойств, то справочник грузится.
Подскажите где я ступил. Уж голова кипит от этих правил.

Гость

1

02.11.2015 — 14:53

Эффект присутствия млин.
Написал вопрос. Пока ждал ответ решил опять удалить группы свойств и по новой создать.
Создал группы, создал в них свойства, прописал нужный мне код.
Вуаля, заработало. ТАк и не понял почему первый раз не заработало.

Гость

2

02.11.2015 — 19:21

Это все гребаный шайтан «Одноес Нуралиеч» дарующий иногда «ТАк и не понял почему первый раз не заработало».
И только тем, кто знаками препинания пренебрегает, блин.

Гость

3

02.11.2015 — 20:18

2-Сли то > Не нервничай.
Он россиянин, скорее всего.
А они в большинстве своем безграмотны чуть менее, чем полностью.
Радуйся просто тому, что они жи ши пишут через «и».
На тся и ться — забей вообще навсегда.
Это русские.
Не трать нервы.

В России 2 беды: тся и ться.

ПВД: Вылетает ошибка из сабжа. Что не так?

Вообще — много непонятного

Данные, выгружаемые по правилу — ПЕРВЫЙ параметр.

ВыгрузитьПоПравилу(ИсходящиеДанные,,,, «КорректировкаЗаписейРегистров»); — Та же самая ошибка. А вообще из примера взял, в примере «Исходящие данные» задаются 3 параметром, а первый пустой.

Где вы, ять, такие примеры берете?

Типовой из КД «Перенос остатков товара» =) Запрос = Новый запрос; СтрокаТаблицы.Представление = «Остатки товаров на складах»; ИсходящиеДанные.Вставить(«Комментарий», «Перенос остатков товаров на » + Строка(ДатаВыгрузки));

В справке к КД такого нет, я гарантирую это.

Ну да, в справке по-другому. Но и если первым параметром указывать, то та же самая ошибка.

Ошибка какбе символизирует нам, что КД ожидает увидеть в неком свойстве коллекцию. А у тебя там ХЗ что.

В это некое свойство я передаю ТЗ. ТЗ не пустая однозначно. ТЗ же является коллекцией, правильно?

Рекомендую таки изучить правило под лупой. Что-то ты там делаешь не так

Вы пытаетесь передать Объект, который хотите, чтобы конвертация обошла как коллекцию, из которой выбрала Объект

протупил я, смотри в отладчике, в 7 проще чем в 8

Вообщем, получилось выгруэить все же вот так: То есть ТЗ передать 3 параметром. при этом в ПВД очистил поле «Правило конвертации».

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Показывать по
10
20
40
сообщений

Новая тема

Ответить

sidhartha

Дата регистрации: 13.08.2009
Сообщений: 38

Acc77_80.xml»;Обработки взял с июльского ИТС. Решил сначала потренироваться на стандартной демо-базе 7.70.507 без изменения правил. Галочку оставил у одного простого справочника — «расходы будущих периодов», потом попробовал «ценные бумаги». Все равно ошибка. Это вообще работает?<br><br><br>Ошибка исполнения обработчика: Конвертация_ПередВыгрузкойДанных<br> — Поле агрегатного объекта не обнаружено (ДатаКонцаПериодаВыгрузки)<br>Ошибка исполнения обработчика: ПКО_ПередВыгрузкой_Работники<br> — Значение не представляет агрегатный объект (КоличествоСтрок)<br>Ошибка получения значения свойства объекта<br> Объект: Основной р/с, свойство: ВалютаДенежныхСредств.<br>Ошибка исполнения обработчика: ПКС_ПередВыгрузкой_Работники_Дата_Свойство9<br> — Поле агрегатного объекта не обнаружено (ДатаКонцаПериодаВыгрузки)<br>ПКГС_ПередОбработкойВыгрузки_Работники_РаботникиОрганиза­ций_ТабличнаяЧасть1<<?>>(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, КоллекцияОбъектов, НеЗамещать, НеОчищать)<br>Функция не обнаружена (ПКГС_ПередОбработкойВыгрузки_Работники_РаботникиОрганизаций_­ТабличнаяЧасть1)<br>Ошибка выбора объектов коллекции<br>ПКС_ПередВыгрузкой_Работники_ВидЗанятости_Рекви­зит13<<?>>(Источник, Приемник, ВходящиеДанные, ИсходящиеДанные, НомерПКС, НомерПКО, ОбъектКоллекции, Значение, ТипПриемника, ИмяПКО, ИмяПКОВидСубконто, Пусто, Выражение, НеЗамещать)<br>Функция не обнаружена (ПКС_ПередВыгрузкой_Работники_ВидЗанятости_Реквизит13)<br>Ошибка исполнения обработчика: ПКО_ПередВыгрузкой_УволенныеРаботники<br> — Значение не представляет агрегатный объект (КоличествоСтрок)

Показывать по
10
20
40
сообщений

Особенности переноса данных в «1С-КАМИН:Зарплата. Версия 5.0»:
Данные по начислениям, отработанному времени и периодам невыходов на дату начала выгрузки переносятся в документ «Входящее сальдо».
Например — при выгрузке задается период с 01.01.2019 года.
ВНИМАНИЕ! База и неотработанное время для расчета больничных и по среднему переносится в документ «Входящее сальдо». Рекомендуем указывать в качестве периода переноса — начало текущего года.
Данные (начисления, периоды невыходов за 2017 и 2018 год и сальдо на 01.01.2019) будут выгружены в документ «Входящее сальдо».
Данные (начисления и удержания) с 2019 года выгружаются полностью в соответствующие документы. Внимание: данные по невыходам (больничные, отпускные и т.п.) переносятся в документ «Регистрация невыходов».

Параметры выгрузки.
Варианты выгрузки в соответствующих параметрах:
— Выгружать полностью все (все справочники, кадры, начисления и т.д.);
— выгружать только справочники и кадровые документы;
— выгружать справочники, кадровые документы и входящее сальдо (не будут переносится документы за текущий период).
Остальные параметры:
— Выгружать во «Входящее сальдо» один год. В документ Входящее сальдо будут выгружены сведения по начислениям, отработанному и неотработанному времени только за один предшествующий год.
-Удержан НДФЛ за декабрь. Устанавливается, если выплата ЗП и соответственно удержание НДФЛ за декабрь было произведено в декабре.
— Не выгружать уволенных на дату начала переноса. При установленном параметре не будут переносится сотрудники и связанные с ними документы, если они были уволены ранее даты начала переноса и по ним нет задолженностей по зп (сальдо).
— Оставлять коды Сотрудников. Оставляет нумерацию элементов справочника Сотрудники.
— Переносить Источники доходов. Если предполагается использование источников дохода в 5.0, то устанавливается в значение ДА.

По ошибкам и логу конкретно невозможно определить, в чем проблема. Вероятно проблема при выгрузке сальдо по НДФЛ во Входящее сальдо. Но все же нужно смотреть саму информационную базу 2.0

Есть ли способ выбрать / заполнить коллекцию Oracle (« ТАБЛИЦА ») при обычном выборе из jdbc, то есть без процедуры с объявленной переменной для массового сбора или анонимного блока в Oracle12c ?

Проблема заключается в выборе объектов с помощью коллекции объектов, поскольку я не могу найти способ заполнить коллекцию, и поэтому он помещает каждый объект в отдельную коллекцию вместо того, чтобы собирать их в одну (т.е. «запрос с одной строкой вернул более одного ряд»).

Длинная история: Большинство наших сервисов / API имеют параметры динамического поиска, а затем они переводятся в операторы SQL.

Java-код анализирует ограниченный «поиск / где», дезинфицирует и параметризует их, а затем выбирает объекты из oracle, поэтому в большинстве случаев он выполняется намного быстрее, чем жесткий синтаксический анализ oracle, однако я не могу найти решение для заполнения объектов со списком объектов.

Текущая работа — это вызов процедур и предоставление им возможности выполнять массовый сбор объявленных объектов с последующим их возвратом, однако из-за динамического характера предложения «поиск» большинство из них выполняет EXECUTE IMMEDIATE , что является довольно тяжелым для ЦП базы данных.

Другие решения, такие как несколько запросов для каждой строки для выборки этого списка или левое соединение и выборка всего за один ResultSet, просто увеличивают время экспоненциально, поскольку выборка обычно выполняется для огромного количества столбцов, строк и вложенных списков: <

CREATE OR REPLACE TYPE SUB_TYPE_OBJ Force AS OBJECT
(
  SVAR1 VARCHAR2(100 CHAR);
  SVAR2 DATE,
  SVAR3 VARCHAR2(100 CHAR)
);

CREATE OR REPLACE TYPE SUB_TYPE_LST IS TABLE OF SUB_TYPE_OBJ;

CREATE OR REPLACE TYPE MAIN_TYPE_OBJ Force AS OBJECT
(
  MVAR1 VARCHAR2(100 CHAR),
  MVAR2 VARCHAR2(100 CHAR),
  MVAR3 SUB_TYPE_OBJ,
  MVAR4 SUB_TYPE_LST
);

SELECT MAIN_TYPE_OBJ (
    tab1.val1, 
    tab1.val2,
    (SELECT SUB_TYPE_OBJ( table2.val1, table2.val2, table2.val3) obj FROM table2 WHERE tab1.val1 = tab2.val1),
    (SUB_TYPE_LST ( (SELECT SUB_TYPE_OBJ( table3.val1, table3.val2, table3.val3) obj FROM table3 DYNAMIC_WHERE_WITH_LIMITED_FUNCTIONALITY)))
    /* if it return more than one row everything breaks :( */
), CNT
FROM (
SELECT table1.*, COUNT(*) OVER(table1.val1) AS CNT FROM table1
WHERE DYNAMIC_WHERE_WITH_LIMITED_FUNCTIONALITY
ORDER BY val1 ASC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY) tab1;

Если table3 возвращает более одной строки, мы получаем «однострочный запрос возвратил более одной строки», потому что я просто создаю группу списков вместо одного, содержащего все объекты, но я не могу понять, как это сделать;

Любые идеи приветствуются, но, пожалуйста, пока исключите DBMS_SQL или NoSQL :).

3 ответа

На самом деле у EXECUTE IMMEDIATE есть using_clause , который позволяет передавать переменные привязки

Чтобы адаптировать пример @Bob, простая настройка

strQuery := 'SELECT * FROM DATA_TABLE WHERE ' || strField_name || '= :x' ;

EXECUTE IMMEDIATE strQuery BULK COLLECT INTO colVals USING nField_val;

Это создает инструкцию SQL с переменной связывания, которая подвергается только мягкому синтаксическому анализу .

 SELECT * FROM DATA_TABLE WHERE FIELD1= :x

Конечно, у этого подхода есть ограничение, количество переменных связывания является статическим , определенным как список в операторе EXECUT EIMMEDIATE, например USING a,b,c,d,e

На ум приходят две проблемы . Первый — это необязательные параметры , т. Е. Некоторые запросы выполняют поиск по name, а birth_date некоторые только по name

Вы можете найти множество решений с OR или NVL, например здесь или здесь, но превосходное решение, популяризированное Томом Кайтом, использовало трюк быстрого доступа 1=1 OR:

Если используется переменная связывания, вы создаете ее в предложении WHERE

 birth_date = :birth_date 

Если он не используется , вы избавитесь от него, создав следующий предикат

(1=1 or :birth_date  is NULL)

Эффект таков: 1) количество связываемых переменных остается фиксированным (даже если: Birth_date не используется) и 2) оценка 1=1 как true пропустит остальную часть предиката, т. Е. переменная привязки не действует.

Вторая проблема связана со списками IN , которые могут иметь динамическое количество членов; от 1 до 1000 на Oracle.

эталонный тест — это решение Hibernate, которое подсчитывает длину списка IN и генерирует соответствующий динамический SQL, например col1 in (?,?,?,?) для четырех мебмеров в списке IN. В итоге вы получаете до 1000 жестко проанализированных SQL-запросов (по одному на каждую длину), но в любом случае это логарифмическое улучшение по сравнению с наихудшим случаем вставки списка в динамический SQL .

Из ограничения, описанного выше, вы уже знаете, что это невозможно с помощью EXECUTE IMMEDIATE (и вам нужно будет узнать что-то новое;), например DBMS_SQL)

Вы можете попробовать уловку и ограничить список IN, скажем, 10 участниками и заполнить его NULL s.

Т.е. чтобы передать 4 члена, вы свяжете следующие переменные:

 col1 IN (1,2,3,4,null,null,null,null,null,null)

Но обратите внимание, что я не знаю, будет ли производительность в длинном списке IN (для короткого списка IN это будет работать нормально). Кроме того, этот подход окончательно не работает для col1 NOT IN, которые ничего не возвращают, если в списке IN есть NULL.


0

Marmite Bomber
26 Авг 2019 в 11:01

Здесь у вас есть несколько вариантов. Вы можете открыть свой запрос как явный курсор, а затем FETCH … BULK COLLECT INTO соответствующую коллекцию; вы можете использовать EXECUTE IMMEDIATE … BULK COLLECT INTO; или, как вы говорите, вы не хотите слышать, вы можете использовать DBMS_SQL.

Чтобы использовать EXECUTE IMMEDIATE … BULK COLLECT, вы должны использовать что-то вроде

CREATE TABLE DATA_TABLE(FIELD1         NUMBER,
                        FIELD2         VARCHAR2(100));

INSERT INTO DATA_TABLE (FIELD1, FIELD2)
  SELECT 1, 'ONE' FROM DUAL UNION ALL
  SELECT 1, 'TWO' FROM DUAL UNION ALL
  SELECT 2, 'THREE' FROM DUAL UNION ALL
  SELECT 2, 'FOUR' FROM DUAL UNION ALL
  SELECT 3, 'LAST' FROM DUAL;

DECLARE
  TYPE typeCol IS TABLE OF DATA_TABLE%ROWTYPE;
  colVals        typeCol;
  strField_name  VARCHAR2(30) := 'FIELD1';
  nField_val     NUMBER := 2;

  strQuery       VARCHAR2(4000);
BEGIN
  strQuery := 'SELECT * FROM DATA_TABLE WHERE ' || strField_name || '=' || nField_val;

  DBMS_OUTPUT.PUT_LINE(strQuery);

  EXECUTE IMMEDIATE strQuery BULK COLLECT INTO colVals;

  FOR i IN colVals.FIRST..colVals.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(i || ': FIELD1=' || colVals(i).FIELD1 || '  FIELD2=' || colVals(i).FIELD2);
  END LOOP;
END;
/

dbfiddle здесь

документы здесь (с 10.1 — лучше, чем более поздние версии IMO)


1

Bob Jarvis — Reinstate Monica
25 Авг 2019 в 21:13

Просто используйте EXTEND, чтобы добавить новую строку в коллекцию!

Прежде всего создайте локальный varabile (например, one_row), который будет указывать на структуру вашей коллекции после этого:

SUB_TYPE_LST.extend;
                                one_row.SVAR1 := 'VALUE1';
                                one_row.SVAR2 := sysdate;
                                one_row.SVAR3 := 'value2';
                                SUB_TYPE_LST(1) := one_row; -- 1 - number of row in the table - you can put a variable which will be incremented inside a loop 


0

t v
26 Авг 2019 в 12:38

  • Главная
  • Карьера
  • Блог о жизни франчайзи
  • Про 1С от наших сотрудников

15 Сентября 2020

Конвертация строки в справочник (перечисления) и обратно

Конвертация строки в справочник

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

Рисунок 1 – Описание обработчика «Перед Выгрузкой».

Конвертация строки в перечисление

Если в базе источника реквизит имеет тип «Строка», а в базе приемника тип «Перечисление», то отдельное правило конвертации объектов разрабатывать не нужно, все действия описываются в конвертации свойств. Необходимо в обработчике «Перед выгрузкой» свойства описать алгоритм заполнения перечисления объекта приемника от значений реквизита объекта источника, то есть:

Конвертация справочника в строку

Если в базе источника реквизит имеет тип «Справочник», а в базе приемника тип «Строка», то отдельное правило конвертации объектов разрабатывать не нужно, все действия описываются в конвертации свойств. Необходимо в обработчике «Перед выгрузкой» свойства описать алгоритм заполнения реквизита объекта приемника от реквизита справочника объекта источника, то есть:

Конвертация перечисления в строку

Если в базе источника реквизит имеет тип «Перечисление», а в базе приемника тип «Строка», то отдельное правило конвертации объектов разрабатывать не нужно, все действия описываются в конвертации свойств. Необходимо в обработчике «Перед выгрузкой» свойства описать алгоритм заполнения реквизита объекта приемника от перечисления объекта источника, то есть:

Конвертация справочника в перечисление (перечисление в справочник)

Конвертация справочника в перечисление

Данная задача становится актуальной с учетом изменения перечисления «Ставки НДС» на справочник в новых конфигурациях. Теперь при конвертации объектов из новых конфигураций (тип: справочник) в конфигурации, где ставки НДС еще являются перечислением, необходимо будет разрабатывать соответствующее правило конвертации объектов.

1. Необходимо в правиле конвертации объектов на вкладке «Настройки», включить свойство «Не запоминать выгруженные объекты» (см. рисунок 2).

Рисунок 2 – Не запоминать выгруженные объекты.

Иначе система будет перезаписывать выгрузку одного и того же значения перечисления.

2. Не использовать конвертацию значений (предопределенные значения справочника в значения перечисления).

Будет использоваться обработчик «При выгрузке», а при использовании данного обработчика конвертация значений не отрабатывает.

3. В конвертации объекта в обработчике «При выгрузке» необходимо прописать следующий код:

      

То есть нам необходимо в переменную «УзелСсылки» присвоить значение метаданных перечисления, которое соответствует базе приемника, тогда система автоматически при загрузке определит нужное значение.

Конвертация перечисления в справочник

Для конвертации перечисления в справочник, потребуется отдельное правило конвертации объектов. В данном правиле можно воспользоваться конвертацией значений (конвертация значений перечисления в предопределенные значения), и необходимо описать поля поиска, а также реквизит, в который будет грузиться значение перечисления (например: реквизит — наименование), и при необходимости описать заполнение остальных реквизитов справочника. В правиле в обработчике «Перед выгрузкой» реквизита написать следующий алгоритм (см. рисунок 1).

Отключение проверки полей поиска

В созданных правилах конвертации объектов, по которым не заполнена колонка «Поля поиска» при сохранении правил, система предложит указать автоматически поля поиска (см. рисунок 3).

Рисунок 3 – Предупреждение – не указаны поля поиска.

При каждом сохранении правил, система будет выдавать данное сообщение. Если при достаточно большом количестве правил случайно нажать «Да», то система создаст поля поиска по всем правилам, и может потребоваться достаточно большое время восстанавливать обратно. Чтобы избежать таких неприятных ситуаций, данную проверку можно отключить (путь: Сервис – Настройки пользователя) (см. рисунок 4).

Рисунок 4 – Отключение проверки полей поиска.

Не регистрировать документы к обмену при определенных действиях

Документы регистрируются к обмену по правилам регистрации объектов при любых действиях (проведение, выполнение различных обработок и т.д.). Если необходимо не регистрировать документы при определенных действиях (например: при выполнении обработки по перепроведению документов), то можно использовать функционал дополнительные свойства.

В месте изменения документа, который не должен регистрироваться к обмену, нужно установить дополнительное свойство. В правилах регистрации объектов по документу в обработчике событий «После обработки» добавить:

В таком случае документ при групповом перепроведении не будет регистрироваться к обмену.

Общий алгоритм для всех объектов одного типа метаданных

Если необходимо учитывать один алгоритм для всех объектов одного типа метаданных (например: не выгружать помеченные на удаления справочники), то можно воспользоваться глобальными обработчиками, в них прописать один раз алгоритм, который будет действовать для всех существующих и новых объектов. Такой подход позволяет избежать дублирования кода и не забыть написать необходимый алгоритм для новых справочников.

Например, для задачи – не выгружать помеченные на удаления справочники, необходимо в глобальном обработчике «Перед выгрузкой объекта» написать следующий алгоритм:

Перенос субконто по своим правилам

У одного типа субконто могут присутствовать несколько правил выгрузки объекта, и система в таком случае будет по умолчанию выбирать одно определенное правила согласно приоритету и наименованию. Если же необходимо выгрузить субконто не по выбранному по умолчанию правилу, то можно воспользоваться следующим алгоритмом:

1. Для реквизита «Субконто» в обработчике «Перед выгрузкой»:

2. Перенос плана видов характеристик «Виды Субконто Хозрасчетные» (см. рисунок 5):

Рисунок 5 – Перенос плана видов характеристик.

3. Для реквизита «Субконто» в обработчике «При выгрузке»:

Описывается последовательность действий для каждого типа субконто.

Важный момент. Обязательно нужно прописать алгоритм выгрузки для каждого возможного типа субконто. После того, как добавлен код в обработчик «При выгрузке», типовое определение правила от типа субконто не срабатывает.

Поиск полей

Конвертация данных позволяет разрабатывать собственные алгоритмы поиска элементов на стороне приемника, для этого предназначен обработчик «Поля поиска».

В обработчике «Поля поиска» могут участвовать только те реквизиты, у которых установлен признак «Поиск» в конвертации свойств (см. рисунок 6). Данные реквизиты не обязательно должны участвовать в поиске нужного элемента, они могут присутствовать в различной другой логике алгоритма (например: в условиях алгоритма обработчика «Поля поиска»).

Рисунок 6 – Реквизиты доступные для обработчика «Поля поиска»

            Пример обработчика «Поля поиска»:

            В обработчике мы можем задать до 10 итераций через переменную «НомерВариантаПоиска». В каждой итерации в зависимости от условий задать поля поиска элемента через переменную «СтрокаИменСвойствПоиска» (наименование полей задаются, как они заданы у приемника). Получить значение поля поиска можно через структуру «СвойстваПоиска» (наименование полей задаются, как они заданы у приемника). Для прекращения поиска нужно использовать переменную «ПрекратитьПоиск».

Реквизиты узлов источника и приемника

В конвертации данных можно обращаться к реквизитам плана обмена. Это может быть необходимо, например, при тиражировании правил обмена на несколько баз и некоторые особенности функционала отличаются между базами (данные особенности будут учитываться с помощью реквизитов плана обмена).

На стороне источника, чтобы обратиться к узлу плана обмена, необходимо использовать переменную: «УзелДляОбмена».

Например, в правилах обмена на стороне источника можно обратиться к ИНН выбранной организации в плане обмена:

На стороне приемника, чтобы обратиться к узлу плана обмена, необходимо использовать переменную: «УзелОбменаЗагрузкаДанных».

Например, в правилах обмена на стороне приемника можно обратиться к ИНН выбранной организации в плане обмена:

Протокол (лог) синхронизации между базами

Важным элементом обмена между базами является протокол (лог) синхронизации. Данный протокол должен показывать в удобном виде всю необходимую информацию об обмене (количество выгруженных элементов; список выгруженных элементов; ошибки обмена и т.д.). Чем сложнее алгоритмы обмена, тем более расширенный должен быть лог (например: у нас несколько документов на стороне источника объединяются в один документ на стороне приемника, в таком случае протокол должен показывать, как документы объединялись). Лог должен содержать значимую информацию, которая оперативно поможет разобраться с вопросами связанными с синхронизацией.

Можно выделить три наиболее частых варианта создания протокола (лога) синхронизации между базами без кастомизации баз источника и приемника:

1) Записывать всю необходимую информацию в журнал регистрации. Данный подход имеет существенные недостатки. Чаще всего журнал регистрации имеет большой объем информации, это влияет на скорость анализа нужной информации (журнал регистрации может работать медленно), и предоставление данных в журнале регистрации не всегда удобно для анализа данных. 

2) Отправлять все необходимые данные на электронную почту. После каждой синхронизации записывать данные в регистр сведений (ОтправкаEmail) для последующей отправки необходимым адресатам. В данном случае недостаток в том, что может возникнуть большое количество писем за день, и в них будет сложно проводить анализ.

3) Записывать всю необходимую информацию во внешний источник (файлы excel и т.д.). Данный подход является наиболее предпочтительный, т.к. можно создать 1 файл в день, в него дописывать всю нужную информацию за день в удобном виде для анализа.

Можно выбрать любой из данных подходов или кастомизировать базы источника и приемника для хранения лога в самих базах, но наличие подробного протокола (лога) может помочь во многих вопросах, связанных с синхронизацией между базами.

Передача параметра из источника в табличную часть приемника

При возникновении задач заполнения на стороне приемника в табличной части колонок, отсутствующих на стороне источника по данным колонок, которые отсутствуют на стороне приемника. Можно воспользоваться функционалом передачи значений отсутствующих колонок на стороне приемника в параметры табличной части и на основании этих данных заполнять нужную колонку.

            Передача значений табличной части из источника в параметры табличной части приемника имеет ряд особенностей:

1. Необходимо в конвертации свойств табличной части приемника создать необходимый параметр. Если параметр имеет не примитивный тип, то указать также правило конвертации (см. рисунок 7).


Рисунок 7 – Создание параметра в конвертации свойств табличной части приемника.

2. Важный момент! Заполнение параметра должно всегда происходить в переменную «Значение» в обработчике «Перед выгрузкой». Из входящих данных параметр не сможет заполниться (будет выдаваться сообщение об ошибки) (см. рисунок 8).

Рисунок 8 – Заполнение параметра в конвертации свойств табличной части.

3. На стороне приемника обращение к параметрам табличной части происходит в обработчике «После загрузки» через соответствие «ПараметрыОбъекта» по следующему правилу:

  • если параметр был создан в табличной части, то обращение будет типа: [Наименование табличной части] + ТабличнаяЧасть (например: «ТоварыТабличнаяЧасть»);

  • если параметр был создан в наборе движений регистра, то обращение будет типа: [Наименование набора движений регистра] + Набор записей (например: «ХозрасчетныйНаборЗаписей»);

Например:

Заключение

Рассмотренные приемы работы позволят повысить производительность и эффективность работы с программой «Конвертация данных 2.1». Описанные приемы в данной статье и в первой статье затрагивают наиболее частые нетривиальные задачи использования конвертации данных, изучив обе статьи, подобные задачи уже не будут вызывать сложностей.

Ретунский (2).png

Статью подготовил аналитик-эксперт по информационным системам «ИнфоСофт» Ретунский Александр.
Статья опубликована на портале ИнфоСтарт

ПВД: Вылетает ошибка из сабжа. Что не так?

Вообще — много непонятного

Данные, выгружаемые по правилу — ПЕРВЫЙ параметр.

ВыгрузитьПоПравилу(ИсходящиеДанные,,,, «КорректировкаЗаписейРегистров»); — Та же самая ошибка. А вообще из примера взял, в примере «Исходящие данные» задаются 3 параметром, а первый пустой.

Где вы, ять, такие примеры берете?

Типовой из КД «Перенос остатков товара» =) Запрос = Новый запрос; СтрокаТаблицы.Представление = «Остатки товаров на складах»; ИсходящиеДанные.Вставить(«Комментарий», «Перенос остатков товаров на » + Строка(ДатаВыгрузки));

В справке к КД такого нет, я гарантирую это.

Ну да, в справке по-другому. Но и если первым параметром указывать, то та же самая ошибка.

Ошибка какбе символизирует нам, что КД ожидает увидеть в неком свойстве коллекцию. А у тебя там ХЗ что.

В это некое свойство я передаю ТЗ. ТЗ не пустая однозначно. ТЗ же является коллекцией, правильно?

Рекомендую таки изучить правило под лупой. Что-то ты там делаешь не так

Вы пытаетесь передать Объект, который хотите, чтобы конвертация обошла как коллекцию, из которой выбрала Объект

протупил я, смотри в отладчике, в 7 проще чем в 8

Вообщем, получилось выгруэить все же вот так: То есть ТЗ передать 3 параметром. при этом в ПВД очистил поле «Правило конвертации».

Тэги: 1С 8

Комментарии доступны только авторизированным пользователям

Рекомендовать в новости

Гость

0

02.11.2015 — 14:36


Добрый день.
Переношу сильно дописанную Тис в не менее дописанную УТ
Выгружаю один справочник. В восьмерке есть таб часть ТОВАРЫ, в 77 есть реквизит КодыТоваров — строка, в которой лежат коды товаров.
В правилах у этого справочника создаю Группу свойств. Источник — пустой, Приемник — Товары.
Так же создаю свойство Приемник-Номенклатура
Пытаюсь выгрузить этот справочник. Получаю ошибку
«Ошибка выбора объектов коллекции»
Я в ступоре. Лезу в код обработки выгрузки. Вижу что семерка пытается получить свойство:
Объект.ТОВАРЫ — но почему она это делает???
Если убрать таблицу свойств, то справочник грузится.
Подскажите где я ступил. Уж голова кипит от этих правил.

Гость

1

02.11.2015 — 14:53

Эффект присутствия млин.
Написал вопрос. Пока ждал ответ решил опять удалить группы свойств и по новой создать.
Создал группы, создал в них свойства, прописал нужный мне код.
Вуаля, заработало. ТАк и не понял почему первый раз не заработало.

Гость

2

02.11.2015 — 19:21

Это все гребаный шайтан «Одноес Нуралиеч» дарующий иногда «ТАк и не понял почему первый раз не заработало».
И только тем, кто знаками препинания пренебрегает, блин.

Гость

3

02.11.2015 — 20:18

2-Сли то > Не нервничай.
Он россиянин, скорее всего.
А они в большинстве своем безграмотны чуть менее, чем полностью.
Радуйся просто тому, что они жи ши пишут через «и».
На тся и ться — забей вообще навсегда.
Это русские.
Не трать нервы.

В России 2 беды: тся и ться.

Написал в ПКО «Контрагенты» Перед Выгрузкой

ВходящиеДанные = СоздатьОбъект(«СписокЗначений»);
ВходящиеДанные.ДобавитьЗначение(Источник.ЮридическийАдрес, «Представление»);
ВходящиеДанные.ДобавитьЗначение(Источник.ПочтовыйАдрес, «АдресЭП»);
ВходящиеДанные.ДобавитьЗначение(Источник.Телефоны, «НомерТелефона»);

Также написал в ПКГС «Контактная информация» Перед Выгрузкой

КоллекцияОбъектов =СоздатьОбъект(«ТаблицаЗначений»);
КоллекцияОбъектов.НоваяКолонка(«Представление»);
КоллекцияОбъектов.НоваяКолонка(«АдресЭП»);
КоллекцияОбъектов.НоваяКолонка(«НомерТелефона»);
КоллекцияОбъектов.НоваяСтрока();
КоллекцияОбъектов.Представление=ВходящиеДанные.Представление;
КоллекцияОбъектов.АдресЭП=ВходящиеДанные.АдресЭП;
КоллекцияОбъектов.НомерТелефона=ВходящиеДанные.НомерТелефона;

В 7 выдает ошибки
Ошибка выбора объектов коллекции
Ошибка получения значения свойства объекта

Скажите пожалуйста, как можно решить данную проблему?

  • Ошибка выжившего или как один математик спас тысячи летчиков
  • Ошибка выберите контур огонь фотошоп
  • Ошибка вы не можете управлять заявкой т к используется другой браузер
  • Ошибка выжившего дельфины систематическая
  • Ошибка вы уже вошли на этот сервер