Текст
                    СЕРГЕЙ КАШАЕВ
1С:Предприятие О
учимся программировать
НА ПРИМЕРАХ
т
Объекты конфигурации у системы 1С:Предприятие 8
Встроенный язык программирования
Разработка прикладных решений для офиса

Интеграция 1С:Предприятие 8 с приложениями Microsoft Excel и Microsoft Word

(bhv
Сергей Кашаев
1С Предприятие О
учимся программировать
НА ПРИМЕРАХ
Санкт-Петербург «БХВ-Петербург» 2008
УДК 681.3.06
ББК 32.973.26-018.2
К31
Кашаев С. М.
КЗ 1 1С:Предприятие 8. Учимся программировать на примерах. — СПб.: БХВ-Петербург, 2008 — 336 с.: ил. + CD-ROM
ISBN 978-5-9775-0206-1
Обучение разработке конфигураций и программированию на платформе 1 С:Предприятие 8 построено на практических примерах различной сложности. Основной упор сделан на подробное описание технологии разработки конфигураций с использованием конструкторов и встроенного языка программирования. Большое внимание уделено языку запросов и построению разнообразных отчетов, передаче информации между системой ЮПредприятие 8 и популярными офисными приложениями и др.
Тематика примеров в основном связана с учетом денежных средств, в частности, рассмотрены задачи автоматизации учета денежных поступлений для организаций, предоставляющих платные образовательные услуги.
Компакт-диск содержит все разработанные конфигурации, описываемые в главах книги, а также файлы для Microsoft Word и Microsoft Excel, упоминаемые в примерах по организации информационного обмена между приложениями.
Для начинающих 1С-программистов и опытных пользователей
УДК 681.3.06
ББК 32.973.26-018 2
Группа подготовки издания:
Главный редактор Зам. главного редактора Зав. редакцией Редактор Компьютерная верстка Корректор Дизайн серии Оформление обложки Зав. производством
Екатерина Кондукова Евгений Рыбаков Григорий Добин Юрий Якубович Натальи Смирновой Виктория Пиотровская Игоря Цырульникова Елены Беляевой Николай Тверских
Лицензия ИД Na 02429 от 24.07.00. Подписано в печать 29.12.07.
Формат 70x100'/i6. Печать офсетная. Усл. печ. л. 27.09.
Тираж 2500 экз. Заказ Na 1869 “БХВ-Петербург", 194354, Санкт-Петербург, ул. Есенина, 5Б.
Санитарно-эпидемиологическое заключение на продукцию Na 77.99.02.953.Д.006421.11.04 от 11.11.2004 г. выдано Федеральной службой по надзору в сфере защиты прав потребителей и благополучия человека.
Отпечатано с готовых диапозитивов в ГУП “Типография “Наука" 199034, Санкт-Петербург, 9 линия. 12
ISBN 978-5-9775-0206-1
С Кашаев С- М., 2008
О Оформление, издательство "БХВ-Петербург", 2008
Оглавление
Введение...........................................................1
Общий взгляд на систему 1С:Предприятие...........................2
Краткое содержание книги.........................................5
Компакт-диск.....................................................7
От автора книги..................................................7
Глава 1. Представление об объектах системы 1С:Предприятие..........9
Знакомство с конфигуратором.....................................10
Окно запуска..................................................11
Создание новой информационной базы............................12
Постановка задачи по разработке конфигурации..................15
Перечисления....................................................16
Справочники.....................................................19
Справочник Должности......................................... 20
Справочник Курсы..............................................32
Печатная форма справочника....................................40
Внесение изменений в печатную форму...........................49
Справочник Клиенты............................................56
Документ Внесение оплаты........................................65
Заполнение закладки Данные....................................66
Форма документа...............................................67
Программирование формы документа..............................70
Создание печатной формы документа Внесение оплаты.............74
Список документов.............................................76
Создание отчета.................................................77
Разработка макета.............................................79
Процедура заполнения отчета...................................83
Отчет по клиентам.............................................88
Отчет по клиентам с детализацией по курсам....................91
Итоги...........................................................93
IV
Оглавление
Глава 2. Использование регистров сведений..............................95
Постановка задачи....................................................95
Представление информации о тарифах...................................98
Вспомогательный справочник Вид тарифа..............................99
Регистр сведений Тарифы............................................99
Контроль ошибок в форме регистра Тарифы...........................102
СправочникДоговоры................................................105
Регистр сведений Квитанции........................................106
Форма обработки для учета квитанций по оплате.......................108
Процедуры для работы с формой.......................................114
Процедура, выполняемая при выборе договора........................116
Обработка нажатия кнопки Расчет тарифа............................122
Процедура расчета суммы квитанции.................................124
Запись информации в регистр Квитанции...............,.............124
Форма регистрации квитанций.........................................127
Формирование документа Microsoft Word...............................130
Внесение дополнений в бланк квитанции.............................131
Разработка процедуры заполнения бланка............................134
Заполнение бланка с двумя квитанциями............................. 138
Итоги второй главы..................................................141
Глава 3. Извлечение информации с помощью запросов.....................143
Язык запросов. Основные конструкции.................................145
Обработка Извлечение информации...................................146
Конструкции ВЫБРАТЬ и ИЗ..........................................148
Упорядочивание в запросе..........................................151
Отбор максимальных (минимальных) значений.........................152
Ключевое слово ИЕРАРХИЯ...........................................154
Исключение повторяющейся информации при отборе данных.............156
Ключевое слово ГДЕ................................................157
Использование логических операторов в запросе.....................159
Агрегатные функции в запросах.....................................161
Использование параметров в запросах...............................167
Ключевое слово МЕЖДУ..............................................169
Ключевое слово ИМЕЮЩИЕ.......................................................................... 171
Функция расчета итогов в запросах.................................172
Объединение результатов нескольких запросов.......................175
Запросы к информационной базе, разработанной в первой главе.........178
Отбор специалистов по указанной должности.........................178
Оглавление
V
Отбор курсов преподавателя..................................182
Соединение таблиц при организации запроса...................183
Левое внешнее соединение....................................185
Правое внешнее соединение...................................187
Полное внешнее соединение...................................189
Ключевое слово ВЫБОР..........................................191
Встроенные функции языка запросов.............................195
Функция ПОДСТРОКА...........................................195
Функция ДобавитьКДате.......................................196
Функция РазностьДат.........................................197
Функция ПРЕДСТАВЛЕНИЕ...................................... 198
Оператор ПОДОБНО..............................................198
Итоги.........................................................201
Глава 4. Использов ание документов и регистров н акопления.....203
Взгляд на документы и регистры накопления..................... 203
Постановка задачи.............................................206
Справочник Организации........................................208
Справочник Учащиеся...........................................210
Регистр накопления по оплате..................................213
Документ Оплата...............................................215
Конструктор движений........................................217
Планы по доработке формы документа..........................221
Программирование формы документа............................224
Документ Возврат .............................................233
Отчеты по движению денежных средств...........................237
Отчет Учет по возврату......................................237
Отчет с детализацией поступлений и возвратов................244
Итоговый отчет по оплате....................................252
Доработка документа Оплата..................................255
Итоговый отчет с диаграммой.................................259
Итоги.........................................................266
Глава 5. Автоматизация работы с данными........................267
Постановка задачи.............................................268
Информация о тарифах..........................................268
Вспомогательные справочники...................................272
Документ Учет.................................................272
Процедуры обработки событий на форме документа..............275
VI
Оглавление
Оборотный регистр накопления....................................280
Движения по регистру Начисление...............................282
Отчет по начислению.............................................284
Реализация множественного подбора...............................288
Сводная таблица.................................................291
Организация передачи данных между различными приложениями.......295
Пример взаимодействия приложений с использованием СОМ-технологии................................................297
Использование приложения Microsoft Excel в качестве сервера...303
Передача информации в Microsoft Excel с использованием технологии OLE Automation.....................................306
Выполнение макросов при передаче информации в Microsoft Excel.308
Интеграция трех офисных приложений............................311
Итоги.........................................................318
Заключение.......................................................319
Литература.......................................................321
Приложение. Описание компакт-диска...............................323
Предметный указатель.............................................327
Введение
В настоящее время в большинстве организаций различного профиля ощущается потребность в специалистах, которые профессионально владеют разнообразными современными информационными технологиями. При этом наиболее частыми требованиями и пожеланиями со стороны работодателей являются навыки работы с информационной системой 1С:Предприятие 8. Этот программный продукт позволяет существенно автоматизировать экономическую и организационную деятельность предприятий различного профиля.
Если посмотреть на спектр специалистов, работающих с 1С:Предприятие 8, то мы увидим, что он достаточно широк— менеджеры, бухгалтеры, программисты, разработчики, руководители подразделений и т. д. Всех этих людей можно разделить на две условные категории — разработчиков и пользователей.
Первые создают прикладные разработки для дальнейшего использования в конкретной области деятельности (бухгалтерия, торговля, склад, управление персоналом и др.). Для этого в систему 1С:Предприятие 8 заложены разнообразные технические ресурсы, основным из которых является встроенный программный язык. Построение любого прикладного решения на платформе 1С:Предприятие 8 связано с написанием программного кода.
Другая, еще более обширная категория специалистов, связанных с рассматриваемым программным продуктом — это пользователи. Другими словами, вгег see re, .vre? рабузтаег с рже г&г&еылт	(схззддннылт irepsvw
категорией специалистов, разработчиками). И часто у пользователя, имеющего заметный опыт работы с одним из прикладных решений на платформе 1С:Предприятие 8, создается иллюзия, что он уже овладел всеми секретами мастерства. Однако для внесения даже небольших изменений (которые часто требуются в реальной практике в связи с тем, что в работе каждой организации есть свои специфические особенности) в готовое решение необходимы другие знания и практические навыки — представление об объектах, составляющих систему 1С:Предприятие 8. знание встроенного языка программирования, опыт разработчика и многое другое. Перед пользователями, знакомыми с этими технологиями, открываются широкие возможности как для внесения изменений в готовые решения, так и для создания своих собствен-
2
Введение
ных прикладных разработок. Именно для читателей, которые на практических примерах хотят быстрее овладеть секретами мастерства разработчика, написана эта книга.
Один из первых вопросов, который сразу возникает у берущегося за изучение нового предмета— что необходимо предварительно знать для успешного усвоения информации? Практические занятия с различными категориями учащихся показали, что освоение приведенных в книге разработок вполне по силам и тем, кто не имеет навыков в области программирования, и тем, кто до этого не сталкивался с системой 1С:Предприятие. Приведенные в книге примеры использовались в реальном учебном процессе. На этих занятиял присутствовали учащиеся как различных возрастных категорий, так и с различным уровнем начальной подготовки.
Вообще, практика показала, что приобрести навыки для самостоятельных разработок в системе 1С:Предприятие 8 можно за относительно небольшой срок.
Общий взгляд
на систему 1 С:Предприятие
Программный продукт ЮЕредприятие 8 позволяет существенно автоматизировать деятельность как конкретного подразделения, так и всей организации в целом.
Основной отличительной чертой рассматриваемой системы является ее способность подстройки под конкретную область деятельности. Это достигается за счет конфигурируемости, которая заложена в данный программный продукт. Вообще функционирование системы разделяется на два процесса — конфигурирование (работа в режиме конфигуратора) и непосредственно пользовательскую работу с тем, что создано на этапе конфигурирования.
В режиме конфигуратора создаются необходимые для решения прикладной задачи объекты (точнее, объекты конфигурации). При этом определяются формы ввода информации, алгоритмы обработки цанных, а также необходимые пользователю отчеты. В целом результатом конфигурирования является конкретная конфигурация, которая отражает модель предметной области определенного подразделения или целой организации.
Сама по себе деятельность разработчика в конфигураторе может быть разделена на две составляющих. Как и в любой другой современной инструмен
Введение
3
тальной среде, в системе 1С:Предприятне 8 большое место занимают визуальные средства разработки. В частности, они ориентированы на работу с диалоговыми окнами, размещение необходимых элементов управления и задание их свойств. В этом случае практическая сторона фактически сводится к управлению объектами с помощью мыши, а также к записи необходимой информации в поля ввода. Вторую же (и наиболее трудоемкую) составляющую работы в конфигураторе представляет непосредственное программирование на встроенном языке.
При создании конфигурации, направленной на решение конкретной прикладной задачи, разработчик использует такие заложенные в систем) объекты конфигурации, как справочник, документ, форма, регистр сведений, табличный документ и многие другие. Каждый из них характеризуется необходимым набором свойств и методов (стандартных операций по работе с объектами). На базе указанных объектов разработчик для определенной прикладной области уже создает специфические объекты, составляющие разрабатываемую конфигурацию. Например, это могут быть справочники «Номенклатура» или «Сотрудники», первый из которых будет содержать названия и реквизиты товаров, а второй — информацию о лицах, работающих в организации. Таким же образом, используя основной объект конфигурации документ, можно разработать структуру прикладного документа «Приходная накладная».
Стоит заметить, что в конфигураторе создаются не конкретные документы, справочники либо отчеты, а определяется лишь их вид, или, можно сказать, структура (еще лучше подходит слово шаблон, но оно представляет специфический термин, который используется в описании системы 1С:Предприятие 8). Например, в режиме конфигуратора можно определить, что в создаваемом документе должны присутствовать следующие поля:
□	название склада;
□	название фирмы-поставщика;
П список товаров с указанием количества.
После создания подобной структуры в работу может включиться пользователь, который в режиме 1С:Преднриятие вносит данные в создаваемые системой документы, основанные на разработанной структуре. Таким образом, для сотрудников, не знакомых с конфигуратором и технологией создания объектов конфигурации, видна только пользовательская составляющая деятельности.
Введение
Важно отметить, что система 1С:Предприятие 8 позволяет создать программные объекты, которые являются очень близкой моделью реальных, используемых в конкретной сфере деятельности. В этом случае пользователи, впервые столкнувшиеся с этой информационной системой, отмечают большое удобство при переходе от бумажной документации к электронной.
Фактически для последующей работы пользователя в режиме ^Предприятие разработчиком в режиме конфигуратора создается необходимая схема (алгоритм действий). Результаты конфигурирования обеспечивают сотрудникам организации комфорт при работе с информационной базой, созданной системой на основании разработанной конфигурации.
В качестве технологических средств разработки мы выше отметили встроенный язык программирования, заложенный в рассматриваемую систему. Это наиболее существенный ресурс для разработчика, но он не единственный. Приведем еще несколько наиболее востребованных.
Так, в системе 1С:Предпритие 8 присутствуют конструкторы— инструменты, которые позволяют разработчику избежать выполнения разнообразных рутинных действий. В частности, конструкторы предоставляют возможность автоматически создавать необходимые формы для ввода данных, печатные формы, программный код, и, что важно, все это осуществляется в результате заполнения полей несложного диалога.
Также в программный продукт 1С:Предприятие 8 заложен механизм запросов, который в основном используется для построения разнообразных отчетов, являющихся непременным атрибутом автоматизации в любой предметной области. Механизм запросов основан на еще одном языке, заложенном в систему— на языке запросов, который обеспечивает выборку интересующей информации из базы данных.
Встроенный текстовый редактор используется для создания программных модулей на встроенном языке. Для удобства разработчика в этом редакторе имеется возможность контекстного выделения цветом синтаксических конструкций, а также при работе программист может пользоваться подсказками и шаблонами.
Для создания макетов выходных форм в системе 1С:Предприятие 8 предусмотрен редактор табличных документов. Формат табличного документа является универсальным для документов, справочников, отчетов и других объ
ектов.
введение
5
Средством, кот опое существенно облегчает труд разработчика, является от-,адчик. Он позволяет отслеживать выполнение программных модулей, замерять время выполнения и просматривать содержимое переменных.
Этот список составляет только часть многочисленных технологических средств, заложенных в рассматриваемую информационную систему. Для получения исчерпывающей инфоомации следует обратиться к справочной документации, прилагаемой к программному продукту 1С:Предприятие 8.
Краткое содержание книги
Книга состоит из пяти глав, которые наполнены разнообразными практическими примерами. Такая организация издания делает восприятие информации читателями наиболее удобным. Необходимые справочные сведения по используемым средствам и встроенному языку программирования приводятся по ходу изложения примеров, что также весьма удобно для читателя. Наибольший эффект при чтении будет достигаться при параллельном выполнении приведенных разработок на компьютере. Именно для этого все технические шаги в книге описаны достаточно подробно.
В главе 1 читатели познакомятся с такими основными объектами конфигурации, как перечисление, справочник, документ и отчет. На практических примерах будет рассмотрена технология разработки электронных форм, яв-яющихся обязательным атрибутом интерфейса пользователя. Первые шаги в программировании будут выполнены с использованием конструкторов — замечательных средств для облегчения труда разработчика. Самостоятельное программирование (без использования конструкторов) начнется с небольших процедур, которые будут понятны читателям, не встречавшимся до этого с системой 1С:Предприятие 8 либо работавшим в ней только в качестве пользователей. Вы увидите, как легко с помощью несложного программного кода можно обеспечить необходимый сервис для последующей работы сотрудников организации.
В целом стратегическая цель главы 1 заключается в том, чтобы заложить у читателя базовые навыки по работе с конфигуратором, который представляет собой один из режимов работы системы 1С:Предприятие. Результатом груда разработчика в этом режиме является конфигурация — ее использует пользователь при работе в режиме работы 1С:Предприягие (это второй важный режим работы этой системы).
6
Введение
В главе 2 детально рассматривается создание конфигурации, связанной с решением одной из задач, которая возникла в ходе управления деятельностью подразделением высшего учебного заведения. Разработка касается учета оплаты за обучение. Одним из ключевых моментов второй главы является демонстрация возможностей нового объекта системы 1С:Предприятие 8— регистра сведений (в очень популярной версии 7.7 он отсутствовал).
В целом пример конфигурации из гчавы 2 показывает, как легко с помощью разнообразных объектов системы, их свойств и методов можно создать удобные пользовательские решения для автоматизации офисной работы. Рассмотренная разработка позволит читателю в дальнейшем создавать собственные прикладные решения для фирмы, где он работает. Как показала практика, ценность специалиста, имеющего подобные навыки, значительно увеличивается, и очень часто он воспринимается руководством не как обыкновенный пользователь, а как достаточно квалифицированный программист.
Глава 3 целиком отведена языку запросов, который позволяет обеспечить удобный доступ к имеющимся в системе данным. Содержание главы не представляет собой исключительно справочную информацию, а, напротив, отличается тем, что для каждой синтаксической конструкции языка запросов приводятся примеры. Результаты выполнения рассматриваемых запросов продемонстрированы иллюстрациями, отражающими работу в режиме 1 С:Предприятие. Заметим, что в этой главе не создается новая информационная база, а все запросы извлекают данные из структур, созданных ранее в примерах глав 2 и 3 книги.
В главе 4 подробно разбирается реальная задача, которая также связана с учетом внесения оплаты за обучение. Основная особенность созданной конфигурации заключается в том, что в ней присутствует не встречавшийся до этого в тексте книги объект системы 1С:Предприятие — регистр накопления. Большое внимание уделяется построению разнообразных отчетов по информации, содержащейся в регистрах накопления
Цель главы 5 заключается в демонстрации разнообразных возможностей, заложенных в уже встречавшиеся до этого в тексте книги объекты конфигурации. Кроме того, мы познакомимся с возможностью эффективного построения сводных таблиц, которые являются очень удобной формой представления информации. В настоящее время большое внимание уделяется интеграции различных приложений, что позволяет существенно автоматизировать работу офиса и избежать многих неэффективных действий. В этом плане интересным представляются примеры организации взаимодействия
введение
7
1С:Предприятие с такими офисными приложениями, как Microsoft Excel и Microsoft Word, приводимые в заключительной части гчавы 5.
Компакт-диск
Сопроводительный компакт-диск содержит все разработки, приведенные в книге. Основная составляющая диска — это конфигурации, описание разработки которых и составляет содержательную часть издания. Кроме того, как уже говорилось ранее, часть рассмотренных примеров в книге связана с интеграцией работы системы Ю.Предприятие 8 и популярных офисных приложений. Упоминаемые в издании автоматизированные книги Microsoft Excel и документы Microsoft Word также располагаются на компакт-диске. Все файлы распределены по тематическим папкам, а подробная инструкция работы с ними приводится в конце книги.
От автора книги
Во-первых, мне бы хотелось выразить благодарность всем читателям, которые познакомились с моей книгой. Это не первая моя книга по тематике, связанной с системой 1С:Предприятие, однако все предыдущие были выпущены небольшими вузовскими тиражами и касались программного продукта 1С:Предприятие 7.7. При этом большинство изданий имели положительные отзывы, как со стороны учащихся, так и со стороны преподавателей. Это и явилось для меня стимулом попробовать издать книгу в одном из наиболее известных издательств. И я очень благодарен издательству «БХВ-Петер-бург», которое приняло решение о выпуске этого издания.
Большую помощь при подготовке книги оказала моя супруга. Если в каком-то среди многочисленных практических примеров вы отметите удачное его изложение, то, скорее всего, это связано с ее участием.
Что касается приведенных примеров, то все они связаны с работой вечернего факультета Нижегородского государственного лингвистического университета им. Н. А. Добролюбова. Декану этого факультета Юрию Васильевичу Воронкову я хочу выразить большую благодарность. Фактически, материал большинства глав появился как результат его эффективного управления организацией учебного процесса. Поставленные им задачи и его участие в раз
8
Введение
работке рассмотренных в книге конфигураций предопределили появление этого издания.
В заключение еще раз замечу, что наибольший эффект будет наблюдаться в том случае, если вы параллельно с чтением будете выполнять практические примеры непосредственно в системе 1С:Предприятие 8.
Я боюсь, что книга не лишена неточностей. Все их я отношу исключительно на свой с^ет, и заранее приношу читателям за них свои извинения.
Связаться с автором книги можно по электронной почте mail@bhv.ru, а также можно обратиться по адресу http://www.bhv.ru/, итобы выразить свое отношение к книге.
Глава 1
Представление об объектах системы 1С:Предприятие
В настоящее время популярность программного продукта 1С:Предприятие 8 стремительно растет, и, соответственно, наблюдается увеличение потребности в специалистах, знакомых с этой информационной системой. Часто уровень квалификации в данной области является определяющим при подборе кандидатуры на то или иное вакантное место. При этом в большинстве ситуаций от потенциального сотрудника требуются, в основном, навыки уверенного пользователя при работе с одной из наиболее популярных на сегодняшний день конфигураций системы 1С:Предприятие 8. В этом случае специалист занимается профессиональной деятельностью в своей предметной области (например, бухгалтерия или сфера складского учета), но с использованием современных технологий автоматизации. И большинство сложных задач, связанных с внесением изменений в имеющуюся конфигурацию (например, добавление нового документа или отчета), решает, как правило, системный программист.
Распространена и другая ситуация. Так, в небольших организациях пользователям и программистам (которые не сталкивались до этого с программными продуктами фирмы 1С) часто приходится самостоятельно решать многие практические вопросы, связанные с внесением изменений в имеющуюся конфигурацию. Именно для такой категории читателей мы и попробуем на примерах разобрать основные приемы, касающиеся программирования в среде 1С:Предприятие 8.
Будет правильно, если мы начнем с рассмотрения достаточно простых ситуаций, которые должны быть понятны читателям, только начинающим знаке-
10
Глава 1
миться с программными продуктами фирмы 1С. Разумеется, сразу возникает вопрос—- а что нужно предварительно знать для успешного восприятия изложенного в книге материала. Конечно, желательны навыки в области программирования, а также приветствуется любой опыт работы с информационной системой 1С:Предприятие. Все это придаст читателю больше уверенности при работе с книгой, увеличит скорость рассмотрения примеров и позволит ему быстрее перейти к решению собственных задач. Однако можно обойдись и без этого.
Главное, что необходимо— это наличие на своем компьютере установленной программы Ю.Предприятие 8. В этом случае оптимальная технология работы с книгой на начальном этапе заключается в параллельном выполнении рассматриваемых разработок на своем компьютере. Понятно, что объем справочной информации по программированию в среде 1С:Г1редприятие 8 просто огромен, и уже в середине этой главы нам потребуется познакомиться с рядом справочных сведений. В дальнейшем по ходу всей книги мы будем приводить подобную информацию по мере необходимости, что весьма удобно для читателей. Рассмотрение примеров не закладывает необходимости использования дополнительных источников информации — в ходе рассмотрения примеров будут представлены все необходимые справочные данные.
Для работы нам не потребуется наличие стандартных конфигураций, разработанных для системы 1С:Предприятие 8— мы будем создавать свои собственные и на их примере рассматривать различные технические приемы, необходимые для выполнения прикладных разработок. Конечно, эти конфигурации не будут такими сложными, как разработки специалистов фирмы 1С, однако итогом рассмотрения изложенных примеров для читателей станут навыки, которые они смогут использовать в практической работе с рассматриваемой системой. Читатели смогут после рассмотрения приводимых конфигураций создавать и свои собственные разработки, которые в той или иной степени будут автоматизировать деятельность организаций, где они работают.
Знакомство с конфигуратором
Итак, перейдем к первому примеру по разработке конфигурации для системы ЮПредприятие 8. А именно для решения несложной практической задачи создадим несколько прикладных объектов конфигурации. Далее мы поработаем в качестве пользователей с информационной базой, созданной системой
представление об объектах системы 1С:Предприятие
11
а основании разработанной конфигурации. Все технические моменты, связанные с работой в конфигураторе, будут подробно комментироваться, и, таким образом, читатель легко сможет повторить описанные действия на своем юмпьютере. При желании можно обратиться к компакт-диску, прилагаемому к книге, где приведена разработанная в главе конфигурация (как, впрочем, и все другие конфигурации, описываемые в книге).
Условно будем считать, что наша организация предлагает платные услуги, связанные с учебно-преподавательской деятельностью. Это может быть одно из подразделений в высшем учебном заведении или просто учебный центр, занимающийся коммерческой деятельностью. Мы, как разработчики, попробуем создать конфигурацию, которая поможет управляющему персоналу в автоматизации работы. В результате проделанных действий мы получим базу данных с необходимыми механизмами управления информацией. Одной из целей разработки является создание удобного интерфейса для работы пользователей.
Окно запуска
Вся разработка будет выполняться в конфигураторе, который является одним из режимов работы информационной системы ЮПредприятие 8. По сути, в конфигураторе и были созданы все известные прикладные разработки фирмы 1С.
Итак, после выбора раздела 1С Предприятие 8 в меню Пуск и далее пункта Конфигуратор (либо 1С Предприятие) перед нами открывается стартовое окно информационной системы 1 С:Предприятие 8, показанное на рис. 1.1.
В центральной части окна на рис. 1.1 перечислены уже имеющиеся информационные базы, каждая из которых представляет собой конкретную разработку, направленную на автоматизацию участка работы определенного подразделения либо всей организации в целом. В нашей ситуации мы начинаем решение новой задачи, поэтому от нас потребуется создание новой информационной базы. Эта база будет построена на основании разрабатываемых далее объектов конфигурации.
Примечание
В системе 1С:Предприятие возможны два режима работы — режим конфигуратора и режим 1С:Предприятие. Режим ЮПредприятие является основным и в нем пользователи вводят информацию в систему, получают
12
Гпава 1
необходимые отчеты и т. д. Режим конфигуратора используется разработчиками и системными программистами. В этом режиме производится создание новых разработок.
Рис. 1.1. Стартовое окно информационной системы 1 ^Предприятие 8
Создание новой информационной базы
Действия, приводящие к созданию новой информационной базы, достаточно просты. Сначала следует щелкнуть по кнопке Добавить (рис. 1.1), что приведет к появлению на экране следующего окна (рис. 1.2), в котором необходимо выбрать один из двух сценариев дальнейшего развития событий. Мы пойдем по пути разработки новой информационной базы и, щелкнув по кнопке Далее, перейдем к окну, в котором следует задать способ создания будущей разработки (рис. 1.3). В этом случае перед нами открывается путь создания новой информационной базы при использовании одного из имеющихся шаблонов, однако сейчас мы поступим по-другому и создадим пустую информационную базу.
Очередное окно данного диалога показано на рис. 1.4. Здесь необходимо дать базе имя, и в нашем случае, вместо варианта, предложенного системой по умолчанию, лучше установить другое название, например— Глава 1. Если этот вариант не нравится, то можно выбрать любое другое словосочетание. Кроме того, от нас потребуется указать каталог, где созданная разработка будет располагаться. Для этого необходимо создать пустую папку в любом
ЧреС ставление об объектах системы 1С Предприятие
13
месте на компьютере либо в сети. а в окне диалога указать ее месторасположение В этой папке и будет храниться наша конфигурация, которую мы разработаем в первой главе.
бздм/гиппы	X
Добавлен “ инн )рмационтй базы в список:
•I Создание новой информационной базы
Создание информационной базы из поставляемой юнФигурздии-поставляемой демонстрационной базь или создание пустой информационной базы без конфигурации
Цобавление в список существующей i нФормациинной базы
Включение е список ранее созданной информационной базы, расположенной на данном компьютере, в локальной сети или на сервер е 1С:Предприягия
Рис. 1.2. Окно для добавления новой (существующей) информационной базы
Дев м.демдекнфефмгмдомний базы/группы	X
Создание информационной базь из шаблона
Выберите поставляемую конфигурацию для начала работы или демонстрсционный пример для ознакомив йя
1С Бухгалтеры i предприятия
1С .Зарплата и Управление Персоналом
Ё-аи Профессиональная разработка в системе 1 С:Предприятие
Ё L.-J 1С:У правление торговлей
• Создание информационней базы без конфигурации для разработки ново, конфигурации или загрузки выгруженной ранее информационной базы t |
« Назад: I, Далее ,-J Отмена
Рис. 1.3. Окно выбора способа создания информационной базы
14
Гпава 1
После выбора названия информационной базы на экране повторно появляется окно, о котором мы уже упоминали (рис. l.l), но уже с новой строкой, содержащей название только что созданной информационной базы. Теперь с помощью кнопки Конфигуратор следует перейти в режим разработки объектов конфигурации, на основании которых системой будет построена база данных. Для непосредственной работы с базой предназначен режим 1С:Предприятие. Итак, все предварительные шаги выполнены, и мы можем перейти к основной работе по созданию конфигурации.
В дальнейшем (при последующих сеансах работы на компьютере), когда вы решите продолжить созданную разработку, от вас потребуется лишь указать название информационной базы из списка (рис. 1.1) и после этого нажать кнопку Конфигуратор или кнопку 1С:Предприятне (рис. 1.1).
Вернемся к прерванным практическим действиям — мы остановились на том, что с помощью кнопки Конфигуратор открыли окно режима с аналогичным названием (рис. 1.5). Это и есть инструментальная среда, в которой мы будем создавать объекты конфигурации. Все прикладные решения для автоматизации различных участков деятельности созданы разработчиками именно с использованием конфигуратора.
Рис. 1.4. Окно для указания наименования создаваемой информационной базы
Представление об объектах системы 1С Предприятие
15
Рис. 1.5. Окно системы 1С:Предприятие 8 в режиме конфигуратора
Следующее, что от нас потребуется — это выбор в меню Конфигурация раздела Открыть конфигурацию. В результате на экране появится окно с деревом объектов конфигурации, которое показано в левой части рис. 1.5. Сейчас в нем присутствуют только заголовки, а в дальнейшем создаваемые нами объекты конфигурации будут автоматически отображаться в этом дереве.
Примечание
Каждая ветвь древовидной структуры описывает определенную тематическую группу конфигурации. Например, при создании новых справочников, они будут группироваться в ветви Справочники, а в ветви Документы найдут свое место объекты конфигурации типа документ. Технология работы с деревом конфигурации аналогична работе с подобными древовидными представлениями в операционной системе Microsoft Windows. Для открытия той или иной ветви (например, для обзора имеющихся в конфигурации справочников) достаточно щелкнуть по обозначению соответствующего знака «плюс».
Постановка задачи по разработке конфигурации
Вначале мы уже сказали, что условно основное направление деятельности нашей фирмы заключается в предоставлении коммерческих образовательных услуг. И мы, как разработчики, попробуем помочь нашим сотрудникам в автоматизации некоторых участков работы с учащимися (слушателями курсов), для обозначения которых будем использовать более общее понятие — «кли
16
Главе. 1
енты». Каждый клиент может записаться на тот или иной платный курс, после чего внести плату за обучение (полностью либо частично), а затем начать посещать занятия. Понятно, что руководство учебного центра должно максимально эффективно контролировать данный процесс.
Наша задача— используя возможности 1С:Предприятие, построить информационную систему для внесения, хранения и извлечения информации, которая позволит автоматизировать работу персонала учебного центра. Для этого нам потребуется создать объекты конфигурации, которые будут отражать реальную ситуацию в организации учебного процесса. Фактически мы создадим модель предметной области, которую затем реализуем на практике, используя возможности системы 1С:Предприятие 8.
Перечисления
Среди большого количества объектов информационной системы 1С:Пред-приятие 8 наиболее простыми являются перечисления, представляющие собой статические списки данных, которые создаются на этапе разработки и в дальнейшем просто используются (бе° возможности их изменения или дополнения при работе в режиме 1С:Предприятие). Перечисления в основном используются не самостоятельно, а в совокупности с другими типами данных. Так, эти объекты применяются для ввода значений реквизитов справочников и документов. Основная цель при использовании перечислений — исключить неоднозначность вводимой информации.
Первым объектом, который мы создадим в конфигураторе, будет перечисление с именем Статус, отражающее статус конкретного учащегося. Дело в том, что статус не подразумевает какого-то большого многообразия возможных значений. Кроме того, для данного параметра характерна продолжительная неизменность во времени (если происходит добавление какого-то нового значения для статуса, го это случается очень редко). Фактически, для подобных ситуаций объект перечисление и был разработан. В нашей ситуации будем считать значениями статуса учащегося следующие:
□	Зачислен;
□	Отчислен;
□	Сертификат.
Теперь перейдем к техническим действиям, позволяющим сказанное реализовать на практике. В режиме конфигуратора для создания нового перечне-
"Оставление об объектах системы 1С:Предприятие	17
тения необходимо в дереве объектов конфигурации (рис. 1.5) щелкнуть пра-ой кнопкой по строке Перечисления. В результате на экран? откроется контекстное меню, состоящее из единственного пункта— Добивать, который сы и выберем, чтобы перейти к работе в окне редактирования объекта кон-dryрации (рис. 1.6).
Примечание
Для выполнения большинства технических действий в системе 1С:Пред-приятие, как правило, существует несколько способов. Это весьма характерно для современных программных продуктов. В документации, входящей в комплект 1С:Предприятие 8, а также в издании [2] указываются различные способы достижения целей, которые возникают в процессе разработок прикладных решений. Здесь же (и далее в книге) для выполнения определенного действия мы будем ограничиваться одним из способов (который, по нашему мнению, наиболее удобен).
Окно редактирования объекта конфигурации содержит несколько тематических закладок, что обеспечивает удобство работы разработчика. Сейчас от нас требуется на закладке Основные внести слово Статус в поле Имя, а что касается полей Синоним и Комментарий, то мы их заполнять не будем, но поясним назначение этих полей в следующем примечании.
Примечание
В системе 1С:Предприятие для редактирования свойств основных объектов конфигурации (а также для настройки взаимодействия между объектами) предназначено окно редактирования объекта конфигурации. Редактируемые свойства располагаются на нескольких закладках, и каждая закладка предназначена для настройки свойств конкретной категории. Сами закладки (их название и содержание) меняются в зависимости от типа объекта конфигурации (так, закладки для перечислений и, скажем, для справочников различны). Все основные объекты конфигурации, с которыми мы встретимся в книге, содержат закладку Основные. Ключевое поле здесь — Имя, значение которого представляет собой идентификатор объекта конфигурации. Другое поле Синоним используется в различных ситуациях в режиме работы 1С:Предприятие как представление объекта, понятное для пользователя. В частности, поле Синоним используется в качестве названия раздела меню, связанного с открытием конкретного справочника, документа, отчета и др. Дело в том, что на имя любого объекта накладывается ряд ограничений, например, в нем не должно быть пробелов. В этом случае при использовании сочетаний из нескольких слов имя объекта (например, документ ПриходнаяНакладная) смотрится несколько непривычно для рядового пользователя, который чаще всего не сталкивал
18
Гпава 1
ся с программированием. И для того чтобы при работе в режиме 1С:Предприятие объект ассоциировался с названием в более традиционной для пользователя форме, следует использовать раздел Синоним для замены имени в меню. На синоним не накладывается подобных ограничений. Третье поле Комментарий носит вспомогательный характер и представляет собой произвольную строку символов. Смысл этого поля заключается в расшифровке и пояснении назначения данного объекта. В последующих примерах мы не будем заполнять поле комментария каким-либо образом.
Рис. 1.6. Окно редактирования перечисления Статус
Таким образом, несложные действия привели к тому, что мы легко создали первый объект нашей конфигурации, который пока, правда, пуст. Для того чтобы внести в перечисление Статус несколько значений, следует перейти на закладку Данные и добавить необходимую информацию (рис. 1.7). Для внесения значений следует воспользоваться пиктографическим меню в верхней части окна редактирования объекта конфигурации. С помощью этих кнопок легко не только добавлять, но и корректировать и удалять элементы.
Вернемся к перечислениям. У читателя наверняка возникает вопрос— как перечисления и, в частности, перечисление статус использовать? В этой главе мы создадим еще один объект— справочник клиенты, в котором введем реквизит с именем Статус. Он будет принимать варианты только из набора значений перечисления Статус, что запретит пользователю вводить любые другие данные в него, кроме трех уже указанных, уменьшая тем самым возможность ошибочного ввода.
Представление об объектах системы 1 (^Предприятие
19
В практической работе, кроме исключения ошибок, использование заранее определенных списков данных заметно ускоряет работу пользователя в режиме ^Предприятие. Часто наряду с перечислениями для этого используются еще и справочники.
Рис. 1.7. Внесение значений перечисления Статус
Заметим, что справочники — это существенно более сложные (в плане программирования и функциональных возможностей) объекты по сравнению с перечислениями, и в следующем разделе мы с ними познакомимся.
Справочники
Упрощенно говоря, справочник можно считать совокупностью строк, причем в каждой строке присутств) ет несколько колонок (количество колонок одинаковое для каждой строки). Строки представляют собой имеющиеся в справочнике записи (или более точное название— элементы справочника), а ко-юнки опоеделяют структуру этих записей. В отличие от перечислений, в справочники пользователь при работе в режиме 1С:Предприятие может вносить информацию, а именно добавлять новые элементы справочника, удалять ненужные и редактировать существующие.
Как уже говорилось, справочники используются в ситуациях, когда необходимо исключить неоднозначно трактуемый ввод информации. Аналогом справочника является список данных, который может корректироваться и
20
Гпава 1
дополняться в процессе работы. Например, это могут быть списки номенклатуры, организаций или сотрудников.
Система 1С:Предприятие 8 позволяет создавать практически любое количество справочников. При этом в конфигураторе формируется структура любого справочника, а данными он заполняется уже в режиме 1С.Предприятие.
Примечание
Справочники в системе 1С:Предприятие могут быть иерархическими. Так, в случае наиболее часто используемой иерархии групп все элементы справочника делятся на два вида — простые элементы и группы. Например, в справочнике «Товары» могут существовать группы— «Продукты», «Одежда», «Обувь» и др А внутри каждой из этих групп уже располагаются товары с указанием их стоимости и прочих свойств. Другой вариант иерархии — иерархия элементов. В этом случае роль групп выполняют сами элементы
Справочник Должности
Продолжим практическую работу в конфигураторе, создав простого справочника— должности, в котором будут содержаться названия должностей специалистов (системный администратор, преподаватель и др.). Вместо неформального слова колонки (что отражает представление справочника в виде таблицы) в системе ЮПредприятие используется более общий термин реквизиты (колонок столько, сколько реквизитов у справочника). При этом в любом справочнике всегда есть два обязательных реквизита (присутствующие в любом справочнике независимо от наших действий), которыми являются код и Наименование (другими словами, в каждой строке справочника всегда есть поле кода и поле наименования).
Технические действия при разработке справочников сперва аналогичны тем, которые мы рассматривали выше при создании перечислений. Так, для того, чтобы создать новый справочник, необходимо щелкнуть правой кнопкой мыши на пункте Справочники в дереве объектов конфигурации (см рис. 1.5) и в появившемся контекстном меню выбрать пункт Добавить. В результате откроется окно редактирования объекта конфигурации (рис. 1.8). Здесь на закладке Основные следует ввести имя, которое мы собираемся дать этому справочнику — должности.
Таким образом, не выполнив особо сложных действий, мы, тем не менее, создали новый объект конфигурации — справочник должности, с которым
Представление об объектах системы 1 (^Предприятие 21
уже можно работать. Новый технический момент — это заполнение созданного справочника в режиме работы 1С:Предприятие.
Для этого в меню Отладка (рис. 1.8) следует выбрать пункт Начать отладку, что позволит нам перейти в режим 1 С:Предприятие или, можно сказать, в рабочую среду 1С:Предприятие 8 (рис. 1.9). Здесь уже можно работать с информационной базой, построенной системой на основании созданной конфигурации. В частности, в меню Операции | Справочники доступен пункт, соответствующий названию только что созданного справочника Должности.
Рис. 1.8. Окно редактирования справочника должности
Примечание
На самом деле реальная ситуация выглядит чуть сложнее, чем просто два режима работы— режим конфигуратора и режим 1С:Предприятие. Платформа 1С:Предприятие [2] на основе объектов конфигурации создает базу данных, включающую в себя информационные структуры, в которых будут храниться данные. В дальнейшем, для исключения лишней путаницы в терминологии мы часто не будем разделять объекты конфигурации и соответствующие им информационные структуры.
Теперь в режиме 1С:Предприятие заполним только что созданный справочник названиями ряда должностей (рис. 1.10). Это, с одной стороны, даст некоторый практический навык, а с другой — заполненные информацией справочники потребуются для дальнейшей работы.
22
Глава 1
Рис. 1.9 Окно информационной системы в режиме 1С:Предприятие
Рис. 1.10. Вариант заполнения справочника Должности
При вводе данных в справочник следует обратить внимание на один важный момент. В процессе работы в режиме 1 С:Предприятие пользователи просматривают и вводят информацию в справочники с помощью электронных форм. При этом если мы не создаем в конфигураторе формы справочника или какого-либо другого объекта, то система автоматически генерирует стандартные формы (это происходит тогда, когда происходит переход в режим 1С:Предприятие). В частности, экранная форма списка справочника, которую мы использовали на рис. 1.10, генерируется системой по умолчанию.
Таким образом, в режиме конфигуратора (в окне редактирования объекта конфигурации) для любого справочника необходимо лишь ввести имя на за кладке Основные (рис. 1.8), после чего практически сразу можно начать работу по внесению информации в базу данных. Эта возможность позволяет существенно ускорить процесс разработки, когда не требуется включения
редставление об объектах системы 1С:Предприятие
23
дополнительных пользовательских сервисных функций кроме тех, которые имеются в генерируемых системой по умолчанию формах.
Примечание
Форма— это вспомогательный объект системы 1 С: Предприятие, который предназначен для ввода и просмотра информации. Форма может быть эффективно использована для организации работы с данными. При открытии определенной формы справочника, документа или регистра система размещает на ней необходимую информацию. В дальнейшем при вводе данных в элементы, расположенные на форме, они сохраняются в этих основных объектах (тех же справочниках, документах, регистрах и т. д_). Программный продукт 1С:Предприятие 8 предоставляет пользователю возможность при желании отказаться от самостоятельного создания необходимых форм объектов, а использовать те, которые автоматически генерируются системой в режиме 1 С: Предприятие. В этом случае соответственно и от разработчика требуется меньше действий при создании прикладных решений.
После создания в какой-то степени вспомогательного справочника должности (он будет использова гься в дальнейшем для подстановки названий должностей) начнем разработку другого, более важного для рассматриваемой задачи справочника Специалисты.
Заполнив в окне редактирования объекта конфигурации традиционную для обого объекта закладку Основные, перейдем к следующей — Иерархия.
В связи с тем, что наших специалистов мы собираемся классифицировать по группам (по категориям или, можно сказать, по профилю специализации), то на закладке Иерархия следует установить отметку во флажке Иерархический справочник (рис. 1.11). Это позволит в режиме 1 С:Предприятие созвать категории специалистов, скажем, технического и гуманитарного направления. Для рассматриваемой ситуации можно ограничить число уровней иерархии двумя. Следует отметить, что в режиме 1С:Предприятие доступны добные возможности по переносу элементов справочника из одной группы в другую.
Примечание
Количество уровней иерархии в справочнике можно ограничить, что производится с помощью установки соответствующего флажка и выбора необходимого значения в списке Количество уровней иерархии (рис 1.11). Если же данный флаг не установлен, то максимальный уровень вложенности справочника не ограничен.
24
Гпава 1
Рис. 1.11. Закладка Иерархия окна редактирования справочнига с~е-_- алисты
Обратимся теперь к закладке Данные (рис. 1.12), где определяются реквизиты создаваемого справочника. Перед нами открываете i управляющая форма, которая насыщена информацией. В правой верхней части этой формы указаны размеры полей, отводимые для кода и наименования. Эти значения при создании нового справочника задаются по умолчанию, но при необходимости их можно изменить. Что касается длины кода, то достаточно оставить значение, предложенное по умолчанию, а для наименования (фактически для фамилии, имени и отчества специалиста) увеличим число символов до 50.
Примечание
Код используется для идентификации элементов справочника (записей справочника). Содержание поля кода должно быть уникально для каждого элемента справочника. В принципе пользователю можно не задумываться о заполнении этого поля — система сама обеспечивает при работе режиме IC Предприятие автоматическое внесение кодов при создании новых элементов в справочнике. Однако, при желании, можно самостоятельно заполнять поле кода, исходя из определенных соображений Например, при использовании некоторой систематизации, содержимое поля кода помогает пользователю быстро идентифицировать записи (в поле кода при желании можно заложить необходимую информацию об элементах справочника). Наименование отражает основную информацию об элементе справочника (например, если рассматривается справочник городов то поле наименование предназначено для названия города). Для него можно отвести различное число символов, однако существуют рекомендации фирмы 1С (или, можно даже сказать, норматив) для числа символов в наименовании [2].
об объектах системы 1С:Предприятие
25
Рис. 1.12. Закладка Данные окна редактирования справочника Специалисты
В центре окна редактирования справочника (рис. 1.12) располагается поле Реквизиты, в котором с помощью самой левой кнопки верхнего пиктографического меню можно добавлять необходимые дополнительные реквизиты в справочник. Для рассматриваемого нами примера создадим дополнительный реквизит телефоны (рис. 1.13) для хранения информации о контактных телефонах, по которым можно связаться с преподавателем.
Для каждого реквизита должен быть определен тип данных или, по-другому— тип значений, которые в режиме 1С:Предприятие можно в реквизит вносить. Этот параметр (а так же и другие) следует установить в окне свойств, которое открывается с помощью двойного щелчка мышью по имени реквизита. В качестве типа данных для поля Телефоны, если возможных номеров телефонов много, можно указать— строка не более 50 символов (рис. 1.13). После этого добавим еще один реквизит— Рейтинг (тип данных— число) для характеристики квалификации специалиста. Таким же способом при необходимости можно добавлять разнообразные реквизиты в создаваемые справочники, делая их более информативными.
Примечание
С помощью кнопок панели инструментов расположенной над перечнем реквизитов (это фактически подчиненные объекты) производится их добавление, удаление и упорядочивание.
26
Глаеа1 I
Рис. 1.13. Окно редактирования справочника Специалисты
Следует заметить, что в отличие от системы !С:Предприятие 7.7, программный продукт 1С Предприятие 8 позволяет создавать табличные части для справочников.
Примечание
Табличные части также являются объектами конфигурации, только относятся не к категории основных, а к категории вспомогательных объектов.
Для каждого элемента справочника можно создать одну или несколько подчиненных табличных частей (таблиц). Здесь мы сразу воспользуемся этой возможностью и добавим в справочник Специалисты табличную часть с именем МестаРаботы (рис. 1.14).
Дело в том, что часто преподаватели (особенно высокой квалификации) одновременно работают в нескольких местах. При этом у одного специалиста дополнительных мест трудовой деятельности может быть три, а другого даже и пять. И табличная часть справочника для хранения информации подобного плана в этом случае идеально подходит. В противном случае мы должны были бы создавать несколько реквизитов вне табличной части, причем их количество заранее точно предусмотреть достаточно сложно.
едставление об объектах системы 1 (^Предприятие
27
цдлее уже в табличной части местаРаботы создадим (что выполняется с помо-иыо второй слева кнопки пиктографического меню, относящегося к таблич-ым частям) реквизит организация, в качестве типа данных которого следует казать— строка длиной не более 50 символов, а также добавим реквизит лжность (тип данных— справочникСсылка.Должности). В этом случае, при боте в режиме ЮПредприятие попытка заполнения поля Должность приведет к автоматическому открытию формы справочника должности.
Рис. 1.14. Структура справочника Специалисты
Таким образом, мы разработали структуру нового объекта конфигурации — .правочника Специалисты, и теперь следует позаботиться о том, как пользо-атель будет с ним работать. Для этого в информационной системе существуют электронные формы справочников, а инструментальные средства по-'.эляют пользователю создавать необходимые формы для работы в режиме 1С:Предприятие.
<ак уже упоминалось, для ускорения процесса разработки в системе ЮПредприятие 8 автоматически генерируются формы по умолчанию. Ранее
28
Гпава 1
при создании справочника Должности мы уже воспользовались этой возможностью. Данный способ очень удобен, когда после создания объекта конфигурации (справочника или какого-либо другого объекта) необходимо как можно быстрее начать работу по внесению данных в информационную базу или продолжить работу в конфигураторе. В дальнейшем (уже в этой главе) мы будем разрабатывать свои пользовательские формы, а сейчас еще раз воспользуемся двумя формами, генерируемыми системой по умолчанию.
Вернемся к нашей разработке, и на закладке Формы во фрейме Редактирование сделаем установку— Обоими способами (рис. 1.15). Этим мы указываем системе, что в режиме 1С:Предприятие будем использовать две стандартные формы — списка справочника и элемента справочника (данная форма имеет и другое название — Форма диалога). Их система ^Предприятие автоматически создает сама в пользовательском режиме.
Рис. 1.15. Закладка Формы окна редактирования объекта конфигурации
В форме списка информация представлена в виде таблицы, где на каждую запись отводится одна строка (это обычный вид любого справочника). Ос
Представление об объектах системы 1С:Предприятие
29
новным достоинством подобной формы является то, что на экране видны сразу несколько записей (элементов) справочника.
С другой стороны, недостаток формы списка обнаруживается, когда в справочнике присутствует много колонок (большое количество реквизитов), и хотелось бы, чтобы все они одновременно были бы видны пользователю. При практической работе в этом случае форму часто приходится прокручивать для того, чтобы увидеть необходимую информацию. Заметим, что при желании пользователь может самостоятельно настроить состав колонок прямо в режиме работы 1С:Предприятие, хотя существует и другая возможность, о которой мы сейчас расскажем.
Эта возможность заключается в использовании еще одной стандартной формы— формы эчемента, которая позволяет единовременно отображать на экране информацию только об одном элементе справочника. Но при этом, даже если реквизитов в справочнике много— все они видны на экране (точнее, могут быть видны, так как любой визуальный элемент можно сделать невидимым).
У формы элемента имеется еще одно существенное достоинство. Если в справочнике присутствует табличная часть (как в только что созданном справочнике Специалисты), то в форме списка она не отображается, а в форме элемента видна.
Посмотрим теперь, как воспользоваться возможностью редактирования справочника обоими способами в режиме 1С:Предприятие. Для этого перейдем в этот режим (через меню Отладка) и откроем справочник Специалисты.
Ранее, при его разработке, мы указали, что справочник Специалисты будет иерархическим, и сейчас создадим две группы — Техническое направление и Гуманитарное направление (рис. 1.16). Для этого достаточно воспользоваться пиктограммой Создание новой группы из пиктографического меню в верхней части окна формы справочника.
Примечание
Для перехода в режим 1С:Предприятие из режима конфигуратора можно воспользоваться меню Сервис, где следует выбрать пункт “^Предприятие. В процессе разработки конфигурации удобнее пользоваться пунктом Начать отлаДку из меню Отладка.
Теперь мы должны определиться, какую экранную форму справочника специалисты будем использовать при редактировании (она же будет использо
30
Гпава 1
ваться и при создании новой строки в справочнике). Для этого у нас есть форма списка и форма элемента. Один из этих двух вариантов следует установить с помощью пункта Редактировать в диалоге, расположенного в списке Действия (рис. 1.16). Так, при установке опции Редактировать в диалоге в случае попытки создания нового элемента (либо редактирования уже имеющегося) будет автоматически открываться форма элемента. Соответственно, если отменить режим Редактировать в диалоге, будет автоматически открываться форма списка.
Примечание
В реальной работе, как правило, используется большое количество разнообразных форм. Объект конфигурации форма ориентирован исключительно на пользователя — для обеспечения ему удобного интерфейса при работе с основными объектами конфигурации.
На рис. 1.17 показан вариант заполнения элемента справочника для специалиста, который входит в группу Техническое направление. Видно, что в этом случае при редактировании элемента нам становится доступна для работы и табличная часть справочника.
Примечание
Число строк табличной части не может быть более 100 000. В то же время каждый справочник может иметь практически неограниченное число табличных частей.
На рис. 1.18 приведена форма списка рассматриваемого справочника, где в группу Техническое направление внесено несколько элементов. Однако информации о табличной части в этом случае на экране не видно.
Таким образом, на данном этапе мы познакомились с технологией разработки структуры справочников (объектов конфигурации) в режиме конфигуратора, а также узнали, каким образом заполнять справочники данными с помощью электронных форм, создаваемых системой по умолчанию. На этапе разработки и отладки прикладных решений такой вариант используется достаточно часто.
Следующая практическая задача заключается в создании справочника, который будет хранить информацию об учебных курсах, предлагаемых учащимся нашего учебного центра. Также, применяя дополнительные реквизиты, мы разместим в нем еще и информацию о стоимости курсов и их продолжитель
Представление об объектах системы 1С:Предприятие
ности. В функциональном плане новый справочник будет несколько сложнее предыдущего. Так, мы предусмотрим контроль системы за корректностью вводимых данных.
Рис. 1.16. Создание групп в справочнике Специалисты
Рис. 1.17. Заполнение формы элемента справочника Специалисты
32
Глава 1
Примечание
Все разработки, относящиеся к каждой главе, объединены общей задачей, поэтому при параллельном выполнении описанных в книге действий на компьютере желательно соблюдать точность в названиях. Это срязано с использованием приводимых обозначений в программных процедурах.
Рис. 1.18. Форма списка справочника Специалисты
Справочник Курсы
Итак, вернемся в конфигуратор и приступим к созданию еще одного справочника. Техническая работа во многом будет аналогичной ранее рассмотренным действиям, и поэтому подчеркнем лишь существенную информацию для выполнения практических действий в конфигураторе. Создаваемый справочник назовем Курсы и, кроме обязательных кода и наименования, добавим еще четыре реквизита:
П ДатаНачала — для фиксирования начала занятий по данному курсу (очевидно, что в качестве типа данных следует выбрать дата);
П Продолжительность — для определения продолжительности занятий в неделях (тип данных — число);
П Стоимость — для указания стоимости обучения (тип данных — также число);
33
, Оставление об объектах системы 1 С:Предприятие
□ Преподаватель — для определения специалиста, который будет эту дисциплину вести (тип данных — СправочникСсьшка. Специалисты).
Примечание
При создании справочников (как впрочем, и других объектов) системой автоматически генерируются новые типы данных. Например, когда мы создали справочник Специалисты, то в системе автоматически появился новый тип данных СправочникСсьшка.Специалисты Это позволяет нам хранить в указанном выше поле Преподаватель ссылку на конкретный элемент справочника (он также является объектом) специалисты. Подобные типы данных будут часто встречаться в книге при разработке программных модулей.
Продолжим работу и теперь перейдем на закладку Формы (рис. 1 19), где создадим пользовательски ю форму списка. Ранее мы пользовались формой, знерируемой системой по умолчанию, но сейчас она нас не устроит. Для 'эздания формы щелкнем в окне редактирования объекта конфигурации по мзображению лупы, расположенной напротив пункта Основные формы списка.
Рис. 1.19. Закладка Формы окна редактирования справочника Курсы
34
Глава 1
В результате мы перейдем к работе с конструктором экранной формы справочника. В первом окне диалога установим значения опций в соответствии с рис. 1.20 (если вы параллельно выполняете описанные действия на компьютере. то эти параметры, скорее всего, уже установлены конструктором по умолчанию).
Примечание
На рис. 1.20 группа элементов управления во фрейме Выберите тип формы предназначена для выбора типа формы. Состав этих элементов определяется видом объекта конфигурации, для которого мы создаем форму. Для справочников они одни, а для документов — другие. Число форм каждого типа неограниченно, а при наличии у объекта нескольких форм одного типа, одну из них можно назначить в качестве основной. Для указания основной формы при разработке следует установить флажок Назначить форму основной.
Рис. 1.20. Окно конструктора формы справочника Курсы
После этого в следующем окне (рис. 1.21) необходимо будет включить все только что введенные нами реквизиты в создаваемую форму справочника.
Представление об объектах системы 1 (^Предприятие
35
Рис. 1.21. Окно конструктора формы справочника Курсы
Далее, нажав кнопку Готово, мы увидим на экране структуру формы списка справочника Курсы (рис. 1.22). Форма практически готова, следует только немного изменить ширину колонок в соответствии с подписями в первой строке. Это легко сделать с помощью мыши (аналогичным образом подбирается ширина колонок при работе с рабочими листами в приложении Microsoft Excel).
Если скептически взглянуть на только что выполненную работу, то можно сказать, что наши действия привели к созданию формы, на первый взгляд аналогичной той, с которой мы уже встречались (форма списка, генерируемая по умолчанию). Однако основные плюсы выполненной работы вы скоро увидите. А пока перейдем в режим 1С:Предприятие и заполним справочник Курсы (рис. 1.23) информацией с помощью созданной формы.
В принципе, это же мы могли бы сделать и с помощью автоматически генерируемой формы. Плюсы пользовательской формы заключаются в том, что можно дополнить функциональные возможности расположенных на ней элементов управления, а также внести в эти элементы небольшие изменения с помощью визуальных средств разработки. Так, например, разработчик кон
36
Гпава 1
фигурации может написать программную процедуру, выполняемую при определенном событии на форме (при нажатии на кнопку или при выборе значения из списка). Кроме того, на подобной форме самостоятельно можно размещать необходимые дополнительные объекты.
°ис. 1.22. Структура формы списка справочника Курсы
Рис. 1.23. Заполнение справочника Курсы в режиме 1С:Предприятие
Примечание
Форма списка в окне редактирования объекта конфигурации (рис. 1.22) представлена тремя закладками — Диалог, Модуль и Реквизиты. Закладка Диалог отображает прямоугольную область экрана, которая предназначена для размещения разнообразных элементов управления (кнопок, надпи
Представление об объектах системы (^Предприятие 37
сей, полей ввода и др.). Ее содержание определяет интерфейс пользователя при работе с формой в режиме 1С:Предприятие. Закладка Модуль предназначена для размещения процедур на встроенном языке программирования. Эти процедуры обеспечивают обработку действий со стороны пользователя, а также системных событий (например, открытие формы). Закладка Реквизиты отражает совокупность объектов разных типов, принадлежащих форме.
Продемонстрируем теперь на простом примере возможность внесения дополнительных функциональных изменений в форму справочника. Наша первая задача в этом направлении заключается в небольшой доработке созданной формы, и для этого нам потребуются только визуальные средства конструктора форм.
Примечание
В систему 1С:Предприятие заложены разнообразные технические средства разработки. Это, прежде всего, визуальные конструкторские возможности, которые позволяют с помощью движений мыши и'заполнения определенных полей создавать необходимый пользовательский интерфейс. Также в системе имеется свой встроенный язык программирования, с которым мы начнем знакомиться буквально через несколько страниц. Кроме того, существуют разнообразные конструкторы (или мастера), позволяющие генерировать программный код в результате несложного диалога с пользователем.
На рис. 1.23 в колонке с подписью Наименование отражаются названия курсов. Наша задача — изменить это стереотипное название на более смысловое словосочетание Названия курсов. Для этого необходимо в окне редактирования объекта конфигурации двойным щелчком на надписи Наименование открыть окно свойств этого элемента управления и поменять содержимое поля Текст шапки (рис. 1.24). В результате проделанных действий мы изменили только внешний вид формы: на экране изменилась подпись над одной из колонок, а само имя реквизита Наименование не изменилось.
Примечание
В дальнейшем мы будем часто пользоваться окном свойств, поэтому стоит обратить на него внимание.
Теперь, если перейти в режим 1С:Предприятие и открыть справочник Курсы, вы увидите результат— надпись в колонке названий курсов изменилась
38
Глава 1
(рис. 1.25). В форме, генерируемой системой 1С:Предприятие по умолчанию, даже такое простое изменение было для нас невозможно.
Выполним еще одну несложную доработку формы — для продолжительности курсов установим ограничение по интервалу— от двух до семи недель. Это позволит пользователю избежать случайных ошибок в процессе заполнения справочника. Для реализации подобной возможности достаточно всего лишь в окне свойств установить значения параметров — Мин. значение и Макс, значение (рис. 1.26). В нашей ситуации, как сказано ранее, продолжительность курсов будет ограничена интервалом от двух до семи недель.
Рис. 1.24. Изменение текста шапки в форме списка справочника Курсы
Рис. 1.25. Результат изменений формы списка справочника Курсы
Представление об объектах системы 1 (^Предприятие
39
Внесение автоматического контроля возможных ошибок дает на практике существенное преимущество самостоятельно разработанной формы по сравнению с формой, генерируемой системой по умолчанию. ,
Рис. 1.26. Окно свойств поля ввода для продолжительности курсов
Теперь при работе в режиме 1С:Предприятие в случае неправильно указанной продолжительности курсов система сама будет сообщать нам об ошибке (рис. 1.27).
Рис. 1.27. Реакция системы 1С:Предприятие на ошибочный ввод данных
»
Теперь, когда мы разработали несколько справочников (и в том числе справочник Курсы), можно сказать, что знакомство с конфигуратором системы 1С:Предприятие 8 произошло, и наступила очередь познакомиться с встроенным языком программирования. При этом мы начнем нс с самостоятельного написания программ, а пока, в качестве начальных действий, воспользуемся возможностями конструктора, в частности конструктора печати. Это одно
40
Гпава 1
из средств, которое существенно облегчает труд разработчика. В этом случае мы фактически продолжаем работу в режиме визуальной разработки, а программный код генерируется конструктором автоматически как результат выполненных действий. Тем самым он становится доступен для изменения и изучения (что весьма помогает на начальном этапе знакомства с встроенным языком программирования).
Такая технология (получение программного кода с помощью конструктора и его дальнейшее изменение программистом при необходимости) позволяет существенно ускорить процесс разработки и уменьшить количество ошибок и неточностей. Именно этой возможностью мы и воспользуемся в следующем разделе.
Печатная форма справочника
Практически всегда кроме электронных форм справочников при работе пользователям требуются и их печатные варианты (это же распространяется и на другие объекты, с которыми мы столкнемся в дальнейшем). В этом разделе мы узнаем, каким образом можно автоматизировать процесс создания печатных форм для объектов системы 1С:Предприятие 8. Приводимый далее пример будет связан с уже известным справочником Курсы, и поэтому начнем с того, что в режиме конфигуратора откроем окно редактирования этого справочника.
Рис. 1.28. Закладка Макеты  окна редактирования справочника Курсы
Представление об объектах системы 1 (^Предприятие
41
Теперь для дальнейших действий (создания печатной формы) необходимо перейти на закладку Макеты (рис. 1.28), где в нижней части окна присутствует кнопка Конструкторы. Щелкнув по ней, воспользуемся для получения результата еше одним из инструментов разработки системы 1С:Предприятие, который называется Конструктор печати.
Сам по себе диалог достаточно несложен. В первом открывшемся окне от нас потребуется сделать установку для создания процедуры в модуле формы (рис. 1.29). Это приведет к тому, что автоматически созданный конструктором печати текст процедуры будет располагаться в окне редактирования объекта ФормаСписка на закладке Модуль (см. рис. 1.24). Именно там можно будет найти созданную конструктором процедуру, а в дальнейшем мы увидим, каким образом этот результат работы конструктора можно изменить.
Рис. 1.29. Окно конструктора печати
А пока вернемся к техническим действиям. Следующее окно, которое появляется после нажатия кнопки Далее (рис. 1.30), позволяет определить, какие реквизиты шапки мы хотим расположить на печатной форме. В данном случае следует с помощью соответствующей пиктограммы перенести все реквизиты, кроме поля код (если нужно, то можно перенести и его).
42
Глава 1
После нажатия кнопки Далее открывается завершающее окно конструктора, где осталось лишь настроить создание новой кнопки (рис. 1.31), при нажатии на которую в режиме 1С:Предприятие будет вызываться процедура формирования печатной формы справочника. При этом можно выбрать другое имя кнопки, если слово Печать нас не устраивает.
Рис. 1.30. Формирование реквизитов шапки для печатной формы справочника Курсы
Таким образом, действия, выполняемые в диалоге с конструктором печати, достаточно несложные, а результаты его работы, как мы увидим далее, весьма эффективны. Один из этих результатов появляется сразу после нажатия кнопки ОК (рис. 1.31).
На рис. 1.32 показан так называемый макет печатной формы, представляющий собой заготовку (шаблон) для печатного документа, который будет создаваться системой при работе в режиме 1 ("Предприятие Макет печатной формы доступен для разработчика — его всегда можно открыть и посмотреть (а при необходимости и изменить) на закладке Макеты (рис. 1.28). В этом случае на закладке вы увидите пиктограмму нового объекта конфигурации — макета Печать.
тавление об объектах системы 1 С:Предприятие
43
Рис. 1.31. Завершающее окно конструктора печати
Рис. 1.32 Макет печатной формы
Примечание
Для проектирования макета используется редактор табличного документа, входящий в систему 1С:Предприятие. В процессе создания макета в ячейки вводится текст (это может быть выполнено i ie только в результате работы конструктора, но и непосредственно пользователем) При этом можно задавать параметры форматирования для ячеек. Печатные фермы, как правило, содержат несколько различных областей — заголовочную область
44
Гпава 1
таблицу, место для итоговых показателей и др. Это связано с тем, что информация, выводимая в отчеты, обычно неоднородна — есть табличные данные, заголовок, область размещения подписей. Макет представляет собой совокупность прямоугольных областей, каждая из которых служит для формирования своей части печатной формы. Заметим, что табличный документ (его визуальное представление и есть печатная форма) и макет — это различные объекты. И, в общем, они не связаны между собой. Макет представляет собой некий эталон для табличного документа, показывающий, как необходимо создавать табличный документ. Можно сказать, что в конфигураторе мы определяем вид печатной формы, которую мы хотим увидеть затем при работе в режиме 1 (^Предприятие.
Другим результатом работы конструктора печати является процедура печать о, которая выполняется при работе в режиме 1С:Предприятие и взаимодействует с макетом. Результатом этого взаимодействия будет табличный документ, отражающий информацию из справочника (документа или другого объекта). Заметим, что название процедуры мы выбрали сами в процессе диалога с конструктором (рис. 1.29).
Возникает вопрос— как эту процедуру найти или где она находится? Для этого в окне конструктора формы списка справочника следует перейти на закладку Модуль, где и располагается ее текст, который приведен в листинге 1.1.
Кроме того, на самой форме списка справочника конструктором печати создана кнопка с именем Печать (она располагается в правой нижней части на рис. 1.33), щелчком по которой в режиме 1С:Предприятие эту процедуру можно выполнить.
Рис. 1.33. Размещение кнопки Печать на форме списка справочника
Представление об объектах системы 1 (^Предприятие 45
................................................... IfK*	'Ж
Листинг 1.1. Процедура печати справочника курсы .........................................USfcU
Процедура Печать(Элемент)
//({_КОНСТРУКТОР_ПЕЧАТИ_СПИСОК(Печать)
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения
// будут утеряны!!!
ТабДок = Новый ТабличныйДокумент;
Макет = Справочники.Курсы.ПолучитьМакет("Печать");
// Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область);
/J Шапка
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
Выборка = Справочники.Курсы.Выбрать();
Пока Выборка.Следующий() = Истина Цикл
Объект = Выборка.ПолучитьОбъект();
Область = Макет.ПолучитьОбласть("Элемент");
Область.Параметры.Наименование = Объект.Наименование;
Область.Параметры.ДатаНачала = Объект.ДатаНачала;
Область.Параметры.Продолжительность - Объект.Продолжительность;
Область.Параметры.Стоимость = Объект.Стоимость;
Область.Параметры.Преподаватель - Объект.Преподаватель;
ТабДок.Вывести(Область);
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
//}}_КОНСТРУКТОР_ПЕЧАТИ_СПИСОК
КонецПроцедуры
Начальная и последняя строки листинга l.l ограничивают содержание процедуры. Ключевое слово процедура (вместе с ее именем справа) определяет начало процедуры, а другое— КонецПроцедуры говорит о завершении ее текста.
46
Гпава 1
При рассмотрении листинга 1.1 бросается в глаза, что несколько строк начинаются с двух наклонных черт. Это комментарий, который не выполняется, а предназначен лишь для наглядности разработки. В первой выполняемой строке создается новый объект типа табличныйдокумент, а переменной таб-док присваивается ссылка на него. О термине ссылка мы уже упоминали, но здесь попробуем пояснить его смысл более точно.
Дело в том, что в процессе работы программы в памяти компьютера присутствует много объектов, и для работы с ними ключевой является информация об их местонахождении в памяти. Фактически эта информация и содержится в ссылке (ссылке на конкретный объект). После выполнения первой строки процедуры переменная Табдок содержит ссылку на новый табличный документ, что позволяет нам в дальнейшем работать со свойствами и методами этого объекта.
Упрощенно говоря, объект типа Табличныйдокумент представляет собой таблицу, но с разнообразными свойствами и методами работы с ней. В строке
Макет = Справочники.Курсы.ПолучитьМакет("Печать");
используется метод ПолучитьМакето, в качестве входного параметра которого указывается имя макета печатной формы, который был создан непосредственно конструктором.
Примечание
Если сформулировать более точно, то табличный документ является объектом, который предназначен при разработках конфигураций для формирования печатных форм основных объектов (справочников, документов, регистров и др.), а также для форм, в которых информация представляется в табличном виде. Используя свойства и методы этого объекта, можно формировать необходимый пользователю вид таблицы в режиме 1С:Предприятие.
Автоматически созданный конструктором макет с именем Печать имеет несколько областей, одна из которых содержит заголовочную информацию, которая так и называется— Заголовок (см. рис. 1.32). В следующих двух строках процедуры в табличный документ выводится эта первая секция:
Область = Макет.ПолучитьОбласть("Заголовок") ;
ТабДок.Вывести(Область);
Таким способом происходит заполнение табличного документа на основании макета. Содержание областей макета и их названий, сформированное по умолчанию, мы в принципе можем изменить, однако в рассматриваемом
Представление об объектах системы 1 (^Предприятие
47
примере мы этого делать не будем. Для тех, кто любит заглядывать вперед, скажем, что в конце этой главы приведен пример создания макета и процедуры печати, где все технические действия выполняются самостоятельно без помощи конструктора печати. Созданная здесь с помощью конструктора печати процедура поможет нам написать программный код для заполнения табличного документа.
Учитывая вид макета (рис. 1.32), можно сказать, что печатная форма справочника Курсы представляет собой совокупность одинаковых по структуре строк, подписи для которых располагаются в секции Шапка. Метод Выбрать о, применяемый к справочнику курсы, позволяет подготовить последовательную выборку строк справочника. Ключевое слово пока, за которым следует условие и ключевое слово цикл, начинает цикл. т. е. последовательность действий, повторяющуюся, пока условие выполнено. Конец этой последовательности, при достижении которого действия повторяются снова (если условие остается выполненным), обозначается ключевым словом ко-нецЦикла. С гроки выборки извлекаются С ПОМОЩЬЮ другого метода — Следующий (). Этот метод последовательно извлекает все имеющиеся элементы выборки (в данном случае в выборку входят все строки, но может быть и по-другому), и при каждом проходе цикла с помощью строки
Объект = Выборка.ПолучитьОбъект()
мы получаем в переменной с именем объект очередной элемент (строку) справочника. Элемент справочника также представляет собой один из объектов системы 1С:Предприятие. В этом цикле перебора строк справочника производится периодическое заполнение секции Элемент информацией, содержащейся в реквизитах. Для этого используется свойство Параметры, позволяющее получить доступ к значению конкретного параметра, расположенной в области на макете:
Область.Параметры.Наименование = Объект.Наименование;
Примечание
Свойство Параметры содержит коллекцию параметров макета табличного документа.
После установки значений параметров с помощью метода Вывести () область табличного документа заполняется на основании макета И результат выполнения цикла (перебора элементов справочника) заключается в том. что в табличном документе создаются строки, количество которых совпадает с числом элементов в справочнике Курсы.
48
Гпава 1
Завершающая часть процедуры связана с настройкой табличного документа— выводом заголовков, настройки возможности редактирования полученного документа и т. д. Подробнее эти действия мы рассмотрим в последующих разделах, когда будем говорить о табличном документе более детально, а пока только обратим внимание на последнюю строку процедуры:
ТабДок.Показать();
в которой используется метод Показать одля отображения табличного документа на экране.
Теперь осталось перейти в режим работы 1С:Предприятие, открыть форму списка справочника Курсы, внести в справочник несколько названий курсов и щелкнуть по кнопке Печать. На рис. 1.34 показана заполненная печатная форма (вместе с электронной формой списка) в режиме 1С:Предприлтие.
Рис. 1.34. Форма списка и печатная форма справочника Курсы
При желании печатную форму можно скорректировать (изменить содержание ячеек), а также сохранить как рабочую книгу Microsoft Excel (для этого следует в меню Файл выбрать пункт Сохранить копию и далее формат рабочей книги Microsoft Excel).
Представление об объектах системы 1 С:Предприятие
49
Внесение изменений в печатную форму
Попробуем самостоятельно немного изменить вид табличного документа. Из рис. 1.34 видно, что вместе с датой начала курсов выводится еще и время, что нам не требуется, и теперь задача этот недостаток устранить.
В конфигураторе откроем уже знакомый макет Печать, который отражает все поля, выводимые в табличный документ, и шелкнем правой кнопкой на параметре ДатаНачала (рис. 1.35). В результате перед нами откроется контекстное меню, в котором следует выбрать раздел Свойства, где и установим необходимый формат даты (рис 1.35). Если после сделанных изменений перейти в режим 1С:Предприятие и открыть печатную форму справочника, то вы увидите только дату в требуемом формате, без ненужной информации о времени (рис. 1.36).
Рис. 1.35. Окно свойств ячейки макета
Как и в большинстве инструментальных сред разработки, в режиме конфигуратора системы ЮПредприятие имеется возможность размещения на экранных формах разнообразных элементов управления.
Примечание
Редактор форм позволяет размещать на форме различные элементы управления, задавать их размеры, выравнивать границы, определять механизм поведения в зависимости от различных действий пользователя. Основное назначение элементов управления заключается в обеспечении функциональности при работе с формой.
50
Гпава 1
Рис. 1.36. Справочник Курсы и его печатная форма с испопьзованием форматирования даты
Сделаем в рассматриваемой форме списка справочника Курсы еще одну доработку— обеспечим возможность печати только коротких курсов — тех, которые продолжаются только две недели. Для этого на экранной форме списка справочника следует разместить элемент управления типа флажок, с помощью которого можно будет сформировать либо полный печатный вариант справочника, либо только перечень коротких (двухнедельных) курсов. Интерфейс формы списка справочника в этом случае необходимо дополнить элементом управления (рис. 1.37) и обеспечить его функциональность.
Примечание
Флажок— это элемент управления, который предназначен для выбора одного значения (из двух либо трех возможных). Тип значения, связанный с флажком, определяет количество его состояний. Если у флажка установлен тип значения Булево, то он имеет два состояния (установлен либо снят). А если выбран тип значения Число, то флажок может иметь три состояния (установлен, снят либо не определено).
В режиме конфигуратора при открытой форме (в данном случае мы работаем с формой списка) меню в верхней части окна изменяется — в нем появляется раздел Форма. В данной ситуации от нас требуется в этом разделе выбрать пункт Вставить элемент управления, а затем в списке элементов щелкнуть на строке— Флажок. Для флажка установим имя ксроткиекурсы, а аналогичный заголовок (подпись на форме рядом с флажком) среда разработки сформирует автоматически.
Представление об объектах системы 1С:Предприятие
51
Рис. 1.37. Добавление флажка в форму списка справочника Курсы
Теперь от нас требуется немного подкорректировать процедуру печати, ранее созданную конструктором. Требуемые изменения отражены в тексте листинга 1.2. Это будет нашей первой попыткой самостоятельного написания программного кода. Вообще такой стиль программирования достаточно популярен— часть работы выполняется с помощью средств автоматизации, а затем ряд корректирующих действий производится вручную.
„ .. ...........	......-........   ,..VLTTiTT-ПГ.-??"""”",".--—7—Г.’".’ 
Листинг1 2. Процедура печати справочника курсы (с отоором двухнедельных куосов)	.	-	•	i
Процедура Печать(Элемент)
ТабДок = Новый ТабличныйДокумент;
Макет = Справочники.Курсы.ПолучитьМакет("Печать");
// Заголовок
Область = Макет.ПолучитьОбласть Г"Заголовок");
ТабДок.Вывести(Область);
// Шапка
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
Если (ЭлементыФормы.Коротк. ieКурсы.Значение=Истина) Тогда СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Продолжительность",2);
Выборка = Справочники.Курсы.Выбрать(,,СтруктураОтбора);
52
Глава 1
Иначе
Выборка = Справочники.Курсы.Выбрать();
КонецЕсли;
Пока Выборка.След тощийv) = Истина Цикл
Объект = Выборка.ПолучитьОбъект();
Область = Макет.ПолучитьОбласть("Элемен"");
Область.Параметры.Наименование = Объект.Наименование;
Область.Параметры.ДатаНачала = ОСьект.ДатаНачала;
Область.Параметры.Продолжительность = Объект.Продолжительность;
Область.Параметры.Стоимость = Объект.Стоимость;
Область.Параметры.Преподаватель = Объект.Преподаватель;
ТабДок.Вывести(Область) ;
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
КонецПроцедуры
Прежде чем прокомментировать новые строки листинга 1.2, учтем, что многие с раз) попробуют посмотреть результат выполнения данной процедуры в режиме 1С:Предприятие. В связи с этим сделаем важное замечание. Перед просмотром результата наших действий необходимо вернуться в окно редактирования объекта конфигурации и у реквизита продолжительность установить значение индексировать для свойства индексировать (рис. 1.38). Зачем мы так сделали— поясним ниже, а пока перейдем в режим 1 С:Предприятие и посмотрим, как выполненные изменения сказываются на формировании табличного документа.
Теперь когда мы убедились, что все работает именно так, как предполагалось, можно прокомментировать изменения в тексте процедуры. Так в программный код мы добавили оператор условия
Если ЭлементыФормы.КороткиеКурсы.Значение=Истина Тогда
который позволяет выполнить последующий (до ключевого слова иначе) фрагмент программы только при выполнении указанного условия.
Представление об объектах системы 1 (^Предприятие 53
Примечание
Оператор Если управляет выполнением программы, основываясь на результате логического выражения Операторы процедуры, следующие за ключевым словом Тогда, выполняются, если результатом логического выражения является значение Истина. Операторы, следующие за ключевым словом Иначе, выполняются (до оператора КонецЕсли), если результат логического выражения в конструкции Если оказался равен значению Ложь. Заметим, что оператор Если имеет еще расширенный вариант синтаксиса для использования, информацию по которому можно легко найти с помощью системы электронной помощи, включенной в программный продукт 1С:Предприятие 8.
Рис. 1.38. Окно свойств реквизита продолжительность
Программно состояние флажка короткиеКурсы определяется с помощью свойства этого объекта— Значение, и если флажок установлен, то значе-ние=Истина.
Примечание
Слова Истина и Ложь являются ключевыми во встроенном языке программирования системы 1 ^Предприятие, и они часто используются в подобных программных конструкциях. Переменные, имеющие тип данных Булево, могут принимать ТОЛЬКО Значения Истина И Ложь
54
Гпава 1
Таким образом, если пользователем рассматриваемый флажок на форме установлен, то выполняется фрагмент процедуры, позволяющий сформировать условия отбора для метода выбрать ():
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Продолжительность",2);
Выборка = Справочники.Курсы.Выбрать(,,СтруктураОтбора);
Объект структура представляет собой коллекцию пар. Каждая пара состоит из имени переменной (ключа) и значения переменной, которое нас устраивает при дальнейшем отборе (это значение ключа). В данном случае в структуре отбора размещается переменная продолжительность (реквизит справочника), а для ее значения устанавливается цифра 2 (две недели). После этого для справочника применяется метод Выбрать () с использованием параметра СтруктураОтбора, и этому методу стоит дать небольшой комментарий.
У метода выбрать о четыре параметра, но все они являются необязательными. Мы здесь используем только третий параметр, который задает поле и значение отбора для выборки. Поэтому в программной конструкции место первых двух необязательных параметров необходимо отметить запятыми.
Примечание
В качестве реквизитов для отбора могут задаваться только поля Код, Наименование и те реквизиты справочника, для которых в конфигураторе признак индексирования установлен В значение Индексировать ИЛИ В значение Индексировать с доп. Упорядочиванием.
В СВЯЗИ С ЭТИМ СТОИТ обратить внимание, чтобы ДЛЯ реквизита Продолжительность признак индексирования был установлен в значение Индексировать (рис. 1.38). После этого метод Выбрать () позволяет сформировать выборку элементов справочника по заданным условиям.
Если в режиме работы 1С:Предприятие флаг короткиеКурсы на форме не установлен, то метод Выбрать () в тексте процедуры вызывается без указания отбора и позволяет получить в выборке все элементы справочника Курсы.
Доступ к созданным элементам на форме обеспечивается с помощью объекта ЭлементыФормы. Далее (через точку) правила синтаксиса требуют указать имя элемента управления, который нам необходим, а затем, также через точку, его свойство. Таким образом, установлен ли флажок на форме, проверяется с помощью следующей программной конструкции:
ЭлементыФормы.КороткиеКурсы.Значение = Истина
Представление об объектах системы 1 (^Предприятие
55
В результате добавленного программного кода при снятии флажка на форме табличный документ будет заполняться всеми элементами, внесенными в справочник Курсы, а при его установке в печатную форму попадут только те курсы, продолжительность которых равна двум неделям.
Примечание
Объект ЭлементыФормы является коллекцией размещенных на форме элементов управления.
Для тестирования дополненной разработки в режиме работы 1С:Предприятие внесем в справочник двухнедельный курс, а затем при установленном флажке заполним печатную форму. Полученный результат показан на рис. 1.39.
Рис. 1.39. Печатная форма справочника с отражением только коротких курсов
В данном случае условие отбора достаточно просто, и рассматриваемого программного отбора вполне достаточно. Однако при усложнении задачи удобнее воспользоваться языком запросов, описанию которого в книге посвящена глава 3.
56
Гпава 1
Справочник Клиенты
Добавим в нашу информационную базу еще один справочник, который назовем клиенты. В нем будут перечислены учащиеся или слушатели наших курсов. Для продолжения практических действий вернемся в конфигуратор и начнем уже известным нам способом создание нового справочника.
Во-первых, на закладке Данные необходимо внести информацию о реквизитах в соответствии с рис. 1.40. Для реквизитов справочника Адрес и телефоны укажем тип данных — строка длиной не более 50 символов.
Во-вторых, с помощью кнопки пиктографического меню в нижней части окна редактирования объекта конфигурации создадим табличную часть с именем ИзучаемыеКурсы.
Рис, 1.40. Окно редактирования справочника Клиенты
В-третьих, в созданной табличной части разместим два реквизита (рис. 1.41)— Курс (тип данных— СправочникСсылка . Курсы) И СтатусУчаще-
Представление об объектах системы 1С:Предприятие
57
гося (тип данных — перечислениеСсылка. Статус). В этом случае при заполнении данных полей в режиме работы 1С:Предприятие будут открываться соответственно форма списка справочника Курсы и форма списка перечисления Статус.
Для просмотра и заполнения справочника в режиме работы 1С:Предприятие можно было бы воспользоваться электронными формами ввода, генерируемыми системой по умолчанию. Однако далее в этом разделе нам понадобится разместить на форме кнопку Печать, и для того, чтобы это сделать, необходима пользовательская форма.
Рис. 1.41. Добавление реквизитов в табличную часть справочника Клиенты
Первое, что для этого требуется — перейти на закладку Формы (рис. 1.42), где во фрейме Редактирование следует выбрать пункт В диалоге. Иначе при редактировании в форме списка табличная часть справочника будет недоступна. Можно было также воспользоваться и вариантом Обоими способами. Тогда в режиме 1С:Предприятие пользователю предоставляется возможность выбора или формы списка, или формы элемента. Для этого следует использовать кнопку Действия (она видна в левом верхнем углу на рис. 1.39).
58
Гпава 1
Рис. 1.42. Закладка Формы окна редактирования справочника Клиенты
Примечание
На практике вариант редактирования данных обоими способами при работе со справочниками используется очень часто в связи с его мобильностью — легко перейти от одной формы к другой. Форма списка концентрированно отражает информацию о фрагменте элементов справочника, но при этом если реквизитов много, то представление информации оказывается не очень удобным для просмотра. Эту проблему снимает форма элемента, которая предоставляет удобную возможность для просмотра, анализа и изменения содержимого элементов справочника
Вернемся к нашей разработке в конфигураторе и щелкнем по изображению лупы во фрейме Основные формы напротив надписи Элемента и сделаем необходимые установки в следующем окне (рис. 1.43).
После щелчка по кнопке Далее перед нами открывается окно, позволяющее скрыть либо отобразить отдельные реквизиты справочника на форме (рис. 1.44). В данном случае следует оставить все созданные нами реквизиты.
После этого осталось нажать кнопку Готово, и в итоге мы увидим на экране сформированную форму элемента справочника клиенты (рис. 1.45).
Представление об объектах системы 1 С:Предприятие
59
Рис. 1.43. Окно конструктора формы справочника
Рис. 1.44. Окно для управления отображением реквизитов справочника на форме
60
Гпава 1
Рис. 1.45. Форма элемента справочника Клиенты в режиме конфигуратора
Теперь, когда предназначенная для работы со справочником форма готова, можно перейти в режим 1С:Предприятие (с помощью знакомого пункта меню Начать отладку) и внести информацию об учащихся в созданный справочник. На рис. 1.46 показан вариант заполнения формы элемента справочника информацией по одному из учащихся.
Теперь перейдем к созданию печатного варианта формы элемента справочника (табличного документа, отражающего информацию, расположенную на форме). Для этого воспользуемся опять возможностями конструктора печати и совершим уже знакомые технические действия — в окне редактирования объекта конфигурации (рис. 1.47) перейдем на закладку Макеты, где воспользуемся кнопкой Конструкторы.
Примечание
В системе имеются различные конструкторы, облегчающие труд разработчика. Это конструкторы форм констант, справочников, документов, журналов документов, отчетов и других объектов, конструкторы печатных форм, конструкторы движений регистров и другие.
Представление об объектах системы 1 (^Предприятие
61
Рис. 1.46. Форма справочника Клиенты в режиме работы 1С:Предприятие
Рис. 1.47. Закладка Макеты окна редактирования справочника Клиенты
62
Гпава 1
В процессе диалога с конструктором укажем, что создаваемая процедура должна располагаться в модуле формы (в данном случае это будет ФормаЭлемента). В реквизиты шапки перенесем Наименование, Адрес И Телефоны, а в реквизиты табличной части — Курс и СтатусУчащегося. Подвал табличного документа нам не потребуется. В завершение диалога укажем па необходимость создания кнопки Печать на форме. Выполнив этот несложный диалог с конструктором, на закладке Макеты мы увидим макет Печать (рис. 1.48).
Рис. 1.48. Макет табличного документа
Как мы уже знаем, параллельно с формированием макета конструктор печати на закладке Модуль формы элемента справочника расположил программную процедуру, позволяющую создать табличный документ на основании структуры макета Печать и информации, содержащейся в справочнике (листинг 1.3).
----.........-------------...—— ---------  ----,	у — г
Листинг 1,3, Процедура печати элемента справочника клиенты • .. . к *
Процедура Печать(Элемент)
//{{_КОНСТРУКТОР_ПЕЧАТИ_ЭЛЕМЕНТ(Печать)
// Данный фрагмент построен конструктором.
Представление об объектах системы 1С:Предприятие	63
// При повторном использовании конструктора, внесенные вручную изменения // будут утеряны!!!
ТабДок = Новый ТабличныйДокумент;
Макет = Справочники.Клиенты.ПолучитьМакет("Печать");
// Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область);
// Шапка
Область - Макет.ПолучитьОбласть("Шапка");
Область.Параметры.Наименование = Наименование;
Область.Параметры.Адрес = Адрес;
Область.Параметры.Телефоны = Телефоны;
ТабДок.Вывести(Область);
// ИзучаемыеКурсы
Область = Макет.ПолучитьОбласть("ИзучаемыеКурсыШапка");
ТабДок.Вывести(Область);
Для Каждого ТекСтрокаИзучаемыеКурсы Из ИзучаемыеКурсы Цикл
Область = Макет.ПолучитьОбласть("ИзучаемыеКурсы");
Область .Параметры.Курс = ТекСтрокаИзучаемыеКурсы.Курс;.
Область.Параметры.СтатусУчащегося =
ТекСтрокаИзучаемыеКурсы.СтатусУчащегося;
ТабДок.Вывести(Область);
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
КонецПроцедуры
Здесь новым моментом является использование цикла перебора строк табличной части элемента справочника
Для Каждого ТекСтрокаИзучаемыеКурсы Из ИзучаемыеКурсы Цикл
Такой цикл позволяет заполнить табличную часть печатной формы элемента справочника Курсы. В остальном же программные строки созданной конструктором процедуры уже знакомы нам по листингу 1.2.
64
Гпава 1
Примечание
Оператор цикла для Каждого предназначен для циклического обхода коллекции значений. При каждой итерации цикла возвращается новый (очередной) элемент коллекции. Цикл продолжается до окончания перебора всех элементов.
На рис. 1.49 показан пример формирования печатной формы элемента справочника Курсы в режиме 1С:Предприятие.
Теперь уже можно подвести промежуточный итог и отметить, что мы получили первые практические навыки по работе со справочниками — объектами конфигурации, которые очень часто используются на практике для хранения достаточно статичной информации. В большинстве ситуаций требуется фиксирование информации о событиях, происходящих в подразделении либо в организации в целом. Для этого в системе 1 С:Предприятие 8 существуют другие объекты, среди которых в первую очередь следует отметить документы. В следующем разделе мы с ними начнем знакомиться
Рис. 1.49. Печатная форма элемента справочника Клиенты
Представление об объектах системы 1 С:Предприятие 65
Документ Внесение оплаты
Сразу отметим, что документы относятся к наиболее востребованным разработчиками объектам конфигурации Как уже говорилось, они предназначены для фиксирования информации о происходящих событиях в подразделении или в организации в целом.
В этом разделе наша задача — познакомиться с их организацией и некоторыми техническими приемами при разработке документов в конфигураторе. Мы создадим документ, который будет фиксировать информацию о текущей оплате за обучение. И первое, уже знакомое действие на этом пути, заключается в щелчке правой кнопкой мыши на строке Документы в окне Конфигурация (рис. 1.50), после чего начинается несложная работа с конструктором документа. Назовем создаваемый объект конфигурации ВнесениеОплаты. Этот документ будет предназначаться для фиксации внесенной оплаты за обучение конкретным учащимся, определяемой набором курсов, которые он посещает.
Рис. 1.50. Окно редактирования документа
Примечание
Документ — одно из основных понятий системы 1С:Предприятие 8 [1]. Каждый объект данного типа содержит информацию о конкретной хозяйствен
66
Гпава 1
ной операции и характеризуется своим номером, датой и временем. Дата и время создания документа позволяют устанавливать строгую временную последовательность совершения операций В конфигураторе создается только структура документа а конкретные экземпляры документов вводятся в информационную базу при работе в режиме 1С:Предприятие пользователем. В дальнейшем для краткости вместо словосочетания структура документа будет использоваться просто слово документ.
Заполнение закладки Данные
На рис. 1.51 показана закладка Данные окна редактирования объекта конфигурации, на которой необходимо определить поля создаваемого документа. Заметим, что любой документ имеет шапку — общую или заголовочную часть, а также одну или несколько табличных частей. В шапке размещается информация, общая для всего документа в целом.
Для нашего создаваемого документа ВнесениеОплаты в области шапки разместим два реквизита — клиент и телефоны. В качестве типа данных первого из них установим — СправочникСсылка. клиенты, а для другого выберем строковый тип данных — строка не более 50 символов.
Рис. 1.51. Структура документа ВнесениеОплаты
Представление об объектах системы 1 (^Предприятие
67
С помощью приведенной далее процедуры (листинг 1.4) программным способом обеспечивается автоматическое заполнение поля телефоны, когда пользователь в режиме работы 1С:Предприятие вносит информацию в поле клиент (т. е. выбирает необходимого клиента из справочника).
Перейдем теперь к разработке табличной части документа. Следует заметить, что большинство реальных документов содержат один или несколько перечней каких-либо данных (строк или элементов). Это может быть список сотрудников, или список номенклатуры, или что-то другое. Для отображения подобной информации в объект конфигурации документ заложена возможность создания табличных частей.
Примечание
Табличные части— это также объекты конфигурации, но они являются подчиненными основным объектам. С ними мы уже встречались при работе со справочниками. И в том, и в этом случае табличные части подчинены основным объектам (элементу справочника или документу). В плане программирования для объекта табличная часть существует многообразие свойств и методов работы с ними.
На практике для документов с несложной структурой используется одна табличная часть, но в типовых конфигурациях, созданных программистами фирмы 1С, вы найдете немало документов с включением нескольких таких частей.
После такого комментария вернемся к практике, и в разрабатываемом документе ВнесениеОплаты создадим табличную часть (см. рис. 1.51), которую назовем ОплатаКурсов, а в ней разместим два реквизита:
О Курс (тип данных — СправочникСсьшка.Курсы);
П ВнесеннаяСумма (тип данных — ЧИСЛО).
Форма документа
После определения структуры документа перейдем к разработке интерфейса пользователя для работы с документом — к созданию его экранной формы. Для этого в окне редактирования объекта конфигурации (рис. 1.52) выберем закладку Формы и приступим к созданию формы документа. В данной ситуации пользоваться формой генерируемой системой 1С:Предприятие 8 по умолчанию мы не будем.
68
Глава 1
В дальнейшем нам придется добавлять в разработку собственные программные процедуры, поэтому и необходимо создать пользовательскую форму. Для этого шелкнем по изображению лупы во фрейме Основные формы напротив надписи Документа (рис. 1.52) и перейдем к работе с конструктором документа.
Рис. 1.52. Закладка Формы окна редактирования документа
Теперь в первом появившемся окне диалога следует сделать установки (реально они должны быть выполнены по умолчанию) в соответствии с рис. 1.53. После этого, нажав кнопку Далее, мы увидим следующее окно (рис. 1.54) конструктора, позволяющее отобразить (либо исключить) на форме определенные реквизиты документа.
Работа в режиме диалога с конструктором формы документа завершается щелчком по кнопке Готово, что приведет к отображению на экране формы документа с автоматически созданными на ней элементами управления (рис. 1.55).
На этом работа с конструктором документа в конфигураторе завершена, и далее требуется перейти в режим IС Предприятие, где и следует заполнить несколько документов только что созданного вида. Один из вариантов внесения информации в документ показан на рис. 1.56.
Представление об объектах системы 1С:Предприятие
69
Рис. 1.53. Окно конструктора формы документа

Рис. 1.54. Определение отображаемых реквизитов на экранной форме
После заполнения полей документа, его следует сохранить и закрыть (все это выполняется по щелчку по кнопке ОК). В дальнейшем заполненный нами
70
Гпавг. 1
документ (как и все созданные таким же образом) можно всегда найти (при работе в режиме 1 С:Предприятие) в списке, который открывается автоматически при выборе в разделе Документы названия документа— Внесение оплаты.
Рис. 1.55. Форма документа Унесение оплаты в режиме конфигуратора
Программирование формы документа!
Теперь выполним небольшую автоматизацию, о которой мы уже упоминали ранее. В созданном документе два поля клиент и телефоны связаны между собой. А именно при заполнении поля клиент значением из справочника клиенты хотелось бы, чтобы соответствующий телефон автоматически фиксировался в поле телефоны. Это может быть удобно, так как в этом случае уже по документу видно, как с человеком связаться. Для такой автоматизации мы и напишем небольшую процедуру.
Итак, в окне редактирования формы документа (режим конфигуратора) необходимо двойным щелчком по полю клиент (рис. 1.57) открыть окно его свойств. Затем напротив имени события ПриИзменении следует щелкнуть по пиктограмме с изображением лупы, в результате чего мы попадем в процедуру, автоматически выполняемую при выборе клиента в поле клиент докумен
Представление об объектах системы 1С:Предприятие
71
та. Это фактически пока еще только заготовка нашей будущей процедуры, которую мы напишем. В дальнейшем ее всегда можно найти на закладке Модуль, где размещаются все программные процедуры, работающие с экранной формой документа.
Рис. 1.56. Заполненная форма документа Внесение оплаты в режиме 1 С:Предприятие
Сам текст процедуры, которую необходимо написать для решения поставленной задачи, приведен в листинге 1.4. В результате выполнения программного кода в режиме 1 С:Предприятие после выбора клиента следующее (в шапке документа) поле телефоны заполняется данными о телефонах из справочника клиенты, в чем можно убедиться, протестировав форму документа
.'.Я??..
Листинг 1.4. Процедура, выполняемая при заполнен' и ночи Клиент ............ Мка *.	™	.	«.„.„-..а,
Процедура КлиентПриИзменении(Элемент) Телефоны=Клиент.Телефоны;
КонецПроцедуры
72 Гпава 1
Продолжим работу по усовершенствованию нашего документа. Следующая наша цель — обеспечить автоматическое заполнение его табличной части информацией о курсах после выборе клиента. Для этого необходимо внести некоторые изменения в только что созданную процедуру. Листинг 1.5 показывает дополненную необходимыми программными конструкциями процедуру КлиентПриИзменении.
°ис. 1.57. Окно свойств поля Клиент
-------------- ---------------......---------------------- -------------"^•’V-Ргуда
Лйфинг.1.5. Процедура заполнения табличной части документа Внесени. or латы
О... «...	«. ..	_	«...	. „ . .	»,	«,
Процедура КлиентПриИзменении(Элемент)
Телефоны Клиент.Телефоны;
ОплатаКурсов.Очистить();
// Перебор строк табличной части документа
Для Каждого ТекущаяСтрока Из Клиент.ИзучаемыеКурсы Цикл
НоваяСтрока = ОплатаКурсов.Добавить();
НоваяСтрока.Курс = ТекущаяСтрока.Курс;
КонецЦикла;
КонецПроцедуры
Представление об объектах системы 1С:Предприятие	73
На рис. 1.58 показан результат выполнения процедуры в режиме 1 С:Предприятие — табличная часть документа стала автоматически заполняться названиями курсов после выбора учащегося в поле клиент.
Рис. 1.58. Автоматическое заполнение табличной части документа после выбора клиента
Разберем теперь непосредственно сам текст листинга 1.5. В начале процедуры к табличной части документа (оплатаКурсов) применяется метод очистить (). Если этого не сделать, то табличная часть будет дополняться названиями курсов при последовательных щелчках по полю клиент. Таким образом, в процедуре на листинге 1.5 она сначала очищается, а затем заполняется вновь. В цикле, начинающемся со строки
Для Каждого ТекущаяСтрока Из Клиент.ИзучаемыеКурсы Цикл последовательно перебираются все строки табличной части справочника Клиенты, при этом в табличную часть документа добавляются все курсы, на которые записался учащийся. Для этого используется метод Добавить (). В результате пользователь, выбрав в форме документа конкретного учащегося, автоматически получает заполненную названиями курсов табличную
74
Гпава 1
часть документа, и ему остается только внести данные об оплаченных суммах (рис. 1.59).
Примечание
При необходимости в автоматически заполненную табличную часть документа внесение оплаты можно добавить дополнительно еще одну или несколько строчек. На рис. 1.59 показана ситуация, когда в табличную часть внесена еще одна строка с помощью стандартной кнопки пиктографического меню.
Действия
Номер:
[09.08.2007* 000: 00'
Дата-
Клиент:
Сидоров Евгений Петрович
Телефоны: ? 123-45-67
3: Информатика (Excel)
400]
4;Элект почта
ОК ^агысёть Закрыть
- Базы данных 7' PowerPoint
asSi 200.
500!
'ф> vv» I '«К ♦ 'Z -Я
Файл Правка Операций Сервис Окна Справка

Для получения подсказки нажмите F1
CAP : WM
Рис. 1.59. Заполненный документ Внесение оплаты в режиме 1С:Предприятие
Создание печатной формы документа Внесение оплаты
Аналогично созданию печатных форм справочников с помощью конструктора печати, его же мы используем и при разработке печатной формы докумен
Представление об объектах системы 1 С:Предприятие 75
та Внесение оплаты. В листинге 1 6 показана программная процедура, реализующая данную функцию.
---..............-................-э ..................... лечаш документа.................................J ”
Процедура Печать(Элемент)
ТабДок = Новый Табличныйдокумент;
Макет = Документы.ВнесениеОплаты.ПолучитьМакет("Печать"); // Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область); // Шапка
Область = Макет.ПолучитьОбласть("Шапка") ;
Область. Параметры. Номер = Номер;
Область.Параметры.Дата = Дата;
Область.Параметры.Клиент = Клиент;
Область.Параметры.Телефоны = Телефоны;
ТабДок.Вывести(Область);
// ОплатаКурсов
Область = Макет.ПолучитьОбласть("ОплатаКурсовШапка");
ТабДок.Вывести(Область);
Для Каждого ТекСтрокаОплатаКурсов Из ОплатаКурсов Цикл Область = Макет.ПолучитьОбласть("ОплатаКурсов"); Область.Параметры.Курс = ТекСтрокаОплатаКурсов.Курс; ОбластьПараметры. ВнесеннаяСумма =
ТекСтрокаОплатаКурсов.ВнесеннаяСумма;
Табдок.Вывести(Область);
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать(); КонецПроцедуры
Большинство программных конструкций нам знакомо, поэтому какого-то дополнительного комментария не требуется. Однако ранее мы не рассмотрели ряд свойств и методов табличного документа, и здесь мы исправим эту недо
76
Гпава 1
работку. В табл. 1.1 отражены основные свойства и методы табличного документа.
Список документов
Следует упомянуть еще об одном важном моменте. Мы все время говорили о текущем документе, с которым в настоящий момент работаем. Может возникнуть вопрос — где его потом найти? Все предыдущие созданные документы никуда не пропадают — они остаются в информационной базе. И если в режиме 1С:Предприятие обратиться к разделу Документы, то после выбора названия документа внесение оплаты перед нами откроется список всех созданных ранее документов данного вида (рис. 1.60).
Рис. 1.60. Список введенных документов Внесение оплаты
Таблица 1.1. Свойства и методы табличного документа
Название свойства (метода)	Описание
ОтображатьСетку	Позволяет исключить отображение сетки в табличном документе (при значении этого свойстза — ложь) либо наоборот его включить (при значении — Истина)
Представление об объектах системы 1 (^Предприятие
77
Таблица 1.1 (окончание)
Название свойства (метода)	Описание
Защита	Позволяет разрешить копирование либо ручное изменение табличного документа (при значении этого свойства — ложь), либо наоборот запретить (при значении — Истина)
ТолькоПросмотр	Позволяет установить только режим просмотра. В этом случае в табличном документе будут недоступны для редактиоования ячейки у которых установлено СВОЙС1 ВО Защита
ОтображатьЗаголовки	Позволяет отобразить (при значении — Истина) заголовки колонок и строк таблицы. Заголовки содержат номера строк и столбцов и выводятся вверху и слева от таблицы
Показать()	Метод, открывающий окно для показа и редактирования табличного документа
Создание отчета
Выполненные до этого действия по разработке и заполнению документов и справочников позволяют в основном зафиксировать информацию, однако быстро ответить на вопрос— кто записался на тот или иной курс, какая сумма внесена учащимися за конкретный курс или кто сколько заплатил за обучение, мы пока не можем. Точнее, если мы самостоятельно аккуратно проанализируем справочники и уже созданные документы, то ответы на подобные вопросы мы, конечно, получим. Однако и время для этого может потребоваться значительное.
Можно сказать, что получение информации в удобной форме и является одним из основных достоинств системы ЮПредприятие 8. При сборе и накоплении данных важнейшую роль играют объекты под названием регистры. Во второй главе мы разберем технические приемы работы с регистрами сведений, а в дальнейшем и с регистрами накопления. Фактически они предназначены для фиксирования и аккумулирования информации о разнообразных фактах и событиях.
78
Гпава 1
Здесь же мы обойдемся без них и рассмотрим построение отчета по информации непосредственно из введенных документов Внесение оплаты. Когда количество обрабатываемых документов становится большим, то вариант использования регистров будет значительно более эффективным в плане времени получения результата. При составлении отчета извлечение уже подготовленной информации из регистров сведений выполняется существенно быстрее по сравнению с перебором всех исходных документов. Далее мы поговорим и о других преимуществах регистров в плане представления отчетной информации.
Среди объектов конфигурации существует отчет, и этим объектом мы воспользуемся для получения ответа на вопрос, какая сумма внесена учащимися за конкретный курс. Первый уже знакомый шаг— в окне Конфигурация необходимо щелкнуть правой кнопкой по строке Отчеты и поспе этого начать процесс создания нового отчета, который мы назовем Учет оплаты (рис. 1.61).
Рис. 1.61. Окно редактирования отчета Учет оплаты
Ранее мы пользовались готовыми макетами, которые создавал непосредственно конструктор печати, а теперь создадим макет сами.
Примечание
Отчет — это объект конфигурации, который испогвзуе’ся для разработки механизмов получения выходной (сводной) информации на основании вве
Представление об объектах системы 1С:Предприятие
79
денных данных. Данный объект конфигурации включает в сеоя алгоритм получения и обработки информации, форму и макет. С помощью форм организуется необходимый интерфейс, а макеты позволяют оформить полученную информацию в виде табличного документа желаемого вида.
Разработка макета
Чтобы создать макет, следует перейти на закладку Макеты, а затем с помощью пиктограммы Добавить (из пиктографического меню) начать работу с конструктором макета. Сам макет, как мы уже знаем, необходим для формирования табличного документа.
Единственный этап диалога, в котором следует ввести необходимые параметры, показан на рис. 1.62. После этого перед нами открывается окно (рис. 1.63) для разработки структуры табличного документа. Здесь мы можем самостоятельно создать макет для печатной формы. Дальнейшие наши действия в этом разделе будут связаны с ручным заполнением данного макета — без участия конструктора печати.
Рис. 1.62. Окно конструктора макета
Для вывода в табличный документ строк различного вида в макетах предусмотрен механизм секций. В этом случае табличный документ формируется
80
Глава 1
не сразу целиком, а поэтапно — по мере заполнения секций. Секция является компонентой (составляющей табличного документа). Сами секции могут быть вертикальными и горизонтальными, но в рассматриваемом примере мы будем использовать только горизонтальные секции. В реальной работе они применяются значительно чаще Горизонтальная секция представляет совокупность нескольких строк и состоит как минимум из одной строки.
Рис. 1.63. Окно структуры табличного документа
. —---------------------------------------------------------------------------------------------------------------------------------------------------------------------- •

j-Файл Правка Таблица КонФйгырация Отладка ^•шнистрир'жание Сервис Оги Справка
Отчет по оплатам за курсы
чщсказки нажмите Ft
CfiR' N» иг
Рис. 1.64. Создание секции Заголовок
Создадим первую секцию, для чего следует замаркировать мышью названия заголовков первых трех строк. После этого в меню Таблица требуется вы
Представление об объектах системы 1С:Предприятие
81
брать раздел Имена, в котором воспользоваться пунктом — Назначить имя. Первой секции дадим смысловое имя — заголовок, и в одну из ячеек введем текст Отчет по оплатам за курсы (рис 1.64).
Для увеличения (или в общем случае — изменения) размера шрифта текста следует щелчком правой кнопкой мыши открыть окно свойств ячейки с приведенным текстом (на пересечении второй строки и второго столбца). Это позволит нам, используя раздел Оформление, изменить и вид шрифта, и размер букв (рис. 1.65).
Основная часть отчета будет представлять собой таблицу, но сначала мы должны вывести в табличный документ подписи для столбцов таблицы. Для этого нам потребуется создать в четвертой строке секцию Шапка, содержимое которой показано на рис. 1.66.
Рис. 1.65. Изменение оформления текста в ячейке макета
Внесем в секцию Шапка небольшое оформление— выполним обводку линиями ячейки, где написано Курс, что выполняется с помощью опций окна свойств ячейки (рис. 1.66). Аналогичную обводку следует выполнить и для ячейки С текстом Оплаченная сумма.
Теперь можно перейти к созданию третьей, последней в рассматриваемом макете секции Строка (рис. 1.67). От нас также потребуется ввести в соответствующие ячейки курс и ОплаченнаяСумма, однако для этих ячеек в разделе Заполнение окна Свойства следует сделать установку Параметр.
82
Гпава 1
«?Но»4игура<ос Кон^нгураоия .	J
^айл Правка Таблица Конфигурация Отладка Администрирование Сервис Йкна Справка
Заголовок
Отчет по оплатам за курсы
2
^Оплаченная сумма
|Курс
3
4
"“Г . I

Аййз
| Ячейки_________
Левая граница f Верхняя граница < Правая граница Г Нижняя граница 5 Обвести
! Цвет границы Ц Авто
Сплошная
Сплошная
Сплошная
Сплошная
Нет линии
=Ш23 «>
Для получения подсказки нзжг^яе F1
CAP NUM tu *
Рис. 1.66. Добавление секции Шапка
Рис. 1.67. Структура макета для табличного документа
Представление об объектах системы 1С:Предприятие
83
При такой настройке в ячейке будет напечатан не текст, а значение переменной, которая должна быть определена (либо явно, либо просто неявно известна) в программной процедуре заполнения табличного документа по шаблону макета.
Тем самым фактически мы разделили макет (заготовку для печатной формы) на три части — заголовок, шапку и строку.
Примечание
Создание в шаблоне трех секций является типичным при формировании несложных отчетов. Когда требуется большая информативность, то зачастую используется большее количество секций. На практике наиболее часто встречается так называемая секция Подвал, отражающая нижнюю часть табличного документа.
Процедура заполнения отчета
Теперь на очереди разработка пршраммной процедуры, которая заполняет табличный документ в соответствии с данным макетом.
Рис. 1.68. Закладка Формы окна редактирования отчета
84
Гпава 1
Для этого нас не устроит форма по умолчанию, и мы создадим свою. Поэтому следует перейти с закладки Макеты на закладку Формы (рис. 1.68)
Рис. 1.69. Окно конструктора формы отчета
Рис. 1.70. Экранная форма отчета Учет оплаты
Представление об объектах системы 1С:Предприятие
85
Далее, щелчком по кнопке с изображением лупы, начнем диалог с конструктором формы отчета (рис. 1.69).
На этом окне мы должны проконтролировать соответствие наших установок и указанных на рис. 1.69, после чего нажать кнопку Готово. Теперь мы увидим на экране следующее окно (рис. 1.70), на котором отображена экранная форма отчета с созданными на ней конструктором элементами управления.
Далее следует на закладке Модуль открыть окно редактора для написания программных процедур, в котором уже имеется заготовка для процедуры, обслуживающей нажатие на кнопку Сформировать. На этот раз мы самостоятельно напишем ее текст, генерирующий отчет (листинг 1.7).
Процедура КнопкаСформироватьНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
I ВнесениеОплатыЗаКурсы.Курс КАК Курс,
I СУММА(ВнесениеОплатыЗаКурсы.ВнесеннаяСумма)
I КАК ОплаченнаяСумма
I ИЗ
I Документ.ВнесениеОплаты.ОплатаКурсов
I КАК ВнесениеОплатыЗаКурсы | СГРУППИРОВАТЬ ПО
I ВнесениеОплатыЗаКурсы.Курс";
Результат = Запрос.Выполнить().Выбрать() ;
ТабДок = Новый ТабличныйДокумент;
Макет = Отчеты.УчетОплаты.ПолучитьМакет("Макет"); // Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область);
// Шапка
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
// ОплатаКурсов
Пока Результат.Следующий() Цикл
Область = Макет.. ПолучитьОбласть ("Строка") ;
Область.Параметры.Курс = Результат.Курс;
Область.Параметры.ОплаченнаяСумма = Результат.ОплаченнаяСумма;
86
Гпава 1
ТабДок.Вывести(Область) ;
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
КонецПроцедуры
Запрос — это объект системы 1С:Предприятие, которым мы воспользовались в этой процедуре. Ему мы отведем здесь небольшой комментарий, но заметим, что в третьей главе запросы будут подробно рассмотрены на примерах разной степени сложности. В рассмотренной процедуре продемонстрировано эффективное использование запроса для извлечения информации из имеющихся данных.
Примечание
Запросы в системе 1С:Предприятие 8 предназначены для выборки информации из базы данных. Можно считать, что запрос является требованием к системе для выбора и обработки данных. Например, с помощью запроса можно легко подсчитать внесенные суммы по конкретным курсам. В системе 1 (^Предприятие 8 существует специальный язык запросов, цель которого в формулировании требований к системе— что нужно отобрать из имеющихся данных А как система справляется с запросом, нас уже не интересует, главное — поставить задачу.
В первой строке в листинге 1.7 создается новый объект— запрос, а ссылка на него присваивается переменной, которую мы также назвали словом Запрос. Далее формируется текст запроса, в котором говорится о том, что нас интересует документ ВнесениеОплаты, а более конкретно, табличная часть этого документа— Оплатакурсов. Для этого используется ключевое слово из, а далее для интересующей нас табличной части документа вводим более короткое название:
Документ.ВнесениеОплаты.ОплатаКурсов
КАК ВнесениеОплатыЗаКурсы,
которое можно использовать наряду с полной записью. В тексте запроса указывается, что из этой табличной части нас интересует поле курс (Внесение-ОплатыЗаКурсы. Курс), а также Суммирование ПО ПОЛЮ ВнесеннаяСумма, т. е. сумма всех значений в этом поле. Конструкция сгруппировать по дает уста
Представление об объектах системы 1 (^Предприятие
87
новку системе, что сумма значений полей ВнесеннаяСумма должна быть посчитана отдельно по каждому курсу.
Выполнение рассматриваемого запроса в результате приводит к формированию таблицы, в которой есть две колонки, а число строк равно числу различных курсов, за которые были произведены оплаты. В первой колонке будет отражено название курса, а во второй — внесенная учащимися сумма за этот курс. После выполнения строки
Результат = Запрос.Выполнить().Выбрать()
в переменной Результат формируется ссылка на итоговую таблицу запроса. После этого начинается уже знакомое нам заполнение табличного документа. Теперь для полноты картины осталось перейти в режим работы 1 С. Пред приятие и получить вариант заполненного отчета (рис. 1.71).
Рис. 1.71. Сформированный отчет Учет оплаты в режиме 1С Предприятие
Таким образом, мы рассмотрели пример возможности формирования сводной информации по документам, связанным с оплатой за обучение. Когда количество документов станет значительным, то объем вычислительных операций приведет к заметной задержке при формировании отчета. Более правильным при этом будет использование регистров. Так, эффективный вариант построения информационной системы заключается в фиксировании в регистре накопления оплаченных сумм по мере создания каждого очередного
88
Гпава 1
документа. Эти и другие возможности информационной системы !С:Пред-приятие 8 рассматриваются в последующих главах.
Отчет по клиентам
Предыдущий отчет позволял извлечь информацию о внесенных денежных средствах по каждому учебному курсу. Из рис. 1.71 мы видим, сколько внесено по курсу «Базы данных», а сколько— по «PowerPoint» Не менее важно получить интегральную информацию о том, кто и сколько уже заплатил из наших клиентов. В этом разделе рассматривается решение подобной задачи. При этом мы воспользуемся предыдущей разработкой и фактически выполним небольшую ее модернизацию. А именно мы внесем изменения в макет и в процедуру формирования отчета.
На рис. 1.72 показан макет отчета, который соответствует измененной ситуации. Изменения коснулись только ячеек курс — теперь названия поменялись на Клиент. Текст процедуры формирования отчета также претерпел изменения — новый вариант показан в листинге 1.8.
Рис. 1.72. Изменения в макете для отчета с группировкой по клиентам
..........".	..» -ж..;	.у. •• •• —......
Листинг 1.1 Процедува формирования отчета no ог.. штам клиентов й ...........----------.................-------------------------- ..
Процедура КнопкаСформироватьНажатие(Элемент) Запрос=Новый Запрос;
Представление об объектах системы 1 (^'Предприятие 89
Запрос.Текст = "ВЫБРАТЬ
I ВнесениеОплатыЗаКурсы.Ссылка.Клиент КАК Клиент,
I СУММА(ВнесениеОплатыЗаКурсы.ВнесеннаяСумма)
I КАК ОплаченнаяСумма
I ИЗ
I Документ.ВнесениеОплаты.ОплатаКурсов
I КАК ВнесениеСллатыЗаКурсы
I СГРУППИРОВАТЬ ПО ВнесениеОплатыЗаКурсы.Ссылка.Клиент";
Результат = Запрос.Выполнить().Выбрать();
ТабДок = Новый Табличныйдокумент;
Макет = Отчеты.УчетОплаты.ПолучитьМакет("Макет"); // Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область); // Шапка
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
// ОплатаКурсов
Пока Результат.Следующий() Цикл
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Клиент = Результат.Клиент;
Область.Параметры.ОплаченнаяСумма = Резупь тат.ОплаченнаяСумма;
ТабДок.Вывести(Область);
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
КонецПроцедуры
Ключевой момент, связанный с изменениями, заключается в конструкции:
ВнесениеОплатыЗаКурсы.Ссылка.Клиент, которая позволяет обратиться к информации, расположенной в шапке рас сматриваемого документа.
90
Гпава 1
Примечание
На уровне объектов базы данных информация о документе хранится в двух таблицах — в основной таблице документа и таблице табличной части документа. В таблице табличной части имеется поле Ссылка, которое представляет ссылку на документ, которому подчинена рассматриваемая запись табличной части.
Ранее в процессе рассмотрения примеров, мы в режиме 1С:Предприятие ввели информацию только по одному учащемуся. Теперь для проверки функциональности разработки добавим еще одного клиента, «запишем его на курсы», и с помощью документа Внесение оплаты оформим оплату обучения (рис. 1.73). Таким образом, у нас в базе данных присутствует информация по двум учащимся, которые условно частично оплатили обучение по нескольким дисциплинам.
Теперь, если сформировать рассматриваемый отчет, то получим результат уже по клиентам (рис. 1.74). Учитывая, что исходными документами по оплатам мы располагаем, можно легко убедиться в работоспособности отчета.
Рис. 1.73. Документ о внесении денежных средств учащимся
Представление об объектах системы 1С:Предприятие
91
Рис. 1.74. Отчет с группировкой по клиентам
Отчет по клиентам с детализацией по курсам
Для полноты картины разработаем еще один отчет, в котором будет отражено, кто, сколько и за какие учебные курсы внес денежных средств. В предыдущей разработке мы получили информацию по итоговым оплатам учащихся. Для начала изменим макет (рис. 1.75), эти изменения не требуют комментариев, так как вытекают из предыдущих разработок. Полученный отчет в режиме 1С:Предприятие показан на рис. 1.76, а текст процедуры формирования отчета приведен в листинге 1.9.
Рис. 1.75. Измененный макет отчета
92 Гпава 1
Листинг 1.У. Процедура формировании ог'ета с детализацией го курса»
<>•.....<»;.'. ./•>..л.''..';.v.'>;.->v.:»,.’•:;...'.:.....’• . Л::.,...Г...	,'v.:...г'.,:.'	ДО
Процедура КнопкаСформироватьНажатие(Кнопка)
Запрос=Новый Запрос;
Запрс с.Текст = "ВЫБРАТЬ
I ВнесениеОплатыЗаКурсы.Ссылка.Клиент КАК Клиент,
I ВнесениеОплатыЗаКурсы.Курс КАК Курс,
I СУММА(ЗнесениеОплатыЗаКурсы.ВнесеннаяСумма)
I КАК ОплаченнаяСумма
I ИЗ
I Документ.ВнесениеОплаты.ОплатаКурсов
I КАК ВнесениеОплатыЗаКурсы
I СГРУППИРОВАТЬ ПО ВнесениеОплатыЗаКурсы.Ссылка.Клиент,
I ВнесениеОплатыЗаКурсы.Курс";
Результат = Запрос.Выполнить().Выбрать();
ТабДок = Новый ТабличныйДокумент;
Макет = Отчеты.УчетОплаты.ПолучитьМакет("Макет"); // Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.вывести(Область);
// Шапка
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
// ОплатаКурсов
Пока Результат.Следующий() Цикл
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Клиент = Результат.Клиент;
Область.Параметры.Курс = Результат.Курс;
Область.Параметры.ОплаченнаяСумма = Результат.ОплаченнаяСумма;
ТабДок.Вывести(Область);
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = ;Цожь;
ТабДок.Показать();
КонецПроцедуры
Представление об объектах системы 1 (^Предприятие
93
Рис. 1.76. Отчет с детализацией учебных курсов
Итоги
Итак, первая глава завершена, и нам стоит оглянуться на выполненные разработки и подчеркнуть основные итоги. Наверное, главный результат заключается в том, что мы узнали, как выглядит технология разработки конфигураций для информационной системы 1С:Предприятие 8. Возможно, до этого вы работали только с готовыми конфигурациями как пользователь. Теперь же можно взглянуть на эту сложную информационную систему и глазами разработчика (программиста) конфигураций.
Удобное комбинирование работы в режиме конфигуратора и режиме 1С:Предприятие позволяет существенно облегчить работу по созданию при-.кдад.ных решений ,ца .цдатфор.ме J С Лредпр.ц.гтае 5.
На примере конструктора печати мы познакомились с возможностями, которые позволяют разработчику существенно ускорить процесс создания программного кода. В этом случае от разработчика требуется только включение небольших собственных фрагментов в автоматически созданные процедуры.
В ходе выполнения примеров этой главы мы получили практические навыки работы с наиболее популярными прикладными объектами системы 1 (^Предприятие 8— перечислениями, справочниками, документами и табличными документами.
В целом же итог первой главы заключается в том, что изложенные выше примеры являются фундаментом для более сложных разработок, которые встретятся в книге, уже начиная со второй главы.
Глава 2
Использование регистров сведений
Регистры сведений— это новые объекты конфигурации, которые появились в версии программного продукта ^ Предприятие 8 (в широко известной в нашей стране системе 1 С:Предприятие 7.7 их не было). Примеры данной главы преследуют цель познакомить читателей с практическими приемами создания конфигурации, где регистры сведений играют ключевую роль.
Как и ранее, в процессе выполнения практических действий го тексту главы будет приводиться необходимая справочная информация, дающая представление об используемых программных конструкциях на встроенном языке 1С. Все рассматриваемые в главе процедуры являются частью единой конфигурации, которая заметно сложнее, чем примеры, представленные в начале книги.
В заключительной части главы приведен пример организации взаимодействия системы 1 С:Предприятие 8 с приложением Microsoft Word. В этом разделе рассматривается технология создания документа для Microsoft Word из программной процедуры на внутреннем языке 1С. Далее (в конце книги) эта тема получит развитие, когда мы разберем пример, касающийся обмена информацией между информационной базой на платформе 1С:Предприятие 8 и приложением Microsoft Excel.
Постановка задачи
Рассматриваемая здесь прикладная задача отражает ситуацию, которая часто встречается при предоставлении различными организациями платных обра-
96
Гпава 2
зевательных услуг. В практической работе практически всегда используется автоматизация учета, и для этого применяются разнообразные программные продукты — Microsoft Excel, Microsoft Access и др. Однако часто даже после автоматизации большинства участков работы все равно остаются еще и ручные действия— например, заполнение квитанций для оплаты в отделении банка.
В данном случае нам требуется спроектировать конфигурацию, позволяющую эффективно контролировать внесение оплаты за обучение. Созданная разработка на платформе 1С:Предприятие 8 позволит выписывать квитанции на оплату и вести учет сделанных учащимися платежей. На рассматриваемом примере мы попробуем показать, как можно полностью освободить офисного работника от вычислений и ручного заполнения бланков квитанций.
В качестве схемы оплаты взят вариант, используемый в одном из высших учебных заведений. Для определенности будем считать, что наша организация устанавливает помесячную индексацию оплаты за обучение. Поясним, как это реально выглядит, на примере. Допустим, что для зачисленного (поступившего) учащегося срок обучения по выбранной им специальности составляет 36 месяцев, но месячная стоимость обучения при этом возрастает с течением времени (точнее— от месяца к месяцу). И если в сентябре 2007 года стоимость за месяц составляла 2000 рублей, то, заплатив именно в сентябре 2007 года по этому тарифу всю сумму (72 000 рублей), учащийся больше ничего учебному заведению не должен. Если же он по своему желанию прекратит обучение, то учебное заведение возвратит ему сумму за не полностью предоставленную услугу (за оставшиеся месяцы после прекращения учебы).
В реальной ситуации учащиеся платят не за весь период, а только за несколько месяцев вперед, и технически это выглядит следующим образом. Учащемуся предварительно выписывается квитанция, которая фиксируется в неком реестре (в информационной базе). Оплатив данную квитанцию в отделении банка и отметив это (в соответствующем отделе учебного заведения), он получает следующую квитанцию (на один или несколько следующих месяцев), оплачивает ее и т. д.
Наша задача заключается в создании удобной технологии для ведения описанного учета сотрудниками учебного заведения. Автоматизация должна привести к сокращению времени выполнения технических операций и минимизации количества ошибок в работе. Для более точного восприятия ситуации в табл. 2.1 представлен фрагмент информации о тарифах месячных оплат.
Использование регистров сведений
97
Таблица 2.1. Информация о тарифах месячных оплат
Номер месяца	Год	Вид тарифа	Стоимость
9	2007	Основной	2000
10	2007	Основной	2020
9	2007	Сокращенная форма	2100
10	2007	Сокращенная форма	2150
В табл. 2.1 содержание колонки «Вид тарифа» определяется различными формами обучения — полная учебная программа, ускоренная, сокращенная, индивидуальная и т. д. Каждому учащемуся в зависимости от выбранной им формы обучения устанавливается определенный вид тарифа. Конкретная уникальная комбинация номера месяца, года и вида тарифа позволяет определить по табл. 2.1 стоимость обучения в определенном месяце в указанном учебном году по выбранной учащимся форме обучения Эта комбинация и является ключом при записи либо извлечении информации о месячной стоимости обучения.
Другие важные для создания системы учета (уплаты данные представлены в табл. 2.2. Это необходимые для ведения учета оплаты сведения об учащихся. Каждая строка в таблице представляет собой запись о конкретном человеке. При зачислении учащегося с ним заключается договор, номер которого заносится в первую колонку таблицы. В последующие поля заносятся данные об учащемся и плательщике (часто оплату вносит один из родственников), а в поле «Число месяцев» вносится количество месяцев обучения по выбранной форме. Таким образом, это и есть то количество месяцев по договору, которые человек должен оплатить. Оплатить он может сразу при поступлении — тогда индексации не будет, но при постепенном внесении платежей будет учитываться изменение месячной стоимости с течением времени.
Цель автоматизации понятна, и теперь можно перейти к разработке конфигурации, которая позволит организовать на платформе 1С:Предприятие 8 удобную систему для ведения учета оплаты. Информация, приведенная в табл. 2.1 и табл. 2.2, будет рассматриваться в качестве исходных данных для создаваемой системы учета.
В следующем разделе мы поясним, как организован новый для нас объект конфигурации — регистр сведений. Для отражения информации, содержащейся в каждой из упоминаемых таблиц, будет создан соответствующий регистр
98
Гпава 2
подходящего вида. После этого, добавив необходимые компоненты интерфейса и запрограммировав алгоритмы обработки, мы получим удобную информационную систему для организации учета оплаты учащихся за обучение.
Таблица 2.2. Информация о договорах
Номер договора	ФИО студента	ФИО плательщика	Число оплачиваемых месяцев	Зид тарифа
100/234	Петров Петр Петрович	Петров Иван Иванович	36	Основной
101/234	Иванов Иван Иванович	Иванов Петр Иванович	36	Основной
102/234	Сидорова Ольга Николаевна	Сидорова Ольга Николаевна	32	Сокращенная форма
103/234	Сидоров Олег Петрович	Сидоров Олег Петрович	32	Сокращенная форма
Представление информации о тарифах
Вернемся к табл. 2.1. Приведенные в ней данные можно с математической точки зрения трактовать как функцию от трех переменных, в качестве которых выступают год, месяц и вид тарифа. Для каждого уникального набора этих данных в таблице имеется не более одного значения функции — стоимости тарифа. В этом и заключается предназначение регистров сведений — хранение информации по набору измерений, причем каждый набор не должен повторяться. При попытке повторного создания определенного набора аргументов система обратит на это внимание. Регистр состоит из трех компонентов:
□	Измерения;
□	Ресурсы;
□ Реквизиты.
Использование регистров сведений 99
Измерения — это как раз и есть аргументы функции, а ресурсы можно считать ее значениями. Реквизиты играют вспомогательную роль: они содержат дополнительную поясняющую информацию о рассматриваемом наборе данных. Например, в данной ситуации реквизитом может быть фамилия ответственного лица, которое заносит информацию об очередном тарифе
Первой практической задачей в режиме конфигуратора системы 1 (^Предприятие, которую мы решим, будет создание регистра сведений под названием тарифы, который будет хранить информацию об имеющихся тарифах. Разумеется, эту информацию можно будет заносить в регистр и извлекать из него. Если взглянуть на табл. 2.1, то видно, что колонка «Вид тарифа» содержит значения из достаточно ограниченного набора — форм обучения реально немного (как правило, не более 5-6). Поэтому для заполнения колонки «Вид тарифа» удобнее создать вспомогательный справочник с аналогичным названием. Заполнив его один раз названиями тарифов, далее при внесении информации в колонку «Вид тарифа» мы просто будем выбирать значения из данного справочника.
Итак, теперь можно считать вступительную часть главы завершенной, и в следующем разделе мы перейдем к практическим действиям по созданию новой конфигурации.
Вспомогательный справочник
Вид тарифа
Как и в первой главе, мы начнем работу в режиме конфигуратора с пустой информационной базы, и первым объектом новой конфигурации будет справочник ВидТарифа (рис. 2.1).
Этот справочник достаточно прост, и нам не потребуется создавать экранные формы для его заполнения — для этого вполне подойдет форма списка, генерируемая системой по умолчанию. На рис. 2.2 показано частичное заполнение этого справочника возможными видами тарифов в режиме 1 (^Предприятие.
Регистр сведений Тарифы
После того как справочник ВидТарифа заполнен, можно перейти к созданию регистра сведений тарифы.
100
Гпава 2
Рис. 2.1. Окно редактирования справочника Видтарифа
Рис. 2.2. Справочник Видтарифа в режиме 1С:Г1редприятие
Примечание
Оснслное назначение регистра сведений — хранение информации, важной для прикладной задачи, которая может быть определена по некоторой комбинации значений. При необходимости, к этой комбинации может быть добавлено время (в этом случае регистр сведений называется периодическим).
Начальные действия по созданию объекта конфигурации нам уже знакомы — нужно щелкнуть пргвой кнопкой мыши на названии Регистры сведении в
Использование регистров сведений
101
окне Конфигурация и выбрать в контекстном меню пункт Добавить. На закладке Основные (рис. 2.3), кроме имени регистра следует указать, что он является непериодическим. Это означает, что время в качестве дополнительного аргумента в создаваемом регистре использоваться не будет. В дальнейшем мы рассмотрим и пример создания периодического регистра сведений, однако сейчас нам это не требуется. Заметим только, что в системе I С:Предприятие для дополнительного аргумента, отражающего время, используется термин Период.
На той же закладке укажем Независимый режим записи — в этом случае мы можем напрямую производить запись информации в регистр сведений. В противоположность этому, при указании режима Подчинение регистратору появляется возможность формировать записи в регистре автоматически как результат обработки информации из документов. В следующих главах мы рассмотрим и эту возможность, однако при разработке рассматриваемой сейчас конфигурации мы будем использовать независимый режим записи для всех создаваемых регистров сведений.
Рис. 2.3. Окно редактирования регистра сведений Тарифы
Теперь перейдем на закладку Данные, где укажем измерения и ресурсы регистра в соответствии с табл. 2.1. Первое измерение— номерМесяца, для которого выберем числовой тип данных. В окне свойств данного реквизита в пункте Индексировать сделаем установку Индексировать. Аналогичные
102
Гпава 2
установки выполним и для следующего измерения— Год. Третьим измерением является видтарифа, в качестве типа значения которого следует установить СправочникСсьшка.ВидТарифа. Кроме того, отметим, что данное измерение является ведущим.
Ресурсом регистра сведений Тарифы назначим Стоимость (числовой тип данных). После этого можно сказать, что структура регистра создана. Теперь следует перейти в режим 1С:Предприятие и заполнить этот регистр значениями нескольких тарифов. Вполне достаточно для этого воспользоваться формой по умолчанию. На рис. 2.4 приведен фрагмент заполнения регистра сведений данными о тарифах.
Контроль ошибок в форме регистра Тарифы
Сделаем еще одну доработку, связанную с автоматической проверкой возможных ошибок при вводе информации. Так, форма, автоматически создаваемая системой, не обеспечивает контроля вводимых данных.
Рис. 2.4. Информация о тарифах за обучение
А наша цель — установить интервал целых чисел от 1 до 12 при вводе номера месяца, а также задать разумные интервалы при указании года (скажем, от 2006 до 2020). Такие ограничения уменьшат технические неточности при работе пользователя. Но для этого вместо формы, генерируемой системой по умолчанию, нам потребуется создать свою форму для ввода информации.
Использование регистров сведений
103
Первый, уже знакомый нам шаг заключается в том, что в окне редактирования объекта конфигурации (рис. 2.5) на закладке Формы необходимо щелкнуть мышью по пиктограмме с изображением лупы напротив раздела Основные формы списка.
Рис. 2.5. Закладка Формы окна редактирования регистра сведений
В следующем открывшемся окне достаточно просто указать, что нас интересует форма списка, после чего щелкнуть по кнопке Готово. В результате на открывшейся закладке Диалог (рис. 2.6) мы увидим структуру формы с расположенными на ней элементами управления. Теперь можно с помощью мыши при необходимости изменить ширину колонок таблицы, а также размеры табличной части и самой формы.
После двойного щелчка по полю, предназначенному для ввода номера месяца, откроется окно его свойств (рис. 2.7), в котором следует установить упоминаемые выше интервалы для вводимой информации. Аналогичные установки нужно выполнить и для поля, предназначенного для указания года.
104
Гпава 2
Рис. 2.6. Форма списка регистра Тарифы в окне редактирования объекта конфигурации
Рис. 2.7. Окно редактирования свойств элемента управления
Этап работы, в котором мы разработали объект конфигурации Тарифы, завершен. Теперь следует перейти в режим 1С Предприятие и посмотреть, как сказываются выполненные изменения. А именно если при заполнении регистра данными о тарифах мы неправильно введем месяц либо год, то система сообщит нам об этом.
Таким образом, в результате проделанной работы мы получили электронный аналог табл. 2.1, но при этом добавили форму, предназначенную для работы с ним, автоматический контроль ошибок при вводе.
Использование регистров сведений
105
Справочник Договоры
Следующая задача заключается в создании электронного варианта табл. 2.2. Информация, содержащаяся в ней, отличается заметной статичностью, и в этом случае для ее хранения лучше всего подходит справочник.
Поэтому на очереди у нас создание справочника договоры, который будет соответствовать структуре табл. 2.2. При его создании, кроме обязательных полей кода и наименования добавим еще следующие реквизиты:
□	ФИОучащегося (тип данных — строка не более 100 символов);
□	Фиоплательщика (тип данных — строка не более 100 символов);
□	ДатаДоговора (тип данных — Дата);
П ВидТарифа (тип Данных — СправочникСсьшка. ВидТарифа);
□	КоличествоОплачиваемыхМесяцев (тип данных— Число).
Рис. 2.8. Форма элемента справочника Договоры в режиме 1 (^Предприятие
Значение параметра количествоОплачиваемыхМесяцев определяет, за сколько месяцев студент должен заплатить по заключаемому договору. После создания указанных реквизитов, каких-либо еще действий для разработки спра
106
Глава 2
вочника нам не требуется— при работе в режиме 1С:Предприятие мы воспользуемся формами ввода, генерируемыми системой по умолчанию. Так, один пример заполнения формы элемента справочника договоры приведен на рис. 2.8.
Таким образом, теперь у нас есть объекты конфигурации для хранения информации о стоимости тарифов за обучение и для фиксации сведений о договорах. Следующая задача заключается в создании механизма выписки и регистрации квитанций. Это и составляет основную содержательную часть разработки.
Регистр сведений Квитанции
Теперь мы перейдем к разработке регистра сведений квитанции, в котором будет храниться информация о выписанных квитанциях, а также отмечаться факт их оплаты через отделение банка. Данный регистр сделаем периодическим, что и отметим на закладке Основные (поле Периодичность).
Дтя решаемой нами задачи разумно указать периодичность в течение секунды, что позволит хранить практически неограниченное количество квитанций по конкретному договору. Также на этой же закладке установим Независимый режим записи в рассматриваемый регистр.
Примечание
Свойство период позволяет указать, с какой периодичностью регистр сведений должен сохранять значения ресурсов. Для непериодического регистра можно получить только последнее введенное значение (а предыдущие значения не сохраняются). Для периодического регистра существует единственное значение ресурса внутри периода. Если указан период — месяц, то в регистре фиксируется одно значение для каждого месяца. Вариант периодичности секунда реально не накладывает ограничений при вводе записей в любой периодический регистр сведений.
Теперь перейдем на закладку Данные, где от нас требуется задать структуру полей регистра (рис. 2.9). Измерений в регистре Квитанции будет два — договор и период (как уже говорилось, это второе измерение автоматически добавляется для всех периодических регистров).
Для поля договор укажем в качестве типа данных— справочникСсыл-ка.договоры, а также отметим, что данное поле является ведущим. В этом случае при удалении объекта информационной системы автоматически про
Использование регистров сведений
107
изводится удаление записей регистра сведений, в которых имеется ссылка на удаляемый объект. Например, записи квитанций по конкретному договору будут автоматически удалены системой при удалении договора. Для ресурса СуммаПоквитанции следует указать числовой тип данных. Каждая запись в регистре сведений информирует о конкретной квитанции, и денежная сумма выписанной квитанции отражается в этом ресурсе.
Рис. 2.9. Структура регистра сведений квитанции
Реквизиты регистра несут уточняющую информацию по каждой записи в нем. Так, для поля Оплачено следует установить булевый тип данных, в результате в указанном поле можно отметить, произведена оплата по данной квитанции или нет. Для других реквизитов (месяцНачала, ГодНачала, МесяцО-кончания, ГодОкончания) установим числовой целочисленный тип данных.
Теперь можно подвести небольшой промежуточный итог. Мы создали необходимые регистры (тарифы и Квитанции), а также справочники Вид тарифа и договоры. Теперь для работы с квитанциями следует разработать специальную электронную форму, которая за счет программных процедур обеспечит сервисные возможности пользователю.
108
Глава 2
Примечание
Свойства измерений, ресурсов и реквизитов редактируются при помощи уже знакомого нам окна свойств. В целом свойства регистров сведений аналогичны свойствам других объектов конфигурации. Однако есть и ряд свойств, характерных именно для регистров. Так, установка свойства Ведущее используется, если у рассматриваемого измерения тип данных — ссылка на объект конфигурации. В этом случае запись регистра сведений имеет смысл, только пока существует сам объект конфигурации. При удалении объекта записи по нему удаляются системой автоматически. Среди свойств измерений присутствует флажок Запрет незаполненных значений, который обеспечивает запрет записи регистра с пустым значением измерения. Установка свойства Индексировать приводит к созданию отдельного индекса, что увеличивает производительность работы с регистром.
Форма обработки для учета квитанций по оплате
В этом разделе мы самостоятельно разработаем электронную форму для выписки новых квитанций на оплату. При этом первым шагом на этом пути будет создание новой обработки (рис. 2.10). До этого мы еще не затрагивали подобные объекты конфигурации, однако каких-либо трудностей при выполнении технических действий у вас быть не должно. Фактически в создаваемой обработке нам потребуется только объект форма, который является подчиненным обработке.
Примечание
Для выполнения различных действий с данными в системе 1С:Пред-приятие 8 используются объекты конфигурации под названием обработки. Обработка может содержать одну или несколько форм, с помощью которых организуется ввод необходимых параметров, а также вывод информации в желаемом виде. Функциональное назначение объектов обработка довольно похоже на назначение объектов отчет.
Итак, в окне редактирования объекта конфигурации (рис. 2.10) необходимо перейти на закладку Формы и щелкнуть мышью по изображению лупы в разделе Основная форма обработки. После этого в окне конструктора формы обработки, показанном на рис. 2.11, необходимо сделать установки, представленные на рисунке (для типа формы выберем вариант Произвольная форма).
Использование регистров сведений
109
Рис. 2.10. Окно редактирования обработки Учет квитанций
Рис. 2.11. Окно конструктора формы обработки
110 Глава 2
В результате работы конструктора мы получим пустую экранную форму (рис. 2.12), на которой разместим необходимые элементы управления. Для этого следует воспользоваться разделом Вставить элемент управления из меню Форма.
Рис. 2.12. Форма обработки Учет квитанций в режиме конфигуратора
.₽•Конфиг/рдюр • Конфигурация
Файл Г1р<звк<а Форма Конфигурация Отладка
? Администрирование Сервис Дкна Справка

~ ИнФфмаймя о fiarufeopv:''--——
Договор^	I..,х’ь-
1Г	*S> ;
^ИО * ^Учащийся»
Дата заключения договора •• •• •'	:4 :
Месяц «Месяц Договора»
Год «ГодДоговора»
3& Диалог |Модуль
s Реквизиты
Рис. 2.13. Элементы управления для отображения информации о договоре
Использование регистров сведений
111
Первый фрагмент формы со вставленными элементами представлен на рис. 2.13, который мы далее прокомментируем. При этом для начала разместим на форме элемент Рамка группы, а в качестве его подписи укажем — Информации о договоре. Этот элемент носит чисто оформительский характер и каких-то функциональных действий не выполняет.
С помощью элемента Рамка группы производится визуальное объединение нескольких элементов управления, относящихся к определенной тематической категории. Внешне Рамка группы на форме выглядит как контейнер, окружающий другие (более функциональные) элементы управления.
Теперь в созданной рамке расположим поле ввода, для типа данных которого выберем СправочникСсьшка.договоры, что позволит при работе в режиме 1С:Предприятие выбирать необходимый договор из предварительно сформированного списка договоров (т. е. из справочника договоры). Зададим имя этого элемента — договор.
Примечание
Элемент управления поле ввода предназначен для ввода и редактирования информации. Поле ввода используется для ввода значений непосредственно с клавиатуры, а также для выбора значений из списков.
Ниже списка договоров размещаются семь элементов типа надпись, при этом четыре надписи являются просто поясняющими и далее в программных процедурах не используются, а три (на рис. 2.13 они имеют более светлый фон) при работе с формой будут автоматически (в результате выполнения программы) заполняться после выбора пользователем конкретного договора. Имена этих трех надписей выделены угловыми скобками, и их мы будем использовать в программных процедурах. Для того чтобы эти три надписи выглядели так же, как на рис. 2.13, в окне свойств этих объектов не следует заполнять раздел Заголовок.
Примечание
Надпись предназначена для размещения на форме подписей к другим элементам управления. Однако надпись можно использовать и для отображения текстовой информации которая не предназначена для коррекции и изменения (этим элемент надпись отличается от элемента управления поле ввода).
Следующая порция элементов управления показана на рис. 2 14, и их основное назначение связано с извлечением информации о величине тарифа из ре
112
Гпава 2
гистра сведений Тарифы. Кроме надписей и полей ввода нам понадобится кнопка, которую мы назовем РасчетТарифа (надпись на кнопке автоматически установится аналогичной, но только с разделяющим пробелом между словами).
Примечание
Кнопка — это элемент управления, который предназначен для выполнения оазличных действий. Нажатие на кнопку связано с выполнением определенной процедуры.
В рамке Информация о тарифе располагаются два поля ввода — для указания месяца и года, когда учащийся собирается произвести оплату квитанции.
хУмгл'с?	dyiiSqjvwr	— л&сяцдроизведенияидлаты
и годПроизведенияОплаты. Мы использовали здесь поля ввода, а не надписи, поскольку по смыслу задачи пользователю необходимо предоставить возможность ручной установки даты оплаты (с точностью до месяца), если учащийся собирается оплатить квитанцию в последующие месяцы.
Рис. ?.14. Элементы управления для отображения информации о договоре и тарифе
Надпись Названиетарифа автомат ически заполняется при выборе договора в рамке Информация о договоре, а надпись тарифЗаМесяц также автоматически заполняется величиной тарифа для указанного месяца (конечно, если со
Использование регистров сведений 113
ответствующая запись имеется в регистре Тарифы). Эти действия будут выполняться программными процедурами, которые приводятся далее.
Т еперь нам осталось разместить элементы в рамках Информация о последней оплате и Расчет следующей оплаты (рис. 2.15), причем содержание элементов управления в левой рамке автоматически заполняется данными из регистра квитанции при выборе договора (в поле ввода договор). Это будет реализовано с помощью программной процедуры.
В рамке Расчет следующей оплаты располагаются элементы, которые позволяют пользователю рассчитать сумму для следующей квитанции и занести необходимую информацию в регистр квитанции. Выбор начала оплаты производится С помощью двух полей ввода — МесяцНа-алаОплаты и ГсдНачалаО-платы. В эти поля после нахождения последней оплаченной квитанции (что происходит программно при выборе пользователем договора учащегося) будет заноситься следующий месяц (номер месяца и год), начиная с которого клиент должен продолжить оплату. Учитывая, что данные поля являются полями ввода, пользователь в режиме 1С Предприятие может при необходимости изменить эту автоматически сформированную информацию.
Рис. 2.15. Форма обработки Учет квитанций в режиме конфигуратора
114
Глава 2
В поле ввода количествоОплачиваемыхМесяцев пользователь при работе в режиме 1С:Предприятие должен ввести число месяцев, за которые учащийся собирается заплатить, а кнопка Расчет суммы позволяет рассчитать сумму оплаты и вывести ее в соседнем с ней поле справа (которой мы даем имя Сум-маОплаты). Последняя кнопка в данном фрейме, с именем Записать квитанцию, реализует запись информации о квитанции в предназначенный для этого регистр сведений квитанции.
Таким образом, мы выполнили предварительную конструкторскую разработку формы для внесения информации о квитанциях, а также рассмотрели основные функциональные действия, связанные с элементами формы. В следующих разделах главы будут рассмотрены программные процедуры для работы с самой формой и с элементами управления, расположенными на ней.
Процедуры для работы
с формой
Здесь мы узнаем, каким образом можно программно обеспечить доступ к информации, содержащейся в регистрах сведений, а именно познакомимся с техническими возможностями программной записи в эти регистры и извлечения из них информации.
К этому моменту мы создали форму с необходимыми элементами управления, и теперь можно приступить к разработке программных процедур. Прежде всего, необходимо сделать так, чтобы при открытии формы автоматически заполнялись поля МесяцПроизведенияОплаты и ГодПроизведенияОплаты, ИСХОДЯ из информации о сегодняшней дате. Это параметры даты оплаты по умолчанию, которые пользователь может при необходимости изменить.
Первые технические действия для перехода к программированию начинаются с двойного щелчка мышью в области формы, что позволяет открыть окно ее свойств (рис. 2.16). Далее следует в разделе События напротив пункта При открытии щелкнуть по пиктограмме с изображением лупы. В результате перед нами откроется знакомая закладка Модуль с уже созданной заготовкой для процедуры ПриОткрытии (). От нас здесь потребуется ввести небольшой фрагмент программного кода, показанный в листинге 2.1, который мы прокомментируем далее.
Использование регистров сведений
115
Рис. 2.16. Окно свойств формы обработки
Учет квитанций
Лис гинг 2Л. Проц щура bi то. .чяемг г при отгоы гии форм»
Процедура ПриОткрытии()
ЭлементыФормы.МесяцПроизведенияОплаты.Значение = Месяц(ТекущаяДата());
ЭлементыФормы.ГодПроизведенияОплаты.Значение= Год(ТекущаяДата());
КонецПроцедуры
В процедуре используется функция месяц (<дата>), в качестве обязательного входного параметра которой должно присутствовать значение типа дата. Значение, возвращаемое этой функцией, представляет собой номер месяца в указанной дате. Похожая по назначению функция год(<дата>) возвращает числовое значение года в исходной дате. Для получения непосредственно самой даты мы воспользовались еще одной функцией системы 1С:Предприятие — ТекущаяДата (). Если теперь перейти в режим 1С:Предприятие и открыть форму обработки УчетКвитанции, то рассматриваемые два поля на форме будут автоматически заполнены исходя из сегодняшней даты.
Примечание
Предопределенная процедура ПриОткрытии () выполняется при открытии формы, до показа ее пользователю.
116 Гпавь 2
Процедура, выполняемая при выборе договора
!
Перейдем теперь к разработке следующей процедуры, выполняемой в случае, когда пользователь при работе в режиме 1С:Предприятие укажет в поле ввода договор интересующий его договор с клиентом. Такой выбор автоматически должен привести к заполнению нескольких полей на форме, и ниже описаны программные действия для реализации подобного эффекта.
Итак, в режиме конфигуратора откроем окно свойств элемента договор и перейдем к разделу События, где от нас требуется щелкнуть по изображению лупы напротив строки ПриИзмепепии. В результате перед нами откроется окно редактора программного кода, а курсор ввода будет установлен на заготовке для соответствующей программной процедуры. Окончательный вариант этой процедуры мы напишем в несколько этапов (последовательно добавляя в нее различные усовершенствования).
Первоначальный вариант текста процедуры, обеспечивающий минимальные действия по заполнению полей формы, приведен в листинге 2.2.
.....——••••••••••.............-............................£-•...
'.истин! 2.2. Процедура, выполняемая при выборе договора (вариант 11	|
Процедура ДоговсрПриИзменении(Элемент)
Договор = ЭлементыФормы.Договор.Значение;
ЭлементыФормы.Учащийся.Значение = Договор.ФИОучащегося;
ЭлементыФормы.МесяцПоговора.Значение =
Месяц(Договор.ДатаДоговора);
ЭлементыФормы.ГодДоговора.Значение =
Год(Договор.ДатаДоговора);
ЭлементыФормы.НазваниеТарифа.Значение = Договор.ВидТарифа;
КонецПроцедуры
Прокомментируем приведенный в листинге 2.2 текст В начале процедуры мы вводим переменную договор для того, чтобы в дальнейшем использовать ее в программных конструкциях вместо длинного сочетания ЭлементыФормы. Договор. Значение. Далее в созданные ранее надписи на форме программно подставляются значения из справочника договоры. Таким образом заносится информация о месяце и годе заключения договора, а также о названии тарифа. Кроме того, с помощью данной процедуры фамилия учащегося вносится в надпись Учащийся. Для проверки можно перейти в режим 1С:Предприятие и убедиться в работоспособности программных конструкций.
Использование регистров сведений
117
Следующим по плану будет небольшое усовершенствование. Ранее на форме мы расположили поле ТарифЗаМесяц, которое должно быть заполнено, исходя из даты произведения оплаты и названия тарифа, по которому оплачивает обучение конкретный учащийся. Данная информация уже присутствует на форме — внесены значения В ПОЛЯ МесяцПроизведенияОплаты И ГодПроизведенияОплаты, а также заполнена надпись названиетарифа. Это было выполнено с помощью процедур, представленных в листингах 2.1 и 2.2. Модифицированная процедура ДоговорПриИзменении, обеспечивающая заполнение поля ТарифЗаМесяц, приведена в листинге 2.3.
Листинг 2.3. Процедура, выполняемая лри выборе договора (вариант 2)
Процедура ДоговорПриИзменении(Элемент)
Договор = ЭлементыФормы.Договор.Значение;
ЭлементыФормы.Учащийся.Значение = Договор.ФИОучащегося;
ЭлементыФормы.МесяцЦоговора.Значение =
Месяц(Договор.ДатаДоговора);
ЭлементыФормы.ГодДоговора.Значение=Год(Договор.ДатаДоговора);
ЭлементыФормы.НазваниеТарифа.Значение-Договор.ВидТарифа;
ВыборкаЗаписей = РегистрыСведений.Тарифы.Выбрать();
Индикатор = 0;
Пока ВыборкаЗаписей.Следующий() Цикл
Если ВыборкаЗаписей.ВидТарифа.Наименование =
ЭлементыФормы.Названиетарифа.Значение
И ВыборкаЗаписей.НомерМесяца =
ЭлементыФормы.МесяцПроизведенияОплаты.Значение
И ВыборкаЗаписей. Год=
ЭлементыФормы.ГодПроизведенияОплаты.Значение Тогда
ЭлементыФормы.ТарифЗаМесяц.Значение = ВыборкаЗаписей.Стоимость;
Индикатор = 1;
Прервать;
КонецЕсли;
КонецЦикла ;
Если Индикатор = 0 Тогда
ЭлементыФормы.ТарифЗаМесяц.Значение =0;
Сообщить(" По указанным данным информации о тарифе нет");
КонецЕсли;
КонецПроцедуры
118
Гпаеа 2
Примечание
прервать — исполняемый оператор, который позволяет прервать цикл. После выполнения этого оператора управление передается на строку процедуры, следующую за ключевым словом конеццикла
В рассматриваемой процедуре производится выборка записей из регистра с использованием метода выбрать (), который позволяет в данном случае получить набор всех записей из регистра сведений Тарифы. Далее мы в цикле просматриваем выбранные записи, и, в случае присутствия информации о тарифе по указанному месяцу и году, его сумма отражается в надписи ТарифЗаМесяц.
Примечание
Логическая операция и сравнивает операнды и вырабатывает значение типа Булево: Истина и ложь. При этом значение истина вырабатывается только в случае, если все операнды в выражении принимают значение Истина.
Теперь усложним процедуру следующим образом. Набор надписей, расположенных внутри рамки Информация о последней оплаченной квитанции, необходимо автоматически заполнить информацией о самой свежей квитанции, по которой учащийся внес оплату (листинг 2.4).
Листинг2.4. Процедура. выполняемая при выборе договора (вариант 3). . J
Процедура ДоговорПриИзменении(Элемент)
Договор = ЭлементыФормы.Договор.Значение;
ЭлементыФормы.Учащийся.Значение = Договор.ФИОучащегося;
ЭлементыФормы.МесяцДоговора.Значение = Месяц(Договор.ДатаДоговора);
ЭлементыФормы.ГодДоговора.Значение=Год(Договор.ДатаДоговора);
ЭлементыФормы.НазваниеТарифа.Значение=Договор.ВидТарифа;
ВыборкаЗаписей = РегистрыСведений.Тарифы.Выбрать();
Индикатор = 0;
Пока ВыборкаЗаписей.Следующий() Цикл
Если ВыборкаЗаписей.ВидТарифа.Наименование =
ЭлементыФормы.НазваниеТарифа.Значение
И ВыборкаЗаписей.НомерМесяца=
ЭлементыФормы.МесяцПроизведенияОплаты.Значение
Использование регистров сведений 119
И ВыборкаЗаписей.Год=
ЭлементыФормы.ГодПроизведенияОплаты.Значение Тогда
ЭлементыФормы.ТарифЗаМесяц.Значение = ВыборкаЗаписей.Стоимость;
Индикатор=1;
Прервать;
КонецЕсли;
КонецЦикла ;
Если Индикатор = 0 Тогда
ЭлементыФормы.ТарифЗаМесяц.Значение = 0;
Сообщить(" По указанным данным информации о тарифе нет");
КонецЕсли;
ЭлементыФормы.МесяцНачалаИнтервала.Значение^ "";
ЭлементыФормы.ГодНачалаИнтервала.Значение= "";
ЭлементыФормы.МесяцОкончанияИнтервала.Значение= "";
ЭлементыФормы.ГодОкончанияИнтервала.Значение= "";
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Договор",Договор);
ВыборкаЗаписей = РегистрыСведений.Квитанции.Выбрать(,,СтруктураОтбора);
Пока ВыборкаЗаписей.Следующий() Цикл
Если ВыборкаЗаписей.Оплачено=Ложь Тогда
Сообщить("По данному договору есть неоплаченная квитанция");
Возврат;
КонецЕсли;
КонецЦикла;
ВыборкаЗаписей =
РегистрыСведений.Квитанции.Выбрать(,,СтруктураОтбора);
Пока ВыборкаЗаписей.Следующий() Цикл
Если ЭлементыФормы.МесяцНачалаИнтервала.Значение ="" Тогда
ЭлементыФормы.МесяцНачалаИнтервала.Значение=
ВыборкаЗаписей.МесяцНачала;
ЭлементыФормы.ГодНачалаИнтервала.Значение=
ВыборкаЗаписей.ГодНачала;
ЭлементыФормы.МесяцОкончанияИнтервала.Значение=
ВыборкаЗаписей.МесяцОкончания;
ЭлементыФормы. ГодОкончанияИнтервала. Значение=
ВыборкаЗаписей.ГодОкончания;
Иначе
Дата! = Число(ЭлементыФормы.МесяцОкончанияИнтервала.Значение)+12*
120
Гпава 2
Число(ЭлементыФормы.ГодОкончанияИнтервала.Значение);
Дата2 = ВыборкаЗаписей.МесяцОкончания+12*
ВыборкаЗаписей.ГодОкончания;
Если Дата2 > Дата1 Тогда
ЭлементыФормы.МесяцНачалаИнтервала.Значение=
ВыборкаЗаписей.МесяцНачала;
ЭлементыФормы.ГодНачалаИнтервала.Значение^
ВыборкаЗаписей.ГодНачала;
ЭлементыФормы.МесяцОкончанияИнтервала.Значение=
ВыборкаЗаписей.МесяцОкончания;
ЭлементыФормы.ГодОкончанияИнтервала.Значение=
ВыборкаЗаписей.ГодОкончания;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
В новом добавленном фрагменте процедуры извлекается информация из периодического регистра сведений квитанции. Принципиальным отличием подобного регистра от непериодического является присутствие поля Период. Для работы с регистром в процедуре мы создаем структур} отбора, которую заполняем информацией о договоре:
СтруктураОтбора.Вставить("Договор",Договор);
После этого можно использовать метод выбрать о для периодического регистра сведений в следующей редакции:
РегистрыСведений.Квитанции.Выбрать(,,СтруктураОтбора);
Здесь вызов метода Выбрать () требует в общем случае указания трех параметров. Последний параметр представляет ссылку на структуру отбора, а два предыдущих определяют интервал по дате — начало интересующего нас интервала и его окончания. Если поля, где должны быть указаны даты, пусты (в нашем вызове метода именно такая ситуация), то в результате мы получим выборку всех квитанций по конкретному договору.
После перебора всех отобранных записей заполняются надписи — МесяцНачалаИнтервала, ГодНачалаИнтервала, МесяцОкончанияИнтервала, ГодОкончанияИнтервала. В них фиксируется информация о последней оплаченной квитанции — за какой интервал месяцев она выписывалась. Таким образом, листинг 2.4 представляет собой почти окончательный вариант процедуры
Использование регистров сведений
121
ДоговорПриИзменении (), за исключением только одного компонента— расчета месяца и года, с которого учащийся намеревается начать оплату. Эта завершающая часть, но уже без рассмотренных выше строк, приведена в листинге 2.5.
Листинг 2 5. Дополнение к процедуре, приведенной в листинге 2.4
Процедура ДоговорПриИзменении(Элемент)
// Здесь располагается текст процедуры из листинга 2.4
Если ЭлементыФормы.МесяцОкончанияИнтервала.Значение О "" Тогда
ЭлементыФсрмы.МесяцНачалаОплаты.Значение =
Число(ЭлементыФормы.МесяцОкончанияИнтервала.Значение) +1;
Если Число(ЭлементыФормы.МесяцНачалаОплаты.Значение) > 12 Тогда
ЭлементыФормы.МесяцНачалаОплаты.Значение=
Число(ЭлементыФормы.Мег чцНачалаОплаты.Значение)-12;
ЭлементыФормы.ГодНачалаОплаты.Значение =
Число(ЭлементыФормы.ГодОкончанияИнтервала.Значение)+1;
Иначе
ЭлементыФормы.ГодНачалаОплаты.Значение =
ЭлементыФормы.ГодОкончанияИнтервала.Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Таким образом, мы разработали окончательный вариант процедуры, выполняемой при заполнении поля договор из справочника договоры. Подведем итог, какие функциональные действия она обеспечивает:
□ вывод информации о фамилии, имени и отчестве учащегося;
П отображение месяца и года заключения договора;
П представление данных о последней оплате;
□ установка на форме названия вида тарифа, по которому учащийся оплачивает обучение;
П заполнение полей для указания месяца и года следующей оплаты.
На рис. 2.17 показана разработанная форма, открытая в режиме 1С:Предприятие. В результате информация в элементах формы заполнена автоматически после выбора названия договора. Наши разработанные процедуры пока
722
Гпава 2
являются только подготовительными. Они реализуют извлечение информации из регистра Квитанции, а в следующих разделах описываются активные действия со стороны пользователя.
Рис. 2.17. Форма для работы с квитанциями в режиме 1С:Предприятие
Обработка нажатия кнопки Расчет тарифа
Предыдущими действиями мы обеспечили автоматическое заполнение поля ТарифЗаМесяц (на рис. 2.17 оно располагается ниже надписи Тариф за указанный месяц) после указания названия договора в поле договор. Для этого ПОЛЯ МесяцПроизьеденияОплаты И ГодПроизведенияОплаты ДОЛЖНЫ быть предварительно заполнены, и их заполнение производится при открытии формы (процедура ПриОткрытии).
Использование регистров сведений 123
Таким образом, при открытии формы автоматически заполняются поля о дате предполагаемой оплаты, а после выбора договора автоматически вносится сумма тарифа на эту дату. Однако часто учащийся при выписке квитанции уже заранее собирается оплачивать ее не в текущем месяце, а позже. В этом случае и тариф за месяц будет другой — более высокий.
В связи с этим необходимо предусмотреть возможность внесения изменений В Содержание полей МесяцПроизведенияОплаты И ГодПроизведенияОплаты, а затем и повторного заполнения надписи ТарифЗаМесяц уже правильной информацией.
Описанные действия выполняются при нажатии кнопки Расчет тарифа. Перейдем к процедуре (листинг 2.6), с помощью которой все это и реализуется. Фактически ее содержание нам уже знакомо по фрагменту листинга 2.3, где приведена процедура, выполняемая при выборе договора.
9’......	...............	...........	.« •'•FTi-r “ К “Г • * *$
Листинг 2.<5. Процедура, выполняемая при нажатии кнопки Расчет тарифа £...........................................................
Процедура РасчетТарифаНажатие(Элемент)
ВыборкаЗаписей = РегистрыСведений.Тарифы.Выбрать();
Индикатор = 0;
Пока ВыборкаЗаписей.Следующий() Цикл
Если ВыборкаЗаписей.ВидТарифа.Наименование =
ЭлементыФормы.Названиетарифа.Значение
И ВыборкаЗаписей.НомерМесяца =
ЭлементыФормы.МесяцПроизведенияОплаты.Значение
И ВыборкаЗаписей.Год =
ЭлементыФормы.ГодПроизведенияОплаты.Значение Тогда
ЭлементыФормы.ТарифЗаМесяц.Значение = ВыборкаЗаписей.Стоимость;
Индикатор = 1;
Прервать;
КонецЕсли;
КонецЦикла ;
Если Индикатор = 0 Тогда
ЭлементыФормы.ТарифЗаМесяц.Значение = 0;
Сообщить(" По указанным данным информации о тарифе нет");
КонецЕсли;
КонецПроцедуры
Гпава 2
124
Теперь пользователь, изменив месяц (при необходимости и год), когда клиент собирается произвести оплату, может всегда вывести на форму величину необходимого тарифа из регистра квитанции.
Процедура расчета суммы квитанции
Следующая процедура (выполняемая при нажатии кнопки Расчет суммы) связана с простым перемножением чисел, расположенных в элементах ТарифЗаМесяц и количествоОплачиваемыхМесяцев. Результат перемножения записывается в поле СуммаОплаты, но в случае необходимости пользователь может его скорректировать (просто внести другую сумму, если это нужно).

Листинг 2.7. Процедура, выполняемая при нажатии кнопки Расчет суммы
Процедура РасчетСуммыНажатие(Элемент)
Количество=Число(ЭлементыФормы.КоличествоОплачиваемыхМесяцев.Значение);
ЦенаМесяц=Число(ЭлементыФормы.ТарифЗаМесяц.Значение);
Сумма = Количество*ЦенаМесяц;
ЭлементыФормы.СуммаОплаты.Значение=Сумма;
КонецПроцедуры
Запись информации в регистр Квитанции
Последняя процедура, обеспечивающая функциональность работы формой, связана с записью параметров новой введенной квитанции на оплату в регистр Квитанции. Сам текст процедуры приведен в листинге 2.8. В этом случае программным путем производится создание новой записи в регистре сведений, а далее в эту запись заносятся значения четырех параметров — договор, период, месяцначала, годНачала. Значения грех параметров просто переносятся с соответствующих элементов формы, а для заполнения значения измерения Период используется уже известная нам функция ТекущаяДата о .
Что касается значений месяцОкончания и годОкончания, то содержание этих полей рассчитывается из информации о месяце начала оплаты и количестве оплачиваемых месяцев.
Использование регистров сведений	125
Пистй <г 2.8. Процедура, выполняемая npv нажатии кнопки
Записать квитанцию .. “ .. ..	.. .. _._. _.. .. ___________ _  „... „ „ ..„ ......
Процедура ЗаписьКвитанцииНажатие(Элемент)
КоличествоМесяцев=
Число(ЭлементыФормы.КоличествоОплачиваемыхМесяцев.Значение);
ВариантМесяца = КоличествоМесяцев+
Число(ЭлементыФормы.МесяцНачалаОплаты.Значение)-1;
ВариантГода =
Число(ЭлементыФормы.ГодНачалаОплаты.Значение);
Если ВариантМесяца > 12 Тогда
ВариантМесяца = ВариантМесяца -12;
ВариантГода = Число(ЭлементыФормы.ГодНачалаОплаты.Значение) +1;
КонецЕсли;
НаборЗаписей =
РегистрыСведений.Квитанции.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Период.Установить(ТекущаяДата());
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Договор = Договор;
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.МесяцНачала = ЭлементыФормы. МесяцНачалаОплаты.Значение;
НоваяЗапись.ГодНачала = ЭлементыФормы. ГодНачалаОплаты.Значение;
НоваяЗапись.МесяцОкончания = ВариантМесяца ;
НоваяЗапись.ГодОкончания = ВариантГода;
НоваяЗапись.СуммаПоКвитанции = ЭлементыФормы. СуммаОплаты.Значение;
НоваяЗапись.Оплачено=Ложь;
НаборЗаписей.Записать(Истина);
КонецПроцедуры
В процедуре ЗаписьКвитанцииНажатие используются новые программные конструкции. А именно для работы с регистром сведений используется ряд объектов. Мы воспользовались объектом РегистрСведенийНаборЗапи-сей.квитанции, который позволяет выполнять операции над несколькими записями, обеспечивая их считывание и запись в базу данных.
РегистрСведенийНаборЗаписей.Квитанции представляет собой коллекцию записей регистра сведений Квитанции. Этот объект позволяет считывать записи по определенному условию из базы данных. Также с его помощью можно добавлять, удалять и модифицировать записи в наборе. Возможно за
126
Гпава 2
мещение всех имеющихся в базе данных записей по указанному условию на записи, содержащиеся в наборе.
В процедуре, приведенной в листинге 2.8, для создания этого объекта используется метод СоздатьНаборЗаписей (), и после выполнения строки
НаборЗаписей = РегистрыСведений.Квитанции.СоздатьНаборЗаписей()
мы получаем возможность в дальнейшем с помощью переменной наборЗапи-сей программно обращаться к интересующему нас объекту — РегистрСведе-нийНаборЗаписей. Квитанции. Далее В строке процедуры
НоваяЗапись = НаборЗаписей.Добавить()
добавляется новая запись в набор записей регистра сведений. Тип возвращаемого значения у метода Добавить()	— РегистрСведенийЗапись.
Квитанции. И с помощью переменной НоваяЗапись можно получить доступ к одной (новой создаваемой записи) записи. Далее с помощью программных конструкций подобных
НоваяЗапись.Договор = Договор
поля новой записи заполняются информацией с формы.
В последней строке процедуры
НаборЗаписей.Записать(Истина)
используется метод Записать () для записи новой информации в базу данных. Этот метод в зависимости от значения входного параметра работает двумя различными способами. Если параметр установлен в значение истина, то перед внесением информации в базу данных существующие записи (попадающие в отбор) будут удалены. Если же в качестве параметра указано ложь, то записи будут дописаны к уже существующим в информационной базе. Заметим, что если входной параметр не указывать, то по умолчанию считается, что он равен истина.
Таким образом, действия по разработке формы учетквитанций на первом этапе завершены. Основной итог заключается в том, что мы получили форму, с помощью которой можно внести в информационную базу сведения о выписанной квитанции. При этом пользователь получает информацию о последней оплаченной квитанции клиента, а также о величине тарифа на дату, когда планируется оплата квитанции. Однако разработка еще не завершена, так как не хватает нескольких деталей.
Во-первых, наша система не создает печатный бланк квитанции и, естественно, не производит автоматическое заполнение полей этого документа. А, во-вторых, мы пока не предусмотрели механизма регистрации оплаты (необхо
Использование регистров сведений
127
димо каким-то образом отмечать, если квитанция оплачена). В следующем разделе рассматривается создание новой формы с необходимыми элементами управления для фиксации оплаты. А в конце главы автоматизируется заполнение бланка квитанции в приложении Microsoft Word.
Форма регистрации квитанций
Наша задача в этом разделе заключается в разработке удобного механизма фиксирования оплаченных квитанций. Здесь можно пойти двумя путями. Возможен вариант создания нового документа для регистрации квитанций. В этом случае вопросы о том, когда было отмечено, что определенная квитанция оплачена, решаются путем поиска необходимого документа. Однако работе с документами будет посвящена четвертая глава, где и рассматривается похожий пример. Здесь же мы для регистрации оплаты воспользуемся уже знакомым объектом конфигурации — обработкой.
Рис. 2.18. Форма обработки Регистрация квитанций
128
Гпава 2
Итак, начнем создание новой обработки, которую назовем РегистрацияОпла-ты. Эти технические действия мы уже выполняли, поэтому пояснения на этот раз будут более краткие. Так, для данной обработки на закладке Формы необходимо создать новую форму произвольного вида (рис. 2.18).
В верхней части расположим поле ввода договор (тип данных укажем — СправочникСсылка. Договоры). Слово Договор выбрано и в качестве заголовка, и в качестве имени этого элемента. Ниже размещаются восемь элементов типа надпись, при этом левые надписи являются просто поясняющими и далее в программных процедурах не используются, а надписи в правой части формы, выделенные более светлым оттенком, будут автоматически (с помощью программной процедуры) заполняться при выборе договора. Также при выборе договора автоматически заполняется фамилией (вместе с именем и отчеством) учащегося поле клиент.
В программной процедуре (листинг 2.9), выполняемой при выборе договора, производится поиск неоплаченной квитанции, и когда такая находится, то ее параметры отражаются в элементах формы.
Примечание
Для выполнения процедуры, приведенной в листинге 2.9, в регистре квитанции ДЛЯ реквизита Оплачено СВОЙСТВО Индексировать ДОЛЖНО иметь значение Индексировать.
‘Листинг9 11роцедура, од полня*»м?я пр;: выборе договора
Процедура ДоговорПриИзменении(Элемент)
Договор = ЭлементыФормы.Договор.Значение;
ЭлементыФормы.МесяцНачалаОплаты.Значение = ЭлементыФормы.ГодНачалаОплаты.Значение = "";
ЭлементыФормы. МесяцОкончанияОпл’аты. Значение = ЭлементыФормы.ГодОкончанияОплаты.Значение = СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Оплачено",Ложь);
ВыборкаЗаписей =
РегистрыСведений.Квитанции.Выбрать(,,СтруктураОтбора);
Пока ВыборкаЗаписей.Следующий() >0 Цикл
Если ВыборкаЗаписей.Договор = Договор Тогда ЭлементыФормы.МесяцНачалаОплаты.Значение =
ВыборкаЗаписей.МесяцНачала;
Использование регистров сведений
129
ЭлементыФормы.ГодНачалаОплаты.Значение = ВыборкаЗаписей.ГодНачала;
ЭлементыФормы.МесяцОкончанияОплаты.Значение =
ВыборкаЗаписей.МесяцСкончания;
ЭлементыФормы.ГодОкончанияОплаты.Значение =
ВыборкаЗаписей.ГодОкончания;
Прервать;
КонецЕсли;
КоненЦикла
КонецПроцедуры
Перейдем теперь к процедуре (листинг 2.10), выполняемой по нажатию кнопки Установить оплату. Ее назначение — установить значение Истина в поле Оплачено ДЛЯ выбранной записи В регистре Квитанции. Для этого мы воспользовались объектом РегистрСведенийМенеджерЗаписи.Квитанции. Следует заметить, что его свойства и методы позволяют обеспечить как программную, так и интерактивную работу с регистром сведений. Обязательным условием применения подобного объекта является независимый режим записи в регистр.
В процедуре, расположенной в листинге 2.10, для создания объекта Регист-рСведенийМенеджерЗаписи.Квитанции ИСПОЛЬЗОВан метод СоздатьМенеджер-Записи (). После выполнения строки
Запись = РегистрыСведений.Квитанции.СоздатьМенеджерЗаписи()
мы получаем возможность с помощью переменной Запись программно обращаться К объекту— РегистрСведенийМенеджерЗаписи.Квитанции.
После этого в процедуре организуется выборка записей из регистра квитанции, которые еще не оплачены. И когда находится неоплаченная квитанция по указанному договору, то устанавливаются значения полей менеджера записи. После этого запись извлекается из базы данных командой Запись.Прочитать (). Далее у извлеченной записи меняется значение реквизита Оплачено, и она с помощью метода Записать () менеджера записи записывается в таблицу базы данных с замещением предыдущей.
£.-j’S".:...................................\.........
Листинг 2.10. Процедура установки оплаты учащегося 
Процедура УстановитьОплатуНажатие(Элемент)
Запись = РегистрыСведений.Квитанции.СоздатьМенеджерЗаписи();
Договор = ЭлементыФормы.Договор.Значение;
130
Гпава 2
Струк-ураОтбора = Новый Структура;
СтруктураОтбора.Вставить("Оплачено",Ложь);
ВыборкаЗаписей = РегистрыСведений.Квитанции.Выбрать(,,СтруктураОтбора);
Пока ВыборкаЗаписей.Следующий() >0 Цикл
Если ВыборкаЗаписей.Договор=Договор Тогда
Запись.Период = ВыборкаЗаписей.Период;
Запись.Договор = ВыборкаЗаписей.Договор;
Запись.Прочитать();
Если Запись.Выбран() Тогда
Запись.Оплачено = Истина;
Запись.Записать();
Закрыть();
КонецЕсли;
Прервать;
КонецЕсли
КонецЦикла
КонеЦПроцедуры
Формирование документа Microsoft Word
В настоящее время интеграция между различными приложениями в практической работе используется достаточно часто. Кроме информационной системы 1С:Предприятие 8 в офисной работе очень популярны Microsoft Word и Microsoft Excel. Создание большинства офисных документов выполняется именно в этих приложениях.
Здесь мы рассмотрим практическую задачу, связанную с автоматическим созданием документа Microsoft Word непосредственно из процедуры, выполняемой в среде 1С:Предприятие 8. Эта задача является завершающим звеном конфигурации, разрабатываемой во второй главе.
Будем считать, что мы располагаем файлом, созданным в приложении Microsoft Word, который содержит бланк квитанции об оплате (рис. 2.19). По традиционной технологии этот бланк распечатывается па принтере, а затем заполняется вручную сотрудниками офиса. Наша задача заключается в разработке технологии автоматизированного заполнения полей бланка из процедуры, выполняемой в системе 1 С:Предприятие. Ранее в этой главе мы уже разработали систему регистрации квитанций об оплате, и теперь необходимо обеспечить их распечатку в определенном формате.
Использование регистров сведений
131
При рассмотрении большинства примеров книги программирование производится только на встроенном языке системы 1С:Предприятие. Исключением является данный раздел и заключительная часть книги, где также рассматривается программирование приложений Microsoft Office.
Внесение дополнений в бланк квитанции
Как уже мы сказали, для данной разработки потребуется файл, содержащий квитанцию (рис. 2.19) — документ приложения Microsoft Word. Это обыкновенный документ с необходимым форматированием.
В приложении Microsoft Word нам потребуется работа с элементами управления, поэтому необходимо вывести на экран панель — Элементы управления. Для этого в Microsoft Word следует в меню Вид выбрать раздел Панели инструментов и далее поставить отметку напротив позиции Элементы управления. На рис. 2.19 эта панель инструментов показана (расположена ниже панели Стандартная).
Нажав на панели Элементы управления самую первую кнопку слева, можно перейти в конструктор, что позволяет размещать в документе необходимые интерфейсные элементы (аналогичные тем, с которыми мы уже сталкивались при работе по конструированию форм в режиме конфигуратора).
В документе, содержащем бланк квитанции, нам потребуется создать несколько элементов управления типа текстовое поле. Пиктограмма этого элемента на панели — пятая слева, а при наведении на нее курсора мыши появляется подсказка— поле Функциональное назначение элементов текстовое поле аналогично ранее встречавшимся в системе 1 С:Предприятие элементам поле ввода.
Итак, щелкнем по пиктограмме элемента текстовое поле на панели инструментов и с помощью мыши поместим его в нашем документе (рис. 2.20)
Для того чтобы внешний вид исходного бланка не нарушался, необходимо обеспечить его размещение перед текстом. Для этого следует щелкнуть правой кнопкой мыши по созданному в документе элементу управления, а затем в открывшемся контекстном меню выбрать пункт Формат объекта. Здесь на закладке Положение следует установить формат Перед текстом (рис. 2.21). В этом случае внешний вид бланка не изменится, но в нем появятся дополнительные поля для внесения информации. С помощью маркеров, окружающих элемент управления (рис. 2.20), мы можем выбрать его месторасположение в документе. Работа с элементами управления в приложении Microsoft Word
132
Гпава 2
принципиально не отличается от аналогичной работы при разработке формы в режиме конфигуратора.
Рис. 2.19. Файл Microsoft Word, содержащий бланк квитанции
Вторая кнопка слева на панели инструментов Элементы управления позволяет открыть окно свойств активного (т. е. выделенного мышкой) элемента, которое отражается в левой части рис. 2.20. Установим для свойства Name этого элемента значение Ро1е_1. Кроме того, с помощью свойства Font следует подобрать желаемый шрифт для отображения в документе номера договора. На рис. 2.20 текстовое поле выделено оттенком, что обеспечивается установкой цвета с помощью свойства BackColor. Однако реально этого делать не требуется — мы сделали это только для лучшей наглядности описанных действий.
Аналогичным образом создадим еще семь элементов (рис. 2.22). Для правильной работы дальнейшей программной процедуры необходимо установить у них значения свойства Name (сверху вниз) равными — Ро1е_2, Ро1е_3, Ро1е_4, Ро1е_5, Ро1е_6, Ро1е_7, Ро1е_8.
После этого следует выйти из режима конструктора (щелкнув по соответствующей кнопке на панели инструментов, чтобы она стала ненажатой) и сохранить документ на диске, полное название для которого следует выбрать C:\blankl.doc. Дело в том, что далее в программной процедуре потребуется указание полного пути месторасположения файла.
Использование регистров сведений
133
Рис. 2.20. Свойства элемента управления Текстовое окно
Рис. 2.21. Окно для установки формата объекта Текстовое окно
134
Гпава 2
Примечание
Можно изменить имя и месторасположение файла, но тогда нужно и скорректировать соответствующую строку в программной процедуре.
Итак, наша конструкторская работа в приложении Microsoft Word завершена — документ для выписки квитанции готов. Рассматриваемая в следующем разделе программная процедура на встроенном языке 1С будет самостоятельно вносить в квитанцию необходимую информацию.
Мн.го>у|| Ь’м ‘
। - 1Ь 1  17 ' I •
ОТ
__
копеек
О
Подпись плательщика
русский (Рп
Сумма платежа '___
1/1 На 6,7см Ст 14 Кол 76
Форма № ПД-4
Наммсковайне получателя платежа: Отделение по Нижегородскому району г Нижнего
Новгорода УФКпо Нижегородской области ИНН 5260041175 КПП 526001234 (УИЦ НГЛУ 060737721II).
Наименование банка получателя: р/с 4050381080000 1000099 b ГРКЦ ГУ Банка России по
Нижегородской обп г. Нижний Новгород БИК 042201234
Наименование платежа: 07330201010010000127 Разрешение 1 (пункт 1). Доходы, получаемые платной образовательной деятельности дог № за обучение в 2007 - 2008 уч. г.	-у
Плательщик
За______fe'
Стр. 1 Разд 1
Дата« »	~
руб 00 коп
Рис. 2.22. Элементы управления, расположенные в документе приложения Microsoft Word
Правка ЁИд Вставка Фсщэт Сервис Таблица £кио ^правка



Разработка процедуры заполнения бланка
В этом разделе мы переходим из приложения Microsoft Word в режим конфигуратора системы 1 С:Предприятие. Для начала откроем конфигурацию, созданную во второй главе. Далее на форме обработки учетКвитанций создадим еще одну кнопку Передача в Word (рис. 2.23), при нажатии на которую будет выполняться процедура, приведенная в листинге 2.11.
Использование регистров сведений
135
зетжг •  • тв
Кинцигудонъ; ' “
-- расчет	оожь*
Месяц начала оплаты
Г од начала оплаты
ХАР ,Ш1М <ц*- т ДО
>35 к 351
iat i Пр*в^г Фор.-1-4 Конфйгдеаи { Птлад a ^дмннтсг! и-чл-аиг” Cepei'-o Окна Справка-
...^ —; > VT—	-	--— —	— X, —-"—j у
&орЛк<>* !‘«иКлч1 шин Ф<фМлЦ*е> Дахюхчи»
"•* ИнФормааий s>	~
Начало предыдущего интервала
« МесяцН ачалаИ нтервала> >
< <Г одНачэлэИнтервала> >
Скончание предыдущего интервала
<<МесяцСкончамияИмтервал.
<<Г одОкснчанияИнтервала»
Количество оплачиваемых месяцев:
Расчет суммы
^Записать квитанцию ]	Передача в Word j
Диалог Модуль ’S Реквизиты
Для получения подсказки нажмите И

йй
Рис. 2.23. Внесение изменений в форму обработки УчетКвитанций
Лис. инг 2.11. Процедуоа для заполнения квитанций в Microsoft Word	J
яЯВ....?.. .4     ..SEW.......:......	..:.....	....... „.. ..'.:_.. _J
Процедура ПередачаВИогсШажатие(Элемент)
МассивМесяцев = Новый Массив();
МассивМесяцев.Вставить(1,"янв.");
МассивМесяцев.Вставить(2,"февр.");
МассивМесяцев.Вставить(3,"март");
МассивМесяцев.Вставить(4,"апр.");
МассивМесяцев.Вставить(5,"май");
МассивМесяцев.Вставить(6,"июнь");
МассивМесяцев.Вставить(7,"июль");
МассивМесяцев.Вставить(8,"авг.");
МассивМесяцев.Вставить(9,"сент.");
МассивМесяцев.Вставить(10,"окт.");
МассивМесяцев.Вставить(11,"ноябр.");
МассивМесяцев.Вставить(12,"дек.");
МесяцНачала = ЭлементыФормы.МесяцНачалаОплатЫ.Значение;
ГодНачала = ЭлементыФормы.ГодНачалаОплаты.Значение;
Колич = ЭлементыФормы.КоличествоОплачиваемыхМесяцев.Значение;
appWD = Новый СОМОбъект("Word.Application");
appWD.Visible = Истина;
appWD.Documents.Open ("C:\blankl.doc");
136
Гпава 2
appWD.ActiveDocument.Pole_l.Text =
Строка(ЭлементыФормы.Договор.Значение);
appWD.ActiveDocument.Pole_2.Text = "С " +
МассивМесяцев[МесяцНачала] + " " +
Строка(ГодНачала) + " - " + Строка(Колич)+ "мес.";
appWD.ActiveDocument.Pole_3.Text = ЭлементыФормы.Учащийся.Значение;
appWD.ActiveDocument.Pole_4 = "Оплата за обучение";
appWD.ActiveDocument.Pole_5 =
Строка(ЭлементыФормы.СуммаОплаты.Значение);
ПараметрыПредметаИсчисления ="рубль,рубля,рублей,коп";
ФорматнаяСтрока = "Jl=ru_RU";
ВыводимоеЧисло = ЭлементыФормы.СуммаОплаты.Значение;
appWD.ActiveDocument.Pole_6 = ЧислоПрописью(ВыводимоеЧисло, ФорматнаяСтрока, ПараметрыПредметаИсчисления);
appWD.ActiveDocument.Pole_7 =
МассивМесяцев[ЭлементыФормы.МесяцПроизведенияОплаты.Значение];
appWD.ActiveDocument.Pole_8 = ,
Строка(ЭлементыФормы.ГодПроизведенияОплаты.Значение);
КонецПроцедуры
Процедура отличается от ранее рассмотренных наличием новых конструкций, поэтому теперь мы познакомимся с ней подробнее. В начале процедуры создается массив элементов, и переменной МассивМесяцев присваивается ссылка на него. Вообще, массив является объектом, предназначенным для работы с временными наборами данных в течение текущего сеанса работы пользователя. Чаще всего использование массивов требуется для некоторых промежуточных действий. В данном случае мы создаем набор соответствий номеров месяцев и их сокращенных названий. Для этого мы могли поступить и иначе — создать стационарный объект, сохраняемый между различными сеансами на энергонезависимом носителе (диске). Однако выбранный путь позволяет познакомиться с массивами на конкретном примере.
В общем, массив можно считать набором значений произвольного типа. При этом каждый элемент массива имеет свой индекс — по значению этого индекса к элемешу массива можно обратиться — записать или извлечь информацию. Например, Массив1 [5] — значение пятого элемента массива с именем массив!.
Для создания массива в процедуре используется оператор Новый в следующей редакции:
МассивМесяцев = Новый Массив()
Использование регистров сведений
137
где МассивМесяцев — имя переменной, которая будет ассоциироваться с создаваемым объектом типа Массив. По тексту процедуры после создания массива мы добавляем в него 'начения строкового типа с помощью метода Вставить (), у которого два параметра. Первый параметр определяет индекс элемента массива, а второй — значение элемента массива.
Таким образом, в нашей процедуре массив заполняется сокращенными названиями месяцев. В дальнейшем это потребуется при выводе названий в поля квитанции. А именно в элемент управления Ро1е_4 (рис. 2.22) заносится название месяца начала оплаты и количество оплачиваемых месяцев. Кроме того, элемент Ро1е_7 также заполняется строковым названием месяца, в течение которого учащийся собирается произвести оплату.
В процедуре, представленной в листинге 2.11, использована технология OLE (связывание и внедрение объектов). Она предоставляет возможность в одних приложениях работать с объектами, созданными в других приложениях.
В этой технологии существует несколько ключевых понятий. Так, OLE-объектом называется объект, созданный в приложении, отличном от текущего, но при этом связь со своим «родным» приложением у него сохранена. В офисной работе очень популярны приложения Microsoft Word и Microsoft Excel, и, соответственно, используемые документы Microsoft Word и рабочие книги Microsoft Excel могут быть OLE-объектами. Сервером приложения OLE считается приложение, создающее объекты, которые можно поместить в документ-контейнер, создаваемый в другом приложении.
В приведенной в листинге 2.11 процедуре приложение 1С:Предприятие 8 используется как контейнер, а приложение Microsoft Word как сервер. При таком взаимодействии Microsoft Word предоставляет свои объекты другим приложениям, чем мы и воспользуемся.
В строке
appWD = Новый СОМОбъект("Word.Application")
мы формируем в переменной appWD ссылку на приложение Microsoft Word, а далее отображаем окно этого приложения на экране:
appWD.Visible = Истина.
Для дальнейших действий требуется знание месторасположения в компьютере документа Microsoft Word с квитанцией. Как уже говорилось, созданный бланк квитанции мы расположили на диске С в файле под именем blank.doc. Далее мы пользуемся методом Open для открытия необходимого документа:
appWD.Documents.Open ("С:\blank.doc")
138
Гпава 2
После этого можно начать работать с документом, используя его внутренние объекты, методы и свойства. В последующем программном коде процедуры в объекты документа Microsoft Word (в элементы управления, которые мы сами разместили) переносится информация с формы обработки.
После действий в конфигураторе системы ^Предприятие (которые свелись к размещению кнопки на форме и созданию программной процедуры, обслуживающей нажатие на кнопку), можно перейти в режим 1С Предприятие, открыть форму обработки УчетКвитанций, внести информацию по создаваемой квитанции и щелкнуть по кнопке передачи информации в Microsoft Word. В результате мы получим заполненную выписку (рис. 2.24).

- фгйп	-  ЁЙд йёлркл ' Дчэрдат : Cftpsrti: Герина* ую® Срраека	.»	* X
. J 4.	'S0T° ~	Roman 7 Iж W	R._.
« . < .	Jb.__________i______________,_____......... .. ....... ....™
Jtj'g 1  *  ’  5  1 • 6  1	1  ’  8  1  •»  •  w • 1  и  • • 12 •  - 13 - I - 14 - I - 15 -  lb • I • W  I  18
Форма № ПД-4
Нанмгновянне получателя платежа: Отделение по Нижегородскому району г Нижнего - Новгорода УФК по Нижегородской области ННН 52600411"? КПП 526001234 (У1Щ НГЛУ 1 пс 06073772111)
Наименование банка получателя: р г 40503810800001000099 в ГРКЦ ГУ Банка России по
Нижегородской обл г. Нижний Новгород БИК 042201234
Наименование платежа: 0733020101001000012" Разрешение 1 (пункт П Доходы. получаемые от m платной образовательной деятельности дог №	123/77
за обучение в 200" - 2008 уч. г с Февр 2 DD6 - 5мес
* Плательщик Иванов Иван Петрович____________________________________________________
 ‘ за	Оплата за обучение
Сумма платежа 11 j0° руб 00 коп.
Одиннадцать тысяч рублей 00 ; копеек
(Сумма ^чаикью)
~ п	т	сект	2 007
Подпись плательщика	Дата« »
a ufa] э и с
Стр. 1 PaiA I 1/1 На 6,3см Ст 13 Кол 66	русский (Ро iClTt
Рис. 2.24. Заполнение бланка квитанции об оплате
Заполнение бланка с двумя квитанциями
Мы рассмотрели ситуацию заполнения бланка, содержащего одну квитанцию. Реально требуется заполнение двух копий квитанций (рис. 2.25), поэтому в листинге 2.12 приведена обновленная процедура, выполняемая при на-
Использование регистров сведений
139
жатии кнопки Передача в Word. Опа предполагает создание наряд} с восемью текстовыми окнами для первой квитанции еще восьми аналогичных элементов управления для второго бланка. Для имен этих новых элементов в процедуре предполагаются следующие имена (порядок элементов сверху ВНИЗ— аналогично рис. 2.22): Ро1е_1_2, Ро1е_2_2, Ро1е_3_2, Ро1е_4_2, Pole 5 2, Pole 6 2, Pole 7 2. Pole 8 2.
Рис. 2.25. Бланк с двумя квитанциями
Листинг 2.12. Процедура для заполнения бланка с двумя квитанциями в Micxvoft Word

Процедура ПередачаВИогсШажатие(Элемент) МассивМесяцев = Новый Массив();
МассивМесяцев.Вставить(1,"янв.");
МассивМесяцев.Вставить(2,"февр.");
-МассивМесяцев.Вставить(3,"март");
МассивМесяцев.Вставить(4,"апр.");
МассивМесяцев.Вставить(5,"май");
140
Гпава 2
МассивМесяцев.Вставить(6,"июнь");
МассивМесяцев.Вставить(7,"июль");
МассивМесяцев.Вставить(8,"авг.");
Массив!!есяцев. Вставить (9, "сент. ");
МассивМесяцев.Вставить(10,"окт.") ;
МассивМесяцев.Вставить(11,"ноябр.");
МассивМесяцев.Вставить(12,"дек ");
МесяцНачала = ЭлементыФормы.МесяцНачалаОплаты.Значение;
ГодНачала = ЭлементыФормы.ГодНачалаОплаты.Значение;
Колич = ЭлементыФормы.КоличествоОплачиваемыхМесяцев.Значение;
appWD = Новый СОМОбъект("Word.Application");
appWD.Visible = Истина;
appWD.Documents.Open ("C:\blank2.doc");
appWD.ActiveDocument.Pole_l.Text = Строка(ЭлементыФормы.Договор.Значение);
appWD.Act iveDocument.Pole_l_2.Text =
Строка(ЭлементыФормы.Договор.Значение);
appWD.ActiveDocument.Pole_2.Text = "С " + МассивМесяцев[МесяцНачала] + " " + Строка(ГодНачала) + ” - " + Строка(Колич)+ "мес.";
appWD.ActiveDocument.Pole_2_2.Text = "С " + МассивМесяцев[МесяцНачала] + " " + Строка(ГодНачала) + " - " + Строка(Колич)+ "мес.";
appWD.ActiveDocument.Pole_3.Text = ЭлементыФормы.Учащийся.Значение;
appWD.ActiveDocument.Pole_3_2.Text = ЭлементыФормы.Учащийся.Значение;
appWD.ActiveDocument.Pole_4 = "Оплата за обучение";
appWD.ActiveDocument.Pole_4 2 = "Оплата за обучение";
appWD.ActiveDocument.Pole_5 = Строка(ЭлементыФормы.СуммаОплаты.Значение);
appWD.ActiveDocument.Pole_5_2 =
Строка(ЭлементыФормы.СуммаОплаты.Значение);
Параметры11редметаИсчисления ="рубль,рубля,рублей";
ФорматнаяСтрока = 'T=ru_RU";
ВыводимоеЧисло^ ЭлементыФормы.СуммаОплаты.Значение;
appWD.ActiveDocument.Pole_6 = ЧислоПрописью(ВыводимоеЧисло, ФорматнаяСтрока, ПараметрыПредметаИсчисления);
appWD.ActiveDocument.Pole_6_2 = ЧислоПрописью(ВыводимоеЧисло, ФорматнаяСтрока, ПараметрыПредметаИсчисления);
Использование регистров сведений
141
appWD. ActiveDocument. Pole_7 =
МассивМесяцев[ЭлементыФормы.МесяцПрои >веденияОплаты.Значение];
appWD.Act iveDocument.Pole_7_2 =
МассивМесяцев[ЭлементыФормы.МесяцПроизведенияОплаты.Значение];
appWD.ActiveDocument.Pole_8 =
Строка(ЭлементыФормы.ГодПроизведенияОплаты.Значение);
appWD.ActiveDocument.Pole_8_2 =
Строка(ЭлементыФормы.ГодПроизведенияОплаты.Значение);
КонецПроцедуры
Итоги второй главы
В этой главе мы познакомились с важными прикладными объектами — регистрами сведений. Они предназначены для аккумулирования разнообразной информации, которая хранится в привязке к определенному набору значений, называемых измерениями. Возможна ситуация, когда в качестве одного из измерений присутствует время (в системе для этого используется параметр— период). Регистры сведений делятся на две категории— периодические и непериодические, и им отводится значительное место при разработке прикладных решений на базе системы 1С:Предприятие.
После рассмотрения конфигурации, приведенной в этой главе, у читателей должны сформироваться практические навыки работы с регистрами сведений. Сам по себе пример по учету оплаты за обучение должен помочь при решении собственных задач автоматизации офисной работы. Параллельно с рассмотрением регистров сведений в главе большое место было уделено программированию событий, связанных с элементами экранной формы.
Как правило, офисная работа связана с разнообразными приложениями. Часто требуется организовать эффективный обмен информацией между ними. Пример, рассмотренный в заключительной части главы, показывает, что данная задача вполне решаема. В большинстве ситуаций пользователи, используя справочную информацию системы 1С:Предприятие 8, могут самостоятельно решить практические задачи, связанные с передачей данных в документы, созданные в других приложениях. В дальнейшем в заключительной главе книги мы рассмотрим еще один пример на данную тему— обмен информацией между приложением Microsoft Excel и 1С:Предприятие 8.
Аккуратное и внимательное рассмотрение приведенной во второй главе разработки конфигурации уже позволяет читателю перейти к самостоятельным разработкам.
Глава 3
Извлечение информации с помощью запросов
Если в целом оценить примеры, приведенные в первых двух главах, то можно сказать, что мы работали в основном с первичной информацией, сосредоточенной в разнообразных объектах— справочниках, регистрах и документах И если бы нас интересовали данные только в такой исходной форме, то больше ничего бы в принципе и не требовалось. Всегда можно было бы открыть необходимый справочник, просмотреть содержимое регистра или документа из списка документов.
Однако для управляющего звена организации представляет интерес информация в существенно обработанном виде (итоговые и сводные данные). Например, В первой гчове МЫ создали справочник Специалисты, в котором присутствует табличная часть, отражающая различные места работы (рассматривается ситуация, что у определенного специалиста может быть не одно место работы). И, скажем, может возникнуть необходимость получения отчета обо всех сторонних организациях, где наши сотрудники дополнительно работают.
Конечно, можно было бы при разработке данного справочника пойти по пути предварительного создания вспомогательного (подстановочного) справочника со списком организаций. Да, действительно, именно так и стоило бы поступить, если бы на этапе разработки планировалось, что подобный справочник нам будет в дальнейшем необходим. В данной же ситуации (когда конфигурация разработана и информационная база заполнена данными) для получения отчета требуется проанализировать различные организации исходя из информации, располагающейся в табличных частях элементов справочника Специалисты. Один из вариантов интересующего нас отчета приведен в табл. 3.1.
144
Гпава 3
Таблица 3.1. Список организаций
Название организации
АО Связьинвест
НМСИ
АО Меда
МТКИ
Технически для составления подобного отчета мы должны перебрать все элементы справочника Специалисты и изучить их табличные части Понятно, что без автоматизации данную работу выполнять не очень интересно.
Другая аналогичная задача может возникнуть при работе со справочником Курсы, также созданным в главе 1 книги. В нем представлена информация о дате начала занятий, их продолжительности в неделях, стоимости обучения и преподавателе. При работе с подобным справочником может возникнуть, например, следующая задача— необходимо составить список курсов продолжительностью не менее пяти недель, таких, что стоимость обучения на каждом из них превышает 1500 рублей.
Для решения подобных задач в системе 1С:Предприятие используется специальный объект, который называется запрос. По существу, любой запрос представляет собой требование к системе извлечь выборку с необходимой информацией из базы данных. Но, кроме обыкновенного отбора, запросы могут осуществлять еще много полезных действий — выполнение 1 руппировки отобранных данных, вычисление итогов и др. Запросы удобно использовать, когда требуется сформировать сложную выборку данных, сгруппированную и отсортированную необходимым образом.
В конфигурации, разработанной во второй главе, мы создали регистр сведений квитанции. Используя запрос с группировкой по клиентам, можно легко подсчитать — кто и какую сумму уже оплатил за обучение. Также с помощью запроса можно выбрать клиентов, которые имеют неоплаченные квитанции.
С запросами мы уже встречались в книге. В разработанной в главе 1 конфигурации мы узнали, каким образом с помощью запроса можно подсчитать суммарную оплату учащимися различных курсов. Также мы выяснили, как получить ответ на вопрос, кто и сколько уже оплатил за конкретный курс, например, «Базы данных». Фактически подобные примеры, рассмотренные в
Извлечение информации с помощью запросов
145
начале книги, являются неким анонсом данной главы. Здесь технология составления запросов будет рассмотрена, начиная с основных положений. На разнообразных задачах вы получите практические навыки по формированию учетной и сводной информации.
Язык запросов.
Основные конструкции
Если взглянуть на первые две главы в целом, то можно сказать, что мы на примерах познакомились с различными конструкциями встроенного языка программирования системы 1С:Г1редприятие 8. Как и в большинстве подобных языков, основной план действий разработчика связан с определением точной последовательности шагов, направленных на достижение конкретной цели. Все начинается с формулировки задачи, затем составляется алгоритм действий, а далее, на этапе кодирования, подбираются соответствующие программные конструкции языка.
В построение запроса заложена другая идея — мы формулируем задачу для системы на понятном ей языке (языке запросов). При построении запроса необходимо максимально точно описать, какой результат нам нужно получить. В этом разделе мы познакомимся с основными конструкциями запросов на различных примерах. Однако при этом мы не ограничимся только справочной информацией, а проиллюстрируем почти все приведенные конструкции языка запросов практическими примерами.
В качестве первого задания рассмотрим запрос для извлечения информации, расположенной В ПОЛЯХ Договор И СуммаПоКвитанции регистра сведений Квитанции (речь пойдет о конфигурации, разработанной в главе 2 книги). Нам необходимо получить список квитанций с указанием номера договора и выписанной суммы. Такой несложный запрос выглядит следующим образом:
ВЫБРАТЬ Договор, СуммаПоКвитанции
ИЗ РегистрСведений.Квитанции
В результате его выполнения мы получим таблицу из набора строк с двумя колонками. Число строк в таблице соответствует числу имеющихся записей в регистре Квитанции.
В приведенном запросе использовано ключевое слово выбрать, позволяющее указать список полей для данного запроса. Другое ключевое слово из позволяет определить объекты конфигурации, участвующие в рассматриваемом
146
Гпава 3
запросе. В данной ситуации используется регистр сведений квитанции, из которого извлекается информация о двух его полях (измерении договор и ресурсе СуммаПоКвитанции).
В принципе язык запросов позволяет обходиться и без указания ключевого слова из, но в этом случае в конструкции требуется указать полные имена полей, участвующих в запросе. Рассмотренный ранее текст можно было оформить и по-другому:
ВЫБРАТЬ РегистрСведений.Квитанции.Договор,
РегистрСведений.Квитанции.СуммаПоКвитанции
Вообще существует много разнообразных синтаксических конструкций запросов. И далее мы увидим, каким образом можно выполнять подобные запросы в системе 1С:Предприятие 8. При этом, кроме конструкций языка запросов, безусловно, потребуются и уже в некоторой степени знакомый нам встроенный язык программирования системы 1С:Предприятие 8.
На этом вводная часть завершена, и настала очередь перейти к практике. Начнем ее с того, что в конфигураторе откроем конфигурацию, ранее разработанную нами в главе 2. Результаты запросов потребуется где-то отражать, и для этого можно использовать элементы управления, располагаемые на формах основных объектов конфигурации. Для отображения табличных данных хорошо подходит табличный документ. В примерах данной главы для отображения результатов этими ресурсами мы и воспользуемся.
Обработка Извлечение информации
Для начала создадим новую обработку. Непосредственные технические действия для этого нам уже знакомы. Ключевой параметр любого объекта конфигурации — имя, для которого мы укажем значение извлечениеИнформации (рис. 3.1).
В этой обработке нам потребуется подчиненный объект конфигурации — форма, на которой будет размещено несколько элементов управления. Все основные действия по разработке произойдут на уже знакомой нам закладке Модуль, предназначенной для размещения текстов программных процедур на встроенном языке.
С закладки Основные перейдем на закладку Формы, где создадим форму произвольного вида (рис. 3.2) без дополнительных панелей инструментов. Как видно, на форме расположен уже знакомый элемент управления кнопка и
Извлечение информации с помощью запросов
147
еще пока не встречавшийся в наших разработках элемент поле списка. Технически, как мы уже знаем, элементы размещаются на форме при помощи меню Форма | Вставить элемент управления. Про кнопки мы уже говорили, а поле списка требует небольшого пояснения.
Рис. 3.1. Окно редактирования обработки
Извлечение информации
Рис. 3.2. Форма обработки
Извлечение информации
148
Гпава 3
В системе 1С:Предприятие 8 существует объект список значений. Это не сохраняемый в базе данных объект, который предназначен для формирования динамических наборов данных. Список значений может быть заполнен значениями любого типа.
Примечание
Объект список значений является коллекцией значений, составляющих список.
Для визуального представления объекта список значений в системе Ю.Предприятие можно использовать элемент управления поле списка, который предназначен для выбора одного или нескольких значений из списка.
Определимся с именами объектов, что необходимо для того, чтобы представленная далее процедура была работоспособна. Для кнопки будем использовать имя ОтобратьИнформацию, а для элемента управления поле списка — СписокОтобранныхДанных. Для того чтобы в режиме работы 1С:Предприятие появился пункт меню для открытия созданной формы обработки, необходимо установить эту форму в качестве основной (рис. 3.3). На этом визуальное проектирование завершено и можно перейти к написанию программного кода. Разработанная форма будег базовой для ряда последующих процедур выполняемых при нажатии КНОПКИ ОтобратьИнформацию. В последующих примерах потребуется лишь изменение программного кода.
Конструкции ВЫБРАТЬ и ИЗ
Функционирование формы связано с тем, что с помощью кнопки Отобрать информацию список значений Список отобранных данных должен заполняться информацией о квитанциях (договор и сумма по квитанции). Процедура, которую следует для этого разработать, приведена в листинге 3.1, за которым следует пояснительный комментарий.
Листинг 3.1. Процедура, выполняемая по нажатию кнопки
Процедура ОтобратьИнформациюНажатие(Элемент) Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор, СуммаПоКвитанции I ИЗ РегистрСведений.Квитанции";
Извлечение информации с помощью запросов
149
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор) + "	” + Строка(Результат.СуммаПоКвитанции) + " руб.");
КонецЦикла;
Koi .ецПроцедуры

Основные
Данные
Далее?
Действия
Наяед
Закрыть
Правка Конфи< рация Отладке Админис .'pi .риванне Серене Дкна Спраека
> Формы Макеты
11сшсистемы Права
Интерфейсы Прочее
Длятюлученияподс ’акн щм uFi
i Е
Е1-’ Формы

I
Основная форма обработки
; Форма
13*®’
Рис. 3.3. Закладка Формы окна редактирования объекта конфигурации

В первой строке создается новый объект типа Запрос, а далее с помощью его свойства Текст непосредственно формируется текст запроса. Это тот текст, который мы уже разобрали в самом начале главы. Как часто получается для большинства запросов, его конструкция занимает более одной строки. В этом случае для продолжения строки используется вертикальная черта ( |).
В следующей после текста запроса программной конструкции
Результат = Запрос.Выполнить().Выбрать()
сначала используется метод Выполнить (), что приводит к выполнению запроса. Затем другой метод, Выбрать о, позволяет произвести выборку информации из выполненного запроса. Фактически этот метод подготавливает работу
150
Гпава 3
другого метода, используемого В операторе Пока . . . Цикл, — метода Следующий о, который обеспечивает выборку очередной строки из результата выполнения запроса. Это позволяет последовательно перебрать строки в полученной выборке.
Далее в процедуре (извлеченной с помощью запроса информацией) заполняется список СписокОтобранныхДанных. Предварительно данный элемент управления очищается с помощью метода Очистить (). Затем организуется цикл перебора строк, отобранных в результате запроса. Метод Добавить (), повторяемый в цикле, позволяет пополнить список на форме информацией об очередной квитанции (о номере договора и сумме).
Примечание
Строка () — это функция преобразования значений, которая преобразует входной параметр в значение типа Строка. Входной параметр может иметь произвольный тип данных.
На рис. 3.4 показан результат выполнения процедуры, приведенной в листинге 3.1, в режиме 1С:Предприятие. На рисунке видно, что информация из регистра сведений квитанции отображена в списке.
Рис. 3.4. Результат выполнения запроса по выписанным квитанциям
Извлечение информации с помощью запросов
151
Упорядочивание в запросе
Если поля или названия объектов достаточно длинные, то для них можно назначить псевдоним с помощью ключевого слова как, что позволяет в дальнейшем обеспечить более компактную запись конструкций запроса, используя назначенный псевдоним вместо исходного длинного имени поля.
Изменим процедуру заполнения списка (листинг 3.1) результатами выполнения запроса. Теперь она должна выглядеть в соответствии с листингом 3.2, где ДЛЯ ПОЛЯ СуммаПоКвитанции введен псевдоним Сумма. Этот псевдоним В тексте запроса мы используем в новой конструкции упорядочить по, что обеспечивает сортировку полученной информации. Ключевое слово убыв говорит о том. что информация должна быть отсортирована по убыванию сумм в квитанциях.
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор, I СуммаПоКвитанции
I КАК Сумма
I ИЗ РегистрСведений.Квитанции
| УПОРЯДОЧИТЬ ПО Сумма УБЫВ";
Результат = Запрос.Выполнить().Выбрать();
Спи, окОтобранныхДанных.Очистить();
Пока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор) + "	" + Строка(Результат.Сумма) + " руб.");
КонецЦикла;
КонецПроцедуры
На рис. 3.5 показан результат выполнения такого запроса с упорядочиванием по сумме (наибольшие значения оказались вверху списка).
Если необходимо упорядочить результаты выполнения запроса по возрастанию, следует применить конструкцию с использованием ключевого слова возр. Например, для рассмотренной ситуации это может выглядеть следующим образом:
УПОРЯДОЧИТЬ ПО Сумма ВОЗР
152
Гпава 3
Примечание
В предложении упорядочить по через запятую перечисляются поля, по которым следует упорядочить результат запроса. Выбранные данные упорядочиваются сначала по первому полю, затем записи с одинаковым первым полем упорядочиваются по второму и т. д. В результате, извлеченная запросом информация становится структурированной и удобной для восприятия пользователями.
Рис. 3.5. Результат выполнения запроса с упорядочиванием по сумме
Отбор максимальных (минимальных) значений
При большом объеме информации в результате запроса часто требуется посмотреть несколько самых больших или наоборот самых маленьких значений. Например, часто нужны списки наиболее дорогих услуг или товаров. В этом случае в конструкцию выбрать добавляется ключевое слово первые. Например, если нас интересуют две квитанции с самыми маленькими выписанными суммами, то для этого можно использовать процедуру, приведенную в листинге 3.3.
На рис. 3.6 отражен результат работы нашего примера в режиме 1С:Предприятие, где показана информация (номер договора и сумма) о двух минимальных по сумме квитанциях.
Извлечение информации с помощью запросов 153
„  г   tats ’-'J 1И^ЖМЙЮ5ЧаЦКгВ<^  5^ИЙ«абЖЯ8ЮУаЗЕИЯИЗИ8!Е^
Листинг 3.3. Лооцедура стбор? цеу < минимальных по сумме квитанций лИ
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 2 Договор,СуммаПоКвитанции
| КАК Сумма
I ИЗ
| РегистрСведений.Квитанции
I УПОРЯДОЧИТЬ ПО Сумма ВОЗР";
Результат = Запрос.Выполнить().Выбрать О ;
СписокОтобранныхДанных.Очистить();
Пока Результат.Следующий ) >0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Резуль тат.Договор) + "	" + Строка(Результат.Сумма) + " руб.");
КонецЦикла;
КонецПроцедуры
Рис. 3.6. Результат выполнения отбора двух квитанций с минимальными суммами
Если бы нас интересовали, наоборот, две максимальные по сумме квитанции, то в тексте листинга 3.3 необходимо изменить только конструкцию, связан
154
Гпава 3
ную с упорядочиванием полученных данных. В этом случае текст запроса будет выглядеть следующим образом:
Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 2 Договор,СуммаПоКвитанции
I КАК Сумма
I ИЗ РегистрСведений. Квитанции
I УПОРЯДОЧИТЬ ПО Сумма УБЫВ";
Ключевое слово ИЕРАРХИЯ
Мы рассмотрели упорядочивание, которое в данной языковой конструкции весьма эффективно для объектов без групп (без иерархии). Перед рассмотрением следующего примера внесем небольшие изменения в справочник Договоры.
Во-первых, необходимо указать, что он будет иметь иерархическую структуру. А, во-вторых, перед выполнением рассматриваемых запросов следует создать в справочнике две группы (рис. 3.7). Понятно, что для этого следует перейти в режим 1С:Предприятие. Ранее внесенный договор учащегося Петрова перенесем в группу Филиал 1, в эту же группу добавим еще Алексеева (договор 123/35), а в другую группу запишем Афанасьева (договор 127/77).
Рис. 3.7. Создание групп в справочнике Договоры
Сконструируем запрос, который позволяет выбрать из справочника договоры название договора и фамилию плательщика, но с группировкой по филиала? 1
Извлечение информации с помощью запросов
155
Результат выполнения подобного запроса должен выглядеть аналогично рис. 3.8. В этом случае договоры, заключенные на разных филиалах, будут сгруппированы в удобном виде. Подобное упорядочивание достигается за счет использования ключевого слова иерархия. В листинге 3.4 приведен измененный текст процедуры с запросом, которая обеспечивает результат упорядочивания договоров (рис. 3.8).
Рис. 3.8. Пример использования ключевого слова иерархия в тексте запроса
~	:-т----------- ''у....  ""	....~..	‘	......... г-
Листинг 3.4. Процедур? Запроса с учетом иерархии
Процедура ОтобратьИнформациюНажатие(Элемент) Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Наименование КАК Наим, ФИОпла телыцика
< ИЗ
Справочник.Договоры
I УПОРЯДОЧИТЬ ПО Наименование ИЕРАРХИЯ"; "езультат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
156	Гпава 3
Пока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Наим) + "	" + Строка(Результат.ФИОплательщика));
КонецЦикла; КонецПроцедурЫ
Исключение повторяющейся информации при отборе данных
Ранее в листинге 3.2 мы рассмотрели текст процедуры, которая позволяла извлечь информацию о выписанных квитанциях (из регистра квитанции). В этом случае по результату выполнения запроса мы видим, по какому договору выписывалась квитанция и указанную в ней сумму. Однако если задача заключается в получении списка договоров, по которым просто выписывались квитанции, то рассмотренная процедура не подходит. Пусть, скажем, необходимо отделить договоры, по которым выписывались квитанции от тех, по которым квитанции еще не выписывались. В языке запросов существует ключевое слово различные, позволяющее отобрать только неповторяющиеся строки (т. е. в выборке, возвращаемой запросом, повторений не будет).
Возвратимся к нашему примеру и будем выбирать из регистра квитанции договоры с использованием ключевого слова различные. Текст процедуры, в которой реализуется подобный отбор договоров, приводится в листинге 3.5, а на рис. 3.9 показан результат работы в режиме работы 1С:Предприятие.
Примечание
На компакт-диске, прилагаемом к книге, процедуры, относящиеся к этой главе, приводятся в различных обработках. Соответствие названий обработок листингам приведено в приложении в конце книги.
Листинг 3.5. Процедура отбора договоров, по которым выписывались квитанции
Процедура ОтобратьИнформациюНажатие(Элемент) Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Договор
I ИЗ РегистрСведений.Квитанции
I УПОРЯДОЧИТЬ ПО Договор ВОЗР";
Извлечение информации с помощью запросов
157
Результат = Запрос.Выполнить().Выбрать();
"’писокОтобранныхДанных.Очистить();
Вока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор));
КонецЦикла;
КонецПроцедуры
В результате (рис. 3.9) в списке договоров мы не увидим названий, по которым еще не выписывались квитанции. Для того чтобы в этом убедиться, просто внесите еще одного нового клиента и проверьте, что он не попадет в отобранные данные.
Рис. 3.9. Отбор договоров, по которым выписывались квитанции
Ключевое слово ГДЕ
До этого момента нам еще не встречалось ключевое слово языка запросов где. Оно позволяет задать условие отбора данных из исходных таблиц— источников запроса. В результате в результат запроса будут отобраны только те записи, для которых выполняется заданное условие. Применим эту возмож-
158
Гпава 3
ность к процедуре, приведенной в листинге 3.5, с тем, чтобы отобрать только те договоры, по которым были оплаты.
До ЭТОГО В регистре Квитанции МЫ разместили реквизит Оплачено, который может принимать значения Истина или ложь. И в запросе, приведенном в листинге 3.6, конструкция с ключевым словом где позволяет оставить в отобранных данных только те договоры, у которых рассматриваемый реквизит установлен в значение Истина.
Рис. 3.10. Форма списка регистра Квитанции и результат отбора договоров
Листинг 3.6 Процедура отбора договоров. по которым были оплаты
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос-Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Договор
I ИЗ
I РегистрСведений.Квитанции
I ГДЕ Оплачено=Истина
| УПОРЯДОЧИТЬ ПО Договор ВОЗР";
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Результат.След!тощий ') > 0 Цикл
l/иелечение информации с помощью запросов
159
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор));
КонецЦикла;
КонецПроцедуры
Результат выполнения измененной процедуры продемонстрирован на рис. 3.10. Здесь показано окно регистра квитанции и окно со списком договоров, где присутствует информация об оплате.
Использование логических операторов в запросе
В конструкции где можно использовать логические операторы (и, или, не), с помощью которых можно построить сложные логические выражения. Скажем, возвращаясь к предыдущему примеру, нас могут интересовать договоры, по которым имеются оплаченные квитанции на сумму более 7000 рублей. Текст процедуры с необходимым для этого запросом приведен в листинге 3.7, а результат работы в режиме 1С:Предприятие— на рис. 3.11. Как видно, в отличие от рис. 3.10. в список отобранных данных за счет указанного условия попал только один договор.
Ггг:——  ......................... ............. ........ !
. Листинг 3.7 Процедура этбора договоров, с использованием ключевого слова и
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос =Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ Договор I ИЗ
I РегистрСведений.Квитанции
I ГДЕ Оплачено=Истина И СуммаПоКвитанции > 7000
I УПОРЯДОЧИТЬ ПО Договор ВОЗР";
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор));
КонецЦикла;
КонецПроцедуры
160
Гпава 3
Рис. 3.11. Результат запроса с использованием логического оператора
Приведем теперь пример запроса, в котором комбинируются конструкции или и и. Скажем, нас интересуют все квитанции, которые выписывались в 2007 году со значением реквизита МесяцНачала равным 9 или 10 (начало интервала оплаты — сентябрь или октябрь). Соответственно интересующее нас значение реквизита ГодНачала равно 2007. В листинге 3.8 приведена процедура, реализующая необходимую выборку информации в этом случае, а на рис. 3.12 показан пример результата ее выполнения в режиме 1С:Предприятие.
I?--------“"Т-----------W....................................	..	.... „....pj..	s
Пистин! 3.8 Процедура отбора дог дворов с использованием логических кс пструкций
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
I Договор,МесяцНачала,ГодНачала
I ИЗ
I РегистрСведений.Квитанции
I ГДЕ (МесяцНачала=9 ИЛИ МесяцНачала=10)
I И ГодНачала=2007
I УПОРЯДОЧИТЬ ПО Договор ВОЗР";
Результат = Запрос.Выполнить().Выбрать() ;
СписокОтобранныхДанных.Очистить();
Извлечение информации с помощью запросов	161
Пока Результат.Следующий() > 0 Цикл СписокОтобранныхДанных.Добавить(Строка(Результат.Договор)+ "	" +
Строка(Результат.МесяцНачала) + "	" +
Строка(Результат.ГодНачала));
КонецЦикла;
КонецПроцедуры
Рис. 3.12. Пример запроса с использованием нескольких логических операторов
Примечание
Оператор и выполняется раньше, чем оператор или, т. е., как говорят, имеет более высокий приоритет. Точно так же, при выполнении арифметических действий сперва выполняется умножение, а лишь потом сложение или вычитание. Для изменения порядса вычисления логического выражения применяются скобки, как это сделано в листинге 3.8: (МесяцНачала=9 или месяцНачала=Ю) и годНачала=2007. Если бы скобки отсутствовали, выражение понималось бы как МесяцНачала=9 ИЛИ (МесяцНачала=10 И годНачала=2007), и в результате отбирало бы все квитанции, у которых начальный месяц— сентябрь, не зависимо от года, а также квитанции, у которых начальный месяц — октябрь, а год — 2007.
Агрегатные функции в запросах
На нескольких несложных примерах мы познакомились с технологией выборки информации из базы данных. Однако часто на практике требуется по
162
Гпава 3
лучить и разнообразную сводную информацию. В частности, по данным регистра квитанции управленческому персоналу могут быть полезны ответы на следующие вопросы:
□ Какова итоговая сумма оплаты, произведенная каждым учащимся?
П Какова средняя сумма оплаты учащимися?
П Какова наибольшая сумма оплаты по каждому учащемуся?
Для реализации подобных запросов следует воспользоваться агрегатными функциями и группировками.
Примечание
В язык запросов включены агрегатные функции, которые использую- ся при группировке результатов запросов а также при подсчете итогов.
Любая агрегатная функция принимает в качестве аргумента какой-либо столбец, а возвращает единственное значение. В табл. 3.2 перечислены агрегатные функции, понимаемые системой 1С:Предприятие 8.
Рис. 3.13. Окно редактирования объекта конфигурации
Результаты всех предыдущих запросов мы демонстрировали с помощью элемента управления поле списка, расположенного на форме обработки Извлечение информации. В данной ситуации более подходит табличный документ. Поэтому для обучения работе с агрегатными функциями, представ
Извлечение информации с помощью запросов
163
ленными в табл. 3.2, создадим новый объект — отчет, который назовем Сводная ведомость по квитанциям (рис. 3.13). Для табличного документа нам придется самостоятельно разработать макет.
Таблица 3.2. Агрегатные функции
Название	Комментарий
СУММА	Вычисляет сумму всех значений, содержащихся в указанном столбце. В качестве параметра функции можно указывать только поле, содержащее числовое значение
МАКСИМУМ	Находит наибольшее значение в указанном столбце
МИНИМУМ	Находит наименьшее значение в указанном столбце
СРЕДНЕЕ	Вычисляет среднее арифметическое значение по указанному столбцу
КОЛИЧЕСТВО	Подсчитывает количество значений, содержащихся в указанном столбце
В окне редактирования объекта конфигурации закладку Данные можно пропустить, поскольку реквизиты мы добавлять не будем. На закладке Формы создадим новую форму произвольного вида и укажем, что она будет являться основной формой отчета (рис. 3.14). Для события, приводящего к формированию отчета при работе в режиме 1С:Предприятие, создадим на форме элемент управления — кнопку (рис. 3.15).
Примечание
Отчетом мы воспользовались для того, чтобы использовать при разработке его подчиненный объект — форму.
Сам отчет будет формироваться с помощью табличного документа, и поэтому нам необходим макет табличного документа (рис. 3. i 6), с техническими действиями для создания которого мы уже знакомы. На макете разместим три секции — Заголовок (название говорит само за себя), шапка (для вывода поясняющей текстовой информации) и Строка (в которой будут выводиться значения переменных, определенных в тексте процедуры). Для всех ячеек с информацией установим обводку линиями (в этом случае следует обратиться к окну свойств ячеек), а для названий колонок установим еще и заливку цветом.
164
Главе
Рис. 3.14. Закладка Формы окна редактирования отчета
Рис. 3.15. Форма отчета в режиме работы 1С:Предприятие
Рис. 3.16. Макет отчета
1звлечение информации с помощью запросов
165
Геперь можно перейти к программной процедуре, где воспользуемся встре-швшейся ранее в первой главе конструкцией языка запросов— сгруп-торовать по. При ее использовании можно не просто выбрать записи из таб-тицы, а еще и сгруппировать их определенным образом.
Примечание
Под словом сгруппировывать подразумевается компоновка информации по группировочным полям и вычисление агрегатных функций по каждой группе.
Процедура получения итогового отчета по оплаченным квитанциям приведена в листинге 3.9. В данном случае при вычислении сводной информации производится группировка по договорам (по учащимся). Непосредственно отчет формируется при нажатии кнопки Сформировать отчет.
Листинг 3.9. Процедура формирования отчета по квитанциям
Процедура СформироватьОтчетНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор КАК Договор,
I СУММА(СуммаПоКвитанции) КАК Сумма,
I МАКСИМУМ(СуммаПоКвитанции) КАК Максимум,
| МИНИМУМ(СуммаПоКвитанции) КАК Минимум,
I СРЕДНЕЕ(СуммаПоКвитанции) КАК Среднее,
| КОЛИЧЕСТВО(*) КАК Количество
| ИЗ
I РегистрСведений.Квитанции
I ГДЕ Оплачено=Истина
| СГРУППИРОВАТЬ ПО Договор";
Выборка = Запрос.Выполнить().Выбрать();
ТабДок = Новый ТабличныйДокумент;
Макет = Отчеты.СводнаяИнформацияПоКвитанциям.ПолучитьМакет("Макет");
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область);
Область = Макет.ПолучитьОбласть("Шапка");
ТабДок.Вывести(Область);
Пока Выборка.Следующий() = Истина Цикл
Область = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Договор = Выборка.Договор;
166
Гпава 3
Область.Параметры.Сумма = Выборка.Сумма;
Область.Параметры.Минимум = Выборка.Минимум;
Область.Параметры.Максимум = Выборка.Максимум;
Область.Параметры.Среднее = Выборка.Среднее;
Область.Параметры.Количество = Выборка.Количество;
ТабДок.Вывести(Область);
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
КонецПроцедуры
Для внесенных в базу данных квитанций заполненный вариант отчета при работе в режиме 1С:Предприятие приведен (вместе со списком квитанций) на рис. 3.17.
Рис. 3.17. Отчет по квитанциям и состояние квитанций
Извлечение информации с помощью запросов
167
Использование параметров в запросах
Во всех ранее рассмотренных запросах пользователю не требовалось устанавливать каких-либо параметров, а условия для отбора формировались непосредственно в тексте запроса. Если же посмотреть на любой из отчетов, разработанных специалистами фирмы 1С, то мы увидим, что параметры многочисленных условий пользователь может указывать в диалоге.
Для реализации подобной возможности запрос строится с использованием параметров, а в качестве примера в листинге 3.10 приведена процедура, в которой от пользователя требуется ввод максимальной суммы для отбора интересующих нас квитанций. В этом случае в полученной выборке будут присутствовать все квитанции, указанная сумма в которых не превышает максимальную.
Саму процедуру расположим на форме обработки Извлечение информации. Для обеспечения возможности ввоца параметра нам потребуется разместить на форме поле ввода максимальнаяСумма (рис. 3.18), для которого установим числовой тип данных. Также необходимо скорректировать процедуру Ото-братьИнформациюНажатие, которая выполняется при нажатии кнопки Отобрать информацию. Обратите внимание, что в параметрическом запросе (листинг З.Ю) параметр (в данном случае МаксимальнаяСумма) предваряется знаком амперсанда &.
Рис. 3.18. Размещение поля ввода для указания значения параметра в запросе
68	Гпава 3
..—.................................................—••" м
Листинг зло Процедура с использованием .«.pai “пра в ззпро- , £йй:£КйiwW
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор, СуммаПоКвитанции
I ИЗ РегистрСведений.Квитанции
I ГДЕ СуммаПоКвитанции <= &МаксимальнаяСумма";
Запрос.УстановитьПараметр("МаксимальнаяСумма",
ЭлементыФормы.МаксимальнаяСумма.Значение);
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор) +
"	" + Строка(Результат.СуммаПоКвитанции) + " руб.");
КонецЦикла;
КонецПроцедуры
Рис. 3.19. Результат выполнения параметрического запроса в режиме работы 1 С:Предприятие
Метод УстановитьПараметр () позволяет определить значение параметра для запроса. При этом первый параметр метода представляет собой название параметра запроса, а второй — значение, присваиваемое этому параметру. В данном случае второй параметр метода извлекается из поля ввода МаксимальнаяСумма (в это поле пользователь может вводить число с клавиатуры).
Озеленение информации с помощью запросов
169
На рис. 3.19 приведена информация, отобранная в результате выполнения запроса при работе в режиме 1С:Предприятие.
Примечание
Для установки параметра запроса используется метод: УстановитьПараметр (ИмяПараметра, ЗначениеПараметра). Для параметра ИмяПараметра тип данных — строка, а параметр ЗначениеПараметра имеет произвольный тип данных. С помощью этого метода можно передавать переменные в запрос.
Ключевое слово МЕЖДУ
В языке запросов имеется вспомогательное ключевое слово между для задания интервалов. Например, в запросе, приведенном в листинге 3.11, необходимо перед его выполнением установить значения параметров дата1 и дата2. Эти значения вводятся пользователем в поля ввода на форме (рис. 3.20). От предыдущего примера на форме осталось поле ввода Максимальная сумма. Его можно не убирать, а лишь отключить видимость (это одно из свойств) данного элемента управления. Если видимость элемента управления отключена, в режиме 1С:Предприятие мы его не увидим.
Заметим, что в конструкции рассматриваемого запроса (листинг 3.11) используется параметр (более конкретно— измерение) период, который отражает дату и время внесения информации.
ggf........».............................................
Листинг 3.11 Процедура с использованием клю^всго слова Мк'ЖДУ
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор,
I СуммаПоКвитанции КАК Сумма
I ИЗ РегистрСведений.Квитанции
I ГДЕ РегистрСведений.Квитанции.Период МЕЖДУ &Дата1 И
I &Дата2";
Запрос.УстановитьПараметр("Дата1", ЭлементыФормы.Дата1.Значение);
Запрос.УстановитьПараметр("Дата2", ЭлементыФормы.Дата2.Значение);
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить() ;
Пока Результат.Следующий() >0 Цикл
170
Гпава 3
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор) + "	" + Строка(Результат.Сумма) + " руб.");
КоненЦикла;
КонецПроцедуры
Рис. 3.20. Форма обработки в окне редактирования объекта конфигурации
Перейдем в режим 1С:Предприятие, где от пользователя требуется перед выполнением запроса ввести необходимый интервал податам. Выборка результата запроса вместе с содержанием регистра квитанции показана на рис. 3.21.
Рис. 3.21. Выполнение запроса, использующего ключевое слово между
Извлечение информации с помощью запросов
171
Ключевое слово ИМЕЮЩИЕ
Также в языке запросов существует ключевое слово имеющие, которое позволяет накладывать условия на значения агрегатных функций. В других конструкциях языка запросов использовать агрегатные функции в условиях нельзя. Однако и в условии отбора со словом имеющие можно использовать агрегатные функции только для полей, по которым осуществляется группировка.
В листинге 3.12 приведен пример процедуры с запросом, в котором используется конструкция имеющие. Цель рассматриваемого запроса— отобрать договоры, для которых итоговая сумма по оплаченным квитанциям не превышает значения МаксимальнаяСумма (его мы вводим в качестве параметра с клавиатуры). На рис. 3.22 показан фрагмент регистра квитанции и окно формы с выборкой результата запроса.
Рис. 3.22. Результат выполнения запроса с использованием ключевого слова имеющие
.......-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Листинг 3.12. Процедура с использованием ключевого слова ИМЕЮЩИЕ ...................................... ....................................... ..........'.'.л-;	..................................................................................................................................................................................................................................
Процедура КнопкаТНажатие(Элемент) Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор, | СУММА(СуммаПоКвитанции) КАК Сумма | ИЗ РегистрСведений.Квитанции I ГДЕ Оплачено=Истина | СГРУППИРОВАТЬ ПО Договор
172
Гпава 3
| ИМЕЮЩИЕ
I СУММА(СуммаПоКвитанции) <= &МаксимальнаяСумма";
Запрос.УстановитьПараметр("МаксимальнаяСумма",
ЭлементыФормы.МаксимальнаяСумма.Значение);
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Договор) + "	" + Строка(Результат.Сумма) + " руб.");
КонецЦикла;
Коне цПроцедуры
Функция расчета итогов в запросах
Формирование итоговой информации является одной из наиболее востребованных функций любой информационной системы. Язык запросов системы ^Предприятие 8 включает в себя очень мощные средства расчета итогов. Пользователь может включить в результат запроса дополнительные строки, содержащие общие и промежуточные итоги по заданным полям и группировкам. Это делается с помощью ключевого слова итоги.
В листинге 3.13 приведена процедура, использующая запрос, который позволяет получить общие итоги по выписанным квитанциям Как видно из результата выполнения процедуры (рис 3.23), в этом случае в сформированном списке появляется дополнительная строка с итоговой суммой.
Листинг 3.13. Процедура, включающая в себя общие итоги пр квитанциям.
Процедура ОтобратьИнформациюНажатие(Элемент) Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор, I СуммаПоКвитанции КАК Сумма, Период I ИЗ РегистрСведений.Квитанции | ИТОГИ СУММА(Сумма) ПО Общие";
Результат = Запрос.Выполнить().Выбрать(); СписокОтобранныхДанных.Очистить();
Извлечение информации с помощью запросов 173
Пока Результат.Следующий() > 0 Цикл СписокОтобранныхДанных.Добавить(Строка(Результат.Период) + "	" + Строка(Результат.Договор) +
"	" + Строка(Результат.Сумма) + " руб.”);
КонецЦикла;
КонецПроцедуры
При обходе результата запроса итоговые строки можно отличить от обычных с помощью метода типЗаписи (). В листинге 3.14 приведена процедура, в которой итоговая строка по результату данного запроса выводится в отдельный элемент (надпись) на форме (рис. 3.24).
——„—--------------------------------..---------------------
... J
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор,
I СуммаПоКвитанции КАК Сумма, Период
I ИЗ РегистрСведений.Квитанции
I ГДЕ Оплачено=Истина
I ИТОГИ СУММА(Сумма) ПО Общие";
Рез = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Рез.Следующий() >0 Цикл
Если Рез.ТипЗаписи() = ТипЗаписиЗапроса.ОбщийИтог Тогда ЭлементыФормы.ИтогПоКвитанциям.Значение = Строка(Рез.Сумма);
Иначе
СписокОтобранныхДанных.Добавить(Строка(Рез.Цериод) +
"	" + Строка(Рез.Договор) +
"	" + Строка(Рез.Сумма) + " руб.");
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Несложно получить итоги и по группировкам. В этом случае вычисляются значения агрегатных функций по строкам выборки с одинаковыми значениями тех полей, по которым производится группировка. Эти поля указываются в конструкции итоги ... по после ключевого слова по, в отличие от полных итогов, когда после слова по указывалось общие. В листинге 3.15 приведена
174 Гпаса 3
процедура, в которой приводятся итоги оплаченных квитанций по договорам, а выполнение запроса в режиме работы 1С:Предприятие продемонстрировано на рис. 3.25.
Рис. 3.23. Использование функции расчета итогов в запросе
Рис. 3.24. Использование метода ТипЗаписи () при расчете итогов в запросе
т г


8"' ™
Процедура ОтобратьИнформациюНажатие(Элемент) Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ договор, I СуммаПоКвитанции КАК Сумма, Период
Извлечение информации с помощью запросов
175
| ИЗ РегистрСведений.Квитанции
I ГДЕ Оплачено=Истина
| ИТОГИ СУММА(Сумма) ПО Договор";
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Результат.Следующий() >0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Период) + "	" + Строка(Результат.Договор) +
"	" + Строка(Результат.Сумма) + " руб.");
КонецЦикла;
КонецПроцедуры
Рис. 3.25. Отчет с включением итогов по группировкам
Запрос с итогами по группировкам отличается от обычной группировки (свертки) с использованием предложения сгруппировать по с агрегатными функциями. В последнем случае в результат запроса не включаются исходные записи, а остаются только итоговые строки.
Объединение результатов нескольких запросов
В языке запросов имеется возможность объединять результаты нескольких запросов, при этом записи, полученные с помощью каждого из объединяе
176
Гпава 3
мых запросов, будут собраны в один результат. При объединении каждый запрос собирает данные независимо, а такие операции, как упорядочивание результатов и расчет итогов, выполняются уже над результатом объединения запросов.
Поля результата запроса будут называться так, как описано в списке полей выборки первого из объединяемых запросов. Поля выборки остальных запросов сопоставляются с полями результата в соответствии с порядком их следования в списке полей выборки. Объединяемые запросы должны иметь одинаковое количество полей в списке полей выборки.
Рассмотрим ситуацию, когда кроме оплаты наличным путем через квитанции возможно еще и безналичное перечисление. В этом случае нам понадобится создать еще один регистр сведений — Безналичная оплата. Это будет независимый периодический (с периодом — одна секунда) регистр сведений. Заполнение основной закладки Данные в окне редактирования объекта конфигурации приведено на рис. 3.26.
Рис. 3.26. Окно редактирования регистра Безналичная оплата
Теперь мы должны построить запрос для извлечения оплаченных квитанций и банковских перечислений в интервале дат, задаваемых пользователем (листинг 3.16). При объединении запросов ключевым является слово объединить. Перед ним должен быть расположен один запрос, а после него другой.
Извлечение информации с помощью запросов
177
•Ш »»*«МЛМf>л-«UAVUMU
Писп инг 3. lb. Пример процедуры с объединением эагро- ое
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Договор,
| СуммаПоКвитанции КАК Сумма,Период
I ИЗ РегистрСведений.Квитанции
I ГДЕ (Период МЕЖДУ &Дата1 И &Дата2 ) И Оплачено=Истина
| ОБЪЕДИНИТЬ
| ВЫБРАТЬ Договор, ПеречиспеннаяСумма КАК Сумма, Период
I ИЗ РегистрСведений.БезналйчнаяОпла та
I ГДЕ Период МЕЖДУ &Дата1 И &Дата2”;
Запрос.УстановитьПараметр("Дата1", ЭлементыФормы.Дата1.Значение);
Запрос.УстановитьПараметр("Дата2", ЭлеменгтыФормы.Дата2.Значение);
Результат = Запрос.Выполнить().Выбрать();
СписокОтобранныхДанных.Очистить();
Пока Результат.Следующий() > 0 Цикл
СписокОтобранныхДанных.Добавить(Строка(Результат.Период) +
"	" + Строка(Результат.Договор) +
"	" + Строка(Результат.Сумма) + " руб.");
КонецЦикла;
КонецПроцедуры
Рис. 3.27. Результат выполнения объединения запросов
178
Гпава 3
На рис. 3.27 показана информация, содержащаяся в регистрах квитанции и Безналичная оплата, а также результат выполнения запроса.
Запросы к информационной базе, разработанной в первой главе
В этом разделе мы познакомимся с рядом новых конструкций для построения запросов, при этом объединяющим моментом всех приведенных далее примеров является то, что они связаны с разработкой из главы 1 книги. В целом для формирования запросов нам будет достаточно ранее созданных объектов конфигурации, однако для визуализации результатов потребуются также несколько интерфейсных форм с необходимыми элементами управления.
Итак, если вы выполняете описанные в книге действия на компьютере, то лучше всего в режиме конфигуратора открыть созданную информационную базу, разработанную в главе I книги.
Примечание
На компакт-диске, прилагаемом к книге все информационные базы, упоминаемые в тексте, размещены в отдельных папках. В конце книги приводится подробное содержание компакт-диска.
Отбор специалистов по указанной должности
Итак, приступим к первому запросу, связанному с разработанной конфигурацией из главы 1 книги. Ранее мы создали объект конфигурации — справочник Специалисты, в котором содержится список преподавателей нашего учебного центра. В этом справочнике имеется табличная часть местаРаботы, в которой перечислены организации, где дополнительно работает каждый сотрудник нашего центра. Вместе с указанием организации в каждой строке табличной части справочника определяется еще и должность специалиста в этой организации.
Будем считать, что цель запроса заключается в том, чтобы отобрать специалистов (с указанием места работы), имеющих выбранную в элементе интерфейса (поле ввода) должность. Такая (или аналогичная) задача вполне реальна и для другой области деятельности.
Извлечение информации с помощью запросов
179
Как и ранее, для визуализации результатов запроса мы создадим обработку с экранной формой произвольного вида. На форме расположим три элемента управления— поле ввода, кнопку и поле списка (рис. 3.28). Далее мы напишем программный код процедуры. Поэтому для исключения противоречий с листингом 3.17 для поля ввода установим имя должность, а тип значения выберем— СправочникСсылка.Должность (ЭТО ПОЗВОЛИТ нам С ПОМОЩЬЮ данного элемента управления открыть для выбора справочник с уже внесенными должностями). Поле списка назовем РезультатыОтбора, а кнопку, в соответствии С рис. 3.28, •— ОтобратьИнформацию.
Действия пользователя заключаются в предварительном выборе в поле ввода интересующей должности. После этого нажатие кнопки Отобрать информацию приведет к заполнению списка интересующей нас информацией о сотрудниках.
И Конфигуратор Конфигурации:- [О,.’
2^йл-Правка Форма. Конфигурация Отладка
Ддм1*{истрированир Сервис-Дкна. Огласка  б5 X
а Диалог Модуле
~ Реквизиты
Дл САГ' ШЫ ru- -I- 0,0	^.308x215
Рис. 3.28. Форма обработки для визуализации результатов запросов
В листинге 3.17 показан текст процедуры, которая выполняется при нажатии на рассматриваемую кнопку. Здесь при осуществлении запроса к табличной части справочника обращение к обычным (вне таблицы) реквизитам справочника производится через поле ссылка. Хотя запрос строится к табличной части местаРаботы справочника Специалисты, основная информация о специалисте заключена в реквизите Наименование, который располагается вне
180
Глава 3
табличной части. Для получения фамилии специалиста в тексте запроса используется конструкция Ссылка.Наименование.
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Ссылка.Наименование
I КАК Наименование,
I Организация,Должность
| ИЗ Справочник.Специалисты.МестаРаботы
I ГДЕ Должность = &Должность";
Запрос.УстановитьПараметр("Должность",
ЭлементыФормы.Должность.Значение);
Результат = Запрос.Выполнить().Выбрать();
РезультатыОтбора.Очистить();
Пока Результат.Следующий() >0 Цикл
РезультатыОтбора.Добавить(Строка(Результат.Наименование) + "	" + Строка(Результат.Организация) +
"	" + Строка(Результат.Должность));
КонецЦикла;
КонецПроцедуры
Рис. 3.29. Результат отбора специалистов с указанной должностью
Извлечение информации с помощью запросов
181
В запросе, приведенном в листинге 3.17, в выборку отобранных данных один и тот же специалист может попасть два и более раз, если он работает в нескольких организациях на одинаковых должностях. Именно такая ситуация отражена на рис. 3.29. Так, видно, что Петров Иван Александрович работает преподавателем в двух организациях (МТКИ и НМСИ).
В листинге 3.18 приведена процедура, позволяющая в запросе отобрать только различных специалистов, имеющих указанную пользователем должность. Результат выполнения запроса для имеющихся в информационной базе данных приведен на рис. 3.30.
Рис. 3.30. Результат отбора специалистов с указанной должностью без повторений
*-----....... „............ —----------------------------.... 
^Ийс.иаг 3/8. Заире с с отбором ра"« ичных пециаль uiat с указанной д о п*.н ог.тню
:	_	 эта	&

Процедура ОтобратьИнформациюНажатие(Элемент) Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ РАЗЛИЧНЫЕ
I Ссылка.Наименование
I КАК Наименование,
I Должность
I ИЗ Справочник.Специалисты.МестаРаботы
182 Глава 3
I ГДЕ Должность = {Должность"; Запрос.УстановитьПараметр("Должность", ЭлементыФормы.Должность.Значение); Результат = Запрос.Выполнить().Выбрать(); РезультатыОтбора.Очистить(); Пока Результат.Следующий() > 0 Цикл РезультатыОтбора.Добавить(Строка(Результат.Наименование)); КонецЦикла; Ко нецПроцедуры
Отбор курсов преподавателя
При работе с рассматриваемой информационной базой нам может потребоваться получить в выборке курсы с указанием их стоимости, которые ведет конкретный преподаватель (фамилия преподавателя аналогично должности должна выбираться из списка значений). Используемая ранее форма в данной ситуации для отображения результатов не совсем подходит. В этом случае можно пойти двумя путями — создать новую форму или немного подкорректировать имеющуюся (заменить некоторые элементы управления). Мы выберем второй путь и в рамках уже созданных элементов сделаем следующее:
П поменяем ИМЯ ПОЛЯ ввода на значение Преподаватель;
□ изменим ТИП значения ПОЛЯ ввода на СправочникСсьшка. Специалисты.
После этого для обслуживания нажатия на кнопку Отобрать информацию необходимо на закладке Модуль разместить процедуру (заменить предыдущую), приведенную в листинге 3.19. Результат выполнения запроса в режиме 1С:Предприятие продемонстрирован на рис. 3.31.
Листинг 3.19. Запрос для о•бор3 курсов онкретчогп грело1 ,?ватег 
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Наименование,
I Стоимость,Преподаватель
I ИЗ Справочник.Курсы
I ГДЕ Преподаватель = {.Преподаватель";
Запрос.УстановитьПараметр("Преподаватель",
Извлечение информации с помощью запросов
183
ЭлементыФормы.Преподаватель.Значение);
Результат = Запрос.Выполнить().Выбрать();
РезультатыОтбора.Очистить();
Пока Результат.Следующий() > 0 Цикл
РезультатыОтбора.Добавить(Строка(Результат.Наименование) + "	" + Строка(Результат.Преподаватель) +
"	" + Строка(Результат.Стоимость));
КонецЦикла;
КонецПроцедуры
Рис. 3.31. Отбор дисциплин указанного преподавателя
Соединение таблиц при организации запроса
До настоящего времени во всех использованных запросах выборка извлекалась из од^юй таблицы. Важной особенностью языка запросов системы 1С является возможность обращения сразу к нескольким таблицам. При этом их можно соединять определенным образом. Например, при работе может потребоваться выбрать названия всех курсов с указанием стоимости, преподавателя и рейтинга, который имеет данный преподаватель.
184
Гпава 3
В реализующем это действие запросе (листинг 3.20) используется ключевое СЛОВО СОЕДИНЕНИЕ, КОТОрОС ПОЗВОЛЯСТ отобрать ИЗ справочников Преподаватели и курсы только те записи, в которых преподаватели в обоих справочниках совпадают (рис. 3.32).

; ^айл. Правде Операции £ери4$ :£кна Ощабка
' i ч
В Форм	_ О X
РезультатыОтбора
'(Информатика (Excel) Петров Иван Александрович 1 800руб Рейтинг 7
(Базы данных Петров Иван Александрович 2 200руб. Рейтинг 7
1 PowerPoint Петров Иван Александрович 1 200руб. Рейтинг 7
(Элект почта Николаева Ирина Владимировна 1 100руб. Рейтинг 5
Д 1яполуч.иияп<а1скАоким^.....|ит^Е1	ДЦМ
Рис. 3.32. Результат соединения двух таблиц в запросе
...... ...........	...	.....-...........	....... .     ...	............	у,—
Лисами.» 3.20. Запг >с с ислользовапием соединения flBj х -аблиа
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Спр1.Наименование КАК Курс, | Спр1.Преподаватель КАК Преп, I Спр1.Стоимость КАК Ст, I Спо2.Рейтинг КАК Рейт
I ИЗ Справочник.Курсы КАК Спр1
| СОЕДИНЕНИЕ
I Справочник.Специалисты КАК Спр2
I ПО Спр1.Преподаватель=Спр2.Ссылка";
Результат = Запрос.Выполнить().Выбрать();
РезультатыОтбора.Очистить();
Пока Результат.Следующий() > 0 Цикл
Извлечение информации с помощью запросов 185
РезультатыОтбора.Добавить(Строка(Результат.Курс) +
"	" + Строка(Результат.Преп) + "	"
+ Строка(Результат.Ст) + "руб. Рейтинг: "
+ Строка(Результат.Рейт));
КонецЦикла;
КонецПроцедуры
Левое внешнее соединение
В результате выполнения предыдущего запроса в отбор попала часть интересующей нас сводной информации. Недостатком этого способа отбора информации является то, что курсы, для которых не указан преподаватель, в результате не отражены. Так, на рис. 3.33 приведена ситуация, когда в одном из курсов (Web-дизайн) не указан преподаватель и, соответственно, в отобранной информации мы данный курс не видим. Соединения таблиц, ведущие себя таким образом, относятся к классу внутренних.
В языке запросов системы 1С:Предприятие 8.0 существует возможность осуществлять еще и внешние соединения таблиц, которые могут быть левыми, правыми и полными.
Конструкция левое [внешнее] соединение означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Но, в отличие от внутреннего соединения, в результат запроса надо включить еще и записи из первого источника (указанного слева от слова соединение), для которых не найдено соответствующих условию записей из второго источника.
Таким образом, в результат запроса будут включены все записи из первого источника, и они будут соединены с записями из второго источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из второго источника, буду г содержать значение null в полях, формируемых на основании записей из этого источника.
Примечание
NULL-значения являются специальными маркерами, обозначающими неуказанные (отсутствующие) значения или значения, не имеющие смысла.
186
Гпава 3
Рис. 3.33. Результат внутреннего соединения при построении запроса
Например, необходимо выбрать названия всех курсов с указанием стоимости, преподавателя и рейтинга, который имеет данный преподаватель, однако при этом в результирующую таблицу необходимо включить курсы, для которых не указан преподаватель. Это реализуется с помощью конструкции левое [внешнее] соединение (листинг 3.21). Иллюстрация результата (рис. 3.34) показывает, что в этом случае (в отличие от внутреннего соединения) в результирующем списке данных присутствуют и курсы с неуказанными преподавателями.
:.............-...........•^—•-""•7............................................     Ж
Листинг 3.21. Пример запроса с использованием левого соединения
'.-.г........... ..«..к,»............ «;2 
Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Спр!.Наименование КАК Курс,
I Спр1.Преподаватель КАК Преп,
I Спр1.Стоимость КАК Ст,
I Спр2.Рейтинг КАК Рейт
Извлечение информации с помощью запросов
187
I ИЗ Справочник.Курсы КАК Спр1
| ЛЕВОЕ СОЕДИНЕНИЕ
I Справочник.Специалисты КАК Спр2
I ПО Спр1.Преподаватель=Спр2.Ссылка";
Результат = Запрос.Выполнить().Выбрать();
РезультатыОтбора.Очистить() ;
Пока Результат.Следующий() >0 Цикл
РезультатыОтбора.Добавить(Строка(Результат.Курс) +
"	" + Строка(Результат.Преп) +
"	’’ + Строка (Результат. Ст) +
"руб. Рейтинг: " + Строка(Результат.Рейт));
КонецЦикла;
КонецПроцедуры
Правое внешнее соединение
Конструкция правое [внешнее] соединение означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить еще и записи из второго источника (указанного справа от слова соединение), для которых не найдено соответствующих условию записей из первого источника.
Таким образом, в результат запроса будут включены все записи из второго источника; они будут соединены с записями из первого источника при выполнении указанного условия. Строки результата запроса, для которых не найдено соответствующих условию записей из первого источника, будут содержать значение NULL в полях, формируемых на основании записей из этого источника.
Правое внешнее соединение полностью аналогично левому, за исключением того, что таблицы меняются местами. Например, необходимо выбрать названия всех курсов с указанием стоимости, преподавателя и рейтинга, который имеет данный преподаватель, однако при этом в результирующую таблицу необходимо включить и преподавателей, для которых не указан курс (еще не определена дисциплина, которую он будет вести).
Это реализуется с помощью конструкции правое [внешнее] соединение (листинг 3.22). Иллюстрация отбора (рис. 3.35) показывает, что в этом случае. в отличие от внутреннего соединения, в результирующем списке данных присутствуют и курсы с неуказанными преподавателями.
188
Гпава 3
Рис. 3.34. Результат выполнения запроса с использованием левого внешнего соединения
f "ж~~пг г-;? г~- •  nr s	“—— — —	-	.	—
Листинг 3.22. Запрос с использованием правого внешнего соединения

Процедура ОтобратьИнформациюНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Спр!.Наименование КАК Курс,
I Спр2.Наименование КАК Преп,
I Спр1.Ссылка КАК СпрСсылка1, Спр2.Ссылка КАК СпрСсылка2,
I Спр!.Стоимость КАК Ст, Спр2.Рейтинг КАК Рейт
I ИЗ Справочник.Курсы КАК Спр!
I ПРАВОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
I Справочник.Специалисты КАК Спр2
I ПО Спр1.Преподаватель=Спр2.Ссылка";
Результат = Запрос.Выполнить().Выбрать();
РезультатыОтбора.Очистить();
Пока Результат.Следующий() > 0 Цикл
печение информации с помощью запросов
189
Если Результат.СпрСсылка2.ЭтоГруппа = Ложь Тогда
РезультатыОтбора.Добавить(Строка(Результат.Курс)+ "	" + Строка(Результат.Преп) +
"	” + Строка(Результат.Ст) +
"	Рейтинг: ” + Строка(Результат.Рейт));
КонецЕсли;
гецЦикла;
НецПроцедуры
Для исключения попадания в результаты отбора названий категорий специа-'.истов (техническое и гуманитарное направление) в процедуре мы воспользовались СВОЙСТВОМ ЭтоГруппа.
Результаты отбора
Информатика 'Excel) Петров Иван Александрович 1 800 Рейтинг 7
[Базы данных Петров Иван Александрович 2 200 Рейтинг 7
^PowerPoint Петров Иван Александрович 1 200 Рейтинг 7
; Иванова Ольга Петровна Рейтинг 5
1Элект почта Николаева Ирина Владимировна 1 100 Рейтинг 5
Рис. 3.35. Пример выполнения запроса с правым внешним соединением
Для гфпучения подсказки	F1

Полное внешнее соединение
Конструкция полное [внешнее] соединение означает, что в результат запроса надо включить комбинации записей из обеих исходных таблиц, которые соответствуют указанному условию. Кроме того, в результат запроса надо включить также еще и те записи из обоих источников, для которых не найдено соответствий.
190 Гпава 3
Таким образом, в результат запроса будут включены все записи из обоих источников и они будут соединены друг с другом при выполнении указанного условия. Листинг 3.23 и результат выполнения запроса (рис. 3.36) в режиме 1С:Предприятие иллюстрируют отбор курсов и преподавателей.
.......... '	S*	... ............»
Листинг 3.23. Пример запроса с использованием полного внешнего соединения 1 .. .а
Процедура ОтобратьИнформациюНажатие(Элемент) Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Спр1.Наименование КАК Курс,
I Спр2. Наименование КАК Преп,
I Спр1.Ссылка КАК СпрСсылка1,
I Спр2.Ссылка КАК СпрСсылка2,
I Спр!.Стоимость КАК Ст,Спр2.Рейтинг КАК Рейт
I ИЗ Справочник.Курсы КАК Спр1
I ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ
I Справочник.Специалисты КАК Спр2
I ПО Спр1.Преподаватель=Спр2.Ссылка”;
Результат = Запрос.Выполнить().Выбрать();
РезультатыОтбора.Очистить();
Пока Результат.Следующий() > 0 Цикл
Если Результат.СпрСсылка1= NULL Тогда
Если Результат.СпрСсылка2.ЭтоГруппа = Ложь Тогда РезультатыОтбора.Добавить(Строка(Результат.Преп) + " Рейтинг; " + Строка(Результат.Рейт));
КонецЕсли; Иначе
Если Результат.СпрСсылка2= NULL Тогда РезультатыОтбора.Добавить(Строка(Результат.Курс) + "	" + Строка(Результат.Ст) + "руб.");
Иначе
РезультатыОтбора.Добавить(Строка(Результат.Курс) + "	" + Строка(Результат.Преп) +
"	" + Строка(Результат.Ст) +
"руб. Рейтинг: " + Строка(Результат.Рейт)); КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Извлечение информации с помощью запросов
191
Здесь в зависимости от полноты строки выбранной информации с помощью запроса изменяется формат отображения в элементе Результаты отбора. Например, при извлечении строки с информацией только о дисциплине (еще не указан преподаватель) не выводится лишнее обозначение относительно рейтинга специалиста. Аналогична ситуация и для преподавателей, у которых не указаны курсы.
Рис. 3.36. Результат выполнения запроса с полным внешним соединением
Ключевое слово ВЫБОР
Рассмотрим еще одну возможность, предоставляемую языком запросов — операцию выбора. Для этого предназначено соответствующее ключевое слово выбор. В выражениях языка запросов могут применяться операции выбора, которые позволяют получить одно из возможных значений в соответствии с указанными условиями.
Немного изменим конфигурацию, чтобы продемонстрировать практический эффект использования данной конструкции языка. Создадим в конфигураторе регистр сведений (непериодический и независимый), в котором сделаем одно измерение Учащийся и один ресурс — Баллы. Фактически это означает, что в этом регистре напротив фамилии каждого учащегося будет фиксироваться количество баллов, которые он набрал по итогам, допустим, опреде-
192
Гпава 3
ленного периода. Для самого же регистра (рис 3.37) выберем имя БаллыУча-щихся.
< Файл :П₽«.к<й. Конфигурация Отладка Администрирование ;.£ервмс £кна Справна
Основные.
Баллы
Длина
Точность
Действия
Формы
Макеты
Подсистему Права Интерфейсы Обмен данными; Прочее
* Измерения
i * - i... Учащийся
В - £, Ресурсы
I -« WI Реквизиты
чНазад . ; Далее?
Индексироват не индексировать
Т мп данных:
т МП: Число
Б аллы Комментарий
'1в Основные.
Имя
Синоним
Рис. 3.37. Окно редактирования регистра сведений
Баллы учащихся
Цель этой доработки информационной системы заключается в том, чтобы сопоставить определенный интервал баллов конкретной оценке. Например, соответствие может выглядеть так, как показано в табл. 3.3.
Таблица 3.3. Соответствие баллов и оценок
Номер п/п	Интервал по количеству баллов	Оцэнка
1	40—50	5
2	31—39	4
3	23—30	3
4	12—22	2
5	0—11	0
Итак, после создания рассмотренного регистра сведений заполним его данными в режиме 1С:Предприятие. На рис. 3.38 показаны внесенные баллы учащихся. Это, можно сказать, первичные данные, которые нам потребуются для формирования отчета, в котором напротив фамилии каждого учащегося
Извлечение информации с помощью запросов
193
должна присутствовать оценка, поставленная в зависимости от набранных им баллов.
Теперь перейдем к основной части — к созданию отчета, который назовем Отчет по учащимся. В окне редактирования объекта конфигурации на закладке Формы создадим форму произвольного вида, на которой расположим два элемента управления — кнопку и поле списка. Для кнопки выберем имя СформироватьОценки, а для поля списка— Оценкиучащихся. Пользователь в режиме I С:Предприятие, нажав кнопку, получает заполненный отчет. Текст процедуры приведен в листинге 3.24.
Рис. 3.38. Информация по баллам учащихся
Примечание
В операции выбора (начинается с ключевого слова выбор) можно указывать сколько угодно альтернативных выборов, используя ключевые слова когда и тогда. В процессе выполнения запроса система проверяет последовательно каждое условие. Если указанное условие выполняется, то результатом выбора становится выражение, следующее за ключевым словом Тогда. Значение выражения, указанного после слова Иначе, используется в качестве результата операции выбора в том случае, если во всех ранее указанных условиях результат имел значение ложь.
194
Глае
Рис. 3.39. Использование ключевого слова выбор в запросе
! Листинг J 24 Пример -.япросд с ислол^ юианием операции выбора .........................:.....5..'Ц... .........Ж>.:..<................	:.-....L.........	...... ..........
Процедура СформироватьОценкиНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Учащийся,
I ВЫБОР
I Когда Баллы >=40
I	Тогда 5
I Когда Баллы > 30
I	Тогда 4
I Когда Баллы > 22
I	Тогда 3
I Когда Баллы > 11
I	Тогда 2
I Иначе
I	0
I КОНЕЦ КАК Оценка
| ИЗ РегистрСведений.БаллыУчащихся
I УПОРЯДОЧИТЬ ПО Оценка ВОЗР";
Результат = Запрос.Выполнить().Выбрать();
ОценкиУчащихся.Очистить();
Пока Результат.Следующий() > 0 Цикл
Извлечение информации с помощью запросов
195
ОценкиУчащихся.Добавить(Строка(Результат.Учащийся) +
"	" +Строка(Результат.Оценка));
КонецЦикла;
КонецПроцедуры
На рис. 3.39 приведен результат выполнения запроса при нажатии кнопки Сформировать оценки. Видно, что в списке учащихся напротив каждой фамилии появляется оценка, соответствующая набранным баллам.
Рассмотренная возможность может быть эффективно использована при составлении разнообразных отчетов, где требуется сопоставить большой разброс значений определенной характеристики более узкому набору оценок.
Встроенные функции языка запросов
В языке запросов системы 1С:Предприятие определены встроенные функции, которые могут использоваться в выражениях в списке полей выборки и в условии отбора в предложении где. Этих функций достаточно много, и они разрабатывались с учетом всевозможных практических ситуаций, которые могут встретиться при разработке. В сопроводительной документации при покупке программного продукта 1 С:Предприятие 8 содержится исчерпывающее описание всех функций. Некоторые из них ориентированы на общие задачи, а некоторые являются более узкоспециализированными. В этом разделе мы приведем пояснения по некоторым, на наш взгляд, наиболее используемым.
Функция ПОДСТРОКА
Назначение функции заключается в выделении фрагмента информации из строки. Сначала дадим небольшое формальное пояснение, а затем приведем пример запроса с использованием данной функции.
У функции подстрока три параметра. В качестве первого указывается исходная строка, из которой требуется выделить часть символов — подстроку. Понятно, что тип значения этого параметра — это Строка. Второй параметр определяет позицию символа в исходной строке, с которого начинается выделение части строки, а третий — это длина выделяемой подстроки. Тип значения для второго и третьего параметров — число.
196
Гпава 3
Продемонстрируем использование этой функции на несложном примере. Допустим, нам необходимо из справочника Клиенты выбрать несколько начальных символов фамилий каждого клиента (до конкретности первые 5 символов). В ряде практических ситуаций это несет краткую (но в каких-то вполне достаточную) информацию о людях. Подобный запрос организуется с помощью следующей конструкции:
ВЫБРАТЬ
Подстрока (Справочник.Клиенты.Наименование, 1, 5)
Один из возможных вариантов результата выборки показан в табл. 3.4.
Таблица 3.4. Выборка фрагментов наименований клиентов
Информация о клиентах
Афони
Никол
Прони
Сидор
Федос
Функция ДобавитьКДате
Эта функция позволяет добавлять к дате некоторую величину. В пей предусмотрено три параметра. Первый параметр представляет дату, к значению которой требуется добавить величину, определяемую вторым и третьим параметрами. Соответственно, тип значения первого параметра — дата.
Для увеличения указанной даты предусмотрено несколько единиц измерения. А именно второй параметр определяет тип увеличения, в качестве которого могут присутствовать: Секунда, Минута, Час, День, Неделя, Месяц, Квартал, Год, Декада, Полугодие. Третий параметр — это величина, на которую требуется увеличить дату, задаваемую первым параметром (тип значения третьего параметра — число).
Например, можно использовать рассматриваемую функцию в запросе, приведенном в листинге 3.25.
звлечение информации с помощью запросов 197
........“ "—‘—"" --   —............................
Листинг 1,25, запрос с исп^г.ьзовг ния. 1 функции Добав«тьКДате()
=УБРАТЬ “эдстрока (Справочник.Клиенты,Наименование, 1, 5), ДэбавитьКДате(ДатаВремя(2007, 8, 14, 10, 50, 20), Месяц, 3)
В этом запросе мы дополнительно воспользовались функцией ДатаВремя. которая использует шесть параметров (последовательно это — год, месяц, число, часы, минуты, секунды). Использование данной функции в качестве значения первого параметра другой функции добавитькдате обеспечивает получение необходимой даты (с указанием еще и времени).
В табл. 3.5 представлена информация о фрагментах фамилий учащихся с указанием даты (результат выполнения указанного запроса).
Таблица 3.5. Выборка, полученная в результате выполнения запроса в листинге 3.25
Информация о клиентах	Дата представления сведений
Афони	14.11.2007 10 50:20
Никол	14.11.2007 10:50:20
Прони	14 11.2007 10:50:20
Сидор	14.11.2007 10:50:20
Федос	14.11.2007 10:50:20
Функция РазностьДат
Часто требуется вычисление разности между двумя датами, иапример, между датой окончания и датой зачисления. И функция РазностьДат предназначена для получения разности между датами. В пей три параметра. Первые два имеют тип дата, а третий определяет, в каких единицах измерения необходимо получить результат. Здесь возможны следующие варианты: Секунда, Минута, Час, День, Месяц, Квартал, Год.
В запросе, приведенном в листинге 3.26, извлекается число дней, которое представляет собой разность двух дат.
198
Гпава 3
%—' ’4а‘ '^о	" "<’4 v,.4«.r«w .< v
Листинг 3.26. Запрос с использованием функции РазностьДат()
Справочник.Клиенты.Наименование,
РазностьДат(Справочник.Клиенты.ДатаЗачисления,
Справочник.Клиенты.ДатаОкончания,День)
С учетом имеющихся в информационной базе данных результат выполнения данного запроса может выглядеть так, как показано в табл. 3.6.
Таблица 3.6. Выборка количества дней индивидуального обучения учащихся
Клиенты	Количество дней
Афони	50
Никол	27
Прони	2°
Сидор	30
Федос	31
Функция ПРЕДСТАВЛЕНИЕ
Эта функция предназначена для получения строкового представления значения произвольного типа. В качестве параметра функции может выступать выражение любого типа. Например, можно привести к строковому типу информацию о датах зачисления и окончания с помощью следующего запроса:
ВЫБРАТЬ
Справочник.Клиенты.Наименование,
ПРЕДСТАВЛЕНИЕ(Справочник.Клиенты.ДатаЗачисления),
ПРЕДСТАВЛЕНИЕ(Справочник.Клиенты.ДатаОкончания)
Оператор ПОДОБНО
Часто при построении запросов мы располагаем не точной информацией о том, что требуется найти, а какой — ее частью. Например, мы знаем, что фамилия интересующего нас человека включает начальный фрагмент— Си
Извлечение информации с помощью запросов
199
дор. Ситуация достаточно распространенная — мы не помним точно фамилию человека. Она может быть Сидоров, или Сидорова, или Сидоренко.
Для иллюстрации того, что можно сделать в таком случае, создадим в среде 1С:Предприятие интерфейс, аналогичный показанному на рис. 3.40. Здесь в окне ввода пользователь может внести любую часть фамилии, даже если он ее не полностью знает. Дгшее при нажатии кнопки Выбор в списке ниже отображаются существующие в справочнике фамилии учащихся (рис. 3.41).
Текст процедуры обработки нажатия на кнопку приведен в листинге 3.27. ИСТОЧНИКОМ Запроса является Справочник, а отбор выполняется ПО ПОЛЮ Наименование. Отбираются только те учащиеся, в фамилии которых присутствует значение параметра Фрагмент. Условие отбора обеспечивается за счет следующей конструкции языка запроса.
ГДЕ Учащийся ПОДОБНО &Фрагмент
Здесь оператор подобно позволяет сравнить значение выражения, указанного слева от него, со строкой шаблона, указанной справа. Значение выражения должно иметь тип строка.
Строка шаблона допускает использование ряда служебных символов (табл. 3.7). В приведенной процедуре значение параметра Фрагмент устанавливается уже знакомым способом с использованием одного из служебных символов:
Запрос.УстановитьПараметр("Фрагмент",
"%" + ЭлементыФормы.Данные.Значение + "%")
Таблица 3.7. Служебные символы, применяемые в операторе подобно
Символ	Комментарий
%	Обозначает последовательность, содержащую любое количество символов
_(подчеркивание)	Соответствует произвольному одиночному символу
[... ] (один или несколько символов в квадратных скобках)	Обозначает любой одиночный символ из перечисленных внутри квадратных скобок. В перечислении могут встречаться диапазоны, например, a-z, что означает произвольный символ, входящий в диапазон, включая концы диапазона
Г. • •]	Соответствуют любому одиночному символу, кроме пере-численых в квадратных скобках за значком отрицания (л)
200
Гпава 3
Рис. 3.40. Форма для демонстрации отбора по подстроке
Файл Правка Операции Первис £кна Справка И u
Код ^Наименование
4;Афонин Игорь Николаевич

с
м и* м- %
Данные для поиска
Действия
1 i Сидоров Евгений Петрович
’ Для получения подсказки нажмите F1
.г.пп .ГГ..Г-П ш..шпМшпшг
]__5; Федосеев Кирилл Федорович
Выбор.
*»	2:Николаев Сергей Федорович
**	3: Пронин Олег Петрович
Рис. 3.41. Результат отбора по указанной подстроке
Отобранные учащиеся'
Сидоров Евгений Петрович Николаев Сергей Федорович Федосеев Кирилл Федорович

Извлечение информации с помощью запросов 201
Г, wir-wit-A.r-...-. о -фр	VtJWM vr-мм.- «	tiynur WtwA>te»VJBeWV-’V«»W'«WM,»’«W ММ*1 »ZMJ !>'	’glJWJb
Листинг 3 27. < )т6ор инсЬьрмации с указанной подстрокой
Процедура ВыборНажатие(Элемент)
Запрос=Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Наименование
I ИЗ Справочник.Клиенты
I ГДЕ Наименование ПОДОБНО {.Фрагмент";
Запрос.УстановитьПараметр("Фрагмент", "%" + ЭлементыФормы.Данные.Значение + "%"); Результат = Запрос.Выполнить().Выбрать(); ОтобранныеУчашиеся.Очистить(); Пока Результат.Следующий() > 0 Цикл ОтобранныеУчашиеся.Добавить(Строка(Результат.Наименование)); КонецЦикла; КонецПроцедуры
Итоги
Эта глава дала нам много практических приемов в плане использования запросов. Основное внимание было уделено непосредственно языку запросов, а также конструкциям встроенного языка, позволяющим работать с запросами в программных процедурах.
Примеры продемонстрировали использование различных вариантов запросов — их применяют разработчики для извлечения информации при построении отчетов. В данной главе мы взяли за исходный материал созданные ранее информационные базы и фактически дополнили их средствами просмотра информации в удобном для пользователя виде.
Большинство приведенных примеров включают в себя как текст запроса, так и саму процедуру, позволяющую запрос выполнить. Такое представление должно быть удобным для читателей. Конечно, конструкции языка запросов весьма разнообразны, и мы не смогли охватить все возможности. Однако теперь читатели уже могут самостоятельно отправиться в путешествие по лабиринтам программных ресурсов системы 1С:Предприятие 8, используя встроенную справочную документацию, а также ряд очень хороших изданий [1-3].
С языком запросов мы встретимся и в последующих главах, где много внимания уделим построению отчетов. Кроме того, узнаем про наличие в системе 1С:Предприятие 8 конструктора запросов, позволяющего визуальными действиями создать текст на языке запросов.
Глава 4
Использование документов и регистров накопления
В этой главе мы рассмотрим пример разработки еще одной конфигурации, в которой будут использоваться объекты, с которыми часто сталкиваются разработчики. С некоторыми из них мы уже знакомы — это справочники, запросы, формы, табличные документы и обработки. В этой главе большое внимание будет уделено работе с документами — о них уже шел разговор в начале книги. На примерах мы познакомимся с некоторыми новыми функциональными возможностями этих объектов конфигурации. В главе 2 были рассмотрены программные ресурсы для работы с регистрами сведений. Это не единственный вид регистров, здесь мы встретимся с регистрами накопления. Учет количественной информации при разработке прикладных решений практически всегда строится с использованием регистров подобного вида. Большое внимание в главе также уделяется разнообразным отчетам, для построения которых мы воспользуемся эффективными средствами автоматизации.
«
Взгляд на документы и регистры накопления
Начнем с небольшого пояснения относительно понятия документ. Ранее в главе 1 один из примеров был связан с разработкой в конфигураторе документа, отражающего один из участков работы в офисе. Мы познакомились с электронной формой документа, а также с его печатным вариантом (печатной формой) Рассмотренные примеры можно считать небольшим анон
204
Гпава 4
сом данной главы, где работе с документами будет уделено значительное внимание.
С практической точки зрения документ можно считать прикладным объектом, назначением которого является ввод и фиксация информации о событиях, происходящих в организации. Эти события, как правило, влияют на количественные показатели в рассматриваемой предметной области (чаще всего учет связан с движением денежных средств и материальных ценностей). В качестве примеров можно предложить факт выписки денежных сумм сотрудникам, передачу товаров и материалов с одного склада на другой и т. д. Именно для того, чтобы подобные факты могли найти отражение в системе учета, и был разработан объект документ.
События, происходящие в организации, всегда имеют привязку ко времени, поэтому параметр время является обязательным реквизитом любого документа. Действия при разработке прикладных документов начинаются в конфигураторе с создания структуры документа— набора полей с указанием типа данных. Кроме того, с помощью программных процедур обеспечивается реализация необходимых действий с документом. Информационная база на основании подобного разработанного объекта конфигурации дополняется структурой данных. которая позволяет пользователю в режиме 1 С'Предприятие с такими документами работать (создавать, вносить в них информацию, изменять, удалять).
Подчеркнем, что основной чертой, отличающей документы от других объектов, является их свойство проводимости (т. е. возможность формировать проводки, являющиеся результатом информации, присутствующей в документах). Это очень важная особенность, и ее необходимо пояснить. В информационной системе 1С:Предприятие 8 имеются разнообразные структуры информации, которые описывают количественное состояние дел в организации (например, стоимостный и количественный учет разнообразных товаров). Проведение документов означает факт внесения изменений в эти структуры данных (причина изменений связана с информацией, содержащейся в документах). Например, поступление по документу определенного товара изменяет суммарное количество данного товара на складе.
С другой стороны в информационной системе при необходимости должна существовать и возможность отмены проводки (возвращения информации в первоначальное состояние). Например, при отмене проведения документа «Поступление товара» должна быть скорректирована информация в регистре, который используется для учета количества товаров на складах. Подобная
Использование документов и регистров накопления
205
возможность отмены проведения документов в системе Ю.Предприятие 8 также реализована.
Важно подчеркнуть, что документы, разработанные для различных известных конфигураций системы 1С:Предприятие 8, являются аналогами реальных документов, которые используются в работе организаций.
Многочисленные документы, используемые в реальном документообороте, различны по структуре. Например, основное содержание одних документов могут составлять таблицы (скажем, списки номенклатуры, услуг или сотрудников), а в других они могут отсутствовать. Существуют также документы с наличием нескольких табличных частей (одна табличная часть отводится для списка сотрудников, работающих на постоянной основе, а другая для списка совместителей). В связи с этим объект конфигурации документ системы 1С:Предприятие 8 должен обладать большой гибкостью. Использование рассматриваемого объекта при разработке прикладных решений должно позволять легко создавать различные документы — приходную накладную, счет или документ о перемещении товаров со склада на склад. В системе 1С:Предприятие 8 ситуация выглядит именно так — все конструктивные возможности находятся во власти разработчика.
Поясним теперь основные параметры этого объекта конфигурации. В любом документе, созданном в системе 1С:Предприятие 8 (так же как и реальных документах), присутствует информация, которая характеризует его в целом. Это дата создания и порядковый номер (в последовательности документов одного типа). Кроме того, в любом документе присутствует и другая общая информация, например, организация, подразделение или ответственное лицо. Для подобных параметров в объекте конфигурации документ отводится область, называемая шапка. Ее составляют реквизиты, характеризующие документ в целом.
Кроме общей области, документ может содержать список данных, похожих по структуре. Это может быть список сотрудников, организаций или товаров. Каждый из этих списков включает в себя еще и уточняющую информацию. Например, вместе с названием товара указывается количество и цена. Для отражения такой информации в разрабатываемый объект конфигурации следует включить один или несколько подчиненных (внутренних) объектов, которые называются табличная часть.
Дадим небольшое пояснение еще по одному типу объектов конфигурации, которому мы уделим заметное внимание в этой главе — это регистры накопления. Их основное назначение просматривается уже из названия — регистры
206
Гпава 4
накопления предназначены для реализации механизма количественного учета информации. Когда в конфигураторе мы создаем новый регистр накопления (в примерах этой главы это будет конкретный регистр под названием оплата), то в программной памяти создается структура данных для реализации механизма накопления вносимых сумм.
В главе 2, когда мы работали с регистрами сведений, ручное внесение в них информации являлось вполне нормальным явлением. В регистр сведений тарифы можно было непосредственно вносить названия и суммы тарифов (чем мы и пользовались в разработанном прикладном решении). Таким же образом мы могли бы работать и с регистром квитанции, однако программное внесение информации с помощью специально разработанных форм сделало работу более удобной. В главе 2 мы с помощью разработанных процедур обеспечили эффективную регистрацию событий, связанных с выпиской и оплатой квитанций
Что касается регистров накопления, то для них ручное внесение информации, как правило, исключается. Основной режим работы по добавлению данных (а также модификации и удалению) в регистры накопления связан с действиями, выполняемыми в программных процедурах, которые относятся к другим объектам. Часто, даже можно сказать в основном, этими объектами являются документы.
Конструктивно регистры накопления аналогичны регистрам сведений. Как и в регистрах сведений, в них существуют измерения и ресурсы. Накопление количественной информации может производиться в разрезе нескольких измерений (например, по складам и номенклатуре товаров). При этом если в регистре сведений для уникального набора значений измерений может существовать только одно значение ресурса, то в регистре накопления подобного ограничения нет.
Далее в главе рассматривается разработка конфигурации, в которой мы познакомимся с программными приемами внесения информации в регистры накопления, а также извлечения из них необходимых данных при построении отчетов.
Постановка задачи
Начнем опять с задачи учета оплаты учащимися за предоставленные образовательные услуги, однако исходная ситуация будет несколько другой. По
Использование оокументов и регистров накопления
207
этому информационные модели и объекты конфигурации, которые нам понадобятся, также будут другими.
Изменения в условиях задачи преследуют цель использования при разработке механизма проведения документов с отражением результатов проведения в регистре накопления. С другой стороны, учитывая многообразие различных схем оплаты, рассматриваемая в данной главе информационная модель вполне может встретиться и в реальной ситуации.
Будем считать, что в данном случае слушателями наших курсов являются как индивидуальные клиенты, так и группы учащихся по договорам, заключенным с конкретными организациями. При зачислении слушателя (как индивидуального, так и от организации) с ним заключается договор на конкретную сумму за весь учебный цикл. Эту сумма может оплачиваться поэтапно, но при этом в процессе оплаты предусматриваются штрафные санкции (пени) либо наоборот (призовые) бонусы.
Поясним на примере, что представляет собой такая схема оплаты. Допустим, в договоре определены сроки поэтапного внесения денежных сумм за обучение. Например, 30 процентов от общей суммы договора учащийся должен внести в первом квартале года, затем следующие 20 процентов во втором и т. д. Однако при досрочной оплате определенной суммы она засчитывается с увеличением, скажем, на 10 процентов. Так, внеся заранее 1000 рублей, учащийся получает бонус 10 процентов от данной суммы, и ему засчитывается 1100 рублей в качестве погашения задолженности по оплате. Наоборот, при несвоевременной оплате для учащегося вводятся штрафные санкции (пени). Например, если слушатель принесет в учебный центр квитанцию по оплате 1000 рублей с запозданием, то ему могут быть назначены штрафные санкции в виде 10 процентов от оплаченной суммы. В результате ему по договору зачитывается только 900 рублей. При этом разнообразные бонусы и штрафные санкции могут устанавливаться как индивидуальным слушателям, так и для организаций в целом. Также бонусы и штрафные санкции могут устанавливаться учащимся и по другим факторам — хорошая учеба, скидки для организаций и т. д.
Представленная информационная модель преследует цель продемонстрировать разнообразные технические возможности, которые могут быть востребованы и в другой практической ситуации. Рассмотренные приемы должны помочь читателям при самостоятельной разработке конфигурации.
В конфигурации данной главы мы создадим регистр накопления, который предназначен для учета внесенных слушателями курсов сумм. Этот регистр
208
Гпава 4
будет иметь одно измерение (для фамилии учащегося) и два ресурса (фактически внесенная сумма и эта же сумма, но с учетом бонуса). Это нам позволит извлекать из таблицы регистра как общую сумму оплаты, так и сумму с включением штрафных санкций и премий.
При учете поступления денежных средств всегда возможен и их возврат. Поэтому в рассматриваемом регистре накопления будут учитываться не только внесенные учащимися суммы, но и приниматься во внимание их возврат со стороны нашего учебного центра (например, в случае переплаты или отказа от обучения).
Для механизма внесения денежных средств и их возврата в разрабатываемой конфигурации нам потребуются соответствующие документы, при проведении которых в таблицы, созданные на основании регистра накопления, непосредственно самой информационной системой будет заноситься необходимая информация.
Формирование учетной информации в регистрах представляет только часть функционирования информационной системы. Другая часть — это создание отчетов, необходимых руководству организации. Для получения итоговой информации по оплате мы сформируем несколько отчетов, а также попробуем обеспечить удобные сервисные возможности пользователю при работе с нашей информационной базой.
Таким образом, можно сказать, что основной план на разработку конфигурации сформулирован, а в качестве первых практических шагов в следующих разделах мы создадим несколько вспомогательных справочников. Далее мы разработаем документы для учета поступления и возврата денежных средств. Большая часть главы будет отведена разработке разнообразных отчетов, связанных с денежными суммами.
Справочник Организации
Для разработки практических примеров нам потребуется новая конфигурация, поэтому работу начнем с создания пустой информационной базы. Первым объектом конфигурации будет справочник организации (рис 4.1), в котором кроме обязательных реквизитов создадим еще один — Бонус (рис. 4.2). Этот «необязательный» реквизит предназначен для хранения значения бонуса (в процентах) для конкретной организации. Для этого реквизита мы укажем тип данных — число, и выберем точность — единицу,
Использование документов и регистров накопления
209
что означает десятую долю процента. Этот же параметр может использоваться для хранения штрафных санкций — просто в этом случае его значение будет отрицательным.
Забегая вперед, отметим, что после разработки необходимых объектов конфигурации мы обеспечим сервисные возможности пользователю за счет программных процедур. Так, ввод информации по оплате в систему будет реализован с помощью соответствующего документа. В электронной форме этого документа после выбора названия организации значение реквизита Бонус будет автоматически заполняться данными на основании информации из справочника.
Итак, мы сформировали структуру первого справочника. Далее перейдем в режим 1С:Предприятие. При работе со справочником Организации нам будет вполне достаточно формы списка, которая генерируется системой по умолчанию. В качестве примера на рис. 4.3 показано заполнение справочника несколькими организациями.
Созданный вспомогательный справочник Организации нам потребуется при разработке следующего справочника, в котором мы сформируем список учащихся нашего учебного центра. В первой главе при разработке конфигурации для подобной цели уже создавался справочник клиенты. Для того чтобы между ними не было путаницы, в этой главе мы будем использовать другое название — Учащиеся.
Рис. 4.1. Окно редактирования справочника организации
210
Глава 4
Рис. 4.2. Окно свойств реквизита Бонус
Рис. 4.3. Справочник Организации в режиме работы 1 С: Предприятие
Справочник Учащиеся
После внесения на закладке Основные в окне редактирования объекта конфигурации имени объекта, перейдем к другой, наиболее информативной закладке — Данные. Здесь необходимо разместить три дополнительных рекви
Использование документов и регистров накопления
211
зита справочника (рис. 4.4), а табличная часть для элементов нам не потребуется.
Первый реквизит назовем организация (тип данных— СправочникСсыл-ка . Организации), а второй-ИндБОНус (тип данных — число, с точностью до
одного разряда после запятой). Второй реквизит предназначается для внесения индивидуального бонуса либо штрафных санкций слушателю курсов. По смыслу задачи можно ввести категорию индивидуальных слушателей, включающую только лиц, не входящих в группы, направляемые на обучение от организаций. Что касается третьего реквизита (стоимость), то он будет хранить информацию о стоимости обучения для конкретного учащегося. Поэтому для него установим числовой тип данных.
Сотрудник нашей организации при зачислении учащегося вместе с его фамилией заносит в справочник Учащиеся стоимость обучения. В дальнейшем в зависимости от регулярности оплат он может внести значение индивидуального бонуса. Наоборот, в случае продолжительного отсутствия оплат можно внести отрицательный бонус, например минус три. Это соответствует включению пени (три процента) на оставшуюся неоплаченную сумму.
Рис. 4.4. Окно редактирования справочника Учащиеся
212
Глава 4
Рассмотренная информационная модель позволяет учитывать для отдельных слушателей (входящих в группу от конкретной фирмы) кроме бонусов, относящихся к организации в целом, еще и индивидуальные бонусы. Скажем, для Иванова И П., обучающегося от организации АО «Заречный», установлен индивидуальный бонус три процента, и, кроме того, для всего АО «Заречный» установлен бонус пять процентов. В этом случае внесенная за Иванова И. П. плата в 1000 рублей автоматически засчитывается как сумма в 1080 рублей.
Таким образом, организация нашего справочника определена, и далее на очереди стоит создание пользовательской формы списка (форма по умолчанию нас не устроит, поскольку в дальнейшем нам придется вносить в нее изменения).
В окне редактирования объекта конфигурации на закладке Формы создадим представление справочника — форму списка (рис. 4.5). На этой форме уже известным способом изменим подпись Наименование на ФИОучащегося. В результате при работе в режиме I С: Предприятие подписи заголовков всех столбцов станут вполне информативными.
Теперь можно перейти в режим 1С:Предприятие и заполнить справочник данными (один из вариантов заполнения показан на рис. 4.6).
Следующая практическая задача заключается в создании регистра накопления с именем РегистрОплаты, который будет использоваться для аккумулирования информации об оплаченных суммах.
Рис. 4.5. Форма списка справочника Учащиеся
Использование документов и регистров накопления
213
Рис. 4.6. Заполнение справочника Учащиеся в режиме 1С:Предприятие
Регистр накопления по оплате
В рассматриваемой задаче для руководства учебной организации большой интерес представляет информация о том, кто и сколько заплатил за обучение. Создадим для этого новый объект конфигурации — в окне Конфигурация (рис. 4.7) добавим новый регистр накопления (для синонима имени выберем Регистр оплаты). Важный момент, на который следует обратить внимание на этом рисунке— это поле со списком Вид регистра, в котором следует установить вид регистра накопления — Остатки. Другой альтернативный вариант — Обороты (смысл этих установок мы разберем далее).
После начальных действий в окне редактирования объекта конфигурации необходимо перейти на закладку Данные и создать для данного регистра:
П измерение — Учащийся (тип данных — СправочникСсылка. Учащиеся);
□ ресурс — Сумма (в качестве типа данных выберем — число);
П ресурс — Суммасвонусом (в качестве типа данных выберем — число).
На рис. 4.8 показана структура создаваемого регистра накопления. Однако сразу после этого не стоит переходить в режим IС Предприятие для работы с созданным регистром — необходимые действия в конфигураторе еще не завершены. Дело в том, что создание регистра накопления без документов, которые с ним взаимодействуют (формируют движения по регистру), не при-
214
Глава 4
нимается информационной системой. При попытке сохранения конфигурации вы увидите на экране соответствующее сообщение.
Рис. 4.7. Окно редактирования объекта РегистрОплаты
Фай" Праъкг Чпнд. итерация Отпад.-а чдминистр! рованю Дареме " на Справ! а
А,’	- ,	•• -	~	—— "" — 7*^ —П
I Г» РьГЧиЦТ ЦлК«ЛЛМ"Ьы Р.-' метр» пл»ги	_ С X .
ОсНОВНЬ с
► Дчнньк °егистрагирь1 Формь Макеты Подсистемы Права ИнгерФеи :ы Обмен данны м Прочее
Ву , Измерения | Учащийся
В“ ^ Ресурсы Счмма
L-s
—5- Реквизиты
MjMMaCEoHsotM
Действия г «Назад | Г Далее? Н Закрыть ;]ф Справка S
Рис. 4.8. Структура регистра накопления для учета оплаты
Использование документов и регистров накопления
215
Чтобы устранить эту ошибку, надо создать документ оплата, в котором с помощью программной процедуры реализовать выполнение движений по созданному регистру с именем — РегистрОплаты. В отличие от регистров сведений, с которыми мы работали во второй главе, здесь все записи по внесению денежных средств будут выполняться незаметно от пользователя в процессе записи документа Оплата.
Примечание
При записи документа одновременно осуществляется его проведение — движение по регистру. Таким образом, для пользователя каких-либо новых действий в режиме 1С:Предприятие не требуется — все обеспечивает традиционный щелчок по кнопке ОК в окне формы документа.
Документ Оплата
С технологией создания объекта конфигурации типа документ мы уже познакомились в первой главе. Поэтому при разработке документа Оплата подчеркнем только наиболее важные моменты. На рис. 4.9 показана закладка Данные окна редактирования объекта конфигурации Из рисунка видно, что область шапки документа содержит два реквизита:
О Организация (тип данных — СправочникСсылка. Организации);
□	Бонус (тип данных— число с точностью до одного знака, что позволяет отображать проценты с десятыми долями).
Для табличной части документа выберем имя Список, и далее в нее внесем необходимые реквизиты:
П Учащийся (тип данных — СправочникСсылка.Учащиеся);
П индвонус (тип данных— число с точностью до одной десятой) для внесения бонусов индивидуальных слушателей курсов;
П Сумма (тип данных — число) для внесения информации по оплачиваемой сумме,
□	СуммаСБонусом (тип данных— число) для внесения информации по сумме оплаты с учетом как индивидуальных бонусов, так и групповых (для слушателей от определенной организации). В дальнейшем с помощью программной процедуры значение этого реквизита будет вычисляться ав-
томатически.
216
Гпава 4
Рис. 4.9. Структура документа Оплата
Перейдем теперь на закладку Движения (рис. 4.10). где от нас требуется определить, в каких регистрах будут происходить изменения при проведении документа оплата. В разделе Регистры накопления отражаются все имеющиеся регистры накопления, по которым можно организовать движения. В данном случае в нашей конфигурации мы располагаем только одним регистром накопления — РегистрОплаты, и только он присутствует в окне. От нас требуется сделать отметку во флажке напротив его названия.
Примечание
Система 1С:Предприятие 8 позволяет организовать движения документа по нескольким регистрам, и в книге [2] рассмотрен ряд примеров практических разработок на эту тему.
Мы подошли к следующему этапу разработки, и далее можно пойти двумя путями — либо самостоятельно написать процедуру, которая будет формировать движения при проведении подобных документов, либо воспользоваться возможностями конструктора движений. Соответствующая кнопка активизируется сразу после указания конкретного регистра (рис. 4.10). Выберем второй путь и при использовании конструктора движений автоматически
Использование документов и регистров накопления
217
получим необходимую программную процедуру в результате несложного диалога. Подобным образом в предыдущих главах мы уже несколько раз создавали печатные формы справочников и документов.
Конструктор движений
В режиме диалога с конструктором движений ключевым (в плане построения процедуры) является окно, представленное на рис. 4.П, которое стоит прокомментировать. В разделе Регистры указаны те регистры, по которым можно формировать движения в документе. В данном случае регистр у нас один — РегистрОплаты, который и указан для дальнейших действий конструктора.
Рис. 4.10. Закладка Движения окна редактирования документа Оплата
В правое верхнее поле уже автоматически внесены реквизиты шапки данного документа. Это связано с тем, что в указанное поле включаются параметры документа, которые могут участвовать в движениях. Кроме шапки в документе имеется еще и табличная часть, однако для добавления реквизитов
218
Гпава 4
табличной части в поле Реквизиты документа следует выполнить несложную техническую операцию.
Рис. 4.11. Окно конструктора движений регистра
Рис. 4.12. Отображение реквизитов табличной части в окне конструктора
Использование документов и регистров накопления
219
В центральной части рис. 4.11 присутствует поле со списком (с соответствующей подписью— Табличная часть), где перечислены имеющиеся табличные части в документе (в нашем документе табличная часть одна — Список). Для перенесения в поле Реквизиты документа реквизитов табличной части ее имя необходимо просто выбрать в сциске табличных частей (рис. 4.12).
На этом работа с данным окном еще не завершена, и нам следует перейти к нижней левой части окна конструктора движений. Здесь необходимо указать соответствие полей регистра накопления и реквизитов документа. Для поля Учащийся (измерение регистра) устанавливается соответствие— значение реквизита Учащийся из табличной части документа. Технически это можно выполнить либо с помощью кнопки Заполнить выражения, либо с помощью двойного щелчка мышью по необходимому реквизиту документа в правом верхнем разделе на рис. 4.12. В результате, напротив названий полей регистра появятся соответствующие выражения (рис. 4 13).
Рис. 4.13. Заполнение выражений в окне конструктора движений регистра
Теперь все действия в окне конструктора движений регистров выполнены, и осталось щелкнуть по кнопке ОК. Это приводит к генерации конструктором
220
Гпава 4
программной процедуры (листинг 4.1), которая формирует движения по регистру при проведении документа. В дальнейшем если потребуется эту процедуру найти (скажем, для коррекции или просто для просмотра), то в окне редактирования объекта конфигурации следует перейти на закладку Прочес. Здесь после нажатия на кнопку Модуль объекта мы увидим текст, представленный в листинге 4.1.
Обратим внимание еще на одну важную деталь в окне конструктора движений регистров (рис. 4.13). В качестве значения параметра Тин движения регистра по умолчанию с помощью переключателя установлен вариант Приход. Это соответствует добавлению ресурсов регистра при проведении документа. Альтернативный вариант Расход связан с уменьшением ресурсов (чуть позже мы создадим документ Возврат, который реализует подобное движение по регистру).
.—..OTTF..
Листинг 4.1. Процедура, выполняемая при проведении документа
;....„Й.jwi....... ........... ...	....   ...... .... ... 
Процедура ОбработкаПроведения(Отказ, Режим)
// {{_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные
// вручную изменения будут утеряны!1!
Для Каждого ТекСтрокаСписок Из Список Цикл
// регистр РегистрОплаты Приход
Движение = Движения.РегистрОплаты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Учащийся - ТекСтрокаСписок.Учащийся;
Движение.Сумма = ТекСтрокаСписок.Сумма;
Движение.СуммаСБонусом = ТекСтрокаСписок.СуммаСБонусом;
КонецЦикла;
// записываем движения регистров
Движения.РегистрОплаты.Записать();
/ /} }_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Основную часть процедуры ОбработкаПроведения () составляет ЦИКЛ, В КОТОРОМ перебираются строки табличной части Список документа Оплата:
Для Каждого ТекСтрокаСписок Из Список Цикл.
Использование документов и регистров накопления
221
При каждом проходе цикла с помощью метода Добавить () создается очередная новая запись в регистре. В последующих строках процедуры устанавливаются значения полей регистра в соответствии с данными из очередной строки табличной части документа.
Работа с конструктором движений завершена, и можно подчеркнуть главный результат, заключающийся в том, что вследствие несложных визуальных действий в документе оплата реализовано формирование движений по регистру накопления РегистрОплаты. Автоматически созданную программную процедуру можно при необходимости скорректировать либо дополнить.
Хотя наша работа по конструированию рассматриваемого документа еще не окончена, сейчас можно перейти в режим 1 С:Предприятие и проверить результат выполненных изменений (протестировать созданный документ). В меню Операции выберем пункт Документы и далее пункт, соответствующий только что разработанному документу — Оплата. С помощью соответствующей кнопки пиктографического меню можно создать документ и заполнить его информацией (например, как показано на рис. 4.14).
Примечание
Функциональные возможности формы разработанного документа оплата еще полностью не реализованы, и в следующем разделе мы рассмотрим программные процедуры, направленные на создание удобного интерфейса для пользователя.
Сейчас от сотрудника, работающего с документом, требуется самостоятельно заполнять все поля создаваемого документа. Например, как показано на рис. 4.14, необходимо ввести название организации в шапку документа, затем заполнить табличную часть, где внести фамилию учащегося, а также заполнить поля Сумма и Сумма с бонусом. Эту ручную работу мы далее существенно автоматизируем.
А пока после занесения информации щелчок по кнопке ОК приводит к записи созданного документа в информационную базу. Кроме того, осуществляется и его проведение (формируются движения по регистру). На рис. 4.15 показана форма списка регистра накопления с внесенной записью, связанной с документом.
Планы по доработке формы документа
Рассмотрим возможности для улучшения интерфейсной составляющей документа— автоматизации работы пользователя в процессе ввода данных. Нач
222
Гпара 4
нем с анализа последовательности действий пользователя при работе. В режиме 1С Предприятие при создании нового документа сотрудник офиса в области шапки должен указать конкретную организацию, по которой он собирается вносить в электронную базу оплаченные суммы.
Примечание
Предполагается, что с помощью одного документа осуществляется ввод данных по оплате для слушателей только от одной организации.
Если мы работаем с учащимися, записавшимися на курсы самостоятельно, то в поле ввода Организация следует выбрать значение (см. рис. 4.3) — Инд. Эго значение мы условно указали, чтобы обозначить индивидуальных слушателей.
Рис. 4.14. Заполнение формы документа Оплата в режиме 1С Предприятие
После выбора организации список учащихся (табличная часть документа) должен автоматически заполняться фамилиями учащихся, относящихся либо к конкретной организации, либо проходящими обучение по индивидуальной программе. Эго мы реализуем с помощью предопределенной процедуры. После этого от пользователя, работающего с формой, потребуется только внести суммы оплат напротив соответствующих фамилий.
Использование документов и регистров накопления
223
Рис. 4.15. Форма списка регистра для регистрации оплаты
В справочнике организация вместе с названием организации присутствует еще и реквизит Бонус. Значение бонуса после заполнения в документе поля Организация также должно автоматически заноситься в соответствующее поле шапки документа.
Аналогично в справочнике Уча-циеся имеется реквизит ИндБонус, который определяет индивидуальный бонус либо штрафные санкции для конкретного учащегося. При заполнении табличной части документа автоматически в соседнюю колонку (поле Инд бонус) должна заноситься информация из справочника Учащиеся об индивидуальном бонусе.
Примечание
По замыслу реквизит ИндБонус ориентирован на работу с индивидуальными слушателями, однако в каких-то ситуациях его можно использовать и для учащихся от организаций (у них может быть бонус от организации, а также и свой индивидуальный).
После этого от сотрудника, работающего с документом, требуется внести в колонку Сумма оплаченные суммы напротив каждого слушателя (скажем, исходя из имеющегося бумажного документа). В процессе этих действий после внесения очередной суммы соответствующее поле СуммаСБонусом должно автоматически заполняться, исходя из различных бонусов. При положительном бонусе учащемуся засчитывается в качестве оплаты большая сумма, чем он реально оплатил При этом пользователь прямо на форме документа может поменять значения полей Бонус и Инд бонус, что также должно приводить к автоматическому пересчету в поле СуммаСБонусом.
Все вышесказанное можно рассматривать как техническое задание для последующих действий. Наша задача будет заключаться в том, чтобы обеспе
224
Гпава 4
чить подобное функционирование формы документа с помощью программных процедур.
Но это еще не все. Для установки индивидуального бонуса непосредственно в форме документа мы реализуем еще одну возможность С помощью кнопки обеспечим формирование отчета по суммам оплаты конкретного учащегося. В зависимости от полученной отчетной информации пользователь может по своему усмотрению установить необходимое значение в поле Инд бонус.
Программирование формы документа
Начнем реализацию поставленных задач, и так как нам потребуется программировать события, связанные с элементами на форме, то необходимо создать пользовательскую форму документа. Для этого в окне редактирования объекта конфигурации следует перейти на закладку Формы и щелчком по пиктограмме с изображением лупы напротив поля Основные формы документа начать диалог (рис. 4.16) с конструктором. Выполнив несложные действия в нескольких окнах конструктора, мы увидим на экране результат (рис. 4.17).
Рис. 4.16. Закладка Формы окна редактирования документа оплата
Использование документов и регистров накопления
225
В шапке документа расположено поле Бонус, которое должно автоматически заполняться при указании названия фирмы в поле организация. В этом случае из справочника организации извлекается значение реквизита Бонус и вносится в соответствующее поле в шапке формы документа. Для этого на закладке модуль необходимо расположить соответствующую предопределенную процедуру.
0 Канфигурлтор' Чанфигур- ция г [Документ Ооплта: Фор...
Файл: Правка Форма Конфигурация ОтлОДка ^лминнстрироьание Сервис f Цкна Справка.	«, О X
« ; Диалог Модуль « Реквизиты
Для получения подсказки и.. П ;м -и* f 1S?	^*5426402
Рис. 4.17. Окно формы документа Оплата
Двойным щелчком мыши по полю ввода Организация откроем окно его свойств, в котором щелкнем по пиктограмме с изображением лупы напротив события При изменении (рис. 4.18). В результате будет сформирована заготовка процедуры обработчика этого события в модуле данной формы.
Текст короткой процедуры, необходимой для заполнения поля Бонус, приведен в листинге 4.2. В результате при переходе в режим 1С:Предприятие вы увидите желаемый эффект (рис. 4.19). Так, после выбора организации Бум-комбинат в поле Бонус устанавливается значение 7 процентов (что соответствует информации из справочника).
226
Гпава 4
Листинг 4.2. Процедура, выполняемая при заполнений поля Организация
Процедура ОрганизацияПриИзменении(Элемент) Бонус=Организация.Бонус;
КонецПроцедуры
Ь*. Конфигуратор Конфигурация - [Документ Оплата: Фор..
Правке Форма Конфигурация Отладка Ддмин^рированмв Сервис
Г Окна Справка.	_ (5. X
Диалог j  Модуль ~ Реквизиты
Для получения подсказки И.. СДР	- $4, 83	ЙЗ)8х-19:
Рис. 4.18. Окно свойств поля Организация
Разработаем процедуру для автоматического заполнения табличной части документа. Необходимо сделать так, чтобы табличная часть Список (список учащихся) заполнялась в соответствии с информацией из справочника Учащиеся. Для реализации подобного эффекта следует внести В процедуру ОрганизацияПриИзменении дополнение (листинг 4.3).
.	«	-3- «WMHWSawyiHMTliWWTr» 7, ~г—™“™
"истине 4.3. Процедура, выполняемая три заполн яй г поля Организация
(вариант 2)	_______________________________*
Процедура ОрганизацияПриИзменении(Элемент) Бонус = Организация.Бонус;
Использование документов и регистров накопления
227
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ Ссылка ,-ИндБонус
I ИЗ Справочник.Учащиеся
I ГДЕ Организация = ЬНазваниеОрганизации";
Запрос.УстановитьПараметр("НазваниеОрганизации", ЭлементыФормы.Организация.Значение);
Результат = Запрос.Выполнить().Выбрать();
Список.Очистить();
Пока Результат.Следующий() > 0 Цикл
НоваяСтрока = Список.Добавить();
НоваяСтрока.Учащийся = Результат.Ссылка;
НоваяСтрока.ИндБонус = Результат.ИндБонус;
КонецПроцедуры
Рис. 4.19. Автоматическое заполнение поля Бонус при выборе организации
В данной процедуре используется запрос, в котором в качестве значения параметра выступает указанная на форме документа организация. Это так называемый параметрический запрос, с которыми мы работали в третьей главе В результате выполнения запроса отбираются учащиеся (вместе со значением индивидуального бонуса), относящиеся к указанной пользователем организации. Далее в цикле перебираются все элементы полученной в результате выполнения запроса выборки. Это используется для заполнения табличной части (Список) документа, которая предварительно очищается:
Список.Очистить()
228
Гпава 4
а затем программно заполняется учащимися только указанной организации. Для имеющихся данных результат работы в режиме 1С:Предприятие приведен на рис. 4.20. Отметим, что параллельно с заполнением табличной части учащимися в соответствующее поле заносится индивидуальный бонус. Например, выбрав в качестве организации АО «Заречный» в табличную часть вместе с именем Иванов И. П. вносится значение в колонку Инд. Бонус.
Рис. 4.20. Заполнение табличной части документа после выбора организации
Теперь от пользователя требуется ввести сумму в столбец Сумма напротив учащегося в соответствии с имеющимися (скорее всего бумажными) данными. При этом после ввода этой суммы системой автоматически должно быть
Использование документов и регистров накопления
229
вычислено значение в колонке Сумма с бонусом. Это реализуется с помощью процедуры, представленной в листинге 4.4, а результат ее работы продемонстрирован на рис. 4.21.
Пе - И- . 4,«н Процедура, г толняемая при Заполнении г)ппя Сумма _ ..... .... .. ..
Процедура СписокСуммаПриИзменении(Элемент)
ТабличнаяЧасть = ЭлементыФормы.Список.ТекущиеДанные;
БонусДляОрганизации = ЭлементыФормы.Бонус.Значение;
ИндивидуальныйБонус = ТабличнаяЧасть.ИндБонус;
ИтогБонус = БонусДляОрганизации + ИндивидуальныйБонус;
ТабличнаяЧасть.СуммаСБонусом = ТабличнаяЧасть.Сумма*(1 + ИтогБонус/100);
КонецПроцедуры
Рис. 4.21. Заполнение поля Сумма с бонусом в документе Оплата
230
Гг,ава 4
При изменении бонуса для учащегося в форме документа также необходимо выполнить подобный пересчет. Для этого можно ввести аналогичный текст в процедуру Прийзменении для поля ИндБонус. В результате пересчет будет выполняться И при изменениях В поле ИндБонус, И при изменениях В поле Сумма. На рис. 4.22 представлен результат работы рассмотренных процедур в режиме работы 1С П редприятие.
Рис. 4.22. Автоматическое заполнение полей документа
Однако подобное создание нескольких процедур с аналогичным текстом не украшает разработку. Более правильным будет выделение общей части программного кода и оформление его в виде одной процедуры. Рассмотрим, как это сделать для нашей конфигурации.
Необходимо выделить часть программного кода, расположенного в листинге 4.4, и оформить его в виде общей процедуры. Для этого обратимся к окну, отражающему дерево объектов конфигурации (рис. 4.23), и выделим пункт Общий модуль. Здесь с помощью контекстного меню создадим новый модуль, который назовем Общиепроцедуры. В этом модуле нам понадобится создать общую процедуру ПОД названием Вычисление (листинг 4.5), которая должна быть отмечена ключевым словом Экспорт.
Использование документов и регистров накопления
231
Рис. 4.23. Окно общего модуля ОбщиеПроцедуры
Примечание
Основным назначением общих модулей является размещение алгоритмов конфигурации, которые необходимо использовать в разных модулях.
;-?~Г ’ "аЗ	.. КдйЖ
Листчлг 4.5. Общая процедура & модуле общиеПроиедуры
Процедура Вычисление(ТабличнаяЧасть, ЭлементыФормы) Экспорт ТабличнаяЧасть ^ЭлементыФормы.Список.ТекущиеДанные; БонусДляОрганизации = ЭлементыФормы.Бонус.Значение; ИндивидуальныйБонус = ТабличнаяЧасть.ИндБонус;
ИтогБонус = БонусДляОрганизации + ИндивидуальныйБонус; ТабличнаяЧасть.СуммаСБонусом =
ТабличнаяЧасть.Сумма * (1 + ИтогБонус/100);
КонецПроцедуры
Созданная общая процедура далее будет использоваться в предопределенных процедурах, выполняемых при изменении в полях Инд бонус и Сумма. Для ЭТОГО В процедуру СписокСуммаПриИзменении необходимо внести изменения В соответствии с листингом 4.6.
Процедура СписокСуммаПриИзменении(Элемент)
ТабличнаяЧасть = ЭлементыФормы.Список.ТекущиеДанные;
Вычисление(ТабличнаяЧасть,ЭлементыФормы);
КонецПроцедуры
232
Гпава 4
Аналогичный текст следует внести в качестве процедуры, которая выполняется при изменениях в поле Инд бонус для индивидуального бонуса учащегося (листинг 4.7).
Листинг 41? Процедура, выполняегзя при мзь енении и поле ущдбонус	i
Процедура СписокИндБонусПриИзменении(Элемент)
ТабличнаяЧасть = ЭлементыФормы.Список.ТекущиеДанные;
Вычисление(ТабличнаяЧасть,ЭлементыФормы);
КонецПроцедуры
Если после записи описанных процедур перейти в режим 1С:Предприятие (рис. 4.24), то можно убедиться, что табличная часть документа заполняется автоматически. Теперь и при изменении индивидуального бонуса, и при изменении суммы производится пересчет в поле Сумма с бонусом.
Осталось выполнить еще одну функциональную доработку формы — при изменении в поле Бонус, расположенном в шапке документа, необходимо выполнить пересчет сумм (в поле СуммаСБонусом) для всех учащихся в табличной части документа. Для этого следует написать небольшую предопределенную процедуру (листинг 4.8), выполняемую при изменениях в поле Бонус. В этом тексте используется перебор строк табличной части документа и уже созданная разработка— процедура вычисление(ТекСтрокаСписок, Эле-ментыФормы).
:	’ sw —%	7: — ............7-;-..- —-  —.
Листинг4,Я. Процедура, выполняемая при изменении в поле ИнцБонус
Процедура БонусПриИзменении(Элемент)
Для Каждого ТекСтрокаСписок Из Список Цикл
Вычисление(ТекСтрокаСписок, ЭлементыФормы);
КонецЦикла;
КонецПроцедуры
Таким образом, необходимые действия по автоматизации заполнения формы документа, а также по пересчету оплаченных сумм при изменении бонусов выполнены. В результате документ Оплата обладает необходимыми сервисными функциями, выполняет движения по регистру накопления, и нам не хватает только печатной формы. К ее созданию мы еще вернемся, а сейчас разработаем документ, реализующий движение денежных средств в противоположном направлении (возврат денег учащимся по какой-либо причине).
Использование документов и регистров накопления
233
Рис. 4.24. Заполнение документа в режиме 1С:Предприятие
Документ Возврат
В случае отказа от обучения либо переплаты требуется вернуть переплаченные деньги слушателям, а также зарегистрировать это действие. Приступим к разработке нового документа, предназначенного для этого действия. На рис. 4.25 показана закладка Данные окна редактирования объекта конфигурации. Дополнительных реквизитов в области шапки мы создавать не будем, а в табличной части разместим два реквизита:
П Учащийся (тип Данных — СправочникСсьшка.Учащиеся);
П сумма (тип данных — число).
Следующая закладка, на которой мы должны выполнить некоторые действия — это Движения (рис. 4.26). В качестве регистра накопления следует указать РегистрОплаты. Далее воспользуемся конструктором движений (что уже мы делали при создании документа Оплата).
234
Глава »
Рис. 4.25. Закладка Данные документа Возврат
______________________________________________________________________________ ' файл лравта КонФ^арацйь Отладка, Адм 1нчг-трирое=чиё Серене Окне Справка
«Я
Основные
Данные
Нумерация
► Движения
Последовательности
Журналы
Формы
Макеты Подсистемы
Ввод на основании
Проведение:
Оперативное проведение: 'Разрешить
Удаление движений:
| ЕЬ Регистры накопления
Разрешить
Г Г	---------
5 Удалять движения автоматически»
'’’-ггттрЗшип '
Конструктор движений |
Рсги ТрОпЛ-ГГЬ'
1 Действия т । <Назед
Далее* J [ Закрыть
Справка ।
* «чя»
х
Рис. 4.26. Закладка Движения окна редактирования объекта РегистрОплаты
Основное окно конструктора движений следует заполнить в соответствии с рис. 4.27. Обратите внимание, что при создании документа Возврат, в отли
Использование документов и регистров накопления
235
чие от ранее разработанного оплата, необходимо сделать установку Расход, после чего осталось щелкнуть по кнопке ОК. В результате мы увидим на экране текст процедуры формирования движений по регистру накопления при проведении документа (листинг 4.9).
Рис. 4.27. Заполнение выражений в окне конструктора регистра
------- т------- --- '—   ...... ..... --
J 1йс ... и 4.9 Про! ,вдуоа выполняема? г.ти про ведении дою-^ен.е Bosepai MV м. «.V м3 м.лй 13	МЙ '	ГЛ	1'. -.— il U	..
Процедура ОбработкаПроведения(Отказ, Режим)
//( (_КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора,
// внесенные вручную изменения будут утеряны!!!
Для Каждого ТекСтрокаСписок Из Список Цикл
// регистр РегистрОплаты Расход
Движение = Движения.РегистрОплаты.Добавить();
Движение.ВилДвижения = ВидЦвкженияНакспления.Расход;
Движение. Период = Дата;
236
Гпава 4
Движение.Учащийся = ТекСтрокаСписок.Учащийся;
Движение.Сумма = ТекСтрокаСписок.Сумма;
Движение.СуммаСБонусом = ТекСтрокаСписок.Сумма;
КоненЦикла;
// записываем движения регистров
Движения.РегистрОплаты.Записать();
//)}__КОНСТРУКТОР_ДВИЖЕНИЙ_РЕГИСТРОВ
КонецПроцедуры
Принципиальное отличие данной процедуры от представленной в листинге 4.1 заключается в установке свойства ВидДвижения:
Движение.ВидДвижения = ВидДвиженияНакопления.Расход
Для иллюстрации выполненных действий на рис. 4.28 показан фрагмент формы списка регистра оплаты, в котором две строки соответствуют документам Возврат.
Рис. 4.28. Движения по документам Оплата и Возврат
Использование документов и регистров накопления 237
Отчеты по движению денежных средств
Для руководства любой организации требуется интегральная информация. В данном случае это итоговая информация по оплате. Наша конфигурация к настоящему моменту располагает документами для регистрации фактов оплаты и возврата денежных средств, а также в ней имеется регистр накопления для фиксации перемещения денежных средств. В этом разделе мы рассмотрим примеры построения ряда отчетов по оплате и возврату денежных сумм с помощью включенных в систему средств автоматизации.
Отчет Учет по возврату
В режиме конфигуратора начнем создание нового объекта конфигурации — в окне Конфигурация щелкнем правой кнопкой на разделе Отчеты. Далее на закладке Основные установим имя создаваемого отчета — УчетПоВозврату (рис. 4.29). После этого перейдем на закладку Макеты и с помощью кнопки Конструкторы воспользуемся инструментальным средством — конструктором выходной формы. В следующем появившемся окне можно оставить имя выходной формы, которое предлагается по умолчанию (рис. 4.30), после чего перед нами открывается окно конструктора выходной формы с набором закладок (рис. 4.31).
Таил Гравка Конфигурация Отладка Администрирование £ерви|_ Окна Справка
Рис. 4.29. Окно редактирования объекта конфигурации УчетПоВозврату
238
Гпава 4
Технология работы с конструктором выходной формы заключается в том, что визуальные действия пользователя трансформируются системой в программный код и необходимые вспомогательные объекты. Часто результатом работы конструктора отчета можно воспользоваться сразу, перейдя из конфигуратора в режим 1С:Предприятие. Возможно также, что необходимо предварительно скорректировать результат работы конструктора. И первый, и второй сценарии развития событий на практике достаточно распространены.
Рис. 4.30. Окно конструктора выходной формы
В разделе База данных на рис. 4.31 представлены объекты, имеющиеся в информационной базе. Так, если открыть ветку РегистрыНакопления, то мы увидим несколько таблиц. Воспользуемся одной из них— РегистрОплаты. Обороты, в которой присутствует информация и по приходу денежных средств, И ПО ИХ расходу (в отличие ОТ таблицы РегистрОплаты.Остатки' В которой отражаются только остатки по результатам движений).
Теперь с помощью верхней пиктограммы на серой полосе перенесем таблицу РегистрОплаты.Обороты в раздел Таблицы (рис. 4.32). Таким образом, единственная таблица, которая нам понадобится, выбрана. Далее из нее необходимо отобрать поля для создаваемого отчета. Нам потребуются поля учащийся и суммаРасход, которые мы и перенесем в раздел Поля.
Следует обратить внимание, что одновременно с полем Учащийся добавляется и представление (...). Это связано с тем, что поле Учащийся имеет ссылочный тип данных, и для получения информации по учащемуся в любом случае требуется извлекать данные по указанной ссылке. Такая ситуация возникает
Использование документов и регистров накопления
239
очень часто, и конструктор автоматически вместе со ссылкой добавляет еше и представление (...) — непосредственную информацию об учащемся.
Рис. 4.31. Окно конструктора выходной формы
ё Файл.Срама Крнфцгфаиня Отладка	Кпраега
Рис. 4.32. Выбор полей из таблицы РегистрОплатыОбороты
Результатом проделанных визуальных действий в конструкторе стал запрос (на обычном языке запросов системы 1С:Предприятие), текст которого можно увидеть при нажатии кнопки Запрос В листинге 4.10 представлен текст этого запроса.
240
Гпава 4
« Листинг 4.10; Запрос к базе данных для составления отчета
ВЫБ1 АТЬ
РегистрОплатыОбороты.Учащийся,
ПРЕДСТАВЛЕНИЕ(РегистрОплатыОбороты.Учащийся),
РегистрОплатыОбороты.СуммаРасход
ИЗ
Р^гистрНакопления.РегистрОплаты.Обороты КАК РегистрОплатыОбороты
В окне конструктора выходной формы много закладок, реализующих разнообразные функциональные действия. Фактически они позволяют заменить написание необходимых фрагментов на языке запросов (связанных с группировкой. заданием условий, включением итогов).
При составлении рассматриваемого отчета следует обратить внимание на закладку Отчет (рис. 4.33). Если вы параллельно выполняете описанные действия па компьютере, то почти все указанные установки уже сделаны по умолчанию. Подчеркнем только, что потребуется снять флажок Использовать построитель отчета. В этом случае мы отказываемся при создании отчета от использования объекта ПостроительОтчетов. Данный объект обеспечивает построение сложных отчетов, включающих в себя интерактивные действия со стороны пользователя. Однако и конструктор выходной формы позволяет создавать вполне профессиональные отчеты. В книге при построении отчетов мы этим конструктором и будем пользоваться, а что касается объекта ПостроительОтчетов, то можно порекомендовать читателям издания [1,2], где на примерах показаны ситуации, в которых этот объект востребован при разраб( >тках.
11родолжим работу' в конструкторе, и после закладки Отчет перейдем на закладку Выходная форма, чтобы убедиться в правильности установок, выполненных по умолчанию (рис. 4.34), после чего щелкнем по кнопке ОК, что завершит работу конструктора.
В результате диалога с конструктором выходной формы созданы следующие объекты:
П макет- с именем УчетПоВозврату (рис. 4.35), который можно найти, как мы уже знаем, па закладке Макеты;
П форма отчета, расположенная на закладке Формы:
П программный код (листинг 4.11), расположенный на дополнительной закладке Модуль окна редактирования формы отчета.
Использование документов и регистров накопления
241
Рис. 4.33. Установки на закладке Отчет в конструкторе выходной формы
Рис. 4.34. Установки на закладке Выходная форма в конструкторе выходной формы
\ Листинг 4.11. Содержание закладки Модуль окна формы УчетПоВозврату
Процедура ДействияФормыУчетПоВозвратуСформировать(Кнопка) //{{КОНСТРУКТОР__ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
242
Гпава 4
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, // внесенные вручную изменения будут утеряны!!!
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
УчетПоВозврату(ТабДок);
//}}К0НСТРУКТ0Р_ВЫХ0ДНЫХ_Ф0РМ_ПР0ЦЕДУРА_ВЫ30ВА
КонецПроцедуры
Процедура УчетПоВозврату(ТабДок) Экспорт //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(УчетПоВозврату) // Данный фрагмент построен конструктором.
// При повторном использовании конструктора,
// внесенные вручную изменения будут утеряны!!!
Макет — ОтчетОбъект.ПолучитьМакет("УчетПоВозврату");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
I	РегистрОплатыОбороты.Учащийся,
I	РегистрОплатыОбороты.Учащийся.Представление,
I РегистрОплатыОбороты.СуммаРасход
I ИЗ
I РегистрНакопления.РегистрОплаты.Обороты КАК
I	РегистрОплатыОбороты";
Результат = Запрос.Выполнить О;
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы"); ОбластьПодвалТаблицы =
Макет.ПолучитьОбласть("ПодвалТаблицы”);
ОбластьДетальныхЗаписей =
Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаДетали = Результат.Выбрать();
Использование документов и регистров накопления 243
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень()) ;
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
КонецПроцедуры
Теперь если в режиме 1С:Предприятие открыть раздел, соответствующий разработанному отчету, то нажатием кнопки Сформировать можно получить табличный документ с необходимой информацией (рис. 4.36) В верхней части этого рисунка показано окно формы списка регистра оплаты, что позволяет визуально проверить правильность отчета. Для этого достаточно просуммировать вручную суммы, возвращенные клиентами.
Таким образом, мы на несложном примере рассмотрели технические действия, которые следует выполнить при разработке отчета с помощью конструктора выходной формы. Далее в этой главе мы приведем еще несколько примеров построения отчетов.
Вкоифигура.пр - Конфигурации
У Файл Правка Таблица Конфигурация Отладка Администрирование Сервис Окна Справка
Рис. 4.35. Макет отчета УчетПоВозврату
244
Гпава 4
Файл Правка Операции Сервис. £)кна Справка
.-‘Л				
Действия * [♦*) ?	г ' д.		 г	
				
Ретстрэтор	Номер...-Активно'. ‘Период	• ’Учащийся	Сумма ’Сумма	С бонусом	Л'	
'Я Опозта 1 от...	11^	20.08 2CC715 2I 10 СщоровАВ.	1 сой	1 ас	
i — ^Возврат 1 от...	i2i.CE 2CCZ'J 46 51 ХицоровАВ	500:	500	
\ 4*; Оплата 2 от	1^	21.08.20079:4839 ХиаоровАВ.	2 900	2140	
: j 4- ^Оплата 2от ..	2>	21.08.2007 9:48:39 ’Афонин К.П.	1 000	1 100	
1 *4 ^Оплата 2 от...	3	21.08.2007 9:48:39 ;Пахомов В Ю.	5 0001	5 350'	
. j — ^Возврат 2 от...	1i^	21.08.2007 9:49:45 |АФонинК.П.	1 500	1 500	
j — i Возврат 3 от...	15	i 21 -0&.2007 10:10:57 ! Афонин К.П.	100,	100	..;
| — Возврат 3 от...	21 ✓	21.08.2007 1 0:16:57 .СнцопвАВ.	200'	200 v	
L	 .. . .......				
| ф Учат по аомчмгтэ				
Рис. 4.36. Форма списка регистра оплаты и учет по возврату
Отчет с детализацией поступлений и возвратов
Предыдущий отчет (рис. 4.36) позволял получить итоговую информацию по денежным суммам, возвращенным учащимися. Несколько усложним задачу, но перед ее формулировкой сначала на иллюстрации покажем — какой результат мы собираемся получить. На рис. 4.37 показана форма с табличным документом, в котором отражается детальная информация, как по внесенным денежным средствам, так и по возвращенным суммам. Для этого в верхней части формы присутствует поле с надписью Вид движения, в котором пользователь перед заполнением отчета предварительно должен указать, что его интересует (Расход или Приход). После этого нажатие кнопки Сформировать приводит к заполнению отчета. В левой части рис. 4.37 располагаются стандартные элементы управления, которые позволяют по желанию пользе-
Использование документов и регистров накопления
245
вателя либо скрыть, либо наоборот отобразить детальную информацию. В данном случае на рисунке отражены все возвращенные учащимися суммы.
Рис. 4.37. Отчет Учет в режиме 1С:Предприятие
Начнем в конфигураторе уже знакомые действия по составлению отчета. В качестве имени выберем Учет, после чего перейдем на закладку Макеты, где воспользуемся конструктором выходной формы.
На рис. 4.38 показана закладка Таблицы и поля окна конструктора. Здесь нам потребуется непосредственно таблица РегистрОплаты, в которой хранятся все отдельные движения по данному регистру. Из полей этой таблицы для отчета необходимы следующие четыре:
СЗ РегистрОплаты.Учащийся;
ГЗ РегистрОплаты.Учащийся.Представление;
ГЗ РегистрОплаты.ВидДвижения;
ГЗ РегистрОплаты.СуммаСБонусом.
На закладке Условия следует указать условие (рис. 4.39), позволяющее формировать информацию либо по поступлению денежных средств, либо по их расходованию. Выполненные визуальные установки самостоятельно трансформируются в конструкцию текста запроса.
246
Гпава 4
Рис. 4.38. Окно конструктора выходной формы
Рис. 4.39. Установки на закладке Условия в окне конструктора
Далее нам понадобится закладка Итоги, где следует также выполнить ряд установок (рис. 4.40). Как видно, мы указали поле для группировки при вычислении итогов — Учащийся, а суммироваться результаты будут по интересующему нас параметру— СуммаСБонусом. Также отметим флажком необходимость вывода общих итогов: для отчета это весьма полезно.
Еще одна закладка, которая нам понадобится — Выходная форма
(рис. 4.41). Важно указать в списке параметров ВидДвижения, что позволит
Использование документов и регистров накопления
247
на форме выбирать вариант составления отчета — по поступлению либо по расходу.
Рис. 4.40. Закладка Иго*и окна конструктора выходной формы
Рис. 4.41. Закладка Выходная форма окна конструктора выходной формы
248
Гпава 4
Закладка Выходная форма позволяет установить еще ряд параметров — название выходной формы, место расположения процедуры, генерируемой конструктором, заголовок выходной формы и заголовок для кнопки. Их значения в нашем случае можно оставить такими, как они определены конструктором по умолчанию. Однако при необходимости их можно изменить.
Теперь нажатие кнопки ОК приводит к формированию макета, формы и программного кода. Форма отчета в режиме конфигуратора приведена на рис. 4.42. После перехода в режим 1С:Предприятие мы увидим результат, с которого мы начали этот раздел (см. рис. 4.37).
Рис. 4.42. Окно редактирования отчета Учет
Результат получен, но нам предстоит изучить выполненные конструктором выходной формы действия. Щелчок по кнопке Запрос позволяет увидеть на экране результат выполнения визуальных действий в виде текста запроса (листинг 4.12).
На первый взгляд кажется, что язык запросов можно и не знать, если есть подобный конструктор. Однако на практике разработчики пользуются и подобной автоматизацией, и непосредственным программированием. Полезно и другое возможное использование конструктора запросов: им удобно пользоваться на этапе изучения языка. Выполнив разработку с помощью конструктора и убедившись в ее работоспособности в режиме 1С:Предприятие, можно посмотреть, как правильно построить запрос.
Использование документов и регистров накопления	249
Листинг 4.12 Содер? .анис запроса для за полианит отчета Учет	I
й .. «™	s»»„,.	.....>W....	 Ж fcau.	~ S3
ВЫБРАТЬ
РегистрОплаты.Учащийся КАК Учащийся,
ПРЕДСТАВЛЕНИЕ(РегистрОплаты.Учащийся) ,
РегистрОплаты.ВидЦвижения,
РегистрОплаты.СуммаСБонусом КАК СуммаСБонусом
ИЗ
РегистрНакопления.РегистрОплаты КАК РегистрОплаты
ГДЕ
РегистрОплаты.ВидЦвижения = ЬВидЦвижения
ИТОГИ
СУММА(СуммаСБонусом)
ПО ОБЩИЕ, Учащийся
Текст запроса представляет только часть процедуры Учет, которая заполняет форму отчета данными. В листингах 4.13 и 4.14 приведены полные тексты автоматически созданных процедур, программные конструкции которых нам в основном знакомы, но несколько новых моментов мы прокомментируем.
Процедура ДействияФормыУчетСформировать(Кнопка)
//{{КОНСТ РУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(Учет)
// Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения // будут утеряны!!!
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
Учет(ТабДок, ВидЦвижения);
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА
КонецПроцедуры
р *-ттг!оегц?г>	.-тсдты;- дзввяд utsuu яиз<зее~жз8?
Листинг 4,14. Процедура генерирования отчета	:j
Процедура Учет(ТабДок, ВидЦвижения) Экспорт //{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(Учет)
250
Гпава 4
II Данный фрагмент построен конструктором.
// При повторном использовании конструктора, внесенные вручную изменения // будут утеряны!1!
Макет = ОтчетОбъект.ПолучитьМакет("Учет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
I	РегистрОплаты.Учащийся КАК Учащийся,
I	ПРЕДСТАВЛЕНИЕ(РегистрОплаты.Учащийся) ,
I	РегистрОплаты.ВидЦвижения,
I	РегистрОплаты.СуммаСБонусом КАК СуммаСБонусом
|ИЗ
I	РегистрНакопления.РегистрОплаты КАК РегистрОплаты
1ГДЕ
I	РегистрОплаты.ВидЦвижения = &ВидЦвижения
|ИТОГИ
I	СУММА(СуммаСБонусом)
|П0
I	ОБЩИЕ,
I	Учащийся";
Запрос.УстановитьПараметр("ВидЦвижения", ВидЦвижения);
Результат ~ Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал - Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
ОбластьУчащийся = Макет.ПолучитьОбласть("Учащийся");
ОбластьДетальныхЗаписей — Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаОбщийИтог =
Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаОбщийИтог.Следующий();	II Общий итог
ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
iИспользование документов и регистров накопления
251
ВыборкаУчащийся =
ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаУчащийся.Следующий() Цикл
ОбластьУчащийся.Параметры.Заполнить ВыборкаУчащийся);
ТабДок.Вывести(ОбластьУчащийся, ВыборкаУчащийся.Уровень());
ВыборкаДетали = ВыборкаУчащийся-. Выбрать () ;
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей,
ВыборкаДетали.Уровень());
КонецЦикла;
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
КонецПроцедуры
Ранее мы пользовались достаточно простой конструкцией для получения выборки результата запроса:
Результат = Запрос.Выполнить().Выбрать()
Здесь к объекту, представленному переменной Запрос, применяется метод выполнить о. В результате создается другой объект (РезультатЗапроса), содержащий полученные при выполнении запроса данные. Уже к этому объекту в свою очередь применяется метод выбрать о, который создает следующий объект (выборкаИзРезультатаЗапроса), представленный в переменной Результат.
В тексте листинга 4.13 приводится следующий вариант метода выбрать ():
ВыборкаОбщийИтог =
Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам,
В этой конструкции параметр метода определяет способ обхода выборки запроса. По умолчанию предполагается прямой способ обхода. Это приводит к тому, что выборка будет выдавать записи в той последовательности, в которой они располагаются в результате запроса. Для получения подобного обхода необходимо вызвать метод Выбрать объекта РезультатЗапроса без параметров либо С параметром ОбходРезультатаЗапроса.Прямой.
252
Гпава 4
Другой вариант обхода результата запроса— иерархический. При таком способе будут извлекаться только записи, находящиеся на одном уровне. В этом случае метод выбрать () следует вызывать с параметром 0бходрезультата3аг.ро-са. Погруппировкамсиерархией. Это приведет к тому, что в выборке из результата окажутся только записи, находящиеся на самом высоком уровне иерархии.
Третий возможный вариант обхода результата — по группам. В этом случае в качестве параметра метода необходимо задать ОбходРезультатаЗапро-са.ПоГруппировкам. При таком способе обхода записи с иерархическими итогами при обходе рассматриваются как детальные.
Вообще, попробовав работу с отчетом (рис. 4.37), вы, несомненно, найдете ее удобной. При этом все основные шаги за нас выполнил конструктор. В качестве логического завершения проделанной работы можно предложить некоторое улучшение оформления отчета, например, в виде, представленном на рис. 4.43. Для этого требуется лишь небольшая корректировка макета.
Рис. 4.43. Результат доработки макета отчета
Итоговый отчет по оплате
В рассмотренной задаче наиболее востребованным для управляющего звена организации является отчет, в котором приводится полный список учащихся
Использование документов и регистров накопления
253
(слушателей курсов) вместе с указанием напротив каждой фамилии — кто и сколько оплатил (с учетом бонусов и возвратов денежных средств нашей организацией). В связи с тем, что данная информация находится и в справочнике Учащиеся и в регистре накопления по оплате, нужный в этом случае запрос будет несколько сложнее.
В конфигураторе начнем создание нового отчета— назовем его Итоговый отчет— с помощью конструктора выходной формы, как мы делали ранее. После уже привычных вступительных действий перейдем на закладку Макеты и начнем работу с конструктором выходной формы. На рис. 4.44 показана закладка Таблицы и поля, где начинаются первые существенные действия.
Рис. 4.44. Окно конструктора выходной формы
Из раздела База данных в данном случае необходимо выбрать две таблицы. Первая таблица представляет собой справочник Учащиеся, а вторая — это виртуальная таблица РегистрОплаты. Остатки. После этого в раздел Поля отберем Учащиеся.Ссылка и РегистрОплатыОстатки.СуммаСБонусомОстатки. Автоматически вместе с параметром Учащиеся. Ссылка в список отобранных полей записывается И Учащиеся.Представление.
Выбранные таблицы связаны между собой по учащемуся, и эту связь для конструктора запросов необходимо уточнить. Для этого следует перейти на закладку Связи, где видно, что конструктор практически самостоятельно установил связь между таблицами (рис. 4.45). Нам требуется только разобраться с флагами Все. Установка этого флага для первой таблицы означает,
254
Гпава 4
что из справочника извлекаются все элементы (левое внешнее объединение), что как раз и требуется для нашего отчета.
Осталось выполнить установки на закладках Итоги (рис. 4.46) и Отчет (рис. 4.47), после чего с помощью щелчка по кнопке Запрос можно посмотреть текст сформированного конструктором запроса (листинг 4.15).
Рис. 4.45. Закладка Связи окна конструктора выходной формы
Рис. 4.46.- Закладка Итоги окна конструктора выходной формы
ВЫБРАТЬ
Учащиеся.Ссылка КАК Ссылка,
Учащиеся.Представление КАК Представление,
Использование документов и регистров накопления 255
РегистрОплатыОстатки.СуммаСБонусомОстаток КАК
СуммаСБонусомОстаток
ИЗ
Справочник.Учащиеся КАК Учащиеся
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.РегистрОплаты.Остатки КАК РегистрОпла тыОста тки
ПО РегистрОплатыОстатки.Учащийся = Учащиеся.Ссылка
ИТОГИ СУММА(СуммаСБонусомОстаток) ПО
ОБЩИЕ
На рис. 4.48 показан отчет с итоговыми показателями по оплатам, в котором присутствует и фамилия учащегося, пока не вносившего плату за обучение. В принципе, все нормально: приведенные примеры использования конструктора выходной формы должны помочь читателям при разработке отчетов в собственных конфигурациях. Однако кроме текстовой информации отчеты принято дополнять еще и более наглядными иллюстрациями. Одним из оформительских элементов отчета являются диаграммы, и в конце главы мы увидим — как в этом плане можно заметно улучшить отчет.
Рис. 4.47. Закладка Отчет окна конструктора выходной формы
Доработка документа Оплата
Ранее, когда мы создавали документ Оплата, говорилось, что при его заполнении неплохо бы предоставить пользователю возможность просмотра оплат
256
Гпава 4'
(и возвратов денежных средств) прямо на форме документа. Это может понадобиться при оперативной корректировке бонуса для конкретного слушателя. Перед описанием технических действий мы сразу поясним на примере (рис. 4.49), что собираемся сделать. Например, пользователь выбрал конкретную организацию и подготовился к внесению информации по оплатам. При этом табличная часть документа автоматически (точнее, за счет ранее разработанной процедуры) заполнилась фамилиями слушателей от указанной организации. В соответствии с рис. 4.49 первый человек в списке — Сидоров А. В. От пользователя в режиме 1С:Предприятие требуется внести в создаваемый документ очередную сумму, которую он только что оплатил. При этом в зависимости от ситуации сотрудник нашего учебного центра может по своему желанию внести (или скорректировать) индивидуальный бонус.
Для того чтобы принять более взвешенное решение о корректировке, щелчком по кнопке Отчет по оплате сотрудник может открыть информацию по движениям денежных средств, связанных с выбранным учащимся в табличной части документа, и только после этого установить желаемое значение в поле для индивидуального бонуса. Теперь ранее разработанная процедура выполняет пересчет в поле Сумма с бонусом.
Рис. 4.48. Итоговый отчет в режиме 1С:Предприятие
Использование документов и регистров накопления
257
Рис. 4.49. Отчет по учащемуся, открываемый на форме документа
Теперь попробуем реализовать сказанное на практике. В режиме конфигуратора в окне редактирования документа Оплата перейдем на закладку Макеты, где создадим новый макет. При этом не будем пользоваться конструктором, а все технические операции выполним вручную. В нашем макете (рис. 4.50) будут три секции — Заголовок, Шапка, и Строка. Для ячеек макета подберем необходимый шрифт и заливку.
Рис. 4.50. Макет для отчета по учащемуся
Перейдем на закладку Формы, где от нас потребуется разместить на уже имеющейся форме кнопку (рис. 4.51). После этого осталось на закладке Мо
258
Гпава 4
дуль написать процедуру (листинг 4.16), выполняемую при нажатии на только что созданную кнопку.
Рис. 4.51. Изменение формы документа Оплата
Процедура ОтчетПоОплатеНажатие(Элемент)
Запрос = НовыГ- Запрос;
Запрос. Текст «=
"ВЫБРАТЬ
I	РегистрОплаты.Учащийся КАК Учащийся,
I	РегистрОплаты.Учащийся.Представление,
|	РегистрОплаты.ВидДвижения КАК Вид,
I	РегистрОплаты.Сумма КАК Сумма
|ИЗ
I	РегистрНакопления.РегистрОплаты КАК РегистрОплаты
|ГДЕ
I	Учащийся = &Учащийся";
ТабличнаяЧасть = ЭлементыФормы.Список.ТекущиеДэнные;
Учащийся = ТабличнаяЧасть.Учащийся;
Использование документов и регистров накопления 259
Запрос.УстановитьПараметр("Учащийся", Учащийся);
Результат = Запрос.Выполнить().Выбрать();
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.Оплата.ПолучитьМакет("Макет");
// Заголовок
Область = Макет.ПолучитьОбласть("Заголовок");
ТабДок.Вывести(Область);
// Шапка
Область = Макет.ПолучитьОбласть("Шапка") ;
ТабДок.Вывести(Область) ;
// ОплатаКурсов
Пока Результат.Следующий() Цикл
Об часть = Макет.ПолучитьОбласть("Строка");
Область.Параметры.Учащийся = Результат.Учащийся;
Область.Параметры.Вид = Результат.Вид;
Область.Параметры.Сумма = Результат.Сумма;
ТабДок.Вывести(Область);
КонецЦикла;
ТабДок.ОтображатьСетку = Ложь;
ТабДок.Защита = Ложь;
ТабДок.ТолькоПросмотр = Ложь;
ТабДок.ОтображатьЗаголовки = Ложь;
ТабДок.Показать();
КонецПроцедуры
В запросе используется параметр учащийся, значение которого устанавливается по строке табличной части документа— по указанному учащемуся. Для этого в процедуре используется следующий фрагмент:
ТабличнаяЧасть = ЭлементыФормы.Список.ТекущиеДанные;
Учащийся= ТабличнаяЧасть.Учащийся;
Итоговый отчет с диаграммой
До настоящего времени все рассматриваемые отчеты были чисто табличного плана, и не включали в себя дополнительные элементы. Известно, что в ряде случаев включение различных диаграмм существенно улучшает восприятие информации. В системе 1С:Предприятие имеется элемент управ
260
Гпава 4
ления Диаграмма, который представляет собой ресурс, с помощью которого можно размещать на форме и в табличном документе различные диаграммы и графики.
Наверняка большинство читателей хорошо знакомы с приложением Microsoft Excel, поэтому и с диаграммами встречались неоднократно. Как и в Microsoft Excel, в системе 1С:Предприятие существует возможность отображения данных с помощью диаграмм различных типов.
Объект Диаграмма системы 1С:Предприятие имеет достаточно сложную организацию и содержит три области:
Г) область построения;
Г) область заголовка;
П область легенды.
Диаграмма может быть либо размещена на форме, либо вставлена в табличный документ. Нашей задачей сейчас будет создание отчета, включающего табличные данные вместе с диаграммой. Как мы уже делали ранее, перед описанием технических действий сначала проиллюстрируем результат, который собираемся получить: он показан на рис. 4.52. Из рисунка видно, что внешне он заметно отличается от созданных нами ранее. Отличие связано, прежде всею, с присутствием в правой части формы объемной диаграммы.
Рис. 4.52. Итоговый отчет по приходу денежных средств
Использование документов и регистров накопления
261
Работа для пользователя с подобной формой принципиально не отличается от отчетов, с которыми мы сталкивались до этого. После выбора вида движения (приход или расход) в поле ввода, щелчком по кнопке Сформировать можно одновременно и заполнить отчет, и отобразить на диаграмме итоговые показатели по каждому учащемуся. Для этого в отчете производится группировка оплат по каждому учащемуся. Если же мы хотим увидеть возвращенные суммы, то следует указать в качестве вида движения — Расход. В этой ситуации отчет приведен на рис. 4.53.
Рис. 4.53. Итоговый отчет по расходу
Рассмотрим, каким образом можно создать подобный отчет с помощью конструктора выходной формы. На рис. 4.54 показана закладка Таблицы и поля Окна КОНСТруКТОра. В Отчет МЫ ВКЛЮЧИМ информацию ИЗ Объекта РегистрОплаты.
На закладке Условия необходимо будет ввести условия для поля Ви-Движе-нил. Фактически данная закладка должна выглядеть так, как мы ее уже оформляли в одном из предыдущих отчетов (см. рис. 4.39). Это же касается и заполнения закладок Итоги и Выходная форма (сделаем на них установки в соответствии с рис. 4.40 и 4.41). А на'закладке Отчет необходимо сделать установки, показанные на рис. 4.55. Следует отметить, что нам понадобится и
262
Гпава 4
объект Табличный документ, и объект Диаграмма. Следует также убрать флажок Использовать построитель отчета.
Рис. 4.54. Закладка Таблицы и поля окна конструктора выходной формы
Рис. 4.55. Закладка Отчет окна конструктора выходной формы
Вот, в общем-то, и все. Теперь при переходе в режим работы ^^Предприятие мы увидим отчет с диаграммой (рис. 4.56)’, которая его дополняет и делает более наглядным.
Использование документов и регистров накопления
263
Рис. 4.56. Отчет с диаграммой
Рис. 4.57. Окно свойств заголовка диаграммы
264	Гпава 4
Поработав с отчетом, попробуем немного изменить его оформление. Конструктор выходной формы выполнил несколько действий, и одним из итогов его работы стало появление на закладке Формы новой формы. На диаграмме можно выделить три области (область построения, легенды и заголовка). Значения свойств этих областей можно изменять, чтобы придать отчету необходимый вид. Как показано на рис. 4.57, мы изменили расположение и содержания заголовка диаграммы, а также размеры областей, отводимых для таблицы отчета и диаграммы.
На закладке Модуль конструктор расположил созданные им процедуры:
О ДействияФормыИтоговыйОтчетСформировать;
п ИтоговыйОтчет.
Полный текст этих процедур приведен в листинге 4.17.
Листинг 4,17. Процедура формирования отчета	3
......................1.......^..	лй,	!..Л. .....	лйл.....;:
Процедура ДействияФормыИтоговыйОтчетСформировать(Кнопка)
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ_ПРОЦЕДУРА_ВЫЗОВА(ИтоговыйОтчет)
// Данный фрагмент построен конструктором.
ТабДок = ЭлементыФормы.ПолеТабличногоДокумента;
Диаграмма = ЭлементыФормы.Диаграмма;
ИтоговыйОтчет(ТабДок, Диаграмма, ВидДвижения);
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ Ф0И1_ПР0ЦЕДУРА_ВЫ30ВА
КонецПроцедуры
Процедура ИтоговыйОтчет(ТабДок, Диаграмма, ВидДвижения) Экспорт
//{{КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ(ИтоговыйОтчет)
// Данный фрагмент построен конструктором.
Макет = ОтчетОбъект.ПолучитьМакет("ИтоговыйОтчет");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
I	РегистрОплаты.Учащийся КАК Учащийся,
I	РегистрОплаты.Учащийся.Представление КАК УчащийсяПредставление,
I	РегистрОплаты.СуммаСБонусом КАК СуммаСБонусом
|ИЗ
I	РегистрНакопления.РегистрОплаты КАК РегистрОплаты
|ГДЕ
I	РегистрОплаты.ВидДаижения = &ВидЦвижения
Использование документов и регистров накопления
265
IИТОГИ СУММА(СуммаСБонусом) ПО
|	ОБЩИЕ,
I	Учащийся";
Запрос.УстановитьПараметр("ВидЦвижи ия", ВидЦвижения);
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОоластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
ОбластьУчащийся = Макет.ПолучитьОбласть("Учащийся");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
Диаграмма.Обновление = Ложь;
Диаграмма.Очистить();
Диаграмма.АвтоТранспонирование = Ложь;
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаОбщийИтог =
Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаОбщийИтог.Следующий();	// Общий итог
ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
Точка = Диаграмма.УстановитьТочку("СуммаСБонусом");
ВыборкаУчащийся =
ВыборкаОбщийИтог.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаУчащийся.Следующий() Цикл
ОбластьУчащийся.Параметры.Заполнить(ВыборкаУчащийся);
ТабДок.Вывести(ОбластьУчащийся, ВыборкаУчащийся.Уровень());
Серия = Диаграмма.УстановитьСерию(ВыборкаУчащийся.Учащийся);
Серия.Текст = ВыборкаУчащийся.УчащийсяПредставление;
Серия.Расшифровка = ВыборкаУчащийся.Учащийся;
Диаграмма.УстановитьЗначение(Точка, Серия, ВыборкаУчащийся.СуммаСБонусом, Серия.Расшифровка);
ВыборкаДетали = ВыборкаУчащийся.Выбрать();
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
266
Гпава 4
ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетали.Уровень());
КонецЦикла;
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);	<
ТабДок.Вывести(ОбластьПодвал);
Диаграмма.АвтоТранспонирование = Истина;
Диаграмма.Обновление = Истина;
//}}КОНСТРУКТОР_ВЫХОДНЫХ_ФОРМ
КонецПроцедуры
В следующей главе мы еще вернемся к отчетам. В частности, рассмотрим создание сводных таблиц в стиле аналогичного отчета в приложении Microsoft Excel.
Итоги
Еще одна глава завершена. Посмотрим, что же она нам дала? Во-первых, мы познакомились с важным объектом конфигурации— регистром накопления. Рассмотренные примеры продемонстрировали роль таких регистров при организации механизма учета.
Во-вторых, мы рассмотрели механизм проведения документов, который позволяет обеспечить автоматическое изменение состояния учета в информационной системе. Это очень важный рес> рс, активно используемый специалистами в разработках прикладных решений на платформе 1С:Предприятие 8.
В-третьих, большое внимание в главе было уделено формированию отчетов, которые всегда являются завершающей частью офисной работы. Автоматизация при формировании отчетов и минимизация рутинных операций определяет производительность труда в современном делопроизводстве. Большинство разработок мы выполнили с использованием конструкторов. Это помогает разработчику существенно ускорить технологический процесс создания прикладных решений на платформе 1С:Предприятие. Однако часто в практической работе требуется ручное программирование или корректировка автоматически сформированного программного кода. В этом плане полезным должен быть пример, где рассмотрено создание отчета без использования дополнительных технических средств. Для отображения информации в приведенных примерах использовались как табличные документы, так и диаграммы.
Г ЛАВА 5
Автоматизация работы с данными
К настоящему моменту мы разобрали большое количество практических примеров, дающих представление о технологии разработки конфигураций для платформы 1С:Предприяти£ 8. В предыдущих главах мы работали с такими объектами конфигурации, как перечисления, справочники, документы, отчеты, регистры сведений и регистры накопления. Рассмотрев большое количество программных процедур, мы познакомились с объектами системы 1С:Предприятие, с их свойствами и методами. Большое внимание было уделено подчиненным объектам конфигурации — формам, табличным частям, макетам. Все это должно сформировать у читателей цельное представление о разработке прикладных решений на платформе 1С:Предприятие 8.
Однако в данную систему заложены практически неисчерпаемые ресурсы для разработчиков, и к настоящему моменту уже выпущено ряд изданий, раскрывающих секреты мастерства профессионального разработчика [1—4]. В данной главе мы рассмотрим еще ряд технических возможностей, которые представляются наиболее интересными в практическом плане.
Начнем создание новой конфигурации, которая будет включать в себя необходимые объекты и программные процедуры, что в итоге обеспечит автоматизацию деятельности по документообороту нашего учебного центра. Хотя тематика разработки сохраняется, основной акцент при создании конфигурации мы сделаем на особенностях, которые в предыдущих разделах еще не встречались. Большое внимание будет уделено построению разнообразных отчетов и обмену информацией с популярными офисными приложениями (Microsoft Word и Microsoft Excel).
268
Гпава 5
Ранее в главе 2 в одном из примеров была рассмотрена возможность внесения изменений с помощью процедуры на встроенном языке 1С в уже имеющийся документ, созданный в приложении Microsoft Word. Здесь данная тема получит развитие— и мы рассмотрим несколько ситуаций, когда потребуется интеграция различных приложений. При этом приведенные примеры будут охватывать наиболее популярные технологии для реализации обмена данными. Рассмотрение программных процедур позволит читателям успешно справиться и с решением собственных аналогичных задач.
Постановка задачи
Основная тематика предыдущих глав касалась учета оплаты за обучение организации, предоставляющей платные образовательные услуги. В этой главе мы автоматизируем учет начислений преподавателям за проведенные занятия.
Известно, что во всех учебных заведениях и центрах подготовки существует несколько видов (категорий) занятий. Мы ограничимся для определенности лекциями, практическими занятиями и консультациями (могут быть и другие, но в последующем примере остановимся на таком наборе). Эти занятия, как правило, по-разному тарифицируются (т. е. почасовая оплата труда преподавателей различна). Преподаватель, проведя некоторое количество часов учебной нагрузки определенного вида, должен получить сумму, являющуюся результатом умножения количества часов на тариф. Для этого в информационной базе следует учитывать различные виды занятий, проведенные сотрудниками. Разрабатываемые в данной главе объекты конфигурации, как и прежде, будут предназначаться для ввода исходных данных, а также получения разнообразной итоговой информации по работе учебного центра.
Начнем практическую работу с размещения информации о тарифах (их названий и стоимости). Для этого мы создадим два объекта конфигурации — перечисление Виды занятии и регистр сведений Тарифы.
Информация о тарифах
Практические действия в системе начнем с создания новой информационной базы, первым объектом конфигурации в которой будет перечисление (рис. 5.1).
Автоматизация работы с данными
269

' Файг Правк у Кономгурсц я Отладке Администрирование £ pm.с Дкнгг
Для получения подсказки нЗЪкмиге F1
Рис. 5.1. Закладка Основные окна редактирования перечисления ВидыЗанятий
Значения, составляющие перечисление Виды запятим, являются названиями тарифов, поэтому заполним закладку Данные так, как показано на рис. 5.2.
Теперь мы создадим периодический регистр сведений тарифы, в который, как следует из названия, будут заноситься тарифы занятий (разные виды занятий по-разному тарифицируются). Подобное название уже встречалось в главе 2, но, поскольку конфигурации независимы, какой-либо путаницы здесь возникать не должно. Напомним, что ранее подразумевалась тарификация оплаты за обучение, а сейчас имеется в виду тарификация оплаты преподавателей.
На практике тарифы с течением времени меняются. В нашем случае будем считать, что они изменяются с периодичностью, не чаще одного раза в месяц. Чтобы реализовать это в нашей конфигурации, необходимо сделать соответствующую установку в окне редактирования объекта конфигурации (рис. 5.3). Здесь же следует установить режим записи в регистр— Независимый После этого следует перейти на закладку Данные (рис. 5.4) и определить измерения и ресурсы регистра. Создадим одно измерение — ВидЗанятия (тип данных — перечислениеСсылка. ВидыЗанятий). Другим измерением регистра является период, но это измерение добавляется автоматически, поскольку мы установили параметр Периодичность. Ресурс регистра сведений назовем ВеличинаТарифа и присвоим ему тип данных число.
Из конфигуратора перейдем в режим 1С:Предприятие и с помощью экранной формы внесем в регистр сведений информацию о тарифах (рис. 5.5).
270
Гпава 5
Рис. 5.2. Значения перечисления Виды занятий
Рис. 5.3. Закладка Основные окна редактиоования регистра сведений тарифы
Примечание
Возможна ситуация, когда требуется организ :вать изменения в тарифах чаще, чем ежемесячно. В этом случае следует просто уменьшить значение периодичности в окне редактирования регистра сведений.
Автоматизация работы с данными
271
Рис. 5.4. Закладка Данные окна редактирования регистра сведений Тарифы
Рис. 5.5. Заполнение информацией регистра сведений тарифы в режиме 1С:Предприятие
Этап подготовительной работы по созданию необходимых объектов конфигурации еще не завершен, и до разработки программных процедур нам потребуется несколько вспомогательных справочников.
272
Гпава 5
Вспомогательные справочники
Прежде всего, необходимо создать справочник Преподаватели, в котором будут перечислены фамилии (с инициалами) преподавателей нашего учебного центра. Этот объект конфигурации не будет содержать дополнительных реквизитов, и каких-то особенностей при работе с формой справочника нам не потребуется. Один из вариантов заполненной формы списка, генерируемой по умолчанию, приведен на рис. 5.6.
Рис. 5 6 Заполнение справочника Преподаватели в режиме 1С:Предприятие
Другой справочник— группы отражает названия учебных групп (рис. 5.7). В нем кроме кода и наименования добавлен еще реквизит количество для отражения количества учащихся в каждой группе. Как и при заполнении первого справочника, мы используем форму списка, генерируемую системой по умолчанию. Заполненная форма списка показана на рис. 5.8.
Документ Учет
После создания и заполнения информацией справочников перейдем к разработке документа для фиксации сумм, начисленных преподавателям за проведенные занятия Для этого в режиме конфигуратора создадим новый объект конфигурации — документ Учет. В области шапки разместим только один
Автоматизация работы с данными 273
дополнительный реквизит— ДатаРасчета, который будет использоваться для внесения даты, на которую мы собираемся производить расчет заработанных сумм. Сами суммы будут размещаться в табличной части документа. Это связано с тем, что дата создания документа и дата расчета могут отличаться, а тарифы в нашей ситуации привязаны к дате.
Рис. 5.7. Закладка Данные окна редактирования справочника группы
Рис. 5.8. Заполнение форме! списка справочника Группы в режиме 1С:Предприятие
274
Гпава 5
Использование реквизита ДатаРасчета позволяет в режиме 1С:Предприятие извлекать информацию из регистра сведений тарифы о величине тарифа на тот месяц, который указан в этом реквизите.
В окне редактирования объекта конфигурации (рис. 5.9) необходимо создать табличную часть (имя — Список), в которой разместим несколько реквизитов:
□	Преподаватель (информация О преподавателе, ТИП данных— СправочникСсылка .Преподаватели);
□	Группа (данные о группе, с которой проводились занятия, тип данных — СправочникСсылка.Группы);
ВидЗанятия (тип данных — ПеречислениеСсылка. ВидыЗанятий);
а ЧислоЧасов (тип данных — число);
П тариф (тип данных — число);
□	Сумма (тип данных — число).
Рис. 5.9. Закладка Данные окна редактирования документа Учет
Автоматизация работы с данными
275
В связи с тем, что в дальнейшем нам придется программировать интерактивные действия пользователя, форма документа, генерируемая по умолчанию, здесь нам не подойдет. Поэтому создадим пользовательскую форму документа (рис. 5.10), выполнив уже изученные нами действия.
Процедуры обработки событий на форме документа
В форму документа необходимо заложить удобный сервис для работы пользователя. Поэтому перейдем к программированию событий, связанных с расположенными на форме элементами управления. Но сначала поясним, как выглядит в целом процесс заполнения данного документа пользователем.
Рис. 5.10. Форма документа Учет
Сотрудник учебного центра при создании нового документа вида Учет сначала заполняет расположенное в области шапки поле Дата расчета, которое определяет, на какую дату мы собираемся производить расчет начислений преподавателям. После этого производится внесение информации в табличную часть. При вводе очередной строки в первую очередь необходимо заполнить поле Преподаватель (в этом случае автоматически открывается список преподавателей из соответствующего справочника). Следующее поле для
276 Глава 5
заполнения— группа, для чего также используется соответствующий справочник. Еще одно поле, вид занятия, заполняется из набора значений ранее созданного перечисления, но здесь требуется реализовать определенную автоматизацию. А именно при выборе вида занятия в поле Тариф должно автоматически подставляться значение тарифа на дату, ближайшую к дате расчета (точнее на дату не позже даты расчета). В этом случае мы должны оформить соответствующим образом обработку события приИзменении для поля ВидЗанятия. В листинге 5.1 приведена программная процедура, реализующая такое заполнение.
?   «вК’- таи.™
: Листинг 5.1. Процедура заполнения поля Тариф при пыборе вица снятия ....	.. „г.-..... ...;:......................... .. 9. 
Процедура СписокВидЗанятияПриИзменении(Элемент)
Для Каждого ТекСтрокаСписок Из Список Цикл
СтруктураОтбора = Новый Структура;
СтруктураОтбора.Вставить("ВидЗанятия",
ТекСтрокаСписок.ВидЗанятия);
СтруктураРесурсов = РегистрыСведений.Тарифы.
ПолучитьПоследнее(ДатаРасчета, СтруктураОтбора);
ТекСтрокаСписок.Тариф = СтруктураРесурсов.ВеличинаТарифа;
КонецЦикла;
КонецПроцедуры
В процедуре организован перебор строк табличной части документа:
Для Каждого ТекСтрокаСписок Из Список Цикл
Это позволяет отобрать ближайшее к дате расчета значение тарифа. В процессе перебора строк используется метод ПолучитьПоследнеео, который стоит прокомментировать. Вообще, для получения информации о значении ресурса регистра сведений можно использовать метод Получить о. В этом случае мы можем выбрать конкретное значение ресурса, соответствующее набору измерений (в данной ситуации у нас измерение одно) и значению периода. Например, это можно выполнить с помощью следующего программного кода:
Структура Ре сурсов=
РегистрыСведений.Тарифы.Получить(ДатаРасчета, СтруктураОтбора) Использование подобной конструкции вполне допустимо, по при условии, что для каждого месяца в регистр сведений занесено значение тарифа. Однако в реальной ситуации в течение продолжительного времени тарифы могут
Автоматизация работы с данными
277
не меняться, а в регистр сведений их повторно никто не вносит. В связи с этим, если на указанный месяц (датаРасчета) информации в регистре сведений нет, то при использовании метода Получить () мы выберем пустое значение. В то же время метод получить Последнее о позволяет извлечь из регистра последний по времени имеющийся тариф (не позднее указанной даты) для выбранного вида занятий. Это как раз нам и требуется для рассматриваемой задачи.
Таким образом, за счет процедуры, представленной в листинге 5.1. вносится правильное значение тарифа на дату расчета, и от пользователя требуется ввести только количество отработанных часов. После этого на форме документа (в табличной части) должна автоматически рассчитываться сумма, которую следует начислить преподавателю. Для этого требуется соответствующим образом оформить процедуру ПриИзменении поля числочасов. В листинге 5.2 эта несложная процедура представлена. —..........-----------...-..........
Листинг 5.2. Процедура для расчета для ноля Сумма	i
Процедура СписокЧислоЧасовПриИзменении(Элемент)
ТабличнаяЧасть = ЭлементыФормы.Список.ТекущиеДанные;
ТабличнаяЧасть.Сумма = ТабличнаяЧасть.Тариф “'ТабличнаяЧасть.ЧислоЧасов;
КонецПроцедуры
Итак, программирование формы выполнено. Теперь следует перейти в режим 1 С.Предприятие и заполнить несколько документов Учет. Один из вариантов заполнения формы документа показан на рис. 5.11. При практических действиях обеспечивается запланированный сервис— значения тарифов на дату расчета заполняются автоматически, а суммы рассчитываются после указания пользователем количества отработанных часов.
Однако сервисные доработки формы все еще не завершены. Расположим на ней элементы управления — кнопку и поле списка (рис. 5.12). Эти уже знакомые нам элементы в данном случае предназначены для того, чтобы пользователь прямо на форме документа мог посмотреть последние тарифы (на указанную дату расчета) по различным категориям занятий. В этом случае, при нажатии кнопки Последние тарифы, поле списка заполняется информацией из базы данных. Для реализации подобного эффекта нам потребуется написать процедуру обработки события принажатии для созданной кнопки (листинг 5.3).
278
Гпава 5
Рис. 5.11. Заполненная форма документа Учет в режиме работы 1С:Предприятие
Лист 1иг 3.3 Процедура вь 1всда информ ациг о тг рисЬах на дату расчета ............................................................. ......?>. ". >я  !„.. «Я
Процедура ПоследниеТарифыНажатие(Элемент)
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ Срез.ВидЗанятия КАК Вид,
I Срез.ВеличинаТарифа КАК Величина
I ИЗ РегистрСведений.Тарифы.Эре зПоследних(&ДатаОкончания,)
I КАК Срез";
Запрос.УстановитьПараметр("ДатаОкончания", ЭлементыФормы.ДатаРасчета.Значение);
Результат = Запрос.Выполнить().Выбрать();
СрезТарифов.Очистить();
Пока Результат.Следующий() >0 Цикл
СрезТарифов.Добавить(Строка(Результат.Вид) +
"	" + Строка(Результат.Величина) + " руб.");
КонецЦикла;
КонецПроцедуры
Автоматизация работы с данными
279
Приведенная процедура содержит некоторые новые детали, и поэтому требует небольшого комментария. В системе ЮПредприятие 8 для регистров сведений существует метод СрезПоследних (), который возвращает таблицу значений, заполненную информацией о последних актуальных значениях ресурсов регистра.
В связи с тем, что получение среза последней по дате информации встречается достаточно часто, разработчиками системы ЮПредприятие 8 была включена возможность использования виртуальной таблицы для получения такого среза. В данном случае вместо запроса к основной таблице регистра сведений мы воспользовались запросом к виртуальной таблице:
ИЗ РегистрСведений.Тарифы.СрезПоследних(ВДа^аОкончания,)
Рис. 5.12. Форма документа Учет с внесенными изменениями
Примечание
Виртуальная таблица среза последних значений измерений не хранится в базе данных, а строится на момент обращения к ней.
Таким образом, наш документ (рис. 5.13) почти готов к использованию, осталось лишь организовать автоматический учет денежных сумм по данным документам. Для этого, во-первых, мы создадим регистр накопления, в котором
280
Гпава 5
будут регистрироваться внесенные суммы. А во-вторых, обеспечим движения
по данному регистру при проведении документов Учет.
Оборотный регистр накопления
Регистры накопления могут быть двух видов — регистры остатков и регистры оборотов. В предыдущих главах для задач учета количественной информации мы использовали регистры накопления остатков. Для регистров подобного вида система [(^Предприятие создает несколько виртуальных таблиц— таблицу остатков, таблицу оборотов и совместную таблицу остатков и оборотов. Оборотный регистр отличается от регистра остатков тем. что для него система создает только одну виртуальную таблицу — оборотов.
Рис. 5.13. Форма документа Учет в режиме 1С:Предприятие
Кроме того, есть еще один момент, отличающий оборотные регистры от регистров остатков. Если вернуться к предыдущей главе, то мы увидим, что у регистра остатков присутствовал параметр Вид движения. В этом случае в режиме I С:Предприятие для каждой записи в регистр необходимо установить одно из двух значений — Приход или Расход. Подобный параметр у оборотного регистра отсутствует.
Для начала на закладке Основные в окне редактирования объекта конфигурации необходимо установить начальную информацию (рис. 5.14), опреде
Автоматизация работы с данными
281
ляющую регистр. Обратите внимание на то, что вид данного регистра — Обороты. Далее на закладке Данные (рис. 5.15) следует ввести измерение Преподаватель (тип Данных — СправочникСсьшка. Преподаватели) И ресурс Сумма (тип данных — число).
Рис. 5.14. Закладка Основные окна редактирования регистра Начисление
Рис. 5.15. Закладка Данные окна редактирования регистра Начисление
282
Глава 5
Работа с регистром (по записи информации по начислению денежных средств) должна быть организована с помощью документа Учет.
Движения по регистру Начисление
В режиме ЮПредприятие работать с созданным регистром для учета начисленных сумм пока рано, в связи с тем, что механизм записи информации в регистр мы еще не обеспечили. Дело в том, что движения по регистру должны выполняться при проведении документа Учет.
В режиме конфигуратора вернемся в окно редактирования документа Учет и перейдем на закладку Движения, где укажем в качестве регистра накопления для движений только что созданный регистр (рис. 5.16). Для формирования движений воспользуемся конструктором (нажав кнопку Конструктор движений). В результате на экране мы увидим уже знакомое окно (рис. 5.17), где бт нас потребуется подставить необходимые выражения для полей регистра (наши инструкции конструктору).
Далее после щелчка по кнопке ОК в работу вступает конструктор движений, который автоматически генерирует необходимый программный код (листинг 5.4).
Рис. 5.16. Закладка Движения окна редактирования документа Учет
Автоматизация работы с данными
283
Листинг 5.4. Процедура формирования движений в документе Учат
....л ... ...'.-..;::..’:.'.........;.>.....1.^;Л........... ..	я.	я
Процедура ОбработкаПроведения(Отказ, Режим)
Для Каждого ТекСтрокаСписок Из Список Цикл
Движение = Движения.Начисление.Добавить();
Движение.Период = Дата;
Движение.Преподаватель = ТекСтрокаСписок.Преподаватель;
Движение.Сумма = ТекСтрокаСписок.Сумма;
КонецЦикла;
// записываем движения регистров
Движения.Начисление.Записать();
КонецПроцедуры
Рис. 5.17. Окно конструктора движений документа Учет
Конструктор движений обеспечил функциональность документа — теперь при записи документа в информационную базу автоматически формируются движения по регистру. На этом работа в конфигураторе по созданию документа Учет, обеспечивающего формирование движений в регистре, завершена. Документ готов к использованию, и, перейдя в режим ЮПредприятие, следует сформировать (с проведением при записи) несколько документов
284 Гпгва 5
Учет. В результате в регистре Начисление сформированы соответствующие записи (рис. 5.18). Каждая строка табличной части документа нашла свое отражение в регистре. Составление отчета теперь может быть организовано на основании информации, содержащейся в таблицах, формируемых системой на основании регистра Начисление.
Отчет по начислению
Теперь необходимо разработать для сотрудников учебного центра итоговый отчет. Поэтому очередная задача заключается в создании выходной формы, на которой будет отображаться информация о начисленных суммах в течение указанного пользователем временного интервала. В конфигураторе начнем создание нового отчета, для которого выберем имя — Отчет-ПоНачислению. На закладке Макеты воспользуемся конструктором выходной формы и в качестве таблицы для построения запроса укажем Начисление. Обороты (рис. 5.19).
Рис. 5.18. Список документов Учет и форма списка регистра Начисление
Автоматизация работы с данными
285
Рис. 5.19. Закладка Таблицы и поля окна отчета ОтчетПоНачислению
Пользователь при работе с отчетом должен указывать интервал дат, за который выводится отчет. Об этом необходимо проинформировать конструктор. Поэтому в пиктографическом меню над разделом Таблицы (рис. 5.19) следует щелкнуть по пиктограмме Параметры виртуальной таблицы. Теперь в открывшемся окне диалога (рис. 5.20) необходимо задать параметры, определяющие начало и окончание интересующего нас временного интервала. Символ & перед именем параметров указывает на то. что это параметр запроса.
Рис. 5.20 Окно для выбора параметров виртуальной таблицы
286
Глава 5
Далее на закладке Итоги следует сделать отметку во флажке Общие итоги, а на закладке Отчет снять установку Использовать построитель отчета. Теперь осталось оформить закладку Выходная форма в соответствии с рис. 5.21.
Рис. 5.21. Закладка Выходная форма окна конструктора отчета выходной формы
Все интерактивные действия диалога с конструктором выходной формы выполнены, и осталось щелчком по кнопке ОК сформировать объекты и программный код, которые в совокупности реализуют в режиме 1С:Предприятие отчет по начислению. В листинге 5.5 приведены программные процедуры, обеспечивающие заполнение табличного документа на основе макета.
Листинг 5.5. Ппоцедур, * для формирований отчета пр начищ-^нию
............	......	....	... ..su. «. м
Процедура ДействияФормыОтчетПоНачислениюСформировать(Кнопка) ТабДок = ЭлементыФормы.ПолеТабличногоДокумента; ОтчетПоНачислению(ТабДок, ДатаНачала, ДатаОкончания);
КонецПроцедуры
Процедура ОтчетПоНачислению(ТабДок, ДатаНачала, ДатаОкончания) Экспорт
Макет = ОтчетОбъект.ПолучитьМакет("ОтчетПоНачислению");
Автоматизация работы с данными
287
Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ
I НачислениеОбороты.Преподаватель,
I НачислениеОбороты.Преподаватель.Представление,
I НачислениеОбороты.СуммаОборот I ИЗ
| РегистрНакопления.Начисление.Обороты(&ДатаНачала, &ДатаОкончания, , ) I КАК НачислениеОбороты | ИТОГИ ПО | ОБЩИЕ";
Запрос. УстановитьПараметр ("ДатаНачапа	ДатаНачала) ;
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Результат = Запрос.Выполнить();
ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы"); ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы"); ОбластьОбщийИтог = Макет.ПолучитьОбласть("ОбщиеИтоги");
ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");
ТабДок.Очистить();
ТабДок.Вывести(ОбластьЗаголовок);
ТабДок.Вывести(ОбластьШапкаТаблицы);
ТабДок.НачатьАвтогруппировкуСтрок();
ВыборкаОбщийИтог =
Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ВыборкаОбщийИтог.Следующий(); // Общий итог
ОбластьОбщийИтог.Параметры.Заполнить(ВыборкаОбщийИтог);
ТабДок.Вывести(ОбластьОбщийИтог, ВыборкаОбщийИтог.Уровень());
ВыборкаДетали = ВыборкаОбщийИтог.Выбрать() ;
Пока ВыборкаДетали.Следующий() Цикл
ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетали);
ТабДок.Вывести(ОбластьДетальныхЗаписей,
ВыборкаДетали.Уровень());
КонецЦикла;
ТабДок.ЗакончитьАвтогруппировкуСтрок();
ТабДок.Вывести(ОбластьПодвалТаблицы);
ТабДок.Вывести(ОбластьПодвал);
КонецПроцедуры
288
Гпава 5
Перейдем в режим 1С:11редприятие и на основе введенной информации заполним отчет. На рис. 5.22 приведена заполненная форма отчета по имеющимся в информационной базе данным Перед формированием отчета (кнопка Сформировать) предварительно требуется на форме установить интересующий нас интервал по дате, за который собираемся получить отчет по суммам, начисленным преподавателям.
Рис. 5.22. Отчет по начислению в режиме работы 1С:Предприятие
Реализация множественного подбора
Рассмотрим небольшое сервисное улучшение документа Учет. Дело в том, что при создании очередной строки табличной части первое поле, которое пользователь должен заполнить— Преподаватель. В этом случае происходит автоматическое открытие формы списка справочника Преподаватели. При вводе следующей строки действия повторяются— пользователь выбирает из справочника следующего преподавателя и т. д. Мы реализуем более удобный вариант работы. А именно сделаем гак, чтобы пользователь мог в
Автоматизация работы с данными
289
форме справочника отметить сразу нескольких преподавателей, которые затем всей группой переносятся в табличную часть документа.
Для начала добавим в форму документа кнопку Подбор преподавателей (рис. 5.23), с помощью которой будет открываться форма справочника с фамилиями преподавателей.
Затем необходимо разработать процедуру для реализации множественного подбора (листинг 5.6). Для этого следует использовать свойство формы Мно-жественныиВыбор. Присвоив этому свойству значение Истина, мы обеспечим возврат не одного выбранного элемента, а группы элементов, которые пользователь укажет в форме справочника.
...Л.........л,.,.
Листинг s fi Процедур* обряКптки нажатиякнопки Подбор преподавателей
Процедура ПодборПреподавателейНажатие(Элемент)
Форма = Справочники.Преподаватели.
ПолучитьФормуСписка(, ЭлементыФормы.Список);
Форма.РежимВыбора = Истина;
Форма.МножественныйВыбор = Истина;
Форма.Открыть();
КонецПроцедуры
Рис. 5.23. Изменения в форме документа Учет
290
Гпава 5
Наконец, в окне редактирования формы документа следует открыть окно свойств табличной части Список (рис. 5.24). Здесь щелчком мыши по изображению лупы напротив события Обработка выбора следует открыть окно для написания программного кода. Перед нами откроется заготовка процедуры СписокОбработкаВыбор, где следует разместить текст, который представлен в листинге 5.7.
Листинг 5.7. Процедур, для события Обрасо. .а выбор?
Процедура СписокОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Для Счетчик =0 По ВыбранноеЗначение.ВГраница() Цикл
Строка=Список.Добавить();
Строка.Преподаватель = ВыбранноеЗначение[Счетчик];
КонецЦикла;
КонецПроцедуры
Теперь все необходимое для осуществления множественного выбора готово, и, перейдя в режим работы 1С:Предприятие, можно проверить созданную разработку в деле (рис. 5.25).
Примечание
Для группового выделения следует держать нажатой клавишу Ctrl.
Рис. 5.24. Окно свойств табличного поля
Автоматизация работы с данными
291
Рис. 5.25. Иллюстрация множественного подбора в справочнике
Сводная таблица
Сводные таблицы наверняка хорошо знакомы большинству читателей благодаря приложению Microsoft Excel, которое обеспечивает удобный механизм сознания отчетов такого вида. В системе 1С:Предприятие 8 заложены не менее эффективные технические возможности по созданию сводных таблиц.
Вообще, сводные таблицы представляют собой удобный способ повышения информативности и наглядности отчета. Наша задача будет заключаться в разработке отчета, который при работе в режиме 1С:Предприятие выглядит подобно рис. 5.26. Здесь в колонках таблицы отражены преподаватели, в строках учебные группы, а на пересечении колонки и строки указано количество часов занятий, которые провел конкретный преподаватель. В колонке Итог и строке с аналогичным названием подводятся итоги по группам и преподавателям. Таблицы подобного вида с ,ень информативны.
После описания желаемого результата перейдем в режиме конфигуратора к созданию нового отчета (нового объекта конфигурации) и, как и ранее, воспользуемся конструктором выходной формы. Информация, на основе которой будет строиться отчет, содержится в документах Учет. Это связано с тем, что какого-то регистра для информации об отработанных часах мы не создавали. В результате для отчета необходимо использовать имеющиеся в ин
292
Гпава 5
формационной базе заполненные документы Учет. Нам потребуется информация из табличной части документов подобного вида.
Рис. 5.26. Сводная таблица по отработанной нагрузке
На рис. 5.27 показана закладка Таблицы и поля окна конструктора выходной формы. В разделе База данных следует отметить таблицу УчетСписок и перенести ее в раздел Таблицы и поля. Это — табличная часть документа Учет. После этого в раздел Поля перенесем три поля:
□	УчетСписок.Преподаватель;
□	УчетСписок.Группа;
П УчетСписок.ЧислоЧасов.
Как и ранее, конструктор самостоятельно дополнит первые два поля их представлениями. Теперь следует перейти на закладку Итоги и определить груп-пировочные поля, а также итоговое поле в соответствии с рис. 5.28.
Осталось выполнить на закладке От чет в группе Выводить отчет в установку (рис. 5 29), указывающую, что отчет должен содержать сводную таблицу, и после этого щелчком по кнопке ОК завершить работу конструктора.
Теперь можно перейти в режим работы 1С:Предприятие и начать работу со сводной таблицей. В меню Отчет раздела Сводный отчет мы увидим окно, показанное на рис. 5.30.
Автоматизация работы с данными
293
Рис. 5.27. Закладка Таблицы и поля окна конструктора выходной формы
Рис. 5.28. Закладка Итоги окна конструктора выходной формы
Здесь от пользователя требуется сначала щелкнуть по кнопке Сформировать, а затем с помощью контекстного меню перенести поля сводной таблицы на форму (рис. 5.31).
294
Гпава 5
Рис. 5.29. Закладка Отчет окна конструктора выходной формы
Рис. 5.30. Незаполненная форма сводного отчета
Рис. 5.31. Настройка полей сводного отчета
Автоматизация работы с данными
295
На рис. 5.32 показана сводная таблица, которая была целью разработки. Для ее получения необходимо перенести (просто перетащить мышью) поле Преподаватель в область строк сводной таблицы и таким же образом перенести поле Группа в область колонок, после чего разместить ЧпслоЧасов в области данных. На рис. 5.32 сводная таблица приведена вместе с исходным списком документов.
Рис. 5.32. Сводный отчет вместе со списком документов
Организация передачи данных между различными приложениями
В практической работе интеграция различных приложений используется очень часто. Это связано с рядом причин. Так, разные сотрудники крупных и не очень больших организаций, как правило, работают с различным набором программных продуктов. Это зависит и от уровня занимаемых ими должностей. и может быть связано с различными профессиональными обязанностями, а иногда, и с хорошим знанием определенных программ. Если информа
296
Гпава 5
тизация предприятия осуществлена на должном уровне, «разнобой» в используемых программных средствах не очень велик. Но даже при хорошей организации информатизации предприятия все равно часто требуется передавать данные, созданные в одних приложениях, в другие программы.
Наверное, все согласятся, что большинство фирм используют в офисной работе приложения Microsoft Word и Microsoft Excel. С другой стороны, статистика говорит о том, что и программный продукт 1С:Предприятие 8 также охватывает в той или иной степени участки деятельности практически каждой организации. В этом случае сотрудникам приходится организовывать передачу текущей или отчетной документации из одних программ в другие. Организация подобного обмена может возлагаться либо на системных программистов, либо на обыкновенных пользователей, но в обоих случаях этот этап требует заметных затрат и усилий.
В данном разделе на примерах рассматривается организация электронного обмена данными, затрагивающая три приложения — 1 С:Предприятие 8, Microsoft Word и Microsoft Excel. Рассмотренные далее приемы можно использовать и при решении других офисных задач, требующих подобной отчетной информации.
И приложения, входящие в пакет Microsoft Office, и система 1 (^Предприятие 8 открыты для взаимного обмена информацией. В программный продукт 1С:Предприятие 8 заложены ресурсы [1], которые позволяют:
П осуществлять обработку и обмен данными различных форматов;
□ осуществлять доступ ко всем объектам системы 1С Предприятие, реализующим ее функциональные возможности;
П поддерживать различные протоколы обмена;
П поддерживать стандарты взаимодействия с другими системами.
Разработчиками в систему 1С:Предприятие 8 включен набор технологий, ориентированных на решение разнообразных задач интеграции. В литературе [1,4] дается обзор всех ресурсов, здесь же мы уделим внимание только практическому использованию некоторых (наиболее интересных на наш взгляд) способов обмена данными.
Начнем с рассмотрения COM-технологии, которая расшифровывается следующим образом — Component Object Model (компонентная объектная модель). В этот информационный ресурс заложена организация программы из отдельных компонентов, которые в свою очередь состоят из объектов. Данные компоненты представляют собой выполняемый двоичный код, и для ис
Автоматизация работы с данными
297
пользования того или иного компонента достаточно просто зарегистрировать его в операционной системе.
Примечание
Фактически при использовании COM-технологии не требуется осуществлять компоновку компонентов с основным модулем.
Другая не менее известная технология — Automation Client/Server. Еще одно ее название — OLE Automation, что является сокращением от Object Linking and Embebbing (связывание и внедрение объектов). В этом случае пользователям предоставляется возможность работы с составными объектами, части которых созданы в различных приложениях (документы, таблицы, рисунки и др.). Основные понятия, с которыми оперирует данная технология — это OLE-объект, сервер приложения и контейнер приложения.
Объектом OLE называют объект, созданный в другом приложении, но при этом сохранивший связь с текущим приложением. Для этого он должен быть вставлен в интересующий нас документ соответствующим способом.
Контейнером OLE является приложение, в котором создается составной документ, содержащий OLE-объект. В этом случае при необходимости работы с OLE-объектом открывается исходное приложение (то, в котором рассматриваемый объект был создан). Это исходное приложение называется сервером OLE. Офисные приложения Microsoft Word, Microsoft Excel и система 1С:Предприятие 8 могут выступать и как OLE-сервер, и как OLE-контейнер.
В целом работа системы 1 С:Предприятие через COM-соединение похожа на работу в режиме Automation Client/Server. Существенное отличие заключается в том, что при СОМ-сосдинении запускается вариант информационной системы 1С:Предприятия, не содержащий интерфейсной части. Работа в этом случае производится только программными средствами. Для пользователя интерактивные возможности работы исключаются. Основное назначение Automation-сервера 1 С: Предприятия — управление работой системы 1 С:Предприятие 8 из других приложений и выполнение запрограммированных действий, аналогичных интерактивной работе.
Пример взаимодействия приложений с использованием СОМ-технологии
Рассмотрим практический пример, который будет иллюстрировать передачу информации из Microsoft Excel в справочник системы 1С:11редприятис 8. Вы
298
Гпава 5
увидите, что использование рассматриваемого механизма не требует написания большого количества строк кода, что является существенным плюсом для разработчика.
В целом основная задача использования COM-соединения для системы 1С:Предприятие 8 связана с обеспечением надежного программного доступа к объектам системы из внешних приложений.
Примечание
COM-сервер системы 1С:Предприятие 8 реализован в виде библиотеки COMCntr.dll.
Использование COM-соединения в разработках обеспечивает:
П уменьшение затрат системных ресурсов;
П быструю установку соединения с базой данных:
П более быстрое (по сравнению с технологией OLE Automation) обращение к свойствам и методам объектов.
При программном использовании СОМ-соединения OLE-объект создается с идентификатором v8.C0MConnector. Например, это может выглядеть следующим образом:
Set ComConnect = CreateObject("V8.COMConnector")
После этого метод Connect возвращает объект соединения с базой данных:
Set Ваза = ComConnect.Connect("File="":\1С Glava5"";")
В данной конструкции предполагается, что каталог информационной базы, с которой мы работаем, располагается на диске с в папке ic Glava5.
Как уже говорилось, особенностью СОМ-соединения является отсутствие пользовательского интерфейса. В этом случае использование интерактивных действий исключается (если же в разработке они требуются, то следует использовать технологию OLE Automation).
Примечание
При использовании СОМ-соединения у объектов отсутствует свойство Visible (их видимости)
Сформулируем задачу для дальнейших практических действий. При разработке конфигурации в начале этой главы был создан справочник группы, в
Автоматизация работы с данными
299
котором перечислены все группы нашего учебного центра с указанием количества учащихся. Допустим, что в учебном центре с информацией о группах учащихся работает еще и другой сотрудник, который ведет учет этой же информации в приложении Microsoft Excel. На рис. 5.33 представлен один вариантов рабочего листа, с которым этот специалист работает. Здесь в первых двух колонках, аналогично структуре справочника группы, располагаются названия групп с указанием количества учащихся.
Мы хотим расположить на листе кнопку Передать в 1С, при щелчке по которой информация из рассматриваемой книги Microsoft Excel будет переноситься в информационную базу системы 1С Предприятие. При этом повторно переносить уже имеющиеся группы в справочник не нужно (по какой-то причине группы могут дублироваться). Таким образом, программная процедура, выполняемая при щелчке по рассматриваемой кнопке, должна перед переносом данных о группе предварительно проанализировать, занесена ли эта группа в справочник.
Примечание
Конечно, можно выполнить перенос информации и вручную — можно в режиме 1 С:Предприятие открыть форму списка справочника Группы и внести необходимые строки. Если данных не очень много, то такой вариант вполне допустим, однако наша задача заключается в организации программного обмена данными с использованием СОМ-соединения.
В отличие от предыдущих программных разработок, сейчас наши действия будут производиться в приложении Microsoft Excel. Следующим шагом после заполнения ячеек данными о группах (рис. 5 33) является создание на рабочем листе кнопки с надписью — Передать в 1С.
Примечание
В приложении Microsoft Excel для размещения элемента управления на рабочем листе необходимо сначала отобразить на экране панель инструментов — Элементы управления. Далее на панели следует выбрать элемент Кнопка, который необходимо расположить в правой части рабочего листа.
Для написания программного кода (на языке Visual Basic for Application) необходимо перейти в режим конструктора, что производится с помощью самой левой кнопки на панели инструментов Элементы управления.
300
Глава 5
Рис. 5.33. Лист книги Microsoft Excel с информацией о группах
Примечание
Режим конструктора в приложении Microsoft Excel по своему назначению аналогичен режиму конфигуратора для системы 1 (^Предприятие.
После перехода в режим конструктора следует открыть окно для написания программного кода (что выполняется с помощью двойного щелчка мышью по созданной кнопке).
Примечание
Мы рассмотрим программные ресурсы Visual Basic for Application только в том объеме, насколько это потребуется для приводимых здесь примеров. Если же вам требуется дополнительная информация или вы хотите познакомиться с более сложными задачами программирования в приложении Microsoft Excel, то могу порекомендовать мою книгу на данную тему [5]. В ней вы найдете практические примеры различной сложности. При этом основной акцент сделан на подробный разбор бизнес-приложений: обработка отчетов, полученных в программе 1С:Предприятие организация электронного документооборота, программа составления расписания занятий в учебном заведении.
Вернемся к практическим действиям. После выполнения предыдущих шагов перед вами должно быть открыто окно (рис. 5.34) для написания кода программы. Если проводить аналогии, то показанное окно в функциональном плане схоже с закладкой Модуль окна редактирования форм основных объектов конфигурации. В этом окне необходимо написать текст процедуры обработки события — щелчка по кнопке. Этот текст приведен в листинге 5.8.
Автоматизация работы с данными
301
Рис. 5.34. Окно для написания программного кода на языке Visual Basic for Application
Ж	...	К»
Листинг 5.8. Процедура для несечи° „и з: :правс1,нлк Группы ша* « ‘	J ___ Ji sssSfts &s JF<а ” u> SS ж а » & а а £ S м> ™™~ м -	3	S3£
Private Sub CommandButtonl_Click()
Dim ComConnect As Object
Dim Basa As Object
Dim Element As Object
Dim SpravochnikGroupe As Object
Dim Vibor As Object
Set ComConnect = CreateObject("V8.COMConnector")
Set Basa = ComConnect.Connect("File=""C:\1C Glava5'"';")
Set SpravochnikGroupe = Basa.Справочники.Группы
N_str = 0
While Cells(N_str + 2, 1).Value <> ""
N_str = N_str + 1
Wend
For i = 1 To N_str
Name_Group = CStr(Cells(i + 1, 1).Value)
Set Vibor = SpravochnikGroupe.НайтиПоНаименованию(Name_Group) Name_lC = Vibor.Наименование
If Name_lC = Name_Group Then
MsgBox ("Группа с названием ” + Name_lC + " уже была ") Else
Set Element = SpravochnikGroupe.СоздатьЭлемент() Element.Наименование = Name_Group
302	гпава 5
Element.Количество = Cells(i + 1, 2).Value
Element.Записать
End If
Next
End Sub
Здесь после создания подключения к информационной базе в переменной N str подсчитывается количество заполненных ячеек в первом столбце на листе Excel (подразумевается, что названия групп должны занимать в столбце непрерывную область, и первая пустая ячейка означает завершение данных). Это то количество групп, которое мы собираемся перенести в справочник. '
Далее в цикле постедовательно перебираются названия групп. Здесь мы используем объект Microsoft Excel Cells, который позволяет работать с содержимым ячеек рабочих листов.
Примечание
При обращении к объекту Cells необходимо указать два параметр? Первый из них определяет номер строки ячейки, а второй номер столбца.
В цикле последовательно записываются в переменную Name Group «потенциальные» названия групп для справочника:
Name_Group = CStr(Cells(1 + 1, 1).Value)
В слово «потенциальные» вкладывается тот смысл, что мы должны сначала проверить— есть ли уже рассматриваемая группа в справочнике. И если есть, то записывать группу не надо. Для этого необходимо использовать метод справочника найтиЯоНаименованию. С его помощью мы предпринимаем попытку найти в справочнике строку, соответствующую строке на листе Excel:
SpravochnikGroupe.НайтиПоНаименованию(Name_Group)
При нахождении информации метод возвращает ссылку на очередную строку справочника, из которой мы затем выбираем наименование:
Name_lC = Vibor.Наименование
Далее при обнаружении имеющейся группы на экран выводится соответствующее сообщение, а при отсутствии переносимой группы в справочнике для ее добавления создается новая запись. В этой записи заполняется реквизит Наименование названием группы и указывается количество учащихся. Для выполнения описанных действий используется метод СоздатьЭлемент ().
Автоматизация работы с данными
303
В процедуре, представленной в листинге 5.8, мы воспользовались функцией VBA преобразования выражения к строковому типу— cstr (...), чтобы операция сравнения
If Name_lC = Name_Group Then работала корректно.
Перейдем теперь к проверке работоспособности внесенного программного кода. Для этого выйдем из режима конструктора и щелчком по кнопке на листе Microsoft Excel перенесем информацию в справочник Группы. Это действие происходит невидимо для пользователя — никаких окон на экране не появляется. Мы видим только, что система занята. Однако если после выполнения переноса данных открыть справочник Группы в режиме 1С:11редприятие, то мы увидим результат—-необходимые добавления произведены (рис. 5.35).
Таким образом, один из способов передачи данных между приложениями мы рассмотрели. Аналогично рассмотренному примеру можно работать и с другими объектами конфигурациями — документами, регистрами и др.
Рис. 5.35. Изменения в справочнике Группы в результате выполнения процедуры в Microsoft Excel
Использование приложения Microsoft Excel в качестве сервера
Теперь несколько изменим вариант обмена. Как и в предыдущем разделе воспользуемся для обмена COM-соединением, оцнако здесь мы программно
304 гпава 5
организуем соединение в процедуре для системы ЮПредприятие. В данной процедуре из рабочей книги Microsoft Excel будет передаваться список преподавателей в соответствующий справочник системы ЮПредприятие. Для определенности будем считать, что информация со списком преподавателей располагается в отдельном файле— книге Microsoft Excel, ее лист с информацией показан на рис. 5.36.
Рис. 5.36. Информация о преподавателях в книге Microsoft Excel
Рис. 5.37. Форма списка справочника Преподаватели
Основные действия будут происходить в конфигураторе. Воспользуемся ранее созданным объектом конфигурации — справочником Преподаватели. На
Автоматизация работы с данными
305
форме списка справочника расположим кнопку (рис. 5.37). Для обработки нажатия на кнопку следует написать процедуру, представленную в листинге 5.9. Здесь в первой строке процедуры мы устанавливаем связь с файлом приложения Microsoft Excel, который должен предварительно быть создан и размещен надиске С под именем Преподаватели.хк.
Листинг 5.9. Процедура переноса лнформащ и .то преподавателям
	. ('tv-’ оаЙ	. zVri'Za',V>a.a, - ..I<Va.aC<-aaaa<Aatv.a a |V >aiC-ailk,aVivta.'k>raa^- Жka>a'a'aiaa<-aa'aайоJiii'A'aatV,‘a,vaaivaiiS:S*^K’/S«fc'?>iЦаАа'а,a.Va'i\'<v'ZA
Процедура ПеренестиИинформациюОПреподавателяхНажатие(Элемент)
ConExcel - ПолучитьСОМОбъект("С:\Преподаватели.xls");
Спр—Справочники.Преподаватели;
1=1;
Пока СтрДлина(ConExcel.Sheets(1).Cells(i, 1).Value) > 0 Цикл НовыйЭлемент = Спр.СоздатьЭлемент();
z = ConExcel.Sheets(1).Cells(i, 1).Value;
НовыйЭлемент.Наименование =
ConExcel.Sheets(1).Cells(i, 1).Value ;
НовыйЭлемент.Записать();
i = i + 1;
КонецЦикла;
КонецПроцедуры
Рис. 5.38. Резуль гат переноса информации в системе 1С:Предприятие
306
Гпава 5
В цикле последовательно просматриваются все ячейки первой колонки на первом листе книги Microsoft Excel. Цикл выполняется до тех пор, пока очередная ячейка листа Excel не окажется пустой.
Примечание
Функция стрдлина () возвращает количество символов в строке, переданной в качестве единственного параметра.
Таким образом, мы обеспечили передачу информации с рабочего листа Microsoft Excel в справочник системы ЮПредприятие. На рис. 5.38 показан результат— в поле Наименование мы видим фамилии преподавателей. В процедуре, приведенной в листинге 5.9, для реализации такого эффекта используются объекты VBA: Sheets и Cells.
Передача информации в Microsoft Excel с использованием технологии OLE Automation
СОМ-технология не обеспечивает возможности использования визуальных ресурсов приложения-сервера. В противоположность ей OLE Automation характеризуется такой отличительной особенностью. Рассмотрим опять ситуацию, когда требуется организовать передачу информации из системы ЮПредприятие в рабочую книгу Microsoft Excel.
Нам понадобится создать еще один объект конфигурации — справочник дисциплины. Кроме обязательных реквизитов создадим еще два:
П Лекции (тип данных— число) для отражения числа лекционных занятии по данной дисциплине;
П Практика (тип данных — чис по) для отражения числа практических занятий.
Табличных частей у не элементов не будет. На закладке Формы создадим форму списка справочника. На форме разместим кнопку Передать в Excel (рис. 5.39), при нажатии на которую в файл Дисциплины-xls будет передаваться полная информация по дисциплинам (с включением данных по часам занятий).
Отличием выполняемого обмена является то, что в процессе передачи данных открывается окно рабочей книги Microsoft Excel. Текст программной процедуры, обеспечивающей такой эффект, приведен в листинге 5.10, а результат ее выполнения показан на рис. 5.40.
Автоматизация работы с данными
307
Рис. 5.39. Изменения в форме списка справочника Дисциплины
Рис. 5.40. Заполнение листа Microsoft Excel с помошью процедуры в системе 1 ^Предприятие
11ИСГ1Н1 5.10. Передача информации с использованием технологии OLE Automation
Процедура ПередатьВЕхсе1Нажатие(Элемент)
ApplicationExcel= Новый СОМОбъект("Excel.Application");
308
Гпава 5
ApplicationExcel.Visible = Истина;
ApplicationExcel.Workbooks.Open("С:\Ди:циппины.х1з");
Спр = Справочники.Дисциплины; i = 2;
Выборка = Спр.Выбрать();
Пока Выборка.Следующий() >0 Цикл
ApplicationExcel.Sheets(1).Cells(i, 1).Value = Выборка.Наименование;
ApplicationExcel.Sheets(1).Cells(i, 2).Value = Выборка.Лекции;
ApplicationExcel.Sheets(1).Cells(i, 3).Value = Выборка.Практика; i = i + 1;
КонецЦикла;
КонецПроцедуры
Выполнение макросов при передаче информации в Microsoft Excel
Немного усложним ситуацию, рассмотренную в предыдущем разделе. Допустим, что в файле Дисциплины2.х15 содержится информация о дисциплинах с указанием количества учебных часов. Для определенности эта информация будет располагается на втором листе, который называется План (рис. 5.41). Можно сказать, что данный лист хранит базовую информацию, а в системе ЮПредприятие ведется оперативная работа. Очевидно, что время от времени требуется устанавливать соответствие.
В данной ситуации нам необходимо, чтобы после переноса информации из справочника Дисциплины на первый лист книги Дисциплины2.х15 производился еще анализ имеющихся и полученных из системы 1 С:Предприятие данных. Так, необходимо отмечать наличие противоречия в указании часов занятий для определенной дисциплины. Это противоречие должно отражаться в виде автоматически формируемого сообщения в четвертом столбце (рис. 5.42).
Задача теперь усложняется, так как требуется выполнение программы в среде ЮПредприятие 8 и последующее за этим выполнение другой программы на языке VBA для Microsoft Excel. Причем вторая программа должна быть запущена не вручную, а автоматически из первой (процедура, выполняемая в системе ЮПредприятие 8 должна инициировать выполнение процедуры в Microsoft Excel).
Автоматизация работы с данными
309
Рис. 5.41. Лист План рабочей книги Дисциплины2.х!з
Рис. 5.42. Диагностика при расхождении информации в двух системах учета
Рис. 5.43. Окно Microsoft Excel для работы с макросами
310
Гпава 5
Для достижения подобного эффекта нам потребуется разработать макрос в книге Дисциплины2.х!5, текст которого представлен в листинге 5.11. Технически для размещения макроса в книге Microsoft Excel необходимо в меню Сервис выбрать пункт Макросы и помощью кнопки Создать перейти в окно для написания программного кода (рис. 5.43). Сам его текст достаточно несложен. В нем происходит последовательное сравнение данных с первого листа (на который поступает информация из системы ЮПредприятие) с данными, расположенными на втором листе. В сл) чае нахождения расхождения числа часов на первый лист выводится соответствующее диагностическое сообщение.
Листинг 5.11 Текст макроса. оасг.оложенно! о в книг s Д“*л ^иг. 1ины2.< 1г ...L. .... ..... . , я .. .... ...	.йг.г.у-.'й?.! ,
Sub 06f аботка()
N1 = О
While Worksheets(1).Cells(N1 + 2, 1).Value <> ""
N1 = N1 + 1
Wend
N2 = 0
While Worksheets(2).Cells(N2 + 2, 1).Value <> ""
N2 = N2 + 1
Wend
For i = 1 To N1
a = Worksheets(1).Cells(i + 1, 1).Value
For j = 1 To N2
b = Worksheets(2).Cells(j + 1, 1).Value
If a = b Then
If Worksheets(1).Cells(i + 1, 2).Value <> _
Worksheets(2).Cells(j + 1, 2).Value Or _
Worksheets(1).Cells(i + 1, 3).Value <> _
Worksheets(2).Cells(j + 1, 3).Value Then
Worksheets(1).Cells(i + 1, 4).Value = _
"Противоречие c " + CStr(j +1) + " -й строкой 2 -го листа"
Worksheets(2).Cells(j + 1, 4).Value = _
"Противоречие c " + CStr(i +1) + " -й строкой 1 -го листа"
Exit For
End If
End If
Автоматизация работы с данными 311
Next
Next
End Sub
Таким образом, мы расмотрели процеес программирования для приложения Microsoft Excel. Теперь наступает этап программирования для системы 1С:Предприятие 8. В листинге 5.12 приведен текст процедуры обработки нажатия кнопки в форме списка справочника Дисциплины. В этом тексте для выполнения макроса использется метод Run, параметром которого является имя этого ранее созданного макроса. Результат выполняемых действий мы уже видели на рис. 5.42. В этом случае для удобства пользователя комментируются строки на листе Microsoft Excel, на которые ему следует обратить внимание.
.—.— .... .„g-------------------------------------- ..... ... ... ... ... ....
Процедура ПередатьВЕхсе1Нажатие(Элемент) ApplicationExcel^ Новый СОМОбъект("Excel.Application"); ApplicationExcel.Visible = Истина;
ApplicationExcel.Workbooks.Open ("С:\Дисциплины2.х1з");
Спр = Справочники.Дисциплины; i = 2;
Выборка = Спр.Выбрать();
Пока Выборка.Следующий() >0 Цикл
ApplicationExcel.Sheets(1).Cells(i, 1).Value = Выборка.Наименование;
ApplicationExcel.Sheets(1).Cells(i, 2)-Value = Выборка.Лекции;
ApplicationExcel.Sheets(1)-Cells(i, 3).Value = Выборка.Практика; i = i + 1;
КонецЦикла;
ApplicationExcel.Run("Обработка") ;
Кон ецПроцедуры
Интеграция трех офисных приложений
В заключительном разделе этой главы рассмотрим еще одну ситуацию, требующую обмена информацией между приложениями Microsoft Word, Microsoft Excel и 1С:Предприятие. Поскольку эти приложения примерно одинаково популярны, такая ситуация вполне возможна при практической работе.
312
Гпава 5
Рис. 5.44. Форма обработки для передачи данных
Опишем подробнее нашу цель. С помощью формы, показанной на рис. 5.44, данные из 1С бухгалтерии передаются в рабочую книгу Microsoft Excel. Передаваемая информация представляет собой суммы, начисленные преподавателям в указанном временном интервале. Лист Microsoft Excel, предназначенный для отображения данных из системы 1С:Предприятие 8, показан на рис. 5.45. После нажатия кнопки Передать данные об оплате открывается рабочая книга Microsoft Excel (рис. 5.45), а затем данные о начисленных суммах отображаются в ячейках листа рабочей книги. Для полноты информации кроме начисленных сумм на лист Microsoft Excel записывается еще и интервал дат. Это первая часть разработки, которая связана с програмированием в системе 1 С:Предприятие. Другая ее часть будет связана с передачей информации в Microsoft Word (но уже из приложения Microsoft Excel). В связи с этим на созданный лист необходимо добавить кнопку (рис. 5.46).
Нам потребуется запрограммировать событие — щелчок по кнопке Передать в Word. В этом случае будет выполнена процедура на языке Visual Basic for Application, которая запустит (с отображением на экране) приложение Microsoft Word, в котором создаст новый документ (рис. 5.47), предоставляющий собой отчет о начислениях.
Таким образом, мы рассмотрели всю требуемую последовательность действий, и далее приводится описание технических шагов для ее реализации.
Автоматизация работы с данными
313
Конвейер передачи данных в рассматриваемом случае включает в себя три приложения: I С:Предприятие, Microsoft Word и Microsoft Excel.
Рис. 5.45. Лист Microft Excel, в который будут занесены данные из системы 1С:Предприятие
Рис. 5.46. Добавление элемента управления на лист Microft Excel
Первая часть разработки, связанная с программированием в системе 1С:Предприятие, требует создания нового объекта конфигурации— новой обработки. В этой обработке мы воспользуемся формой произвольного вида, на которой разместим следующие элементы управления:
П поле ввода ДатаНачала (тип данных — Дата);
П поле ввода ДатаОкончания (тип данных — Дата);
П кнопка ПередатьВЕхсе!.
314
Гпава 5
Теперь для события Нажатие, возникающего при нажатии кнопки Передать данные об оплате, необходимо на закладке Модуль разместить процедуру (листинг 5.13). Ее программные конструкции нам уже знакомы, а для обмена информацией мы воспользовались технологией OLE Automation. В процедуре открывается файл ИнформацияИзЮ.хк, куда и записывается информация, полученная в результате выполнения запроса.
Рис. 5.47. Отчет в приложении Microsoft Word
а-----------------------------------------------------------.......
Листинг 5.13. Процедуры обработки нажатия кнопки Передать данные об оплате	|
Процедура ПередатьДанныеОбОплатеНажатие(Элемент) ApplicationExcel= Новый СОМОбъект("Excel.Application"); ApplicationExcel.Visible = Истина;
ApplicationExcel.Workbooks.Open ("С:\ИнформацияИз1С.xls");
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
I НачислениеОбороты.Преподаватель,
I НачислениеОбороты.Преподаватель.Представление КАК Преп,
I НачислениеОбороты.СуммаОборот	КАК Оборот
I ИЗ
I РегистрНакопления.Начисление.Обороты(&ДатаНачала, &ДатаОкончания,
Автоматизация работы с данными
315
| Период,)
I КАК НачислениеОбороты";
Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала);
Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать() ;
i = 2;
Пока Выборка.Следующий() Цикл
ApplicationExcel.Sheets(1) . Cel Is (i, 1).Value = Выбор ка.Преп;
ApplicationExcel.Sheets(1).Cells(i, 2).Value = Выборка.Оборот;
i =i + 1;
КонецЦикла;
Дата1 = Формат(ЭлементыФормы.ДатаНачала.Значение,"ДФ=""дд/ММ""");
ApplicationExcel.Sheets(1).Cells(2, 4).Value = Дата1;
Дата2 = Формат(ЭлементыФормы.ДатаОкончания.Значение,"ДФ=""дд/ММ""");
ApplicationExcel.Sheets(1).Cells(2, 5).Value = Дата2;
КонецПроцедуры
В данной процедуре используется функция форматирования для отображения информации по дате в необходимом виде. Сама функция имеет следующий формат:
Формат(Значение, Форматная строка)
где параметр Значение задает данные, которые требуется определенным способом отформатировать, а параметр Форматная строка представляет собой строковое выражение, включающее в себя параметры форматирования. Каждый параметр задается именем параметра, символом равно (=) и значением параметра. Имя дф определяет формат даты. В тексте листинга 5.12 используется вариант представления даты в виде дд/мм.
Теперь перейдем к программированию в приложении Microsoft Excel. В листинге 5.14 представлен текст процедуры, которая должна выполняться при щелчке по кнопке Передать в Word.
Для запуска приложения Microsoft Word из процедуры, расположенной в книге Microsoft Excel, используется следующий набор программных конструкций:
Dim appWD As Object
Set appWD = CreateObject("Word.Application")
appWD.Visible = True .
316
Гпава 5
Здесь функция CreateObject создает объект Microsoft Word и возвращает ссылку на это приложение. Используя эту ссылку, можно программно работать с объектами редактора Microsoft Word — документами и их составляющими (параграфами, абзацами, строками, символами и т. д.). В третьей строке приведенного фрагмента используется свойство visible (видимость), и после присвоения ему значения True окно текстового редактора появляется на экране. Если эти три строки оформить в виде текста процедуры, выполняемой при нажатии кнопки, то, щелкнув по кнопке, мы попадем из приложения Microsoft Excel в редактор Microsoft Word.
Располагая ссылкой на приложение Microsoft Word, можно работать с подчиненными объектами и коллекциями, входящими в данный объект. Так, для добавления нового документа можно воспользоваться коллекцией Documents. Эта коллекция включает в себя объекты Document, каждый из которых представляет документ Microsoft Word. Например, если строку
appWD.Documents.Add
добавить к трем предыдущим, то это приведет к появлению нового документа в окне текстового редактора.
В рассматриваемой процедуре часто используется объект ActiveDocument, который представляет собой активный документ, открытый в приложении Microsoft Word. С его помощью можно получить доступ к содержанию документа через так называемые внутренние объекты — параграфы (абзацы), приложения, слова и т. д.
В предыдущем программном фрагменте после выполнения строки процедуры appWD. Documents .Add происходит создание нового документа и присвоение ссылки на него объекту ActiveDocument. Перейдем далее на более низкий уровень и посмотрим, как работать с объектами, составляющими документ. Например, для добавления нового параграфа в активный документ следует воспользоваться следующей конструкцией:
appWD.ActiveDocument.Paragraphs.Add
Здесь мы использовали сохраненную ранее ссылку appWD на объект Microsoft Word, а также использовали коллекцию Paragraphs, которая представляет собой все абзацы документа. А уже для этой коллекции использовали метод Add для добавления нового абзаца в документ.
Программная вставка текста в документ (как в новый, так и в уже существующий) реализуется с помощью объекта Range, представляющего собой часть текста документа (в том числе и созданный только что абзац). Этот объект, в какой-то степени, похож на известный нам объект с аналогичным
Автоматизация работы с данными	317
названием в приложении Microsoft Excel. И там, и здесь Range представляет собой диапазон. В приложении Microsoft Word этот объект может быть создан разными способами. Например, можно указать номер абзаца, а также начальный и конечный символы диапазона.
Вставка в документ текста с помощью объекта Range возможна с использованием двух методов— insertBefore (можно перевести как его — перед диапазоном) и InsertAfter (перевод— после диапазона). Например, для вставки фрагмента текста можно использовать следуюшу ю конструкцию:
appWD.ActiveDocument.Paragraphs(1).Range().InsertAfter ("текст 1")
У коллекции Paragraphs есть свойство Count, которое позволяет получить количество параграфов в документе. В следующей конструкции в переменную а записывается количество имеющихся параграфов в активном документе:
a=appWD.ActiveDocument.Paragraphs.Count
Также для определенного параграфа с помощью объекта Range можно изменить шрифт текста. Например, для первого параграфа установим 14-й размер шрифта:
appWD.ActiveDocument.Paragraphs(1).Range().Font.Size = 14
Можно также задать стилевое оформление текста. Так, если первый параграф мы хотим оформить как заголовок второго уровня, то следует написать:
appWD.ActiveDocument.Paragraphs(1).RangeO.31у1е="3аголовок 2"
Л истин» 5.14. Процедура обработки делчка по кнопке Передать отчет в Word ...........—J:........................................................
Private Sub CommandButtonl_Click()
Dim appWD As Object
' Открываем приложение Microsoft Word
Set appWD = CreateObject("Word.Application")
appWD.Visible = True
’ Добавление нового документа
appWD.Documents.Add
appWD.ActiveDocument.Paragraphs(1).Range().InsertAfter ("Отчет")
’ Установка размера шрифта первого параграфа
appWD.ActiveDocument.Paragraphs(1).Range О.Font.Size = 20
' Добавление нового параграфа
appWD.ActiveDocument.Paragraphs.Add
318
Гпава 5
' Вставка в документ информации по датам
z = Range("cl").Value + " - " + Range("с2").Value
appWD.ActiveDocument.Paragraphs(2).Range().InsertAfter (z) appWD.ActiveDocument.Paragraphs(2).Range().Font.Size = 14 appWD.ActiveDocument.Paragraphs.Add
z = Range("dl").Value + " - " + Range("d2").Value
appWD.ActiveDocument.Paragraphs(3).Range().InsertAfter (z) appWD.ActiveDocument.Paragraphs(3).Range().Font.Size = 14 ' Формирование табличной части документа i = 1
While Cellsfi + 1, 1).Value <> ""
аррЛ’и. Activeij&ciiment. Paragraphs’. Acfcf
z = CeJlsfi + 1, 1)-Value + " - " + CStr(Cellsfi + 1, 2).Value) + " руб." appWD.ActiveDocument.Paragraphs(i + 3).Range().InsertAfter (z) appWD.ActiveDocument.Paragraphs(i + 3).Rangef).Font.Size = 12 i = i + 1
Wend
End Sub
Документ, получаемый в результате выполнения процедур в среде ЮПредприятие 8 и в приложении Microsoft Excel, мы уже видели (см. рис. 5.37).
Итоги
В этой главе рассмотрен последний набор примеров. На практике может встретиться очень много задач и ситуаций, подобных рассмотренным выше или же совершенно отличных. Часто, при разработке информационной модели решаемой задачи на первый взгляд кажется, что в этом случае сложно найти аналог в имеющихся источниках информации. Но это не совсем так: в документации, прилагаемой к программному продукту ЮПредприятие, в многочисленных изданиях (часть которых перечислены в списке литературы) и на разнообразных электронных форумах рассматриваются всевозможные ситуации, которые встречаются при разработках конфигураций для платформы ЮПредприятие 8. Настоящая книга также может послужить хорошим источником примеров, которые можно использовать при осуществлении собственных разработок.
Заключение
Итак, последняя глава книги завершена. Главный результат заключается в том, что на примерах разной степени сложности мы познакомились с технологией разработки конфигураций для информационной системы I (^Предприятие 8. В ходе рассмотрения примеров были освоены практические приемы работы с объектами конфигурации и прикладными объектами системы 1 С:Предприятие 8. Теперь перед вами открываются широкие возможности как для внесения изменений в готовые решения, так и для создания своих собственных прикладных разработок.
Хотелось бы добавить несколько слов для той категории читателей, которые по каким-то причинам не располагают программой 1С:Предприятие 8 (например, организация, где они работают, до сих пор использует предыдущую версию программного продукта— 1 С:Предприятие 7.7). В этом случае можно воспользоваться очень недорогой версией для обучения программированию системы 1С:Предприятие 8, которая включает в себя все ресурсы основной версии. Ограничения, которые в ней присутствуют, проявляются только в реальной работе по автоматизации учета в организации.
Литература
I.	Профессиональная разработка в системе 1 С:Предприятие 8 /Под ред М Г. Радченко.— М.: ООО «1С-Паблишинг»; СПб.; Питер, 2006.— 808 с.: ил.
2.	Радченко М. Г. 1С:Предприятие 8.0. Практическое пособие разработчика. Примеры и типовые приемы.— М.: ООО «1С-Паблишинг», 2006.— 656 с.: ил.
3.	Габец А. П., Гончаров Д. И. 1С:Предприятие 8.0. Простые примеры разработки. — М.: ООО «1С-Паблишинг», 2005. — 420 с.: ил.
4.	Михайлов А. В. 1С:Прсдприятие 7.7/8.0: системное программирование.— СПб.: БХВ-Петербург, 2005. — 336 с.: ил.
5.	Кашаев С. М. Программирование в Microsoft Excel на примерах. — СПб : БХВ-Петербург. 2007. — 320 с.: ил + Видеокурс (на CD-ROM)
Приложение
Описание компакт-диска
На прилагаемом компакт-диске вы найдете информационные базы, разработанные в книге, а также файлы приложений Microsoft Word и Microsoft Excel, которые упоминаются во второй и пятой главах.
В табл. П1 приводятся пояснения относительно содержания папок, имеющихся на компакт-диске.
Таблица П1. Папки и файлы сопр peodi тельного компакт-диска
Название папки	Описание
Glaval	Информационная база, разработанная на основании примеров, описанных в главе 1
Glava2	Информационная база, разработанная на основании примеров, описанных в главе 2
Giava3_1	Информационная база, разработанная на основании примеров, описанных в первой части главы 3
Glava3_2	Информационная база, разработанная на основании примеров, описанных во второй части главы 3
Glava4	Информационная база, разработанная на основании примеров, описанных в главе 4
Glava5	Информационная база, разработанная на основании примеров, описанных в главе 5
Add_glava2	Файлы, созданные в приложении Microsoft Word с бланками квитанций, упоминаемые в главе 2
Add_glava5	Файлы, созданные в приложениях Microsoft Word и Microsoft Excel, упоминаемые в главе 5
324
Для установки информационных баз необходимо:
1.	Скопировать папку, содержащую интересующую вас информационную базу, с компакт-диска на жесткий диск. Например, для примеров первой главы полный путь местонахождения информационной базы может быть следующий — C:\Glaval.
2.	В окне запуска информационной системы ЮПредприятие 8 нажать кнопку Добавить.
3.	В следующем открывшемся окне следует выбрать команду Добавление в список существующей информационной базы.
4.	Подобрать любое название создаваемой информационной базе. Например, таким названием может быть «информационная база с примерами к 1-й главе».
5.	Теперь следует указать каталог информационной базы: папку, которую вы перенесли с компакт-диска на жесткий диск вашего компьютера.
6.	На этом установка завершена. Теперь в окне запуска можно перейти либо в режим конфигуратора, либо в режим ЮПредприятие.
При разработке конфигурации в гчаве 1 для сокращения количества действий один отчет заменялся другим. Речь идет об отчете Учет оплаты. В тексте главы 2 разные версии отчета с этим названием последовательно заменяют друг друга. В информационной базе Glaval на компакт-диске приведены все варианты этого отчета. В табл П2 приведено соответствие информации из главы 1 книги и объектов конфигурации, расположенных на компакт-диске.
Таблица П2. Соответствие отчетов в тексте книги и объектов конфигурации
Информация из книги	Объект конфигурации (информационная база Glaval)
Отчет на рис. 1.71	Отчет УчетОплаты
Отчет на рис. 1.74	Отчет Учет0платы2
Отчет на рис. 1.76	Отчет УчетОплатыЗ
В главе 2 рассматривался пример автоматического заполнения документа, созданного в приложении Microsoft Word. В ходе разработки упоминались различные файлы Так, файл с исходным бланком квитанции, представленный на рис. 2.19, располагается на диске в папке Add glava2 под именем blank.doc. Он
325
не содержит никаких дополнительных элементов управления. Бланк квитанции, содержащий необходимые элементы управления (рис. 2.22), располагается на диске в той же папке под именем blank_add.doc. Заполненный бланк квитанции (рис. 2.24) располагается в файле blankl.doc. Для формирования бланка с двумя квитанциями (рис. 2.25) в конфигурации, приведенной на компакт-диске, создана дополнительная кнопка с соответствующим именем.
В процессе описания конфигурации в гчаве 3 при демонстрации ряда запросов для удобства рассматривалась одна и та же процедура обработки, которая корректировалась от примера к примеру. Для отражения всех процедур в информационной базе Glava3_l на компакт-диске приведены различные процедуры обработки для каждого примера. В табл. ПЗ приведено соответствие информации из главы 3 книги и объектов конфигурации, расположенных на компакт-диске.
Таблица ПЗ. Соответствие запросов в тексте книги и объектов конфигурации
Информация из книги	Объект на компакт-диске (каталог Glava3_1)
Листинг 3 1	Обработка к рис. 3.4
Листинг 3.2	Обработка к рис. 3.5
Листинг 3.3	Обработка к рис. 3.6
Листинг 3.4	Обработка к рис. 3.8
Листинг 3.5	Обработка к рис. 3.9
Листинг 3.6	Обработка к рис. 3.10
Листинг 3.8	Обработка к рис. 3.12
Листинг 3.9	Сводная информация по квитанциям
Листинг 3.10	Обработка к рис. 3.18
Листинг 3.11	Обработка к рис. 3.21
Листинг 3.12	Обработка к рис. 3.22
Листинг 3.13	Обработка к рис. 3.23
Листинг 3.14	Обработка к рис. 3.24
Листинг 3.15	Обработка к рис. 3.25
Листинг 3.16	Обработка к рис. 3.27
326
Информационная база, расположенная в папке Glava3_2, включает в себя вторую часть разработок главы 3. Здесь по тексту книги при демонстрации ряда запросов для удобства рассматривалась одна процедура обработки, а в ней производились изменения. Для отражения всех процедур в информационной базе Glava3_2 на компакт-диске приведены различные обработки для каждого примера. В табл. П4 приведено соответствие информации из главы 3 книги и объектов конфигурации, расположенных на компакт-диске.
Таблица П4. Соответствие запросов в тексте книги и объектов конфигурации
Информация из книги	Объект конфигурации (информационная база Glava3_2)
Листинг 3.17	Обработка к рис. 3.29
Листинг 3.18	Обработка к рис. 3.30
Листинг 3.19	Обработка к рис. 3.31
Листинг 3.20	Обработка к рис. 3.32
Листинг 3.21	Обработка к рис. 3.34
Листинг 3.22	Обработка к рис. 3.35
Листинг 3.23	Обработка к рис. 3.36
Предметный указатель
А, С	О
Automation Client/Server 297 Component Object Model 296 СОМ-объект 137 COM-сервер 298	OLE Automation 297 OLE-контейнер 297 OLE-сервер 297
Б	3
Булево значение 50	Запрет незаполненных значений 108 Запрос 86, 144 агрегатные функции 162
В	ключевое слово: ВОЗР 151
Вид регистра: Обороты 213 Остатки 213 Выходная форма 246	ВЫБОР 191 ВЫБРАТЬ 145, 148 ГДЕ 157 И 159 ИЕРАРХИЯ 155 ИЗ 86, 145, 148 ИЛИ 159
д	ИМЕЮЩИЕ 171 ИТОГИ 172, 173 КАК 151
Движения 216, 282 Диаграмма 260 Диалог 36 Документ 65	КОЛИЧЕСТВО 163 ЛЕВОЕ СОЕДИНЕНИЕ 185 МАКСИМУМ 163 МЕЖДУ 169 МИНИМУМ 163
328
Предметный указатель
НЕ 159
ОБЪЕДИНИТЬ 176
ПЕРВЫЕ 152
ПОДОБНО 198
ПОЛНОЕ СОЕДИНЕНИЕ 189
ПРАВОЕ СОЕДИНЕНИЕ 187
РАЗЛИЧНЫЕ 156. 181
СГРУППИРОВАТЬ ПО 86, 165
СОЕДИНЕНИЕ 184
СРЕДНЕЕ 163
СУММА 163
УБЫВ 151
УПОРЯДОЧИТЬ ПО 151
логические операторы 159
параметр 168
способ обхода выборки 251
функция:
ДатаВремя 197
ДобавитьКДате 196
ПОДСТРОКА 195
ПРЕДСТАВЛЕНИЕ 198
РазностьДат 197
И
Иерархический справочник 23
Измерения 99
Индексировать с дополнительным упорядочиванием.54
К
Ключевое слово.
Для Каждого 64
Если 53
Истина 53
КонецЕсли 53
КонецПроцедуры 45
КонецЦикла 47
Ложь 53
Пока 47
Процедура 45
Тогда 53
Цикл 47, 64
Кнопка 112
Код 24
Количество уровней иерархии 23
Коллекция Word:
Documents 316
Paragraphs 316
Комментарий 17
Конструктор движений 282
Конструктор печати 41, 60
Конфигуратор 11
м
Макет печатной формы 42
Макеты 41
Макросы Excel 310
Максимальное значение 38
Массив 136
Метод:
Выбрать 47, 54, 118, 149, 251
Вывести 47
Выполнить 149
Добавить 73, 150, 221
Записать 126, 129
НайтиПоНаименованию 302
Очистить 73, 150
Показать 48, 77
Получить 276
ПолучитьПоследнее 276
Прочитать 129
Следующий 47, 150
СоздатьМенеджерЗаписи 129
СоздатьНаборЗаписей 126
СоздатьЭлемвнт 302
СрезПоследних 279
ТипЗаписи 173
УстановитьПараметр 168, 169
Метод Excel:
Run 311
Метод Word:
lnsertAfter317
InsertBefore 317
Минимальное значение 38
Множественный выбор 289
Модуль 36
Предметный указателе
329
н	Периодичность 106, 269 Платформа 1С:Предприятие 21
Надпись 111 Назначить имя 81 Наименование 24 Независимый режим записи 101	Подчинение регистратору 101 Приход 220 Произвольная форма 108 Р
О	Рамка группы 111
Обороты 281 Обработка 108 Общий модуль 230 Объект:	Расход 220 Регистры накопления 216 Регистры сведений 100 Режим 1С:Предприятие 11
Запрос 149 Структура 54 Объект Excel:	Реквизиты 25, 36 Ресурсы 98
Cells 302 Sheets 306 Объект Word Range 317 Окно редактирования объекта конфигурации 17 Оператор:	Свойство: Ссылка 90 ВидЦвижения 236 Заполнение 81
И 118 Прервать 118 Операции 21 Основные формы:	Защита 77 Индексировать 52 МножественныйВыбор 289 ОтображатьЗаголовки 77
документа 224 списка 33 Отладка 21 Отчеты 78	ОтображатьСетку 76 Параметры 47 ТолькоПросмотр 77 ЭтоГруппа189 Свойство Word: ActiveDocument 316
п	Count 317 Связи 253 Синоним 17
Параметр 81 Параметры: виртуальной таблицы 285 запроса 168 Перечисления 16 Период 120, 169	Событие: Обработка выбора 290 ПриИзменении 70, 116 ПриОткрытии 114 Список значений 148 Справочники 19
330
Предметный указатель
т
Таблица 80
Табличные части 26
Текст шапки 37
Тип:
Табличныйдокумент 46
Тип движения регистра 220
Функция:
Год 115
Месяц 115
ПРЕДСТАВЛЕНИЕ 238
Строка 150
ТекущаяДата 115
Формат 315
Функция VBA
Crea'eObject 316
CStr 303
Условное выполнение 53
ц
Цикл 47, 64, 118
Флажок 50
Форма 23
Форма диалога 28
ш
Шапка 66
Самый эффективный способ обучения методем разработки в системе 1 С:Предприятие 8
ЮПредприятие О
учимся программировать
□Б АВТОРЕ~|
Канава Сергей Михейлееич, к. т. н., доцент Нижегородского государственного технического университета и Нижегородского гисуиореты нто лингвистического униве<си-стаим Н А Добролюбова Имеет двадцатилетнии опыт преподавания в области программирования и информационных технологий Автор более десяти изданий по программированию для Интернета, программированию в системе 1С Предприятие, работе с приложениями Microsoft Office.
НА ПРИМЕРАХ
Хотите быстро научиться разработке прикладных решений на платформе 1С:Предприятие 8? Обучение созданию конфигураций и программированию на встроенном языке построено на практических примерах различной сложности. Рассмотрены разнообразные задачи учета денежных средств Приведенные примеры дают практические рекомендации для автоматизации рутинных операций в офисной работе. Основной упор сделан на подробный разбор технологии разработки конфигураций для платформы 10:Предприятие 8. Рассмотрены примеры передачи информации между системой 1 С:Пред-приятие 8 и приложениями Microsoft Excel и Microsoft Word.
Книга рекомендуется пользователям 10, начинающим 10-программистам. студентам и преподавателям вузов по дисциплинам, связанным с информационными технологиями и программированием.
Среди большого числа изданий по ^-программированию это одно из наиболее удачных, так как сочетает в себе, с одной стороны, легкость восприятия информации, с другой - достаточную сложность рассматриваемых примеров по разработке прикладных решений на платформе 1С:Предприятие 8. Автор книги известен большим количеством работ, исключительно удачных в плане изложения тем, связанных с компьютерными технологиями.
Л. В. Шерстнева, к. ф.-м. н., заместитель директора Института радиоэлектроники и информационных технологий
CD содержит разработанные в книге конфигурации, а также упоминаемые в издании документы, созданные в приложениях Microsoft Word и Microsoft Excel.
ООО Поволжский книготорг
ТЕК
Кашаев С.М. 1С:Предприятие 8: ' Цена 275.0
(ХВ-ПЕТЕРБУРГ
94354, Санкт-Петербург
л Есенина, 5Б
-mail: mail@bhv.ru
Iitemet: www.bhv.ru
Тел./факс: (812) 591-6243