kb-personal/src/content/docs/knowledge-base/Общие/(БСП) Стандартные подсистемы/Загрузка данных из файла/Настраиваемые алгоритмы загрузки в справочники.md
wakadakawaka 96af8937f6 add
2025-07-26 19:35:07 +05:00

20 KiB
Raw Blame History

title, slug
title slug
Настраиваемые алгоритмы загрузки в справочники общие-бсп-стандартные-подсистемы-загрузка-данных-из-файла/настраиваемые-алгоритмы-загрузки-в-справочники

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

В общем модуле ЗагрузкаДанныхИзФайлаПереопределяемый в процедуре ПриОпределенииСправочниковДляЗагрузкиДанных определяем состав справочников для загрузки данных

Определение справочников для загрузки

Процедура ПриОпределенииСправочниковДляЗагрузкиДанных(ЗагружаемыеСправочники) Экспорт
    
    // Стандартный алгоритм загрузки. Для случаев, когда есть реквизит ХранилищеЗначения
    // и устраивает стандартный механизм загрузки
    ИмяСправочника = "ТестовыйСправочник";
    Если ЗагружаемыеСправочники.Найти(Метаданные.Справочники[ИмяСправочника].ПолноеИмя(), "ПолноеИмя") = Неопределено Тогда
        Сведения = ЗагружаемыеСправочники.Добавить();
        Сведения.ПолноеИмя = Метаданные.Справочники[ИмяСправочника].ПолноеИмя();
        Сведения.Представление	= Метаданные.Справочники[ИмяСправочника].Представление();
        Сведения.ПрикладнаяЗагрузка = Ложь;
    КонецЕсли;

    // Собственный алгоритм загрузки в справочник 
    ИмяСправочника = "ТестовыйСправочник1";
    
    СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники[ИмяСправочника].ПолноеИмя(), "ПолноеИмя");
    Если СтрокаТаблицы = Неопределено Тогда
        Сведения = ЗагружаемыеСправочники.Добавить();
        Сведения.ПолноеИмя          = Метаданные.Справочники[ИмяСправочника].ПолноеИмя();
        Сведения.Представление      = Метаданные.Справочники[ИмяСправочника].Представление();
        Сведения.ПрикладнаяЗагрузка = Истина;
    Иначе
        СтрокаТаблицы.ПрикладнаяЗагрузка = Истина;
    КонецЕсли;
    
    // Запрет загрузки
    ИмяСправочника = "ТестовыйСправочник2";
    СтрокаТаблицы = ЗагружаемыеСправочники.Найти(Метаданные.Справочники[ИмяСправочника].ПолноеИмя(), "ПолноеИмя");
    Если СтрокаТаблицы <> Неопределено Тогда
        ЗагружаемыеСправочники.Удалить(СтрокаТаблицы);
    КонецЕсли;
    
КонецПроцедуры

Реализация собственных механизмов загрузки и сопоставления

Если в процедуре ЗагрузкаДанныхИзФайлаПереопределяемый.ПриОпределенииСправочниковДляЗагрузкиДанных для справочника указать Сведения.ПрикладнаяЗагрузка = Истина;, то необходимо:

  • Создать макет табличного документа для загруки
  • в модуле менеджера реализовать несколько методов служебного программного интерфейса

Создание макета

Макет создается на уровне объекта и должен обязательно иметь имя ЗагрузкаИзФайла. В нем настраиваем вид шапки таблицы именя ячеек которой должны соответствовать именам реквизитов объекта.

В пользовательском режиме полужирным будут выделены обязательные реквизиты (ПроверкаЗаполнения = ВыдаватьОшибку) и те реквизиты, которые будут добавлены в массив Параметры.ОбязательныеКолонки метода ОпределитьПараметрыЗагрузкиДанныхИзФайла (см. главу ОпределитьПараметрыЗагрузкиДанныхИзФайла)

Изображение

Если справочник подключен к подсистемам Свойства и/или Контактная информация, то в макете нужно создавать колонки с заголовком <Дополнительные реквизиты> и <Контактная информация> (именно с треугольными скобками). Для таких колонок Имя не имеет значения - они заполняются автоматически

Изображение Изображение

Реализация методов программного интерфейса

В модуле менеджера необходимо реализовать 3 экспортных процедуры:

  • Процедура ОпределитьПараметрыЗагрузкиДанныхИзФайла(Параметры) Экспорт, в котором нужно определить параметры создания таблицы ЗагружаемыеДанные, используемой далее
Подробнее

Изображение

  • Процедура СопоставитьЗагружаемыеДанныеИзФайла(ЗагружаемыеДанные) Экспорт, в котором нужно заполнить служебный реквизиты ОбъектСопоставления - ссылка на найденный по требуемым правилам элемент справочника.
  • Процедура ЗагрузитьИзФайла(ЗагружаемыеДанные, ПараметрыЗагрузки, Отказ) Экспорт, в котором осуществляется непосредственная загрузка данных в ИБ

ОпределитьПараметрыЗагрузкиДанныхИзФайла

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

Подробнее

Изображение Изображение Изображение Изображение

Пример с датой Изображение Изображение

Процедура ОпределитьПараметрыЗагрузкиДанныхИзФайла(Параметры) Экспорт

//  Структура:
//    * Заголовок - Строка - представление в списке вариантов загрузки и в заголовке окна.
//    * ТипДанныхКолонки - Соответствие из КлючИЗначение:
//        ** Ключ - Строка - имя колонки таблицы.
//        ** Значение - ОписаниеТипов - описание типа данных колонки.
//    * ОбязательныеКолонки - Массив из Строка - содержит список обязательных полей для заполнения.
//    * ПолноеИмяОбъекта - Строка - полное имя объекта, как в метаданных. Например Справочник.Партнеры.
//    * ПредставлениеОбъекта - Строка - представление объекта в таблице сопоставления данных. Например, "Клиент".
//    * ТипЗагрузки - Строка - варианты загрузки данных (служебный).

    Параметры.ОбязательныеКолонки.Добавить("КолонкаСТипомДата");
    Параметры.ТипДанныхКолонки.Вставить("КолонкаСТипомБулево", Новый ОписаниеТипов("Булево"));
    Параметры.ТипДанныхКолонки.Вставить("КолонкаСТипомДата", ОбщегоНазначения.ОписаниеТипаДата(ЧастиДаты.Дата));

КонецПроцедуры

ВАЖНО! Если предполагается сопоставлять элементы справочника по строковым реквизитам, то обязательно в процедуре ОпределитьПараметрыЗагрузкиДанныхИзФайла нужно их описать с указанием длины. Без этого в запросе дальше не получится их использовать, т.к. длина по умолчанию устанавливается неограниченная

СопоставитьЗагружаемыеДанныеИзФайла

По стандартному сценарию колонки для сопоставления указываются пользователем вручную: Изображение В случае реализации собственных механизмов загрузки это поле отсутствует, Изображение поэтому в этом методе необходимо определить алгоритм и заполнить колонку ОбъектСопоставления таблицы ЗагружаемыеДанные подобранными элементами справочника

// Производит сопоставление загружаемых данных с данными в ИБ.
// Состав и тип колонок таблицы соответствует реквизитам справочника или макету "ЗагрузкаИзФайла".
//
// Параметры:
//   ЗагружаемыеДанные - см. ЗагрузкаДанныхИзФайла.ТаблицаСопоставления
//
Процедура СопоставитьЗагружаемыеДанныеИзФайла(ЗагружаемыеДанные) Экспорт
    
    // примитивный пример сопоставления

    Запрос = Новый Запрос;
    Запрос.Текст = 
    "ВЫБРАТЬ
    |	ЗагружаемыеДанные.Идентификатор КАК Идентификатор,
    |	ЗагружаемыеДанные.Наименование КАК Наименование
    |ПОМЕСТИТЬ ВТЗагружаемыеДанные
    |ИЗ
    |	&ЗагружаемыеДанные КАК ЗагружаемыеДанные
    |;
    |
    |////////////////////////////////////////////////////////////////////////////////
    |ВЫБРАТЬ
    |	ТестовыйСправочник.Ссылка КАК Ссылка,
    |	ВТЗагружаемыеДанные.Идентификатор КАК Идентификатор
    |ИЗ
    |	ВТЗагружаемыеДанные КАК ВТЗагружаемыеДанные
    |		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.ТестовыйСправочник КАК ТестовыйСправочник
    |		ПО ВТЗагружаемыеДанные.Наименование = ТестовыйСправочник.Наименование";
    Запрос.УстановитьПараметр("ЗагружаемыеДанные", ЗагружаемыеДанные);
    
    Выборка = Запрос.Выполнить().Выбрать();
    
    Пока Выборка.Следующий() Цикл
        
        СтрокаТаблицы = ЗагружаемыеДанные.Найти(Выборка.Идентификатор, "Идентификатор");
        Если СтрокаТаблицы <> Неопределено Тогда
            СтрокаТаблицы.ОбъектСопоставления = Выборка.Ссылка;
        КонецЕсли;
        
    КонецЦикла;
    
КонецПроцедуры

Изображение

ЗагрузитьИзФайла

В этом методе по данным ТЗ ЗагружаемыеДанные и структуры ПараметрыЗагрузки необходимо реализовать создание/обновление элементов справочников. В структуре ПараметрыЗагрузки указаны значения этих параметров Изображение

Свойство Тип Значение
ОбновлятьСуществующие Число 1, если обновлять сопоставленные элементы, 0, если не обновлять
СоздаватьНовые Число 1, если создавать новые несопоставленные элементы, 0, если пропускать

Пример

// Загрузка данных из файла.
//
// Параметры:
//  ЗагружаемыеДанные - см. ЗагрузкаДанныхИзФайла.ОписаниеЗагружаемыхДанныхДляСправочников
//  ПараметрыЗагрузки - см. ЗагрузкаДанныхИзФайла.НастройкиЗагрузкиДанных
//  Отказ - Булево    - отмена загрузки. Например, если данные некорректные.
//
Процедура ЗагрузитьИзФайла(ЗагружаемыеДанные, ПараметрыЗагрузки, Отказ) Экспорт
	
	Для Каждого СтрокаТаблицы Из ЗагружаемыеДанные Цикл
		
		ОбъектСопоставленияЗаполнен = ЗначениеЗаполнено(СтрокаТаблицы.ОбъектСопоставления);

		Если (ОбъектСопоставленияЗаполнен И ПараметрыЗагрузки.ОбновлятьСуществующие = 0)
			Или (Не ОбъектСопоставленияЗаполнен И ПараметрыЗагрузки.СоздаватьНовые = 0) Тогда
			
			СтрокаТаблицы.РезультатСопоставленияСтроки = "Пропущен";
			
			Продолжить;
			
		КонецЕсли;

		НачатьТранзакцию();
		
		Попытка
			Если ОбъектСопоставленияЗаполнен Тогда

				Блокировка        = Новый БлокировкаДанных;
				ЭлементБлокировки = Блокировка.Добавить("Справочник.ТестовыйСправочник");
				ЭлементБлокировки.УстановитьЗначение("Ссылка", СтрокаТаблицы.ОбъектСопоставления);
				Блокировка.Заблокировать();

				ЭлементСправочника = СтрокаТаблицы.ОбъектСопоставления.ПолучитьОбъект();

				Если ЭлементСправочника = Неопределено Тогда
					ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
						НСтр("ru = 'Номенклатура с артикулом %1 не существует.'"), СтрокаТаблицы.Артикул);
				КонецЕсли;
				СтрокаТаблицы.РезультатСопоставленияСтроки = "Обновлен";

			Иначе

				ЭлементСправочника = СоздатьЭлемент();
				СтрокаТаблицы.РезультатСопоставленияСтроки = "Создан";

			КонецЕсли;

			ЭлементСправочника.Наименование = СтрокаТаблицы.Наименование;

			Если Не ЭлементСправочника.ПроверитьЗаполнение() Тогда
				
				СтрокаТаблицы.РезультатСопоставленияСтроки = "Пропущен";
				ОтменитьТранзакцию();
				
			Иначе
				ЭлементСправочника.Записать();
				СтрокаТаблицы.ОбъектСопоставления = ЭлементСправочника.Ссылка;

				// Для записи данных из колонки <Дополнительные реквизиты>
				ЗагрузкаДанныхИзФайла.ЗаписатьСвойстваОбъекта(ЭлементСправочника.Ссылка, СтрокаТаблицы);
				
				ЗафиксироватьТранзакцию();
				
			КонецЕсли;
		Исключение
			ОтменитьТранзакцию();
			УправлениеДоступом.ОтключитьОбновлениеКлючейДоступа(Ложь, Ложь);
			Причина = ОбработкаОшибок.КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
			СтрокаТаблицы.РезультатСопоставленияСтроки = "Пропущен";
			СтрокаТаблицы.ОписаниеОшибки = НСтр("ru = 'Невозможна запись данных по причине:'") + Символы.ПС + Причина;
		КонецПопытки;
	КонецЦикла;
	
КонецПроцедуры