Загрузка и выгрузка перечисляемых значений из 1С 7.7 в шаблоны Excel и обратно

1. Михаил Култышев (mkk) 08.06.17 19:34 Сейчас в теме
Доброго времени суток. Есть самописная конфа на 7.7 для абон.отдела управляющей компании. Есть необходимость загрузки данных из БД на ГИС ЖКХ через шаблоны Excel. Опыт организации интерфейса из 7.7 из/в Excel минимален. Вроде есть голова и руки. Погуглил, почитал инфостарт - чтение/запись в ячейки Excel немного проясняется. Пугают и настораживают 3 вещи:
1. Как узнать, какой формат у ячейки к заполнению данными.
2. Как из ячейки Excel считать значения перечисляемого типа (список значений) в 1С и как уже из 1С записать в эту ячейку выбранное значение.
2. Как считать (и загрузить/выгрузить) какой формат ячейки предлагается в перечисляемом типе к заполнению (строка, число, дата или еще новый перечисляемый тип).
Сам из Крыма. Не так давно закончили конвертировать базы на росс. законодательство. А тут новая проблема надвигается - ГИС ЖКХ. Не пытаюсь выдавить слезу, но... "Денег нет, но вы держитесь". Буду благодарен за примеры, за готовые какие-то нибудь промежуточные решения (1С 7.7 уже давно живет), может еще что-то предложат форумчане.
Ответы
2. Николай Поздяев (nike-arz) 09.06.17 16:06 Сейчас в теме
(1) Это пример для 8-ки, но форматы ячеек подойдут и для 7.7
Эксель   = Новый COMОбъект("Excel.Application");
		Эксель.Application.Workbooks.Add(1); 
		Книга = Эксель.Workbooks.Item(1); 
		Лист  = Эксель.ActiveSheet;	
		
		// Формат колонок
		Для Сч = 1 ПО 9 Цикл
			Если Сч = 1 ИЛИ
				 Сч = 2 Тогда
				Лист.Columns(Сч).NumberFormat = "@"; //Текстовый формат
				Лист.Columns(Сч).ColumnWidth=15;
			КонецЕсли;	
			Если Сч = 3 ИЛИ
				Сч = 6 ИЛИ
				Сч = 8 Тогда
				Лист.Columns(Сч).NumberFormat = "@"; //Текстовый формат
				Лист.Columns(Сч).ColumnWidth=50;
			КонецЕсли;	
			Если Сч = 4 Тогда
				Лист.Columns(Сч).NumberFormat = "0,000;[Красный]-0,000"; //Числовой формат
				Лист.Columns(Сч).ColumnWidth=12;
			КонецЕсли;
			Если Сч = 5 Тогда
				Лист.Columns(Сч).NumberFormat = "@"; //Текстовый формат
				Лист.Columns(Сч).ColumnWidth=8;
			КонецЕсли;	
			Если Сч = 7 Тогда
				Лист.Columns(Сч).NumberFormat = "@"; //Текстовый формат
				Лист.Columns(Сч).ColumnWidth=15;
			КонецЕсли;	
			Если Сч = 9 Тогда
				Лист.Columns(Сч).NumberFormat = "@"; //Текстовый формат
				Лист.Columns(Сч).ColumnWidth=8;
			КонецЕсли;	
		КонецЦикла;
		
		НомерСтроки = 1;
		
		//Заголовок
		Лист.Cells(НомерСтроки,1).Value = "GUID";
		Лист.Cells(НомерСтроки,2).Value = "ОКПД";
		Лист.Cells(НомерСтроки,3).Value = "Наименование";
		Лист.Cells(НомерСтроки,4).Value = "Цена";
		Лист.Cells(НомерСтроки,5).Value = "Единица";
		Лист.Cells(НомерСтроки,6).Value = "Характеристика";
		Лист.Cells(НомерСтроки,7).Value = "ТУ";
		Лист.Cells(НомерСтроки,8).Value = "Марка";
		Лист.Cells(НомерСтроки,9).Value = "Регион";
		
		Для каждого СтрокаМассива Из МассивДанных Цикл
			
			НомерСтроки  = НомерСтроки + 1;
			
			Лист.Cells(НомерСтроки,1).Value = СтрокаМассива[0];
			Лист.Cells(НомерСтроки,2).Value = СтрокаМассива[1];
			Лист.Cells(НомерСтроки,3).Value = СтрокаМассива[2];
			Лист.Cells(НомерСтроки,4).Value = СтрокаМассива[3];
			Лист.Cells(НомерСтроки,5).Value = СтрокаМассива[4];
			Лист.Cells(НомерСтроки,6).Value = СтрокаМассива[5];
			Лист.Cells(НомерСтроки,7).Value = СтрокаМассива[6];
			Лист.Cells(НомерСтроки,8).Value = СтрокаМассива[7];
			Лист.Cells(НомерСтроки,9).Value = СтрокаМассива[8];
				
		КонецЦикла;
		
		Попытка
			Книга.SaveAs(СокрЛП(ПутьКФайлу));
		Исключение
			Сообщить("Неудалось записать файл "+ПутьКФайлу);
			Эксель.Application.Quit();
		КонецПопытки;	
	
		ЗафиксироватьТранзакцию();
	
		Эксель.Application.Quit();
Показать
Прикрепленные файлы:
Pimer.ert
3. Николай Поздяев (nike-arz) 09.06.17 16:53 Сейчас в теме
(1) Здесь пример кода загрузки из Excel
Прикрепленные файлы:
PrimerZagruzki.ert
4. Михаил Култышев (mkk) 11.06.17 16:04 Сейчас в теме
Спасибо за подсказку. Просмотрел. Но уточню свой вопрос. Я ожидал примерно такое решение вопроса (попробую описать шаги):
1. Берем (открываем) файл шаблон Excel. За исключением шапки идем дальше.
2. Считываем строку и определяем, какой формат в каждой ячейке строки (если число - точность, дата, если строка - макс. символов и т.д). Как из 1С записать в Excel (число, дату, строку) - более-менее понятно.
3. Но в шаблонах есть ячейки, где уже назначено перечисляемое значение (список значений). Как считать (импортировать в 1С) этот список из ячейки?
4. При выборе значения в списке, в соседней ячейке надо ввести параметр (характеристику значения). Опять же параметр-ответ может быть числом, датой, строкой и т.д. Как узнать "связку": выбранное значение из списка - ожидаемый формат ответа?
5. Я уже встретил в списке значения, где ожидаемый параметр-ответ - опять же перечислимый список значений. Как его импортировать в 1С?
6. Если в 1С пользователь выберет "то, что надо" из списка, как записать в ячейки Excel с перечислимым значением его выбор?
5. Николай Поздяев (nike-arz) 13.06.17 12:10 Сейчас в теме
(4) Посмотрите в формате ячеек Excel. Откройте формат ячеек и посмотрите все форматы. Может найдете для себя ответ.
6. АБВГД ЕКЛМН (MikeGorshkov) 12.08.17 20:03 Сейчас в теме
(4)Как успехи? Так же интересует вопрос по формированию этих шаблонов.
Под специфику организации допиленная конфа на 77. теперь в гис данные формировать. В 77 и excel никогда не настраивал так как не было необходимости.
Если есть где-то похожая статья помогите
7. Николай Поздяев (nike-arz) 12.08.17 20:13 Сейчас в теме
(6) Если вы никогда не формировали формат ячеек в Excel то лучше лучше используйте текстовый формат. А при загрузке в 1с77 сообразите как из текста сформировать необходимый формат.
8. Михаил Култышев (mkk) 13.08.17 13:25 Сейчас в теме
Статус кво на сегодняшний момент:
1. Попытался по-больше упростить себе задачу - сроки поджимают. Принимаю, что формат шаблона известен (на сегодня, что будет потом, то потом). Универсализм пока еще в зародыше.
2. Считываю данные из шаблона через com-объект.
Эксель = СоздатьОбъект("Excel.Application");
Только перед работой с Экселем вставил заглушку на момент отладки и сбоев
//проверка на открытость - закрываем
Эксель.DisplayAlerts = 0;
Эксель.Quit();
*************
Открытие и закрытие файла-шаблона - стандартное: наличие через ФС.СуществуетФайл(ФайлШаблона),
а открытие через Книга = Эксель.WorkBooks.Open(ФайлШаблона);
*************
Доступ к листу, считывание кол-ва строк и столбцов - пропускаю, что бы не повторятся. В инете много про это есть.
3. Зная структуру шаблона (шапка, имя листа, кол-во строк и столбцов) - через цикл закачиваю данные в 1С.
4. При записи в Лист.Cells(НомСтр, НомКол).Value = мое_значение, тоже старался облегчить себе задачу: в числовые ячейки - число (без форматирования, эксель сам их причешет по разрядности, кол-ву знаков и т.д.), дата - дату и т.д. Общая запись шаблона через: Книга. SaveAs (ФайлШаблона).
5. Где ячейка с перечисляемым значением делал так: если это значение "плавало" от версии к версии шаблона, то ПКМ на ярлычок листа (внизу) - Отобразить - там есть листы с этими самыми значениями - (и там принцип небольшого справочника - слева код - справа его значение), сначала загонял их к себе в 1С по признаку кода. Если значение перечисления более-менее "постоянно" от версии к версии шаблона, то обращение к этой ячейке (считывание/запись) делал текстовым. Например: в ячейке - тип документа как перечисление - "Текущий" или "Долговой" - в 1С делаю перечисление со значениями "Текущий" или "Долговой", а вот запись в ячейку - как текст "Текущий" или "Долговой" из своего перечисления. Правда пока не экспериментировал с регистром строки (можно ли подменять заглавные и/или прописные).
6. А в конце опять:
Эксель.Quit();
Эксель.DisplayAlerts = 1;

Вот пока мои небольшие достижения. Но они работают.
Оставьте свое сообщение