Информационные системы
Архив выпусков рассылки

1С:Предприятие

Учебник
Рассылка
Курс лекций
Статьи
Программы
Ссылки

Информационные технологии

Инф. системы
Технология .Net
Модель города
Книги и статьи

ЭРА

Интересное

Психология
Философия
Фантастика
Помощь студенту
Гостевая книга
Ссылки

Форум

mista.ru / Рассылка / Выпуск 14
Волшебство программирования на 1С:Предприятие 7.7 и 8.0
Выпуск 14 / 04.11.2002

Здравствуйте! Сегодня мы продемонстрируем, насколько сильно различаются стили программирования для версии 7.7 и 8.0. Попробуем написать небольшой отчет в версии 7.7 и попробуем примерно представить, как он будет выглядеть в версии 8.0.

Допустим, в конфигурации есть справочник Клиенты. Кроме того, есть регистр остатков Долги, который показывает задолженность каждого клиента перед фирмой. Необходимо написать отчет, который бы показывал долги выбранного клиента.

В обеих версиях 1С структура базы конфигурации будет одинакова:

Справочники Клиенты, Товары
Перечисление ТипДолга (значения Товар, Штрафы и пени, Прочее)
Регистр остатков Долги. Измерения Клиент, Тип долга, Товар. Ресурсы Сумма
Отчет ДолгиКлиента. Реквизит на форме ВыбКлиент. Печатная форма отчета самая простейшая:


Долги клиента Иванов И.И. на 01.11.2002 15:40

Тип долга
Товар
Сумма
1
Товар 1С:Бухгалтерия 7.7
300.00
2
Штрафы и пени  
20.00
Итого:
320.00

В версии 7.7 процедура формирования отчета выглядит примерно так:

Процедура Сформировать()

Если ВыбКлиент.Выбран()=0 Тогда

Предупреждение("Не указан КЛИЕНТ");
Возврат;

КонецЕсли;

НачДата = Дата("01.01.1980");
КонДата = ПолучитьДатуТА();

ТекстЗапроса = "
|Период С НачДата По КонДата;
|Клиент = Регистр.Долги.Клиент;
|ТипДолга = Регистр.Долги.ТипДолга;
|Товар = Регистр.Долги.Товар;
|Долг = Регистр.Долги.Сумма;
|Группировка ТипДолга;
|Группировка Товар;
|Функция СуммаДолга = КонОст(Долг);
|Условие (Клиент = ВыбКлиент);";

Запрос = СоздатьОбъект("Запрос");
Запрос.Выполнить(ТекстЗапроса);

Таб = СоздатьОбъект("Таблица");
Таб.ИсходнаяТаблица("ДолгиКлиента");

Таб.ВывестиСекцию("Шапка");

Пока Запрос.Группировка(1) = 1 Цикл

Пока Запрос.Группировка(2) = 1 Цикл

ТипДолга = Запрос.ТипДолга;
Товар = Запрос.Товар;
Сумма = Запрос.СуммаДолга;

Таб.ВывестиСекцию("Строка");

КонецЦикла;

КонецЦикла;

Таб.ВывестиСекцию("Подвал");

Таб.Опции(0);
Таб.Показать();

КонецПроцедуры

Примечание:
В версии 7.7 в ячейки таблицы можно сразу вписать выражения "Запрос.ТипДолга", "Запрос.Сумма" и т.д., тогда можно не плодить дополнительных переменных внутри цикла.


А вот как примерно будет выглядеть процедура формирования отчета в версии 8.0. При этом ВыбКлиент будет являться реквизитом отчета и лучше, чтобы процедура Сформировать располагалась в модуле отчета (не путать с модулем формы). Термин ТабличныйДокумент в версии 8.0 примерно соответствует термину "Таблица" в версии 7.7, причем именно та таблица, которую видит пользователь.

//в модуле формы
Процедура КнопкаСформироватьОтчетНажатие()

Если ВыбКлиент.Пустая() Тогда

Предупреждение("Не указан КЛИЕНТ");
Возврат;

КонецЕсли;

//можно создать новый табличный документ или использовать табличный документ,
//помещенный прямо на экранную форму.

ТД = Новый ТабличныйДокумент;
Сформировать(ТД);
ТД.Показать();

КонецПроцедура


//в модуле отчета
//ключевое слово Экспорт говорит о том, что эта процедура будет включена в контекст отчета
Процедура Сформировать(ТД=0) Экспорт

//это позволит формировать отчет из любого модуля конфигурации
флПоказатьОтчет = Ложь;
Если ТД=0 Тогда

флПоказатьОтчет = Истина;
ТД = Новый ТабличныйДокумент;

КонецЕсли;

З = Новый Запрос;

//прежде чем использовать в запросе переменные модуля,
//их нужно передать в запрос следующим образом

З.УстановитьПараметр("ВыбКлиент",ВыбКлиент);

//формируем текст запроса, обратите внимание на знак &, это ссылка на параметр запроса
З.Текст = "
|Выбрать * Из РегистрНакопления.Долги
|где Клиент = &ВыбКлиент";

//или тот же самый запрос по-английски
//З.Текст = "SELECT * FROM РегистрНакопления.Долги WHERE Клиент = &ВыбКлиент";


РезультатЗапроса = З.Выполнить();
тзДолги = РезультатЗапроса.Выгрузить(); //результ запроса выгружаем в таблицу значений

//конечно, можно обойтись без дополнительной переменной, написав следующее
// тзДолги = З.Выполнить().Выгрузить();


//термин "Макет" в версии 8.0 примерно соответствует термину "Таблица" в версии 7.7,
//причем именно та таблица, с которой работает программист. Пользователь ее не видит.

Макет = ПолучитьМакет("ДолгиКлиента");

ТД.Очистить();

//термин Область в версии 8.0 примерно соответствует термину "Секция" в версии 7.7
//но области могут охватывать произвольное количество ячеек
//области могут быть и не прямоугольными

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

//выводим сведения в ячейки области
Обл.Параметры.ДатаВремяОтчета = ТекущаяДата(); //в версии 8.0 тип Дата включает время
Обл.Параметры.Клиент = ВыбКлиент;

//выводим сформированную область в табличный документ

ТД.Вывести(Обл);

Для Каждого стр Из тзДолги Цикл

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

Обл.Параметры.ТипДолга = стр.ТипДолга;
Обл.Параметры.Предмет = стр.Предмет;
Обл.Параметры.Сумма = стр.Сумма;

ТД.Вывести(Обл);

КонецЦикла;

ТД.ТолькоПросмотр = Истина;
ТД.ОтображениеСетки = Ложь;
ТД.ОтображениеЗаголовков = Ложь;
ТД.Вывести(Макет.ПолучитьОбласть("Подвал"));

Если флПоказатьОтчет Тогда

ТД.Показать();

КонецЕсли;

КонецПроцедуры

Как видно, изменения затрагивают почти каждую строчку программы, начиная от языка запросов и до работы с печатными формами. Поэтому, я сомневаюсь, что получится написать конвертер исходных текстов из версии 7.7.

Кроме того, в версии 8.0 можно будет из любого другого модуля сформировать данный отчет, передав ему клиента. В частности, в форме элемента справочника Клиенты можно будет написать примерно следующее:

Процедура КнопкаДолгиНажатие()

Отч = Отчеты.ДолгиКлиента.Создать(); //создаем экземпляр отчета
Отч.ВыбКлиент = Ссылка; //передаем текущего клиента
Отч.Сформировать();

КонецПроцедуры

При этом диалог отчета открываться не будет, а сразу должна появиться печатная форма. Заметьте, как чудесно изменился контекст отчета, о котором мы говорили в прошлом выпуске. Теперь контекст отчета включает наш реквизит на форме ВыбКлиент и нашу процедуру Сформировать.

Если взглянуть на эту ситуацию другими глазами - с точки зрения объектно-ориентированного программирования, то получается, что фактически мы можем создать класс ДолгиКлиента, а затем обратиться к его свойству и методу. То же самое, видимо, можно будет сделать со справочниками, документами и обработками. Таким образом, версия 8.0 вносит нечто новое в обычное программирование учетных задач: фактически появляются черты объектно-ориентированного программирования, подвластные программисту, а именно инкапсуляция.

Но это уже совсем другая история и об этом мы поговорим в следующем выпуске рассылки...


Внимание! Любая информация, опубликованная в данной рассылке, не является гарантированно достоверной и может не совпадать с официальным релизом 1С:Предприятие 8.0.

Хочу отметить, что приведенные выше программные коды были написаны без использования ознакомительной версии 1С:Предприятие 8.0 по результатам анализа материалов, взятых из открытых источников и на выставках.

Официальный сайт рассылки www.mista.ru
Архив выпусков рассылки находится по адресу
http://www.mista.ru/subscribe

С уважением,
Волшебник Станислав

stasmit@mail.ru


<< Предыдущий выпуск | Список выпусков | Следующий выпуск >>
 

© Станислав Митичкин
www.mista.ru
, 1997-2003
1C:TOP-100
Волшебный форум