Очень захотелось возможности загружать данные в документ "Перенос данных" через эту универсальную обработку, т.е. запись в регистры сведений, накопления и расчета, поэтому на скорую руку, без особой оптимизации, вот небольшой пример этой доработки.
(Можно и вовсе добавить запись в движения всех документов самому или скачать уже готовые решения других авторов с такой возможностью, но статья не об этом.)
По пунктам нарисую добаление нужных реквизитов и кода для этого.
1. Сначала добавим 2 вспомогательных реквизита, "ДвиженияТабличнойЧастиИсточника" как реквизит объекта, и "ЭтоЗаписьДвижений" как реквизит формы, см. скрины ниже.
2. Перетащим на форму реквизит объекта "ДвиженияТабличнойЧастиИсточника" в группу загрузки в табл. часть, а также у этого элемента формы установим галочку в свойствах "РежимВыбораИзСписка".
3. Создадим событие ПриИзменении для этого элемента
4. Добавляем код в созданное событие "ДвиженияТабличнойЧастиИсточникаПриИзменении"
&НаКлиенте
Процедура ДвиженияТабличнойЧастиИсточникаПриИзменении(Элемент)
// Вставить содержимое обработчика.
УстановитьИсточник();
УправлениеВидимостью();
КонецПроцедуры
5. Добавим дополнительный код в обработчик при изменении режима загрузки
&НаКлиенте
Процедура РежимЗагрузкиПриИзменении(Элемент)
Объект.ТипОбъектаСправочника = Неопределено;
Объект.СсылкаИсточника = Неопределено;
Объект.ИмяВидаРегистра = Неопределено;
Объект.ТабличнаяЧастьИсточника = Неопределено;
//
Объект.ДвиженияТабличнойЧастиИсточника = Неопределено;
//
УстановитьСписокТабличныхЧастей();
УстановитьИсточник();
УправлениеВидимостью();
КонецПроцедуры
6. Добавим дополнительный код в обработчик при изменении ссылки источника
&НаКлиенте
Процедура СсылкаИсточникаПриИзменении(Элемент)
УстановитьСписокТабличныхЧастей();
//
Объект.ДвиженияТабличнойЧастиИсточника = Неопределено;
Если ЗначениеЗаполнено(Объект.ТабличнаяЧастьИсточника) Тогда
УстановитьИсточникДвиженийТабличнойЧасти();
КонецЕсли;
//
УстановитьИсточник();
КонецПроцедуры
//
&НаКлиенте
Процедура УстановитьИсточникДвиженийТабличнойЧасти()
ЭтоЗаписьДвижений = Ложь;
Если ТипЗнч(Объект.СсылкаИсточника) = Тип("ДокументСсылка.ПереносДанных") Тогда
Если Объект.ТабличнаяЧастьИсточника = "ТаблицаРегистров" Тогда
ЭтоЗаписьДвижений = Истина;
КонецЕсли;
КонецЕсли;
Если ЭтоЗаписьДвижений Тогда
УстановитьСписокДвиженийПереносаДанных();
Если Элементы.ДвиженияТабличнойЧастиИсточника.СписокВыбора.Количество() > 0 Тогда
Объект.ДвиженияТабличнойЧастиИсточника = Элементы.ДвиженияТабличнойЧастиИсточника.СписокВыбора[0];
Иначе
Возврат;
КонецЕсли;
Иначе
Элементы.ДвиженияТабличнойЧастиИсточника.СписокВыбора.Очистить();
Объект.ДвиженияТабличнойЧастиИсточника = Неопределено;
КонецЕсли;
КонецПроцедуры
//
7. Добавим дополнительный код в обработчик при изменении табличной части источника,
&НаКлиенте
Процедура ТабличнаяЧастьИсточникаПриИзменении(Элемент)
//
УстановитьИсточникДвиженийТабличнойЧасти();
//
УстановитьИсточник();
УправлениеВидимостью();
КонецПроцедуры
а также процедура заполнения источника списком доступных движений
//
&НаСервере
Процедура УстановитьСписокДвиженийПереносаДанных()
СписокВыбора = Элементы.ДвиженияТабличнойЧастиИсточника.СписокВыбора;
СписокВыбора.Очистить();
Если Объект.СсылкаИсточника = Неопределено Тогда
Возврат;
КонецЕсли;
Если Не ЭтоЗаписьДвижений Тогда
Возврат;
КонецЕсли;
// тут читать из источника
МассивВидовРегистров = Новый Массив;
МассивВидовРегистров.Добавить("РегистрСведений");
МассивВидовРегистров.Добавить("РегистрНакопления");
МассивВидовРегистров.Добавить("РегистрРасчета");
//МассивВидовРегистров.Добавить("РегистрБухгалтерии");
Для Каждого Движения Из Объект.СсылкаИсточника.ТаблицаРегистров Цикл
Для Каждого Регистр Из МассивВидовРегистров Цикл
ОМ = Метаданные.НайтиПоПолномуИмени(Регистр + "."+ Движения.Имя);
Если ОМ <> Неопределено Тогда
СписокВыбора.Добавить(ОМ.ПолноеИмя(), ОМ.ПолноеИмя());
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//
8. Добавим дополнительный код в процедуру "ЗаполнитьНастройкиКолонокТабличнойЧасти"
&НаСервере
Процедура ЗаполнитьНастройкиКолонокТабличнойЧасти(ТЗ)
МетаданныеИсточника = ПолучитьМетаданныеИсточника();
Если МетаданныеИсточника = Неопределено Тогда
Возврат;
КонецЕсли;
Для каждого Реквизит Из МетаданныеИсточника.Реквизиты Цикл
ЗагружаемыйРеквизит = ТЗ.Добавить();
ЗагружаемыйРеквизит.ИмяРеквизита = Реквизит.Имя;
ЗагружаемыйРеквизит.ПредставлениеРеквизита = Реквизит.Представление();
ЗагружаемыйРеквизит.ОписаниеТипов = МетаданныеИсточника.Реквизиты[ЗагружаемыйРеквизит.ИмяРеквизита].Тип;
КонецЦикла;
//++
Если ЭтоЗаписьДвижений Тогда
ТЗ.Очистить();
МенеджерРегистра = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(Объект.ДвиженияТабличнойЧастиИсточника);
МетаданныеРегистра = Метаданные.НайтиПоПолномуИмени(Объект.ДвиженияТабличнойЧастиИсточника);
ТаблицаРегистра = МенеджерРегистра.СоздатьНаборЗаписей().ВыгрузитьКолонки();
ТаблицаРегистра.Колонки.Удалить("Регистратор");
ТаблицаРегистра.Колонки.Удалить("НомерСтроки");
Если ТаблицаРегистра.Колонки.Найти("МоментВремени") <> Неопределено Тогда
ТаблицаРегистра.Колонки.Удалить("МоментВремени");
КонецЕсли;
// Исключить из регистра расчета "ПериодДействия" и "ФактическийПериодДействия", они заполняются автоматически.
Если Метаданные.РегистрыРасчета.Содержит(МетаданныеРегистра) Тогда
Если ТаблицаРегистра.Колонки.Найти("ПериодДействия") <> Неопределено Тогда
ТаблицаРегистра.Колонки.Удалить("ПериодДействия");
КонецЕсли;
Если ТаблицаРегистра.Колонки.Найти("ФактическийПериодДействия ") <> Неопределено Тогда
ТаблицаРегистра.Колонки.Удалить("ФактическийПериодДействия ");
КонецЕсли;
КонецЕсли;
МассивКолонок = Новый Массив;
Для Каждого Колонка Из ТаблицаРегистра.Колонки Цикл
ИнформацияОКолонке = Новый Структура("ИмяРеквизита,ПредставлениеРеквизита,ОписаниеТипов",
Колонка.Имя, Колонка.Заголовок, Колонка.ТипЗначения);
МассивКолонок.Добавить(ИнформацияОКолонке);
КонецЦикла;
// Обновление заголовков колонок таблицы по синонимам полей регистра.
МассивПолейРегистра = Новый Массив;
МассивПолейРегистра.Добавить("Измерения");
МассивПолейРегистра.Добавить("Ресурсы");
МассивПолейРегистра.Добавить("Реквизиты");
Для Каждого ВидПоля Из МассивПолейРегистра Цикл
Для Каждого Поле Из МетаданныеРегистра[ВидПоля] Цикл
Для Каждого ЭлементМассива Из МассивКолонок Цикл
Если ЭлементМассива.ИмяРеквизита = Поле.Имя Тогда
ЭлементМассива.ПредставлениеРеквизита = Поле.Синоним;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
Для Каждого Реквизит Из МассивКолонок Цикл
ЗаполнитьЗначенияСвойств(ТЗ.Добавить(), Реквизит);
КонецЦикла;
КонецЕсли;
//
Для каждого ЗагружаемыйРеквизит Из ТЗ Цикл
СписокВыбора = ПолучитьСписокИменПредставлений(ЗагружаемыйРеквизит.ОписаниеТипов);
ЗагружаемыйРеквизит.ИскатьПо = ?(СписокВыбора.Количество() = 0, "",СписокВыбора[0].Значение);
СписокВыбора = ПолучитьСписокСвязейПоВладельцу(ЗагружаемыйРеквизит.ОписаниеТипов, ТЗ);
ЗагружаемыйРеквизит.СвязьПоВладельцу = ?(СписокВыбора.Количество() = 0, "",СписокВыбора[0].Значение);
СписокВыбора = ПолучитьСписокСвязейПоТипу(ЗагружаемыйРеквизит, ТЗ);
Если СписокВыбора.Количество() = 0 Тогда
ЗагружаемыйРеквизит.СвязьПоТипу = "";
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 0;
Иначе
ЗагружаемыйРеквизит.СвязьПоТипу = СписокВыбора[0].Значение;
Если Найти(ЗагружаемыйРеквизит.ИмяРеквизита,"3") <> 0 Тогда
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 3;
ИначеЕсли Найти(ЗагружаемыйРеквизит.ИмяРеквизита,"2") <> 0 Тогда
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 2;
Иначе
ЗагружаемыйРеквизит.ЭлементСвязиПоТипу = 1;
КонецЕсли;
КонецЕсли;
ЗагружаемыйРеквизит.ЗначениеПоУмолчанию = ЗагружаемыйРеквизит.ОписаниеТипов.ПривестиЗначение(Неопределено);
ЗагружаемыйРеквизит.ДоступныеТипы = ЗагружаемыйРеквизит.ОписаниеТипов;
ЗагружаемыйРеквизит.РежимЗагрузки = "Искать";
КонецЦикла;
КонецПроцедуры // ()
9. Добавим дополнительный код в процедуру "ОбновитьДанныеТабличногоДокументаСервер"
&НаСервере
Процедура ОбновитьДанныеТабличногоДокументаСервер()
ТабличныйДокумент.Очистить();
СформироватьСтруктуруКолонок();
СформироватьШапкуТабличногоДокумента(ТабличныйДокумент);
НомерСтроки = Объект.ПерваяСтрокаДанныхТабличногоДокумента;
МетаданныеИсточника = ПолучитьМетаданныеИсточника();
Если Объект.РежимЗагрузки =0 или Объект.РежимЗагрузки =2 или МетаданныеИсточника = Неопределено Тогда
Возврат;
КонецЕсли;
Источник = Объект.СсылкаИсточника[Объект.ТабличнаяЧастьИсточника];
//
Если ЭтоЗаписьДвижений Тогда
// изменить источник на Объект.ДвиженияТабличнойЧастиИсточника
ИмяДвижения = Метаданные.НайтиПоПолномуИмени(Объект.ДвиженияТабличнойЧастиИсточника).Имя;
СсылкаОбъект = Объект.СсылкаИсточника.ПолучитьОбъект();
Набор = СсылкаОбъект.Движения[ИмяДвижения];
Набор.Прочитать();
Источник = Набор.Выгрузить();
КонецЕсли;
//
//ТЗ = РеквизитФормыВЗначение("ТаблицаЗагружаемыхРеквизитов");
Для каждого Строка Из Источник Цикл
НомерКолонки = 0;
Для каждого ЗагружаемыйРеквизит Из ТаблицаЗагружаемыхРеквизитов Цикл
Если ЗагружаемыйРеквизит.Пометка Тогда
Если Объект.РучнаяНумерацияКолонокТабличногоДокумента Тогда
НомерКолонки = ЗагружаемыйРеквизит.НомерКолонки;
Иначе
НомерКолонки = НомерКолонки + 1;
КонецЕсли;
Область = ТабличныйДокумент.Область("R" + Формат(НомерСтроки, "ЧГ=") + "C"+НомерКолонки);
Значение = Строка[ЗагружаемыйРеквизит.ИмяРеквизита];
Попытка
Представление = Значение[ЗагружаемыйРеквизит.ИскатьПо];
Исключение
Представление = Значение;
КонецПопытки;
Область.Текст = Представление;
Область.Расшифровка = Значение;
КонецЕсли;
КонецЦикла;
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
КонецПроцедуры // ОбновитьДанныеТабличногоДокументаСервер()
10. Добавим дополнительный код в функцию "ЗагрузитьДанныеСервер()" (3 фрагмента)
&НаСервере
Функция ЗагрузитьДанныеСервер()
ЗаписыватьОбъект = истина;
СформироватьСтруктуруКолонок();
МетаданныеИсточника = ПолучитьМетаданныеИсточника();
Колонки = Объект.ДополнительныеСвойства.Колонки;
Если Объект.РежимЗагрузки = 0 Тогда
Источник = Справочники[Объект.ТипОбъектаСправочника].ПустаяСсылка();
ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
ОбъектИсточника = Объект.СсылкаИсточника.ПолучитьОбъект();
Источник = ОбъектИсточника[Объект.ТабличнаяЧастьИсточника];
// вместо источника табличной части, нужно наборзаписей регистра
Если ЭтоЗаписьДвижений Тогда
ИмяДвижения = Метаданные.НайтиПоПолномуИмени(Объект.ДвиженияТабличнойЧастиИсточника).Имя;
СсылкаОбъект = Объект.СсылкаИсточника.ПолучитьОбъект();
Набор = СсылкаОбъект.Движения[ИмяДвижения];
Набор.Прочитать();
Источник = Набор;
КонецЕсли;
//
КонецЕсли;
ТекстВопросаИсточника = ПолучитьТекстВопросаИсточника().ТекстВопроса;
КоличествоЭлементов = ТабличныйДокумент.ВысотаТаблицы - Объект.ПерваяСтрокаДанныхТабличногоДокумента + 1;
Запрос = Неопределено;
Если Объект.РежимЗагрузки = 0 Тогда
СтрокиПоиска = ТаблицаЗагружаемыхРеквизитов.НайтиСтроки(Новый Структура("ПолеПоиска,Пометка",Истина,Истина));
Если Не СтрокиПоиска.Количество() = 0 Тогда
ТекстЗапроса =
"Выбрать Первые 1
|Справочник.Ссылка КАК Ссылка
|Из Справочник."+МетаданныеИсточника.Имя+" КАК Справочник
|Где";
Для каждого СтрокаПоиска Из СтрокиПоиска Цикл
ТекстЗапроса = ТекстЗапроса +"
|Справочник."+СтрокаПоиска.ИмяРеквизита+" = &" + СтрокаПоиска.ИмяРеквизита + "
|И";
КонецЦикла;
ТекстЗапроса = Лев(ТекстЗапроса,СтрДлина(ТекстЗапроса) - 2);
Запрос = Новый Запрос (ТекстЗапроса);
КонецЕсли;
ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
Источник.Очистить();
ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
ИзмеренияРегистра = Новый Структура;
Для каждого Колонка Из Колонки Цикл
Если Колонка.Значение.МожетБытьПолемПоиска Тогда
ИзмеренияРегистра.Вставить(Колонка.Ключ,Колонка.Значение);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Сообщить("Выполняется загрузка"+ ТекстВопросаИсточника, СтатусСообщения.Информация);
Сообщить("Всего: " + КоличествоЭлементов, СтатусСообщения.Информация);
Сообщить("---------------------------------------------", СтатусСообщения.БезСтатуса);
НомерТекущейСтроки = 0;
Загружено = 0;
Для К = Объект.ПерваяСтрокаДанныхТабличногоДокумента По ТабличныйДокумент.ВысотаТаблицы Цикл
НомерТекущейСтроки = НомерТекущейСтроки + 1;
ТекстыЯчеек = Неопределено;
Отказ = Ложь;
ТекущаяСтрока = КонтрольЗаполненияСтроки(ТабличныйДокумент, К, ТекстыЯчеек);
Если Объект.РежимЗагрузки =0 Тогда
ЗагружаемыйОбъект = Неопределено;
Если Не Запрос = Неопределено Тогда
СтрокаОшибок = "";
Для каждого СтрокаПоиска Из СтрокиПоиска Цикл
ЗначениеРеквизита = Неопределено;
ТекущаяСтрока.Свойство(СтрокаПоиска.ИмяРеквизита,ЗначениеРеквизита);
Если ПустаяСтрока(ЗначениеРеквизита) Тогда
СтрокаОшибок = ?(ПустаяСтрока(СтрокаОшибок),"",СтрокаОшибок + ", ") + СтрокаПоиска.ПредставлениеРеквизита;
Иначе
Запрос.УстановитьПараметр(СтрокаПоиска.ИмяРеквизита,ТекущаяСтрока[СтрокаПоиска.ИмяРеквизита]);
КонецЕсли;
КонецЦикла;
Если Не ПустаяСтрока(СтрокаОшибок) Тогда
Сообщить("Строка " + НомерТекущейСтроки + " не может быть записана.Не указано значение ключевых реквизитов: " + СтрокаОшибок,СтатусСообщения.Важное);
Продолжить;
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЗагружаемыйОбъект = Выборка.Ссылка.ПолучитьОбъект();
КонецЕсли;
КонецЕсли;
ОбъектНайден = Не ЗагружаемыйОбъект = Неопределено;
Если Не ОбъектНайден Тогда
Если Объект.НеСоздаватьНовыхЭлементов Тогда
Продолжить;
Иначе
ЗагружаемыйОбъект = Справочники[МетаданныеИсточника.Имя].СоздатьЭлемент();
КонецЕсли;
КонецЕсли;
ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
ЗагружаемыйОбъект = Источник.Добавить();
//
Если ЭтоЗаписьДвижений Тогда
ЗагружаемыйОбъект.Регистратор = Объект.СсылкаИсточника;
КонецЕсли;
//
ОбъектНайден = Ложь;
ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
ЗагружаемыйОбъект = РегистрыСведений[МетаданныеИсточника.Имя].СоздатьМенеджерЗаписи();
Для каждого КлючИЗначение Из ТекущаяСтрока Цикл
Если ИзмеренияРегистра.Свойство(КлючИЗначение.Ключ) Тогда
ЗагружаемыйОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
КонецЕсли;
КонецЦикла;
Если Не Объект.ЗамещатьСуществующиеЗаписи Тогда
ЗагружаемыйОбъект.Прочитать();
ОбъектНайден = ЗагружаемыйОбъект.Выбран();
Иначе
ОбъектНайден = Ложь;
КонецЕсли;
КонецЕсли;
Для каждого КлючИЗначение Из ТекущаяСтрока Цикл
Если Не ОбъектНайден или Колонки[КлючИЗначение.Ключ].Пометка Тогда
Попытка
ЗагружаемыйОбъект[КлючИЗначение.Ключ] = КлючИЗначение.Значение;
Исключение
мСообщитьОбОшибке("Ошибка при установки значения реквизита """ + КлючИЗначение.Ключ + "" + ОписаниеОшибки());
Отказ = Истина;
Прервать;
КонецПопытки;
КонецЕсли;
КонецЦикла;
Если Объект.РежимЗагрузки = 0 Тогда
Если Не Отказ и ЗаписатьОбъект(ЗагружаемыйОбъект, ТекстыЯчеек, Объект.ПередЗаписьюОбъекта, Объект.ПриЗаписиОбъекта) Тогда
Сообщить(?(ОбъектНайден,"Изменен","Загружен") + " элемент справочника: " + ЗагружаемыйОбъект.Ссылка, СтатусСообщения.Информация);
Загружено = Загружено + 1;
Иначе
Сообщить("Объект не " + ?(ОбъектНайден,"изменен","загружен") + ". Элемент справочника: " + ЗагружаемыйОбъект + ".", СтатусСообщения.Важное);
КонецЕсли;
ИначеЕсли Объект.РежимЗагрузки = 1 Тогда
Если Не ОбработатьСобытиеПослеДобавленияСтроки(ОбъектИсточника, ЗагружаемыйОбъект, ТекстыЯчеек, Объект.ПослеДобавленияСтроки) Тогда
Отказ = Истина;
КонецЕсли;
Если Не Отказ Тогда
Сообщить("Добавлена строка: " + (Загружено + 1));
Иначе
Сообщить("При добавлении строки " + (Загружено + 1) + " возникли ошибки. ");
ЗаписыватьОбъект = Ложь;
КонецЕсли;
Загружено = Загружено + 1;
ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
Если Не Отказ и ЗаписатьОбъект(ЗагружаемыйОбъект, ТекстыЯчеек, Объект.ПередЗаписьюОбъекта, Объект.ПриЗаписиОбъекта) Тогда
Сообщить(?(ОбъектНайден,"Изменена","Добавлена") + " запись № " + НомерТекущейСтроки + ".");
Загружено = Загружено + 1;
Иначе
Сообщить("Запись не " + ?(ОбъектНайден,"изменена","загружена") + ". № записи: " + НомерТекущейСтроки + ".", СтатусСообщения.Важное);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Сообщить("---------------------------------------------", СтатусСообщения.БезСтатуса);
Если Объект.РежимЗагрузки = 1 Тогда
//
Если ЗаписыватьОбъект И ЭтоЗаписьДвижений Тогда
Источник.Записать();
Сообщить("" +Загружено +" из "+ КоличествоЭлементов + " элементов.", СтатусСообщения.Информация);
Возврат Истина;
КонецЕсли;
//
Если ЗаписыватьОбъект и ЗаписатьОбъект(ОбъектИсточника, "", Объект.ПередЗаписьюОбъекта, Объект.ПриЗаписиОбъекта) Тогда
Сообщить("Выполнена загрузка"+ ТекстВопросаИсточника, СтатусСообщения.Информация);
Сообщить("" +Загружено +" из "+ КоличествоЭлементов + " элементов.", СтатусСообщения.Информация);
Возврат Истина;
Иначе
Сообщить("Объект не записан: " + ЗагружаемыйОбъект + ".", СтатусСообщения.Важное);
Возврат Ложь;
КонецЕсли;
ИначеЕсли Объект.РежимЗагрузки = 0 Тогда
Сообщить("Выполнена загрузка"+ ТекстВопросаИсточника, СтатусСообщения.Информация);
Сообщить("" +Загружено +" из "+ КоличествоЭлементов + " элементов.", СтатусСообщения.Информация);
Возврат Истина;
ИначеЕсли Объект.РежимЗагрузки = 2 Тогда
Сообщить("Выполнена загрузка"+ ТекстВопросаИсточника, СтатусСообщения.Информация);
Сообщить("" +Загружено +" из "+ КоличествоЭлементов + " записей.", СтатусСообщения.Информация);
Возврат Истина;
КонецЕсли;
КонецФункции // ()
11. Добавим дополнительный код в функцию "ПолучитьВозможныеЗначения"
&НаСервере
Функция ПолучитьВозможныеЗначения(Колонка, Представление, Примечание, ТекущиеДанные)
Примечание = "";
НайденныеЗначения = Новый Массив;
Если ПустаяСтрока(Представление) Тогда
Возврат НайденныеЗначения;
Иначе
СвязьПоТипу = Неопределено;
Если Не ПустаяСтрока(Колонка.СвязьПоТипу) Тогда
Если ТипЗНЧ(Колонка.СвязьПоТипу) = Тип("Строка") Тогда
ТекущиеДанные.Свойство(Колонка.СвязьПоТипу,СвязьПоТипу);
Иначе
СвязьПоТипу = Колонка.СвязьПоТипу;
КонецЕсли;
Если Не СвязьПоТипу = Неопределено Тогда
ЭлементСвязиПоТипу = Колонка.ЭлементСвязиПоТипу;
Если ЭлементСвязиПоТипу = 0 Тогда
ЭлементСвязиПоТипу = 1;
КонецЕсли;
ВидыСубконто = СвязьПоТипу.ВидыСубконто;
Если ЭлементСвязиПоТипу > ВидыСубконто.Количество() Тогда
Возврат НайденныеЗначения;
КонецЕсли;
Тип = СвязьПоТипу.ВидыСубконто[ЭлементСвязиПоТипу-1].ВидСубконто.ТипЗначения;
Иначе
Тип = Колонка.ОписаниеТипов;
КонецЕсли;
Иначе
Тип = Колонка.ОписаниеТипов;
КонецЕсли;
КонецЕсли;
ПримитивныеТипы = Новый Структура ("Число, Строка, Дата, Булево", Тип("Число"), Тип("Строка"), Тип("Дата"), Тип("Булево"));
Для каждого ТипРеквизита Из Тип.Типы() Цикл
Если ТипРеквизита = ПримитивныеТипы.Число Или ТипРеквизита = ПримитивныеТипы.Булево Тогда
НайденныеЗначения.Добавить(мПривестиКЧислу(Представление, Колонка.ОписаниеТипов, Примечание));
ИначеЕсли ТипРеквизита = ПримитивныеТипы.Строка или ТипРеквизита = ПримитивныеТипы.Дата Тогда
НайденныеЗначения.Добавить(мПривестиКДате(Представление, Колонка.ОписаниеТипов, Примечание));
Иначе
МетаданныеТипа = Метаданные.НайтиПоТипу(ТипРеквизита);
Если Перечисления.ТипВсеСсылки().СодержитТип(ТипРеквизита) // Тогда
// добавим некоторые системные перечисления
Или Тип("ВидДвиженияНакопления") = ТипРеквизита
Или Тип("ВидДвиженияБухгалтерии") = ТипРеквизита
Или Тип("ВидПериодаРегистраРасчета") = ТипРеквизита
Или Тип("ВидСчета") = ТипРеквизита Тогда
Если Тип("ВидДвиженияНакопления") = ТипРеквизита Тогда
НайденныеЗначения.Добавить(ВидДвиженияНакопления[Представление]);
Продолжить;
КонецЕсли;
Если Тип("ВидДвиженияБухгалтерии") = ТипРеквизита Тогда
НайденныеЗначения.Добавить(ВидДвиженияБухгалтерии[Представление]);
Продолжить;
КонецЕсли;
Если Тип("ВидПериодаРегистраРасчета") = ТипРеквизита Тогда
НайденныеЗначения.Добавить(ВидПериодаРегистраРасчета[Представление]);
Продолжить;
КонецЕсли;
Если Тип("ВидСчета") = ТипРеквизита Тогда
НайденныеЗначения.Добавить(ВидСчета[Представление]);
Продолжить;
КонецЕсли;
//
//Это Перечисление
Для каждого Перечисление Из ПолучитьМенеджераПоТипу(ТипРеквизита) Цикл
Если Строка(Перечисление) = Представление Тогда
НайденныеЗначения.Добавить(Перечисление);
КонецЕсли;
КонецЦикла;
ИначеЕсли Документы.ТипВсеСсылки().СодержитТип(ТипРеквизита) Тогда
//Это документ
Менеджер = ПолучитьМенеджераПоТипу(ТипРеквизита);
Если Колонка.ИскатьПо = "Номер" Тогда
//НайденноеЗначение = Менеджер.НайтиПоКоду(Представление);
ИначеЕсли Колонка.ИскатьПо = "Дата" Тогда
//НайденноеЗначение = Менеджер.Найти
Иначе
ДлиннаСинонима = СтрДлина(""+МетаданныеТипа);
Если Лев(Представление, ДлиннаСинонима) = ""+МетаданныеТипа Тогда
НомерИДата = СокрЛП(Сред(Представление, ДлиннаСинонима+1));
ПозицияОт = Найти(НомерИДата, " от ");
Если Не ПозицияОт = 0 Тогда
НомерДок = Лев(НомерИДата, ПозицияОт-1);
Попытка
ДатаДок = Дата(Сред(НомерИДата, ПозицияОт+4));
Исключение
ДатаДок = Неопределено;
КонецПопытки;
Если Не ДатаДок = Неопределено Тогда
НайденноеЗначение = Менеджер.НайтиПоНомеру(НомерДок, ДатаДок);
Если Не НайденноеЗначение.Пустая() Тогда
НайденныеЗначения.Добавить(НайденноеЗначение);
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
ИначеЕсли Не МетаданныеТипа = Неопределено Тогда
ИскатьПо = Колонка.ИскатьПо;
ЭтоСправочник = Справочники.ТипВсеСсылки().СодержитТип(ТипРеквизита);
Если ПустаяСтрока(ИскатьПо) Тогда
СтрокаОсновногоПредставления = Строка(МетаданныеТипа.ОсновноеПредставление);
Если СтрокаОсновногоПредставления = "ВВидеКода" Тогда
ИскатьПо = "Код";
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНаименования" Тогда
ИскатьПо = "Наименование";
ИначеЕсли СтрокаОсновногоПредставления = "ВВидеНомера" Тогда
ИскатьПо = "Номер";
КонецЕсли;
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| _Таблица.Ссылка
|ИЗ
| " + МетаданныеТипа.ПолноеИмя() + " КАК _Таблица
|ГДЕ";
Запрос.Текст = Запрос.Текст + "
| _Таблица." + ИскатьПо + " = &Представление";
Запрос.УстановитьПараметр("Представление",Представление);
Если ЭтоСправочник и Не ПустаяСтрока(Колонка.СвязьПоВладельцу) и МетаданныеТипа.Владельцы.Количество() Тогда
СвязьПоВладельцу = Неопределено;
Если ТипЗНЧ(Колонка.СвязьПоВладельцу) = Тип("Строка") Тогда
ТекущиеДанные.Свойство(Колонка.СвязьПоВладельцу,СвязьПоВладельцу);
Иначе
СвязьПоВладельцу = Колонка.СвязьПоВладельцу;
КонецЕсли;
Если Не СвязьПоВладельцу = Неопределено Тогда
Запрос.Текст = Запрос.Текст + "
| И _Таблица.Владелец = &СвязьПоВладельцу";
Запрос.УстановитьПараметр("СвязьПоВладельцу",СвязьПоВладельцу);
КонецЕсли;
КонецЕсли;
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
НайденныеЗначения.Добавить(Выборка.Ссылка);
КонецЦикла;
Иначе
Примечание = "Не описан способ поиска";
Примечание = "Для Колонки не определен тип значения";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат НайденныеЗначения;
КонецФункции // ()
Теперь создаем документ перенос данных, выбираем нужные регистры, оставляем пустой набор, записываем, и используем эту обработку.
Тестирование проводилось на версии платформы 8.3.18 и ЗУП версии 3.1.14.