User Tools

Site Tools


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 03:35 by 127.0.0.1

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki