Встала как-то разовая задача - загрузить данные из Excel в базу...
Идея не новая, на ИС имеются уже готовые подобные разработки, но предлагается сделать самостоятельно. Пригодится в будущем.
(1) Тоже поддерживаю. Обработка с диска ИТС ЗагрузкаДанныхИзТабличногоДокумента универсальна, там возможности куда больше чем в "простенькой" обработке написанной быстро на коленях.
(1) Тоже поддерживаю. Обработка с диска ИТС ЗагрузкаДанныхИзТабличногоДокумента универсальна, там возможности куда больше чем в "простенькой" обработке написанной быстро на коленях.
этой обработкой с диска можно загрузить только в 1 документ. а если надо их много?
(1) ей еще надо научить пользоваться пользователей. А тут можно просто написать простенькую обработку, научить пользователя в нее копировать данные и все.
У меня проблема возникла. Сперва система ругалась на СуммаВзаиморасчетов = Число(СуммаВзаиморасчетов); , писала что не может преобразовать к типу число. Теперь просто значение не присваивается.
(21) Используйте СуммаВзаиморасчетов = Число(СокрЛП(СуммаВзаиморасчетов));, кроме того нужно проверять что сумма взаиморасчетов - не пустая строка, а также, если вы перекидываете данные из отчетов 8-ки - то учтите, что по-умолчанию 8-ка вставляет разделитель (пробел) между триадами числа, например код А = Число(Строка(1000)); вызовет в 8-ке ошибку.
Функция ВЧисло(знач Текст)
ДопустимыеЗнаки = "0123456789,-";
Текст = СокрЛП(""+Текст);
Ответ = "";
Для сч = 1 по СтрДлина(Текст) Цикл
Символ = Сред(Текст, сч, 1);
Если Найти(ДопустимыеЗнаки, Символ)>0 Тогда
Ответ = Ответ + Символ;
КонецЕсли;
КонецЦикла
Возврат ?(Ответ="", 0, Число(Ответ));
КонецФункции
СуммаВзаиморасчетов = Число(СокрЛП(СуммаВзаиморасчетов)) не помогло, а вот функция помогла. Добавил ее в форму и вызвал СуммаВзаиморасчетов = ВЧисло(СуммаВзаиморасчетов);
Спасибо!
ИМХО, проверено методом тыка: 1С при анализе выражений использует правило сложения переменных вариантного типа, как в Basic (результат выражения имеет такой же тип, как первая переменная (операнд) выражения, все остальные выражения приводятся к типу первого операнда).
Т.е. конструкция ""+Текст - это указание 1С, что если Текст не является строкой - то его нужно преобразовать в строку. Хотя 1С должна сама делать такое преобразование внутри СокрЛП() - я на это не полагаюсь и лишний раз перестраховываюсь от ошибок при выполнении кода.
А как обойти обойти проблему контроля уникальности кодов? При загрузке справочника их надо указывать, но, если идет совпадение по кодам, загрузка прерывается...Мне сейчас приходится страховаться и указывать коды, которые наверняка не встретятся в справочнике.
(26) Сделайте предварительную выборку по справочнику (до цикла загрузки) на предмет максимального кода - можно запросом, можно вручную. Поместите в отдельную переменную. Затем при добавлении нового значения в справочник - увеличивайте эту переменную на 1 и присваивайте код новому элементу.
Очень интересный прием. Да и правда быстро и удобно.
Но я по-старинке пользуюсь универсальной "ЗагрузкаДанныхИзТабличногоДокумента". Хотя идея имеет место на жизнь. И еще удобно, если у клиента надо что-то загрузить, а "ЗагрузкаДанныхИзТабличногоДокумента" нет под рукой, то можно очень быстро набросать такую обработочку.
Ещё можно табличный документ засунуть в макет внешней обработки и брать данные оттуда. Я использую это, когда мне надо одни и те же данные загрузить в пару тестовых баз по паре десятков раз, а потом отправить клиенту (ну или своими руками) для загрузки в рабочую. Единоразовый копипаст и дальше всё уже решается нажатием одной кнопки - товарищ Бух это любит.
(32) Fruit83!
Всё то же самое:
во внешней обработке добавляем новый макет - табличный документ и копипастом из Excel вставляем табличку в макет.
Потом в коде просто вызываем ПолучитьМакет("НашаТабличка") и пробегаемся по табличке.
Можно посмотреть типовые - заполнение первоначальных данных в пустой базе или подбор из классификатора валют, например.
(33) Можно обойтись и без макета - а вставить данные из Excel в поле табличного документа на форме - в режиме конфигуратора. И они сохранятся с обработкой.
(34) DrAku1a.
Можно, но оно тогда наружу торчать будет. В моих случаях хотелось всё это дело скрыть: таблиц для загрузки было несколько да и на форме были другие элементы, более нужные пользователю.
А так, да, Ваш вариант на все 100% справедлив.
Смысл темы? В инете полно примеров решений загрузки из Excel при помощи DCOM объектов, при помощи которых можно не только загружать из Excel и Open office, но и выгрузки обратно с форматированием, проставлением формул и гиперссылок.
(37) Чтобы использовать имеющиеся в инете примеры - нужно вникать в чужой код, возможно - читать документацию... и еще - немао подводных камней встретится... Правда, есть у меня в арсенале функция, которая Excel-файл через OLE считывает в таблицу значений - но пользуюсь ей редко. А так - не выходя из комфортной среды 1С, без изучения доп. материалов можно сделать загрузку данных. Быстро просто и удобно.
Мысль верная (идея рабочая), дубовая (надёжная), помнится копирование документов между базами так писал, и даже из 8 в 7.7 было. Только я в многострочную строку вставлял, потом Список.ИзСтрокиСРазделителями() и вот готовое соответствие так сказать, пользуй не хочу.
+
Спасибо автору.
Очень четко и толково все написал.
Действительно выгрузка и загрузка справочников, это часто возникающая задача.
Надо срочно и именнно этот справочник.
Эта статья очень помогла мне.
Огромное спасибо.
Удачи.
обычно копировал подключение к Excel из другой обработки, но часто бывало что потом в процессе отладки этих екселей плодиться много, приходиться прибивать процессы, а тут красиво и элегантно.
Спасибо за идею!
Спасибо! Даже сейчас ваша статься помогла. Но вот у меня вопрос, так получилось, что при загрузке не считывает 1-й столбец, т.е. постоянно надо контролировать, чтобы данные не по подали в первый столбец.