Как адаптировать печатную форму ТТН (СП-31) из 1С:Бухгалтерии для работы в 1С:УНФ?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет
← На главную

Перенос программного кода между различными конфигурациями «1С:Предприятие 8» часто сопровождается ошибками компиляции. Это связано с тем, что каждая конфигурация (например, «Бухгалтерия предприятия» (БП) и «Управление нашей фирмой» (УНФ)) имеет свой уникальный набор общих модулей, структуру метаданных и программный интерфейс (API). В данной статье мы разберем ситуацию, когда внешняя печатная форма, предназначенная для БП, выдает ошибки в УНФ, и пошагово исправим их.

Анализ возникшей проблемы и причин ошибок

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

Кроме того, в тексте запроса часто фигурирует объект Документ.РеализацияТоваровУслуг, который в УНФ заменен на Документ.РасходнаяНакладная. Таким образом, для успешной работы нам необходимо выполнить «рефакторинг» кода: заменить обращения к модулям, изменить имена документов и полей, а также адаптировать логику получения ответственных лиц.

Шаг 1. Исправление функции регистрации обработки

Первым делом проанализируем функцию СведенияОВнешнейОбработке. Для того чтобы печатная форма появилась в списке команд нужного нам документа в УНФ, необходимо правильно указать назначение.

Вместо Документ.РеализацияТоваровУслуг используем актуальный для УНФ объект:


МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.РасходнаяНакладная");
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);

Также обратим внимание на тип команды. Если мы планируем формировать только печатную форму без сложной клиентской логики, в параметре Использование лучше указать ВызовСерверногоМетода, что упростит взаимодействие между клиентом и сервером.

Шаг 2. Адаптация запроса к метаданным УНФ

Рассмотрим структуру запроса. В конфигурации БП и УНФ названия реквизитов часто различаются. Например, в УНФ нет ПодразделениеОрганизации (используется СтруктурнаяЕдиница), а адрес доставки может храниться иначе.

Проанализируем пример исправленного фрагмента запроса для УНФ:


ТекстЗапроса =
"ВЫБРАТЬ
|   РасходнаяНакладная.Ссылка КАК Ссылка,
|   РасходнаяНакладная.Номер КАК Номер,
|   РасходнаяНакладная.Дата КАК Дата,
|   РасходнаяНакладная.Организация КАК Организация,
|   РасходнаяНакладная.Контрагент КАК Контрагент,
|   РасходнаяНакладная.СуммаДокумента КАК СуммаДокумента,
|   РасходнаяНакладная.ЗаказПокупателя.АдресДоставки КАК АдресДоставки,
|   РасходнаяНакладная.Товары.(
|       Номенклатура КАК Номенклатура,
|       Количество КАК Количество,
|       Цена КАК Цена,
|       Сумма КАК Сумма
|   ) КАК Товары
|ИЗ
|   Документ.РасходнаяНакладная КАК РасходнаяНакладная
|ГДЕ
|   РасходнаяНакладная.Ссылка В(&МассивОбъектов)";

Важный момент: если данные о водителе и марке автомобиля не хранятся в стандартных реквизитах, их нужно будет извлекать из Дополнительных реквизитов документа через обращение к табличной части ДополнительныеРеквизиты или с помощью функции УправлениеСвойствами.ЗначениеСвойства.

Шаг 3. Замена функций получения сведений об организации

Теперь выясним причину основной ошибки. В БП за получение данных юрлица отвечает БухгалтерскийУчетПереопределяемый. В УНФ основным поставщиком таких данных является модуль УправлениеНебольшойФирмойСервер.

Разберем замену строк получения сведений. Вместо старого кода:


СведенияОПоставщике = БухгалтерскийУчетПереопределяемый.СведенияОЮрФизЛице(Шапка.Организация, Шапка.Дата);

Используем следующий вариант для УНФ:


СведенияОПоставщике = УправлениеНебольшойФирмойСервер.СведенияОЮрФизЛице(Шапка.Организация, Шапка.Дата);

Этот модуль вернет структуру, содержащую поля НаименованиеДляПечатныхФорм, ИНН, ЮридическийАдрес и другие, которые необходимы для заполнения макета СП-31.

Шаг 4. Получение ответственных лиц (подписи)

Ошибка ОтветственныеЛицаБП исправляется аналогичным образом. В УНФ информация о руководителе и главном бухгалтере хранится в регистре сведений «Ответственные лица», и для её получения существует специальная функция.

Проанализируем способ получения данных в УНФ:


// Вместо ОтветственныеЛицаБП.ОтветственныеЛица(...)
ПараметрыОтветственных = УправлениеНебольшойФирмойСервер.ПолучитьОтветственныхЛицОрганизации(Шапка.Организация, Шапка.Дата);

// Заполняем параметры макета
ОбластьМакета.Параметры.ДолжностьРуководителя = ПараметрыОтветственных.РуководительДолжность;
ОбластьМакета.Параметры.ФИОРуководителя       = ПараметрыОтветственных.РуководительФИО;

Обратите внимание, что имена полей в возвращаемой структуре могут отличаться (например, РуководительФИО вместо РуководительПредставление). Рекомендуем проверять состав структуры в режиме отладки.

Шаг 5. Работа с весовыми показателями (Брутто, Нетто)

Форма СП-31 является специализированной (товарно-транспортная накладная на перевозку зерна или сельхозпродукции), поэтому в ней критически важны параметры веса. В исходном коде использовались обращения к ЭтотОбъект.Брутто. Поскольку в печатной форме ЭтотОбъект — это сама обработка, данные должны либо вводиться пользователем в форму обработки, либо извлекаться из данных документа.

Посмотрим, как можно рассчитать нетто, исходя из данных номенклатуры в УНФ:


Для Каждого СтрокаТовара Из Шапка.Товары.Выгрузить() Цикл
    // В УНФ вес часто хранится в реквизите Номенклатура.ВесЧислитель
    // или рассчитывается через единицы измерения
    ВесСтроки = СтрокаТовара.Количество * СтрокаТовара.Номенклатура.Вес; 
    ИтогоНетто = ИтогоНетто + ВесСтроки;
КонецЦикла;

Если же в вашей базе используются дополнительные реквизиты для фиксации веса прицепа и тары, необходимо добавить их получение в ТекстЗапроса.

Рекомендации по финальной отладке

  1. Используйте консоль запросов: Прежде чем вставлять код запроса в модуль обработки, проверьте его в консоли запросов непосредственно в базе УНФ. Это позволит убедиться, что все поля (Организация, Контрагент, СуммаДокумента) выбраны правильно.
  2. Проверка прав доступа: Убедитесь, что у пользователя, запускающего печать, есть права на чтение регистра ОтветственныеЛица и справочника Организации.
  3. Префиксация номеров: Для вывода номера документа без лишних нулей и префиксов в УНФ продолжаем использовать стандартную функцию: ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Шапка.Номер, Истина, Ложь).

Таким образом, последовательная замена объектов метаданных и обращений к специфическим модулям БП на универсальные или специализированные модули УНФ (УправлениеНебольшойФирмойСервер) позволяет успешно адаптировать любую печатную форму.

← На главную