День добрый.
Программа ЗУП 3. Есть внешняя печатная форма документа "Увольнение списком". Надо распечатать информацию только по выделенным строкам.
Как это делается? Нужен принцип и(или) пример реализации.
Как передаются выделенные строки в документ?
---
Возможно поможет http://infostart.ru/public/191796/ , там, конечно, "Передача параметров/значений во внешнюю печатную форму для конфигураций на БСП (1С:Предприятие 8.2/8.3)", но принцип, скорее всего, тот же.
---
надо писать свою внешнюю печатную форму
---
это понятно, вопрос в том: как передать в печатную форму выделенные строки?
---
а не проще в писке сделать галочки типа "булево" и по признаку Истина выводить их на печ. форму?
---
Отдельно выделенные строки распечатать не получится, проще отредактировать печатную форму документа
---
Возможно поможет http://infostart.ru/public/191796/ , там, конечно, "Передача параметров/значений во внешнюю печатную форму для конфигураций на БСП (1С:Предприятие 8.2/8.3)", но принцип, скорее всего, тот же.
---
я прочитал данную статью, но в ней, как я понял, просто открывается форма с одной галочкой, которую надо заполнить или не заполнить и потом осуществляется печать.
Насколько я понимаю можно сделать так: показать такую же форму со всеми строками документа и в ней уже осуществить выбор нужных строки и через допараметры передать дальше в процедуру печати.
Получается выделенные строки нельзя никак передать в печатную форму?
---
(3)я прочитал данную статью, но в ней, как я понял, просто открывается форма с одной галочкой, которую надо заполнить или не заполнить и потом осуществляется печать.
Насколько я понимаю можно сделать так: показать такую же форму со всеми строками документа и в ней уже осуществить выбор нужных строки и через допараметры передать дальше в процедуру печати.

Да.

(7) Получается выделенные строки нельзя никак передать в печатную форму?

Можно но с изменением конфигурации.
Потребуется программно в документе, открывать ВПФ в которую передать (параметрами формы) выделенные строки.
Дальше по алгоритму из http://infostart.ru/public/191796/
---
Сделал по его образцу в ЗУП 3.1 но выходит ошибка:

```1c
    {ВнешняяОбработка.ПечатьТ61СВыборомСотрудниковДляПечати.Форма.Форма.Форма(162)}: Поле объекта не обнаружено (ДополнительнаяОбработкаСсылка)
    ПараметрыОткрытия.ИсточникДанных = ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка;
```

А вот исходная процедура:

```1c
    &НаКлиенте
    Процедура ВыполнитьОткрытиеПечатнойФормы(Команда)

    ВыполняемаяКоманда = Параметры;

    СтандартнаяОбработка = Истина;

    //Определение и заполнение штатных параметров для общей формы ПечатьДокументов
    ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника");
    ПараметрыОткрытия.ИсточникДанных = ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка;
    ПараметрыОткрытия.ПараметрыИсточника = Новый Структура("ИдентификаторКоманды, ОбъектыНазначения");
    ПараметрыОткрытия.ПараметрыИсточника.ИдентификаторКоманды = ВыполняемаяКоманда.ИдентификаторКоманды;

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

    //Еще какие-то значения
    //ДополнительныеПараметры.Вставить("РеквизитФормы1", РеквизитФормы1);
    //ДополнительныеПараметры.Вставить("РеквизитФормы2", РеквизитФормы2);

    //В массиве ОбъектыНазначения будут содержаться ссылки на вызвавший форму объект (документ, справочник)
    // и наши значения из реквизитов формы или обработки
    ОбъектыНазначения = Новый СписокЗначений;
    ОбъектыНазначения.Добавить(ДополнительныеПараметры);

    //Ссылки на вызвавшие форму объекты
    Для каждого ОбъектНазначения Из ВыполняемаяКоманда.ОбъектыНазначения Цикл
    ОбъектыНазначения.Добавить(ОбъектНазначения);
    КонецЦикла; //Для каждого ОбъектНазначения Из
    ПараметрыОткрытия.ПараметрыИсточника.ОбъектыНазначения = ОбъектыНазначения;

    //Вывод сформированного табличного документа в штатную форму.
    ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия);

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

Не в курсе что это может быть? И как правильно передать в новую БСП объекты печати?
---
Проверь наличие Ключевых Параметров Форма
ДополнительнаяОбработкаСсылка типа СправочникСсылка.ДополнительныеОтчетыИОбработки
ИдентификаторКоманды тип строка
ИмяФормы тип строка
ОбъектыНазначения произвольный

(19) ПараметрыОткрытия.ИсточникДанных = ВыполняемаяКоманда.ДополнительнаяОбработкаСсылка;

Отладчиком на данной строке. и открывай ВПФ.
---
Проверь наличие Ключевых Параметров Форма

спасибо, намучался пару дней, а оказывается свойство Ключевой для параметра не стояло
---
Выделение строк в форме происходит на клиенте и в объекте "Форма", а печать - на сервере и через запрос к базе данных. Возможно, наверное, передать в процедуру печати номера выделенных строк, а уже по этим номерам создать запрос к базе данных и процедуру печати
---
передать в процедуру печати номера выделенных строк собственно, в передаче вся сложность, поэтому и посчитал, что передать массив строк во внешнюю печатную форму проще, чем разобраться с каскадом заумных стандартных обработчиков. Тем более, что надо ещё обрабатывать ситуацию "выделена одна строка".
---
Тем более, что надо ещё обрабатывать ситуацию "выделена одна строка
Зачем? Достаточно использовать массив с одним элементом.
---
В интерфейсном смысле - когда пользователь вызывает отдельную форму для печати выделенных строк, он понимает, что напечатается одна выделенная строка, а не весь документ.
---
да именно, что сложность в передаче. Теоретически можно передать массив сотрудников через стандартные процедуры печати, которые создают структуры и запихивают в них одни и те же данные несколько раз, но это, наверное, не самое изящное решение
---
Массив выделенных строк можно получить на клиенте через:

```1c
    МассивСтрок = ЭтаФорма.Элементы.Материалы.ВыделенныеСтроки;
```

Этот массив строк передается в процедуру печати на сервер, где строится запрос с условием:

```1c
    ГДЕ
    ПоступлениеМЗМатериалы.НомерСтроки В (&МассивСтрок)
    И ПоступлениеМЗМатериалы.Ссылка = &Ссылка
```

Все. Только нужно учесть, что в МассивеСтрок хранятся индексы, а не номера строк.

Здесь "Материалы" - это табличная часть "Материалы" документа "ПоступлениеМЗ". В ЗУПе табличная часть будет иметь другое название, например: "Сотрудники".
---
это я знаю))) Сам механизм типовой передачи очень негибок, почему они не создали структуру которую тащили бы с самого начала до конца?
А то создают какие-то дополнительные параметры, передают что-то, а важной фишки нет
---
чем закончилось, не поделитесь ли обработкой, мне как раз для ЗУП надо, но для другого документа
---
Может, пользователя устроит вариант выделить на предпросмотре нужные строки и в настройках принтера при печати указать печать выделенной области?
Извините, что я тут со своими глупостями :)
---
Я не сторонник излишне общительных печатных форм ) Когда пользователи начинают печатать документы за месяц, ошибок от этих диалогов становится в разы больше, так как торопятся и промахиваются.
---
В том то и дело, что если в передаваемую структуру добавить что-то своё, то может нарушится работа некоторых типовых печатных форм. Уже натыкался.
---
всем спасибо, кто помогал! Печатную форму сделал.
---
Еще бы на писал бы как, вообще цены не было бы)
---
Для табличной части внешней обработки примерно вот так это выглядит:

```1c
    НаКлиенте
    МассивВыделенныхСтрок = Новый Массив;
    МассивВыделенныхСтрок = ЭтаФорма.ТабличнаяЧастьМатериалы.ВыделенныеСтроки;
    Если МассивВыделенныхСтрок.Количество()>0 Тогда
    //значения в массиве рекомендуется сортировать, т.к. индексы выстраиваются по своим правилам
    СписокДляСортировкиЗначенийМассива = Новый СписокЗначений;
    СписокДляСортировкиЗначенийМассива.ЗагрузитьЗначения(МассивВыделенныхСтрок);
    СписокДляСортировкиЗначенийМассива.СортироватьПоЗначению(НаправлениеСортировки.Возр);
    МассивДляОбработки = СписокДляСортировкиЗначенийМассива.ВыгрузитьЗначения();
    Печать_Сервере(МассивДляОбработки );//в массиве индексы строк
    КонецЕсли;

    НаСервере
    Для Каждого СтрокаМассиваИндексовСтрок Из МассивДляОбработки Цикл
    СтрокаТабличнойЧастиМатериаловПоИндексуВыделеннойСтроки = Объект.ТабличнаяЧастьМатериалы.Получить(СтрокаМассиваИндексовСтрок);
    //получаем значения реквизитов из строки табличной части
    КоличествоМатериалов = СтрокаТабличнойЧастиМатериаловПоИндексуВыделеннойСтроки.Количество;
    КонецЦикла
```
---
Небольшое, но важное исправление:
вместо

```1c
    СтрокаТабличнойЧастиМатериаловПоИндексуВыделеннойСтроки = Объект.ТабличнаяЧастьМатериалы.Получить(СтрокаМассиваИндексовСтрок);
```

нужно использовать

```1c
    СтрокаТабличнойЧастиМатериаловПоИндексуВыделеннойСтроки = Объект.ТабличнаяЧастьМатериалы.НайтиПоИдентификатору(СтрокаМассиваИндексовСтрок);
```
---
```1c
    &НаКлиенте
    Процедура Печать(ИдентификаторКоманды, МассивОбъектов) Экспорт

    Для Каждого СсылкаНаДокумент Из МассивОбъектов Цикл

    ПараметрыФормы = Новый Структура("Ключ", СсылкаНаДокумент);
    Форма = ПолучитьФорму("Документ.ИзменениеПлановыхНачислений.Форма.ФормаДокумента", ПараметрыФормы);
    // табличная часть Сотрудники на форме имеет имя ПоказателиСотрудников!
    мВыделенныеСтроки = Форма.Элементы.ПоказателиСотрудников.ВыделенныеСтроки;

    мСтруктураОкладов = НачисленияСотрудников(СсылкаНаДокумент, мВыделенныеСтроки);

    ЗаполнитьДокументWord(СсылкаНаДокумент, мСтруктураОкладов);

    КонецЦикла;

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

```1c
    &НаСервере
    Функция НачисленияСотрудников(СсылкаНаДокумент, мВыделенныеСтроки)

    мСтруктураОкладов = Новый Массив;

    // отбираем только выделенных в ТЧ сотрудников
    мВыделенныеСотрудники = Новый Массив;

    Для каждого Стр Из мВыделенныеСтроки Цикл
    мВыделенныеСотрудники.Добавить(СсылкаНаДокумент.Сотрудники[Стр].Сотрудник);
    КонецЦикла;

    Для каждого Строка Из мВыделенныеСотрудники Цикл
```