Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
16 окт 2021, 21:33

Копирование папки файлов (вместе со всеми подпапками) в 1С:Документооборот

Автор ijk987, 09 авг 2017, 07:58

0 Пользователей и 1 гость просматривают эту тему.

ijk987

Всем привет! Помогите, пожалуйста, со следующей задачей. Внедряем в своей организации 1С:Документооборот для совместной работы над проектами (занимаемся проектированием зданий) и хотим все файлы по проектам хранить в отдельных папках определенной структуры (в папке проекта - две папки "Проектная документация" и "Рабочая документация", в каждой из них - подпапки для хранения данных определенных разделов документации ("Раздел 1 Пояснительная записка", "Раздел 2 Проект полосы отвода" и т.д.)). При этом мы хотим соответствующим образом настроить права доступа пользователей к содержимому папок проектов (архитекторы должны иметь полный доступ к папке "Раздел 3 Архитектурные решения", доступ на чтение к папкам других разделов и т.п.).
Проблема в том, что интерфейс программы не предоставляет возможность копировать одну папку в другую вместе со всеми подпапками. Для решения этой задачи мы написали следующую функцию, копирующую "шаблонную" папку в новое расположение:

Процедура КопироватьПапкуФайлов(КопируемаяПапка,НовыйРодитель)

НовПапка = КопируемаяПапка.Скопировать();
НовПапка.Родитель = НовыйРодитель;
НовПапка.Записать();

Зап = Новый Запрос("ВЫБРАТЬ
    |Ссылка
    |Из Справочник.ПапкиФайлов
    |Где НЕ Ссылка.ПометкаУдаления И Ссылка.Родитель = &КопируемаяПапка");
Зап.УстановитьПараметр("КопируемаяПапка",КопируемаяПапка);
ВыбЗап = Зап.Выполнить().Выбрать();
Пока ВыбЗап.Следующий() Цикл
КопироватьПапкуФайлов(ВыбЗап.Получить(0),НовПапка.Ссылка);
КонецЦикла;

КонецПроцедуры


Однако, при этом права, установленные на старую папку, новой папке не назначаются.

Подскажите, пожалуйста, как можно скопировать права с одной папки на другую?

Golickoff

А СтараяПапка.Родитель = НовыйРодитель;
СтараяПапка.Записать();
не работает? Мы ведь о группах справочника сейчас, я правильно понял?
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

ijk987

Все верно. Нужно создать копию элемента справочника ПапкиФайлов вместе с дочерними элементами в новом расположении.

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

Копирование мы реализовали посредством рекурсии, поскольку вызов метода "Скопировать()" не копирует дочерние элементы. Также оказалось, что помимо этого метод "Скопировать()" не копирует еще и права доступа.

Golickoff

Никогда не сталкивался с документооборотом. Если права на группы справочника настраиваются средствами конфигурации, а не платформы, скорее всего есть какой-то регистр сведений с этими правами. Если это так, нужно разобраться как он работает и при копировании делать запрос к этому регистру, из выборки результатов которого устанавливать права на новые объекты.
Правило поведения на форуме №6: Не следует пытаться привлечь внимание к своему сообщению ... рассылкой персональных сообщений и/или электронных писем отдельным участникам форума с просьбой ответить в теме.

ijk987

Спасибо за помощь! Все получилось! Реализовал следующим образом:

Процедура КопироватьПапкуФайлов(КопируемаяПапка,НовыйРодитель)

НовПапка = КопируемаяПапка.Скопировать();
НовПапка.Родитель = НовыйРодитель;
НовПапка.Записать();

ИменаРазрешений = Новый Массив;
ИменаРазрешений.Добавить("ЧтениеПапокИФайлов");
ИменаРазрешений.Добавить("ИзменениеПапок");
ИменаРазрешений.Добавить("ДобавлениеПапокИФайлов");
ИменаРазрешений.Добавить("ИзменениеПапокИФайлов");
ИменаРазрешений.Добавить("ПометкаУдаленияПапокИФайлов");
ИменаРазрешений.Добавить("УправлениеПравами");
ИменаРазрешений.Добавить("НаследованиеРазрешено");

НастройкиПравИсх = РегистрыСведений.НастройкиПравОбъектов.Прочитать(КопируемаяПапка);
ОписаниеПравИсх = НастройкиПравИсх.Настройки;
ОписаниеПравКон = РегистрыСведений.НастройкиПравОбъектов.Прочитать(НовПапка.Ссылка).Настройки;
ОписаниеПравКон.Очистить();

Для каждого ОписаниеПраваИсх Из ОписаниеПравИсх Цикл
Если ОписаниеПраваИсх.НастройкаРодителя Тогда
Продолжить;
КонецЕсли;
ОписаниеПраваКон = ОписаниеПравКон.Добавить();
ОписаниеПраваКон.Пользователь = ОписаниеПраваИсх.Пользователь;
ОписаниеПраваКон.ВладелецНастройки = НовПапка.Ссылка;
Для Каждого ИмяРазрешения Из ИменаРазрешений Цикл
Если ЗначениеЗаполнено(ОписаниеПраваИсх[ИмяРазрешения]) Тогда
ОписаниеПраваКон[ИмяРазрешения] = ОписаниеПраваИсх[ИмяРазрешения];
КонецЕсли;
КонецЦикла;
КонецЦикла;
РегистрыСведений.НастройкиПравОбъектов.Записать(НовПапка.Ссылка, ОписаниеПравКон, НастройкиПравИсх.Наследовать);

Зап = Новый Запрос("ВЫБРАТЬ
|Ссылка
|Из Справочник.ПапкиФайлов
|Где НЕ Ссылка.ПометкаУдаления И Ссылка.Родитель = &КопируемаяПапка");
Зап.УстановитьПараметр("КопируемаяПапка",КопируемаяПапка);
ВыбЗап = Зап.Выполнить().Выбрать();
Пока ВыбЗап.Следующий() Цикл
КопироватьПапкуФайлов(ВыбЗап.Получить(0),НовПапка.Ссылка);
КонецЦикла;

КонецПроцедуры

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск