0. itriot11 71 15.01.19 22:12 Сейчас в теме

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

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

Перейти к публикации

Комментарии
Избранное Подписка Сортировка: Древо
1. kauksi 205 21.01.19 21:18 Сейчас в теме
Sub ПреобразоватьВТекст()
Dim sTempValue As String
Dim c As Range

On Error Resume Next

For Each c In ActiveWindow.Selection

sTempValue = Str(c.Value)
c.NumberFormat = "@"
c = Trim(sTempValue)
Next

On Error GoTo 0


End Sub


1) открыть Ексель
2) открыть меню Вид, справа видим подменю "Макросы"
3) для того чтобы наш макрос был доступен всегда (при любой открытой книге), необходимо вставить его в Личную книгу макросов.
по умолчанию ее нет, надо создать. Как это делается?
в подменю "Макросы" нажимаем "запись макроса", в появившейся форме выбираем "сохранить в" = "личная книга макросов".
нажимаем ОК. началась запись, щелкни пару раз где-нибудь на листе открытой в данной момент книги.
Для того чтобы остановить запись в левом нижнем углу интерфейса Екселя нажми на белый квадратик (справа от слова "Готово"). Запись прекратилась и у нас в Личной книге макросов записался макрос-пустышка скорее всего с названием "Макрос1".
4) Теперь нажимаем ALT+F11 и попадаем в среду разработки. Находим нашу Личную книгу макросов (VBAProject (PERSONAL.XLSB)), в дереве элементов в папке Modules находим Module1, дважды по нему щелкаем, удаляем наш макрос-пустышку и вместо него вставляем следующее


здесь же в редакторе нажимаем на кнопку Сохранить.
Теперь т.к. в нашей личной книге макросов есть хоть один макрос, эта личная книга будет всегда автоматом (в фоне) открываться и наш макрос всегда будет доступен.

Чтобы его вызвать предварительно выделяем в любой открытой книге диапазон ячеек, который нужно преобразовать в текст, нажимаем ALT+F8, выбираем наш макрос и жмем ОК.
2. itriot11 71 21.01.19 21:39 Сейчас в теме
(1) это должен будет сделать каждый юзер для всех своих файлов?
3. Bеgemoth 06.02.19 15:31 Сейчас в теме
(0) А если, кроме указания пробела в качестве разделителя групп, ещё и установить там же количество разрядов в группировке равным 0, то это не решит проблему лишних пробелов при выгрузке в txt файл?
4. itriot11 71 06.02.19 15:56 Сейчас в теме
(3) Очень может быть и так! Нужно попробовать)
5. itriot11 71 08.02.19 13:52 Сейчас в теме
(3) Попробовал. Да, решает эту проблему. А так же, поскольку, данная настройка регулирует наличие символа разделения групп чисел, то и заявленную в публикации проблему поможет решить без указания символа "Пробел" в поле "Разделитель групп". Однако, помимо этого, получим так же очевидный результат в том, что числовые значения во всей информационной базе будут представлены без разделителя, те было 123 456 678, 90, а станет 12345678,90. В качестве варианта - вполне можно использовать, если пользователи будут не шибко против. Ну а я пока остановился на решении описанном в публикации.
user717534; +1 Ответить
6. Ashandy 15.02.19 21:17 Сейчас в теме
А подскажите, пожалуйста, где почитать об обратной ситуации.
При использовании
ТабличныйДокумент.Прочитать(ФайлEXCEL, СпособЧтенияЗначенийТабличногоДокумента.Значение); 
если в екселе был формат ячейки число то оно переносится с разделителем в виде пробела, хотя в екселе без пробела.
причем на Windows server было так
а на локальной машине с 2010м офисом переносило значение без пробела.

Правильно ли в таком случае использовать
ТабличныйДокумент.Прочитать(ФайлEXCEL, СпособЧтенияЗначенийТабличногоДокумента.Текст);

?
7. itriot11 71 16.02.19 02:19 Сейчас в теме
(6)
Правильно ли в таком случае использовать
ТабличныйДокумент.Прочитать(ФайлEXCEL, СпособЧтенияЗначенийТаб

Не готов ответить - правильно или нет. Для этого сперва бы стоило дать определение слову "правильно") На вашем месте, попробовал бы оба варианта и выбрал наиболее приемлемый в контексте задачи.
10. romankoav 19.03.19 12:48 Сейчас в теме
(6) и так и так делал - никакой разницы не было
8. lazovit 18.02.19 21:26 Сейчас в теме
А правой кнопкой в Excel и специальная вставка, вставить как текст никто не пробовал?
9. itriot11 71 18.02.19 23:46 Сейчас в теме
(8) Пробовал - не взлетело.
11. mikl79 107 22.04.19 15:03 Сейчас в теме
Спасибо, помогло
уточню, например, при выгрузке в txt для того, чтобы убрать пробел можно использовать:
1) Формат(ПеременнаяЧисло,"ЧГ=");
2) СтрЗаменить(ПеременнаяЧисло,Символы.НПП,"");
12. user819002 07.05.19 10:15 Сейчас в теме
Попробовали всё слово в слово по инструкции, всё равно копируется как текст.

Проблему решаем даунгрейдом файлов на серверах и на клиентах, системы windows server 2016/ widows 10
Пользователей очень много, мучений доставляет кучу)

Подскажите пожалуйста, что ещё может быть не так?
13. ytrewqwerty 01.08.19 04:16 Сейчас в теме
(12) Вот еще версия для размышлений. Помнится еще в 7.7 было так, что если число в 1С таблице в ячейке было выравнено 'по центру' или 'влево', то Эксель воспринимал его как текст, но если выравнивание было 'вправо', то - как число.
14. VAAngelov 7 07.08.19 11:30 Сейчас в теме
Спасибо большое. Полезно и даже очень.
itriot11; +1 Ответить
15. erutan 50 16.09.19 10:41 Сейчас в теме
Если сделать просто так, как написано в Теме
>> Однако, последний вариант натолкнул на мысль попробовать изменить региональные установки самой информационной базы 1С. Для этого потребуется монопольно запустить режим "1С:Конфигуратор", где в подменю "Администрирование" выбрать пункт "Региональные установки информационной базы", в открывшейся форме убрать "галку" с флага "Использовать региональные установки текущего сеанса", что позволит установить пробел в поле "Разделитель групп".

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

в БП3 - решил расширением общ.модуля БухгалтерскиеОтчетыКлиентСервер



&Вместо("ВычислитьСуммуВЯчейках")
Процедура Расш1_ВычислитьСуммуВЯчейках(Сумма, СтруктураАдресВыделеннойОбласти, Результат)
	
	ТипЧисло = Новый ОписаниеТипов("Число");
	Для ИндексСтрока = СтруктураАдресВыделеннойОбласти.Верх По СтруктураАдресВыделеннойОбласти.Низ Цикл
		Если ИндексСтрока = 0 Тогда // Выделена колонка отчета (без ограничений), суммы из нее получить нельзя.
			Продолжить;
		КонецЕсли;
		
		Для ИндексКолонка = СтруктураАдресВыделеннойОбласти.Лево По СтруктураАдресВыделеннойОбласти.Право Цикл
			Если ИндексКолонка = 0 Тогда // Выделена строка отчета (без ограничений), суммы из нее получить нельзя.
				Продолжить;
			КонецЕсли;
			
			Ячейка = Результат.Область(ИндексСтрока, ИндексКолонка, ИндексСтрока, ИндексКолонка);
			Если Ячейка.Видимость = Истина Тогда
				Если Ячейка.СодержитЗначение И ТипЗнч(Ячейка.Значение) = Тип("Число") Тогда
					Сумма = Сумма + Ячейка.Значение;
				ИначеЕсли ЗначениеЗаполнено(Ячейка.Текст) Тогда
					ТекстВЯчейке = СокрЛП(Ячейка.Текст);
					
					// Удалим знак "+" перед числом. Используется в Платежном календаре.
					Если Лев(ТекстВЯчейке, 1) = "+" Тогда
						ТекстВЯчейке = Сред(ТекстВЯчейке, 2);
					КонецЕсли;
					
					ТекстВЯчейке = СтрЗаменить(ТекстВЯчейке," ","");// доработка
					
					// Разделим текст, включая пустые строки. Хотя бы одно значение (пустое) в массиве будет всегда.
					ЧастиСтроки  = СтрРазделить(ТекстВЯчейке, " ");
					ЧислоВЯчейке = ТипЧисло.ПривестиЗначение(ЧастиСтроки[0]);
					Сумма        = Сумма + ЧислоВЯчейке;
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;
	КонецЦикла;

КонецПроцедуры
Показать
itriot11; +1 Ответить
16. itriot11 71 16.09.19 11:19 Сейчас в теме
(15) С таким не сталкивался. Вероятно, это какое-то особенное поведение на стыке систем. Спасибо, что сразу тут описали решение!
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист 1С
Екатеринбург
зарплата от 120 000 руб. до 120 000 руб.
Полный день

Руководитель проектов 1С
Санкт-Петербург
Полный день


Бизнес-архитектор 1С, ведущий консультант
Санкт-Петербург
Полный день

Программист 1C
Москва
зарплата от 100 000 руб. до 150 000 руб.
Полный день