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

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

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

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

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

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

|    ИЗ

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

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

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

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

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

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

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

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

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

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

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

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

    
КонецЦикла;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Тэги: 1С 8

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

  • Главная
  • Карьера
  • Блог о жизни франчайзи
  • Про 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

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

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

Гость

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 беды: тся и ться.

Показывать по
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
сообщений

Читают тему:

Понравилась статья? Поделить с друзьями:
  • Ошибка вы отключены от сервера вот блиц
  • Ошибка вольво tcm 047e
  • Ошибка в2ааа рено логан 2
  • Ошибка выбора галина осень скачать бесплатно полностью
  • Ошибка внутренняя ошибка программной оболочки check point