Универсальный шаблон для загрузки данных из Excel и подбора ссылок в любой конфигурации

25.03.24

Интеграция - Загрузка и выгрузка в Excel

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Универсальный шаблон для загрузки данных из Excel и подбора ссылок в любой конфигурации:
.epf 16,01Kb
48
48 Скачать (1 SM) Купить за 1 850 руб.

Подробное описание того, как это работает, с примерами кода выложено в предыдущей статье:

Несколько альтернативных универсальных способов подбора ссылок при переносах данных

 

Если глубоко разобраться в этой статье и самому посидеть пару дней, то обработку, которая здесь выложена, можно собрать самому из предложенного кода.

Поэтому в этой публикации повторно не буду описывать код. Его, кстати, получилось почти 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

загрузка Excel шаблон перенос данных универсальный таблица ссылка

См. также

SALE! 20%

Загрузка и выгрузка в Excel Оптовая торговля Печатные формы Бухгалтер Пользователь Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная обработка для загрузки документов из Excel в 1С одним нажатием. Не требует указания параметров (номера колонок, номер первой строки таблицы и т.д.) и предварительной настройки. Просто выбираете файл Excel, документ 1С и нажимаете кнопку "Загрузить". Обработка сама находит таблицу в файле Excel, необходимые для загрузки данные в ней (номенклатура, количество, НДС, цена, сумма) и загружает ее в 1С. Вместе с номенклатурой может найти контрагента, номер и дату документа, штрих-коды, серии ГТД, страну и т.д. Распознает документы ЛЮБОЙ ФОРМЫ (УПД, ТОРГ-12, заказ, отчет комиссионера и т.д.). Не требует MS Office. Для поиска таблиц используются методы эвристического поиска. Загружает только то, что нужно, т.е. пропускает повторы шапки таблицы, заголовки, промежуточные итоги, подписи и т.д. Содержит модуль работы с электронной почтой и api-загрузчик отчетов о продажах маркетплейсов.

6000 5100 руб.

09.11.2016    234826    1065    898    

1004

Загрузка и выгрузка в Excel Маркетплейсы Программист Бухгалтер Пользователь Платформа 1С v8.3 Бухгалтерский учет 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Бухгалтерский учет Управленческий учет Платные (руб)

Реальный помощник, с помощью которого Вы преобразуете необходимые документы для Wildberries, OZON, ЯндексМаркет, Мегамаркет, Aliexpress, Детский мир, МагнитЭкспресс (быв.Казань-Экспресс), Леруа Мерлен, ЭНФАНТА (Акушерство), ЛаМода, Летуаль, Твой дом, Золотое Яблоко в документы "Отчет комиссионера (агента) о продажах" и другие. Работает в 1С:БП 3.0, 1С:БП 3.0 КОРП, 1С:УТ 11, 1С:УНФ, 1С:КА 2, 1С:ERP Управление предприятием. Возможность подключить любые маркетплейсы. Анализ продаж ОZON. 30 дней БЕСПЛАТНОГО пользования!

3600 руб.

12.08.2021    35660    350    68    

158

SALE! 30%

Загрузка и выгрузка в Excel Документооборот и делопроизводство (СЭД) Учет документов Распознавание документов и образов Бухгалтер Пользователь Управляемые формы 1С:Комплексная автоматизация 1.х 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление холдингом 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 Бухгалтерский учет Управленческий учет Платные (руб)

Универсальная программа для распознавания сканов или фото товарных документов в 1С. Не требует указания параметров и предварительной настройки. Просто выбираете файл (PDF, JPG, DOC, XLS, HTML) выбираете документ 1С и нажимаете кнопку "Распознать и загрузить".

8400 5880 руб.

04.06.2019    107327    313    173    

326

Маркетплейсы Загрузка и выгрузка в Excel Программист Пользователь Платформа 1С v8.3 1С:Управление торговлей 10 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Управленческий учет Платные (руб)

Загрузка данных отчета о реализации и продаже товаров из сервиса Яндекс.Маркета «Беру» в 1С из Отчетов Excel для конфигурации: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3; Управление нашей фирмой, редакция 3.0 и Розница, редакция 3.0 в документ «Отчет комиссионера о продажах».

4800 руб.

09.12.2020    25472    251    1    

114

Загрузка и выгрузка в Excel Логистика, склад и ТМЦ Ценообразование, анализ цен Файловый обмен (TXT, XML, DBF), FTP Бухгалтер Пользователь Платформа 1С v8.3 1С:Бухгалтерия 2.0 1С:Управление торговлей 10 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Платные (руб)

Эволюция не стоит на месте - новая удобная версия функциональной обработки для Вашего бизнеса! Что же Вы получаете? Удобный и интуитивно понятный интерфейс с 3-мя этапами работы. 2 режима - автоматический и ручной. Чтение XLSX, XLSM, CSV, XML/YML форматов без офиса, на любом сервере! Визуальное связывание колонок файла и реквизитов простым перетаскиванием колонок. Создание или обновление номенклатуры с иерархией, характеристик, доп. реквизитов, упаковок, загрузка практически неограниченного количества картинок на одну номенклатуру (с возможностью загрузки в несколько потоков одновременно), с хранением в томах или в базе. Загрузка номенклатуры поставщиков или поиск по их данным номенклатуры. Загрузка доп. реквизитов в характеристики. Загрузка штрихкодов с генерацией новых. Создание элементов справочников и ПВХ "на лету" для выбранных реквизитов. (Обновление от 10.10.2024, версия 9.8 - 9.13)

15600 руб.

20.11.2015    156338    376    378    

513

Загрузка и выгрузка в Excel Розничная торговля Логистика, склад и ТМЦ Ценообразование, анализ цен Прайсы Системный администратор Программист Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Розница 2 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Управленческий учет Платные (руб)

Загрузка номенклатуры из файлов Excel (xls, xlsx, ods, csv, mxl) в УТ11, КА 2, ERP 2, Розница 2. Задействованы все возможности конфигурации - заполнение реквизитов номенклатуры, дополнительных реквизитов и сведений, характеристики, доп.реквизиты и сведения характеристик. Дополнительные обработки для расширения возможностей.

11100 руб.

29.10.2014    216916    657    527    

456

Загрузка и выгрузка в Excel Бухгалтер Пользователь Платформа 1С v8.3 1С:Управление торговлей 10 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Оптовая торговля, дистрибуция, логистика Бухгалтерский учет Управленческий учет Платные (руб)

Загрузка данных отчета о реализации товаров из сервиса "Детский мир" для конфигурации 1С: Бухгалтерия предприятия, редакция 3.0; Управление торговлей, редакция 11; Управление торговлей, редакция 10.3; Управление нашей фирмой, редакция 3.0 и Розница, редакция 3.0 в документ "Отчет комиссионера (агента) о продажах".

4800 руб.

23.01.2022    11186    53    0    

37
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. leosoft 166 25.03.24 11:08 Сейчас в теме
Скачал шаблон, спасибо. Но в файловой базе не открывает диалог выбора каталога?
2. biimmap 2022 25.03.24 11:37 Сейчас в теме
(1) не делал открытие выбора диалога) Хотя помню что даже событие сделал... Думаю это не сложная задача)))
3. leosoft 166 25.03.24 12:14 Сейчас в теме
Я просто открыл Ваш шаблон, в нем 2 поля - организация и поле ввода каталога "на сервере".
Я так понимаю, что в файловой базе сервер - это и есть локальный компьютер. Понятно,
что не сложная задача, просто сообщил о проблемке.
4. biimmap 2022 25.03.24 12:19 Сейчас в теме
(3)
просто сообщил о проблемке


ок. Благодарю.
5. biimmap 2022 25.03.24 12:19 Сейчас в теме
(3)
Я так понимаю, что в файловой базе сервер - это и есть локальный компьютер


всё верно
6. Plotnikov 15.04.24 11:37 Сейчас в теме
Добрый день!
"Для перехода на ЗУП 3 с указанных решений у меня разработаны и концепция, и шаблоны, и подробное описание шаблонов."

Прошу поделиться для перехода с SAP на ЗУП.
7. biimmap 2022 30.04.24 18:28 Сейчас в теме
(6)
Прошу поделиться


История не бесплатная) Написал в личку
8. user1994441 24.08.24 10:43 Сейчас в теме
Здравствуйте!
Бухгалтерия предприятия КОРП, редакция 3.0 (3.0.158.23)
Расширения конфигурации:
- Раздельный учет ГОЗ (1.3.766)
Доработок нет. Не могу загрузить шаблон.
Техническая информация:
Метод объекта не обнаружен (СведенияОВнешнейОбработке).
Заранее спасибо за ответ.
9. biimmap 2022 24.08.24 19:51 Сейчас в теме
(8)
СведенияОВнешнейОбработке


Так никто и не говорил что это работает как внешняя обработка. Шаблон - это значит Вы под себя его дорабатываете. как описано в публикации и пользуетесь. Если Вам нужна как внешняя нужно одну процедуру добавить в модуль объекта.
Оставьте свое сообщение