1с 8 правила выгрузки установить отбор программно

Обновлено: 07.07.2024

Несколько простых рекомендаций, которые могут ускорить выгрузку и загрузку данных.

Правила Выгрузки данных

1. Порядок правил выгрузки данных

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

Пример: Нужно выгрузить два справочника Пользователи и Физические лица. Справочник Пользователи имеет реквизит Физ. лицо - ссылка на справочник Физические лица. То есть справочник Пользователи ссылается на справочник Физические лица. Рекомендуемая последовательность правил выгрузки в этом случае: Физические лица, пользователи.

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

Если в правиле конвертации нет переноса табличных частей и движений, а так же в событиях перед выгрузкой нет прямых обращений к выгружаемому объекту, рекомендуется в правиле выгрузки данных использовать режим "Выбирать данные для выгрузки одним запросом". Этот режим позволит одним запросом получить все выгружаемые данные определенного типа, а не строить отдельные запросы для выгрузки каждого объекта.

Правила Конвертации объектов

3. Использовать быстрый поиск при загрузке

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

Пример: Справочник Пользователи. Практически все документы имеют ссылку на этот справочник и количество элементов справочника не превосходит 1000.

4. Не выгружать объекты свойств по ссылкам

Режим позволяет для правила конвертации объектов не выгружать все элементы на которые есть ссылки. Если режим установлен, то при выгрузке будет выгружен сам объект и информация для поиска всех его ссылок, но полная информация о зависимых элементах выгружена не будет. Эта оптимизация может в несколько раз ускорить выгрузку и загрузку данных.

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

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

6. Не делать общих обработчиков событий для всех объектов

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

Обработка "Универсальный обмен данными XML"

7. Использовать оптимизированный формат для обмена данными

8. Загружать данные в режиме обмена

Позволяет отказать от излишних проверок на этапе загрузки данных

9. Записывать только измененные объекты

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

10. Оптимизированная запись объектов

Режим позволяет резко сократить количество обращений в информационной базе для записи объектов.

11. Записывать регистры наборами записей

Режим позволяет записывать изменения в регистрах наборами записей, а не менеджерами записей.

12. Обмен данными через COM

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

2. Выгрузка

Форма выгрузки у меня выглядела следующим образом:


При изменении даты табличное поле заполняется документами за выбранную дату. Сами правила обмена были вставлены в обработку как макет с типом "Двоичные данные".

При нажатии на кнопку "Выгрузка" выполняется код:


Процедура ДействияФормыВыгрузка ( Кнопка )

ДиалогФайла = Новый ДиалогВыбораФайла ( РежимДиалогаВыбораФайла . Сохранение );
ДиалогФайла . Фильтр = "Файл данных (*.xml)|*.xml" ;
ДиалогФайла . ПолноеИмяФайла = "Retail_" + СтрЗаменить ( Формат ( Дата , "ДФ=dd.MM.yyyy" ), "." , "-" );
Если ДиалогФайла . Выбрать () Тогда
ИмяФайла = ДиалогФайла . ПолноеИмяФайла ;
Попытка
ВыгрузитьДанные ( ИмяФайла );
ДвоичныеДанные = Новый ДвоичныеДанные ( ИмяФайла );
ДвоичныеДанные . Записать ( ИмяФайла );
Исключение
Предупреждение ( "Внешний файл не сохранен
|" + ОписаниеОшибки ());
КонецПопытки;
КонецЕсли;

Сама процедура выгрузки выглядит так:


Процедура ВыгрузитьДанные ( ИмяФайлаОбмена )

Обработка = Обработки . УниверсальныйОбменДаннымиXML . Создать ();
Обработка . РежимОбмена = "Выгрузка" ;
ВремФайл = ПолучитьИмяВременногоФайла ( "xml" );
МакетПравилОбмена = ПолучитьМакет ( "ПравилаВыгрузки" );
МакетПравилОбмена . Записать ( ВремФайл );
Обработка . ИмяФайлаПравилОбмена = ВремФайл ; //ФайлПравилОбмена;
Обработка . ЗагружатьДанныеВРежимеОбмена = Истина;
Обработка . ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обработка . ЗапоминатьЗагруженныеОбъекты = Истина;
Обработка . ИспользоватьОтборПоДатеДляВсехОбъектов = Истина;
СписокДок = Новый Массив ;
Для каждого Стр Из Документы Цикл
Если НЕ Стр . Флаг Тогда
Продолжить;
КонецЕсли;
СписокДок . Добавить ( Стр . Реализация );
КонецЦикла;
Обработка . ДатаНачала = Дата ;
Обработка . ДатаОкончания = КонецДня ( Дата );
Обработка . ВыгружатьТолькоРазрешенные = Истина;
Обработка . ИмяФайлаОбмена = ИмяФайлаОбмена ;
Обработка . ТипУдаленияРегистрацииИзмененийДляУзловОбменаПослеВыгрузки = 0 ; // 0 - не снимать регистрацию, 1 - снимать регистрацию
Обработка . ЗагрузитьПравилаОбмена ();
Обработка . Параметры . Вставить ( "Документы" , СписокДок );
Обработка . ВыполнитьВыгрузку ();

Отбор по документам осуществляется с помощью параметра "Документы", описанного в правилах обмена.

3. Загрузка

А вот это форма для загрузки:


При загрузке отрабатывает следующий код:


ОбработкаОбмена = Обработки . УниверсальныйОбменДаннымиXML . Создать ();
ОбработкаОбмена . ИмяФайлаОбмена = ФайлЗагрузки ;
ОбработкаОбмена . РежимОбмена = "Загрузка" ;
ОбработкаОбмена . ОткрытьФайлЗагрузки (Истина);
ОбработкаОбмена . АрхивироватьФайл = Ложь;;
ОбработкаОбмена . ВыполнитьЗагрузку ();
ОбработкаОбмена = Неопределено;

4. Заключение

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

Казалось бы, всего лишь одна функция из арсенала разработчика правил обмена на Конвертации данных 2.1, но понимание этой функции расширяет ваши возможности при написании качественных правил обмена в несколько раз. Да, что там писать эти правила? Сопоставил реквизиты, сопоставил табличные части, да еще помощник автоматически создаст необходимые ПКО, ПКС, ПВД. А как быть, когда нужно передать Регистр сведений в регистр сведений, да не просто передать, а привязать это действие к выгрузке определенных элементов, например, элементов справочника Физические лица? Или как передать табличную часть справочника в документы, да так, чтобы одна строка табличной части создавала ровно один документ на стороне приемника? А как быть, если невозможно сделать соответствия между объектами и данные для приемника необходимо собирать из разных источников? Именно для подобных задач вам может понадобиться функция ВыгрузитьПоПравилу.

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

Описание функции ВыгрузитьПоПравилу().

Функция ВыгрузитьПоПравилу() используется для выгрузки объекта в xml-узел и возвращает узел ссылки на этот объект.

В процессе выгрузки эта функция вызывается из :

ПВД, когда объект из выборки получен и необходимо произвести его конвертацию.

ПКО, когда необходимо выгрузить связанную с выгружаемым объектом информацию.

ПКС, когда свойство имеет ссылочный тип и необходимо выгрузить по ссылке из этого свойства объект.

Из функции ВыгрузитьПоПравилу() могут быть вызваны другие функции, выгружающие субконто, свойства и т.д. этого объекта, а из этих функций – рекурсивно может быть вызвана функция ВыгрузитьПоПравилу(). После того, как объект со всеми необходимыми свойствами выгружен, управление возвращается в то место кода, откуда функция была вызвана . Таким образом, вызов этой функции из обработчиков событий какого-либо правила (ПВД, ПКО, ПКС), не изменяет процесса выгрузки объекта по этому правилу.

Функция ВыгрузитьПоПравилу() имеет ряд параметров

Выгрузка произвольной выборки данных через стандартную выборку с регистрацией объекта источника.

Необходимость в такой задаче может возникнуть, когда объект "источника" и объект "приемника" имеют различную смысловую или функциональную структуру .

Например, документ "источника" позволяет вводить информацию по нескольким подразделениям предприятия, документ "приемника" позволяет вводить информацию только об одном подразделении предприятия.

Данная задача отлично решается при помощи произвольного алгоритма выборки в ПВД, но данное решение имеет два недостатка:

  1. Мы лишаемся механизма регистрации изменений;
  2. Алгоритм произвольной выборки отказывается работать в БСП.

БСП - библиотека стандартных подсистем. В частности, имеет своем составе подсистему "Обмен данными", данная подсистема реализует механизмы автоматической синхронизации данных между конфигурациями, по правилам написанным в Конвертации данных.

  1. Создаем ПВД со Стандартным алгоритмом выборки;
  2. Указываем объект выборки;
  3. Пишем обработчик "Перед выгрузкой"(хочу подчеркнуть, что нужно использовать именно этот обработчик). Например, следующего содержания:


Большую часть этого обработчика, как вы можете видеть, занимает отбор данных необходимых для выгрузки. Тут и множество фильтров: по подразделениям, по видам расчетов и механизм разбиения одного документа "источника" на несколько документов "приемника". Если коротко, то в данном примере табличная часть одного документа "источника" разносится по табличным частям нескольких документов "приемника", а значением разбиения данных является значение Подразделения.

Для удобства работы при отборе данных мы использовали Таблицу значений, наш алгоритм подразумевает ПКО с получением данных из "входящих данных", которые будут переданы в функцию ВыгрузитьПоПравилу, поэтому в соответсвующем алгоритме мы производим перевод Таблицы значений в Массив структур.

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

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

Тем самым мы сохраняем функциональность регистрации изменений - документ изменился, зарегистрировался для выгрузки, данные выгрузили. И в то же время делаем произвольный отбор необходимых нам данных.



Выгрузка Регистр сведений -> Регистр сведений с зависимостью от переноса другого объекта.

Типичным примером такой задачи является перенос контактной информации физического лица. Простейший способ решения задачи - это перенос всех "Физических лиц" и всего регистра сведений "Контактная информация" физических лиц. Что делать если нам необходимо переносить не всех физических лиц? Например, только тех физических лиц, которые упоминаются в каком-либо переносимом нами документе. В таком случае, как известно, ПКС документа вызывает ПКО справочника "Физические лица" и тем самым обеспечивается перенос физических лиц упоминаемых в документе.

В переносе "Контактной информации" физических лиц в данной ситуации может помочь функция ВыгрузитьРегистр, очень похожая на функцию ВыгрузитьПоПравилу.

Хочу отметить, что потребность в использовании функции ВыгрузитьРегистр у меня появилась, когда я начал адаптировать правила под БСП уже отлаженные на обработке Универсальный обмен XML. Регистры через обработку спокойно выгружались с использованием функции ВыгрузитьПоПравилу, но БСП ни как не хотело правильно понимать такую выгрузку, в результате чего пришлось переписывать код через ВыгрузитьРегистр.

В обработчике"После выгрузки в файл" ПКО "Физические лица", пишем код следующего вида:


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

Для того, чтобы выгрузить записи регистра сведений через функцию ВыгрузитьРегистр, необходимо подготовить структуру НаборЗаписей, которая имеет два поля: Отбор и Строки.

ПКО "КонтактнаяИнформация" имеет следующий вид:


Выгрузка Табличная часть -> Регистр сведений.

По своему решению задача аналогична предыдущей. С той лишь разницей, что информацию для регистра сведений "приемника" брать придется из других объектов "источника", а точнее табличной части того объекта, который на данный момент выгружается. Если бы на стороне "приемника" была так же табличная часть, то задача легко решалась бы в виде ПГКС. Поэтому снова воспользуемся функцией ВыгрузитьРегистр.

Рассмотрим пример переноса информации по ученым степеням Физического лица. Опять создаем код в обработчике "После выгрузки в файл" ПКО "Физические лица". Так как задача аналогичная предыдущей привожу только, код отбора и выгрузки данных из обработчика:

Выгрузка Табличная часть -> Документ.

Предположим, в "источнике" информация для переноса хранится в менее детализированном виде, чем в приемнике, но достаточном для переноса. Например, мной решалась задача по переносу информации об образовании физических лиц из ЗиКБУ в Университет. Понятно, что на стороне кадровой программы нужна минимальная информация об образовании физических лиц, главное что сотрудник обладает необходимой квалификацией и хватит. А вот на стороне университета, информация об образовании, а точнее о дипломах хранится куда более подробно, в связи со спецификой учереждения.

И опять задача решается, при помощи все той же функции ВыгрузитьПоПравилу.

Вот пример выгрузки Дипломов физических лиц. Все тот же обработчик "После выгрузки в файл" ПКО "Физические лица", пишем следующий код:


В общем, как вы понимаете, можно приводить еще много вариаций перегрузок: справочники, документы, регистры. Главное, надо понимать, что не стоит фанатично бросаться на функции ВыгрузитьПоПравилу и ВыгрузитьРегистр.

Замечания по перегрузке.

1. У меня возникли сложности при использовании правил в БСП, в части выгрузки объектов по ссылкам, проблема решилась принудительной установкой параметра ВыгрузитьОбъект в значение Истина, для каждого ПКС ссылочного типа:


Подводим итоги. Когда использовать эти функции?

  1. Вам необходимо перегрузить объекты с сильно различной структурой или на стороне "источника" необходимо собирать объекты для выгрузки из разных объектов.
  2. Вам необходимо перегружать объекты с привязкой к выгрузке других объектов.

UPDATE от 11.11.2015

А что если оптимизировать выше написанное?

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

Описываю алгоритм предложенный вышеуказанным пользователем:

1. В правиле конвертации "После загрузки правил обмена", создается параметр типа ТаблицаЗначений, в который будет накапливаться список объектов, для которых в последующем будет выгружаться информация:


2. В в обработчике "После выгрузки" ПКО "Физические лица" (именно для них в примерах мы выгружаем контактные данные, образование и т.п.), мы пополняем нашу таблицу значений новым физическим лицом, проверяя перед этим, а не добавлено ли уже это физическое лицо в таблицу:


3. И финальным действием, будет непосредственная выгрузка информации, только уже с отбором по все физическим лицам сразу. Для этого все обработчики, что были приведены выше начиная, необходимо перенести в правило конвертации "После выгрузки данных", запросы же необходимо изменить, чтобы в них проверялось не равенство одному элементу, а вхождение значения реквизита в массив элементов:


Обратите внимание, как изменилась установка параметра запроса и проверка условия в запросе:

Для выгрузки данных недостаточно установить соответствия объектов и реквизитов источника и приемника. Нужно еще указать какие именно объекты и как выгружать. Для этого необходимо создать правила выгрузки данных. У нас готовы все необходимы правила конвертации объектов, свойств и значений. Практически все уже сделано, осталось только указать какие именно объекты мы хотим переносить из информационной базы источника в приемник. На первый взгляд постановка вопроса очень странная, естественно, мы хотим переносить все объекты для которых у нас заданы правила конвертации объектов!? Но это не совсем верный ответ. При обмене данными всегда ставится задача обмена конкретными объектами. Кроме того, существуют служебные объекты, о которых пользователи не догадываются, да и не должны знать.

Правила выгрузки данными указывают какие объекты разрешить пользователю для выгрузки.

Проще всего объяснить это на конкретном примере. Сформулируем задачу: Имеются две однотипные конфигурации "Бухгалтерия предприятия". Необходимо из одной конфигурации в другую загрузить справочник "Номенклатура".

Покажем последовательность действий в этом случае:

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

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

Если в правиле конвертации объектов нет конвертации табличных частей или движений и в событиях перед выгрузкой данных нет обращений к самому выгружаемому объекту, то имеет смысл установить у правила Выгрузки данных Флажок "Выбирать данные для выгрузки одним запросом". Такой подход позволит при выгрузке данных одним запросом получить все данные, которые нужно выгружать и это может заметно сократить время выгрузки.

Эти достаточно просты оптимизации позволяют сократить время выгрузки данных на 30-40 (. ) % и более!

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

Читайте также: