Волшебство
программирования на 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
<< Предыдущий
выпуск | Список
выпусков |
Следующий выпуск >>
|