Для одной организации надо было реализовать документы, где вместо табличной части надо использовать дерево и все это на управляемых формах. Но дерево нельзя сохранить в базе в текущем виде. Пришлось использовать табличную часть документа для хранения данных дерева. И при открытии формы получать данные из ТЧ и выводить их в дерево. Далее все манипуляции производить с деревом и при сохранении документа помещать данные в обратно в ТЧ.
Поиск по интернету не дал нужного варианта, пришлось реализовавыть свой механизм, используя информацию которая была на просторах интернета.
Для реализации такого механизма в ТЧ был добавлен реквизит “КлючСвязи” (обязательный реквизит) с типом число, куда помещался “НомерСтроки” (стандартный реквизит ТЧ) родителя (верхний уровень). А самый верхний элемент дерева имеет “КлючСвязи” равный 0.
На картинке ниже видно структуру дерева и структуру ТЧ
Нагрузка на сервер осуществляется при окрытии и при сохранении документа. А с деревом работают уже на клиенте.
На рабочей базе обрабатывается около 200 строк в одном документе.
Открытие и сохранение документа происходит моментально. С большем количеством строк не тестировалось.
Чтобы алгорит правильно работал, у рекизита фомы с типом дерево значений должны быть все реквизиты табличной части, кроме “КлючСвязи” и “НомерСтроки”. Иначе платформа выдаст ошибку. В дерево можо добавлять свои реквизиты отличные от ТЧ, они будут использоваться только в дереве.
Ниже приведен код преобразования дерева в таблицу и обратно .
Код 1C v 8.2 УП &НаКлиенте
Процедура КомандаТаблицуВДерево(Команда)
КомандаТаблицуВДеревоНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура КомандаТаблицуВДеревоНаСервере()
Дерево = ТаблицаВДерево( РеквизитФормыВЗначение( "Объект" ) , "Товары" ) ;
ЗначениеВРеквизитФормы( Дерево, "ДеревоЗначений" ) ;
Элементы. ДеревоЗначений. Обновить( ) ;
КонецПроцедуры
&НаКлиенте
Процедура КомандаДеревоВТаблицу(Команда)
КомандаДеревоВТаблицуНаСервере( ) ;
КонецПроцедуры
&НаСервере
Процедура КомандаДеревоВТаблицуНаСервере()
Объект. Товары. Очистить( ) ;
ДОбъект = РеквизитФормыВЗначение( "Объект" ) ;
ДеревоВТаблицу( ДОбъект, РеквизитФормыВЗначение( "ДеревоЗначений" ) , "Товары" ) ;
ЗначениеВРеквизитФормы( ДОбъект, "Объект" ) ;
КонецПроцедуры
Формирование дерева из таблицы значений
Код 1C v 8.2 УП
&НаСервере
Функция ТаблицаВДерево(ДокОбъект, НаименованиеТабличнойЧастиДокумента, КлючСвязи = NULL, ЭлементРодитель = NULL) Экспорт
КолонкиТаблицы = ДокОбъект. Метаданные( ) . ТабличныеЧасти[НаименованиеТабличнойЧастиДокумента]. Реквизиты;
ДеревоЗначений2 = Новый ДеревоЗначений;
Для каждого Кол из КолонкиТаблицы Цикл
Если Кол. Имя = "НомерСтроки" ИЛИ Кол. Имя = "КлючСвязи" Тогда
Продолжить;
Иначе
ДеревоЗначений2 . Колонки. Добавить( Кол. Имя, Новый ОписаниеТипов( Кол. Тип) ) ;
КонецЕсли ;
КонецЦикла ;
Если КлючСвязи = NULL И ЭлементРодитель = NULL Тогда
ИсточникВыборки = ДеревоЗначений2 . Строки;
КлючСвязи = 0 ;
Иначе
ИсточникВыборки = ЭлементРодитель. Строки;
КонецЕсли ;
Фильтр = Новый Структура( "КлючСвязи" , КлючСвязи) ;
М = ДокОбъект[НаименованиеТабличнойЧастиДокумента]. НайтиСтроки( Фильтр) ;
Если М. Количество( ) = 0 Тогда
Возврат ДеревоЗначений2 ;
КонецЕсли ;
Для каждого Стр из М Цикл
Элемент = ИсточникВыборки. Добавить( ) ;
Для каждого Кол из КолонкиТаблицы Цикл
Если Кол. Имя = "НомерСтроки" ИЛИ Кол. Имя = "КлючСвязи" Тогда
Продолжить;
Иначе
Элемент[Кол. Имя] = Стр[Кол. Имя];
КонецЕсли ;
КонецЦикла ;
ТаблицаВДерево( ДокОбъект, НаименованиеТабличнойЧастиДокумента, Стр. НомерСтроки, Элемент) ;
КонецЦикла ;
Возврат ДеревоЗначений2 ;
КонецФункции
Формирование таблицы из дерева
Код 1C v 8.2 УП
&НаСервере
Процедура ДеревоВТаблицу(ДокОбъект, ДеревоЗначений, НаименованиеТабличнойЧастиДокумента, СтрокаДерева = NULL, КлючСвязи = NULL) Экспорт
Если СтрокаДерева = NULL И КлючСвязи = NULL Тогда
ПервыйВызов = Истина ;
ДокОбъект[НаименованиеТабличнойЧастиДокумента]. Очистить( ) ;
ИсточникВыборки = ДеревоЗначений. Строки;
КлючСвязи = 0 ;
Иначе
ПервыйВызов = Ложь ;
ИсточникВыборки = СтрокаДерева. Строки;
КонецЕсли ;
Для каждого Стр из ИсточникВыборки Цикл
НС = ДокОбъект[НаименованиеТабличнойЧастиДокумента]. Добавить( ) ;
Для каждого Кол из ДокОбъект. Метаданные( ) . ТабличныеЧасти[НаименованиеТабличнойЧастиДокумента]. Реквизиты Цикл
Если Кол. Имя = "КлючСвязи" Тогда
НС. КлючСвязи = КлючСвязи
ИначеЕсли Кол. Имя = "НомерСтроки" Тогда
Продолжить;
Иначе
НС[Кол. Имя] = Стр[Кол. Имя];
КонецЕсли ;
КонецЦикла ;
Если НЕ Стр. Строки. Количество( ) = 0 Тогда
ДеревоВТаблицу( ДокОбъект, , НаименованиеТабличнойЧастиДокумента, Стр, НС. НомерСтроки) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
В этой статье я расскажу, как загружать данные в 1с 8 из простейших текстовых файлов с разделителями. Обычно они имеют расширение csv (Comma-Separated Values). Т. е. название подразумевает, что в каждой строке такого текстового файла значения разделены запятой. Но на самом деле, запятую, в качестве разделителя, использовать не надёжно. Поэтому применяют другие разделители, которые в обычном тексте встречаются редко. Это могут быть символы «^», «~»,«|» и другие. Итак, наша задача состоит в том, чтобы загрузить имеющуюся в csv файле информацию в базу данных 1с. Например, в файле будут содержаться товары интернет - магазина. В качестве образца, я взял выгрузку из магазина на скрипте virtuemart. Посмотрим, как выглядит файл.
Привожу две первых строки из него:
Код ~product_sku~^~category_path~^~product_name~^~product_desc~
~20~^~Книги/Электронные книги~^~Amazon Kindle 4 Touch~^~<p>Популярная электронная книга с ч/б экраном 6", электронной бумагой E-Ink Pearl, разрешением 600x800 пикс. с 16 - ю оттенками серого.</p>~
Посмотрим на файл.
Первая строка служебная. В ней описан формат нашего файла. Т. е. в какой ячейке, что находится. Однако, имейте в виду, что такой строки может и не быть.
Ячейки образуются при помощи разделителя «^», а данные в ячейках обрамляются символом «~».
В любой конфигурации 1с есть иерархический справочник товаров. В него и будем загружать информацию.
Создадим внешнюю обработку. Добавим строковый реквизит «путьКФайлуЗагрузки» для хранения имени файла. Добавим на форму поле ввода, связанное с данным реквизитом. Включим в свойствах поля ввода кнопку выбора и создадим обработчик события «НачалоВыбора» и напишем в нём такой код:
Код 1C v 8.х Процедура путьКФайлуЗагрузкиНачалоВыбора(Элемент, СтандартнаяОбработка)
Режим = РежимДиалогаВыбораФайла. Открытие;
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытияФайла. ПолноеИмяФайла = "" ;
Фильтр = "Comma separated file (*.csv)|*.csv" ;
ДиалогОткрытияФайла. Фильтр = Фильтр;
ДиалогОткрытияФайла. МножественныйВыбор = Ложь ;
ДиалогОткрытияФайла. Заголовок = "Выберите файл" ;
Если ДиалогОткрытияФайла. Выбрать( ) Тогда
путьКФайлуЗагрузки = ДиалогОткрытияФайла. ПолноеИмяФайла;
КонецЕсли ;
КонецПроцедуры
Т. о. мы организовали диалог для выбора файла в нашей обработке.
Хорошо. Теперь, для удобства и наглядности я предлагаю создать временную табличку, в которую мы загрузим текстовый файл, а уже после её заполнения - будем осуществлять загрузку в базу 1с. Для этого, на форму добавим табличное поле «табЗагрузки», с типом значения «ТаблицаЗначений» и командной панелью. В панели поместим кнопку «Заполнить» и создадим обработчик её нажатия «КоманднаяПанель1Заполнить». Также для элемента универсальности, добавим в обработку два строковых реквизита «символОграничения» и «разделительПолей». В них мы будем хранить «^», и «~». Можно в теле модуля формы осуществить их начальную инициализацию:
разделительПолей = "^";
символОграничения = "~";
Это позволит пользователю задать свои значения и при желании сохранить настройку, которая впоследствии не затрется нашей инициализацией.
Код 1C v 8.х Процедура КоманднаяПанель1Заполнить(Кнопка)
Если табЗагрузки. Количество( ) > 0 И Вопрос( "Таблица будет очищена. Вы уверены?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ЗаполнитьТаблицу( ) ;
КонецПроцедуры
Процедура ЗаполнитьТаблицу()
текст = Новый ТекстовыйДокумент;
Попытка
текст. Прочитать( путьКФайлуЗагрузки, КодировкаТекста. UTF8) ;
Исключение
Сообщить( "Не удалось прочитать файл: "
+ ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецПопытки ;
табЗагрузки. Очистить( ) ;
табЗагрузки. Колонки. Очистить( ) ;
квоСтрок = текст. КоличествоСтрок( ) ;
Если Не квоСтрок > 0 Тогда
Сообщить( "Файл пустой" , СтатусСообщения. Внимание) ;
Возврат ;
КонецЕсли ;
стрТекста = текст. ПолучитьСтроку( 1 ) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
табЗагрузки. Колонки. Добавить( "не_загружать" , Новый ОписаниеТипов( "Булево" ) , "Не загружать" ) ;
табЗагрузки. Колонки. Добавить( "номер_строки" , Новый ОписаниеТипов( "Число" ,
Новый КвалификаторыЧисла( 10 , 0 , ДопустимыйЗнак. Неотрицательный) ) , "Номер строки" ) ;
Для каждого зн Из масЗначСтр Цикл
значение = СтрЗаменить( зн, символОграничения, "" ) ;
кол = табЗагрузки. Колонки. Добавить( значение, Новый ОписаниеТипов( "Строка" ) ) ;
КонецЦикла ;
ЭлементыФормы. табЗагрузки. СоздатьКолонки( ) ;
Для номСтр = 2 По квоСтрок Цикл
стрТекста = текст. ПолучитьСтроку( номСтр) ;
масЗначСтр = ОбщегоНазначения. РазложитьСтрокуВМассивПодстрок( стрТекста, разделительПолей) ;
новСтр = табЗагрузки. Добавить( ) ;
новСтр. номер_строки = номСтр;
номЗнач = 2 ;
Для каждого зн Из масЗначСтр Цикл
новСтр[номЗнач] = СтрЗаменить( зн, символОграничения, "" ) ;
номЗнач = номЗнач + 1 ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Функцию разложения строки с разделителями в массив можно разместить как в одном из общих модулей, так и непосредственно в обработке.
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока Истина Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Отлично. В итоге, после заполнения, получим примерно такую картинку:
Теперь приступим непосредственно к загрузке товаров. Рядом с кнопкой «заполнить» добавим кнопку «загрузить» и добавим обработчик её нажатия «КоманднаяПанель1Загрузить», а также добавим реквизит «ПапкаЗагрузкиВыгрузкиТоваров» с типом вашего справочника товаров для опциональной их загрузки в определенную папку. Текст обработчика будет такой:
Код 1C v 8.х Процедура КоманднаяПанель1Загрузить(Кнопка)
Если Вопрос( "Вы уверены, что хотите загрузить файл?" , РежимДиалогаВопрос. ДаНет)
= КодВозвратаДиалога. Нет Тогда
Возврат ;
КонецЕсли ;
ВсегоСтрок = табЗагрузки. Количество( ) ;
номСтр = 1 ;
Для каждого стрТЗ Из табЗагрузки Цикл
Состояние( "Обработано: " + Окр( номСтр * 100 / ВсегоСтрок) + "%" ) ;
номСтр = номСтр + 1 ;
ОбработкаПрерыванияПользователя( ) ;
Если стрТЗ. не_загружать Тогда
Продолжить;
КонецЕсли ;
объект1 С = вернутьТовар( стрТЗ) ;
Если объект1 С = Неопределено Тогда
Возврат ;
КонецЕсли ;
Если Не ЗаписатьЭлементСпр( объект1 С) Тогда
Сообщить( "Загрузка прервана!" , СтатусСообщения. ОченьВажное) ;
Возврат ;
КонецЕсли ;
стрТЗ. не_загружать = Истина ;
КонецЦикла ;
КонецПроцедуры
В приведенном коде две новые функции «вернутьТовар» и «ЗаписатьЭлементСпр». Вот их текст:
Код 1C v 8.х Функция вернутьТовар(стрТабФайла)
Артикул = стрТабФайла. product_sku;
Если Не ЗначениеЗаполнено( Артикул) Тогда
Сообщить( "В строке " + стрТабФайла. номер_строки + " не заполнен product_sku" ,
СтатусСообщения. ОченьВажное) ;
Возврат Неопределено ;
КонецЕсли ;
Запрос = Новый Запрос( "ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Артикул = &Артикул" ) ;
Запрос. УстановитьПараметр( "Артикул" , Артикул) ;
Выборка = Запрос. Выполнить( ) . Выбрать( ) ;
Если Выборка. Следующий( ) Тогда
Возврат Выборка. Ссылка. ПолучитьОбъект( ) ;
Иначе
ЭтоНовый = Истина ;
объект1 С = Справочники. Номенклатура. СоздатьЭлемент( ) ;
объект1 С. Артикул = Артикул;
объект1 С. Наименование = стрТабФайла. product_name;
объект1 С. Родитель = вернутьРодителяТовара( стрТабФайла. category_path) ;
Возврат объект1 С;
КонецЕсли ;
КонецФункции
Функция ЗаписатьЭлементСпр(Спр)
Попытка
Спр. Записать( ) ;
Исключение
Сообщить( "При записи элемента справочника " + Спр + " возникла ошибка: " + ОписаниеОшибки( ) , СтатусСообщения. ОченьВажное) ;
Возврат Ложь ;
КонецПопытки ;
Возврат Истина ;
КонецФункции
И осталась последняя новая функция для обработки родителя товара вернутьРодителяТовара. Текст её смотрите ниже. Комментарии по тексту.
Код 1C v 8.х Функция вернутьРодителяТовара(стрКатегории)
Родитель = ПапкаЗагрузкиВыгрузкиТоваров;
масРодителей = РазложитьСтрокуВМассивПодстрок( стрКатегории, "/" ) ;
Для каждого Род Из масРодителей Цикл
РодСс = Справочники. Номенклатура. НайтиПоНаименованию( Род, Истина ) ;
Если РодСс. Пустая( ) Тогда
НовРод = Справочники. Номенклатура. СоздатьГруппу( ) ;
НовРод. Наименование = Род;
НовРод. Родитель = Родитель;
Если Не ЗаписатьЭлементСпр( НовРод) Тогда
Возврат Неопределено ;
КонецЕсли ;
Родитель = НовРод. Ссылка;
Иначе
Родитель = РодСс;
КонецЕсли ;
КонецЦикла ;
Возврат Родитель;
КонецФункции
Все. Конечно, в реальной жизни еще много чего нужно будет дописать, но не все сразу. Такой шаблон можно использовать как отправную точку.
Скачивать файлы может только зарегистрированный пользователь!
Успехов в разработке!
Источник Хочу поделиться с посетителями сайта своим подходом к преобразованию таблицы значений в дерево значений и обратно.
Вообще, при разработке отраслевой задачи, была необходимость почти во всех документах, выводить информацию в виде дерева и хранить ее в табличных частях документа, а также в интерактивной обработке данных в виде дерева.
Отсюда появился небольшой модуль для расширения возможности работы с деревом значений, хотя и с некоторыми оговорками.
Основной идеей является использование двух ключевых реквизитов/колонок КлючСтроки и КлючСвязи.
Однако они не всегда необходимы. Код, на мой взгляд достаточно "высушен".
Код 1C v 8.х
Функция ПолучитьНовыйКлючСтрокиДерева(Дерево, СписокКлючей = Неопределено) Экспорт
Если СписокКлючей = Неопределено Тогда
СписокКлючей = Новый СписокЗначений;
СписокКлючей. Добавить( 0 ) ;
КонецЕсли ;
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
СписокКлючей. Добавить( СтрокаДерева. КлючСтроки) ;
ПолучитьНовыйКлючСтрокиДерева( СтрокаДерева, СписокКлючей) ;
СписокКлючей. СортироватьПоЗначению( НаправлениеСортировки. Убыв) ;
МаксКлюч = СписокКлючей[0 ]. Значение + 1 ;
КонецЦикла ;
Возврат МаксКлюч;
КонецФункции
Процедура ОбновитьКлючиСвязиВДеревеЗначений(Дерево) Экспорт
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
Попытка
СтрокаДерева. КлючСвязи = СтрокаДерева. Родитель. КлючСтроки;
Исключение
СтрокаДерева. КлючСвязи = 0 ;
КонецПопытки ;
ОбновитьКлючиСвязиВДеревеЗначений( СтрокаДерева) ;
КонецЦикла ;
КонецПроцедуры
Процедура ОбновитьКлючиСтрокВДеревеЗначений(Дерево, КлючСтроки = 1) Экспорт
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
СтрокаДерева. КлючСтроки = КлючСтроки;
КлючСтроки = КлючСтроки + 1 ;
ОбновитьКлючиСтрокВДеревеЗначений( СтрокаДерева, КлючСтроки) ;
КонецЦикла ;
КонецПроцедуры
Функция ВыгрузитьДеревоЗначенийВТаблицуЗначений(Дерево, Таблица = Неопределено) Экспорт
Если Таблица = Неопределено Тогда
Таблица = Новый ТаблицаЗначений;
Для Каждого Колонка Из Дерево. Колонки Цикл
Таблица. Колонки. Добавить( Колонка. Имя, Колонка. ТипЗначения) ;
КонецЦикла ;
КонецЕсли ;
Для Каждого СтрокаДерева Из Дерево. Строки Цикл
ЗаполнитьЗначенияСвойств( Таблица. Добавить( ) , СтрокаДерева) ;
ВыгрузитьДеревоЗначенийВТаблицуЗначений( СтрокаДерева, Таблица) ;
КонецЦикла ;
Возврат Таблица;
КонецФункции
Функция ВыгрузитьТаблицуЗначенийВДеревоЗначений(Таблица, КлючСтроки = "КлючСтроки" , КлючСвязи = "КлючСвязи" ) Экспорт
Дерево = Новый ДеревоЗначений;
Для Каждого Колонка Из Таблица. Колонки Цикл
Дерево. Колонки. Добавить( Колонка. Имя, Колонка. ТипЗначения) ;
КонецЦикла ;
Для Каждого СтрокаТаблицы Из Таблица Цикл
СтрокаГруппировки = Дерево. Строки. Найти( СтрокаТаблицы[КлючСвязи], КлючСтроки, Истина ) ;
Если СтрокаГруппировки = Неопределено Тогда
ЗаполнитьЗначенияСвойств( Дерево. Строки. Добавить( ) , СтрокаТаблицы) ;
Иначе
ЗаполнитьЗначенияСвойств( СтрокаГруппировки. Строки. Добавить( ) , СтрокаТаблицы) ;
КонецЕсли ;
КонецЦикла ;
Возврат Дерево;
КонецФункции
Процедура УстановитьЗначениеКолонкиДерева(Дерево, Колонка, Значение) Экспорт
Для каждого СтрокаДерева Из Дерево. Строки Цикл
СтрокаДерева[Колонка] = Значение;
УстановитьЗначениеКолонкиДерева( СтрокаДерева, Колонка, Значение) ;
КонецЦикла ;
КонецПроцедуры
Процедура СкопироватьПодчиненныеСтроки(СтрокаПриемник, СтрокаИсточник)
Для каждого Строка Из СтрокаИсточник. Строки Цикл
НоваяСтрока = СтрокаПриемник. Строки. Добавить( ) ;
НоваяСтрока. КлючСвязи = СтрокаПриемник. КлючСтроки;
ЗаполнитьЗначенияСвойств( НоваяСтрока, Строка) ;
СкопироватьПодчиненныеСтроки( НоваяСтрока, Строка) ;
КонецЦикла ;
КонецПроцедуры
Процедура ПеренестиСтрокиДереваЗначений(СтрокаПриемник, ВыделенныеСтроки) Экспорт
Если НЕ СтрокаПриемник = Неопределено Тогда
МассивСтрок = Новый Массив;
Для Каждого СтрокаПереноса Из ВыделенныеСтроки Цикл
МассивСтрок. Добавить( СтрокаПереноса) ;
НоваяСтрока = СтрокаПриемник. Строки. Добавить( ) ;
СкопироватьПодчиненныеСтроки( НоваяСтрока, СтрокаПереноса) ;
ЗаполнитьЗначенияСвойств( НоваяСтрока, СтрокаПереноса) ;
НоваяСтрока. КлючСвязи = СтрокаПриемник. КлючСтроки;
КонецЦикла ;
Для Каждого СтрокаДерева Из МассивСтрок Цикл
Если СтрокаДерева. Родитель = Неопределено Тогда
СтрокаДерева. Строки. Удалить( СтрокаДерева) ;
Иначе
СтрокаДерева. Родитель. Строки. Удалить( СтрокаДерева) ;
КонецЕсли ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Александр Синцов (Sintson) На форме в табличное поле добавим Колонку (Имя - НачальноеСальдо, Данные - Пусто и все остальное тоже) и колонку КонечноеСальдо
Зайдем в свойства Табличного поля и в событиях определим процедуру при выводе строки: ДействиеПриВыводеСтроки
А в модуле напишем:
Код 1C v 8.х
Процедура ЗарплатаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
Фильтр = Новый Структура;
Фильтр. Вставить( "ФизЛицо" , ДанныеСтроки. ФизЛицо) ;
Попытка
НачСальдо = РегистрыНакопления. Взаиморасчеты. Остатки( Новый Граница( Дата, ВидГраницы. Исключая) , Фильтр, "ФизЛицо" , "ВзаимРасчет" ) [0 ]. ВзаимРасчет;
Исключение
НачСальдо = 0 ;
КонецПопытки ;
Попытка
КонСальдо = РегистрыНакопления. Взаиморасчеты. Остатки( Новый Граница( Дата, ВидГраницы. Включая) , Фильтр, "ФизЛицо" , "ВзаимРасчет" ) [0 ]. ВзаимРасчет;
Исключение
КонСальдо = 0 ;
КонецПопытки ;
ОформлениеСтроки. Ячейки. НачальноеСальдо. ОтображатьТекст = Истина ;
ОформлениеСтроки. Ячейки. НачальноеСальдо. Текст = ? ( НачСальдо= 0 , "" , НачСальдо) ;
ОформлениеСтроки. Ячейки. КонечноеСальдо. ОтображатьТекст = Истина ;
ОформлениеСтроки. Ячейки. КонечноеСальдо. Текст = ? ( КонСальдо= 0 , "" , КонСальдо) ;
Если НачСальдо < 0 Тогда
ОформлениеСтроки. Ячейки. НачальноеСальдо. ЦветФона = Новый Цвет( 255 , 131 , 131 ) ;
Иначе
ОформлениеСтроки. Ячейки. НачальноеСальдо. ЦветФона = Новый Цвет( 255 , 255 , 231 ) ;
КонецЕсли ;
Если КонСальдо < 0 Тогда
ОформлениеСтроки. Ячейки. КонечноеСальдо. ЦветФона = Новый Цвет( 255 , 131 , 131 ) ;
Иначе
ОформлениеСтроки. Ячейки. КонечноеСальдо. ЦветФона = Новый Цвет( 255 , 255 , 231 ) ;
КонецЕсли ;
КонецПроцедуры
Код 1C v 7.x Перем ИмяПути, ИмяФайла;
Перем xmlParser;
Функция УстановитьКомпоненту()
Если ЗагрузитьВнешнююКомпоненту( КаталогИБ( ) + "ExtFormsv7plus.dll" ) = 0 Тогда
Если ЗагрузитьВнешнююКомпоненту( "v7plus.dll" ) = 0 Тогда
Сообщить( "Не удалось обнаружить компоненту V7Plus.dll!" ) ;
Возврат 0 ;
КонецЕсли ;
КонецЕсли ;
Попытка
xmlParser = СоздатьОбъект( "Addin.XmlParser" ) ;
Исключение
Сообщить( "Не удалось создать объект Addin.XmlParser!" ) ;
Возврат 0 ;
КонецПопытки ;
Возврат 1 ;
КонецФункции
Процедура Выполнить()
стрИмяФайла= ИмяПути+ ИмяФайла;
таб= СоздатьОбъект( "ТаблицаЗначений" ) ;
таб. НоваяКолонка( "Ф" , "Строка" , 50 , 0 ) ;
таб. НоваяКолонка( "И" , "Строка" , 50 , 0 ) ;
таб. НоваяКолонка( "О" , "Строка" , 50 , 0 ) ;
таб. НоваяКолонка( "ДатаР" , "Дата" ) ;
таб. НоваяКолонка( "_01" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_02" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_03" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_04" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_05" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_06" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_07" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_08" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_09" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_10" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_11" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "_12" , "Число" , 16 , 2 ) ;
таб. НоваяКолонка( "СумГод" , "Число" , 18 , 2 ) ;
таб. НоваяКолонка( "ОблГод" , "Число" , 18 , 2 ) ;
таб. НоваяКолонка( "УдерГод" , "Число" , 18 , 2 ) ;
таб. НоваяКолонка( "Индекс" , "Строка" , 6 , 0 ) ;
таб. НоваяКолонка( "Регион" , "Строка" , 2 , 0 ) ;
таб. НоваяКолонка( "Город" , "Строка" , 20 , 0 ) ;
таб. НоваяКолонка( "Улица" , "Строка" , 20 , 0 ) ;
таб. НоваяКолонка( "Дом" , "Строка" , 5 , 0 ) ;
таб. НоваяКолонка( "Корпус" , "Строка" , 5 , 0 ) ;
таб. НоваяКолонка( "Квартира" , "Строка" , 5 , 0 ) ;
Документ= xmlParser. СоздатьДокумент( ) ;
Документ. Загрузить( стрИмяФайла) ;
Данные= Документ. ПолучитьПодчиненныйПоНомеру( 2 ) ;
Для Сч= 1 По Данные. КоличествоПодчиненных( ) Цикл
таб. НоваяСтрока( ) ;
Элем= Данные. ПолучитьПодчиненныйПоНомеру( Сч) ;
УзелПолучДох= Элем. ВыбратьУзлы( "ПолучДох" ) ;
Для Сч3 = 0 По УзелПолучДох. КоличествоУзлов- 1 Цикл
ФИО= УзелПолучДох. ПолучитьУзел( Сч3 ) . ПолучитьПодчиненныйПоНомеру( 1 ) ;
таб. Ф= ФИО. ПолучитьПодчиненныйПоНомеру( 1 ) . Текст;
таб. И = ФИО. ПолучитьПодчиненныйПоНомеру( 2 ) . Текст;
таб. О= ФИО. ПолучитьПодчиненныйПоНомеру( 3 ) . Текст;
таб. ДатаР= УзелПолучДох. ПолучитьУзел( Сч3 ) . ПолучитьПодчиненныйПоНомеру( 3 ) . Значение;
адр= УзелПолучДох. ПолучитьУзел( Сч3 ) . ПолучитьПодчиненныйПоНомеру( 6 ) ;
Для Сч4 = 1 По адр. КоличествоПодчиненных( ) Цикл
Если адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Индекс" Тогда
таб. Индекс= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "КодРегион" Тогда
таб. Регион= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Город" Тогда
таб. Город= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Улица" Тогда
таб. Улица= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Дом" Тогда
таб. Дом= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Корпус" Тогда
таб. Корпус= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
ИначеЕсли адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Наименование= "Кварт" Тогда
таб. Квартира= адр. ПолучитьПодчиненныйПоНомеру( Сч4 ) . Текст;
Иначе
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
УзелСвДохСтав= Элем. ВыбратьУзлы( "СвДохСтав" ) ;
Для Сч3 = 0 По УзелСвДохСтав. КоличествоУзлов- 1 Цикл
УзелДохВыч= УзелСвДохСтав. ПолучитьУзел( Сч3 ) . ВыбратьУзлы( "ДохВыч" ) ;
Для Сч4 = 0 По УзелДохВыч. КоличествоУзлов- 1 Цикл
МесДоход= УзелДохВыч. ПолучитьУзел( Сч4 ) ;
ИмяМес= "" ;
СумМес= 0 ;
Если МесДоход. ПолучитьПодчиненныйПоНомеру( 1 ) . Наименование= "НомМес" Тогда
ИмяМес= МесДоход. ПолучитьПодчиненныйПоНомеру( 1 ) . Текст;
КонецЕсли ;
Если МесДоход. ПолучитьПодчиненныйПоНомеру( 3 ) . Наименование= "СумДоход" Тогда
СумМес= МесДоход. ПолучитьПодчиненныйПоНомеру( 3 ) . Значение;
КонецЕсли ;
Если ПустоеЗначение( ИмяМес) = 0 Тогда
Если ИмяМес= "01" Тогда
таб. _01= СумМес;
ИначеЕсли ИмяМес= "02" Тогда
таб. _02= СумМес;
ИначеЕсли ИмяМес= "03" Тогда
таб. _03= СумМес;
ИначеЕсли ИмяМес= "04" Тогда
таб. _04= СумМес;
ИначеЕсли ИмяМес= "05" Тогда
таб. _05= СумМес;
ИначеЕсли ИмяМес= "06" Тогда
таб. _06= СумМес;
ИначеЕсли ИмяМес= "07" Тогда
таб. _07= СумМес;
ИначеЕсли ИмяМес= "08" Тогда
таб. _08= СумМес;
ИначеЕсли ИмяМес= "09" Тогда
таб. _09= СумМес;
ИначеЕсли ИмяМес= "10" Тогда
таб. _10= СумМес;
ИначеЕсли ИмяМес= "11" Тогда
таб. _11= СумМес;
ИначеЕсли ИмяМес= "12" Тогда
таб. _12= СумМес;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
УзелНалПер= УзелСвДохСтав. ПолучитьУзел( Сч3 ) . ВыбратьУзлы( "СГДНалПер" ) ;
НалПер= УзелНалПер. ПолучитьУзел( 0 ) ;
Если НалПер. Наименование= "СГДНалПер" Тогда
таб. СумГод= НалПер. ПолучитьПодчиненныйПоНомеру( 1 ) . Значение;
таб. ОблГод= НалПер. ПолучитьПодчиненныйПоНомеру( 2 ) . Значение;
таб. УдерГод= НалПер. ПолучитьПодчиненныйПоНомеру( 3 ) . Значение;
КонецЕсли ;
КонецЦикла ;
Состояние( Сч) ;
КонецЦикла ;
Т= СоздатьОбъект( "Таблица" ) ;
Т. ИсходнаяТаблица( "Таблица" ) ;
таб. выбратьСтроки( ) ;
Т. ВывестиСекцию( "Шапка" ) ;
нпп= 1 ;
Пока таб. ПолучитьСтроку( ) = 1 Цикл
Т. ВывестиСекцию( "Текст" ) ;
нпп= нпп+ 1 ;
КонецЦикла ;
Т. ТолькоПросмотр( 1 ) ;
Т. Опции( 0 , 0 , 1 , 0 ) ;
Т. ПараметрыСтраницы( 2 , , , 5 , 5 , 5 , 5 , , , 1 ) ;
Т. Показать( "Прочитали из XML" ) ;
КонецПроцедуры
Процедура Выбрать()
ФС. ВыбратьФайл( 0 , ИмяФайла, ИмяПути, "Выберите файл" , "xml файлы (*.xml) |*.xml|Все файлы (*.*) |*.*" , "xml" , ) ;
Если ПустоеЗначение( ИмяФайла) = 0 Тогда
PathSbitn= ИмяПути+ ИмяФайла;
КонецЕсли ;
КонецПроцедуры
Процедура ПриОткрытии()
ИмяФайла = "" ;
ИмяПути = "P:" ;
res= УстановитьКомпоненту( ) ;
КонецПроцедуры
Пример файла XML :
Код
<?xml version="1.0" encoding="windows-1251"?>
<НДФЛ2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ВерсФорм="4.00001" ВерсПрог="НП 10.31" ИдФайл="ДОХОД_2НДФЛ">
<Справка>
<ОбщСвИЧ>
<ГодДох>2006</ГодДох>
<НомСпр>1</НомСпр>
<ДатаСпр>26.03.2007</ДатаСпр>
<ИФНСНА>7777</ИФНСНА>
</ОбщСвИЧ>
<ИстДох>
<СвНАЮЛ>
<ИННЮЛ>1234567890</ИННЮЛ>
<КПП>12345678</КПП>
<НаимОрг>ООО Рога и Копыта</НаимОрг>
<ОКАТО>12345678901</ОКАТО>
</СвНАЮЛ>
</ИстДох>
<ПолучДох>
<ФИО>
<Фамилия>Иванов</Фамилия>
<Имя>Иван</Имя>
<Отчество>Иванович</Отчество>
</ФИО>
<Статус>1</Статус>
<ДатаРожд>24.01.1973</ДатаРожд>
<Гражданство>643</Гражданство>
<УдЛичн>
<КодУдЛичн>21</КодУдЛичн>
<СерНомДок>12 01 012345</СерНомДок>
</УдЛичн>
<АдрМЖРФ>
<Индекс>123456</Индекс>
<КодРегион>77</КодРегион>
<Город>Энн г</Город>
<Улица>Ленина ул</Улица>
<Дом>99</Дом>
<Корпус>5</Корпус>
<Кварт>12</Кварт>
</АдрМЖРФ>
</ПолучДох>
<СвДохСтав>
<Ставка>35</Ставка>
<ДохВыч>
<НомМес>02</НомМес>
<КодДоход>2610</КодДоход>
<СумДоход>252.15</СумДоход>
</ДохВыч>
<ДохВыч>
<НомМес>07</НомМес>
<КодДоход>2760</КодДоход>
<СумДоход>100.00</СумДоход>
<КодВычет>503</КодВычет>
<СумВычет>100.00</СумВычет>
</ДохВыч>
<ДохВыч>
<НомМес>10</НомМес>
<КодДоход>2760</КодДоход>
<СумДоход>100.00</СумДоход>
<КодВычет>503</КодВычет>
<СумВычет>100.00</СумВычет>
</ДохВыч>
<СГДНалПер>
<СГДСумм>252.15</СГДСумм>
<ОблСумм>252.15</ОблСумм>
<НИОблСумм>88</НИОблСумм>
<НУОблСумм>88</НУОблСумм>
<ВозврСуммПЛ>0</ВозврСуммПЛ>
<ЗачСуммПЛ>0</ЗачСуммПЛ>
<УдСуммПЛ>0</УдСуммПЛ>
<ДолгНП>0</ДолгНП>
<ДолгНА>0</ДолгНА>
<ВзыскИФНС>0</ВзыскИФНС>
</СГДНалПер>
</СвДохСтав>
</Справка>
</НДФЛ2>
Код 1C v 8.х Ex = Новый COMObject( "Excel.Application" ) ;
Ex. Workbooks. Open( Путь) ;
Ex. Visible = 1 ;
ТекЛист= Ex. WorkSheets( 1 ) ;
Для Ячейка = 1 по 400 цикл
Если НЕ ТекЛист. Cells( Ячейка, 1 ) . Value = Неопределено тогда
Сообщить( Строка( ТекЛист. Cells( Ячейка, 1 ) . Value) ) ;
Карта = Справочники. Номенклатура. НайтиПоКоду( ИзЧислаВСтроку( ТекЛист. Cells( Ячейка, 1 ) . Value) ) ;
Если Карта. Пустая( ) тогда
Сообщить( " Пустой элемент " + ТекЛист. Cells( Ячейка, 1 ) ) ;
иначе
Объект = Карта. ПолучитьОбъект( ) ;
Объект. ОсновнойПоставщик = ОсновнойКлиент;
Объект. Записать( ) ;
конецесли ;
конецесли ;
конеццикла ;
Примеры процедур для чтения данных из EXCEL
Код 1C v 8.х
Функция Excel_ПолучитьДанные_ADO(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0) Экспорт
#Если Клиент Тогда
Состояние( "Установка соединения с Excel" ) ;
#КонецЕсли
ЗаголовкиВСтроке1 = "HDR=NO;" ;
СтрокаСоединения = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source= " + СокрЛП( пФайл) + " ;Extended Properties="" Excel 8.0;" + ЗаголовкиВСтроке1 + "IMEX=1;"" " ;
Connection = Новый COMОбъект( "ADODB.Connection" ) ;
Connection. ConnectionString = СтрокаСоединения;
Попытка
Connection. Open( ) ;
Исключение
Сообщить ( "Проблемы с подключением к Excel" ) ;
Возврат Неопределено ;
КонецПопытки ;
RS = Новый COMОбъект( "ADODB.Recordset" ) ;
ТекстЗапроса =
"S_elect
| Лист.*
|FROM
| [" + пЛист + "$] as Лист" ;
Попытка
RS. Open( ТекстЗапроса, Connection) ;
Исключение
Сообщить ( "Проблемы с выполнением запроса" ) ;
Возврат Неопределено ;
КонецПопытки ;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS. Fields. Count Цикл
Поле = RS. Fields. Item( Счетчик - 1 ) ;
Колонка = Таблица. Колонки. Добавить( "К" + Счетчик, , Поле. Name) ;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица. Колонки. Добавить( КлючИЗначение. Ключ) ;
КонецЦикла ;
КонецЕсли ;
НомерСтроки = 0 ;
КолвоСтрок = RS. RecordCount;
Пока RS. EOF( ) = 0 Цикл
НомерСтроки = НомерСтроки + 1 ;
#Если Клиент Тогда
Состояние( "Чтение файла: " + Формат( НомерСтроки) + " из " + Формат( КолвоСтрок) ) ;
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
Если НомерСтроки < НачСтрока Тогда
RS. MoveNext( ) ;
Продолжить;
КонецЕсли ;
Если КонСтрока > 0 И НомерСтроки > КонСтрока Тогда
Прервать ;
КонецЕсли ;
НоваяСтрока = Таблица. Добавить( ) ;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По RS. Fields. Count Цикл
Поле = RS. Fields. Item( Счетчик - 1 ) ;
НоваяСтрока["К" + Счетчик] = Поле. Value;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = RS. Fields. Item( КлючИЗначение. Значение - 1 ) ;
НоваяСтрока[КлючИЗначение. Ключ] = Поле. Value;
КонецЦикла ;
КонецЕсли ;
RS. MoveNext( ) ;
КонецЦикла ;
RS. Close( ) ;
Connection. Close( ) ;
Возврат Таблица;
КонецФункции
Функция Excel_ПолучитьДанные_COM(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние( "Открытие Excel" ) ;
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект( "Excel.Application" ) ;
XLSОбъект. Visible = Ложь ;
XLSОбъект. DisplayAlerts = Ложь ;
КонецЕсли ;
Попытка
Book = XLSОбъект. Workbooks. Open( пФайл, , Истина ) ;
Исключение
Сообщить ( "Проблемы с подключением к Excel" ) ;
Возврат Неопределено ;
КонецПопытки ;
Лист = Book. Sheets( 1 ) ;
КолвоКолонок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Column;
КолвоСтрок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица. Колонки. Добавить( "К" + Счетчик) ;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица. Колонки. Добавить( КлючИЗначение. Ключ) ;
КонецЦикла ;
КонецЕсли ;
НачСтрока = ? ( НачСтрока = 0 , 1 , НачСтрока) ;
КонСтрока = ? ( КонСтрока = 0 , КолвоСтрок, КонСтрока) ;
КонСтрока = Мин( КонСтрока, КолвоСтрок) ;
Для НомерСтроки = НачСтрока По КонСтрока Цикл
#Если Клиент Тогда
Состояние( "Чтение файла: " + Формат( НомерСтроки) + " из " + Формат( КонСтрока) ) ;
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
НоваяСтрока = Таблица. Добавить( ) ;
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
Поле = Лист. Cells( НомерСтроки, НомерКолонки) ;
НоваяСтрока["К" + Формат( НомерКолонки, "ЧГ=0" ) ] = Поле. Value;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Поле = Лист. Cells( НомерСтроки, КлючИЗначение. Значение) ;
НоваяСтрока[КлючИЗначение. Ключ] = Поле. Value;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
XLSОбъект. Application. Quit( ) ;
Возврат Таблица;
КонецФункции
Функция Excel_ПолучитьДанные_COMArray(пФайл, пЛист, СтруктураКолонок = Неопределено, Знач НачСтрока = 0, Знач КонСтрока = 0, XLSОбъект = Неопределено) Экспорт
#Если Клиент Тогда
Состояние( "Открытие Excel" ) ;
#КонецЕсли
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект( "Excel.Application" ) ;
XLSОбъект. Visible = Ложь ;
XLSОбъект. DisplayAlerts = Ложь ;
КонецЕсли ;
Попытка
Book = XLSОбъект. Workbooks. Open( пФайл, , Истина ) ;
Исключение
Сообщить ( "Проблемы с подключением к Excel" ) ;
Возврат Неопределено ;
КонецПопытки ;
Лист = Book. Sheets( 1 ) ;
КолвоКолонок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Column;
КолвоСтрок = Лист. Cells( 1 , 1 ) . SpecialCells( 11 ) . Row;
Таблица = Новый ТаблицаЗначений;
Если СтруктураКолонок = Неопределено Тогда
Для Счетчик = 1 По КолвоКолонок Цикл
Колонка = Таблица. Колонки. Добавить( "К" + Счетчик) ;
КонецЦикла ;
Иначе
МаксимальныйНомерКолонки = 0 ;
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
Колонка = Таблица. Колонки. Добавить( КлючИЗначение. Ключ) ;
МаксимальныйНомерКолонки = Макс( МаксимальныйНомерКолонки, КлючИЗначение. Значение) ;
КонецЦикла ;
КолвоКолонок = Мин( КолвоКолонок, МаксимальныйНомерКолонки) ;
КонецЕсли ;
НачСтрока = ? ( НачСтрока = 0 , 1 , НачСтрока) ;
КонСтрока = ? ( КонСтрока = 0 , КолвоСтрок, КонСтрока) ;
КонСтрока = Мин( КонСтрока, КолвоСтрок) ;
Массив = Лист. Range( Лист. Cells( НачСтрока, 1 ) , Лист. Cells( КонСтрока, КолвоКолонок) ) . Value;
КолвоСтрок = Массив. GetUpperBound( 1 ) ;
Для НомерСтроки = 1 По КолвоСтрок Цикл
#Если Клиент Тогда
Состояние( "Чтение файла: " + Формат( НомерСтроки) + " из " + Формат( КолвоСтрок) ) ;
ОбработкаПрерыванияПользователя( ) ;
#КонецЕсли
НоваяСтрока = Таблица. Добавить( ) ;
Если СтруктураКолонок = Неопределено Тогда
Для НомерКолонки = 1 По КолвоКолонок Цикл
НоваяСтрока["К" + Формат( НомерКолонки, "ЧГ=0" ) ] = Массив. GetValue( НомерКолонки, НомерСтроки) ;
КонецЦикла ;
Иначе
Для каждого КлючИЗначение Из СтруктураКолонок Цикл
НоваяСтрока[КлючИЗначение. Ключ] = Массив. GetValue( КлючИЗначение. Значение, НомерСтроки) ;
КонецЦикла ;
КонецЕсли ;
КонецЦикла ;
XLSОбъект. Application. Quit( ) ;
Возврат Таблица;
КонецФункции
Функция Excel_ПолучитьСписокЛистов(пФайл, XLSОбъект = Неопределено) Экспорт
Если XLSОбъект = Неопределено Тогда
XLSОбъект = Новый COMОбъект( "Excel.Application" ) ;
XLSОбъект. Visible = Ложь ;
XLSОбъект. DisplayAlerts = Ложь ;
КонецЕсли ;
Попытка
Book = XLSОбъект. Workbooks. Open( пФайл, , Истина ) ;
Исключение
Возврат Новый СписокЗначений;
КонецПопытки ;
СписокЛистов = Новый СписокЗначений;
Для каждого Лист Из XLSОбъект. Sheets Цикл
СписокЛистов. Добавить( Лист. Name) ;
КонецЦикла ;
XLSОбъект. Application. Quit( ) ;
Возврат СписокЛистов;
КонецФункции
Код 1C v 7.x Попытка
Excel = СоздатьОбъект( "Excel.Application" ) ;
Исключение
Сообщить( ОписаниеОшибки( ) + "; программа Excel не установлена на данном компьютере!" ) ;
Возврат ;
КонецПопытки ;
РабочиеКниги= Excel. WorkBooks;
Попытка
Отчет= РабочиеКниги. Open( Каталог+ ИмяФайла) ;
Исключение
Сообщить( ОписаниеОшибки( ) + "; фаил с макросом не найден!" ) ;
Возврат ;
КонецПопытки ;
Лист = Отчет. Worksheets( 1 ) ;
Для Ном= 1 По 20 Цикл
Ячейка = Лист . Cells( ном, 1 ) ; Ячейка. Value;
Сообщить( Ячейка ) ;
КонецЦикла ;
Excel. Visible= 1 ;
Попытка
Отчет. Save( ) ;
Исключение
Сообщить( ОписаниеОшибки( ) + "; не могу сохранить отчет!" ) ;
Возврат ;
КонецПопытки ;