(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». Описанные приемы в данной статье и в первой статье затрагивают наиболее частые нетривиальные задачи использования конвертации данных, изучив обе статьи, подобные задачи уже не будут вызывать сложностей.
Статью подготовил аналитик-эксперт по информационным системам «ИнфоСофт» Ретунский Александр.
Статья опубликована на портале ИнфоСтарт
Гость 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>ПКГС_ПередОбработкойВыгрузки_Работники_РаботникиОрганиза
Показывать по
10
20
40
сообщений
Читают тему: