1c:load-nomen
перем Товары_из_файла;
перем Группы_из_файла;
перем Плохой_файл;
перем Счетчик_групп;
перем Счетчик_товаров;
перем Вид_номенклатуры_товар;
перем Классификатор_штука;
перем Единица_измерения_штука;
перем Ставка_НДС;
перем Статья_затрат;
перем Вид_воспроизводства;
перем Стиль_первого_уровня;
перем Стиль_второго_уровня;
перем Стиль_третьего_уровня;
перем Предыдущая_группа;
перем Предыдущая_группа_уровня_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;
Статья_затрат = Справочники.СтатьиЗатрат.НайтиПоНаименованию ("Материалы собственные");
Вид_воспроизводства = Перечисления.ВидыВоспроизводстваНоменклатуры.Закупка;
// Ищем требуемые свойства
Свойство_трудоёмкость = ПланыВидовХарактеристик.СвойстваОбъектов.
НайтиПоНаименованию ("Трудоёмкость", Истина);
Свойство_поставщик = ПланыВидовХарактеристик.СвойстваОбъектов.
НайтиПоНаименованию ("Поставщик", Истина);
Свойство_код_заказа = ПланыВидовХарактеристик.СвойстваОбъектов.
НайтиПоНаименованию ("Код заказа", Истина);
для каждого э из Группы_из_файла цикл
г = э.Значение;
Занести_группу_в_базу (г.Название);
ЭлементыФормы.Добавлено_групп.Заголовок = Строка (Счетчик_групп);
конеццикла;
для каждого э из Товары_из_файла цикл
т = э.Значение;
родитель = Занести_группу_в_базу (т.Группа);
Занести_товар_в_базу (т.Название, родитель, т.Полное_название, т.Описание,
т.Трудоемкость, т.Поставщик, т.Код_заказа);
ЭлементыФормы.Добавлено_товаров.Заголовок = Строка (Счетчик_товаров);
конеццикла;
конецпроцедуры
1c/load-nomen.txt · Last modified: 2008/03/12 10:35 by 127.0.0.1