вторник, 30 ноября 2010 г.

1C начинается тут. Вывод на печать параметров документа, не сохраненного в БД.

Будем по-тихоньку изучать разработку конфигураций для 1С "Предприятие".
Для начала лишь пару слов, которых будет достаточно, чтобы вникнуть в суть языка программирования 1С: "всё - объекты". Любая часть конфигурации: справочники, документы - это все объекты. Оно и правильно, оно и удобно. Только проблема в том, что есть определенное ограничение на создаваемые объекты. Если в любом ООП языке любой объект - это определенный тип данных с определенными полями и методами, задаваемыми самим разработчиком, которые можно создавать динамически, на лету, то в 1С такое не прокатит. В 1С перечень возможных объектов ограничивается настройками Конфигурации, т.е. если описан объект "Справочники.Тест", у которого есть поле "Параметр", то в коде нельзя будет изменить этот объект, создав у него, например, новое поле:
Объект = Новый Справочники.Тест;
Объект.Параметр = 1; // предположительно, что значение - целое число
Объект.НовыйПараметр = 2; //компилятор выдаст ошибку, что это поле неизвестно

Я уж молчу про минимальное наследование. Хотя это и не обязано быть, ибо язык в 1С чисто условный, его сложно назвать полноценным языком программирования.

И вот конкретный пример. Есть документ в конфигурации Документ.ЗаменаКартриджа (документ о замене картриджа для принтера), соответственно, есть и объект Справочники.Картридж. Задача - воспользовавшись конструктором печати, вывести в Макет Код и Наименование картриджа.
Это именно отдельная задача, ибо по дефолту конструктор использует только заранее о
87;ределенные поля документа ЗаменаКартриджа, т.е. ЗаменяемыйКартридж, и, после привязки Макета к процедуре Печать(), сгенерированной конструктором, в поле Макета <ЗаменяемыйКартридж> вставляется наименование экземпляра объекта Справочники.Картридж. А как же вывести код картриджа?
А вот так:

Шапка = Макет.ПолучитьОбласть("Шапка");

Шапка.Параметры.Заполнить(ЭтотОбъект);

Шапка.Параметры.ЗаменяемыйКартриджНаименование =
ЭтотОбъект.ЗаменяемыйКартридж.Наименование;
Шапка.Параметры.ЗаменяемыйКартриджКод =
ЭтотОбъект.ЗаменяемыйКартридж.Код;

Т.е. я соответствующей ячейке Макета, желая выводить данные по картриджу в виде "Код (Наименование)", выбрал тип данных "Шаблон" (в нем можно группировать Параметры с Текстом) и прописал
[ЗаменяемыйКартриджКод] ([ЗаменяемыйКартриджНаименование])

Т.е. в [] я определил названия дополнительных параметров Макета.
Соответственно, осталось лишь руками изменить код процедуры Печать(), заполнив соответствующие поля Макета данными, полученным из формы Документа, которые в процедуру поступают в виде объекта документа ЭтотОбъект (аналог ООПшного this).

Комментариев нет: