Этот код для Firebird мне тяжело дался
Несколько раз его переписывал. Хотел в одном цикле по записям Firebird загружать как справочники, так и шапки документов и табличные части документов.
В итоге вынес часть кода в функции ИскатьОбъектПоКлючу и СоздатьОбъектПоКлючу, что сделало код более обозримым. В итоге получилось:
Запрос = ВыполнитьЗапрос(Соединение, SQL); ОО = Неопределено; ОбъектШапки = Неопределено; ПредЗначениеКлюча = Неопределено; ОбъектПолучатель = Неопределено; ЭтоТЧ = СтруктураЗагрузки.МенеджерКласса = Документы И НЕ СтруктураЗагрузки.ЭтоШапка; Набор = Запрос.Набор; Пока не Набор.EOF Цикл //Получаем значение ключа ЗначениеКлюча = Набор.Fields(СтруктураЗагрузки.КлючFirebird).Value; ЭтоНовыйКлюч = ПредЗначениеКлюча <> ЗначениеКлюча; //Когда прочитали всю ТЧ, записываем объект Если ЭтоТЧ И ЭтоНовыйКлюч Тогда ЗаписатьОО(СтруктураЗагрузки, ОбъектШапки, ЗначениеКлюча); КонецЕсли; Если ЭтоТЧ И ЭтоНовыйКлюч ИЛИ Не ЭтоТЧ Тогда ОбъектШапки = ИскатьОбъектПоКлючу(СтруктураЗагрузки, ЗначениеКлюча); КонецЕсли; Если ОбъектШапки = Неопределено И НЕ ЭтоТЧ Тогда ОбъектШапки = СоздатьОбъектПоКлючу(СтруктураЗагрузки, ЗначениеКлюча); КонецЕсли; Если ЭтоТЧ Тогда Если ОбъектШапки = Неопределено Тогда ОО = Неопределено; Иначе Если ЭтоНовыйКлюч Тогда ОО = ОбъектШапки[СтруктураЗагрузки.Часть1С]; ОО.Очистить(); //Табличная часть - очищаем КонецЕсли; ОО = ОбъектШапки[СтруктураЗагрузки.Часть1С].Добавить(); //Строка табличной части КонецЕсли; Иначе ОО = ОбъектШапки; //Шапка документа или справочника КонецЕсли; //Загрузка, если объект пустой, то пропускаем Если ОО <> Неопределено Тогда Для Каждого ПолеКЗ ИЗ СтруктураЗагрузки.Поля Цикл Если ЭтоТЧ и ПолеКЗ.Значение = СтруктураЗагрузки.КлючFirebird Тогда //Ключевое поле для ТЧ пропускаем, его не надо устанавливать в 1С Продолжить; КонецЕсли; ЗначениеFirebird = Набор.Fields(ПолеКЗ.Значение).Value; ПрисвоитьПолюБезопасно(ОО, ПолеКЗ.Ключ, ЗначениеFirebird); КонецЦикла; Если СтруктураЗагрузки.ПослеЗагрузки <> "" Тогда Выполнить(СтруктураЗагрузки.ПослеЗагрузки); КонецЕсли; КонецЕсли; ПредЗначениеКлюча = ЗначениеКлюча; //Важно для табличных частей Набор.MoveNext(); //Для последней записи ТЧ и для всех шапок и справочников Если ЭтоТЧ и Набор.EOF ИЛИ НЕ ЭтоТЧ Тогда ЗаписатьОО(СтруктураЗагрузки, ОбъектШапки, ЗначениеКлюча); КонецЕсли; КонецЦикла;
Обратите внимание на запись объекта табличной части на последнем проходе цикла. У меня еще в этом коде был goto, но потом я все же от него отказался.
Условие вида
(А и Б) или Не А
можно сократить до
Б или Не А
да, я чуял что можно сократить, но все усилия мозга ушли на победу над кодом.
А где тут фираберд? Ты просто рекодсет обходишь, а от чего по сути неважно.
да, recordset от firebird.