Встала банальная задача - перенести некоторые справочники в новые пустые базы (базовая версия). Конфигурации идентичны, задача простая, но, на энном повторении задался вопросом, а как сохранить список выбранных элементов дерева значений в файл, чтобы не тратить время на поиски нужных. Потыкался в гугле и здесь, не нашел, поэтому скидываю свой вариант, может, кому пригодится.
Вставляем в модуль формы, в моей версии обработки ВыгрузкаЗагрузкаДанныхXML (2.1.8) нет события ПриОткрытии, поэтому я добавил это событие и связал с формой. Кнопки на форму добавляются программно.
&НаКлиенте
Процедура ПриОткрытии(Отказ)
СоздатьКоманды();
КонецПроцедуры
&НаСервере
Функция СоздатьКоманды() Экспорт
НоваяКоманда = ЭтаФорма.Команды.Добавить("СохранитьСписокОтмеченных");
НоваяКоманда.Действие= "СохранитьСписокОтмеченных";
НоваяКоманда.Заголовок= "Сохранить отмеченные в файл";
НоваяКоманда.Отображение=ОтображениеКнопки.Картинка;
НоваяКоманда.Подсказка= "Сохраняет отмеченные значения в файл, для последующей возможно загрузки";
РодительскаяГруппа=Элементы.ДеревоМетаданных.КоманднаяПанель;
НоваяКнопка=ЭтаФорма.Элементы.Добавить("СохранитьСписокОтмеченных",Тип("КнопкаФормы"),РодительскаяГруппа);
НоваяКнопка.вид=ВидКнопкиФормы.КнопкаКоманднойПанели;
НоваяКнопка.ИмяКоманды="СохранитьСписокОтмеченных";
НоваяКнопка.ПоложениеВКоманднойПанели=ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
НоваяКоманда = ЭтаФорма.Команды.Добавить("ЗагрузитьСписокОтмеченныхИзФайла");
НоваяКоманда.Действие= "ЗагрузитьСписокОтмеченныхИзФайла";
НоваяКоманда.Заголовок= "Загрузить отмеченные из файла";
НоваяКоманда.Отображение=ОтображениеКнопки.Картинка;
НоваяКоманда.Подсказка= "Загружает отмеченные значения из файла (отмечает по списку)";
РодительскаяГруппа=Элементы.ДеревоМетаданных.КоманднаяПанель;
НоваяКнопка=ЭтаФорма.Элементы.Добавить("ЗагрузитьСписокОтмеченныхИзФайла",Тип("КнопкаФормы"),РодительскаяГруппа);
НоваяКнопка.вид=ВидКнопкиФормы.КнопкаКоманднойПанели;
НоваяКнопка.ИмяКоманды="ЗагрузитьСписокОтмеченныхИзФайла";
НоваяКнопка.ПоложениеВКоманднойПанели=ПоложениеКнопкиВКоманднойПанели.ВКоманднойПанели;
КонецФункции
&НаСервере
Функция ЗначениеВИзСтрока(ЗначениеСтр)
Если ТипЗнч(ЗначениеСтр)=Тип("Строка") Тогда
вЗначениеСтр=ЗначениеИзСтрокиВнутр(ЗначениеСтр);
Иначе
вЗначениеСтр=ЗначениеВСтрокуВнутр(ЗначениеСтр);
КонецЕсли;
Возврат(вЗначениеСтр)
КонецФункции
&НаКлиенте
Процедура ОбработатьРекурсивноДЗ(Узел, СоответствиеМетаданных, Выгрузить=Истина)
Для каждого ЭлементУзла Из Узел Цикл
Если Выгрузить Тогда
Если ЭлементУзла.Выгружать>0 ИЛИ ЭлементУзла.ВыгружатьПриНеобходимости>0 Тогда
ПолноеИмяМетаданных=ЭлементУзла.ПолноеИмяМетаданных;
Выгружать=ЭлементУзла.Выгружать;
ВыгружатьПриНеобходимости=ЭлементУзла.ВыгружатьПриНеобходимости;
СоответствиеМетаданных.Вставить(ПолноеИмяМетаданных,
Новый Структура("Выгружать,ВыгружатьПриНеобходимости",Выгружать,ВыгружатьПриНеобходимости));
СтрСообщение=СтрШаблон(" %1 (Выгружать - %2, ВыгружатьПриНеобходимости - %3)",
ПолноеИмяМетаданных,Выгружать,ВыгружатьПриНеобходимости);
Сообщить(СтрСообщение);
КонецЕсли;
Иначе
ПолноеИмяМетаданных=ЭлементУзла.ПолноеИмяМетаданных;
СохраненныеЗначения=СоответствиеМетаданных.Получить(ПолноеИмяМетаданных);
Если НЕ СохраненныеЗначения=Неопределено Тогда
Выгружать=СохраненныеЗначения.Выгружать;
ВыгружатьПриНеобходимости=СохраненныеЗначения.ВыгружатьПриНеобходимости;
ЭлементУзла.Выгружать=Выгружать;
ЭлементУзла.ВыгружатьПриНеобходимости=ВыгружатьПриНеобходимости;
СтрСообщение=СтрШаблон(" %1 (Выгружать - %2, ВыгружатьПриНеобходимости - %3)",
ПолноеИмяМетаданных,Выгружать,ВыгружатьПриНеобходимости);
Сообщить(СтрСообщение);
СоответствиеМетаданных.Удалить(ПолноеИмяМетаданных);
Иначе
ЭлементУзла.Выгружать=0;
ЭлементУзла.ВыгружатьПриНеобходимости=0;
КонецЕсли;
КонецЕсли;
ОбработатьРекурсивноДЗ(ЭлементУзла.ПолучитьЭлементы(), СоответствиеМетаданных, Выгрузить);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура СохранитьСписокОтмеченных()
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ОповещениеЗавершения = Новый ОписаниеОповещения("СохранитьСписокОтмеченныхВФайл", ЭтотОбъект);
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Текстовый документ (*.txt)|*.txt";
Диалог.Показать(ОповещениеЗавершения);
КонецПроцедуры
&НаКлиенте
Процедура СохранитьСписокОтмеченныхВФайл(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Файл=Новый ТекстовыйДокумент;
СоответствиеМетаданных=Новый Соответствие;
Сообщить("Выгружаем отмеченные элементы:");
ОбработатьРекурсивноДЗ(Объект.ДеревоМетаданных.ПолучитьЭлементы(),СоответствиеМетаданных,Истина);
Если СоответствиеМетаданных.Количество()=0 Тогда
Сообщить("Нет отмеченных элементов");
Возврат
КонецЕсли;
СоответствиеМетаданныхСтрока=ЗначениеВИзСтрока(СоответствиеМетаданных);
Файл.УстановитьТекст(СоответствиеМетаданныхСтрока);
Файл.Записать(ВыбранныеФайлы[0]);
Сообщить(СтрШаблон("Выгружено %1 отметок",СоответствиеМетаданных.Количество()));
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьСписокОтмеченныхИзФайла()
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ОповещениеЗавершения = Новый ОписаниеОповещения("ЗагрузитьСписокОтмеченных", ЭтотОбъект);
Диалог.МножественныйВыбор = Ложь;
Диалог.Фильтр = "Текстовый документ (*.txt)|*.txt";
Диалог.Показать(ОповещениеЗавершения);
КонецПроцедуры
&НаКлиенте
Процедура ЗагрузитьСписокОтмеченных(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
Если ВыбранныеФайлы = Неопределено Тогда
Возврат;
КонецЕсли;
Файл=Новый ТекстовыйДокумент;
Файл.Прочитать(ВыбранныеФайлы[0]);
СоответствиеМетаданныхСтрока=Файл.ПолучитьТекст();
СоответствиеМетаданных=ЗначениеВИзСтрока(СоответствиеМетаданныхСтрока);
Если НЕ ТипЗнч(СоответствиеМетаданных)=Тип("Соответствие") Тогда
Сообщить("Не получено соответствие из файла!");
Возврат
КонецЕсли;
КоличествоМетаданных=СоответствиеМетаданных.Количество();
Если КоличествоМетаданных<2 Тогда
Сообщить("Подозрительно мало элементов коллекции, может тут ничего нет?");
Возврат
КонецЕсли;
Сообщить("Загружаем отмеченные элементы:");
ОбработатьРекурсивноДЗ(Объект.ДеревоМетаданных.ПолучитьЭлементы(),СоответствиеМетаданных,Ложь);
КолвоОставшиесяЭлементы=СоответствиеМетаданных.Количество();
Если КолвоОставшиесяЭлементы>0 Тогда
Сообщить("Не все Метаданные найдены в текущем дереве:");
Для Каждого ЭлементСоответствия Из СоответствиеМетаданных Цикл
СтрСообщение=СтрШаблон(" %1 (Выгружать - %2, ВыгружатьПриНеобходимости - %3)",
ЭлементСоответствия.Ключ,
ЭлементСоответствия.Значение.Выгружать,
ЭлементСоответствия.Значение.ВыгружатьПриНеобходимости);
Сообщить(СтрСообщение);
КонецЦикла;
КонецЕсли;
Сообщить(СтрШаблон("Отмечено %1 из %2 элементов", КоличествоМетаданных-КолвоОставшиесяЭлементы,КоличествоМетаданных));
КонецПроцедуры
Тестировалось на 1С: БП (базовая) 3.0 (3.0.190.11), платформа 8.3.27.1688.
На той же платформе проверил загрузку из БПБ в БП, только один элемент не загрузился - корень, так как он отличается БухгалтерияПредприятияБазовая против БухгалтерияПредприятия. О таких случаях оповещается. Лишние Сообщить() можно закомментировать.
Вступайте в нашу телеграмм-группу Инфостарт
