Ситуация: Типовой обмен между Управление торговлей 11.5 (УТ) и Бухгалтерия предприятия 3.0 (БП). Настроена выгрузка через каталог.
Задача: Необходимо выгрузить данные за несколько месяцев.
Выгрузка из УТ происходит успешна размер файла ~400МБ.
При загрузке данных в БП программа зависает и после длительного периода времени появляется ошибка загрузки данных - "Недостаточно памяти для выполнения запроса". Мощности компьютера не хватает, также упираемся в лицензию на сервер (Сервер х32). (При проверке на серверной лицензии х64 программа также зависала и по итогу отваливалась).
Поэтому было принято решение разбить данную выгрузку на порции. В стандартном режиме, это можно сделать в обработке "Регистрация изменений для обмена данными", где для каждого объекта конфигурации можно зарегистрировать изменение, но для каждого объекта конфигурации отдельно. Так как период выгрузки документов был несколько месяцев, и даже за 1 месяц выгрузка занимала ~100МБ, решил что вручную каждый раз регистрировать документы не хорошо, так как это долго и есть шанс что можно ошибиться при заполнении отбора (человеческий фактор).
Важно! Регистрация объектов происходит без стандартной проверки (Механизма регистрации объектов конфигурации).
Обработка дает возможность выбрать несколько объектов конфигурации, указать для документов отбор по периоду и зарегистрировать полученные данные в узле обмена.
Запустить обработку можно с помощью "Файл" - "Открыть".
Для работы обработки необходимо заполнить:
Тип объекта - на выбор справочники и документы;
Узел обмена - узел в плане обмена, на котором мы планируем зарегистрировать объекты;
Отбор для справочников реквизиты: Наименование, пометка удаления, ссылка на объект, для документов: Дата, номер, пометка удаления, проведен, ссылка на объект;
Таблица объектов - в зависимости от типа объекта позволяет выбрать объект конфигурации. Например, договор контрагента (справочник), заказ клиента (документ);
Таблица объектов к регистрации - объекты, которые должны быть зарегистрированы. Заполняется с помощью кнопки "Отобрать объекты", также можно заполнить вручную;
Кнопка "Отобрать объекты" - получает объекты при помощи отбора и заполняет ими табличную часть "Таблица объектов к регистрации";
Кнопка "Выполнить регистрацию" - регистрирует объекты из табличной части "Таблица объектов к регистрации" в выбранный узел обмена.
Ниже основной алгоритм обработки.
Получение текста запроса для документов:
&НаСервере
Функция ПолучитьТекстЗапросаДляДокументов()
ТекстЗапроса = "";
Порядок = 0;
Для Каждого СтрокаТаблица из ТаблицаОбъектов Цикл
Порядок = Порядок + 1;
ПолноеИмяОбъекта = СтрокаТаблица.ИмяОбъекта;
ИмяОбъекта = СтрЗаменить(СтрокаТаблица.ИмяОбъекта, ".", "");
Если ЗначениеЗаполнено(ТекстЗапроса) Тогда
ТекстЗапроса = ТекстЗапроса + "
|
|ОБЪЕДИНИТЬ ВСЕ
|
|";
КонецЕсли;
ВременныйТекстЗапроса = "ВЫБРАТЬ
| ВыгружаемыйОбъект.Ссылка КАК СсылкаНаОбъект,
| ВыгружаемыйОбъект.ПометкаУдаления КАК ПометкаУдаления,
| ВыгружаемыйОбъект.Проведен КАК Проведен,
| ВыгружаемыйОбъект.Дата КАК Дата,
| ВыгружаемыйОбъект.Номер КАК Номер,
| 1 КАК Порядок
|ПОМЕСТИТЬ ВТ_ДанныеОбъектов
|ИЗ
| &ВыгружаемыйОбъект КАК ВыгружаемыйОбъект";
Если Порядок > 1 Тогда
ВременныйТекстЗапроса = СтрЗаменить(ВременныйТекстЗапроса, "1 КАК Порядок", Формат(Порядок, "ЧГ=0"));
ВременныйТекстЗапроса = СтрЗаменить(ВременныйТекстЗапроса, "ПОМЕСТИТЬ ВТ_ДанныеОбъектов", "");
иначе
ВременныйТекстЗапроса = СтрЗаменить(ВременныйТекстЗапроса, "1 КАК Порядок", Формат(Порядок, "ЧГ=0") + " КАК Порядок");
КонецЕсли;
ВременныйТекстЗапроса = СтрЗаменить(ВременныйТекстЗапроса, "&ВыгружаемыйОбъект", ПолноеИмяОбъекта);
ВременныйТекстЗапроса = СтрЗаменить(ВременныйТекстЗапроса, "ВыгружаемыйОбъект", ИмяОбъекта);
ТекстЗапроса = ТекстЗапроса + ВременныйТекстЗапроса;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + "
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_ДанныеОбъектов.СсылкаНаОбъект КАК СсылкаНаОбъект,
| ВТ_ДанныеОбъектов.ПометкаУдаления КАК ПометкаУдаления,
| ВТ_ДанныеОбъектов.Проведен КАК Проведен,
| ВТ_ДанныеОбъектов.Дата КАК Дата,
| ВТ_ДанныеОбъектов.Номер КАК Номер,
| ВТ_ДанныеОбъектов.Порядок КАК Порядок
|ИЗ
| ВТ_ДанныеОбъектов КАК ВТ_ДанныеОбъектов
|
|УПОРЯДОЧИТЬ ПО
| Порядок";
Возврат ТекстЗапроса;
КонецФункции
Выполнение регистрации:
&НаСервере
Процедура ВыполнитьРегистрациюСервер()
Таблица = ТаблицаОбъектовКРегистрации.Выгрузить();
Таблица.Свернуть("СсылкаНаОбъект");
МассивОбъектов = Таблица.ВыгрузитьКолонку("СсылкаНаОбъект");
Попытка
ПланыОбмена.ЗарегистрироватьИзменения(Объект.УзелОбмена, МассивОбъектов);
Исключение
ВызватьИсключение ОписаниеОшибки();
КонецПопытки;
КонецПроцедуры
Обработка также содержит связь между компоновщиком настроек (Отбор на форме) для получения данных с помощью компоновщика макета компоновки данных.
Данная обработка не имеет привязки к БСП, сделана на управляемых формах (УФ).
Протестирована на УТ 11.5.12.121. Платформа: 8.3.22.2239.