1с получить структуру каталогов
В этой статье будет накапливаться экспертиза по работе с файловой базой данных системы 1С Предприятие 8.
Первое на что я наткнулся – это утилита “Tool 1CD.exe”. Ниже будет приведена ссылка на скачивание.
Команда для массового экспорта таблиц из файла 1Cv8.1CD в XML:
Tool_1CD . exe C : \ Users \ Иван \ Documents \ 1c \ DemoSmallBusinessEduc \ 1Cv8.1CD - ExportAllToXML F : \ 1 С _ Аналитика \ db_xml \
Программа “Tool_1CD” для распаковки базы данных 1С Предприятие 8 из 1Cv8.1CD в XML (Заархивировано сначала в RAR, потом в zip): Tool_1CD.zip.
Проверял на вирусы на касперском, вроде не было. Но в любом случае Вы используете этот файл на свой страх и риск. Всегда лучше работайте в “песочнице” или на скопированном файле, который не жалко потерять. Скачивая этот файл Вы соглашаетесь с тем, что Вы снимаете ответственность с владельца этого сайта. Вся ответственность за использование этого файла лежит на Вас.
НА БОЕВОЙ СРЕДЕ НИКОГДА НЕ ТЕСТИРУЙТЕ РАБОТУ ПОСТОРОННИХ УТИЛИТ.
Интерфейс программы “Tool 1CD”
Техническое описание внутреннего устройства опубликовано мной в статье Краткое описание формата файлов *.1CD (файловых баз 1Сv8). Однако она достаточно сумбурна, плоха для восприятия, поэтому здесь я попытаюсь описать формат немного более популярно. Чтобы не было путаницы с термином «файл», сразу замечу, что когда я буду иметь в виду файл базы *.1CD, я буду говорить «файл базы», когда же я буду говорить про внутренние файлы, содержащиеся внутри базы, я буду употреблять просто термин «файл».
На самом нижнем уровне файл базы данных 1CD состоит из страниц размером 4 килобайт (0x1000).
По сути, весь файл базы состоит из массива четырехкилобайтных страниц. Каждая страница имеет свой номер (индекс). Здесь и далее каждый прямоугольник с красной рамкой обозначает одну страницу.
Файлы
На более высоком уровне находятся файлы. Файл состоит из одной или более страниц. У каждого файла есть ровно одна заголовочная страница, в которой размещается массив номеров страниц размещения. В каждой странице размещения, в свою очередь, находится массив номеров страниц данных. Заголовочная страница и страницы размещения – это служебные страницы, которые нужны только для хранения служебных данных (сигнатура, длина файла, версия) и для нахождения страниц данных. Собственно содержимое файла хранится в страницах данных.
Структура таблиц
Каждая таблица состоит из нескольких файлов:
- файла описания таблицы DESCR;
- файла записей DATA;
- файла индексов INDEX;
- файла данных неограниченной длины BLOB.
Файл описания таблицы DESCR содержит текстовое описание таблицы – имя таблицы, состав полей и индексов. А также файл DESCR содержит номера файлов DATA, INDEX и BLOB. Таблица адресуется с помощью файла описания таблицы. Структуру файлов таблиц мы в данной статье рассматривать не будем, подробности можно узнать из моей статьи, ссылку на которую я приводил выше. Файл индексов может отсутствовать, если в таблице нет ни одного индекса. Файл данных неограниченной длины тоже может отсутствовать, если в таблице нет ни одного поля с данными неограниченной длины.
Адресация
База состоит из таблиц. Таблицы, в свою очередь, состоят из файлов. И наконец, файлы состоят из страниц. Адресом страницы является ее порядковый номер (индекс) в файле базы. Адресом файла является номер его заголовочной страницы. Адресом таблицы является адрес ее файла описания, а значит, номер заголовочной страницы файла описания. Т.е. о каком бы объекте мы бы не говорили – странице, файле или таблице, адресом объекта всегда является просто номер страницы.
Одним из способов получения подробного описания таблиц, полей (соответствие нормального наименования таблиц и технического) – использование “Внешней обработки .EPF”.
Файл .epf программируется через конфигуратор 1С Предприятия. В интернете много статей, я покажу лишь как его использовать.
Я нашел несколько файлов EPF (в архиве их три штуки):
epf файлы для получения метаданных из 1С Предприятия 8.3.zip
Как запустить epf файл для выгрузки из 1С метаданных
Приведу 2 примера подключения epf файла. Заходим в 1С Предприятие 8.3. Выбираем Файл – Открыть:
Далее выбираем файл внешней обработки 1С Предприятие для версии 8.3 СтруктураИБ_УФ.epf:
Нажимаем “Вывести список”:
Формат:
Расскрываем список
Получаем описание таблиц с полями:
И еще один пример:
Выводим структуру таблиц 1С Предприятие в текстовом формате
Таблица и “человеческие” названия:
После небольшой корректировки получаем отчет, можете скачать (но там ничего не понятно, нужна расшифровка метаданных): Таблицы и поля из 1С Предприятия 8.3 после обработки Tool 1CD.exe и выгрузкой в XML.xlsx
1С Script Builder реализован в виде внешней 1С-обработки и предназначен для автоматизированного проектирования скрипта загрузки данных из БД 1С версии 8.x в аналитическое приложение QlikView. Использование 1С Script Builder позволяет получить максимальную скорость загрузки данных и максимальную гибкость при формировании самых сложных запросов.
Генерация Загрузочного скрипта для QlikView из метаданных конфигураций 8.3 (управляемые формы), тестировалась на конфигурации “Управление небольшой фирмой, ред. 1.6”.
Обработка получает таблицу метаданных конфигурации с помощью функции ПолучитьСтруктуруХраненияБазыДанных() и генерирует код QlikView SCRIPT с запросом SQL для объекта метаданных текущей строки. Работает в тонком и толстом клиентах управляемого приложения. Поля, индексы и состав индексов элемента метаданных отображается в отдельных таблицах.
Ниже скриншоты как зайти в управляемое приложение через конфигуратор.
ВНИМАНИЕ! В коде последнюю запятую перед SQL надо удалить. Не знаю, как программными средствами убрать.
На вкладке LOAD Script For QlikView приведен загрузочный скрипт. Не забывайте про запятую, которую нужно убрать.
Размещаю этот пример в качестве отправной точки пример. Взят из файла: TableStruct.epf.7z
Данный запрос выбирает все записи из справочника и производит упорядочивание по иерархии. Результат будет упорядочен по наименованию, с учетом иерархии.
Для того чтобы группы справочника размещались выше элементов необходимо в данном запросе заменить предложение УПОРЯДОЧИТЬ ПО на следующее:
Код 1C v 8.х
Результат по-прежнему будет упорядочен по иерархии, однако группы будут располагаться выше элементов.
Возможна также замена предложения УПОРЯДОЧИТЬ ПО на предложение АВТОУПОРЯДОЧИВАНИЕ. В этом случае результат будет упорядочен в соответствии с настройками справочника, т.е. если в справочнике указано, что группы должны располагаться выше элементов, то они будут расположены выше.
Получить иерархическую структуру справочника также возможно и при помощи итогов.
Код 1C v 8.х
Похожие FAQ
Еще в этой же категории
Создание и запись нового элемента справочника 14
НаКлиенте Процедура ПоКнопкеНовыйКонтрагент(Команда) // Вставить содержимое обработчика. Перем НовыйКонтрагент; НовыйКонтрагент = Новый Структура(" Наименование, ПолноеНаименование, ИНН" ); НовыйКонтрагент.Наименование = " РиК ООО" ; НовыйКон Как для Выбора Элемента Справочника Открыть Форму Выбора с нужной Открытой Группой? 8
Порядок действий такой: 1. В поле ввода " Номенклатура" добавь событие ПриНачалеВыбора. 2. Установи в них СтандартнаяОбработка = Ложь; 3. Получи форму выбора нужного справочника 4. Установи отбор по родителю 5. Открой форму для выбора Теп Перебрать, выбрать элементы справочника 7
Выборка = Справочники.Сотрудники.Выбрать(); //или Выборка = Справочники.Сотрудники.ВыбратьИерархически(); Пока выборка.Следующий() = 1 Цикл . //действия с очередным элементом . Сообщить(" Сотрудник " + выборка.Наименование); КонецЦикла; / Перебрать, выбрать элементы подчиненного справочника 7
Перебор элементов справочника принадлежащих элементу другого справочника, т.е когда один справочник подчинен другому справочнику. // Получить выборку по указанному контрагенту. Выборка = Справочники.КонтактныеЛица.Выбрать( , Контрагент); Пока Вы Как программно открыть и выбрать элемент справочника, выбор элемента справочника? 7
Просто открыть: // Получить форму выбора справочника как подчиненную форме документа ФормаСписка = Справочники.Номенклатура.ПолучитьФормуСписка( , ЭтаФорма); // Открыть полученную форму ФормаСписка.Открыть(); Открыть для выбора элемента: Ф Посмотреть все в категории Справочники
Если запустить эту обработку в первой и второй базе ( обе одной конфигурации УПП 1.3 (1.3.38.4)), то имеем для первой базы имя таблицы SQL = Reference131, для второй имя таблицы SQL = Reference162. Если смотреть структуру полей таблиц, то видим, что имена полей различны.
Вопрос: подтвердите или опровергните вывод: таблицы SQL создаются динамически и могут иметь различные имена (имена полей в том числе). При создании новой базы загрузкой конфигурации из *.cf –файла, получим таблицы новой базы с именами, отличными от имен таблиц базы, из которой был выгружен файл конфигурации *.cf .
cf это метаданные 1С к sql отношения не имеют. из того же cf можно вообще сделать файловую базу.
а вообще - проводлжайте наблюдать, вас столько открытий ждет
В базе1 добавили новый справочник, появилась таблица _Reference131.
В базе1 удалил справочник, таблица _Reference131 удалилась.
В базе1 добавили новый справочник, появилась таблица _Reference132
На базу2 накатили обновление из базы1. в базе2 появился справочник с таблицей _Reference131
но если загрузить в 2 разных базы чистых одинаковый Цф - то и структура с большой долей вероятности будет одинакова
>но если загрузить в 2 разных базы чистых одинаковый Цф - то и структура с большой долей вероятности будет одинакова
одинаковы будут id по которым происходит "быстрая" сверка. также это будет гарантировать что данные не отвалятся при нахлабучивании изменений одной конфы на другую через "загрузить"
(6) Ага. Следует заметить, что отсортированный по имени объектов cf-ник и такой же без сортировки скорее всего даст разные имена таблиц и полей, если, конечно, количество объектов метаданных в каждом типе больше 1 :)
Ребята. Всем СПАСИБО!!
НЕОБХОДИМО из SQL-таблиц получать информацию для другого программного продукта (НЕ 1С). получается, что надо создавать таблицу соответствий что ли, чтооб не изменять код при чтении данных 1С из таблиц в другом программном продукте(базу 1С планируем обновлять. ведь можно разными способами получить базу данных обновленную чистую для учета с нового года, например).
Кто-нибудь решал такую проблему? Может кто подскажет оптимальное решение.
(15) снабди своё 1С вебсервисом, который будет отдавать то , что надо, и ни чего лишнего. Иначе однажды утром 1С не заведется потому. что какой-то осел нечаянно сказал DROP DATABASE не в то окно
(15) Образение через com в 1с и получение структуры оттуда.
Но обычно более эффективным считается работа от обратного, когда 1с отдает в нужном виде.
(15) Другой продукт каждый раз при коннекте каким то образом инициирует ПолучитьСтруктуруХраненияБазыДанных(МассивИменМетаданных)
в конфиге и дальше работает через этот мапинг до конца коннекта.
Как реализовать вызов этой процедуры - уже технические формальности
Я создавал базу данных соответствий НазвваниеОбъекта- таблица SQL.так же с реквизитами. дальше запросом получал соответствие и формировал динамически запрос к базе данных. если менялось название какой либо таблицы или реквизита то я просто в базе соответствий менял значение. и запрос опять давал корректный результат. Это все делалось для сверки с 1С другой учетной системы
(21) это легко оспорить в суде и вертеть потом на вертеле. Другое дело, что это не разумно и не безопасно. Вот это уже вертеть чревато
(24) если данные только получать для отчетов и сверок- то это ничем не чревато. а вот если писать в базу то тут существует опасность.
(25) ему придется отдать насторону огин и пароль к кишкам, из которых получить можно что угодно и ни кто не знает, что потом будет по факту получаться и куда передаваться. Это все равно, что голую задницу в интернет выставить
Создай базу данных в которой будут вьюхи и процедуры(которые будут читать данный из рабочий базы)-как уже сказали зверя создать только на чтение.
я не рискнул вьюхи и процедуры создавать в рабочей базе. данные получал в другую базу во вьюхи.
(33) есть штатный безопасный механизм, дающий любой необходимый программный интерфейс к чему угодно. Вебсервисы. Надо научиться ими пользоваться, а не городить велосипеды с квадратными колесами.
все-таки, еще раз вопрос - что в 1С не хватает ? (38) + - изобретать велосипид, БД зависимый. Типа, круто, на asm ваять, а vb - отстой
(38) прямые (Ровные запросы, а не оптимизированные кривым оптимизатором 1С) запросы гораздо быстрее выполняются напрямую-если важна скорость
(34) Значит все средства интеграции, которые предлагает 1С штатно, мы вертели на вертеле? Или просто лень почитать?
(43) прямыми (Ровные запросы, а не оптимизированные кривым оптимизатором 1С) сделаешь базу кривой. В резюме, потом напиши, что сделал суперские оптимизированные запросы
(47) абсолютно не при чем. "За державу обидно".
Меня устраивает "оптимизатор запросов 1С", хоть и не фан. Как, говорилось на этом форуме не раз, готовить запросы надо уметь.
данные из 1С попадают в систему весовых терминалов. обрабатываются там. затем обратно в 1С. кто работает с весовым оборудованием. средства 1С дают хорошие возможности.
(51) Часть блокировок живет в памяти сервера. Сторонне приложение о них не в курсе.
(56) Например у тебя больше чем 1 кластер ( рабочих процессов) как ты их блокировать то будешь?
v8: Разделяемый или Исключительный режим блокировки
(55) в продолжение темы для "адептов":
Для чего надо делать так (0):
ускорить шибко тугой запрос на уровне СУБД, или, запудрить тех, кто будет это хозяйство разбирать
Для чего не надо делать так:
3. даются средства высокого уровня, зачем лезть в кору
4. потом, после реализатора "нетленки" долго нужно разбираться - из прямых запросов к БД, т.к. это уровень не бизнес-логики
(60)
запудрить тупых рисовальщиков формочек и отчётов
0 что значит бд зависимо? 1с примерно одинаково гененрирут названия полей для разных субд (всего 3 варианта)
2 с учетом оговорок смысла не имеет. тк практически любой объект бд- метаданных можно привести к состоянию требующему разрешённому и рекомендованному фирмой 1с вмешательству.
3. вот тут верно. тк 1с8 на риалтайм систему не тянет.
лучше через коннектор.
мне через саповский коннектор в 10 раз удобней было работать с САП
чем на прямую в скл сервер писать.
4. если делать через view с именами метаданных - то все равно.
(64) Рабочие процессы это реально разные процессы со всоей виртуальной памятью.
Другой кластер это другой компьютер а база у всех одна.
Так как ты будешь хранить эти блокировки? Неужто это будет эффективнее чем хранить блокировки в самой БД?
Меня интересует технический процесс.
(65) (66) Народ, желтые книжки почитайте, я с них цитирую. Конечно я в исходниках платформы не копался, но оснований не верить нет.
Блокировок БД бывает недостаточно, поэтому вводятся блокировки прикладного уровня. Сам не раз реализовывал, в других системах. Некоторые СУБД предоставляют механизмы для того, чтобы и прикладные блокировки жили в БД. Грубо говоря API к своему менеджеру блокировок. Но в случае 1С кроссплатформенность и кросс-СУБД диктует свои правила. Поэтому прикладные блокировки живут в памяти сервера 1С. Очевидно они не могут быть свои у каждого рабочего процесса, поэтому в памяти менеджера кластера.
И не путайте "рабочий процесс" и "кластер".
(69)
"желтые книжки почитайте" -
- какую главу. если Вы сами не использовали что-то
то к ЖК лучше не аппилировать, тк это 1с.
В ней заявленое может не работать, рабочее может быть не декларированным.
поэтому и интересно, можете ли Вы точнее чем общий отсыл к
ЖК или интернет подтвердить работу кластера с разными бд.
(70 >подтвердить работу кластера с разными бд.
Не понял
Главу постараюсь найти.
(38) Ты опоздал, вроде как веб сервисами пользоваться умеют уже все, а поднимать веб сервер дорогого стоит
(71) Нашел.
Клиент-серверный вариант. Руководство администратора. 2.1.3. Сервисы кластера
На ИТС тоже есть.
Мало того в 8 ке применяется оптимистическая блокировка. Управляемые блокировки используют хинты SERIALIZABLE,REPEATABLEREAD
Оптимистическая блокировка осуществляется на уровне поля ._Version v8: Кэши разные нужны, кэши нужные важны.
Пессимистическая на уровне блокировок в транзакции. Нет смысла городить огород там, где он не нужен. Но вот если будут реальные примеры объектных блокировок осообенно в контексте нескольких серверов приложений.
Правда, перечитал еще раз про упр. блокировки, и появилось сомнение в (50). Если они действительно держатся ТОЛЬКО до конца транзакции, то ЧИТАТЬ извне вроде можно. Но не уверен до конца.
(76) Так и объектные блокировки имеют смысл без транзакции.
Управляемые блокировки только на уровне транзакции и на уровне БД. Не управляемы это уже уровень изоляции REPEATABLE READ. Но тогда и на уровне блокировок запросов нет смысла в объектных блокировках для клиент сервера. Для Локальных баз на уровне LockFile
(78) Давай прежде всего не путать объектные блокировки и управляемые. Первые с танзакциями не связаны, они чисто прикладные.
Вот про это я и говорю зачем мешать объектные блокировки и транзакционными блокировками бд. Объектные блокировки так или иначе не взаимодействуют с блокировками БД. Тогда какой в них смысл? Управляемые блокировки это блокировки БД в режиме изоляции Read Commited с помощью хинтов SERIALIZABLE,REPEATABLEREAD. Автоматические это уже на уровне Изоляции REPEATABLE READ.
(81) Давай ты прочитаешь (82), с терминологией и общей концепцией все устаканится, потом продолжим.
Правда, там в тексте упоминается 8.1, кое-что могло и устареть.
(81) > Управляемые блокировки это блокировки БД в режиме изоляции Read Commited с помощью хинтов SERIALIZABLE,REPEATABLEREAD.
Это неправда, при наложении управляемой блокировки никакие блокировки в БД не накладываются.
(84)
раньше
(до 14 релиза)
накладывались блокировки субд.
сейчас может исправили.
ух разошлись про блокировки. Ну и что, выяснили что нибудь? Если, выяснили, то через несколько релизов платформы 1С забудьте. Вам же ясно говорят, нечё лезть куда ни надо
(88) Внутри одного из менеджеров кластера (процесс) запускается служба (в терминах 1С) транзакционных блокировок, конечно, это маршалинг, но если рабочих процессов больше одного, то без этого управляемые блокировки не организовать. Если рабочий процесс один то в предыдущих версиях этот механизм блокировок размещался в рабочем процессе, с тех пор рекомендация, на х64 запускать один рабочий процесс, если нет веских причин поступить по-другому.
(88) Так и сказано управляемые блокировки используют Read Commited (или Snapshot Isolation в 8.3), а блокировки в разрезе объектов 1С держит менеджер блокировок.
(89) Так это и есть официально объяснение лицензионного запрета, вы там наулучшаете, а мы в свою очередь всё переделаем внутри в новой версии и в неё уже автоматом ничего не сконвертируется при обновлении, и могут обвинить в этом не улучшателя, а производителя.
(90) Объясни зачем городить огород если все это можно решить на уровне БД, для рабочих процессов больше 1?
Могут быть кластеры на нескольких серверах. Где выигрыш если рабочих процессов больше чем 1?
(91) Зачем в запрсах применять хинты
FROM _AccRg5523 T3 WITH(SERIALIZABLE)
LEFT OUTER JOIN _Acc6_ExtDim5518 T4 WITH(REPEATABLEREAD)
(91) Глупо изобретать велосипед, там где он уже эффективно работает. Snapshot Isolation хорорша при чтении данных снимка данных до начала транзакции. Если же ты хочешь, что бы данные не изменялись до конца транзакции нужно накладывать блокировки явно.
(92) Например, надо заблокировать одно значение субконто в регистре бухгалтерии по всем счетам, предложи как это сделать блокировками на уровне СУБД.
Менеджер блокировок просто запишет в своих структурах: Пространство блокировок (РБ.Хозрасчетный), Субконто, Его значение. И будет держать его до конца транзакции.
Всё дело в том, что, именно, сервер 1С хранит в себе бизнес модель на предметном уровне. Например, меня огорчает, что журнал регистрации не хранится в БД, но у производителя свои взгляды на продукт.
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
go
SELECT spid, blocked FROM master..sysprocesses WHERE blocked > 0 AND lastwaittype LIKE 'LCK_%'
go
BEGIN TRANSACTION
go
(93) .1 это точно управляемый режим новых версий 8.2?
.2 так это ради Оракла, который версионник, а не блокировочник как MS SQL, поэтому все блокировки они решили делать сами с учётом внутренней природы бизнес объектов (справочники, документы и тд.) и не объектов (регистры). А работать должно везде одинаково!
(96) Для автоматического режима хинт REPEATABLEREAD не имеет смысла.
(97) Для Оракла есть FOR UPDATE и DBMS_LOCK. Но не являюсь хоть каким то знатоком Оракула.
Блокировки могут быть еще в режиме 4 (разделяемая блокировка таблицы share mode, генерируется, например, оператором lock table in share mode) и 5 (разделяемая блокировка таблицы и монопольная блокировка строк share row exclusive; генерируется, например, оператором lock table in share row exclusive mode). Но эти режимы встречаются крайне редко.
Файлы и каталоги в 1С 8.3 используются для различных операций с данными: сохранение и восстановление, экспорт и импорт, архивация, обмен и др. Для реализации работы с файлами и каталогами, их параметрами и атрибутами, на встроенном языке программирования 1С 8.3 существуют различные предопределенные функции и модели.
✔ Чтение и запись файлов
&НаСервере
Процедура ЧтениеИЗаписьФайлов ()
// Любое сериализуемое значение (массив, структура, таблица значений, строки. ) можно сохранить в файл
НаборСимволов = Новый Массив ;
НаборСимволов . Добавить ( 125 );
НаборСимволов . Добавить ( "А" );
НаборСимволов . Добавить ( "99" );
НаборСимволов . Добавить ( "%" );
ЗначениеВФайл ( "D:\Symbol.txt" , НаборСимволов ); // работает только на &НаСервере
// Восстановление произвольных значений из файла
НаборСимволовИзФайла = ЗначениеИзФайла ( "D:\Symbol.txt" );
Сообщить ( НаборСимволовИзФайла [ 0 ]); // 125
Сообщить ( НаборСимволовИзФайла [ 1 ]); // А
Сообщить ( НаборСимволовИзФайла [ 2 ]); // 99
Сообщить ( НаборСимволовИзФайла [ 3 ]); // %
&НаКлиенте
Процедура ОперацииНадФайлами ( Команда )
// Создание переменных (имя и путь к файлу)
ПутьКФайлу_Test = "D:\Test.txt" ;
ПутьКФайлу_Copy = "D:\Copy.txt" ;
// Создание пустого файла
ТекстФайл = Новый ЗаписьТекста ();
ТекстФайл . Закрыть ();
// Проверка на существование файла
ТекстФайл = Новый Файл ( ПутьКФайлу_Test );
Если ТекстФайл . Существует () Тогда
Сообщить ( ПутьКФайлу_Test + " существует!" );
КонецЕсли;
// Копирование файла. Параметры: Какой файл копируем, Куда файл копируем
КопироватьФайл ( ПутьКФайлу_Test , ПутьКФайлу_Copy ); // Если файл существует, то перезапишет
// Перемещение файла. Параметры: Какой файл копируем, Куда файл копируем
ПереместитьФайл ( ПутьКФайлу_Test , ПутьКФайлу_Copy ); // Если файл существует, то перезапишет
// Поиск файлов в каталоге (функция возвращает массив значений)
// Параметры: Каталог поиска, Маска поиска, Поиск и в подкаталогах
МассивФайлов = НайтиФайлы ( "D:\" , "*.txt" , Ложь);
Для Каждого ТекФайл Из МассивФайлов Цикл
Сообщить ( "Найден файл: " + ТекФайл . ПолноеИмя );
КонецЦикла;
// Удаление файла
УдалитьФайлы ( ПутьКФайлу_Test ); // Если файл с параметром только для чтения, то будет ошибка
// Удаление файлов в каталоге по маске
// поиск в каталоге нерекурсивный
УдалитьФайлы ( "D:\" , "*.txt" ); // Если маски нет, то удалятся все файлы и сам каталог
// Получение имя временного файла
ПолучитьИмяВременногоФайла (); // Например, C:\Temp\H_kImX035.tmp
ПолучитьИмяВременногоФайла ( ".txt" ); // Например, C:\Temp\H_kImX035.txt
&НаКлиенте
Процедура ПолучениеИИзменениеАтрибутовФайла ( Команда )
ТекстФайл = Новый Файл ( "D:\Test.txt" );
// Чтение атрибутов
ТекстФайл . ПолучитьВремяИзменения (); // время последнего изменения файла
ТекстФайл . ПолучитьТолькоЧтение (); // проверяем атрибут только чтение
ТекстФайл . ПолучитьНевидимость (); // проверяем атрибут hidden (скрытность, невидимость)
ТекстФайл . Размер (); // размер файла в байтах
// Получение расширение файла из его пути
ТекстФайл . Расширение (); // .txt
// Получение имени файла без расширения
ТекстФайл . ИмяБезРасширения (); // Test
// Получение информации по пути файла - это файл или каталог
Если ТекстФайл . ЭтоКаталог () Тогда
// Это каталог
ИначеЕсли ТекстФайл . ЭтоФайл () Тогда
// Это файл
КонецЕсли;
// Изменение атрибутов
ТекстФайл . УстановитьВремяИзменения ( ТекущаяДата ()); // меняем время последнего изменения файла
ТекстФайл . УстановитьТолькоЧтение (Ложь); // меняем атрибут только чтение
ТекстФайл . УстановитьНевидимость (Ложь); // меняем атрибут невидимости
&НаКлиенте
Процедура ОперацииНадКаталогами ( Команда )
//Создание каталога (он может уже существовать)
СоздатьКаталог ( "D:\Catalog" );
//Создание подкаталогов
СоздатьКаталог ( "D:\Catalog\2020\1" );
// Проверка существования каталога
Каталог = Новый Файл ( "D:\Catalog" );
Если Каталог . Существует () Тогда
Сообщить ( "Каталог по пути D:\Catalog существует!" );
КонецЕсли;
// Удаление каталога (вместе с файлами и подкаталогами)
УдалитьФайлы ( "D:\Catalog" ); // Можно добавить максу
// Получение каталога временных файлов
КаталогВременныхФайлов (); // Например, C:\Windows\Temp
&НаКлиенте
Процедура ОперацииСВременнымХранилищем ( Команда )
// Временное хранилище позволяет передавать данные,
// которые иначе не передать (произвольного типа) между сервером и клиентом
// Сохранение произвольного значения (списка значений) во временном хранилище
СЗ = Новый СписокЗначений ;
СЗ . Добавить ( "Арбуз" );
СЗ . Добавить ( "Дыня" );
СЗ . Добавить ( "Яблоко" );
АдресВХранилище = ПоместитьВоВременноеХранилище ( СЗ );
// Чтение произвольного значения (списка значений) из временного хранилища
СЗИзХранилища = ПолучитьИзВременногоХранилища ( АдресВХранилище );
Если СЗИзХранилища = Неопределено Тогда
Сообщить ( "Значение по этому адресу из хранилища уже удалено!" );
Иначе
Сообщить ( СЗИзХранилища [ 0 ]); // Арбуз
КонецЕсли;
// Перезапись уже сохраненного значения (массив) во временном хранилище
НаборСимволов = Новый Массив ;
НаборСимволов . Добавить ( 125 );
НаборСимволов . Добавить ( "А" );
НаборСимволов . Добавить ( "99" );
НаборСимволов . Добавить ( "%" );
// Время хранения зависит от параметра "АдресВХранилище" функции ПоместитьВоВременноеХранилище
ПоместитьВоВременноеХранилище ( НаборСимволов , АдресВХранилище );
// Если адрес - уникальный идентификатор формы или существующий адрес в хранилище:
// Значение будет удалено после закрытия формы
ПоместитьВоВременноеХранилище ( НаборСимволов , ЭтаФорма . УникальныйИдентификатор );
// Если адрес - уникальный идентификатор, не являющийся уникальным идентификатором формы %
// Значение будет удалено после завершения сеанса пользвоателя
ПоместитьВоВременноеХранилище ( НаборСимволов , Новый УникальныйИдентификатор );
// Если адрес не указан:
// Значение будет удалено после очередного запроса сервера
ПоместитьВоВременноеХранилище ( НаборСимволов );
// Удаление значения из временного хранилища
УдалитьИзВременногоХранилища ( АдресВХранилище );
// Проверка является ли строка адресом во временном хранилище
Если ЭтоАдресВременногоХранилища ( АдресВХранилище ) Тогда
// Это адрес во временном хранилище
КонецЕсли;
&НаКлиенте
Процедура ПередачаФайлаСКлиентаНаСервер ( Команда )
ТекстФайл = Новый ЗаписьТекста ( "D:\Prostokvashino.txt" );
ТекстФайл . ЗаписатьСтроку ( "Кот Матроскин" );
ТекстФайл . ЗаписатьСтроку ( "Дядя Федор" );
ТекстФайл . ЗаписатьСтроку ( "Шарик" );
ТекстФайл . Закрыть ();
Завершено = Новый ОписаниеОповещения ( "ПослеПередачи" , ЭтотОбъект );
// Параметр УникальныйИдентификаторФормы - если не указывать - то файл будет удален после очередного запроса сервера
// если указать - то после удаления объекта формы
// Параметр Интерактивно (Истина) - дает пользователю выбрать файл самому
НачатьПомещениеФайла ( Завершено , , "D:\Prostokvashino.txt" , Ложь, ЭтаФорма . УникальныйИдентификатор );
&НаКлиенте
Процедура ПослеПередачи ( Результат , ХранимыйАдрес , ВыбранноеИмяФайла , ДопПараметры ) Экспорт
Если Результат Тогда
// Сохранение полученного адреса в реквизите формы (строка) - адрес файла в хранилище на сервере
АдресФайлаВХранилище = ХранимыйАдрес ;
Сообщить ( "Файл " + ВыбранноеИмяФайла + " передан на сервер и сохранён во временном хранилище. Адрес: " + ХранимыйАдрес );
Иначе
Сообщить ( "Ошибка передачи файла на сервер!" );
КонецЕсли;
« Как стать программистом 1С » Язык 1С » Работа с файловой системой из 1С
Работа с файловой системой из 1С
Следующие функции языка 1С позволяют манипулировать файлами:
- СоздатьКаталог 1С
- НайтиФайлы 1С
- КопироватьФайл 1С
- ПереместитьФайл 1С
- УдалитьФайлы 1С
- РазделитьФайл 1С
- ОбъединитьФайлы 1С.
Работа с каталогами — СоздатьКаталог 1С
//создает недостающие каталоги в указанном пути
//если каталога нет – создаст всю вложенную структуру
//если есть D:\Temp, то создаст подкаталоги
СоздатьКаталог("D:\Temp\1\2\3")
Поиск файлов — НайтиФайлы 1С
//найти все файлы 1С в каталоге «Sc»
НайденныеФайлы = НайтиФайлы("D:\Sc", "*");
//найти все ТЕКСТОВЫЕ файлы 1С в каталоге, включая вложенные подкаталоги
НайденныеФайлы = НайтиФайлы("D:\Sc", "*.txt", Истина);
//найти все файлы 1С в каталоге, в имени которых встречается слово "копия"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*копия*");
//найти все файлы 1С в каталоге, в имени которых встречается любая цифра в скобочках, например "(1)" или "(100)"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*(*)*");
//найти все файлы 1С в каталоге, в имени которых встречается цифра в скобочках меньше 10, например "(1)" или "(9)"
НайденныеФайлы = НайтиФайлы("D:\Sc", "*(?)*");
Для каждого Файл из НайденныеФайлы Цикл
Если Файл.ЭтоКаталог() Тогда
Продолжить;
КонецЕсли;
Копирование, перемещение и удаление файлов — КопироватьФайл 1С, ПереместитьФайл 1С, УдалитьФайлы 1С
ИмяФайла = "Текстовый файл.txt";
КаталогИсточник = "D:\sc\";
КаталогПриемник = "D:\";
//копирование файла
ФайлИсточник = Новый Файл(КаталогИсточник + ИмяФайла);
Если не ФайлИсточник.Существует() или ФайлИсточник.ЭтоКаталог() Тогда
ВызватьИсключение "Файл '" + КаталогИсточник + ИмяФайла + "' не существует или является каталогом";
КонецЕсли;
Попытка
КопироватьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла);
Исключение
ВызватьИсключение "Нет прав на копирование файла";
КонецПопытки;
ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла);
Если не ФайлПриемник.Существует() или ФайлПриемник.Размер() <> ФайлИсточник.Размер() Тогда
ВызватьИсключение "Не удалось корректно скопировать файл";
КонецЕсли;
//перемещение файла
Попытка
ПереместитьФайл(КаталогИсточник + ИмяФайла, КаталогПриемник + ИмяФайла);
Исключение
ВызватьИсключение "Нет прав на копирование файла";
КонецПопытки;
ФайлПриемник = Новый Файл(КаталогПриемник + ИмяФайла);
Если не ФайлПриемник.Существует() Тогда
ВызватьИсключение "Не удалось корректно перенести файл";
КонецЕсли;
Разделение и слияние файлов — РазделитьФайл 1С, ОбъединитьФайлы 1С
//функция создает каталог с именем файла
//в нем создает разделенные части файла, каждая размером в указанное кол-во мегабайт
//каждую часть сжимает архиватором
//возвращает имя каталога
Читайте также: