Этот код для Firebird мне тяжело дался

Несколько раз его переписывал. Хотел в одном цикле по записям Firebird загружать как справочники, так и шапки документов и табличные части документов.

В итоге вынес часть кода в функции ИскатьОбъектПоКлючу и СоздатьОбъектПоКлючу, что сделало код более обозримым. В итоге получилось:

Запрос = ВыполнитьЗапрос(Соединение, SQL);

ОО = Неопределено;
ОбъектШапки = Неопределено;
ПредЗначениеКлюча = Неопределено;
ОбъектПолучатель = Неопределено;

ЭтоТЧ =  СтруктураЗагрузки.МенеджерКласса = Документы И НЕ СтруктураЗагрузки.ЭтоШапка;

Набор = Запрос.Набор;
Пока не Набор.EOF Цикл
	
	//Получаем значение ключа
	ЗначениеКлюча =  Набор.Fields(СтруктураЗагрузки.КлючFirebird).Value;
	ЭтоНовыйКлюч = ПредЗначениеКлюча <> ЗначениеКлюча;
	

	//Когда прочитали всю ТЧ, записываем объект
	Если ЭтоТЧ И ЭтоНовыйКлюч Тогда
		ЗаписатьОО(СтруктураЗагрузки, ОбъектШапки, ЗначениеКлюча);
	КонецЕсли;

	Если ЭтоТЧ И ЭтоНовыйКлюч ИЛИ Не ЭтоТЧ Тогда
		ОбъектШапки = ИскатьОбъектПоКлючу(СтруктураЗагрузки, ЗначениеКлюча);
	КонецЕсли;
	
	Если ОбъектШапки = Неопределено И НЕ ЭтоТЧ Тогда
		ОбъектШапки = СоздатьОбъектПоКлючу(СтруктураЗагрузки, ЗначениеКлюча);
	КонецЕсли;

	Если ЭтоТЧ Тогда 
		Если ОбъектШапки = Неопределено Тогда
			ОО = Неопределено;
		Иначе
			Если ЭтоНовыйКлюч Тогда
				ОО = ОбъектШапки[СтруктураЗагрузки.Часть1С];
				ОО.Очистить(); //Табличная часть - очищаем
			КонецЕсли;
			ОО = ОбъектШапки[СтруктураЗагрузки.Часть1С].Добавить(); //Строка табличной части
		КонецЕсли;
	Иначе
		ОО = ОбъектШапки; //Шапка документа или справочника
	КонецЕсли;
	
	
	//Загрузка, если объект пустой, то пропускаем
	Если ОО <> Неопределено Тогда
		Для Каждого ПолеКЗ ИЗ СтруктураЗагрузки.Поля Цикл                                             
			Если ЭтоТЧ и ПолеКЗ.Значение = СтруктураЗагрузки.КлючFirebird Тогда 
				//Ключевое поле для ТЧ пропускаем, его не надо устанавливать в 1С
				Продолжить; 
			КонецЕсли;
			ЗначениеFirebird = Набор.Fields(ПолеКЗ.Значение).Value;
			ПрисвоитьПолюБезопасно(ОО, ПолеКЗ.Ключ, ЗначениеFirebird);
		КонецЦикла;                                              
		
		Если СтруктураЗагрузки.ПослеЗагрузки <> "" Тогда
			Выполнить(СтруктураЗагрузки.ПослеЗагрузки);
		КонецЕсли;
	КонецЕсли;

	ПредЗначениеКлюча = ЗначениеКлюча; //Важно для табличных частей 
	
	Набор.MoveNext(); 

	//Для последней записи ТЧ и для всех шапок и справочников
	Если ЭтоТЧ и Набор.EOF ИЛИ НЕ ЭтоТЧ Тогда
		ЗаписатьОО(СтруктураЗагрузки, ОбъектШапки, ЗначениеКлюча);
	КонецЕсли;
	
КонецЦикла;

Обратите внимание на запись объекта табличной части на последнем проходе цикла. У меня еще в этом коде был goto, но потом я все же от него отказался.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

комментария 4

  1. rzd:

    Условие вида
    (А и Б) или Не А
    можно сократить до
    Б или Не А

  2. Пррп:

    А где тут фираберд? Ты просто рекодсет обходишь, а от чего по сути неважно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *