Чтение/Запись документа Excel 2007 без офиса, без внешних компонент. (с примером для 7.7, 8.1 и 8.2 на управляемых формах)

Публикация № 19139

Разработка - Практика программирования

Чтение/запись документ Excel 2007 без установленного Excel'а, без внешних компонент, исключительно средствами 1С (7.7, 8.1, 8.2 на управляемых формах).

Написано в ознакомительных целях, по аналогии с //infostart.ru/projects/2365/

Использование (1С 8.x): вставляете обработку в конфигурацию и используете ее методы:

Процедура ОткрытьФайлЭкзекль2007(ПутьКФайлу)
    Экзель = Обработки.Excel2007.Создать();
 
    Если НЕ Экзель.ОткрытьФайл(ПутьКФайлу) Тогда
        Предупреждение("Файл " + ПутьКФайлу + " не открыт!");
        Возврат;
    КонецЕсли;
 
    Если НЕ Экзель.ОткрытьЛист(1) Тогда
        Предупреждение("Лист 1 не открыт!");
        Возврат;
    КонецЕсли;
 
    Сообщить("Количество строк: " + Экзель.Лист.Количество());
    Сообщить("Количество колонок: " + Экзель.Лист.Колонки.Количество());
КонецПроцедуры

Процедура СоздатьФайлЭкзель2007(ПутьКФайлу)
    //заполняем ТЗ
    ТЗ = Новый ТаблицаЗначений;
    ТЗ.Колонки.Добавить("К1");
    ТЗ.Колонки.Добавить("К2");
 
    Стр = ТЗ.Добавить();
    Стр.К1 = "Номенклатура";
    Стр.К2 = "Количество";
 
    Стр = ТЗ.Добавить();
    Стр.К1 = "Хлеб";
    Стр.К2 = 10;
 
    Стр = ТЗ.Добавить();
    Стр.К1 = "Мясо";
    Стр.К2 = 14;
 
    //сохраняем тз в экзель
    Экзель = Обработки.Excel2007.Создать();
    Экзель.Лист = ТЗ;
    Экзель.Записать(ПутьКФайлу);
 
КонецПроцедуры

Использование (1С 7.7): добавляете из демо-базы все из глобального модуля в свой, файл шаблона кладете в папку с конфигурацией и используете по примеру:

Процедура ОткрытьФайлЭкзекль2007(ПутьКФайлу)
    Если экзель_ОткрытьФайл(ПутьКФайлу) = 0 Тогда
        Предупреждение("Файл " + ПутьКФайлу + " не открыт!");
        Возврат;
    КонецЕсли;
 
    Если экзель_ОткрытьЛист(1) = 0 Тогда
        Предупреждение("Лист 1 не открыт!");
        Возврат;
    КонецЕсли;
 
    Сообщить("Количество строк: " + экзель_Лист.КоличествоСтрок());
    Сообщить("Количество колонок: " + экзель_Лист.КоличествоКолонок());
    Сообщить("***");
 
    //выведем 1 строку
    Для сч = 1 По экзель_Лист.КоличествоКолонок() Цикл
        Сообщить(экзель_Лист.ПолучитьЗначение(1, сч));
    КонецЦикла;
КонецПроцедуры
//*******************************************
Процедура СоздатьФайлЭкзель2007(ПутьКФайлу)
    //заполняем ТЗ
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("К1");
    ТЗ.НоваяКолонка("К2");
 
    ТЗ.НоваяСтрока();
    ТЗ.К1 = "Номенклатура";
    ТЗ.К2 = "Количество";
 
    ТЗ.НоваяСтрока();
    ТЗ.К1 = "Хлеб";
    ТЗ.К2 = 10;
 
    ТЗ.НоваяСтрока();
    ТЗ.К1 = "Мясо";
    ТЗ.К2 = 14;
 
    //сохраняем тз в экзель
    экзель_Лист = ТЗ;
    Если экзель_Записать(ПутьКФайлу) = 1 Тогда
        Сообщить("Создан " + ПутьКФайлу);
        ЗапуститьПриложение(ПутьКФайлу);
    КонецЕсли;
КонецПроцедуры

Скачать файлы

Наименование Файл Версия Размер
Обработка для 8.1 и 8.2
.zip 29,08Kb
20.01.10
3081
.zip 29,08Kb 3081 Скачать бесплатно
Конфигурация для 1С 7.7
.1235567370 37,10Kb
25.09.09
1100
.1235567370 37,10Kb 1100 Скачать бесплатно

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. Душелов 3914 24.02.09 17:10 Сейчас в теме
Свойство "Лист" у обработки - это таблица значений.
2. Душелов 3914 24.02.09 17:14 Сейчас в теме
Собственно код довольно прост, идея, думаю, ясна ;)
SonasLOL; +1 Ответить
3. СергейКа 683 24.02.09 17:40 Сейчас в теме
+ адназначна. Идея супер.
4. Шёпот теней 1764 24.02.09 17:51 Сейчас в теме
Душелов... НУуу..., блин, ТЫ ДАёШЬ...

... жаль что пятьПлюсиков не могу поставить...


воОотВеДь...
5. Душелов 3914 24.02.09 17:54 Сейчас в теме
Для 7-ки сделаю, наверное, вечером обработочку... Но сразу оговорюсь, понадобится либо ВК для архивирования, либо какой-либо архиватор, ибо сама платформа с зипами работать не умеет.
6. Шёпот теней 1764 24.02.09 17:56 Сейчас в теме
гы... уговорил... поставил в твоих других работах...

всё равно за всё заслуженно....!!! удачи во всём....!!!!

воооот....ведь....
7. WiseSnake 1789 24.02.09 17:59 Сейчас в теме
8. CheBurator 24.02.09 20:41 Сейчас в теме
> ибо сама платформа с зипами работать не умеет.
если считать, что работаем на хрюне и выше - то можно юзать встроенный в винды зиповщик
9. Душелов 3914 24.02.09 20:45 Сейчас в теме
10. CheBurator 24.02.09 20:47 Сейчас в теме
встроенный!!! пошарь на мисте! там Абрахамс показывал ккак делать.. если не найдешь стукнись - у мну есть в загашнике где-то... просто ща работы срочная дофига
11. СЫРОЖА 25.02.09 07:20 Сейчас в теме
Не понял, причем тут архиватор? И вообще, если это только идея,
причем тут привязка к 2007-му экзелю?
12. Душелов 3914 25.02.09 09:12 Сейчас в теме
(11) :))))) Мои "идеи" отличаются от "идей" некоторых других "коллег" по инфостарту.

А посмотреть разработку?
13. seermak 662 25.02.09 09:20 Сейчас в теме
Вопрос на расширение кругозора): 1.а зачем в шаблоне заполнено поле значением "aha". 2. а как сделать так, чтобы сохранилось форматирование(допустим объединение ячеек). Узнал много нового о ".xlsx". За это отдельное спасибо!)))
14. Душелов 3914 25.02.09 09:29 Сейчас в теме
(13) 1. Да просто... Только, чтобы экзель создал все нужные файлы для шаблона, на всякий случай.
2. По поводу форматирования - это уже надо копать в сторону других файлов, отвечающих за оформление. Как я делаю - беру файл, объединяю, к примеру, ячейки, сохраняю и смотрю изменения.
16. Душелов 3914 25.02.09 09:46 Сейчас в теме
(15) Спасибо, я уже разобрался... ;)
Вот только метод Темп.CopyHere(Файл), открывает диалог и предлагает заменить файлы, если такие существуют. И на 2 параметр (8, 16 и т.д.) не реагирует никак. Но это я поборю :)
17. baa 25.02.09 10:00 Сейчас в теме
Душелов, я на тебя отдельную папку завел в каталоге для скачаных файлов 1С. Так сказать есть 7.7, есть 8.1 и есть отдельный проект "Душелов" :) Однозначно молодец.
18. Душелов 3914 25.02.09 16:13 Сейчас в теме
Упарился я с вашей 7-кой... ;) Давно не писал ничего толкового...
Вообщем... В 7-ке тоже, никаких ВК.
19. Душелов 3914 25.02.09 16:15 Сейчас в теме
Как бы глюки какие-то возможно в 7-ке, т.к. работа с архивами и xml тоже написаны на языке платформы (мисте привет ;)).
20. Трактор 1198 25.02.09 19:44 Сейчас в теме
Вах, молодец! Скачивать не стал. Просто буду знать что такая разработка есть.
21. Трактор 1198 25.02.09 22:36 Сейчас в теме
Не удержался. Скачал. Красиво. Спасибо.
22. biv75 26.02.09 14:36 Сейчас в теме
Супер! Плюсую однозначно
23. minimaxpo 26.02.09 14:37 Сейчас в теме
Гут, мне нравится ход ваших мыслей.
24. Vitalk 03.03.09 14:50 Сейчас в теме
В принципе, хорошая вешь! Кому то да и пригодится!
Только небольшая помарочка в Excel2007. Когда пустой путь к файлу и при нажатии на "Открыть" пишет: Преобразование значения к типу Число не может быть выполнено ФайлЛиста = ВременныйКаталог + "\xl\worksheets\sheet" + НомерЛиста + ".xml". Просто не определена переменная "ВременныйКаталог"!
25. alexmif 17.04.09 12:14 Сейчас в теме
Скачал! Не удержался. Интересная мысль... Теперь не забыть куда скачал.
+ однозначно, хотя мона и +++++.
26. Aleanza 09.05.09 13:28 Сейчас в теме
Если есть пустое поле в таблице значений тип "Строка" оно глючит.
31. Душелов 20.01.10 12:34 Сейчас в теме
(26), (30) поправил

