Подробное описание того, как это работает, с примерами кода выложено в предыдущей статье:
Несколько альтернативных универсальных способов подбора ссылок при переносах данных
Если глубоко разобраться в этой статье и самому посидеть пару дней, то обработку, которая здесь выложена, можно собрать самому из предложенного кода.
Поэтому в этой публикации повторно не буду описывать код. Его, кстати, получилось почти 1500 строк.
Здесь опишу, зачем и как можно использовать приложенный шаблон обработки. Т.е. это инструкция по доработке под Ваши задачи.
Конечно же, на данном ресурсе много обработок по загрузке данных из Excel. Многие из них заточены под УТ. Не пытаюсь с ними конкурировать!
Эта обработка нужна для решения следующих задач:
1. Сейчас идёт массовое импротозамещение. Переход с SAP, Oracle, Axapta и прочих зарубежных решений. Под них не существует нормальных тиражных решений, и приходится перенос делать своими силами. Чаще всего данные выгружают именно в Excel. Для загрузки этих данных отлично подходит мой шаблон!
Для перехода на ЗУП 3 с указанных решений у меня разработаны и концепция, и шаблоны, и подробное описание шаблонов.
2. Многие коллеги привыкли писать одноразовые обработки под каждую загрузку данных из Excel. Качество кода в них оставляет желать лучшего. Поправить ситуацию можно с помощью данного шаблона. Он вообще не привязан ни к какой конфигурации. В него добавлен реквизит Организация. На мой взгляд, данный реквизит есть во всех конфигурациях, даже самописных.
3. Чисто образовательный момент. Если в Вашей организации есть начинающие разработчики или кто-то хочет начать своё обучение программированию - этот шаблон отличная возможность получить новые навыки программирования. Код чётко структурирован и содержит много комментариев (+статья в начале), соблюдены стандарты разработки. Изучение шаблона позволит научиться писать универсальные процедуры и рваные запросы.
4. Самая важная особенность шаблона - это возможность подбирать ссылки перечислений, справочников в несколько строк кода. Если искать по полям Номер и Дата, то можно даже ссылки документов подбирать. Конечно, если у Вас одна таблица, в которой одну ссылку подобрать нужно, то ничего особенного. А если таблиц много и ссылок тоже, вот здесь и будет полезен данный механизм.
Рассмотрим задачи, которые выполняет обработка:
1. Чтение файлов и преобразование их в таблицы значений
2. Заполнение ссылок перечислений
3. Заполнение ссылок справочников через регистр соответствий
4. Заполнение ссылок справочников через поиск по реквизитам (код, наименование и др.)
5. Загрузка данных
Прежде чем рассматривать подробности этапов, нужно отметить пару моментов:
- Перед всеми процедурами и функциями в коде есть "опознавательные знаки":
"//+" - означает, что в этой процедуре не требуется вносить изменения. Она универсальная и уже готова.
"//-" - означает, что изменения вносить необходимо. Именно их буду рассматривать ниже и рассказывать, какие нужны изменения.
- На форме есть реквизит "КаталогНаСервере". В названии написано, что все файлы для загрузки читаются с сервера. Но на всякий случай дополнительно об этом напомнил...
- Во всех файлах Excel обязательно в первой строке должно быть наименование колонки. Оно должно быть не для пользователя, а как оно будет в коде использоваться. Если в шаблоне и в коде будут указаны разные названия, то эта колонка не будет считана запросом! В процедурах первого этапа должны быть именно те наименования, которые указаны в первой строке шаблона. Т.е. вот так должно быть:
Рассмотрим, какие действия необходимо выполнить, чтоб каждый из этапов сработал корректно.
Этап 1. Чтение файлов и преобразование их в таблицы значений
На этом этапе необходимо указать следующие данные:
- Список загружаемых таблиц. Это происходит здесь:
//-
Функция ПолучитьСтруктуруТаблиц(ПолучениеСоответствий)
СтруктураТаблиц = Новый Структура;
СтруктураТаблиц.Вставить("ИмяТаблицы1");
СтруктураТаблиц.Вставить("ИмяТаблицы2");
Если ВыгружатьИмяТаблицыССоответствиями Или ПолучениеСоответствий Тогда
СтруктураТаблиц.Вставить("ИмяТаблицыССоответствиями");
КонецЕсли;
Возврат СтруктураТаблиц;
КонецФункции // ПолучитьСтруктуруТаблиц()
Указанные названия таблиц должны содержаться в названии файлов. До и после них могут быть любые символы. На форме выведен для примера один флаг. Можно сделать загрузку некоторых таблиц только при установленном на форме флаге. По названию флага можно проследить в коде, где его ещё необходимо прописать. На форме моей обработки по переносу из ЗУП 2.5/УПП в ЗУП 3.1 таких около 30).
- Для каждой таблицы необходимо задать состав полей и указать их тип. Это делается вот так:
//-
//Для каждой таблицы определен и создан список колонок
Функция СоздатьТаблицу(ИмяТаблицы, ПолучениеСоответствий)
ЗагружаемаяТаблица = Новый ТаблицаЗначений;
//Основные таблицы
Если ИмяТаблицы = "ИмяТаблицы1" Тогда
ДобавитьПоляИмяТаблицы1(ЗагружаемаяТаблица);
ИначеЕсли ИмяТаблицы = "ИмяТаблицы2" Тогда
ДобавитьПоляИмяТаблицы2(ЗагружаемаяТаблица);
КонецЕсли;
//Таблицы, по которым устанавливается соответствие
Если ВыгружатьИмяТаблицыССоответствиями Или ПолучениеСоответствий Тогда
Если ИмяТаблицы = "ИмяТаблицыССоответствиями" Тогда
ДобавитьПоляИмяТаблицыССоответствиями(ЗагружаемаяТаблица);
КонецЕсли;
КонецЕсли;
Возврат ЗагружаемаяТаблица;
КонецФункции // СоздатьТаблицу()
//-
Процедура ДобавитьПоляИмяТаблицы1(ТаблицаСправочника)
ТаблицаСправочника.Колонки.Добавить("КолонкаТипСтрока150", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипСтрока350", СтруктураОписанияТипов.ОписаниеТиповСтроки350);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло15_2", СтруктураОписанияТипов.ОписаниеТиповЧисла15_2);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло15_3", СтруктураОписанияТипов.ОписаниеТиповЧисла15_3);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло3_0", СтруктураОписанияТипов.ОписаниеТиповЧисла3_0);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло6_0", СтруктураОписанияТипов.ОписаниеТиповЧисла6_0);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло10_0", СтруктураОписанияТипов.ОписаниеТиповЧисла10_0);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло10_2", СтруктураОписанияТипов.ОписаниеТиповЧисла10_2);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло6_2", СтруктураОписанияТипов.ОписаниеТиповЧисла6_2);
ТаблицаСправочника.Колонки.Добавить("КолонкаТипЧисло8_2", СтруктураОписанияТипов.ОписаниеТиповЧисла8_2);
ТаблицаСправочника.Колонки.Добавить("КолонкаБулево", СтруктураОписанияТипов.ОписаниеТиповБулево);
ТаблицаСправочника.Колонки.Добавить("КолонкаДата", СтруктураОписанияТипов.ОписаниеТиповДаты);
КонецПроцедуры // ДобавитьПоляИмяТаблицы1()
У меня принято правило в обработке, что названия процедур и функций, где какие-то действия происходят с конкретной таблицей, содержат её имя.
Указываем здесь имена колонок из первой строки файла и указываем подходящий тип значения из предложенных. Указанные процедуры позволяют просто считать файлы и получить таблицы с типизированными колонками.
- Следующим действием необходимо задать имена колонок, которые нам удобны для загрузки. Ведь на этапе выгрузки колонки называют так, как удобно в выгружаемой системе. Если на этапе загрузки у Вас имена колонок не изменятся, то просто они будут совпадать. В приведенной ниже функции указываются также правила подбора ссылок. Их рассмотрим ниже. Соответствие колонок задается так:
//-
Функция ПолучитьСоответствиеКолонокПоТаблице(ИмяТаблицы)
//Кадровые данные
Если ИмяТаблицы = "ИмяТаблицы1" Тогда
СоответствиеКолонок = ПолучитьСоответствиеКолонокИмяТаблицы1(ИмяТаблицы);
ИначеЕсли ИмяТаблицы = "ИмяТаблицы2" Тогда
СоответствиеКолонок = ПолучитьСоответствиеКолонокИмяТаблицы2(ИмяТаблицы);
ИначеЕсли ИмяТаблицы = "ИмяТаблицыССоответствиями" Тогда
СоответствиеКолонок = ПолучитьСоответствиеКолонокИмяТаблицыССоответствиями(ИмяТаблицы);
КонецЕсли;
Возврат СоответствиеКолонок;
КонецФункции // ПолучитьСоответствиеКолонокПоТаблице()
//-
Функция ПолучитьСоответствиеКолонокИмяТаблицы1(ИмяТаблицы)
СоответствиеКолонок = Новый Соответствие;
//Поиск запросом по соответствию 2х параметров
СоответствиеКолонок.Вставить("ИмяПоля1", "Поле1БезСсылки");
СоответствиеКолонок.Вставить("ИмяПоля2", "Поле2");
СоответствиеКолонок.Вставить("Код", "Код");
СоответствиеКолонок.Вставить("Наименование", "Наименование");
//Организация
СоответствиеКолонок.Вставить("Организация", "ОрганизацияБезСсылки");
СоответствиеКолонок.Вставить("ВАрхиве", "ВАрхиве");
СоответствиеКолонок.Вставить("ПометкаУдаления", "ПометкаУдаления");
//Соответствие по ВТ_СоответствиеТипыКонтактнойИнформации
СоответствиеКолонок.Вставить("Тип", "ТипБезСсылки");
//Соответствие по ВТ_Соответствие[Перечисление1]
СоответствиеКолонок.Вставить("ИмяПоляПеречисление1", "ПолеПеречисление1БезСсылки");
//Поиск через РС из расширения Соответствие_[ИмяРегистраСоответствия1]
СоответствиеКолонок.Вставить("ИмяПоляРегистраСоответствия1", "ПолеРегистраСоответствия1БезСсылки");
//Заполним данные для поиска соответствий
СоответствияПолей = Новый Соответствие;
СоответствияПолей.Вставить("ТипБезСсылки", "ВТ_СоответствиеТипыКонтактнойИнформации");
СоответствияПолей.Вставить("ПолеПеречисление1БезСсылки", "ВТ_СоответствиеПеречисление1");
СоответствияПолей.Вставить("ПолеРегистраСоответствия1БезСсылки", "ВТ_СоответствиеИмяРегистраСоответствия1");
СтруктураНеобходимыхСоответствий[ИмяТаблицы] = СоответствияПолей;
//Соответствия для справочников
СоответствияПолей = Новый Соответствие;
СоответствияПолей.Вставить("Поле1БезСсылки", "Справочник.СправочникПоДвумПолям");
СоответствияПолей.Вставить("ОрганизацияБезСсылки", "Справочник.Организации");
СтруктураСоответствийДляСправочников[ИмяТаблицы] = СоответствияПолей;
Возврат СоответствиеКолонок;
КонецФункции // ПолучитьСоответствиеКолонокИмяТаблицы1()
В приведенном коде сначала указываем список таблиц и полей. Остальные подробности ниже.
Описанные изменения позволяют считать полностью все файлы и задать в таблицах нужные имена, причём все таблицы помещаются во временные таблицы, и дальнейшая работа идёт через запросы. Если Вам нужно было только считать кучу таблиц и присвоить им нормальные имена - на этом всё окончено. Достаточно в модуле формы в процедуре "ЗагрузитьДанныеНаСервере" закомментировать следующий код:
//Заполняем ссылочные поля
ОбработкаОбъект.ЗаполнитьСсылочныеПоля();
//Загружаем кадровые документы
ОбработкаОбъект.ЗагрузитьДанные();
Описанные выше действия позволят выполнить первую строчку кода этой же процедуры:
//Считываем все данные из Excel и преобразуем в обычные таблицы
ОбработкаОбъект = ПолучитьДанныеИзExcel();
Полученные таблицы хранятся в ОбработкаОбъект.МенеджерВременныхТаблицБезCOM. Имя временной таблицы присваивается по шаблону:
"ВТ_" + ИмяТаблицы.
Теперь переходим к заполнению ссылок.
2. Заполнение ссылок перечислений
Понятно, что не в каждой загрузке нужно подбирать ссылки перечислений, но довольно часто. Если в Вашей задаче это не нужно, достаточно закомментировать в процедуре "ЗаполнитьСсылкиПеречисленийИВспомогательныхСправочников" строчку:
ПолучитьВременныеТаблицыССоответствиямиПеречислений();
Первое, что нужно - это задать соответствие между текстовым значением в шаблоне и значением перечисления. Это происходит в запросе. Для примера приведу, как устанавливается соответствие перечисления "ТипыКонтактнойИнформации". В коде обработки также приведен шаблон, который легко переделать. Вот так выглядит код запроса:
//-
Процедура ПолучитьСоответствиеТипыКонтактнойИнформации()
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблицБезCOM;
Запрос.Текст =
"ВЫБРАТЬ
| ""Адрес"" КАК ТипСтрока,
| ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Адрес) КАК Тип
|ПОМЕСТИТЬ ВТ_СоответствиеТипыКонтактнойИнформации
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ""Телефон"",
| ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Телефон)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ""E-Mail"",
| ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ""АдресЭлектроннойПочты"",
| ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.АдресЭлектроннойПочты)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ""Веб-страница"",
| ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.ВебСтраница)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ""Факс"",
| ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Факс)
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ""Другое"",
| ЗНАЧЕНИЕ(Перечисление.ТипыКонтактнойИнформации.Другое)";
Запрос.Выполнить();
КонецПроцедуры // ПолучитьСоответствиеТипыКонтактнойИнформации()
Что важно отметить по этой процедуре:
- Название перечисления без изменений есть в наименовании функции и получаемой временной таблицы
- Первое поле в запросе строится по шаблону: <ИмяПоля>+"Строка"
- Второе поле имя совпадает с тем, которое Вы хотите на выходе получить.
- В процедуре "ПолучитьСоответствиеПолей..." поле, в котором должна появиться ссылка должно иметь имя по шаблону: <ИмяПоля>+"БезСсылки":
//Соответствие по ВТ_СоответствиеТипыКонтактнойИнформации
СоответствиеКолонок.Вставить("Тип", "ТипБезСсылки");
- Я в комментарии указываю временную таблицу, из которой будет получена ссылка. Так код становится читабельней.
- В той же процедуре необходимо добавить элемент в "СоответствиеПолей" для "СтруктураНеобходимыхСоответствий". Именно благодаря этому коду будет создано новое поле в таблице и подобрана ссылка указанного перечисления.
//Заполним данные для поиска соответствий
СоответствияПолей = Новый Соответствие;
СоответствияПолей.Вставить("ТипБезСсылки", "ВТ_СоответствиеТипыКонтактнойИнформации");
СтруктураНеобходимыхСоответствий[ИмяТаблицы] = СоответствияПолей;
- Последним действием осталось указать имя поля для связи таблицы с данными и "ВТ_СоответствиеТипыКонтактнойИнформации". Имя рекомендую одинаково везде писать, чтоб не было путаницы. Это делается вот в этой процедуре:
//-
Функция ПолучитьИмяПоляПоВременнойТаблице(ИмяВременнойТаблицы)
ИмяПоляСоединения = "";
//Перечисления и справочники
Если ИмяВременнойТаблицы = "ВТ_СоответствиеПеречисление1" Тогда
ИмяПоляСоединения = "ПолеПеречисление1";
ИначеЕсли ИмяВременнойТаблицы = "ВТ_СоответствиеТипыКонтактнойИнформации" Тогда
ИмяПоляСоединения = "Тип";
КонецЕсли;
//Регистры соответствий
Если ИмяВременнойТаблицы = "ВТ_СоответствиеИмяРегистраСоответствия1" Тогда
ИмяПоляСоединения = "ПолеРегистраСоответствия";
КонецЕсли;
Возврат ИмяПоляСоединения;
КонецФункции // ПолучитьИмяПоляПоВременнойТаблице()
После выполнения всего кода, в таблице появится поле "Тип" с подобранной ссылкой перечисления. Если в Excel текст введен с ошибкой, то ссылка не подберется. Значение будет Пустая ссылка того типа, который пытались найти. Это актуально и для справочников. Неопределено и NULL в результате выполнения запросов исключено.
3. Заполнение ссылок справочников через регистр соответствий
Часть справочников являются вспомогательными. В момент переноса данных логично их "причесать". За время работы 5-10 лет они захламляются лишними или неправильно введенными элементами. Для этой цели был придуман универсальный механизм соответствий. Для каждого текстового представления из старой базы через регистр сведений сопоставляется ссылка из новой базы. В статье, приведенной в начале, этот механизм подробно описан.
Опишу здесь, что нужно сделать, чтобы создать новое соответствие. Обращаю внимание, что универсальным является подход к установке соответствий, а не созданный регистр. В типовых решениях есть универсальный регистр "СоответствияОбъектовИнформационныхБаз", но работать с ним невозможно! Создаваемый регистр должен выглядеть так:
Слово "Соответствие" в названии - это им расширения, в котором у меня созданы регистры. В процедуре, где устанавливаются соответствия колонок написан следующий код:
//Поиск через РС из расширения Соответствие_[ИмяРегистраСоответствия1]
СоответствиеКолонок.Вставить("ПолеРегистраСоответствия", "ПолеРегистраСоответствияБезСсылки");
//Заполним данные для поиска соответствий
СоответствияПолей = Новый Соответствие;
СоответствияПолей.Вставить("ПолеРегистраСоответствияБезСсылки", "ВТ_СоответствиеИмяРегистраСоответствия1");
СтруктураНеобходимыхСоответствий[ИмяТаблицы] = СоответствияПолей;
Также как и для подбора ссылок перечислений, для регистров соответствий используем "СтруктураНеобходимыхСоответствий". Имя измерения должно формироваться по шаблону [ПолеРегистраСоответствия]+"Строка". Ресурс - ПолеРегистраСоответствия, он совпадает с именем, которое указано в функции "ПолучитьИмяПоляПоВременнойТаблице".
Предварительно необходимо добавить ещё одну процедуру, которая считывает данные регистра соответствий во временную таблицу. Принцип присвоения имен такой же. Выглядит она вот так:
//-
Процедура ПолучитьСоответствиеИмяРегистраСоответствия1ИзРегистра()
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблицБезCOM;
Запрос.Текст =
"ВЫБРАТЬ
| Соответствие_ИмяРегистраСоответствия1.ПолеРегистраСоответствияСтрока КАК ПолеРегистраСоответствияСтрока,
| Соответствие_ИмяРегистраСоответствия1.ПолеРегистраСоответствия КАК ПолеРегистраСоответствия
|ПОМЕСТИТЬ ВТ_СоответствиеИмяРегистраСоответствия1
|ИЗ
| РегистрСведений.Соответствие_ИмяРегистраСоответствия1 КАК Соответствие_ИмяРегистраСоответствия1";
Запрос.Выполнить();
КонецПроцедуры // ПолучитьСоответствиеИмяРегистраСоответствия1ИзРегистра()
Если в Вашей задаче это не нужно, достаточно закомментировать в процедуре "ЗаполнитьСсылкиПеречисленийИВспомогательныхСправочников" строчку:
ПолучитьВременныеТаблицыССоответствиямиИзРегистров();
4. Заполнение ссылок справочников через поиск по реквизитам
Для заполнения ссылок остальных справочников используется другой механизм. Опишу также действия, которые необходимо сделать в шаблоне, чтоб все ссылки правильно подобрались. Здесь стоит отметить важный момент, что справочники, в которых происходит поиск ссылок, должны быть загружены/заполнены. Опции создать ссылку если не найдена - нет!
Необходимо выполнить следующие действия:
Правильно заполнить соответствие полей. Поле, в котором должна появиться ссылка должно иметь имя по шаблону: <ИмяПоля>+"БезСсылки":
//Поиск запросом по соответствию 2х параметров
СоответствиеКолонок.Вставить("ИмяПоля1", "Поле1БезСсылки");
СоответствиеКолонок.Вставить("ИмяПоля2", "Поле2");
//Поиск по одному полю
//Организация
СоответствиеКолонок.Вставить("Организация", "ОрганизацияБезСсылки");
В этой же функции необходимо заполнить "СтруктураСоответствийДляСправочников" вот так:
//Соответствия для справочников
СоответствияПолей = Новый Соответствие;
СоответствияПолей.Вставить("Поле1БезСсылки", "Справочник.СправочникПоДвумПолям");
СоответствияПолей.Вставить("ОрганизацияБезСсылки", "Справочник.Организации");
СтруктураСоответствийДляСправочников[ИмяТаблицы] = СоответствияПолей;
Таким образом мы добавим запросом 2 левых соединения к исходной таблице. А поля, по которым будет происходить соединение указываются в следующей функции:
//-
Функция ПолучитьПоляСоединенияДляПоискаСсылокПоТаблице(ИмяТаблицыСсылок, ОбрабатываемаТаблицаДанных, ИмяПоляБезСсылки)
ПоляСоединения = Новый Соответствие;
//В зависимости от обрабатываемой таблицы определим поля для связей
//В соответствии Ключ - это имя поля из обрабатываемой таблицы
//Значение - имя поля в таблице ссылок
Если ОбрабатываемаТаблицаДанных = "ИмяТаблицы1" Тогда
Если ИмяТаблицыСсылок = "Справочник.Организации" Тогда
//Поиск по наименованию
//Здесь приведен пример поиска 3-х ссылок в одном справочнике.
Если ИмяПоляБезСсылки = "ОрганизацияБезСсылки" Тогда
ПоляСоединения.Вставить("ОрганизацияБезСсылки", "Наименование");
ИначеЕсли ИмяПоляБезСсылки = "ВладелецБезСсылки" Тогда
ПоляСоединения.Вставить("ВладелецБезСсылки", "Наименование");
ИначеЕсли ИмяПоляБезСсылки = "РегистрацияВладелецБезСсылки" Тогда
ПоляСоединения.Вставить("РегистрацияВладелецБезСсылки", "Наименование");
КонецЕсли;
ИначеЕсли ИмяТаблицыСсылок = "Справочник.СправочникПоДвумПолям" Тогда
//Поиск по соответствию кода и наименования
ПоляСоединения.Вставить("Поле1БезСсылки", "Код");
ПоляСоединения.Вставить("Поле2", "Наименование");
КонецЕсли;
ИначеЕсли ОбрабатываемаТаблицаДанных = "ИмяТаблицы2" Тогда
Если ИмяТаблицыСсылок = "Справочник.Организации" Тогда
//Поиск по наименованию
//Если в таблице одно поле с данным типом, то не анализируем название исходного реквизита
ПоляСоединения.Вставить("ОрганизацияБезСсылки", "Наименование");
ИначеЕсли ИмяТаблицыСсылок = "Справочник.СправочникПоДвумПолям" Тогда
//Поиск по соответствию кода и наименования
ПоляСоединения.Вставить("Поле1БезСсылки", "Код");
ПоляСоединения.Вставить("Поле2", "Наименование");
КонецЕсли;
ИначеЕсли ОбрабатываемаТаблицаДанных = "ИмяТаблицыССоответствиями" Тогда
Если ИмяТаблицыСсылок = "Справочник.Организации" Тогда
//Поиск по наименованию
//Если в таблице одно поле с данным типом, то не анализируем название исходного реквизита
ПоляСоединения.Вставить("ОрганизацияБезСсылки", "Наименование");
ИначеЕсли ИмяТаблицыСсылок = "Справочник.СправочникПоДвумПолям" Тогда
//Поиск по соответствию кода и наименования
ПоляСоединения.Вставить("Поле1БезСсылки", "Код");
ПоляСоединения.Вставить("Поле2", "Наименование");
КонецЕсли;
КонецЕсли;
Возврат ПоляСоединения;
КонецФункции // ПолучитьПоляСоединенияДляПоискаСсылокПоТаблице()
Теперь выполнены все действия необходимые для правильной работы механизма подбора ссылок. Напоминаю, что все действия с таблицами происходят через запросы. Осталось загрузить полученные данные.
5. Загрузка данных
Для удобства в шаблон обработки добавлены шаблоны процедур загрузки данных, которые необходимо модифицировать под свои задачи.
В первой процедуре идёт вызов исходя из количества загружаемых таблиц:
//-
Процедура ЗагрузитьДанные() Экспорт
//Синоним таблицы 1
ЗагрузитьИмяТаблицы1();
//Синоним таблицы 2
ЗагрузитьИмяТаблицы2();
//Синоним таблицы с соответствиями
Если ВыгружатьИмяТаблицыССоответствиями Тогда
ЗагрузитьИмяТаблицыССоответствиями();
КонецЕсли;
КонецПроцедуры // ЗагрузитьДанные()
И шаблон процедуры загрузки:
//-
Процедура ЗагрузитьИмяТаблицы1()
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = МенеджерВременныхТаблицБезCOM;
Запрос.Текст = ПолучитьТекстЗапросаПоВременнойТаблице("ВТ_ИмяТаблицы1");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
КонецЦикла;
КонецПроцедуры // ЗагрузитьИмяТаблицы1()
Чтоб не писать запрос в каждой такой процедуре написана ещё одна универсальная функция:
//+
//Чтоб не писать простыни запросов в момент загрузки, возьмём колонки из описания временной таблицы
//Запрос строим универсально, это сэкономит 1000+ строк кода
Функция ПолучитьТекстЗапросаПоВременнойТаблице(ИмяВременнойТаблицы)
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ";
ВременнаяТаблица = МенеджерВременныхТаблицБезCOM.Таблицы.Найти(ИмяВременнойТаблицы);
КоличествоПолей = ВременнаяТаблица.Колонки.Количество();
Для Каждого ТекКолонка Из ВременнаяТаблица.Колонки Цикл
ТекстЗапроса = ТекстЗапроса + "
| " + ИмяВременнойТаблицы + "." + ТекКолонка.Имя + " КАК " + ТекКолонка.Имя;
КоличествоПолей = КоличествоПолей - 1;
Если Не КоличествоПолей = 0 Тогда
ТекстЗапроса = ТекстЗапроса + ",";
КонецЕсли;
КонецЦикла;
ТекстЗапроса = ТекстЗапроса + "
|ИЗ
| " + ИмяВременнойТаблицы + " КАК " + ИмяВременнойТаблицы;
Возврат ТекстЗапроса;
КонецФункции // ПолучитьТекстЗапросаПоВременнойТаблице()
На этом всё! Удачи в применении этого шаблона.
Если Вы не знаете, как поставить плюс или зачем это вообще делать, для Вас статья:
Другие публикации с подобными обработками:
Пример работы с файлами odt в клиент-серверной модели работы
Проверено на следующих конфигурациях и релизах:
- 1С:ERP Управление предприятием 2, релизы 2.5.16.91