Загрузка данных
&НаСервере
Процедура ЗагрузитьВРегистрПересчетТМЦ(Исполнитель) Экспорт
Данные = ЗагрузитьДокументыПересчетТМЦ(Исполнитель);
Если Данные = Неопределено
ИЛИ ТипЗнч(Данные) <> Тип("Массив") Тогда
Возврат;
КонецЕсли;
ДатаЗагрузки = ТекущаяДатаСеанса();
// Группируем полученные строки по документам
ПоДокументам = Новый Соответствие;
Для Каждого СтрокаJSON Из Данные Цикл
КлючДокумента = СокрЛП(
ЗначениеЭлемента(СтрокаJSON, "Документ")
);
Если Не ЗначениеЗаполнено(КлючДокумента) Тогда
Продолжить;
КонецЕсли;
СтрокиДокумента = ПоДокументам.Получить(КлючДокумента);
Если СтрокиДокумента = Неопределено Тогда
СтрокиДокумента = Новый Массив;
ПоДокументам.Вставить(
КлючДокумента,
СтрокиДокумента
);
КонецЕсли;
СтрокиДокумента.Добавить(СтрокаJSON);
КонецЦикла;
// Каждый документ обрабатываем в отдельной транзакции
Для Каждого КлючИЗначение Из ПоДокументам Цикл
ИмяДокумента = КлючИЗначение.Ключ;
НачатьТранзакцию();
Попытка
////////////////////////////////////////////////////////////////////////////////
// Получаем инвентарные номера, которые уже записаны по этому документу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ВРег(
| ПересчетТМЦ.ОсновноеСредствоИнвентарныйНомер
| ) КАК ИнвентарныйНомер
|ИЗ
| РегистрСведений.ПересчетТМЦ КАК ПересчетТМЦ
|ГДЕ
| ПересчетТМЦ.ДокументПересчетТМЦ = &Документ";
Запрос.УстановитьПараметр(
"Документ",
ИмяДокумента
);
СуществующиеНомера = Новый Соответствие;
ВыборкаСуществующихЗаписей =
Запрос.Выполнить().Выбрать();
Пока ВыборкаСуществующихЗаписей.Следующий() Цикл
СуществующиеНомера.Вставить(
ВыборкаСуществующихЗаписей.ИнвентарныйНомер,
Истина
);
КонецЦикла;
////////////////////////////////////////////////////////////////////////////////
// Формируем набор только из отсутствующих записей
НаборЗаписей =
РегистрыСведений.ПересчетТМЦ.СоздатьНаборЗаписей();
// Используется для проверки дублей внутри текущего JSON
ОбработанныеНомера = Новый Соответствие;
Для Каждого СтрокаJSON Из КлючИЗначение.Значение Цикл
ИнвентарныйНомер = СокрЛП(
ЗначениеЭлемента(
СтрокаJSON,
"ИнвентарныйНомер"
)
);
НормализованныйНомер = ВРег(ИнвентарныйНомер);
// Строки без инвентарного номера не загружаем
Если Не ЗначениеЗаполнено(НормализованныйНомер) Тогда
Продолжить;
КонецЕсли;
// Если запись уже есть в регистре — пропускаем
Если СуществующиеНомера.Получить(
НормализованныйНомер
) <> Неопределено Тогда
Продолжить;
КонецЕсли;
// Если номер уже встретился в текущей загрузке — пропускаем
Если ОбработанныеНомера.Получить(
НормализованныйНомер
) <> Неопределено Тогда
Продолжить;
КонецЕсли;
ОбработанныеНомера.Вставить(
НормализованныйНомер,
Истина
);
Запись = НаборЗаписей.Добавить();
Запись.Период = ТекущаяДата();
Запись.ДокументПересчетТМЦ =
ИмяДокумента;
Запись.ОсновноеСредствоИнвентарныйНомер =
ИнвентарныйНомер;
// По договоренности не заполняем
Запись.УИДокумента = "";
Запись.ДатаСоздания = ДатаИзJSON(
ЗначениеЭлемента(
СтрокаJSON,
"ПересчетТМЦДата"
)
);
Запись.ДатаЗагрузки = ДатаЗагрузки;
Запись.ОсновноеСредствоНаименование =
ЗначениеЭлемента(
СтрокаJSON,
"НаименованиеОсновногоСредства"
);
Запись.ОсновноеСредствоУИД =
ЗначениеЭлемента(
СтрокаJSON,
"КодОсновногоСредства"
);
Запись.ОсновноеСредствоСерийныйНомер =
ЗначениеЭлемента(
СтрокаJSON,
"СерийныйНомер"
);
// Начальные значения
Запись.КоличествоПлан = 1;
Запись.КоличествоФакт = 0;
Запись.Чек = Ложь;
КонецЦикла;
////////////////////////////////////////////////////////////////////////////////
// Если обнаружены новые записи — добавляем их без замещения существующих
Если НаборЗаписей.Количество() > 0 Тогда
// Ложь — не удалять ранее существовавшие записи
НаборЗаписей.Записать(Ложь);
////////////////////////////////////////////////////////////////////////////////
// Устанавливаем статус документа
НаборЗаписейСтатус =
РегистрыСведений.СтатусыДокументов.СоздатьНаборЗаписей();
НоваяЗаписьСтатус =
НаборЗаписейСтатус.Добавить();
НоваяЗаписьСтатус.ДокументТМЦ =
ИмяДокумента;
НоваяЗаписьСтатус.Период =
ТекущаяДата();
НоваяЗаписьСтатус.Статус =
Перечисления.СтатусыДокументовТМЦ.ВРаботе;
НаборЗаписейСтатус.Записать();
КонецЕсли;
ЗафиксироватьТранзакцию();
Исключение
ОтменитьТранзакцию();
Сообщить(
"Ошибка загрузки документа """
+ ИмяДокумента
+ """: "
+ ОписаниеОшибки()
);
КонецПопытки;
КонецЦикла;
КонецПроцедуры