Переработка внешней печатной формы — это стандартная, но кропотливая задача для разработчика 1С. Часто возникает ситуация, когда имеется готовая обработка для одного документа (например, СчетФактураВыданный), и её нужно адаптировать под другой (РеализацияТоваровУслуг), сохранив при этом специфический функционал, такой как интерактивный выбор подписантов перед печатью. Рассмотрим этот процесс подробно на примере конфигурации «Бухгалтерия сельскохозяйственного предприятия», базирующейся на типовой «Бухгалтерии предприятия 3.0».
Когда вы пытаетесь запустить обработку, написанную для одного документа, в контексте другого, основной проблемой становится несоответствие структуры метаданных. Сообщение «Нет данных для вывода» чаще всего свидетельствует о том, что запрос к базе данных вернул пустую выборку. Проанализируем, почему это происходит:
Документ.СчетФактураВыданный. При попытке получить данные для документа Реализация, этот запрос либо падает с ошибкой, либо (если есть условия по ссылкам) возвращает пустоту.Товары, Услуги, ОсновныеСредства.Грузоотправитель или Грузополучатель, в Счете-фактуре могут заполняться по иным алгоритмам, чем в РТУ.Для исправления ситуации необходимо в первую очередь зайти в модуль объекта внешней обработки и найти функцию, отвечающую за формирование данных (обычно это СформироватьПечатнуюФорму или аналогичная). Разберем по шагам, как изменить код.
Прежде чем менять код, проанализируем текущую логику работы. Как было верно замечено в обсуждении, следует установить точку останова в процедуре ВыполнитьОткрытиеПечатнойФормы на стороне клиента или в процедуре Печать в модуле объекта.
Посмотрим на пример того, как обычно вызывается печать в управляемых формах:
&НаКлиенте
Процедура ВыполнитьОткрытиеПечатнойФормы(Команда)
// Устанавливаем точку останова здесь
ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыПечати");
// Проверяем, какой массив ссылок передается в обработку
КонецПроцедуры
Если вы видите, что запрос обращается к Документ.СчетФактураВыданный, его необходимо полностью переписать под Документ.РеализацияТоваровУслуг.
Если ваша задача — выбирать подписантов (Директора, Бухгалтера, Кладовщика) вручную перед выводом на печать, стандартный механизм БСП (Библиотеки стандартных подсистем) «запрос-печать» требует дополнения. Рассмотрим, как реализовать вспомогательную форму выбора.
В состав внешней обработки должна входить форма (например, ФормаВыбораПодписантов). Логика работы должна быть следующей:
ФизическиеЛица.Проанализируем пример кода для передачи параметров:
// В модуле формы выбора
&НаКлиенте
Процедура Сформировать(Команда)
ПараметрыПодписей = Новый Структура;
ПараметрыПодписей.Вставить("Руководитель", Объект.Руководитель);
ПараметрыПодписей.Вставить("ГлавныйБухгалтер", Объект.ГлавныйБухгалтер);
Закрыть(ПараметрыПодписей); // Передаем структуру в ОповещениеОЗакрытии
КонецПроцедуры
Разберем, как должен выглядеть запрос для получения данных из документа «Реализация товаров и услуг». В отличие от Счета-фактуры, нам нужно объединить данные из нескольких табличных частей.
ВЫБРАТЬ
РеализацияТоваровУслугТовары.Номенклатура КАК Номенклатура,
РеализацияТоваровУслугТовары.Количество КАК Количество,
РеализацияТоваровУслугТовары.Цена КАК Цена,
РеализацияТоваровУслугТовары.Сумма КАК Сумма
ПОМЕСТИТЬ ВТ_Данные
ИЗ
Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
ГДЕ
РеализацияТоваровУслугТовары.Ссылка В(&МассивСсылок)
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РеализацияТоваровУслугУслуги.Номенклатура,
РеализацияТоваровУслугУслуги.Количество,
РеализацияТоваровУслугУслуги.Цена,
РеализацияТоваровУслугУслуги.Сумма
ИЗ
Документ.РеализацияТоваровУслуг.Услуги КАК РеализацияТоваровУслугУслуги
ГДЕ
РеализацияТоваровУслугУслуги.Ссылка В(&МассивСсылок)
Важный момент: Если вы работаете в конфигурации для сельского хозяйства, обратите внимание на специфические реквизиты. Например, для вывода данных в отраслевые формы (типа СП-31) могут потребоваться данные о подразделении (ферме) или автомобиле перевозчика, которые отсутствуют в обычном Счете-фактуре.
В типовых решениях 1С 8.3 для получения подписей часто используются методы общих модулей. Если пользователь не выбрал подписантов вручную, система должна подтянуть их автоматически. Для этого рекомендуется использовать функцию ОтветственныеЛицаБП.ОтветственныеЛица(...).
Рассмотрим, как программно получить ответственных лиц организации на дату документа:
ДанныеПечати = ОтветственныеЛицаБП.ОтветственныеЛица(Шапка.Организация, Шапка.Дата);
РуководительФИО = ДанныеПечати.РуководительФИО;
ГлавныйБухгалтерФИО = ДанныеПечати.ГлавныйБухгалтерФИО;
Если же ваша обработка предполагает расширенный список (например, «Агроном» или «Бригадир»), вам придется обращаться к регистру сведений Ответственные лица с фильтром по соответствующей должности, специфичной для сельскохозяйственного предприятия.
Чтобы система «понимала», что обработка теперь относится к другому документу, необходимо изменить функцию СведенияОПечатнойФорме(). Это программный интерфейс БСП.
Проанализируем структуру регистрации:
Функция СведенияОПечатнойФорме() Экспорт
ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке();
ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма();
// Обязательно указываем правильный тип документа!
ПараметрыРегистрации.Назначение.Добавить("Документ.РеализацияТоваровУслуг");
ПараметрыРегистрации.Наименование = "Реализация с выбором подписантов";
ПараметрыРегистрации.БезопасныйРежим = Ложь;
НоваяКоманда = ПараметрыРегистрации.Команды.Добавить();
НоваяКоманда.Представление = "Печать с выбором подписей";
НоваяКоманда.Идентификатор = "РеализацияСПодписями";
НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(); // Для вызова формы выбора
Возврат ПараметрыРегистрации;
КонецФункции
Обратите внимание на использование ТипКомандыОткрытиеФормы(). Если вы хотите сначала открывать форму выбора, а не сразу отправлять документ на принтер, это критически важно. В противном случае сработает стандартный метод Печать() в модуле объекта, и вы не успеете задать вопрос пользователю о составе подписантов.
Выясним, на чем чаще всего спотыкаются разработчики при такой адаптации:
ПрефиксацияОбъектовКлиентСервер.НомерНаПечать() для единообразия.Контрагенты или Организации. В макете СФ они могут выводиться одной строкой. Убедитесь, что ваш запрос корректно извлекает полное наименование и адрес.{СчетФактураНомер}, а вы передаете {НомерДокумента}, данные не отобразятся. Тщательно проверьте имена параметров в табличном документе.Подводя итог, можно сказать, что задача сводится к трем составляющим: корректная регистрация обработки для нового типа документа, полное переписывание текста запроса под структуру таблиц РеализацияТоваровУслуг и настройка передачи выбранных физических лиц в параметры макета. При соблюдении этих шагов ошибка «Нет данных для вывода» исчезнет, а функционал выбора подписантов будет работать корректно.