После очередного планового обновления конфигурации 1С:Бухгалтерия предприятия 3.0 многие разработчики и администраторы столкнулись с неприятной ситуацией: перестали работать внешние печатные формы (ВПФ), в которых выводится факсимиле подписи руководителя или главного бухгалтера. При попытке сформировать печатную форму система аварийно завершает работу и выдает следующую ошибку:
Неверный второй параметр Реквизиты в функции ОбщегоНазначения.ЗначенияРеквизитовОбъекта: Поле объекта "ФайлПодписьРуководителя" не найдено
В этой статье мы подробно разберем причины возникновения данной ошибки, проанализируем изменения в архитектуре конфигурации, рассмотрим, как теперь устроено хранение факсимиле в системе, и пошагово исправим код вашей внешней печатной формы.
Для начала проанализируем, почему произошел этот сбой. Начиная с релиза 3.0.78, разработчики фирмы «1С» начали масштабную модернизацию механизма работы с факсимиле. В релизе 3.0.79.21 эти изменения были окончательно закреплены в метаданных: старые реквизиты справочника Организации были удалены либо переименованы с префиксом «Удалить».
Ранее файлы подписей руководителя и главного бухгалтера хранились непосредственно внутри карточки организации в реквизитах ФайлПодписьРуководителя и ФайлПодписьГлавногоБухгалтера справочника Организации. Это накладывало существенные ограничения: в документах можно было вывести факсимиле только основных руководителей организации. Если документ подписывал менеджер по доверенности или уполномоченный сотрудник по приказу, вывести его личную подпись стандартными средствами было невозможно.
Новая концепция хранения факсимиле выглядит так:
ФизическиеЛица (новый реквизит ФаксимилеПодписи, имеющий тип ссылки на справочник Файлы).ФайлПечать или ФайлФаксимильнаяПечать) по-прежнему хранится в справочнике Организации, так как печать принадлежит юридическому лицу, а не конкретному человеку.Поскольку реквизиты ФайлПодписьРуководителя и ФайлПодписьГлавногоБухгалтера больше не существуют в справочнике Организации, любой старый программный код, который пытается напрямую прочитать эти поля, неминуемо вызывает критическую ошибку.
Рассмотрим стандартный пример кода, который использовался в старых внешних печатных формах для получения двоичных данных подписи руководителя:
// Устаревший код, вызывающий ошибку:
ДвоичныеДанныеФайлПодписьРуководителя = Справочники.Организации.ДвоичныеДанныеКартинкиОрганизации(СсылкаНаОбъект.Организация, "ФайлПодписьРуководителя");
Для того чтобы исправить логику работы и адаптировать форму под новые релизы, нам нужно переписать этот алгоритм. Теперь получение факсимиле состоит из трех логических шагов:
ФизическиеЛица.Давайте реализуем эту цепочку в коде. Для определения ответственных лиц воспользуемся типовым общим модулем ОтветственныеЛицаБП, а для получения двоичных данных картинки обратимся к общему модулю УправлениеПечатьюБП.
Посмотрим на пример нового, корректного кода для получения подписи руководителя:
// 1. Получаем структуру ответственных лиц организации на дату документа
ОтветственныеЛицаОрганизации = ОтветственныеЛицаБП.ОтветственныеЛица(СсылкаНаОбъект.Организация, СсылкаНаОбъект.Дата);
// 2. Извлекаем руководителя (возвращается ссылка на справочник "ФизическиеЛица")
ФизическоеЛицоРуководитель = ОтветственныеЛицаОрганизации.Руководитель;
// 3. Получаем двоичные данные картинки подписи из нового общего модуля
ДвоичныеДанныеФайлПодписьРуководителя = УправлениеПечатьюБП.ДвоичныеДанныеФаксимилеФизическогоЛица(ФизическоеЛицоРуководитель);
Точно так же мы можем получить факсимиле подписи главного бухгалтера, если это требуется для макета печатной формы:
// Получаем физическое лицо главного бухгалтера
ФизическоеЛицоБухгалтер = ОтветственныеЛицаОрганизации.ГлавныйБухгалтер;
// Получаем двоичные данные его подписи
ДвоичныеДанныеФайлПодписьБухгалтера = УправлениеПечатьюБП.ДвоичныеДанныеФаксимилеФизическогоЛица(ФизическоеЛицоБухгалтер);
Для более глубокого понимания процесса работы с новыми механизмами, проанализируем структуру типовых функций, к которым мы обращаемся в общем модуле УправлениеПечатьюБП. Это поможет нам понять, как система работает "под капотом".
Первая функция — ДвоичныеДанныеФаксимилеФизическогоЛица. Она принимает ссылку на физическое лицо, обращается к прикрепленному файлу и извлекает его данные из временного хранилища:
Функция ДвоичныеДанныеФаксимилеФизическогоЛица(ФизическоеЛицо) Экспорт
ДвоичныеДанныеКартинки = Неопределено;
Если ЗначениеЗаполнено(ФизическоеЛицо) Тогда
ПрисоединенныйФайл = ПрисоединенныйФайлФаксимилеФизическогоЛица(ФизическоеЛицо);
Если ЗначениеЗаполнено(ПрисоединенныйФайл) Тогда
ДанныеКартинки = РаботаСФайлами.ДанныеФайла(ПрисоединенныйФайл);
ДвоичныеДанныеКартинки = ПолучитьИзВременногоХранилища(ДанныеКартинки.СсылкаНаДвоичныеДанныеФайла);
КонецЕсли;
КонецЕсли;
Возврат ДвоичныеДанныеКартинки;
КонецФункции
Эта функция, в свою очередь, использует вспомогательную функцию ПрисоединенныйФайлФаксимилеФизическогоЛица, которая напрямую считывает реквизит ФаксимилеПодписи из справочника ФизическиеЛица:
Функция ПрисоединенныйФайлФаксимилеФизическогоЛица(ФизическоеЛицо) Экспорт
ПрисоединенныйФайл = Справочники.Файлы.ПустаяСсылка();
Если ЗначениеЗаполнено(ФизическоеЛицо) Тогда
ПрисоединенныйФайл = ОбщегоНазначения.ЗначениеРеквизитаОбъекта(ФизическоеЛицо, "ФаксимилеПодписи");
КонецЕсли;
Возврат ПрисоединенныйФайл;
КонецФункции
Как мы видим, код написан очень аккуратно, использует стандартные функции БСП для работы с файлами и кэшем и гарантирует быстрое получение картинки без лишних СУБД-запросов.
Давайте объединим полученные знания в один готовый шаблон. Вы можете использовать этот фрагмент в модуле объекта вашей внешней печатной формы в процедуре заполнения параметров макета. Мы добавим проверку на заполненность полученных картинок, чтобы избежать непредвиденных ошибок при выводе в табличный документ:
// Инициализируем переменные для картинок подписей
КартинкаРуководителя = Неопределено;
КартинкаБухгалтера = Неопределено;
// Получаем ответственных лиц на дату документа
ПараметрыОрганизации = Новый Структура("Организация, Дата", СсылкаНаОбъект.Организация, СсылкаНаОбъект.Дата);
ОтветственныеЛица = ОтветственныеЛицаБП.ОтветственныеЛица(ПараметрыОрганизации.Организация, ПараметрыОрганизации.Дата);
// Обрабатываем подпись руководителя
Если ЗначениеЗаполнено(ОтветственныеЛица.Руководитель) Тогда
ДвоичныеДанныеРуководителя = УправлениеПечатьюБП.ДвоичныеДанныеФаксимилеФизическогоЛица(ОтветственныеЛица.Руководитель);
Если ДвоичныеДанныеРуководителя <> Неопределено Тогда
КартинкаРуководителя = Новый Картинка(ДвоичныеДанныеРуководителя);
КонецЕсли;
КонецЕсли;
// Обрабатываем подпись главного бухгалтера
Если ЗначениеЗаполнено(ОтветственныеЛица.ГлавныйБухгалтер) Тогда
ДвоичныеДанныеБухгалтера = УправлениеПечатьюБП.ДвоичныеДанныеФаксимилеФизическогоЛица(ОтветственныеЛица.ГлавныйБухгалтер);
Если ДвоичныеДанныеБухгалтера <> Неопределено Тогда
КартинкаБухгалтера = Новый Картинка(ДвоичныеДанныеБухгалтера);
КонецЕсли;
КонецЕсли;
// Пример вывода в область макета (предполагаем, что в макете есть рисунки "ПодписьРуководителя" и "ПодписьБухгалтера")
Если КартинкаРуководителя <> Неопределено Тогда
ОбластьМакета.Рисунки.ПодписьРуководителя.Картинка = КартинкаРуководителя;
КонецЕсли;
Если КартинкаБухгалтера <> Неопределено Тогда
ОбластьМакета.Рисунки.ПодписьБухгалтера.Картинка = КартинкаБухгалтера;
КонецЕсли;
Применяя данный подход, мы не только избавляемся от критической ошибки Поле объекта "ФайлПодписьРуководителя" не найдено, но и приводим код наших разработок в полное соответствие с актуальными стандартами и архитектурными решениями фирмы «1С». Это гарантирует стабильную работу ваших печатных форм при последующих обновлениях конфигурации 1С:Бухгалтерия предприятия 3.0.