Для работы производится подключение обработки во внешних обработках т.к. при открытии с файла будет безопасный режим.
А теперь с самого начала разберемся, как она работает по внутренностям.
В процедуре формы ПриСозданииНаСервере заполняем список типов документов / справочников используя функцию УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати, функция вернет массив менеджеров объектов, по которым подключена подсистема печати, по менеджеру объекта получим метаданные для получения имени метаданного и его синонима.
#Область СобытияФормы
//Заполним список выбора вида объекта
//данными функции ПриОпределенииОбъектовСКомандамиПечати
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
МассивОбъектов = Новый Массив;
УправлениеПечатьюПереопределяемый.ПриОпределенииОбъектовСКомандамиПечати(МассивОбъектов);
МетаданныеЖурналыДокументов = Метаданные.ЖурналыДокументов;
Для Каждого ЭлементПечати Из МассивОбъектов Цикл
МетаданноеПечати = Метаданные.НайтиПоТипу(ТипЗнч(ЭлементПечати));
//Если это журнал документов то пропускаем
Если МетаданныеЖурналыДокументов.Содержит(МетаданноеПечати) Тогда
Продолжить;
КонецЕсли;
//Заполняем список выбора ВидОбъекта полным именем метаданного
Элементы.ВидОбъекта.СписокВыбора.Добавить(МетаданноеПечати.ПолноеИмя(),
МетаданноеПечати.Синоним);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
//Производим первоначальную инициализацию элементов при сохраненной настройке ВидОбъекта
Если ЗначениеЗаполнено(ВидОбъекта) Тогда
ВидДокументовПриИзмененииСервер();
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СобытияЭлементовФормы
&НаКлиенте
Процедура ВидДокументовПриИзменении(Элемент)
ВидДокументовПриИзмененииСервер();
КонецПроцедуры
&НаСервере
Процедура ВидДокументовПриИзмененииСервер()
//Сохраним текущие пользовательские настройки ТаблицаДокументов
Если ЗначениеЗаполнено(ТаблицаДокументов.КлючТекущихПользовательскихНастроек) Тогда
ХранилищеПользовательскихНастроекДинамическихСписков.Сохранить("УППД",
ТаблицаДокументов.КлючТекущихПользовательскихНастроек,
ТаблицаДокументов.КомпоновщикНастроек.ПользовательскиеНастройки,
,
ПараметрыСеанса.ТекущийПользователь);
КонецЕсли;
//Если очистили ВидОбъекта то убираем кнопки
Если ВидОбъекта = "" Тогда
Элементы.Печать.Видимость = Ложь;
Элементы.СразуНаПринтер.Видимость = Ложь;
Элементы.ПечатьВыделенные.Видимость = Ложь;
Элементы.Основная.Видимость = Ложь;
Возврат;
КонецЕсли;
Элементы.Печать.Видимость = Истина;
Элементы.СразуНаПринтер.Видимость = Истина;
Элементы.ПечатьВыделенные.Видимость = Истина;
Элементы.Основная.Видимость = Истина;
СозданиеЭлементовТаблицыСервер();
ЗаполнитьПечатныеФормыНаСервере();
ТаблицаДокументов.КлючТекущихПользовательскихНастроек = ВидОбъекта;
//Получим сохраненные ранее пользовательские настройки
ВыборкаНастройки = ХранилищеПользовательскихНастроекДинамическихСписков.Выбрать(
Новый Структура("КлючОбъекта, КлючНастроек, Пользователь",
"УППД",
ВидОбъекта,
ПараметрыСеанса.ТекущийПользователь));
Попытка
ВыборкаНастройки.Следующий();
Исключение
Сообщить(ОписаниеОшибки());
Возврат;
КонецПопытки;
//Восстановим пользовательские настройки ЗагрузитьПользовательскиеНастройки
Если ВыборкаНастройки.Настройки = Неопределено Тогда
//Если нет сохраненных настроек то очистим отборы списка
Для Каждого ЭлПользНастр Из ТаблицаДокументов.КомпоновщикНастроек.ПользовательскиеНастройки.Элементы Цикл
Если ТипЗнч(ЭлПользНастр) = Тип("ОтборКомпоновкиДанных") Тогда
ЭлПользНастр.Элементы.Очистить();
КонецЕсли;
КонецЦикла;
Иначе
ТаблицаДокументов.КомпоновщикНастроек.ЗагрузитьПользовательскиеНастройки(ВыборкаНастройки.Настройки);
КонецЕсли;
Элементы.ТаблицаДокументов.СоздатьЭлементыФормыПользовательскихНастроек(
Элементы.СписокКомпоновщикНастроекПользовательскиеНастройки,
РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ);
КонецПроцедуры
//Проставим нулевое количество во всех строчках и сохраним настройки
&НаКлиенте
Процедура ОтметитьВсе(Команда)
Для Каждого Стр Из ПечатныеФормы Цикл
Если Стр.Количество = 0 Тогда
Стр.Количество = 1;
КонецЕсли;
КонецЦикла;
СохранитьНастройкиСервер();
КонецПроцедуры
&НаКлиенте
Процедура Печать(Команда)
Если Не ЗначениеЗаполнено(ВидОбъекта) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен вид документа / справочника";
Сообщение.Поле = "ВидДокументов";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
СписокДокументов = ПолучитьДокументыПоДинамическомуСписку();
СтрокиПечать = ПолучитьПараметрыПечатиСервер();
ВыполнитьПечатьПоСпискуДокументовКлиент(СписокДокументов, СтрокиПечать);
КонецПроцедуры
&НаКлиенте
Процедура ПечатьВыделенные(Команда)
Если Не ЗначениеЗаполнено(ВидОбъекта) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Не заполнен вид документа / справочника";
Сообщение.Поле = "ВидДокументов";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
СписокДокументов = Элементы.ТаблицаДокументов.ВыделенныеСтроки;
СтрокиПечать = ПолучитьПараметрыПечатиСервер();
ВыполнитьПечатьПоСпискуДокументовКлиент(СписокДокументов, СтрокиПечать);
КонецПроцедуры
&НаКлиенте
Процедура СнятьВсе(Команда)
Для Каждого Стр Из ПечатныеФормы Цикл
Стр.Количество = 0;
КонецЦикла;
СохранитьНастройкиСервер();
КонецПроцедуры
&НаКлиенте
Процедура СохранитьНастройку(Команда)
СохранитьНастройкиСервер();
КонецПроцедуры
#КонецОбласти
#Область ПрограмныйИнтерфейс
&НаСервере
Процедура СозданиеЭлементовТаблицыСервер()
РеквизитТаблЗначений = ЭтаФорма.ТаблицаДокументов;
РеквизитТаблЗначений.ОсновнаяТаблица = ВидОбъекта;
РеквизитТаблЗначений.ПроизвольныйЗапрос = Ложь;
МассивЭлементовУдаление = Новый Массив;
//Удалим сначала ПодчиненныеЭлементы элемента ТаблицаДокументов
Для Каждого ЭлементУдаление Из Элементы.ТаблицаДокументов.ПодчиненныеЭлементы Цикл
МассивЭлементовУдаление.Добавить(ЭлементУдаление);
КонецЦикла;
Для Каждого ЭлементУдаление Из МассивЭлементовУдаление Цикл
Элементы.Удалить(ЭлементУдаление);
КонецЦикла;
ДанныеОбъекта = ПолучитьДанныеВидаОбъекта(ВидОбъекта);
Если ДанныеОбъекта = Неопределено Тогда
Возврат;
КонецЕсли;
//Добавим стандартные реквизиты кроме Наименование, Дата и др.
Для Каждого Эл Из Метаданные[ДанныеОбъекта.ТипОбъекта][ДанныеОбъекта.ИмяОбъекта].СтандартныеРеквизиты Цикл
Если Эл.Имя = "Наименование" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Дата" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Номер" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ПометкаУдаления" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Проведен" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Владелец" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Родитель" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ЭтоГруппа" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ПометкаУдаления" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "Предопределенный" Тогда
Продолжить;
КонецЕсли;
Если Эл.Имя = "ИмяПредопределенныхДанных" Тогда
Продолжить;
КонецЕсли;
НоваяКолонкаТаблицы = Элементы.Добавить(Эл.Имя, Тип("ПолеФормы"), Элементы.ТаблицаДокументов);
НоваяКолонкаТаблицы.ПутьКДанным = "ТаблицаДокументов." + Эл.Имя;
Если Эл.Имя = "Ссылка" Тогда
Если ДанныеОбъекта.ТипОбъекта = "Документы" Тогда
НоваяКолонкаТаблицы.Заголовок = "Документ";
ИначеЕсли ДанныеОбъекта.ТипОбъекта = "Справочники" Тогда
НоваяКолонкаТаблицы.Заголовок = "Справочник";
Иначе
НоваяКолонкаТаблицы.Заголовок = ДанныеОбъекта.ТипОбъекта;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьПечатныеФормыНаСервере()
ПечатныеФормы.Очистить();
ТаблКомандПечати = ПолучитьКомандыПечатиСервер(ВидОбъекта);
ВосстановитьНастройку(ТаблКомандПечати);
КонецПроцедуры
//Выполняя схему скд из настроек ТаблицаДокументов получаем массив документов
&НаСервере
Функция ПолучитьДокументыПоДинамическомуСписку()
СхемаКомпоновкиДанных = Элементы.ТаблицаДокументов.ПолучитьИсполняемуюСхемуКомпоновкиДанных();
НастройкиКомпоновкиДанных = Элементы.ТаблицаДокументов.ПолучитьИсполняемыеНастройкиКомпоновкиДанных();
Если НастройкиКомпоновкиДанных.Структура.Количество() Тогда
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0].Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
Иначе
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура.Добавить(Тип("ГруппировкаКомпоновкиДанных"));
АвтоВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0].Выбор.Элементы.Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных = НастройкиКомпоновкиДанных.Структура[0].Выбор.Элементы.Добавить(Тип("ВыбранноеПолеКомпоновкиДанных"));
ВыбранноеПолеКомпоновкиДанных.Поле = Новый ПолеКомпоновкиДанных("Ссылка");
КонецЕсли;
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных();
Макет = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных,НастройкиКомпоновкиДанных,,,Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновки.Инициализировать(Макет);
ТаблицаСсылок = Новый ТаблицаЗначений;
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ПроцессорВывода.УстановитьОбъект(ТаблицаСсылок);
ПроцессорВывода.Вывести(ПроцессорКомпоновки, Истина);
Возврат ТаблицаСсылок.ВыгрузитьКолонку("Ссылка");
КонецФункции
//Получаем команды печати для формы объекта из ВидОбъекта
&НаСервереБезКонтекста
Функция ПолучитьКомандыПечатиСервер(Знач ВидОбъекта)
ДанныеОбъекта = ПолучитьДанныеВидаОбъекта(ВидОбъекта);
Если ДанныеОбъекта = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
МетаданныеДокумента = Метаданные[ДанныеОбъекта.ТипОбъекта][ДанныеОбъекта.ИмяОбъекта];
Если ТипЗнч(МетаданныеДокумента.ОсновнаяФормаСписка) = Тип("ОбъектМетаданных") Тогда
ФормаОбъекта = МетаданныеДокумента.ОсновнаяФормаСписка;
ИначеЕсли ТипЗнч(МетаданныеДокумента.ОсновнаяФормаОбъекта) = Тип("ОбъектМетаданных") Тогда
ФормаОбъекта = МетаданныеДокумента.ОсновнаяФормаОбъекта;
Иначе
ВызватьИсключение "Для объекта "
+ ДанныеОбъекта.ИмяОбъекта
+ " не задана основная форма";
КонецЕсли;
КомандыПечатиФормы = УправлениеПечатью.КомандыПечатиФормы(ВидОбъекта + ".Форма." + ФормаОбъекта.Имя);
Возврат КомандыПечатиФормы;
КонецФункции
//Подготавливаем массив строк печати,
//соединяя поля от ПолучитьКомандыПечатиСервер и ПечатныеФормы
&НаСервере
Функция ПолучитьПараметрыПечатиСервер()
МассивПолейПечатныхФорм = Новый Массив;
МассивПолейПечатныхФорм.Добавить("ОписаниеКоманды");
МассивПолейПечатныхФорм.Добавить("ОбъектыПечати");
МассивПолейПечатныхФорм.Добавить("Форма");
МассивПолейПечатныхФорм.Добавить("МенеджерПечати");
МассивПолейПечатныхФорм.Добавить("Представление");
МассивПолейПечатныхФорм.Добавить("Идентификатор");
МассивПолейПечатныхФорм.Добавить("Количество");
ПоляПечатныхФорм = СтрСоединить(МассивПолейПечатныхФорм, ", ");
КомандыПечати = ПолучитьКомандыПечатиСервер(ВидОбъекта);
МассивПолейКомандПечати = Новый Массив;
Для Каждого Колонка Из КомандыПечати.Колонки Цикл
МассивПолейКомандПечати.Добавить(Колонка.Имя);
КонецЦикла;
ПоляКомандПечати = СтрСоединить(МассивПолейКомандПечати, ", ");
СтрокиПечать = Новый Массив;
Отб = Новый Структура("Идентификатор, Представление");
Для Каждого СтрПечФорма Из ПечатныеФормы Цикл
Если СтрПечФорма.Количество <> 0 Тогда
ЗаполнитьЗначенияСвойств(Отб, СтрПечФорма);
НайденныеСтроки = КомандыПечати.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() = 1 Тогда
НовСтр = Новый Структура(ПоляПечатныхФорм);
ЗаполнитьЗначенияСвойств(НовСтр, СтрПечФорма);
СтруктураКоманд = Новый Структура(ПоляКомандПечати);
ЗаполнитьЗначенияСвойств(СтруктураКоманд, НайденныеСтроки[0]);
НовСтр.ОписаниеКоманды = СтруктураКоманд;
СтрокиПечать.Добавить(НовСтр);
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат СтрокиПечать;
КонецФункции
//Выполняем печать испольуя сначала функцию УправлениеПечатьюСлужебныйКлиент
//в случае выдачи исключительной ситуации заполняем ОписаниеКоманды.Обработчик,
//для печатный форм не из менеджера объекта производим печать вызывая ПроизвестиПечатьИзОткрытыхОкон
&НаКлиенте
Процедура ВыполнитьПечатьПоСпискуДокументовКлиент(СписокДок, СтрокиПечать)
ТекущиеОкна = ПолучитьОкна();
СписокОконДоПечати = Новый Массив;
Для Каждого ОкноКП Из ТекущиеОкна Цикл
СписокОконДоПечати.Добавить(ОкноКП);
КонецЦикла;
Для Каждого Эл Из СписокДок Цикл
Для Каждого СтрПечФорма Из СтрокиПечать Цикл
ОбъектыПечати = Новый Массив();
ОбъектыПечати.Добавить(Эл);
СтрПечФорма.ОписаниеКоманды.СразуНаПринтер = СразуНаПринтер;
СтрПечФорма.Форма = ЭтаФорма;
СтрПечФорма.ОбъектыПечати = ОбъектыПечати;
ОбработчикПечати = СтрПечФорма.ОписаниеКоманды.Обработчик;
СтрПечФорма.ОписаниеКоманды.ДополнительныеПараметры.Вставить("Экземпляров", СтрПечФорма.Количество);
Отказ = Ложь;
Попытка
УправлениеПечатьюСлужебныйКлиент.ОбработчикКоманды(ОбъектыПечати, СтрПечФорма);
ПроизвестиПечатьИзОткрытыхОкон(СписокОконДоПечати, СтрПечФорма.Количество);
Исключение
Отказ = Истина;
КонецПопытки;
Если Отказ Тогда
СтрПечФорма.ОписаниеКоманды.Обработчик = ОбработчикПечати;
Попытка
УправлениеПечатьюСлужебныйКлиент.ОбработчикКоманды(ОбъектыПечати, СтрПечФорма);
Исключение
Сообщить("При печати печатной формы"
+ СтрПечФорма.Представление
+ " по документу "
+ Строка(Эл)
+ " возникла ошибка: "
+ ОписаниеОшибки());
КонецПопытки;
ПроизвестиПечатьИзОткрытыхОкон(СписокОконДоПечати, СтрПечФорма.Количество);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
//Для печатных форм не из менеджера печати
//обходим открывшиеся в момент печати формы и вызываем из них печать
&НаКлиенте
Процедура ПроизвестиПечатьИзОткрытыхОкон(СписокОконДоПечати, ЧислоЭкземпляров)
СписокОконПослеПечати = ПолучитьОкна();
Для Каждого ОкноПосле Из СписокОконПослеПечати Цикл
Если СписокОконДоПечати.Найти(ОкноПосле) = Неопределено Тогда
СписокОконДоПечати.Добавить(ОкноПосле);
Иначе
Продолжить;
КонецЕсли;
Если ОкноПосле.Содержимое.Количество() Тогда
ФормаОткрытая = ОкноПосле.Содержимое[0];
Попытка
Если Не ФормаОткрытая.ВладелецФормы = ЭтаФорма Тогда
Продолжить;
КонецЕсли;
ФормаОткрытая.Копий = ЧислоЭкземпляров;
Если СразуНаПринтер Тогда
Для Каждого НастройкаПечатнойФормы Из ФормаОткрытая.НастройкиПечатныхФорм Цикл
Если НастройкаПечатнойФормы.Печатать Тогда
ПечатнаяФорма = ФормаОткрытая[НастройкаПечатнойФормы.ИмяРеквизита];
ПечатнаяФорма.КоличествоЭкземпляров = ЧислоЭкземпляров;
ПечатнаяФорма.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецЕсли;
КонецЦикла;
ФормаОткрытая.Закрыть();
КонецЕсли;
Исключение
КонецПопытки;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
//Разделяя строку ВидОбъекта через . получаем ИмяОбъекта и ТипОбъекта
&НаСервереБезКонтекста
Функция ПолучитьДанныеВидаОбъекта(Знач ВидОбъекта)
РазделеннаяСтрокаВидаОбъекта = СтрРазделить(ВидОбъекта, ".");
Если РазделеннаяСтрокаВидаОбъекта.ВГраница() < 1 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Перевыберите вид документа / справочника";
Сообщение.Поле = "ВидОбъекта";
Сообщение.Сообщить();
Возврат Неопределено;
КонецЕсли;
ТипОбъекта = РазделеннаяСтрокаВидаОбъекта[0];
Если ТипОбъекта = "Справочник" Тогда
ТипОбъекта = "Справочники";
ИначеЕсли ТипОбъекта = "Документ" Тогда
ТипОбъекта = "Документы";
КонецЕсли;
ИмяОбъекта = РазделеннаяСтрокаВидаОбъекта[1];
СтруктураРезультат = Новый Структура("ТипОбъекта, ИмяОбъекта",
ТипОбъекта, ИмяОбъекта);
Возврат СтруктураРезультат;
КонецФункции
#КонецОбласти
#Область НастройкиПользователя
//Сохраним настройки ПечатныеФормы в ХранилищеОбщихНастроек
&НаСервере
Процедура СохранитьНастройкиСервер()
ТаблПечатныеФормы = ПечатныеФормы.Выгрузить();
ХранилищеОбщихНастроек.Сохранить("УниверсальнаяПакетнаяПечатьДокументов",
ВидОбъекта,
ТаблПечатныеФормы);
КонецПроцедуры
//Загружаем настройку из ХранилищеОбщихНастроек и заполняем ПечатныеФормы
&НаСервере
Процедура ВосстановитьНастройку(ТаблКомандПечати)
СохраненныеНастройки = ХранилищеОбщихНастроек.Загрузить("УниверсальнаяПакетнаяПечатьДокументов",
ВидОбъекта);
Если ТипЗнч(СохраненныеНастройки) = Тип("ТаблицаЗначений")
И СохраненныеНастройки.Колонки.Найти("Идентификатор") <> Неопределено
И СохраненныеНастройки.Колонки.Найти("Представление") <> Неопределено Тогда
Отб = Новый Структура("Идентификатор, Представление");
Для Каждого ЭлКомандаПечати Из ТаблКомандПечати Цикл
ЗаполнитьЗначенияСвойств(Отб, ЭлКомандаПечати);
НайденныеСтроки = СохраненныеНастройки.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() = 0 Тогда
СтрПечФорма = ПечатныеФормы.Добавить();
ЗаполнитьЗначенияСвойств(СтрПечФорма, ЭлКомандаПечати);
КонецЕсли;
КонецЦикла;
МассивСтрокУдаление = Новый Массив;
Для Каждого ЭлПечатнаяформа Из СохраненныеНастройки Цикл
ЗаполнитьЗначенияСвойств(Отб, ЭлКомандаПечати);
НайденныеСтроки = ТаблКомандПечати.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() = 0 Тогда
МассивСтрокУдаление.Добавить(ЭлПечатнаяформа);
КонецЕсли;
КонецЦикла;
Для Каждого СтрУдаление Из МассивСтрокУдаление Цикл
СохраненныеНастройки.Удалить(СтрУдаление);
КонецЦикла;
ПечатныеФормы.Загрузить(СохраненныеНастройки);
Иначе
ПечатныеФормы.Загрузить(ТаблКомандПечати);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ТаблицаДокументовПриОбновленииСоставаПользовательскихНастроекНаСервере(СтандартнаяОбработка)
Элементы.ТаблицаДокументов.СоздатьЭлементыФормыПользовательскихНастроек(Элементы.СписокКомпоновщикНастроекПользовательскиеНастройки,
РежимОтображенияНастроекКомпоновкиДанных.БыстрыйДоступ);
КонецПроцедуры
//Сохраним в ХранилищеПользовательскихНастроекДинамическихСписков ПользовательскиеНастройки для ТаблицаДокументов
&НаСервере
Процедура ТаблицаДокументовПриСохраненииПользовательскихНастроекНаСервере(Элемент, Настройки)
Если ЗначениеЗаполнено(ТаблицаДокументов.КлючТекущихПользовательскихНастроек) Тогда
ХранилищеПользовательскихНастроекДинамическихСписков.Сохранить("УППД",
ТаблицаДокументов.КлючТекущихПользовательскихНастроек,
ТаблицаДокументов.КомпоновщикНастроек.ПользовательскиеНастройки,
,
ПараметрыСеанса.ТекущийПользователь);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПечатныеФормыПриИзменении(Элемент)
СохранитьНастройкиСервер();
КонецПроцедуры
//Скопируем строчку печатной формы и сохраним настройки
&НаКлиенте
Процедура СкопироватьПечатнуюФорму(Команда)
ТекСтр = Элементы.ПечатныеФормы.ТекущиеДанные;
Если ТекСтр = Неопределено Тогда
Возврат;
КонецЕсли;
НоваяСтрока = ПечатныеФормы.Вставить(ПечатныеФормы.Индекс(ТекСтр) + 1);
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтр);
СохранитьНастройкиСервер();
КонецПроцедуры
//Удалим строчку печатной формы и сохраним настройки
&НаКлиенте
Процедура УдалитьПечатнуюФорму(Команда)
ТекСтр = Элементы.ПечатныеФормы.ТекущиеДанные;
Если ТекСтр = Неопределено Тогда
Возврат;
КонецЕсли;
ИндексТекущейСтроки = ПечатныеФормы.Индекс(ТекСтр);
Отб = Новый Структура("Идентификатор, Представление");
ЗаполнитьЗначенияСвойств(Отб, ТекСтр);
НайденныеСтроки = ПечатныеФормы.НайтиСтроки(Отб);
Если НайденныеСтроки.Количество() < 2 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = "Последняя строчка печатной формы не удаляется";
Сообщение.Поле = "ПечатныеФормы[" + Формат(ИндексТекущейСтроки, "ЧГ=0") + "]";
Сообщение.Сообщить();
Возврат;
КонецЕсли;
ПечатныеФормы.Удалить(ИндексТекущейСтроки);
СохранитьНастройкиСервер();
КонецПроцедуры
#КонецОбласти
Можно скачать файл обработки для всех платформ 1С и так же для версии от 8.3.24.1201, использующий добавленный функционал работы со списками.
Проверено на следующих конфигурациях и релизах:
- Управление торговлей, редакция 11, релизы 11.5.13.109