перем Товары_из_файла; перем Группы_из_файла; перем Плохой_файл; перем Счетчик_групп; перем Счетчик_товаров; перем Вид_номенклатуры_товар; перем Классификатор_штука; перем Единица_измерения_штука; перем Ставка_НДС; перем Статья_затрат; перем Вид_воспроизводства; перем Стиль_первого_уровня; перем Стиль_второго_уровня; перем Стиль_третьего_уровня; перем Предыдущая_группа; перем Предыдущая_группа_уровня_1; перем Предыдущая_группа_уровня_2; перем Свойство_трудоёмкость; перем Свойство_поставщик; перем Свойство_код_заказа; // Создать и вернуть структуру для товара функция Новый_товар (название, группа, полное_название, описание, трудоемкость, поставщик, код_заказа) товар = новый Структура ("Название, Группа, Полное_название, Описание," + "Трудоемкость, Поставщик, Код_заказа"); товар.Название = название; товар.Группа = группа; товар.Полное_название = полное_название; товар.Описание = описание; товар.Трудоемкость = трудоемкость; товар.Поставщик = поставщик; товар.Код_заказа = код_заказа; возврат товар; конецфункции // Создать и вернуть структуру для товара функция Новая_группа (название, группа) товар = новый Структура ("Название, Группа"); товар.Название = название; товар.Группа = группа; возврат товар; конецфункции // Добавить товар к общему списку процедура Добавить_товар (название, группа, полное_название, описание, трудоемкость, поставщик, код_заказа) если группа = "" тогда ошибка = "Нет группы для товара """ + название + """"; Сообщить (ошибка); Плохой_файл = Истина; возврат; конецесли; т = Товары_из_файла [название]; если т <> неопределено тогда ошибка = "Повторяется название """ + название + """"; Сообщить (ошибка); Плохой_файл = Истина; возврат; конецесли; т = Новый_товар (название, группа, полное_название, описание, трудоемкость, поставщик, код_заказа); Товары_из_файла.Вставить (название, т); конецпроцедуры // Добавить группу к общему списку процедура Добавить_группу (название, группа) если группа = "" тогда ошибка = "Нет группы для группы """ + название + """"; Сообщить (ошибка); Плохой_файл = Истина; возврат; конецесли; г = Группы_из_файла [название]; если г <> неопределено тогда ошибка = "Повторяется группа """ + название + """"; Сообщить (ошибка); Плохой_файл = Истина; возврат; конецесли; г = Новая_группа (название, группа); Группы_из_файла.Вставить (название, г); конецпроцедуры // Прочитать строку из файла XML, занести в список товаров процедура Обработать_строку_из_файла (файл) строка = ""; номер_столбца = 0; уровень_группы = 0; ячейка = новый Массив(20); ячейка[0] = ""; ячейка[1] = ""; ячейка[2] = ""; ячейка[3] = ""; ячейка[4] = ""; ячейка[5] = ""; пока файл.Прочитать() цикл если файл.ТипУзла = ТипУзлаXML.КонецЭлемента и файл.Имя = "Row" тогда прервать; конецесли; если файл.ТипУзла = ТипУзлаXML.НачалоЭлемента и файл.Имя = "Cell" тогда // Начало ячейки - запоминаем стиль ячейка [номер_столбца] = ""; если файл.КоличествоАтрибутов() > 0 тогда пока файл.ПрочитатьАтрибут() цикл если файл.Имя = "ss:Index" тогда номер_столбца = Число (файл.Значение) - 1; продолжить; конецесли; если файл.Имя <> "ss:StyleID" тогда продолжить; конецесли; если файл.Значение = Стиль_первого_уровня тогда уровень_группы = 1; ЭлементыФормы.Лог.ДобавитьСтроку (""); строка = строка + "****** "; иначеесли файл.Значение = Стиль_второго_уровня тогда уровень_группы = 2; ЭлементыФормы.Лог.ДобавитьСтроку (""); строка = строка + "**** "; иначеесли файл.Значение = Стиль_третьего_уровня тогда уровень_группы = 3; ЭлементыФормы.Лог.ДобавитьСтроку (""); строка = строка + "** "; конецесли; конеццикла; конецесли; иначеесли файл.ТипУзла = ТипУзлаXML.КонецЭлемента и файл.Имя = "Cell" тогда // Конец ячейки - увеличиваем номер столбца номер_столбца = номер_столбца + 1; иначеесли файл.ТипУзла = ТипУзлаXML.НачалоЭлемента и файл.Имя = "Data" тогда // Начало данных - ничего не делаем иначеесли файл.ТипУзла = ТипУзлаXML.КонецЭлемента и файл.Имя = "Data" тогда // Конец данных - ничего не делаем иначеесли файл.ТипУзла = ТипУзлаXML.Текст тогда ячейка [номер_столбца] = файл.Значение; строка = строка + файл.Значение + " "; конецесли; конеццикла; если строка = "" или ячейка[0] = "" или ячейка[0] = "Наименование" тогда // Пропускаем пустые строки возврат; конецесли; ЭлементыФормы.Лог.ДобавитьСтроку (строка); // Добавляем товар или группу если уровень_группы < 1 тогда Добавить_товар (ячейка[0], Предыдущая_группа, ячейка[0] + " " + ячейка[1], ячейка[5], ячейка[2], ячейка[3], ячейка[4]); иначе если уровень_группы = 1 тогда Добавить_группу (ячейка[0], "Комплектующие"); Предыдущая_группа_уровня_1 = ячейка[0]; иначеесли уровень_группы = 2 тогда Добавить_группу (ячейка[0], Предыдущая_группа_уровня_1); Предыдущая_группа_уровня_2 = ячейка[0]; иначеесли уровень_группы = 3 тогда Добавить_группу (ячейка[0], Предыдущая_группа_уровня_2); конецесли; // Запоминаем группу Предыдущая_группа = ячейка[0]; конецесли; конецпроцедуры процедура Прочитать_файлНажатие(Элемент) // Запрашиваем имя файла с дампом базы DEAS диалог = новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.Открытие); диалог.Заголовок = "Выберите файл типа Excel Spreadsheet.XML"; диалог.ПолноеИмяФайла = ""; диалог.Фильтр = "Excel Spreadsheet (*.xml) | *.xml"; диалог.МножественныйВыбор = Ложь; если не диалог.Выбрать() тогда возврат; конецесли; лог = ЭлементыФормы.Лог; лог.Очистить(); лог.ДобавитьСтроку ("### Чтение из файла " + диалог.ПолноеИмяФайла); // Здесь будем складывать данные, прочитанные из файла Товары_из_файла = новый Соответствие; Группы_из_файла = новый Соответствие; Стиль_первого_уровня = "s262"; Стиль_второго_уровня = "s255"; Стиль_третьего_уровня = "s263"; Предыдущая_группа = ""; Предыдущая_группа_уровня_1 = ""; Предыдущая_группа_уровня_2 = ""; // Читаем файл файл = новый ЧтениеXML; файл.ОткрытьФайл (диалог.ПолноеИмяФайла); Плохой_файл = Ложь; // Пропускаем всё до элемента Table пока файл.Прочитать() цикл если файл.ТипУзла = ТипУзлаXML.НачалоЭлемента и файл.Имя = "Table" тогда прервать; конецесли; конеццикла; // Читаем содержимое таблицы пока файл.Прочитать() цикл если файл.ТипУзла = ТипУзлаXML.КонецЭлемента и файл.Имя = "Table" тогда прервать; конецесли; если файл.ТипУзла = ТипУзлаXML.НачалоЭлемента и файл.Имя = "Row" тогда Обработать_строку_из_файла (файл); конецесли; конеццикла; файл.Закрыть(); // Подсчитываем количество товаров и групп Счетчик_товаров = 0; Счетчик_групп = 0; для каждого э из Группы_из_файла цикл г = э.Значение; Счетчик_групп = Счетчик_групп + 1; конеццикла; для каждого э из Товары_из_файла цикл т = э.Значение; Счетчик_товаров = Счетчик_товаров + 1; конеццикла; ЭлементыФормы.Всего_товаров.Заголовок = Строка (Счетчик_товаров); ЭлементыФормы.Всего_групп.Заголовок = Строка (Счетчик_групп); ЭлементыФормы.Добавлено_товаров.Заголовок = "--"; ЭлементыФормы.Добавлено_групп.Заголовок = "--"; если Плохой_файл тогда // Запрещаем кнопку занесения в базу ЭлементыФормы.Занести_в_базу.Доступность = Ложь; иначе // Разрешаем кнопку занесения в базу ЭлементыФормы.Занести_в_базу.Доступность = Истина; конецесли; конецпроцедуры // Занести группу в базу, предварительно занеся родительскую группу (рекурсивно) // Вернуть ссылку на занесенную т функция Занести_группу_в_базу (название) группа = Группы_из_файла [название]; если группа = неопределено тогда // Вершина - группа "Комплектующие" возврат Справочники.Номенклатура.НайтиПоНаименованию ("Комплектующие", Истина); конецесли; т = Справочники.Номенклатура.НайтиПоНаименованию (название, Истина); если не т.Пустая() тогда возврат т; конецесли; // Создаём новую группу родитель = Занести_группу_в_базу (группа.Группа); т = Справочники.Номенклатура.СоздатьГруппу (); т.Наименование = группа.Название; т.Родитель = родитель; т.ВидНоменклатуры = Вид_номенклатуры_товар; ЭлементыФормы.Лог.ДобавитьСтроку ("группа (" + СокрЛП (т.Родитель.Наименование) + ") """ + т + """"); т.Записать(); Счетчик_групп = Счетчик_групп + 1; // Перечитываем т из базы т = Справочники.Номенклатура.НайтиПоНаименованию (группа.Название, Истина); возврат т; конецфункции // Заносим в базу свойство товара. Аргументы: // товар - ссылка на Справочники.Номенклатура // свойство - ссылка на ПланыВидовХарактеристик.СвойстваОбъектов // значение - текстовая строка процедура Записать_свойство (товар, свойство, значение) запись = РегистрыСведений.ЗначенияСвойствОбъектов.СоздатьМенеджерЗаписи(); запись.Объект = товар; запись.Свойство = свойство; запись.Значение = значение; запись.Записать(); конецпроцедуры // Занести товар в базу процедура Занести_товар_в_базу (название, родитель, полное_название, описание, трудоемкость, поставщик, код_заказа) ссылка = Справочники.Номенклатура.НайтиПоНаименованию (название, Истина); если ссылка.Пустая() тогда // Создаём новый товар т = Справочники.Номенклатура.СоздатьЭлемент (); т.Наименование = название; т.Родитель = родитель; ЭлементыФормы.Лог.ДобавитьСтроку ("товар (" + СокрЛП (т.Родитель.Наименование) + ") """ + т + """"); Счетчик_товаров = Счетчик_товаров + 1; иначе т = ссылка.ПолучитьОбъект(); конецесли; // Устанавливаем атрибуты товара, принятые по умолчанию т.НаименованиеПолное = полное_название; т.Комментарий = описание; т.ВидНоменклатуры = Вид_номенклатуры_товар; т.БазоваяЕдиницаИзмерения = Классификатор_штука; т.СтавкаНДС = Ставка_НДС; т.СтатьяЗатрат = Статья_затрат; т.ВидВоспроизводства = Вид_воспроизводства; т.ВестиУчетПоСериям = Истина; т.Записать(); ссылка = т.Ссылка; // Свойства: трудоемкость, поставщик, код_заказа Записать_свойство (ссылка, Свойство_трудоёмкость, трудоемкость); Записать_свойство (ссылка, Свойство_поставщик, поставщик); Записать_свойство (ссылка, Свойство_код_заказа, код_заказа); конецпроцедуры процедура Занести_в_базуНажатие(Элемент) // Заносим товары и группы в базу лог = ЭлементыФормы.Лог; лог.Очистить(); лог.ДобавитьСтроку ("### Занесение данных в базу"); Счетчик_товаров = 0; Счетчик_групп = 0; ЭлементыФормы.Добавлено_товаров.Заголовок = "--"; ЭлементыФормы.Добавлено_групп.Заголовок = "--"; // Атрибуты товаров, принятые по умолчанию Вид_номенклатуры_товар = Справочники.ВидыНоменклатуры.НайтиПоНаименованию ("Товар"); Классификатор_штука = Справочники.КлассификаторЕдиницИзмерения.НайтиПоНаименованию ("шт"); Единица_измерения_штука = Справочники.ЕдиницыИзмерения.НайтиПоНаименованию ("шт"); Ставка_НДС = Перечисления.СтавкиНДС.НДС18; Статья_затрат = Справочники.СтатьиЗатрат.НайтиПоНаименованию ("Материалы собственные"); Вид_воспроизводства = Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка; // Ищем требуемые свойства Свойство_трудоёмкость = ПланыВидовХарактеристик.СвойстваОбъектов. НайтиПоНаименованию ("Трудоёмкость", Истина); Свойство_поставщик = ПланыВидовХарактеристик.СвойстваОбъектов. НайтиПоНаименованию ("Поставщик", Истина); Свойство_код_заказа = ПланыВидовХарактеристик.СвойстваОбъектов. НайтиПоНаименованию ("Код заказа", Истина); для каждого э из Группы_из_файла цикл г = э.Значение; Занести_группу_в_базу (г.Название); ЭлементыФормы.Добавлено_групп.Заголовок = Строка (Счетчик_групп); конеццикла; для каждого э из Товары_из_файла цикл т = э.Значение; родитель = Занести_группу_в_базу (т.Группа); Занести_товар_в_базу (т.Название, родитель, т.Полное_название, т.Описание, т.Трудоемкость, т.Поставщик, т.Код_заказа); ЭлементыФормы.Добавлено_товаров.Заголовок = Строка (Счетчик_товаров); конеццикла; конецпроцедуры