1с сохранить структуру в файл

Обновлено: 08.07.2024

В 1С 8.3 (8.2) для работы с файлами существует два объекта: Файл и ДиалогВыбораФайла.

Рассмотрим каждый по отдельности.

Объект Файл служит для управления параметрами файлов.

Сразу стоит заметить, что данный объект не предназначен для чтения и записи из файлов.

Например, прочитаем параметры некоторого файла, находящегося на диске C:

В результате мы получим следующую информацию (если файл найден):

Параметры файла:
Полное имя файла: C:\Работа с файлами\статья.txt
Имя: статья.txt
Имя без расширения: статья
Расширение: .txt
Путь без имени: C:\Работа с файлами\
Размер: 899
Это файл: Да
Изменен: 18.05.2015 16:21:28
Только чтение: Нет
Невидимость: Нет

Запись в файл

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

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

Чтение файла в 1С

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

Запись текста из 1С в файл

Заметим, что при записи текстового файла можно установить кодировку.

Копирование файла

Здесь все очень просто

Перемещение

Удаление

Диалог выбора файла

В указанных выше примерах есть одно неудобство. Путь к файлу прописан жестко в коде. Чтобы выбрать файл интерактивно, существует объект ДиалогВыбораФайла, о котором речь пойдет ниже.

Объект ДиалогВыбораФайла служит для открытия файла (файлов), сохранения файла или выбора каталога в диалоге специального вида.

Например, выберем и откроем некоторый файл с расширением txt:
Задаем режим диалога выбора. Доступны три варианта: ВыборКаталога, Открытие, Сохранение

Итак, для создания правил обмена данными нам нужна информация о структуре информационных баз участвующих в обмене. Если мы будем знать структуру информационных баз, то сможем задать какие объекты информационной базы источника должны преобразовываться в объекты информационной базы приемника. То есть по сути, сможем настроить правила обмена данными между двумя информационными базами.

У нас имеется информационная база по которой нам нужно получить информацию о ее структуре. Выгрузим информацию о структуре информационной базы в файл. Для этого используется внешняя обработка MD81Exp.epf и MD80Exp.epf для конфигураций на платформе "1С:Предприятии 8.1" и "1С:Предприятии 8.0" а так же MD77Exp.ert для конфигураций на платформе "1С:Предприятии 7.7". Эти обработки входят в комплект дистрибутива конфигурации "Конвертация данных 2.0".

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

Если наша информационная база работает на базе платформы 1С:Предприятие 8.1, то процесс выгрузки информации о структуре информационной базы будет выглядеть следующим образом:

  1. Открытие информационной базы, информацию о структуре метаданных которой необходимо получить (одинаков для всех платформ)
  2. Открытие внешней обработки MD81Exp.epf. Для этого достаточно в главном меню открыть пункт "Файл\Открыть" и указать путь по которому располагается обработка MD81Exp.epf (для платформы 7.7 и 8.0 нужно открывать обработки MD77Exp.ert соответственно MD80Exp.epf).
  3. Указание имени файла, в который необходимо сохранить информацию о структуре информационной базы
  4. Нажатие на кнопку Выполнить

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

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

Загрузка информации о структуре информационной базы

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

Для этого достаточно открыть "Панель функций" и выбрать пункт "Загрузить структуру метаданных конфигурации".

Загрузить структура метаданных конфигурации

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

Загрузка структуры метаданных конфигурации

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

После нажатия на кнопку "Выполнить загрузку" программа загрузит информацию о структуре информационной базы (Процесс загрузки информации о структуре метаданных информационной базы может потребовать некоторого времени. О ходе загрузки данных программа будет Вас информировать сообщая количество загруженных объектов, их свойств и предопределенных значений).

После окончания загрузки программа откроет информацию о загруженных данных. При этом будет создан новый элемент справочника "Конфигурации". Этот элемент справочника в дальнейшем будет соответствовать информации о выгруженной конфигурации.

Конфигурация БухгалтерияПредприятия

В справочнике "Конфигурации" хранится информация о информационной базе из которой были выгружены данные. Имеется возможность посмотреть информацию о структуре информационной базы.

Описание конфигурации

В верхней части формы в виде дерева представлена структура метаданных. В табличной части на закладке "Свойства" показаны реквизиты, табличные части объектов метаданных. Для документов дополнительно показана структура записей регистров, движения по которым делает соответствующий документ.

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

С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).

Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.

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

Сохранение производится процедурой СохранитьРеквизитыИТабличныеЧасти . В качестве параметров она принимает сохраняемый объект и имя файла. Ссылочные реквизиты сохраняются в виде GUID.

Процедура СохранитьРеквизитыИТабличныеЧасти ( Объект , ИмяФайлаXML =Неопределено) Экспорт
ФайлXML = Новый ЗаписьXML ;
ФайлXML . ОткрытьФайл ( ИмяФайлаXML );
ФайлXML . ЗаписатьОбъявлениеXML ();
ФайлXML . ЗаписатьНачалоЭлемента ( "Root" );
ФайлXML . ЗаписатьАтрибут ( "Объект" , Объект . Метаданные (). Имя );
//Сохраняем реквизиты
Для Каждого Реквизит Из Объект . Метаданные (). Реквизиты Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "Реквизит" );
ФайлXML . ЗаписатьАтрибут ( "Имя" , Реквизит . Имя );
ТипЗначения = ТипЗнч ( Объект [ Реквизит . Имя ]);
Если Не ТипЗначения = Тип ( "Неопределено" ) Тогда
ФайлXML . ЗаписатьАтрибут ( "ИмяТипа" , XMLТип ( ТипЗначения ). ИмяТипа );
ФайлXML . ЗаписатьАтрибут ( "URI" , XMLТип ( ТипЗначения ). URIПространстваИмен );
КонецЕсли;
ФайлXML . ЗаписатьТекст ( XMLСтрока ( Объект [ Реквизит . Имя ]));
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
//Сохраняем табличные части
Для Каждого ТЧ из Объект . Метаданные (). ТабличныеЧасти Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "ТабличнаяЧасть" );
ФайлXML . ЗаписатьАтрибут ( "Имя" , ТЧ . Имя );
Для Каждого СтрокаТЧ из Объект [ ТЧ . Имя ] Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "ЭлементКоллекции" );
Для Каждого РеквизитТЧ Из ТЧ . Реквизиты Цикл
ФайлXML . ЗаписатьНачалоЭлемента ( "Реквизит" );
ФайлXML . ЗаписатьАтрибут ( "Имя" , РеквизитТЧ . Имя );
ТипЗначения = ТипЗнч ( СтрокаТЧ [ РеквизитТЧ . Имя ]);
Если Не ТипЗначения = Тип ( "Неопределено" ) Тогда
ФайлXML . ЗаписатьАтрибут ( "ИмяТипа" , XMLТип ( ТипЗначения ). ИмяТипа );
ФайлXML . ЗаписатьАтрибут ( "URI" , XMLТип ( ТипЗначения ). URIПространстваИмен );
КонецЕсли;
ФайлXML . ЗаписатьТекст ( XMLСтрока ( СтрокаТЧ [ РеквизитТЧ . Имя ]));
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
ФайлXML . ЗаписатьКонецЭлемента ();
КонецЦикла;
Если Не ФайлXML =Null Тогда
ФайлXML . ЗаписатьКонецЭлемента ();
ФайлXML . Закрыть ();
КонецЕсли;
КонецПроцедуры

За чтение объекта отвечают процедуры ЗагрузитьРеквизитыИТабличныеЧасти и ЗагрузитьОбъектРекурсивно . Чтобы прочитать объект вызывается первая, ей передаются объект, который необходимо заполнить, и имя файла. Вторая является вспомогательной.

Процедура ЗагрузитьРеквизитыИТабличныеЧасти ( Объект , ИмяФайлаXML =Неопределено) Экспорт
Если Не ИмяФайлаXML = Неопределено Тогда
ФайлXML = Новый ЧтениеXML ;
ФайлXML . ОткрытьФайл ( ИмяФайлаXML );
Пока ФайлXML . Прочитать () Цикл
Если ФайлXML . ТипУзла = ТипУзлаXML . НачалоЭлемента Тогда
ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект , ФайлXML . Имя );
КонецЕсли
КонецЦикла;
КонецЕсли;
КонецПроцедуры

Процедура ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект , знач ИмяУзла )
ИмяТипа = "" ;
ПространствоИмен = "" ;
Пока ФайлXML . ПрочитатьАтрибут () Цикл
Если ФайлXML . Имя = "ИмяТипа" Тогда
ИмяТипа = ФайлXML . Значение ;
ИначеЕсли ФайлXML . Имя = "URI" Тогда
ПространствоИмен = ФайлXML . Значение ;
КонецЕсли;
КонецЦикла;
Пока ФайлXML . Прочитать () Цикл
Если ФайлXML . ТипУзла = ТипУзлаXML . КонецЭлемента И ФайлXML . Имя = ИмяУзла Тогда
Возврат;
ИначеЕсли ФайлXML . ТипУзла = ТипУзлаXML . Текст Тогда
ТипОбъекта = ИзXMLТипа ( ИмяТипа , ПространствоИмен );
Если НЕ ТипОбъекта = Неопределено тогда
Объект = XMLЗначение ( ТипОбъекта , ФайлXML . Значение );
КонецЕсли;
ИначеЕсли ФайлXML . ТипУзла = ТипУзлаXML . НачалоЭлемента Тогда
ИмяТекУзла = ФайлXML . Имя ;
Если ФайлXML . Имя = "ЭлементКоллекции" Тогда
ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект . Добавить (), ИмяТекУзла );
Иначе
Если ФайлXML . ПрочитатьАтрибут () Тогда
ЗагрузитьОбъектРекурсивно ( ФайлXML , Объект [ ФайлXML . Значение ], ИмяТекУзла );
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры

В приложенном файле демонстрационная обработка, позволяющая сохранить ссылочный объект БД в файл и заполнить объект из файла. Заполняемый объект должен быть того же типа, что и сохраненный, а также он должен быть предварительно создан, сохранен в ИБ и выбран в поле "Ссылка".

Важное замечание в начале. Основной режим работы 1С в этой статье предполагается 1С 8.3.7 в режиме тонкого клиента без модальных вызовов — самый современный на настоящий момент, на который вскоре должны быть переведены все конфигурации. Также постараюсь описать особенности работы в Веб-Клиенте.

Что такое двоичные данные и как с ними можно работать в 1С 8

Двоичные данные (или бинарные) — это файл данных произвольного формата.

Платформа 1С (8.3 и 8.2) в общем случае понятия не имеет, что это. Предполагается, что программист или пользователь знает, какие именно это данные и как их применять. Тем не менее, если в двоичные данные загружен графический файл, формат которого понимает объект типа «Картинка», то при инициализации картинки такими двоичными данными картинка будет нормально показана, а её свойство «Формат» примет правильное значение.

Платформа 1С при работе с двоичными данными может:

Возможно, я еще что-то упустил, однако интуитивно ясно, что практически все, что надо для работы с двоичными данными в 1С, у нас есть. Рассмотрим теперь по порядку несколько конкретных примеров работы с двоичными данными на платформе 1С 8.3.

Чтение и запись двоичных данных в файл

Основной тип объектов двоичных данных платформы 1С так и называется: «ДвоичныеДанные». Вот что говорит о нем «Синтаксис-помощник»:

Значение содержит двоичные данные, которые считываются из файла. Значение может быть сохранено в ХранилищеЗначения. Хранимые данные могут быть записаны в файл.

Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение, мобильное приложение(клиент), мобильное приложение(сервер).

Сериализуется. Данный объект может быть сериализован в/из XML. Может использоваться в реквизитах управляемой формы.

Чтение двоичных данных из файла

Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>

Тип «Двоичные данные» имеет единственный конструктор:

имяФайла — обязательный аргумент.

В итоге получаем программный объект двоичных данных, прочитанный из файла.

Запись двоичных данных в файл

Определение размера двоичных данных в байтах

Сохранение двоичных данных в реквизит объекта

Рассмотрим сразу запись двоичных данных из файла на клиенте в реквизит объекта базы данных типа ХранилищеЗначения. Причем напишем такой код, который сработает и на веб-клиенте, а также будет лишен модальных вызовов, то есть таких вызовов, которые ожидают действия пользователя и останавливают при этом исполнение программы. Теперь платформа 1С 8.3 требует разрабатывать асинхронные программы.

Выглядит это примерно так: создается обработчик оповещения о выполнении некоторой длительной процедуры, затем запускается процедура «НачатьХХХ()», в которую, кроме понятных аргументов, передается еще и описание обработчика ее завершения. Наша программа спокойно работает далее, а по завершении запущенной процедуры вызывается наш обработчик завершения.

Предположим, у нас на форме есть реквизит типа «СправочникСсылка.Картинки». Справочник «Картинки» имеет реквизит «ДанныеКартинки» типа ХранилищеЗначения.

Создадим команду формы «ЗагрузитьКартинкуИзФайла».

Создадим обработчик команды, выделив команду в списке команд формы и нажав на кнопку с увеличительным стеклом в поле «Действие» панели свойств:

создание обработчика команды

Поскольку все необходимые параметры для записи картинки мы можем передать изнутри клиентской части обработчика, нам нет нужды создавать контекстную серверную процедуру на сервере. Выберем «Создать на клиенте и процедуру на сервере без контекста»:

на сервере без контекста

Вначале напишем наши обработчики команды в старом, «модальном» или «синхронном» стиле:

В моей небольшой тестовой конфигурации этот код отлично сработал в режиме тонкого клиента. Теперь преобразуем модальный вызов «ПоместитьФайл» в асинхронный, он же немодальный. В меню конфигуратора запустим команду меню «Текст >Рефакторинг >Нерекомендуемые синхронные вызовы >Преобразовать вызовы модуля». Нам в ответ сообщат, что «Не рекомендуемых синхронных вызовов преобразовано: 1».

Для компактности я удалил все пустые строки, и вот что получилось вместо клиентской части нашего обработчика:

Готово! Мы кошерно асинхронно записали картинку из файла на клиенте в реквизит объекта базы данных, в нашем случае — элемента справочника.

Чтение двоичных данных из объекта БД

Для чего нам надо читать двоичные данные из объекта БД? Наверное, три самых частых случая таковы:

  1. Внедрить картинку в табличный документ, например, отчет. Табличный документ (отчет) часто формируется на стороне сервера, поэтому нам нет нужды гонять картинки через временное хранилище. Мы просто получаем значение из реквизита типа «хранилище значения», инициализируем им объект типа «Картинка» и помещаем эту картинку в табличный документ. А клиентская сторона приложения отображает уже сформированный табличный документ.
  2. Отобразить на форме некоторую картинку. Нам надо передать двоичные данные на сторону клиента и загрузить их в реквизит формы при открытии формы. Ну и желательно обновлять картинку по некоторым событиям.
  3. Сохранить двоичный файл на стороне клиента. Здесь надо получить данные с сервера по некоторой команде и просто сохранить их в файл на клиенте.

Пример 1. Вставить картинки в макет (табличный документ).

Допустим, у нас есть база данных со справочником «Картинки», у элементов которых есть реквизит «Картинка» типа ХранилищеЗначения, содержащий данные картинки.

Создадим новую внешнюю обработку, ее основную форму.

На форме создадим 3 реквизита «СпрКартинка1», «СпрКартинка2», «СпрКартинка3» типа «СправочникСсылка.Картинки» и реквизит «ТабДок» типа «ТабличныйДокумент». Перетащим мышкой эти реквизиты в список элементов формы, чтобы на ней образовались соответствующие поля.

Добавим команду формы «НапихатьКартинок» и создадим ее обработчик. На сей раз выберем «Создать на Клиенте и процедуру на сервере», чтобы не передавать много параметров в процедуру без контекста. Напишем такие обработчики:

И получим примерно такой результат:

пример результата

Пример 2. Показать картинку из базы данных на форме.

Для демонстрации воспользуемся первой обработкой, где мы записывали файл в БД. Теперь покажем на форме картинку, которая записана в реквизите «Картинка» выбранного на форме элемента справочника «Картинки».

Во-первых, добавим на форму поле, связанное с реквизитом «АдресДанныхКартинки». Например, перетащим мышкой этот реквизит в список элементов формы. Выберем и установим значение свойства «Вид» этого поля в «Поле картинки».

Во-вторых, напишем такую серверную процедуру:

И станем вызывать эту процедуру, например, из обработчика события «При изменении» поля «Картинка»:

показать картинку

Сохранение двоичных данных в файл на клиенте

Думаю, с сохранением двоичных данных из базы данных в файл у Вас проблем не возникнет. По крайней мере, если Вы работаете не в веб-клиенте. Читаем, помещаем во временное хранилище на сервере, затем записываем в файл на клиенте.

Кодирование двоичных данных в формат Base64 и обратно

Тут все очень просто. Платформа имеет две глобальные функции, доступные везде:

  • Base64Строка(<Значение>)
  • Base64Значение(<Строка>)

Первая получает в качестве аргумента объект типа «ДвоичныеДанные», а возвращает его текстовое представление в кодировке base64, а вторая, наоборот, из текста в формате base64 возвращает объект типа «ДвоичныеДанные».

Итого

На самых простых примерах мы увидели все основные принципы и методы работы с двоичными данными в 1С 8.3. Также коснулись актуальной сейчас темы устранения синхронных вызовов. Остальные возможности работы с двоичными данными Вы без труда реализуете по аналогии с рассмотренными здесь.

title

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

Это может быть удобным для следующих случаев:

  • Для хранения каких-либо настроек у отчётов или обработок;
  • Для тестирования или ведения логов (для временного хранения результата) при выполнении кода или запроса в 1С;
  • Для загрузки/выгрузки данных между информационными базами 1С.

Во многих случаях очень удобно всегда иметь под рукой кнопки «Выгрузить таблицу» и «Загрузить таблицу», чтобы, к примеру, не заполнять вручную табличную часть документов или обработок.

Алгоритм

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

  1. Подготавливаем таблицу значений (выгружаем из табличной части, выбираем колонки);
  2. Конвертируем таблицу значений в табличный документ;
  3. Сохраняем табличный документ в MXL.

При загрузке таблицы порядок действий такой:

  1. Читаем из файла табличный документ;
  2. Конвертируем табличный документ в таблицу значений;
  3. Используем эту таблицу значений в своих целях (загружаем в табличную часть).

Соответственно файл для хранения данных таблицы имеет расширение *.mxl.

Табличный документ MXL

Функции и процедуры

Основные функции для реализации поставленной задачи следующие:

  • ПреобразоватьТДвТЗ – Функция преобразования табличного документа в таблицу значений.
  • ПреобразоватьТЗвТД – Функция обратного преобразования таблицы значений в табличный документ.
  • ПрочитатьТЗИзMXL – Читает из файла данные, определяет колонки таблицы и преобразует эти данные в таблицу значений.
  • ЗаписатьТЗВMXL – Преобразует таблицу значений в табличный документ и записывает его в файл.

Пример реализации

Ниже можно скачать обработку с примером реализации данного алгоритма.

Обработка имеет 3 функциональных кнопки:

  • Выгрузить
  • Загрузить
  • Очистить.

Кнопки обработки

Приведём здесь код 1С для всех вышеописанных функций:

// Преобразовать табличный документ в таблицу значений. // // Параметры: // ТабДок - <ТабличныйДокумент> - Исходный табличный документ; // СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок; // НачалоСтрока - <Число> - Строка начала области; // НачалоСтолбец - <Число> - Столбец начала области; // КонецСтрока - <Число> - Строка конца области; // КонецСтолбец - <Число> - Столбец конца области. // // Возвращаемое значение: // <ТаблицаЗначений> - Полученная таблица значений. // Функция ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, Знач КонецСтрока = Неопределено, Знач КонецСтолбец = Неопределено) Экспорт // Определение габаритов таблицы Если НачалоСтрока = Неопределено И НачалоСтолбец = Неопределено Тогда НачалоСтрока = 1; НачалоСтолбец = 1; КонецЕсли; Если НачалоСтрока = Неопределено Тогда НачалоСтрока = 1; Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение И НачалоСтрока < ТабДок.ВысотаТаблицы Цикл НачалоСтрока = НачалоСтрока + 1; КонецЦикла; ИначеЕсли НачалоСтолбец = Неопределено Тогда НачалоСтолбец = 1; Пока НЕ ТабДок.Область(НачалоСтрока, НачалоСтолбец).СодержитЗначение И НачалоСтолбец < ТабДок.ШиринаТаблицы Цикл НачалоСтолбец = НачалоСтолбец + 1; КонецЦикла; КонецЕсли; КонецСтрока = ?(КонецСтрока = Неопределено, ТабДок.ВысотаТаблицы, КонецСтрока); КонецСтолбец = ?(КонецСтолбец = Неопределено, ТабДок.ШиринаТаблицы, КонецСтолбец); // Преобразование ЭтоТаблица = (ТипЗнч(СтруктураКолонок) = Тип("ТаблицаЗначений")); ТабЗначений = ПолучитьТаблицуВывода(СтруктураКолонок); Для ИндексСтроки = НачалоСтрока По КонецСтрока Цикл СтрокаТЗ = ТабЗначений.Добавить(); ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из СтруктураКолонок Цикл НаименованиеКолонки = ?(ЭтоТаблица, Колонка.Наименование, Колонка.Ключ); пИндексКолонки = ?(ЭтоТаблица, Колонка.СтолбецОтчёт, ИндексКолонки); Если ТабДок.Область(ИндексСтроки, пИндексКолонки).СодержитЗначение Тогда СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Значение; Иначе СтрокаТЗ[НаименованиеКолонки] = ТабДок.Область(ИндексСтроки, пИндексКолонки).Текст; КонецЕсли; ИндексКолонки = ИндексКолонки + 1; КонецЦикла; КонецЦикла; Возврат ТабЗначений; КонецФункции;

// Преобразовать таблицу значений в табличный документ. // // Параметры: // ТабЗначений - <ТаблицаЗначений> - Исходная таблица значений; // ТабДок - <ТабличныйДокумент> - Полученный табличный документ. Если параметр не задан, // то документ создаётся заново и возвращается функцией; // НачалоСтрока - <Число> - Строка начала области; // НачалоСтолбец - <Число> - Столбец начала области; // ВыводитьЗаголовки - <Булево> - Определяет выводить ли имена колонок или нет. // // Возвращаемое значение: // <ТабличныйДокумент> - Полученный табличный документ (возвращает параметр "ТабДок"). // Функция ПреобразоватьТЗвТД(ТабЗначений, ТабДок = Неопределено, Знач НачалоСтрока = Неопределено, Знач НачалоСтолбец = Неопределено, ВыводитьЗаголовки = Ложь) Экспорт Если ТабДок = Неопределено Тогда ТабДок = Новый ТабличныйДокумент; КонецЕсли; // Определение габаритов таблицы НачалоСтрока = ?(НачалоСтрока = Неопределено, 1, НачалоСтрока); НачалоСтолбец = ?(НачалоСтолбец = Неопределено, 1, НачалоСтолбец); // Преобразование ИндексСтроки = НачалоСтрока; Если ВыводитьЗаголовки Тогда ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из ТабЗначений.Колонки Цикл ТабДок.Область(ИндексСтроки, ИндексКолонки).Текст = ?(ПустаяСтрока(Колонка.Заголовок), Колонка.Имя, Колонка.Заголовок); ИндексКолонки = ИндексКолонки + 1; КонецЦикла; ИндексСтроки = ИндексСтроки + 1; КонецЕсли; Для Каждого Элемент Из ТабЗначений Цикл ИндексКолонки = НачалоСтолбец; Для Каждого Колонка Из ТабЗначений.Колонки Цикл ТабДок.Область(ИндексСтроки, ИндексКолонки).СодержитЗначение = Истина; ТабДок.Область(ИндексСтроки, ИндексКолонки).ТипЗначения = Новый ОписаниеТипов(Колонка.ТипЗначения); ТабДок.Область(ИндексСтроки, ИндексКолонки).Значение = Элемент[Колонка.Имя]; ИндексКолонки = ИндексКолонки + 1; КонецЦикла; ИндексСтроки = ИндексСтроки + 1; КонецЦикла; Возврат ТабДок; КонецФункции;

// Читает табличный документ из файла MXL и преобразует его в таблицу значений. // // Параметры: // ИмяФайла - <Строка> - Путь к файлу MXL; // СтруктураКолонок - <Структура>, <ТаблицаЗначений> - Структура колонок. Если этот параметр // не задан, то структура колонок формируется из самого табличного документа; // ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет. // // Возвращаемое значение: // <ТаблицаЗначений> - Полученная таблица значений. // Функция ПрочитатьТЗИзMXL(ИмяФайла, СтруктураКолонок = Неопределено, ЕстьЗаголовок = Истина) Экспорт ТабДок = Новый ТабличныйДокумент; ТабДок.Прочитать(ИмяФайла); Если СтруктураКолонок = Неопределено И ЕстьЗаголовок Тогда СтруктураКолонок = Новый Структура; Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл Обл1 = ТабДок.Область(1, ИндексКолонки); Обл2 = ТабДок.Область(2, ИндексКолонки); ИмяКолонки = СокрЛП(Обл1.Текст); ИмяКолонки = ?(Найти(ИмяКолонки, " ") > 0, СтрЗаменить(ТРег(ИмяКолонки), " ", ""), ИмяКолонки); СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов)); КонецЦикла; ИначеЕсли СтруктураКолонок = Неопределено И НЕ ЕстьЗаголовок Тогда СтруктураКолонок = Новый Структура; Для ИндексКолонки = 1 По ТабДок.ШиринаТаблицы Цикл Обл2 = ТабДок.Область(1, ИндексКолонки); ИмяКолонки = "К" + Формат(ИндексКолонки, "ЧДЦ=0; ЧН=0; ЧГ=0"); СтруктураКолонок.Вставить(ИмяКолонки, ?(Обл2.СодержитЗначение, Обл2.ТипЗначения, Новый ОписаниеТипов)); КонецЦикла; КонецЕсли; Таблица = ПреобразоватьТДвТЗ(ТабДок, СтруктураКолонок, ?(ЕстьЗаголовок, 2, 1), 1); Возврат Таблица; КонецФункции;

// Сохраняет таблицу значений в файле в виде табличного документа. // // Параметры: // ИмяФайла - <Строка> - Путь к файлу MXL; // ТабЗначений - <ТаблицаЗначений> - Сохраняемая таблица значений; // ЕстьЗаголовок - <Булево> - Есть ли первая строка с заголовками или нет. // Процедура ЗаписатьТЗВMXL(ИмяФайла, ТабЗначений, ЕстьЗаголовок = Истина) Экспорт ТабДок = ПреобразоватьТЗвТД(ТабЗначений, Неопределено, 1, 1, ЕстьЗаголовок); ТабДок.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.MXL); КонецПроцедуры;

Целиком скачайте обработку по ссылке ниже.

Смело используйте этот код 1С для реализации своих проектов! Если в коде имеются баги (ошибки), просьба сообщить об этом, написав в комментариях ниже.

Читайте также: