Простые выборки данных с использованием языка программирования 1С


Отчеты могут создаваться как вручную, так и с использованием мощных средств автоматизации, конструкторов запросов и печатных форм. При создании запросов применяется специальный язык запросов. Однако отчеты, равно как и печатные формы для них, можно создавать и полностью в ручном режиме. В этом разделе мы рассмотрим создание простого отчета с использованием только языка программирования 1С и ручное конструирование печатной формы (макета), а в дальнейших разделах обсудим более "продвинутые" способы.

Итак, задача: нам нужно рассчитать затраты топлива на развозку товара каждой из машин предприятия за заданный период времени. Также нужно высчитать общее расстояние, которое прошла каждая из машин. Отчет должен выводиться на печать.

1. Создадим отчет в виде внешней обработки. Делается это в режиме Конфигуратора через пункт меню Файл | Новый. В открывшемся списке выбираем вариант Внешняя обработка.

2. Откроется окно создания обработки. Это стандартное окно нового объекта, такие мы уже видели неоднократно при работе с данной книгой. Сейчас нам нужно назначить обработке имя, синоним, а также создать форму (щелчок правой кнопкой мыши по слову "Формы" — и выбираем пункт Добавить, тип формы — "Форма отчета"). В результате окно новой обработки должно выглядеть так, как показано на рис. 4.1.
 

3. Теперь двойным щелчком переходим на форму и начинаем заполнять ее элементами. Для вставки различных элементов формы существует панель кнопок Элементы управления (обычно расположена в нижней части окна, но может быть и сверху, как поместите). На этой панели расположены заготовки для самых разных элементов — полей ввода, кнопок, флажков, надписей, таблиц и т. д. Можно просто выбирать их мышью, затем щелкать по форме — и элемент создан, остается только задать его свойства. Мы воспользуемся другой кнопкой — Вставить элемент управления. По сути, это то же самое, только вместо выбора из большого количества кнопок мы нажимаем одну кнопку, а потом в диалоговом окне (рис. 4.2) выбираем элемент управления.
 
4. В левой части окна мы можем выбрать тип элемента управления, в правой части — задать имя, надпись, тип и прочие параметры будущего элемента. Нам сейчас нужно создать два поля выбора даты для того, чтобы задавать период отбора. Одно поле мы назовем НачДата, другое — КонДата, тип значения — Дата. Результат должен выглядеть подобно тому, что показано на рис. 4.3.
 
5. Теперь нам нужно разместить на форме таблицу значений. Мы будем отбирать данные в нее, а уже потом выводить содержимое на печать. Снова нажмем кнопку, но теперь выберем тип Табличное поле, имя — Реестр, тип значения — ТаблицаЗначений (рис. 4.4).
  
6. Разместим таблицу значений на форме так, чтобы она заняла все пространство. Кроме полей ввода даты, это будет основное информационное поле (рис. 4.5).
 
 

7. Теперь в таблицу значений надо добавить колонки. Делается это щелчком правой кнопкой мыши на таблице значений, после чего необходимо выбрать пункт Добавить колонку, а затем в свойствах новой колонки задать имя — Автомобиль и тип значения — Справочник.Автомобили (рис. 4.6).

 
8. После того как заданы свойства, форма с новой колонкой будет выглядеть так, как показано на рис. 4.7.


9. Теперь, аналогично тому, как мы создали колонку "Автомобиль", создайте остальные колонки таблицы значений. Список всех колонок и типы хранимых в них значений приведены в табл. 4.1.


10. В соответствии с табл. 4.1 добавим колонки в таблицу значений, результат должен выглядеть так, как показано на рис. 4.8.
   
11. Форма отчета вполне готова. Осталось главное — заполнить модуль программным кодом и создать печатную форму-макет. Пока начнем с модуля. Сперва сделаем так, чтобы в поля даты начала и даты окончания интервала отбора при открытии формы сразу подставлялись какие-то даты. Конечно, пользователь может выбирать их и вручную, но гораздо удобнее, если уже будет стоять какой-то стандартный интервал. А если он пользователя не устроит, тогда он и выберет другой. Читатель, который уже имел опыт программирования в системе "1С:Предприятие 7.7", сейчас скажет: "Нужно написать предопределенную процедуру ПриОткрытии()". И напишет ее. И процедура эта работать не будет. Почему? Потому, что в "1С:Предприятие 8.2" вручную написать процедуру ПриОткрытии() недостаточно. Надо сначала открыть окно свойств формы (можно просто двойным щелчком на заголовке формы) и в нижней части этого окна найти раздел События (рис. 4.9).
 
Именно здесь описываются все стандартные процедуры, которые могут произойти с формой. Щелкнем мышью по значку в виде увеличительного стекла события ПриОткрытии — и попадаем в модуль с уже автоматически созданной процедурой ПриОткрытии(). К слову сказать, название этой процедуры несущественно, можно назвать хоть ПриОткрытииНашегоПрекрасногоОтчета(), лишь бы эта процедура была связана с событием формы ПриОткрытии. Да, если вы попробуете поэкспериментировать и поменяете в модуле название процедуры, не забудьте выбрать его в выпадающем списке события формы ПриОткрытии, т. к. при автоматическом создании процедуры туда уже прописалось имя ПриОткрытии.
Процедура создана, код, который в нее нужно вписать, представлен в п. 13.

12. Теперь пропишем процедуру, которая будет связана с нажатием кнопки Выполнить в окне формы. Для того чтобы ее открыть, можно просто щелкнуть по кнопке, а затем в окне свойств выбрать значок с увеличительным стеклом в свойстве Действие. А можно и просто перейти на вкладку Модуль, поскольку при создании формы кнопка Выполнить создается автоматически и пустая процедура для нее тоже создается автоматически.

13. Текст программного модуля должен выглядеть так:

Процедура КнопкаВыполнитьНажатие(Кнопка)
   Реестр.Очистить();
   Выборка = Документы.Развозка.Выбрать(НачДата, КонДата);
     Пока Выборка.Следующий() Цикл
       Если Выборка.Проведен = Ложь Тогда
         Продолжить;
       КонецЕсли;
       НоваяСтрока = Реестр.Добавить();
       НоваяСтрока.Автомобиль = Выборка.Автомобиль;
       НоваяСтрока.Номер = Выборка.Автомобиль.ГосНомер;
       НоваяСтрока.Километраж = Выборка.Километраж;
       НоваяСтрока.ЗатратыТоплива = Выборка.ЗатратыТоплива;
     КонецЦикла;
     Реестр.Свернуть("Автомобиль, Номер","Километраж, ЗатратыТоплива");
КонецПроцедуры
Процедура ПриОткрытии()
   НачДата = НачалоДня(НачалоМесяца(ТекущаяДата()));
   КонДата = КонецДня(ТекущаяДата()+ 86400);
КонецПроцедуры

14. Теперь поясним, что мы тут написали. В процедуре ПриОткрытии() мы присвоили переменной НачДата начало дня начала месяца текущей даты. То есть, если говорить проще, 0 часов 0 минут 0 секунд первого числа текущего месяца. Переменной КонДата мы присвоили значение ТекущаяДата() + 86400. А почему не просто ТекущаяДата()? Потому, что тогда в интервал не попадут документы, выписанные сегодня, потому что интервал закончится сегодня ночью, в 0 часов 0 минут 0 секунд. Прибавив 86 400 секунд, т. е. 1 сутки, мы заканчиваем наш интервал в 0 часов 0 минут 0 секунд дня, следующего за текущим.

15. В процедуре КнопкаВыполнитьНажатие() мы сначала очищаем таблицу (вдруг пользователь сформирует отчет несколько раз подряд, тогда данные в таблицу будут добавляться к уже сформированным ранее), затем циклом выбираем документы "Развозка" в пределах дат НачДата и КонДата, при этом пропуская непроведенные (и помеченные на удаление тоже, поскольку они также являются непроведенными). В цикле мы при каждом проходе добавляем новую строку и присваиваем значению колонки таблицы значений соответствующий реквизит документа. Если бы мы этим ограничились, то получили бы список всех документов развозки за указанный период, но нам нужно не это. Поэтому после цикла мы командой Свернуть() сворачиваем выборку по колонкам "Автомобиль" и "Номер", при этом суммируя данные в колонках "Километраж" и "ЗатратыТоплива". Результаты представлены на рис. 4.10.


16. Отчет формируется, теперь бы его научиться выводить на печать, заодно показывая общую сумму по затраченному топливу. Перейдем в окно нашего отчета (см. рис. 4.1) и создадим новый макет (правой кнопкой мыши по слову "Макеты" и выбираем пункт Добавить). Откроется окно создания нового макета (рис. 4.11).


17. Оставим все как на рисунке и нажмем кнопку Готово. Теперь окно обработки выглядит так, как показано на рис. 4.12.

 
18. Откроем макет двойным щелчком по нему и наметим его структуру наподобие того, как создаются таблицы в MS Excel. Введем заголовок и разметим таблицу, которая впоследствии будет заполняться данными. Результат получится таким, как на рис. 4.13. То, что в табличной части всего одна строка, пусть вас не смущает.
 
19. Оформление ячеек (шрифт, цвет текста, начертание, границы и т. д.) расположено в разделе Оформление свойств ячейки (рис. 4.14).
   
20. После того как мы сделали "картинку" будущей печатной формы, ее нужно заполнить данными. Сначала выберем заголовок "Список развозок за период" (как и в MS Excel, достаточно выбрать одну ячейку, в которой и был написан заголовок), откроем свойства ячейки и внесем изменения. В разделе Макет свойство Заполнение изменяем на Шаблон, а в свойстве Текст мы обрамляем квадратными скобками переменные НачДата и КонДата (рис. 4.15).

 
21. Что мы только что сделали? Сейчас поясню. Дело в том, что содержимое ячейки может быть трех типов: Текст — просто обычный текст, Выражение — программный код и Шаблон — совокупность первых двух типов, когда в текст вставляются фрагменты программного кода. Вот именно этот тип мы и присвоили нашей ячейке. "Список развозок за период" — обычный текст, но вместо слов [НачДата] и [КонДата] будут подставлены соответствующие значения переменных. То, что НачДата и КонДата — не просто текст, а части кода, было указано нами с помощью квадратных скобок. Результат будет выглядеть так, как показано на рис. 4.16.


22. Теперь заполняем ячейки параметрами, как показано на рис. 4.17:


свойство Заполнение со значением Параметр. Переменные, которые проставлены в ячейки (Ном, ПечАвтомобиль и т. д.), мы еще не определяли, но до этого мы сейчас дойдем.

23. Теперь нам нужно объединить строки макета в секции, каждая из которых будет выводиться в заданный нами момент. Выделите мышью строки с 1 по 4 включительно, как бы вы это делали в MS Excel (т. е. выделяя не все строки, а по сути, только их номера). После этого в меню Таблица | Имена выберите пункт Назначить имя. Нам предложат задать имя для выделенной области (рис. 4.18).
   
24. Задаем имя Шапка диапазону с 1 по 4 строки, Строка — 5-й строке и Итог — 6-й строке. Также в секции Итог для одной из ячеек задайте имя ИтогоТоплива и тип Параметр, выделите эту ячейку жирным шрифтом. Готовый к работе макет должен выглядеть так, как показано на рис. 4.19.
 
25. Макет у нас есть, осталось запрограммировать саму процедуру печати, а также кнопку, запускающую эту процедуру. Сначала создадим кнопку. Для этого перейдем на форму обработки и сделаем щелчок правой кнопкой мыши на кнопке с тремя точками, расположенной слева от кнопки Выполнить. В открывшемся контекстном меню выберем пункт Добавить. На панели, левее кнопки Выполнить, появится новая кнопка, свойства которой мы должны задать, как это уже делали для самых разных объектов — двойным щелчком и установкой свойств в окне свойств кнопки. Итоговый результат должен выглядеть так, как на рис. 4.20, а окно свойств кнопки — как на рис. 4.21.


26. Для красоты мы задали для кнопки картинку в одноименном поле, а в свойстве Отображение показали, что хотим, чтобы отображалась и картинка, и поясняющая надпись. В свойстве Действие мы, как обычно, делаем щелчок мышью, создавая процедуру, связанную с кнопкой Печать. Сама процедура должна выглядеть следующим образом.

Процедура ОсновныеДействияФормыДействие(Кнопка)
   ТабДокумент = Новый ТабличныйДокумент;
   Макет = ЭтотОбъект.ПолучитьМакет("Макет");
   ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
   ОбластьСтрока = Макет.ПолучитьОбласть("Строка");
   ОбластьИтог = Макет.ПолучитьОбласть("Итог");
   ОбластьШапка.Параметры.НачДата = Формат(НачДата, "ДФ=dd.MM.yyyy");
   ОбластьШапка.Параметры.КонДата = Формат(КонДата, "ДФ=dd.MM.yyyy");
   ТабДокумент.Вывести(ОбластьШапка);
   Ном = 1;
   ИтогоТоплива = 0;
     Для Каждого ТекущаяСтрока Из Реестр Цикл
       ОбластьСтрока.Параметры.Ном = Ном;
       ОбластьСтрока.Параметры.ПечАвтомобиль = ТекущаяСтрока.Автомобиль;
       ОбластьСтрока.Параметры.ПечНомер = ТекущаяСтрока.Номер;
       ОбластьСтрока.Параметры.ПечКилометраж = ТекущаяСтрока.Километраж;
       ОбластьСтрока.Параметры.ПечЗатратыТоплива = ТекущаяСтрока.ЗатратыТоплива;
       ИтогоТоплива = ИтогоТоплива + ТекущаяСтрока.ЗатратыТоплива;
       ТабДокумент.Вывести(ОбластьСтрока);
       Ном = Ном + 1;
     КонецЦикла;
   ОбластьИтог.Параметры.ИтогоТоплива = ИтогоТоплива;
   ТабДокумент.Вывести(ОбластьИтог);
   ТабДокумент.ТолькоПросмотр = Истина;
   ТабДокумент.АвтоМасштаб = Истина;
   ТабДокумент.ОтображатьСетку = Ложь;
   ТабДокумент.Показать();
КонецПроцедуры

Что написано в процедуре? Сначала мы объявляем, с чем будем работать. Табличный документ (тот, что мы формировали чуть раньше), макет обработки (у нас он один, но могло бы быть и несколько), области, которые мы именовали выше. Затем начинаем привязывать данные. НачДата на форме и НачДата в макете — это разные переменные, поэтому мы должны присвоить одну другой. Обращение к переменной в макете идет как ИмяОбласти.Параметры.ИмяПеременной. НачДата и КонДата мы отформатировали затем, чтобы в печатную форму не выводилось время, иначе это будет неинформативно и выглядеть некрасиво.

Далее мы формируем цикл, который перебирает строки таблицы значений и присваивает переменным печатной формы соответствующие переменные таблицы значений. Переменные Ном и ИтогоТоплива являются вычисляемыми: к первой при каждом проходе цикла прибавляется единица, ко второй прибавляется расход топлива по текущей строке. Таким образом, когда цикл заканчивает свою работу, мы получаем итоговый расход топлива, который и записываем в ячейку ОбластьИтог.Параметры.ИтогоТоплива.
Далее в процедуре задаются параметры макета (запрет редактирования, автомасштабирование, запрет вывода сетки) и дается команда вывода получившегося макета на экран ТабДокумент.Показать().

27. Работа над отчетом завершена. Сохраните его и запустите в режиме Предприятия. Если все было сделано правильно, то после отработки отчет заполнит таблицу значений (рис. 4.22).
 
28. При нажатии кнопки Печать должна быть выведена печатная форма, представленная на рис. 4.23.
 
Мы завершили работу над отчетом. Однако, мягко говоря, это не самый сложный отчет, который может понадобиться пользователю системы "1С:Предприятие". Сложные отчеты тоже могут быть созданы в ручном режиме, но также для них можно (и нужно) использовать конструкторы, позволяющие упростить и автоматизировать труд программиста. Об этом — в следующем разделе. 

Похожие новости

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

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.