Нельзя использовать временное хранилище

В веб-клиенте работа с файлами (чтение/запись) производится только на сервере.

Функция ПодключитьРасширениеРаботыСФайлами() используется в веб-клиенте для включения разрешения работы с файлами (поддерживают не все браузеры), если неудачно – возвращает Ложь. Перед первым использованием функции в этом браузере на этом комьютере требуется установить расширение работы с файлами с помощью функции УстановитьРасширениеРаботыСФайлами()

Функции
• ПоместитьФайл(АдресКудаПомещен, ИмяФайла)
• ПолучитьФайл(АдресОткуда)
• ПоместитьФайлы(МассивИменФайлов, МассивАдресовКудаПомещены)
• ПолучитьФайлы(МассивАдресовОткуда)
позволяют передвать файлы между клиентом и сервером.

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

На клиенте файлы располагаются где требуется в файловой системе. На сервере файлы помещаются в «хранилище» — временный каталог файлов сервера 1С. Напрямую с хранилищем работать нельзя – требуется получить значение из хранилища с помощью функции ПолучитьИзВременногоХранилища() и сохранить во временный файл на сервере с помощью функции ПолучитьИмяВременногоФайла()

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

При использовании данных функций в веб-клиенте необходимо заранее выполнить функцию ПодключитьРасширениеРаботыСФайлами()

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

Для примеров использован текстовый файл на локальной «клиентской» машине по адресу «D:\Текстовый файл.txt» со следующим содержимым:
Привет, мир!
Конец файла

Пример 1. Чтение текстового файла на сервере. Имя файла выбирает пользователь/указывает программист

&НаКлиенте
Процедура КнопкаЧтениеФайла(Команда)
//для веб-клиента требуется дополнительно подключение расширения работы с файлами
#Если ВебКлиент Тогда
Результат = ПодключитьРасширениеРаботыСФайлами();

//если подключить не удалось — требуется установить его (в первый раз)
Если не Результат Тогда
//устанавливаем
УстановитьРасширениеРаботыСФайлами();
//если не удалось установить — то повторный вызов подключения будет неудачный
Если не ПодключитьРасширениеРаботыСФайлами() Тогда
//сообщаем об ошибке и прерываем работу программы
ВызватьИсключение «Ошибка. Ваш браузер не поддерживает работу с файлами.»;
КонецЕсли;
КонецЕсли;
#КонецЕсли

//перемещаем файл на сервер во «внутреннее хранилище сервера»
ВнутреннийАдресСервера = «»;

//если имя файла выбирает пользователь в стандартном диалоговом окне Windows
Результат = ПоместитьФайл(ВнутреннийАдресСервера);

Если не Результат Тогда
ВызватьИсключение «Ошибка. Не удалось передать файл на сервер. Операция прервана.»;
КонецЕсли;
Сообщить(ВнутреннийАдресСервера);

//переводим выполнение на сервер вызовом серверной процедуры
ЧтениеФайла(ВнутреннийАдресСервера);
КонецПроцедуры

&НаСервере
Процедура ЧтениеФайла(ВнутреннийАдресСервера)
//получаем файл из «временного хранилища сервера» и сохраняем во временный файл на сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
ПолучитьИзВременногоХранилища(ВнутреннийАдресСервера).Записать(ИмяВременногоФайла);
Сообщить(ИмяВременногоФайла);

//начинаем работать с файлом

//прочитаем первую строку файла
ТекстовыйФайл = Новый ЧтениеТекста(ИмяВременногоФайла);
ТекстПервойСтрокиФайла = ТекстовыйФайл.ПрочитатьСтроку();
Сообщить(ТекстПервойСтрокиФайла);

ТекстовыйФайл.Закрыть();
КонецПроцедуры

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

&НаКлиенте
Процедура КнопкаЧтениеФайла(Команда)

//для веб-клиента требуется дополнительно подключение расширения работы с файлами
#Если ВебКлиент Тогда
Результат = ПодключитьРасширениеРаботыСФайлами();

//если подключить не удалось — требуется установить его (в первый раз)
Если не Результат Тогда
//устанавливаем
УстановитьРасширениеРаботыСФайлами();
//если не удалось установить — то повторный вызов подключения будет неудачный
Если не ПодключитьРасширениеРаботыСФайлами() Тогда
//сообщаем об ошибке и прерываем работу программы
ВызватьИсключение «Ошибка. Ваш браузер не поддерживает работу с файлами.»;
КонецЕсли;
КонецЕсли;
#КонецЕсли

//перемещаем файл на сервер во «внутреннее хранилище сервера»
МассивВнутреннихАдресовСервера = Новый Массив;

//если список имен файлов выбирает пользователь
Результат = ПоместитьФайлы(,МассивВнутреннихАдресовСервера);

Если не Результат или МассивВнутреннихАдресовСервера.Количество() = 0 Тогда
ВызватьИсключение «Ошибка. Не удалось передать файл на сервер. Операция прервана.»;
КонецЕсли;

Для каждого ИмяФайла из МассивВнутреннихАдресовСервера Цикл
Сообщить(ИмяФайла.Хранение);

//переводим выполнение на сервер вызовом серверной процедуры
//реализацию этой функции см. в примере 1
ЧтениеФайла(ИмяФайла.Хранение);
КонецЦикла;

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

Пример 3. Запись нового файла на сервере с последующей передачей на клиент. Имя файла выбирает пользователь/формирует программист

&НаКлиенте
Процедура КнопкаЧтениеФайла(Команда)

//для веб-клиента требуется дополнительно подключение расширения работы с файлами
#Если ВебКлиент Тогда
Результат = ПодключитьРасширениеРаботыСФайлами();

//если подключить не удалось — требуется установить его (в первый раз)
Если не Результат Тогда
//устанавливаем
УстановитьРасширениеРаботыСФайлами();
//если не удалось установить — то повторный вызов подключения будет неудачный
Если не ПодключитьРасширениеРаботыСФайлами() Тогда
//сообщаем об ошибке и прерываем работу программы
ВызватьИсключение «Ошибка. Ваш браузер не поддерживает работу с файлами.»;
КонецЕсли;
КонецЕсли;
#КонецЕсли

//вызов серверной процедуры формирования файла, она возвращает «внутренний адрес», передаем его параметром
//куда сохранил пользователь файл и сохранил ли — мы не знаем
//пользователь всегда подтверждает разрешение на получение файла
ПолучитьФайл(ФормированиеФайла());

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

&НаСервере
Функция ФормированиеФайла()

//получаем файл из «временного хранилища сервера» и сохраняем во временный файл на сервере
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();

//начинаем работать с файлом

//помещаем во «временное хранилище сервера», система вернет «внутренний адрес»
Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяВременногоФайла));

КонецФункции

В процессе написания внешней печатной формы для 1С:ERP Управление предприятием 2 (2.4.6.230), которая, в соответствии с параметрами введенными пользователем в форму, вызываемую при нажатии на соответствующий пункт подменю печати , выводит нужное количество бирок на печать, мною было потрачено много времени на то, чтобы табличный документ, созданный в модуле внешней печатной формы, затем открывался при помощи общей формы печати документов.

Проблема, как мы понимаем, заключается в том, что сначала: нам нужно вызвать на клиенте внешнюю печатную форму, после того как пользователь введет параметры передать их в общую форму печати документов, которая, в свою очередь, должна вызвать процедуру модуля внешней печатной формы — передав в неё нужные параметры, которые пользователь ввел при вызове формы внешней печатной форме на клиенте. Последовательность действий определена и понятна, но тут нужно учитывать креатив создателей общей формы печати документов, единственная переменная, которая может быть передана по всем интересующим звеньям – это массив объектов печати. Сначала я решил не возиться с передачей при помощи массива, а передать параметры через хранилище настроек, но доступ к хранилищам оказался очень ограничен по ролям пользователей, поэтому пришлось вернуться к массиву.

Итак, описание процедур и функций внешней печатной формы:

  1. В модуле обработки создаем обязательные процедуры необходимые для регистрации обработки в базе:

# Область ОбщиеСведения Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = Новый Структура; МассивНазначений = Новый Массив; МассивНазначений.Добавить(«Документ.РеализацияТоваровУслуг»); //Указываем документ к которому делаем внешнюю печ. форму Попытка //Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет(); Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма(); //Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); //Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта(); Исключение //Вид = «ДополнительныйОтчет»; Вид = «ПечатнаяФорма»; //Вид = «ДополнительнаяОбработка»; //Вид = «ЗаполнениеОбъекта»; КонецПопытки; ПараметрыРегистрации.Вставить(«Вид», Вид); //может быть — ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов… ПараметрыРегистрации.Вставить(«Назначение», МассивНазначений); ПараметрыРегистрации.Вставить(«Наименование», «Шаблон — открытие формы»); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок ПараметрыРегистрации.Вставить(«БезопасныйРежим», ЛОЖЬ); ПараметрыРегистрации.Вставить(«Версия», «1.0»); ПараметрыРегистрации.Вставить(«Информация», «Внешняя печатная форма»); ТаблицаКоманд = ПолучитьТаблицуКоманд(); //ОткрытиеФормы – Открывает форму обработки. //ВызовКлиентскогоМетода – будет вызвана клиентская процедура из модуля формы обработки. //ВызовСерверногоМетода — будет вызвана серверная процедура из модуля обработки. //СценарийВБезопасномРежиме – тоже будет вызвана серверная процедура из модуля обработки в безопасном режиме. Попытка //Тип = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); //Тип = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовКлиентскогоМетода(); Тип = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(); Исключение //Тип = «ВызовСерверногоМетода»; //Тип = «ВызовКлиентскогоМетода»; Тип = «ОткрытиеФормы»; КонецПопытки; ДобавитьКоманду(ТаблицаКоманд, «Шаблон — открытие формы», «ШаблонОткрытиеФормы», Тип, Истина); ПараметрыРегистрации.Вставить(«Команды», ТаблицаКоманд); Возврат ПараметрыРегистрации; КонецФункции // СведенияОВнешнейОбработке() Функция ПолучитьТаблицуКоманд() Команды = Новый ТаблицаЗначений; Команды.Колонки.Добавить(«Представление», Новый ОписаниеТипов(«Строка»));//как будет выглядеть описание печ.формы для пользователя Команды.Колонки.Добавить(«Идентификатор», Новый ОписаниеТипов(«Строка»)); //имя макета печ.формы Команды.Колонки.Добавить(«Использование», Новый ОписаниеТипов(«Строка»)); //ВызовСерверногоМетода Команды.Колонки.Добавить(«ПоказыватьОповещение», Новый ОписаниеТипов(«Булево»)); Команды.Колонки.Добавить(«Модификатор», Новый ОписаниеТипов(«Строка»)); Возврат Команды; КонецФункции Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = «») НоваяКоманда = ТаблицаКоманд.Добавить(); НоваяКоманда.Представление = Представление; НоваяКоманда.Идентификатор = Идентификатор; НоваяКоманда.Использование = Использование; НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение; НоваяКоманда.Модификатор = Модификатор; КонецПроцедуры # КонецОбласти

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

&НаКлиенте Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт СтруктураПараметровПечати = Объект.СтруктураПараметровПечати; Если СтруктураПараметровПечати = Неопределено ИЛИ НЕ ТипЗнч(СтруктураПараметровПечати) = Тип(«Структура») Тогда СтруктураПараметровПечати = Новый Структура; КонецЕсли; СтруктураПараметровПечати.Вставить(«МассивОбъектов», ОбъектыНазначения); КонецПроцедуры &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Элементы.Найти(«Документ») = Неопределено Тогда Если НЕ Параметры.Свойство(«ОбъектыНазначения») Тогда Сообщить(«Ошибка получения докумнта!»); Отказ = Истина; Возврат; КонецЕсли; КонецЕсли; СтруктураПараметровПечати = Объект.СтруктураПараметровПечати; Если СтруктураПараметровПечати = Неопределено ИЛИ НЕ ТипЗнч(СтруктураПараметровПечати) = Тип(«Структура») Тогда СтруктураПараметровПечати = Новый Структура; КонецЕсли; Если Параметры.Свойство(«ОбъектыНазначения») Тогда МассивОбъектов = Новый Массив; Для Каждого мЭл Из Параметры.ОбъектыНазначения Цикл МассивОбъектов.Добавить(мЭл); КонецЦикла; Если НЕ Элементы.Найти(«Документ») = Неопределено И НЕ МассивОбъектов.Количество() = 0 Тогда Документ = МассивОбъектов; КонецЕсли; СтруктураПараметровПечати.Вставить(«МассивОбъектов», МассивОбъектов); КонецЕсли; Объект.СтруктураПараметровПечати = СтруктураПараметровПечати; ПечатьБирок = Истина; КонецПроцедуры

ОбъектыНазначения – это массив, в который платформа помещает объекты печати.

  1. В модуле формы: создаем процедуры которые будут отображать табличный документ. При отладке при помощи метода «Показать» табличного документа. Для отображения табличного документа при помощи общей формы вызываем форму печати документов и передаем в неё параметры поместив их в массив «ОбъектыНазначения» элемента структуры «ПараметрыИсточника». Кроме того, необходимо в параметры открытия общей формы поместить элемент с ключом «ИсточникДанных» и в качестве значения поместить ссылку на элемент справочника — «ДополнительныеОтчетыИОбработки», который будет создан при подключении печатной формы к базе. Это необходимо для того чтобы общая форма при создании на сервере вызвала модуль внешней печатной формы и создала табличный документ.

&НаКлиенте Процедура ПечатьНаКлиенте() Если Отладка Тогда мКоллекцияПечатныхФорм = УправлениеПечатьюКлиент.НоваяКоллекцияПечатныхФорм(«ШаблонОткрытиеФормы»); ТабличныйДокумент = Новый ТабличныйДокумент; КнПечатьНаСервере(мКоллекцияПечатныхФорм); Попытка ТабличныйДокумент = Объект.СтруктураПараметровПечати.КоллекцияПечатныхФормСтруктура.ТабличныйДокумент; ТабличныйДокумент.Показать(«Шаблон — открытие формы»); Исключение КонецПопытки; Иначе ПараметрыОткрытия = Новый Структура; ПолучитьПараметрыОткрытия(ПараметрыОткрытия); Если ПараметрыОткрытия = Неопределено Тогда Сообщить(«Ошибка обработки документа»); Иначе ОткрытьФорму(«ОбщаяФорма.ПечатьДокументов», ПараметрыОткрытия); КонецЕсли; Закрыть(); КонецЕсли; КонецПроцедуры &НаСервере Процедура ПолучитьПараметрыОткрытия(ПараметрыОткрытия) ИсточникДанных = Справочники.ДополнительныеОтчетыИОбработки.НайтиПоНаименованию(«Шаблон — открытие формы»); Если ИсточникДанных = Неопределено ИЛИ НЕ ТипЗнч(ИсточникДанных) = Тип(«СправочникСсылка.ДополнительныеОтчетыИОбработки») Тогда ИсточникДанных = Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка(); КонецЕсли; Если Не ЗначениеЗаполнено(ИсточникДанных) Тогда ПараметрыОткрытия = Неопределено; Возврат; КонецЕсли; ПараметрыОткрытия.Вставить(«ИсточникДанных», ИсточникДанных); ПараметрыИсточника = Новый Структура; ИдентификаторКоманды = «ШаблонОткрытиеФормы»; ПараметрыПечати = Новый Структура; ПараметрыПечати.Вставить(«ПечатьБирок», ПечатьБирок); ПараметрыПечати.Вставить(«КоличествоБирок», КоличествоБирок); СтруктураПараметровПечати = Объект.СтруктураПараметровПечати; Если СтруктураПараметровПечати = Неопределено ИЛИ НЕ ТипЗнч(СтруктураПараметровПечати) = Тип(«Структура») Тогда Если Элементы.Найти(«Документ») = Неопределено Тогда ПараметрыОткрытия = Неопределено; Возврат; Иначе Если ЗначениеЗаполнено(Документ) Тогда ТекОбъектыНазначения = Новый Массив; ТекОбъектыНазначения.Добавить(Документ); ТекОбъектыНазначения.Добавить(ПараметрыПечати); ПараметрыИсточника.Вставить(«ОбъектыНазначения», ТекОбъектыНазначения); Иначе ПараметрыОткрытия = Неопределено; Возврат; КонецЕсли; КонецЕсли; Иначе Если СтруктураПараметровПечати.Свойство(«МассивОбъектов») Тогда СтруктураПараметровПечати.МассивОбъектов.Добавить(ПараметрыПечати); ПараметрыИсточника.Вставить(«ОбъектыНазначения», СтруктураПараметровПечати.МассивОбъектов); Иначе Если ЗначениеЗаполнено(Документ) Тогда ТекОбъектыНазначения = Новый Массив; ТекОбъектыНазначения.Добавить(Документ); ТекОбъектыНазначения.Добавить(ПараметрыПечати); ПараметрыИсточника.Вставить(«ОбъектыНазначения», ТекОбъектыНазначения); Иначе ПараметрыОткрытия = Неопределено; Возврат; КонецЕсли; КонецЕсли; КонецЕсли; ПараметрыИсточника.Вставить(«ИдентификаторКоманды», ИдентификаторКоманды); ПараметрыОткрытия.Вставить(«ПараметрыИсточника», ПараметрыИсточника); ПараметрыОткрытия.Вставить(«ПараметрКоманды», ПараметрыИсточника.ОбъектыНазначения); КонецПроцедуры

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

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

Процедура Печать(МассивОбъектов = Неопределено, КоллекцияПечатныхФорм = Неопределено, ОбъектыПечати = Неопределено, ПараметрыВывода = Неопределено) Экспорт ПараметрыПечати = Неопределено; н = 0; Если НЕ МассивОбъектов = Неопределено И ТипЗнч(МассивОбъектов) = Тип(«Массив») Тогда Для Каждого мЭл Из МассивОбъектов Цикл Если ТипЗнч(мЭл) = Тип(«Структура») Тогда ПараметрыПечати = Новый Структура; ПараметрыПечати.Вставить(«ПечатьБирок», мЭл.ПечатьБирок); ПараметрыПечати.Вставить(«КоличествоБирок», мЭл.КоличествоБирок); МассивОбъектов.Удалить(н); КонецЕсли; н = н + 1; КонецЦикла; КонецЕсли; Если ПараметрыПечати = Неопределено Тогда СтруктураПараметровПечати = ЭтотОбъект.СтруктураПараметровПечати; ПараметрыПечати = Новый Структура; Если НЕ СтруктураПараметровПечати = Неопределено И ТипЗнч(СтруктураПараметровПечати) = Тип(«Структура») Тогда ПараметрыПечати.Вставить(«ПечатьБирок», СтруктураПараметровПечати.ПараметрыПечати.ПечатьБирок); ПараметрыПечати.Вставить(«КоличествоБирок», СтруктураПараметровПечати.ПараметрыПечати.КоличествоБирок); МассивОбъектов = Новый Массив; Для Каждого мЭл Из СтруктураПараметровПечати.МассивОбъектов Цикл МассивОбъектов.Добавить(мЭл); КонецЦикла; КоллекцияПечатныхФорм = Новый ТаблицаЗначений; Для Каждого ЭлСтруктуры Из СтруктураПараметровПечати.мКоллекцияПечатныхФорм Цикл КоллекцияПечатныхФорм.Колонки.Добавить(ЭлСтруктуры.Ключ); КонецЦикла; СтрКоллекцияПечатныхФорм = КоллекцияПечатныхФорм.Добавить(); ЗаполнитьЗначенияСвойств(СтрКоллекцияПечатныхФорм, СтруктураПараметровПечати.мКоллекцияПечатныхФорм); ОбъектыПечати = Новый СписокЗначений; ОбъектыПечати.ЗагрузитьЗначения(СтруктураПараметровПечати.ОбъектыПечати.ВыгрузитьЗначения()); ПараметрыВывода = Новый Структура; Для Каждого ЭлСтруктуры Из СтруктураПараметровПечати.ПараметрыВывода Цикл ПараметрыВывода.Вставить(ЭлСтруктуры.Ключ, ЭлСтруктуры.Значение); КонецЦикла; КонецЕсли; КонецЕсли; Если ПараметрыПечати = Неопределено Тогда Сообщить(«Не удалось определить параметры печати!»); Возврат; КонецЕсли; Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, «ШаблонОткрытиеФормы») Тогда УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию( КоллекцияПечатныхФорм, «ШаблонОткрытиеФормы», НСтр(«ru = ‘Шаблон — открытие формы'»), СформироватьПечатнуюФормуНакладная(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)); КонецЕсли; Если НЕ МассивОбъектов = Неопределено И ТипЗнч(МассивОбъектов) = Тип(«Массив») Тогда н = 0; Для Каждого мЭл Из МассивОбъектов Цикл Если ТипЗнч(мЭл) = Тип(«Структура») Тогда МассивОбъектов.Удалить(н); КонецЕсли; н = н + 1; КонецЦикла; КонецЕсли; Если ПараметрыВывода.Свойство(«ПараметрыОтправки») Тогда ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки( ПараметрыВывода.ПараметрыОтправки, МассивОбъектов, КоллекцияПечатныхФорм); Иначе ОбщегоНазначенияБП.ЗаполнитьДополнительныеПараметрыПечати(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода); КоллекцияПечатныхФормСтруктура = Новый Структура; Для Каждого Колонка Из КоллекцияПечатныхФорм.Колонки Цикл КоллекцияПечатныхФормСтруктура.Вставить(Колонка.Имя, КоллекцияПечатныхФорм); КонецЦикла; ЭтотОбъект.СтруктураПараметровПечати = Новый Структура(«КоллекцияПечатныхФормСтруктура,ОбъектыПечати,ПараметрыВывода», КоллекцияПечатныхФормСтруктура, ОбъектыПечати, ПараметрыВывода); КонецЕсли; КонецПроцедуры