Переход с платформы 1С 8.х на 1С 7.7 часто вызывает у начинающих разработчиков замешательство. Архитектура старой платформы значительно отличается: здесь нет привычных систем компоновки данных (СКД), объектов «Параметры» в макетах и четкого разделения на данные и оформление в том виде, к которому мы привыкли. В данной статье мы подробно разберем, как доработать печатную форму счета-фактуры в конфигурации «Бухгалтерский учет для Украины» (или аналогичных), если макет хранится во внешнем файле .mxl, а данные необходимо подтянуть из подчиненных справочников.
Для начала проанализируем, как 1С 7.7 понимает, что именно нужно вывести на печать. В отличие от восьмой версии, где макет — это чаще всего часть объекта конфигурации, в семерке печатные формы часто выносятся во внешние файлы. Рассмотрим основные типы файлов, которые могут встретиться в папке ExtForms\PrnForms:
.ert.В нашем случае используется прямой вызов внешнего макета из кода документа с помощью метода Таб.ИсходнаяТаблица(ПутьКФайлу). Это означает, что логика подготовки данных остается в модуле документа, а макет лишь визуализирует их.
Разберем важнейший аспект: как данные из кода попадают в ячейку таблицы. В 1С 7.7 нет метода Параметры.ИмяПараметра = Значение. Вместо этого используется прямое обращение к переменным, которые находятся в области видимости процедуры Печать().
Когда вы вызываете Таб.ВывестиСекцию("Шапка"), система «просматривает» все ячейки в этой секции. Если в свойствах ячейки установлен тип Выражение, 1С пытается вычислить то, что там написано, обращаясь к переменным модуля.
Рассмотрим пошагово, как добавить новый реквизит (например, банк контрагента):
SF3_ukr.mxl в Конфигураторе.БанкКонтрагента.Теперь нам нужно сделать так, чтобы в коде процедуры Печать() эта переменная была определена и заполнена до момента вызова секции.
В конфигурации «Бухгалтерия для Украины» 7.7 (и многих других) расчетные счета не являются реквизитами справочника Контрагенты. Они хранятся в подчиненном справочнике РасчетныеСчета. Это означает, что мы не можем просто написать Контрагент.РасчетныйСчет.
Проанализируем ситуацию: у одного контрагента может быть несколько счетов. Нам нужно выбрать один (основной или первый попавшийся). Выясним, как это реализовать программно. Рассмотрим пример кода, который необходимо вставить в начало процедуры Печать():
// Объявляем переменные, которые мы вписали в макет
Переменная НомерСчета, НазваниеБанка, МФОБанка;
// Создаем объект для работы со справочником расчетных счетов
СпрРС = СоздатьОбъект("Справочник.РасчетныеСчета");
// Устанавливаем фильтр по владельцу (нашему контрагенту из документа)
СпрРС.ИспользоватьВладельца(Контрагент);
// Пытаемся найти хотя бы один счет
Если СпрРС.ВыбратьЭлементы() = 1 Тогда
// Получаем первый найденный элемент
СпрРС.ПолучитьЭлемент();
НомерСчета = СпрРС.НомерСчета;
НазваниеБанка = СпрРС.Банк.Наименование;
МФОБанка = СпрРС.Банк.Код;
Иначе
НомерСчета = "Не указан";
НазваниеБанка = "";
МФОБанка = "";
КонецЕсли;
// Теперь формируем общую строку для вывода
БанкКонтрагента = "р/р " + НомерСчета + " в " + НазваниеБанка + " МФО " + МФОБанка;
После того как переменная БанкКонтрагента заполнена, при выполнении команды Таб.ВывестиСекцию("Шапка") значение автоматически отобразится в макете.
В типовых конфигурациях 1С 7.7 разработчики часто создавали универсальные функции в Глобальном модуле, чтобы не писать один и тот же код в разных документах. Перед тем как писать свой велосипед, рекомендуется проверить наличие функций, начинающихся на гл....
Например, в украинских конфигурациях часто встречается функция глПредставлениеРасчетногоСчета(Контрагент). Она уже содержит логику поиска основного счета и форматирования строки. В этом случае задача упрощается до одной строки в коде:
БанкКонтрагента = глПредставлениеРасчетногоСчета(Контрагент);
Рассмотрим подробнее проблемы, с которыми сталкиваются новички при работе с внешними таблицами:
Банк_Контрагента (с подчеркиванием), а в коде БанкКонтрагента, система выдаст ошибку "Переменная не определена" или просто выведет пустое поле.Пока ПолучитьСтроку() = 1 Цикл, она не будет доступна в секции "Шапка", которая выводится до цикла. Всегда определяйте общие данные до вывода соответствующих секций.Подведем итог и составим четкий план действий по редактированию счета в 1С 7.7:
.mxl, добавляем ячейки, задаем им тип Выражение или Шаблон и придумываем имена переменных.Печать() создаем эти переменные.СоздатьОбъект для поиска данных в справочниках или вычисляем значения на основе реквизитов документа.Помните, что 1С 7.7 очень чувствительна к синтаксису и путям к файлам. Если вы редактируете внешний макет, убедитесь, что вы правите именно тот файл, который прописан в константах или функции _глПолучитьИмяФайлаПечатнойФормы. Теперь, понимая механизм связи кода и визуальной части, вы сможете легко дорабатывать любые печатные формы этой легендарной платформы.