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