Добавил версию для 8.2 на управляемых формах для тонкого клиента.
48. artbear 1180 27.09.10 13:39 Сейчас в теме
(31) Вчера скачал версию для 8.1
В нем (26) "Если есть пустое поле в таблице значений тип "Строка" оно глючит." так и не исправлено.
64. Spartan 348 29.03.13 10:51 Сейчас в теме
(26),(48) Как-то так видимо:
Функция ПрочитатьСписокСтрок(ФайлСтрок)
	Строки = Новый СписокЗначений;
	
	хмл = Новый ЧтениеXML;
	хмл.ОткрытьФайл(ФайлСтрок);
	
	Пока хмл.Прочитать() Цикл
		//Если хмл.ТипУзла = ТипУзлаXML.Текст Тогда  // некорректно работает для пустых строк!!!
		//	Строки.Добавить(хмл.Значение);
		//КонецЕсли;
		// Spartan - 29.03.2013 - начало
		Если хмл.Имя = "t" И хмл.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			Если хмл.Прочитать() И хмл.Имя = "#text" Тогда
				Строки.Добавить(хмл.Значение);
			Иначе
				Строки.Добавить("");
			КонецЕсли; 
		КонецЕсли;
		// Spartan - 29.03.2013 - конец
	КонецЦикла;
	
	хмл.Закрыть();
	
	Возврат Строки;
КонецФункции
Показать
65. mozz 145 30.04.13 13:22 Сейчас в теме
(64) Туда же:
(уже встроены багфиксы из (51) )
Процедура ЗаписатьДанныеЛиста(хмл)
	ЧислоСтрок = Лист.Количество();
	ЧислоКолонок = Лист.Колонки.Количество();
	
	Для иСтр = 0 По ЧислоСтрок - 1 Цикл
		хмл.ЗаписатьНачалоЭлемента("row");
		хмл.ЗаписатьАтрибут("r", ПолучитьИмяСтроки(иСтр));
		хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоВСтроку(ЧислоСтрок)); // вместо хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоСтрок); 
		
		Для иКол = 0 По ЧислоКолонок - 1 Цикл
			хмл.ЗаписатьНачалоЭлемента("c");
			хмл.ЗаписатьАтрибут("r", ПолучитьОбласть(иСтр, иКол));
			
			ЗначЯчейки = Лист.Получить(иСтр).Получить(иКол);
			Попытка
				А = Число(ЗначЯчейки);
				ЭтоЧисло = Истина;
				ЗначЯчейки = СтрЗаменить(Формат(А, "ЧРД=."), Символы.НПП, ""); // Артур
			Исключение
				ЭтоЧисло = Ложь;
			КонецПопытки;
			
			Т = ТипЗнч(ЗначЯчейки);
			Если НЕ ЭтоЧисло И ТипЗнч(ЗначЯчейки) = Тип("Строка") Тогда
				Если НЕ ЗначЯчейки = "" тогда // mozz 30.04.2013 (здесь вываливалось на пустых ячейках)
					хмл.ЗаписатьАтрибут("t", "s");
					Элем = СписокСтрок.НайтиПоЗначению(ЗначЯчейки);
					ЗначЯчейки = СписокСтрок.Индекс(Элем);
				КонецЕсли; // mozz 30.04.2013
			КонецЕсли;
			
			хмл.ЗаписатьНачалоЭлемента("v");
			хмл.ЗаписатьТекст(Строка(ЗначЯчейки));
			хмл.ЗаписатьКонецЭлемента();
			
			хмл.ЗаписатьКонецЭлемента();
		КонецЦикла;
		
		хмл.ЗаписатьКонецЭлемента();
	КонецЦикла;
КонецПроцедуры
Показать
28. Aleanza 09.05.09 13:28 Сейчас в теме
29. Aleanza 09.05.09 13:34 Сейчас в теме
А еще оно не сохраняет заголовки, очень не удобно :(
30. bxz 407 23.08.09 21:13 Сейчас в теме
Возникла проблема при записи таблицы значений с количеством строк больше 999 решилась заменой функции ПолучитьИмяСтроки(а) на:
Функция ПолучитьИмяСтроки(а)
Возврат Формат(а + 1,"ЧГ=");
КонецФункции
но это все не важно )) за идею ++++++++
51. artbear 1180 30.09.10 07:50 Сейчас в теме
Проблема из (30) по записи файла с количеством строк более 999 также не решена :(
для ее исправления нужно исправить код модуля
1. завести новую функцию
Функция ЧислоВСтроку(значениеЧисла) // Артур для исключения ошибок открытия файлов
Возврат СокрЛП(Формат(значениеЧисла, "ЧРД=.; ЧГ="));
КонецФункции
2. прописать ее использование
а) хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоВСтроку(ЧислоСтрок)); // вместо хмл.ЗаписатьАтрибут("spans", "1:" + ЧислоСтрок);
б) хмл.ЗаписатьАтрибут("count", ЧислоВСтроку(Строки.Количество())); // Артур вместо //Строка(Строки.Количество())
хмл.ЗаписатьАтрибут("uniqueCount", ЧислоВСтроку(Строки.Количество())); // Артур вместо //Строка(Строки.Количество())

Прикрепил готовый файл для 8.1 с моими правками + дополнения от webstep
Прикрепленные файлы:
Excel2007_v81.epf
32. RuslanBZ 10.03.10 13:50 Сейчас в теме
В версии 8.2 при нажатии на открыть ругается в функции ОткрытьЛист(НомерЛиста)

{ВнешняяОбработка.Excel2007.МодульОбъекта(64)}: Значение не является значением объектного типа (Строки)
Для Каждого Стр Из Колонки.Строки Цикл
33. detec 130 25.05.10 11:02 Сейчас в теме
Идея очень красивая. Но для произвольных файлов, редактируемых пользователями, я бы не советовал. Взял 3 файла. Два выгружены из PL/SQL Developer, один сделан из пользовательского в Office 2010. В результате открылся только 1. Остальные ругнулись .

{ВнешняяОбработка.Excel2007(63)}: Значение не является значением объектного типа (Строки)
Для сч = 0 По Колонки.Строки.Количество() - 1 Цикл


{ВнешняяОбработка.Excel2007(93)}: Поле объекта не обнаружено (F)
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;


38. markers 244 17.06.10 08:00 Сейчас в теме
Подтверждаю проблему с "сдвигом" ячеек при наличии пустых ячеек, решил её по своему, но потом полез сюда, и заменил всё на новый код, начал матюгатся как в (33) Вернул старый код с своей правкой, Автору боооольшое спасибо! Надеюсь когда вернётся сможет нам помочь.

ADD: Кстати старый код работает нормально и быстро, интересно, новый код быстрей?
34. 31.05.10 18:32 Сейчас в теме
При сохранении ТЗ в которой были пустые ячейки, обработка выдает ошибку.

{ВнешняяОбработка.Excel2007(266)}: Ошибка при вызове метода контекста (Индекс): Несоответствие типов (параметр номер '1')
ЗначЯчейки = СписокСтрок.Индекс(Элем);
по причине:
Несоответствие типов (параметр номер '1')
35. 31.05.10 20:41 Сейчас в теме
Не помогло. Все равно дает ошибку:
{ВнешняяОбработка.Excel2007(266)}: Ошибка при вызове метода контекста (Индекс): Несоответствие типов (параметр номер '1')
ЗначЯчейки = СписокСтрок.Индекс(Элем);
по причине:
Несоответствие типов (параметр номер '1')
36. 31.05.10 20:59 Сейчас в теме
Интересный момент. Пробую сохранить ТЗ размером 14 на 710 ячеек.
1. Выдает ошибки при пустых ячейках. Если ячейка не текст, а большое поле типа Memo.
2. Где то с 283 строки в ячейки начинает подставлять числа, начиная с 1000. и пошел часть ячеек записывает нормально а потом оп и 1001, часть ячеек нормально, 1002 и т д.
Хотя вторая ошибка это возможно результат исправления первой ) Такой я программист )))
37. 31.05.10 21:27 Сейчас в теме
Да так и есть ошибка №2 из п. (36) это результат моих фокусов.
Но 2 момента остались:
1. Если есть пустое большое поле, то она выдает ошибку
2. Дата при открытии получается в формате DD.MM. YYYY обрезается. При этом если стр.252: ЗначЯчейки = Лист.Получить(иСтр).Получить(иКол); заменить на ЗначЯчейки = Строка(Лист.Получить(иСтр).Получить(иКол)); то эта ошибка решается. Но появляются другие :)
Не подумайте что я жалуюсь. Идея супер. Буду искать причины и править. Но если кто быстрее меня сообразит, дайте знать. т.к. искать я могу очень долго )))
39. markers 244 17.06.10 09:03 Сейчас в теме
Кому нужно получить список листов и кто не догадался как это сделать, даю функцию:
Функция Excel2007СписокЛистов(ВременныйКаталог);
	Листы = НайтиФайлы(ВременныйКаталог + "\xl\worksheets\", "sheet*.xml");
	Возврат Листы.Количество();
КонецФункции	

40. Душелов 17.06.10 11:51 Сейчас в теме
Выложите сюда проблемный файл, посмотрим.
41. markers 244 17.06.10 12:30 Сейчас в теме
(40) Ловите, простой прайс правда сделанный в 2003-ем и сконвертированный в 2007-й
Там 3 листа, 2-й пустой, в моём варианте они обрабатываются все вместе
Прикрепленные файлы:
price_test.xlsx
42. markers 244 22.06.10 06:00 Сейчас в теме
43. webstep 8 25.06.10 17:55 Сейчас в теме
если в файле excel данные не стоят стройными рядами, а "гуляют" по полю, то при работе алгоритма возникает ошибка потому что "мелкософтмасдай" почему то в "cols" пишет не все колонки. Пришлось ориентироваться на "dimension". Соответственно в функции ОткрытьЛист заменил код
//создаем колонки
Колонки = ДеревоДанных.Строки.Найти("cols", "Объект", Истина);
сч = 0;	
Для Каждого Стр Из Колонки.Строки Цикл
 Если Стр.Объект <> "col" Тогда
 Продолжить;
 КонецЕсли;
		
 Лист.Колонки.Добавить(МассивБукв[сч]);
 сч = сч + 1;
 КонецЦикла;
Показать

на
//создаем колонки
Колонки = ДеревоДанных.Строки.Найти("dimension", "Объект", Истина);
Счетчик = 0;	
Для Каждого Стр Из Колонки.Строки Цикл
 Если Стр.Объект = "ref" Тогда
 Диапозон = Стр.Значение; 
 //поиск максимального значения колонки
 Счетчик=МассивБукв.Количество();
 Пока Счетчик>0 Цикл 
 Счетчик = Счетчик - 1;
 Если Найти(Диапозон, МассивБукв[Счетчик])>0 Тогда
 Для Индекс=0 По Счетчик Цикл					
 Лист.Колонки.Добавить(МассивБукв[Индекс]);
 КонецЦикла;	
 Счетчик = 0;
 КонецЕсли;	
 КонецЦикла;
 Прервать;
 КонецЕсли;
КонецЦикла;
Показать

теперь колонки формирует правильно.
44. webstep 8 28.06.10 11:34 Сейчас в теме
проблема сдвига ячеек...

удалил
ИндексСтроки = -1;

и, ориентируясь на значение в "r", заменил:
ИндексСтроки = ИндексСтроки + 1;

на
 //поиск колонки
 СтрЗначение = Колонка.Строки.Найти("r", "Объект");
 Если СтрЗначение <> Неопределено Тогда
 ИмяКолонки = СтрЗначение.Значение;
 КонецЕсли;
 ИндексСтроки = Неопределено;
 Счетчик = МассивБукв.Количество();
 Пока Счетчик>0 Цикл 
 Счетчик = Счетчик - 1;
 Если Найти(ИмяКолонки, МассивБукв[Счетчик])>0 Тогда
 ИндексСтроки = Счетчик;
 Счетчик = 0;
 КонецЕсли;	
 КонецЦикла;
.........................
Показать

проблема решена

extralook; gluker3; +2 Ответить
45. webstep 8 28.06.10 11:38 Сейчас в теме
да, все это в функции ОткрытьЛист модуля обработки

прошу не пинать ногами - на больших таблицах код может работать медленно, но это уже менять МассивБукв на что-то иное...

и вот еще что... обработка благодаря этому самому массиву букв расчитана на не очень большие таблицы, но я на всякий случай предусмотрел его расширение и на двухбуквенные колонки, поэтому поиск ведется от конца к началу, а не наоборот.

кстати, как здесь можно свой комментарий удалить? вот еще проблема...
46. webstep 8 28.06.10 12:34 Сейчас в теме
Прошу прощения автора, я на основании его обработки создал для себя функцию, которая читает лист из файла и возвращает таблицу значений.

Функция ПолучитьЛистEXCEL_XML(ИмяФайлаExcel, НомерЛиста=1) Экспорт
	
	ИмяФайла = СокрЛП(ИмяФайлаExcel);
	Если Прав(НРег(ИмяФайла),4)<>".xlsx" Тогда 
		//ошибка
	КонецЕсли;
	
	пФайл = Новый Файл(ИмяФайла);
	Если Не пФайл.Существует() Тогда
		//ошибка
	КонецЕсли;
	
	СписокСтрок = Новый СписокЗначений;
	
	ВременныйКаталог = КаталогВременныхФайлов() + "NightReg";
	УдалитьФайлы(ВременныйКаталог);
	
	Зип = Новый ЧтениеZipФайла;
	Зип.Открыть(ИмяФайла);
	Зип.ИзвлечьВсе(ВременныйКаталог, РежимВосстановленияПутейФайловZIP.Восстанавливать);
	
	ФайлСтрок = ВременныйКаталог + "\xl\sharedStrings.xml";
	
	хмл = Новый ЧтениеXML;
	хмл.ОткрытьФайл(ФайлСтрок);
	
	Пока хмл.Прочитать() Цикл
		Если хмл.ТипУзла = ТипУзлаXML.Текст Тогда
			СписокСтрок.Добавить(хмл.Значение);
		КонецЕсли;
	КонецЦикла;
	
	хмл.Закрыть();
	
	ФайлЛиста = ВременныйКаталог + "\xl\worksheets\sheet"+НомерЛиста+".xml";
	Файл = Новый Файл(ФайлЛиста);
	Если НЕ Файл.Существует() Тогда
		//ошибка
	КонецЕсли;
	
	МассивБукв = Новый Массив;
	МассивБукв.Добавить("A");
	МассивБукв.Добавить("B");
	МассивБукв.Добавить("C");
	МассивБукв.Добавить("D");
	МассивБукв.Добавить("E");
	МассивБукв.Добавить("F");
	МассивБукв.Добавить("G");
	МассивБукв.Добавить("H");
	МассивБукв.Добавить("I");
	МассивБукв.Добавить("J");
	МассивБукв.Добавить("K");
	МассивБукв.Добавить("L");
	МассивБукв.Добавить("M");
	МассивБукв.Добавить("N");
	МассивБукв.Добавить("O");
	МассивБукв.Добавить("P");
	МассивБукв.Добавить("Q");
	МассивБукв.Добавить("R");
	МассивБукв.Добавить("S");
	МассивБукв.Добавить("T");
	МассивБукв.Добавить("U");
	МассивБукв.Добавить("V");
	МассивБукв.Добавить("W");
	МассивБукв.Добавить("X");
	МассивБукв.Добавить("Y");
	МассивБукв.Добавить("Z"); 
	//здесь можно расширить двухбуквенными значениями
	
	ДеревоДанных = Новый ДеревоЗначений;
	ДеревоДанных.Колонки.Добавить("Объект");
	ДеревоДанных.Колонки.Добавить("Значение");
	
	ЧтениеXML = Новый ЧтениеXML;
	ЧтениеXML.ОткрытьФайл(Файл);
	
	ТекЭлемент = Неопределено;
	ТекБаза = Неопределено;
	
	Пока ЧтениеXML.Прочитать() Цикл
		Если ЧтениеXML.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда
			РежимЗагрузки = ЧтениеXML.Имя;
			
			Если ТекЭлемент = Неопределено Тогда
				ТекЭлемент = ДеревоДанных.Строки.Добавить();
				ТекЭлемент.Объект = РежимЗагрузки;
			Иначе
				ТекЭлемент = ТекЭлемент.Строки.Добавить();
				ТекЭлемент.Объект = РежимЗагрузки;					
			КонецЕсли;
			
		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда
			Если ТекЭлемент = Неопределено Тогда
				ТекЭлемент = Неопределено;
			Иначе
				ТекЭлемент = ТекЭлемент.Родитель;
			КонецЕсли;
		ИначеЕсли ЧтениеXML.ТипУзла = ТипУзлаXML.Текст Тогда
			ТекЭлемент.Значение = ЧтениеXML.Значение;
		КонецЕсли;
		
		Для сч = 0 По ЧтениеXML.КоличествоАтрибутов() - 1 Цикл
			Стр = ТекЭлемент.Строки.Добавить();
			Стр.Объект = ЧтениеXML.ИмяАтрибута(сч);
			Стр.Значение = ЧтениеXML.ЗначениеАтрибута(сч);
		КонецЦикла;
	КонецЦикла;
	
	ЧтениеXML.Закрыть();
	
	Лист = Новый ТаблицаЗначений;
	
	//создаем колонки
	Колонки = ДеревоДанных.Строки.Найти("dimension", "Объект", Истина);
	Счетчик = 0;	
	Для Каждого Стр Из Колонки.Строки Цикл
		Если Стр.Объект = "ref" Тогда
			Диапазон = Стр.Значение; 
			
			//поиск максимального значения колонки
			Счетчик=МассивБукв.Количество();
			Пока Счетчик>0 Цикл 
				Счетчик = Счетчик - 1;
				Если Найти(Диапазон, МассивБукв[Счетчик])>0 Тогда
					Для Индекс=0 По Счетчик Цикл					
						Лист.Колонки.Добавить(МассивБукв[Индекс]);
					КонецЦикла;	
					Счетчик = 0;
				КонецЕсли;	
			КонецЦикла;
			
			Прервать;
		КонецЕсли;
	КонецЦикла;
	
	//читаем строки
	СтрСтрок = ДеревоДанных.Строки.Найти("sheetData", "Объект", Истина);
	Для Каждого Строка Из СтрСтрок.Строки Цикл
		НоваяСтрока = Лист.Добавить();
		
		Для Каждого Колонка Из Строка.Строки Цикл
			Если Колонка.Объект <> "c" Тогда
				Продолжить;
			КонецЕсли;
			
			//поиск колонки
			СтрЗначение = Колонка.Строки.Найти("r", "Объект");
			Если СтрЗначение <> Неопределено Тогда
				ИмяКолонки = СтрЗначение.Значение;
			КонецЕсли;
			ИндексСтроки = Неопределено;
			Счетчик = МассивБукв.Количество();
			Пока Счетчик>0 Цикл 
				Счетчик = Счетчик - 1;
				Если Найти(ИмяКолонки, МассивБукв[Счетчик])>0 Тогда
					ИндексСтроки = Счетчик;
					Счетчик = 0;
				КонецЕсли;	
			КонецЦикла;
			
			ЗначениеЯчейки = Неопределено;
			
			СтрЗначение = Колонка.Строки.Найти("v", "Объект");
			Если СтрЗначение <> Неопределено Тогда
				ЗначениеЯчейки = СтрЗначение.Значение;
			КонецЕсли;
			
			СтрЗначение = Колонка.Строки.Найти("t", "Объект");
			Если СтрЗначение <> Неопределено И СтрЗначение.Значение = "s" И ЗначениеЯчейки <> Неопределено Тогда
				ЗначениеЯчейки = СписокСтрок.Получить(Число(ЗначениеЯчейки)).Значение;
			КонецЕсли;
			
			НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;
		КонецЦикла;
	КонецЦикла;
	
	Возврат Лист;
КонецФункции
Показать
kazann; artbear; +2 Ответить
47. webstep 8 28.06.10 17:36 Сейчас в теме
да вот еще что до меня дошло - пустые строки тоже исчезают, нужно еще думать... впрочем для многих это не будет такой уж потерей :)

и еще у меня в коде (46) тоже закралась ошибочка:
Если Прав(НРег(ИмяФайла),4)<>".xlsx" Тогда 

тут циферку 5 надо :oops:
49. artbear 1180 27.09.10 14:03 Сейчас в теме
Также есть ошибка при записи листа, если у числа в таблице есть дробная часть :(
Запись проходит успешно, но при попытке открыть полученный файл в Офис 2007 выдается ошибка о невозможности открытия :(
Проблема в том, что число выгружается в формате через запятую :(
а нужно через точку.

ЗЫ или это зависит от региональных установок? вроде они у меня штатные как для Офиса, так и для 1С
50. artbear 1180 27.09.10 14:38 Сейчас в теме
(49) + Исправление
В методе ЗаписатьДанныеЛиста(хмл)

нужно поправить код
	Попытка
		А = Число(ЗначЯчейки);
		ЭтоЧисло = Истина;
	Исключение
на код
	Попытка
		А = Число(ЗначЯчейки);
		ЭтоЧисло = Истина;
		ЗначЯчейки = СтрЗаменить(Формат(А, "ЧРД=."), Символы.НПП, ""); // Артур
	Исключение

ЗЫ кстати, приведенный код решает проблему неверного сохранения чисел более 999, при сохранении в строку в которых появляется неразрывный пробел.
При открытии подобного файла в Офис 2007 также будет ошибка открытия :(
52. Lalei2008 28.10.10 17:16 Сейчас в теме
54. Sprite 477 04.02.12 16:25 Сейчас в теме
Загружаю демо-конфигурацию 7.7

Получаю сообщение:
Папка=Шел.namespace(Архив+"\"+Путь);
{Глобальный модуль(365)}: Плохой тип переменной

Help me!!!
55. Yury1001 1440 07.02.12 17:32 Сейчас в теме
Рановато плюсанул пример 7.7 нерабочий: плохой тип переменной стр. 363

Папка=Шел.namespace(Архив+"\"+Путь);

Архив = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip"
Путь = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\_rels"
Архив+"\"+Путь = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\_rels"

поправил, теперь плохой тип 404

ПутьФайла = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\[Content_Types].xml"

чё к чему не пойму.
75. ugn-omsk 15.03.15 18:31 Сейчас в теме
(55) Yury1001,
Вы пошли тем же путем, что и я.

поправил, теперь плохой тип 404

ПутьФайла = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\[Content_Types].xml"


Здесь нужно добиться, чтобы
ПутьФайла = "D:\DataBase\Джигель\ЧтениеЗаписьExcel\Excel2007\Template.zip\[Content_Types].xml",
т.е. просто [Content_Types].xml
Постом выше привел код. Понимаю, что уже давно неактуально, но если вдруг на будущее кому-то пригодится.
Потому как идея действительно очень интересная!
56. Yury1001 1440 07.02.12 17:34 Сейчас в теме
(0) Вопросик в догонку: нужно выгрузить большой объем данных в excel 90 000 строк и штук 10 колонок, этим методом получится?
57. amatisol 25.03.12 22:43 Сейчас в теме
Народ а че реально работает? А то сидят многие на openoffice и хотят чтоб у них ексели открывались нормально, если реально работает то плюсау и скачаю
60. AlexO 128 10.10.12 18:00 Сейчас в теме
(57) amatisol,
это создание текстовых XML-ек и упаковка их в zip.
Более ранние версии файлов Excel так создать не удастся.
58. electronik 07.05.12 14:00 Сейчас в теме
В принципе, хорошая вешь нужная! С екзелем работаем если не все то через одного, поетому актуальность даного потрясающая. На основании даной разработки создал свою и что самое интерсное работает. Автору респект и уважение ну и заслуженое 5+++++
59. lesorubka 20 23.07.12 11:58 Сейчас в теме
Спасибо автору! Отлично работает! Жаль ушел от нас, столько бы еще сделал.
Царствие ему Небесное!!!
Istur; rybamech; +2 Ответить
61. Dansur 260 18.10.12 10:58 Сейчас в теме
Ему еще много лет будут говорить спасибо. жаль что он это уже не услышит. Покойся с миром.
62. nnurik 08.02.13 11:00 Сейчас в теме
Спасибо автору! Очень пригодилось.
63. tehas 48 13.02.13 12:47 Сейчас в теме
{ВнешняяОбработка.Excel2007.МодульОбъекта(119)}: Поле объекта не обнаружено (K)
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;

файл (прайс 1С пересохранен в xlsx)
Прикрепленные файлы:
PRICE_1C.xlsx
66. mozz 145 07.05.13 13:44 Сейчас в теме
(63) tehas,

в функции:
Функция ОткрытьЛист(НомерЛиста) Экспорт
найди:
НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;


замени на:

Если Лист.Колонки.Найти(МассивБукв[ИндексСтроки]) = Неопределено тогда
				Лист.Колонки.Добавить(МассивБукв[ИндексСтроки]);
			КонецЕсли;
			  
			НоваяСтрока[МассивБукв[ИндексСтроки]] = ЗначениеЯчейки;


и все взлетит!
67. Зеленоград 04.09.13 11:35 Сейчас в теме
Спасибо, Мастер! Покойся с миром!
68. Зеленоград 05.09.13 13:27 Сейчас в теме
Спасибо, Мастер! Покойся с миром!



Коллеги, сайт автора перестал открываться. Там, как минимум, были полезные разработки.

Есть ли необходимость и возможность сохранения ценных ресурсов в подобных случаях, кроме archive.org?
Отвечайте или здесь, или в личку. Если это важно многим - будем думать, как реализовать.
69. makas 44 27.09.13 12:34 Сейчас в теме
ОткрытьФайлЭкзекль2007


может быть ОткрытьФайлЭкзель2007 ?
70. SANILLA 05.10.13 03:36 Сейчас в теме
да ну на фик, не уже ли, так и есть, щас попробую, если работает, то точно то что надо. Благодарю!
71. Myskyl 05.10.13 03:39 Сейчас в теме
да да то что и искал, как раз нужен был пример работы с Экселем, а тут и ещё без всяких врешних компонент, супер, спасибо
72. host_kms 124 10.10.13 08:55 Сейчас в теме
Папка=Шел.namespace(Архив+"\"+Путь);
{Глобальный модуль(365)}: Плохой тип переменной

Кто-нибудь решил эту проблему?
73. mukoza 12.12.13 10:18 Сейчас в теме
Поддерживаю предыдущий вопрос. Неужели у ни у кого не возникает подобной ошибки?
74. ugn-omsk 15.03.15 18:17 Сейчас в теме
Папка=Шел.namespace(Архив+"\"+Путь);
{Глобальный модуль(365)}: Плохой тип переменной

Ошибка возникает на Windows7, в XP все работает "из коробки".
На 7-ке видимо по-другому работает namespace в javascript.
Вобщем, глубоко не ковырял, ибо нет времени.
Обошел проблему очень тупо, ибо не программист.
Просто "подрезал" местами длинные пути до их нужного значения.
Например, переменная Архив принимает значение X:\Путь_к_БД\Template.zip
а переменная Путь должна принять значение xl\workbook.xml (и не только его, а всю структуру внутри архива). Но в Win7 переменная Путь принимает значение X:\Путь_к_БД\Template.zip\xl\workbook.xml
На выходе получаем Архив+"\"+Путь = X:\Путь_к_БД\Template.zip\X:\Путь_к_БД\Template.zip\xl\workbook.xml
Конечно, это будет "плохой тип переменной" )))

Вот рабочий вариант - просто замените текст функции в глобальном модуле.

//*******************************************
Функция архив_ПросмотрРекурс(Архив,Путь="",Сп)
// Функция просматривает содержимое файла Template.zip
// по всем вложенным папкам,
// и заполняет список путями ко всем файлам и папкам



// Исправляем некорректную работу с путями в Windows7
Если Путь <> "" Тогда
Путь=СтрЗаменить(Путь, Архив,""); // Убираем в переменной путь то, что уже записано в переменной Архив (дублирование)
Если Сред(Путь,1,1)="\" Тогда
Путь=Сред(Путь,2); // Если первым символом в пути является разделитель \, то его тоже уберем
КонецЕсли;
КонецЕсли;


Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
Скрипт.language="javascript";
Шел=СоздатьОбъект("shell.application");

//Сообщить(Архив+""+Путь);
//Сообщить("Архив: "+Архив);
//Сообщить("Путь: "+Путь);
//Сообщить("-----------------------------------------");




Папка=Шел.namespace(Архив+""+Путь);
Скрипт.AddObject("Папка",Папка);
Вложения=Скрипт.Eval("new Enumerator(Папка.Items())");
Пока Вложения.atEnd(0)=0 Цикл

// Таже беда под Win 7. Будем "резать" длиные пути, используя промежуточную переменную //ПутьДляДобавления
ПутьДляДобавления=СтрЗаменить(Вложения.item(0).path,Архив,"");
Если Сред(ПутьДляДобавления,1,1)="\" Тогда
ПутьДляДобавления=Сред(ПутьДляДобавления,2);
КонецЕсли;
//Сп.ДобавитьЗначение(Вложения.item(0).path);
Сп.ДобавитьЗначение(ПутьДляДобавления);

//Сообщить("Добавлено в список: "+ Строка(Вложения.item(0).path));
Если Вложения.item(0).IsFolder=-1 Тогда
архив_ПросмотрРекурс(Архив,Вложения.item(0).path,Сп);
КонецЕсли;
Вложения.moveNext(0);
КонецЦикла;
КонецФункции
//*******************************************
Показать


Если, кто из программистов, сделает решение этой проблемы элегантнее - большой респект ему!
А пока вот так, коряво, зато работает!
Надеюсь, кому-то поможет.
76. Пикачу 28.04.15 17:38 Сейчас в теме
7.7 такое не понимает:

Пока Вложения.atEnd<a rel="noindex,nofollow"...

Это код для 8?
А можно для 7.7?
77. sai_NT 19.01.16 17:57 Сейчас в теме
(76) Пикачу, Там скопированы стили с кодом html, правильно так:
Пока Вложения.atEnd(0)=0 Цикл
...


и так далее, то есть смело удаляй тег а, оставив только текст: <a hrеf=...>бла-бла</a> -> бла-бла
78. anten22 18.09.17 14:52 Сейчас в теме
Для 7.7. Обработка некорректно обрабатывает ячейчки, внутри которых меняется шрифт. Чтоб исправить надо заменить функцию "экзель_ПрочитатьСписокСтрок". Переделанная функция добавляет строку в список по тегу "/s", объеденяя содержимое.
Функция экзель_ПрочитатьСписокСтрок(ПутьКФайлу)
	Строки = СоздатьОбъект("СписокЗначений");
	ТекСтрока="";
	xml_ОткрытьФайл(ПутьКФайлу);
	Пока xml_Прочитать()=1 Цикл
		//будем добавлять строку по тегу /s
		//все что внутри тега будем объеденять
		Если xml_ИмяТега = "</t>" Тогда
			ТекСтрока=ТекСтрока+" "+СокрЛП(xml_Текст);
		КонецЕсли;
		Если xml_ИмяТега = "</si>" Тогда
			Строки.ДобавитьЗначение(ТекСтрока);
			ТекСтрока="";
		КонецЕсли;
	КонецЦикла;
	
	Возврат Строки;
КонецФункции
Показать
79. anten22 18.09.17 14:57 Сейчас в теме
И еще для 7.7. Как уже писали выше, неправильно читаются таблицы без заполненных ячеек. Обработка их сдвигает. При чем бывает 2 варианта: есть буква колонки, но не заполнены данные и есть когда буква вообще пропускается. Чтоб корректно работало надо заменить текст функции "экзель_открытьЛист"
Функция экзель_ОткрытьЛист(НомерЛиста)
	
	ФайлЛиста = экзель_ВременныйКаталог + "xl\worksheets\sheet" + НомерЛиста + ".xml";
	Если ФС.СуществуетФайл(ФайлЛиста) = 0 Тогда
		Возврат 0;
	КонецЕсли;
	//КонвертироватьФайл(ФайлЛиста);
	xml_ОткрытьФайл(ФайлЛиста);
	
	экзель_Лист = СоздатьОбъект("ТаблицаЗначений");
	
	номСтр = 0;
	номКолонка = 0;
	
	Пока xml_Прочитать()=1 Цикл
		//Сообщить(xml_ИмяТега);
		Если xml_ИмяТега = "<row>" Тогда
			номСтр = номСтр + 1;
			номКолонка = 0;
			экзель_Лист.НоваяСтрока();
		ИначеЕсли xml_ИмяТега = "<c>" Тогда
			//это вариант когда есть буква, но значение не записано. чтобы не было пропуска
			Если (лев(стр,5)="""<c r") и (Найти(стр,"/")<>0) Тогда
				номКолонка = номКолонка + 1;
				Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
					экзель_Лист.НоваяКолонка("К" + номКолонка);
				КонецЕсли;
				экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
				текБуква=xml_СписокАтрибутов.Получить("r");
				текБуква=лев(текБуква,1);
				теккод=КодСимв(текБуква);
				предыдущийКод=теккод;
				Продолжить;
			конецесли;	
			
			//а это вариант когда буква пропущена
			//надо сравнивать какая была буква ячейки перед этим и какая сейчас.
			//буква должна быть в теге "r"
			текБуква=xml_СписокАтрибутов.Получить("r");
			текБуква=лев(текБуква,1);
			теккод=КодСимв(текБуква);
			если теккод=65 Тогда
				//буква А. сбрасываем на начало
				предыдущийКод=теккод;
			иначе
				//не буква А. прописываем пропущенные
				для сч=предыдущийКод+2 по теккод Цикл
					номКолонка = номКолонка + 1;
					Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
						экзель_Лист.НоваяКолонка("К" + номКолонка);
					КонецЕсли;
					экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
				КонецЦикла;	
				предыдущийКод=теккод;
			КонецЕсли;	
			//Сообщить(текБуква);
			//текущаяБуква=
			ТипЯчейки = xml_ПолучитьАтрибут("t");
			xml_Прочитать();
			Если xml_ИмяТега <> "<v>" Тогда
				Продолжить;
			КонецЕсли;
			xml_Прочитать();
			
			ЗначениеЯчейки = СокрЛП(xml_Текст);
			Если ТипЯчейки = "s" Тогда
				ЗначениеЯчейки = экзель_СписокСтрок.ПолучитьЗначение(Число(ЗначениеЯчейки) + 1, ЗначениеЯчейки);
			КонецЕсли;
			
			номКолонка = номКолонка + 1;
			Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
				экзель_Лист.НоваяКолонка("К" + номКолонка);
			КонецЕсли;
			
			экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, ЗначениеЯчейки);
		КонецЕсли;
	КонецЦикла;
	хз="";
	экзель_Лист.ВыбратьСтроку(хз);
	Возврат 1;
КонецФункции
Показать
80. anten22 30.08.18 22:50 Сейчас в теме
следующая версия. Предыдущая вываливалсь если пропущена колонка "А"
Функция экзель_ОткрытьЛист(НомерЛиста)
	
	ФайлЛиста = экзель_ВременныйКаталог + "xl\worksheets\sheet" + НомерЛиста + ".xml";
	Если ФС.СуществуетФайл(ФайлЛиста) = 0 Тогда
		Возврат 0;
	КонецЕсли;
	//КонвертироватьФайл(ФайлЛиста);
	xml_ОткрытьФайл(ФайлЛиста);
	
	экзель_Лист = СоздатьОбъект("ТаблицаЗначений");
	
	номСтр = 0;
	номКолонка = 0;
	//если пропущена колонка А, то будем прописывать с этой
	предыдущийКод=63;
	Пока xml_Прочитать()=1 Цикл
		//Сообщить(xml_ИмяТега);
		Если xml_ИмяТега = "<row>" Тогда
			номСтр = номСтр + 1;
			номКолонка = 0;
			экзель_Лист.НоваяСтрока();
		ИначеЕсли xml_ИмяТега = "<c>" Тогда
			//это вариант когда есть буква, но значение не записано. чтобы не было пропуска
			Если (лев(стр,5)="""<c r") и (Найти(стр,"/")<>0) Тогда
				номКолонка = номКолонка + 1;
				Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
					экзель_Лист.НоваяКолонка("К" + номКолонка);
				КонецЕсли;
				экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
				текБуква=xml_СписокАтрибутов.Получить("r");
				текБуква=лев(текБуква,1);
				теккод=КодСимв(текБуква);
				предыдущийКод=теккод;
				Продолжить;
			конецесли;	
			
			//а это вариант когда буква пропущена
			//надо сравнивать какая была буква ячейки перед этим и какая сейчас.
			//буква должна быть в теге "r"
			текБуква=xml_СписокАтрибутов.Получить("r");
			текБуква=лев(текБуква,1);
			теккод=КодСимв(текБуква);
			если теккод=65 Тогда
				//буква А. сбрасываем на начало
				предыдущийКод=теккод;
			иначе
				//не буква А. прописываем пропущенные
				для сч=предыдущийКод+2 по теккод Цикл
					номКолонка = номКолонка + 1;
					Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
						экзель_Лист.НоваяКолонка("К" + номКолонка);
					КонецЕсли;
					экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, "");
				КонецЦикла;	
				предыдущийКод=теккод;
			КонецЕсли;	
			//хз=0;
			//экзель_Лист.ВыбратьСтроку(хз);
			//Сообщить(текБуква);
			//текущаяБуква=
			ТипЯчейки = xml_ПолучитьАтрибут("t");
			xml_Прочитать();
			Если xml_ИмяТега <> "<v>" Тогда
				Продолжить;
			КонецЕсли;
			xml_Прочитать();
			
			ЗначениеЯчейки = СокрЛП(xml_Текст);
			Если ТипЯчейки = "s" Тогда
				ЗначениеЯчейки = экзель_СписокСтрок.ПолучитьЗначение(Число(ЗначениеЯчейки) + 1, ЗначениеЯчейки);
			КонецЕсли;
			
			номКолонка = номКолонка + 1;
			Если экзель_Лист.КоличествоКолонок() < номКолонка Тогда
				экзель_Лист.НоваяКолонка("К" + номКолонка);
			КонецЕсли;
			
			экзель_Лист.УстановитьЗначение(номСтр, "К" + номКолонка, ЗначениеЯчейки);
		КонецЕсли;
	КонецЦикла;
	Возврат 1;
КонецФункции
Показать
Оставьте свое сообщение

См. также

3 онлайн-курса по 1С-программированию: обмен данными, расчетные задачи и бухгалтерские задачи с 12 мая по 8 июля 2020 г. Промо

Практика программирования v8 Бесплатно (free)

Пакет из 3-х курсов по 1С-программированию. Основная цель - сформировать у слушателей практические навыки, связанные с реализацией задач обмена для прикладных решений, работающих на платформе “1С:Предприятие”, а также с разработкой прикладных решений, предназначенных для автоматизации расчета заработной платы и задач бухгалтерского учета.

22.04.2020    3055    23    infostart    2    

Программная работа с настройками СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Нюансы программной работы с настройками системы компоновки данных в отчетах и динамических списках. Обзор всех видов настроек компоновки. Что в каких случаях правильно применять. В качестве примера рассмотрена работа с отборами и группировками.

27.01.2020    14617    0    ids79    26    

[СКД] Программное создание схемы компоновки данных

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Сделаем отчет на СКД полностью программно, без использования макета "схема компоновки данных".

15.01.2020    15269    0    John_d    22    

Последовательности событий. Шпаргалка

Практика программирования v8 Россия Бесплатно (free)

Собрал информацию о событиях/подписках/расширениях в одном месте.

30.12.2019    10474    0    kuzyara    33    

Копирование числовых ячеек из 1С в Excel Промо

Загрузка и выгрузка в Excel Администрирование данных 1С v8 1cv8.cf Бесплатно (free)

Решение проблемы, когда значения скопированных ячеек из табличных документов 1С в Excel воспринимаются последним как текст, т.е. без дополнительного форматирования значений невозможно применить арифметические операции. Поводом для публикации послужило понимание того, что целое предприятие с более сотней активных пользователей уже на протяжении года мучилось с такой, казалось бы на первый взгляд, тривиальной проблемой. Варианты решения, предложенные специалистами helpdesk, обслуживающими данное предприятие, а так же многочисленные обсуждения на форумах, только подтвердили убеждение в необходимости описания способа, который позволил мне качественно и быстро справиться с ситуацией.

15.01.2019    20097    0    itriot11    22    

Таблица значений. Нюансы

Практика программирования v8 Бесплатно (free)

Обзор некоторых аспектов использования общеизвестного инструмента 1С.

01.10.2019    25022    0    Yashazz    44    

[Шпаргалка] Программное создание элементов формы

Практика программирования Работа с интерфейсом v8 1cv8.cf Бесплатно (free)

Программное создание практически всех популярных элементов формы.

06.09.2019    34331    0    rpgshnik    59    

Агрегатные функции СКД, о которых мало кто знает

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Пользуетесь ли Вы всеми возможными агрегатными функциями, которые предоставляет система компоновки данных? Если Вы используете только: СУММА, КОЛИЧЕСТВО, МИНИМУМ, МАКСИМУМ, СРЕДНЕЕ, то эта статья для Вас.

05.09.2019    36514    0    ids79    52    

Использование программных перечислений, ч.1: строковые константы Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Часто ли у вас возникает необходимость в коде выполнять сравнение на строку?

10.12.2016    34053    0    unichkin    45    

Регистры бухгалтерии. Общая информация

Практика программирования Математика и алгоритмы v8 v8::БУ БУ Бесплатно (free)

Общая информация о внутреннем устройстве регистров бухгалтерии.

05.09.2019    21350    0    YPermitin    24    

Три костыля. Сказ про фокусы в коде

Практика программирования v8 Бесплатно (free)

Три интересных (или странных) костыля в коде, которые могут помочь в повседневных и не очень задачах.

03.09.2019    21700    0    YPermitin    80    

Отслеживание выполнения фонового задания

Практика программирования Универсальные функции Разработка v8 1cv8.cf Бесплатно (free)

Запуск фонового задания из модуля внешней обработки. Отслеживание выполнения задания в виде прогресса, расположенного на форме.

17.08.2019    25464    0    ids79    16    

Вспомогательные инструкции в коде 1С Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Помогаем редактору кода 1С помогать нам писать и анализировать код.

15.10.2018    26018    0    tormozit    100    

Функции СКД: ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Подробное описание и использование внутренних функций системы компоновки данных: Вычислить, ВычислитьВыражение, ВычислитьВыражениеСГруппировкойМассив, ВычислитьВыражениеСГруппировкойТаблицаЗначений.

08.08.2019    55142    0    ids79    37    

Фоновое выполнение кода в 1С - это просто

Практика программирования v8 1cv8.cf Бесплатно (free)

Как легко запускать выполнение в фоне, не прибегая к долгому описанию фоновых процедур.

02.08.2019    26146    0    avalakh    21    

СКД - наборы данных и связи между ними, создание собственной иерархии, вложенные отчеты

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Набор данных объект. Использование в схеме компоновки нескольких наборов данных. Различные варианты связи наборов: объединение, соединение. Использование иерархии в отчетах на СКД. Создание собственной иерархии, иерархия детальных записей. Использование вложенных схем в отчетах на СКД.

26.07.2019    41801    0    ids79    11    

Оформление и рефакторинг сложных логических выражений Промо

Практика программирования v8 Россия Бесплатно (free)

В сложных логических выражениях нередко самому автору спустя какое-то время тяжело разобраться, не говоря уже о других программистах. Предлагаемая методика позволяет повысить наглядность таких выражений путем оформления в виде И-ИЛИ дерева и одновременно выполнять их рефакторинг.

20.09.2012    73532    0    tormozit    129    

СКД - использование расширений языка запросов, секция ХАРАКТЕРИСТИКИ

Инструментарий разработчика Практика программирования v8 v8::СКД Бесплатно (free)

Автоматическое и не автоматическое заполнение полей компоновки данных. Использование расширений языка запросов для СКД «{…}», секция ВЫБРАТЬ, секция ГДЕ, параметры виртуальных таблиц. Автоматизированное использование дополнительных данных в запросе: секция ХАРАКТЕРИСТИКИ.

17.07.2019    28223    0    ids79    27    

Регистры сведений. За кулисами

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Небольшие заметки по внутреннему устройству регистров сведений.

09.07.2019    21282    0    YPermitin    13    

"Меньше копипаста!", или как Вася универсальную процедуру писал

Практика программирования Разработка v8 v8::СКД 1cv8.cf Бесплатно (free)

Программист Вася разбирает подход создания универсальных методов на примере программного вывода СКД.

04.07.2019    16398    0    SeiOkami    50    

Запись значения в поле ввода/формы со срабатыванием события ПриИзменении Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Иногда возникает необходимость после записи значения в какое либо поле ввода/формы вызвать для него обработчик события ПриИзменении, а о вызове самого события приходится только мечтать. В этой статье приводится программный способ вызова этого события.

11.07.2007    44646    0    tormozit    38    

Создание отчетов с помощью СКД - основные понятия и элементы

Практика программирования Математика и алгоритмы v8 v8::СКД Бесплатно (free)

Основные принципы работы СКД. Понятия схемы компоновки и макета компоновки. Описание основных элементов схемы компоновки: наборы данных, поля, вычисляемые поля, ресурсы, параметры.

25.06.2019    41901    0    ids79    17    

Многопоточное ускорение однопользовательских нагрузок в 1С + Microsoft SQL Server 2017

Практика программирования Производительность и оптимизация (HighLoad) v8 v8::Запросы Бесплатно (free)

Взаимодействие с Microsoft SQL Server нередко вызывает трудности у 1С-ников, а потому интересны любые моменты, связанные с его использованием. О своем опыте работы с новым SQL Server 2017 участникам конференции Infostart-2018 рассказал директор ООО «Аналитика софт» Дмитрий Дудин.

11.06.2019    21283    0    dmurk    144    

Регистры накопления. Структура хранения в базе данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Структура хранения регистров накопления в базе данных для платформы 1С:Предприятие 8.x. Первая часть в серии публикаций.

16.05.2019    35109    0    YPermitin    30    

Как сделать из &НаКлиентеНаСервереБезКонтекста почти &НаКлиентеНаСервере Промо

Практика программирования v8 1cv8.cf Россия Бесплатно (free)

Как сделать метод формы, доступный на клиенте и на сервере одновременно, и сохранить при этом удобство разработки

10.09.2017    40382    0    tormozit    72    

Выполнение внешней обработки в фоновом задании

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Подробное описание подхода к созданию длительной операции на основе внешней обработки. Реализация протестирована на 1С 8.3.12.1714 (x64).

11.05.2019    24039    0    Eret1k    23    

Преобразование EXCEL в таблицу значений без COM и других извращений

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

Получение таблицы значений из excel в 1С v8, без COM, внешних источников данных и т.д. EXCELВТаблицуЗначений() - За 10 строчек кода! Реализация протестирована на 1С 8.3.12.1714 (x64).

18.04.2019    23626    9    Eret1k    43    

О расширениях замолвите слово...

Практика программирования Разработка v8 Бесплатно (free)

О чём стоит задуматься при принятии решения о создании расширения конфигурации…

07.04.2019    29033    0    ellavs    126    

Выгрузка документа по условию Промо

Практика программирования Разработка v8 Бесплатно (free)

Что делать, если документы нужно выгружать не все подряд, а по какому-то фильтру: статусу, дате, набору условий... А что если он соответствовал этим условиям, а потом перестал? А если потом опять начал? Такие ситуации заставили попотеть не одного программиста.

25.04.2019    14072    0    m-rv    2    

Git-репозитории для 1С-кода (опыт использования при небольших проектах)

Практика программирования Разработка v8 Бесплатно (free)

Инструкции по взаимодействию с Git-репозиторием, которые писались для тех наших программистов, которые вообще никогда не работали с Git (руководства в духе "Как получить код из git-репозитория?", "Как отправить код в git-репозиторий")...

28.03.2019    22912    0    ellavs    86    

Трюки с внешними источниками данных

Практика программирования Разработка v8 1cv8.cf Бесплатно (free)

Некоторые трюки для преодоления ограничений внешних источников данных.

14.03.2019    26162    0    YPermitin    53    

Возможности типовых шаблонов ограничения доступа на уровне записей (RLS)

Практика программирования БСП (Библиотека стандартных подсистем) Роли и права v8 v8::Права Бесплатно (free)

Краткий обзор применения типовых шаблонов ограничения доступа на уровне записей в конфигурациях, созданных на базе БСП: #ПоЗначениям, #ПоНаборамЗначений, #ПоЗначениямРасширенный, #ПоЗначениямИНаборамРасширенный

03.02.2019    31082    0    ids79    9    

Excel vs 1С: битва с неожиданным исходом Промо

Анализ учета Универсальные обработки Загрузка и выгрузка в Excel Финансовые Управленческие v8 1cv8.cf Россия Бесплатно (free)

Что лучше 1С или Excel? Разберемся, в казалось бы, очевидном, чтобы получить невероятное!

11.04.2019    33627    0    bolefirenko    116    

Запись одной книги Excel на нескольких листах средствами 1С (без внешних компонент)

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

Пользователи часто просят сохранить им стопиццот отчетов в один файл Excel, чтобы отчеты были в одном файле. Ну или клиент хочет счет, накладную и счет-фактуру получить в одном документе. 1С умеет это делать без всяких там COM-объектов. Давайте разберемся, куда нажимать и что крутить.

14.01.2019    19173    0    starik-2005    25    

EnterpriseData – часть 2. Процесс выгрузки данных

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Основные этапы выгрузки данных через ED, обработчики событий выгрузки, правила обработки данных, правила конвертации объектов, конвертация свойств первого и второго этапов, процедуры БСП, используемые при выгрузке данных, структура «КомпонентыОбмена».

26.12.2018    22666    0    ids79    31    

Как прикрутить ГУИД к регистру сведений Промо

Практика программирования Перенос данных из 1C8 в 1C8 Разработка v8 Бесплатно (free)

... и немного теории обмена данными. В частности, разберем боль всех, кто пишет небанальные обмены данными: как набору записей регистра сведений назначить гуид и далее использовать его в обмене для идентификации этого набора.

16.04.2019    17658    0    m-rv    17    

Новый подход к обмену данными EnterpriseData

Практика программирования Обмен через XML v8 v8::УФ Россия Бесплатно (free)

Хочу предложить Вашему вниманию цикл статей, посвященных обмену данными через универсальный формат (EnterpriseData или ED).

14.12.2018    34795    0    ids79    72    

EnterpriseData - пример доработки правил конвертации без использования КД 3.0 в расширении конфигурации

Практика программирования Обмен через XML v8 v8::УФ БП3.0 УТ11 Россия Бесплатно (free)

В статье подробно описан реальный пример доработки обмена данными через EnterpriseData (универсальный формат обмена) между конфигурациями УТ 11.4 и Бухгалтерия 3.0

16.11.2018    31502    0    ids79    32    

Программное заполнение пользовательских параметров и отборов СКД

Практика программирования v8 v8::СКД 1cv8.cf Бесплатно (free)

Публикация представляет из себя краткие примеры того, как можно заполнять параметры СКД программно так, чтобы все параметры и отборы были доступны в быстрых настройках и в обычных (типовых) настройках параметров и отборов СКД.

13.11.2018    37024    0    Unk92    19    

Как сделать запрос на изменение данных Промо

Практика программирования v8 v8::Запросы 1cv8.cf Бесплатно (free)

В статье приведены особенности внутренней архитектуры и примеры работы с расширением языка запросов 1С.

01.06.2018    27322    0    m-rv    21    

Автоматические и управляемые блокировки применительно к типовым конфигурациям 1С

Математика и алгоритмы Практика программирования v8 v8::blocking 1cv8.cf Бесплатно (free)

Основные принципы работы с режимами автоматических и управляемых блокировок в 1С Предприятие 8. Теория и применение в типовых конфигурациях: БП, УТ, ЕРП

10.11.2018    30420    0    ids79    40    

Произвольный код в фоновом режиме

Практика программирования v8 1cv8.cf Бесплатно (free)

Задача: реализовать выполнение произвольного кода в фоновом режиме без изменения конфигурации, т.е. во внешней обработке.

03.09.2018    23733    0    nikita0832    42    

Основные понятия и механизмы оптимизации клиент-серверного взаимодействия в 1C

Математика и алгоритмы Практика программирования v8 Россия Бесплатно (free)

У многих начинающих 1С программистов часто возникают вопросы про клиент-серверное взаимодействие в 1С и чтобы разобраться в непростых механизмах платформы, необходимо понять, что же такое контекст, для чего предназначены директивы компиляции, что представляют собой контекстные/внеконтекстные вызовы и как наиболее оптимально описывать прикладные задачи в модулях управляемых форм.

23.08.2018    34662    0    Rain88    46    

Метод формирования движений в типовых регистрах нетиповыми регистраторами Промо

Практика программирования v8 1cv8.cf Бесплатно (free)

Вариант решения задач с проведением по типовым регистрам нетиповыми регистраторами. Зачем - чтобы при сравнении конфигурации не обращать внимание на свойства регистров и исключить вероятность допущения горькой оплошности при обновлении информационных баз, заменив типы регистраторов основной конфигурации типами конфигурации поставщика. Для программных продуктов, имеющих в своем составе метаданных документ "Корректировка регистров"("Корректировка записей регистров").

05.12.2017    25635    0    itriot11    34    

Из Excel в 1С запросом

Загрузка и выгрузка в Excel v8 1cv8.cf Бесплатно (free)

... ну, конечно, не прям так типовым языком запросов, а расширенным языком запросов. Речь пойдет о том, как "залить" данные в таблицы 1С и не пилить при этом бесконечного количества наколеночных обработок.

14.08.2018    18674    0    m-rv    5    

Тестер: частые вопросы

Практика программирования v8 Бесплатно (free)

Ошибкам бой - тесты норма жизни!

25.07.2018    26155    0    grumagargler    26    

Работаем с дополнительными реквизитами на форме

Практика программирования v8 Бесплатно (free)

Пара полезных процедур для работы с дополнительными реквизитами на форме. Далее в статье: 1. Как называются дополнительные реквизиты на форме и в какой момент они появляются на форме? 2. Как проверить до записи корректность заполнения пользователем дополнительного реквизита? 3. Как заполнить значение дополнительного реквизита по другому событию и обновить данные на форме? 4. Как расположить дополнительный реквизит в указанном месте на форме?

15.07.2018    29099    0    papche    37    

Использование классов .Net в 1С для новичков Промо

Практика программирования Разработка внешних компонент Универсальные функции v7.7 v8 Бесплатно (free)

Руководство для новичков. Написав статью http://infostart.ru/public/238584/, я понял, что многие не понимают того, что написано. Поэтому в этой статье постараюсь более подробно остановиться на азах и без кода на вражеском языке (C#)

27.01.2016    70833    0    Serginio    108    

Повышаем эффективность разработки правил обмена

Практика программирования Перенос данных из 1C8 в 1C8 v8 КД Бесплатно (free)

Как повысить скорость и качество разработки правил обмена? Как вести групповую разработку правил обмена? Как облегчить сопровождение правил обмена после передачи в эксплуатацию? Об этом и многом другом вы можете узнать из этой статьи.

25.06.2018    26030    0    olegtymko    47    

Введение в механизм представлений в ЗУП ред. 3

Практика программирования v8 v8::СПР ЗУП3.x Бесплатно (free)

В нашей организации на первом же телефонном собеседовании на должность разработчика по ЗУП ред. 3 вас обязательно спросят о том, что такое "Представления".

04.06.2018    33930    0    xrrg    82    

Строим графы средствами 1С (без GraphViz)

Практика программирования v8 Бесплатно (free)

Множество статей на Инфостарте описывают, как работать с компонентой GraphViz, чтобы построить ориентированный граф. Но практически нет материалов, как работать с такими графами средствами 1С. Сегодня я расскажу, как красиво строить графы с минимальным пересечением. Нам этот метод пригодился для отрисовки алгоритмов в БИТ.Финансе, т.к. типовой механизм не устраивал. Еще это может быть полезно для визуализации различных зависимостей: расчета себестоимости, графы аффилированности компаний и т.д. Надеюсь, эта статья поможет сделать мир 1С красивее и гармоничней:) Итак, поехали...

23.05.2018    22822    0    slozhenikin_com    20    

Распределение расходов пропорционально продажам

Финансовый учет и бюджетирование (FRP) Учет доходов и расходов Практика программирования Финансовый учет и бюджетирование (FRP) Учет доходов и расходов v8 v8::ОУ УТ10 УУ Бесплатно (free)

Финансовая модель. Распределение административных расходов по подразделениям пропорционально продажам за месяц. Дополнительные реквизиты против бизнес-процессов!

13.05.2018    16940    0    Rustig    9