Текст
                    ПРОФЕССИОНАЛЬНАЯ
РАЗРАБОТКА В СИСТЕМЕ
«1С:ПРЕДПРИЯТИЕ 8»
В двух томах
Том 2
Москва
«1С-Паблишинг»
2012

Электронная версия книги «Профессиональная разработка в системе 1С:Предприятие 8» (издание 2) Том 2 © ООО «1С-Паблишинг», 2012 Материалы предназначены для личного индивидуального использования приобрета- телем книги «Профессиональная разработка в системе 1С:Предприятие 8», 2 издание (Москва, «1С-Паблишинг», ISBN 978-5-9677-1790-8, 2012). Запрещено тиражирование, распространение материалов, предоставление доступа по сети к материалам без письменного разрешения правообладателей. Разрешено копирование фрагментов программного кода для использования в разра- батываемых прикладных решениях.
Оглавление Глава 13. Сложные периодические расчеты............................................7 Технология реализации расчетных задач..........................................7 Основные понятия...........................................................7 Планы видов расчета...........................................................13 Назначение планов видов расчета...........................................13 Свойства планов видов расчета.............................................14 Структура планов видов расчета............................................15 Проверки, выполняемые при записи вида расчета.............................16 Структура таблиц базы данных..............................................17 Регистры расчета..............................................................19 Назначение регистров расчета..............................................19 Свойства регистров расчета................................................19 Структура регистров расчета...............................................21 Структура таблиц базы данных..............................................24 Настройка протяженных во времени расчетов.....................................25 Использование механизма вытеснения........................................25 Использование графиков....................................................27 Сторнирование.............................................................30 Настройка зависимости по базовому периоду.....................................32 Настройка планов видов расчета и регистров расчета........................32 Технология формирования и расчета записей регистров расчета...................37 Формирование записей регистра расчета.....................................37 Настройка алгоритмов расчета..............................................38 Расчет записей регистра расчета...........................................40 Перерасчет записей регистров расчета..........................................46 Объект конфигурации «Перерасчет»..........................................46 Измерения перерасчета.....................................................47 Автоматическое формирование записей перерасчета при вводе вытесняющих расчетов............................................48 Автоматическое формирование записей перерасчета при вводе прочих расчетов.49 Особенности использования таблицы вытесняющих видов расчета...............50 Формирование записей перерасчета средствами встроенного языка.............51 Автоматическое удаление записей перерасчета...............................52 Анализ данных таблицы перерасчета.........................................52 Реализация перерасчета записей регистров расчета..........................53 Том 2
Глава 14. Бизнес-процессы..........................................................57 Первое знакомство.............................................................58 Карта маршрута................................................................58 Точки маршрута................................................................60 Точка старта, точка завершения.............................................61 Точка действия.............................................................61 Точка условия..............................................................63 Точка выбора варианта......................................................64 Точка разделения, слияния..................................................65 Точка обработки............................................................65 Точка вложенного бизнес-процесса...........................................66 Состояния бизнес-процесса.....................................................66 Старт бизнес-процесса.........................................................67 Программный старт бизнес-процесса..........................................68 Интерактивный старт бизнес-процесса........................................69 Интерактивная активация бизнес-процесса....................................69 Старт бизнес-процесса как вложенного.......................................70 Старт бизнес-процесса с несколькими точками старта.........................72 Завершение бизнес-процесса....................................................73 Задачи........................................................................74 Формирование задач.........................................................74 Выполнение задач...........................................................75 Проверка выполнения........................................................77 Форма списка задач.........................................................77 Обратная связь.............................................................80 Примеры реализации бизнес-процессов...........................................81 Единый объект «Задача».....................................................81 Бизнес-процесс «Продажа товара»............................................85 Бизнес-процесс «Продажа товара с предоплатой»..............................89 Бизнес-процесс «Поручение».................................................90 Бизнес-процесс «Обход».....................................................94 Бизнес-процесс «Согласование»..............................................96 3
Оглавление1 Глава 15. Анализ данных и прогнозирование.....................101 Общие положения.........................................................101 Основные объекты механизма..........................................102 Типы анвлиза данных.................................................103 Модели прогноза.....................................................103 Тип анализа «Общая статистика»..........................................104 Тип анализа «Поиск ассоциаций»..........................................106 Типы отсечения правил...............................................108 Тип анализа «Поиск последовательностей».................................109 Тип анализа «Дерево решений»............................................111 Тип анализа «Кластеризация».............................................114 Используемые метрики................................................116 Методы кластеризации................................................118 Проведение прогнозов....................................................119 Модель прогноза.....................................................121 Глава 16. Сложные аналитические отчеты......................................123 Устройство системы компоновки данных....................................123 Схема компоновки данных.............................................124 Пример изменения настроек...........................................128 Примеры разработки отчетов..............................................131 Исходные данные для примеров........................................131 Пример 1. Набор данных - запрос.....................................131 Пример 2............................................................141 Пример 3. Связь наборов данных......................................145 Пример 4. Связь таблиц внутри набора данных.........................148 Пример 5. Набор данных - объединение................................152 Пример 6. Автоматическое формирование отчета........................155 Пример?.............................................................156 Примере.............................................................161 Пример 9. Свободная структура таблицы отчета........................168 Пример 10...........................................................171 Пример 11...........................................................177 Пример 12...........................................................181 Пример 13...........................................................189 Пример 14...........................................................196 Пример 15...........................................................203 Пример 16...........................................................212 Пример 17...........................................................219 Пример 18. Работа с системой компоновки данных из встроенного языка.226 Пример 19. Консоль системы компоновки данных........................233 Справочник разработчика.................................................240 Общие возможности...................................................240 Поля................................................................278 Ресурсы.............................................................290 4
Параметры...............................................................292 Макеты..................................................................294 Настройки отчета........................................................303 Работа с системой компоновки средствами встроенного языка...............338 Глава 17. Средства графического представления данных...........................................................343 Географические схемы........................................................343 Основные понятия........................................................343 Основы работы с географическими схемами.................................344 Работа с объектами географической схемы из встроенного языка............345 Диаграммы...................................................................354 Примеры работы с диаграммами............................................355 Диаграмма Ганта.............................................................358 Примеры работы с диаграммой Ганта.......................................359 Г рафические схемы..........................................................363 Основы работы с графической схемой......................................363 Примеры работы с графической схемой.....................................365 Табличный документ..........................................................366 Общие свойства табличного документа.....................................366 Области табличного документа............................................369 Рисунки табличного документа............................................381 Использование макетов табличных документов..............................388 Печать табличного документа.............................................397 Использование табличного документа в форме..............................401 Глава 18. Интеграция с другими информационными системами......................................................413 Форматы файлов обмена.......................................................414 Работа с текстом........................................................414 Работа с форматированным документом.....................................419 Работа с DBF............................................................420 Работа с XML-документами................................................423 XDTO-сериализация.......................................................440 Пример реализации обмена при разной структуре объектов конфигурации.....441 Работа с ZIP-архивами...................................................445 Использование интернет-технологий...........................................449 Работа с HTML...........................................................449 Использование FTP.......................................................453 Работа с электронной почтой.............................................454 Automation..................................................................458 Automation Server.......................................................458 Automation Client.......................................................461 Внешнее соединение..........................................................461 Использование внешнего соединения для интеграции с интернет-приложением.463 Профессиональная разработка в системе «1С:Предприятие 8»
ActiveDocument................................................................470 Внешние компоненты............................................................471 Подключение внешнего компонента в толстом клиенте или на сервере (на примере Native API компонента)........................................472 Подключение внешнего компонента в тонком клиенте или в веб-клиенте (на примере Native API компонента)........................................473 Web-сервисы...................................................................473 Предоставление функциональности через Web-сервисы.........................473 Работа с Web-сервисеми сторонних поставщиков..............................476 Пример реализации механизма Web-сервиса...................................476 Глава 19. Обмен данными...........................................................481 Планы обмена..................................................................482 Служба регистрации изменений..............................................483 Инфраструктура сообщений..................................................490 Универсальный механизм обмена данными.........................................492 Использование возможностей работы с XML-документами.......................492 Пример реализации универсального обмена...................................493 Регистрация в произвольные узлы...........................................503 Пример работы универсального обмена данными...............................504 Распределенные информационные базы............................................505 Общие принципы............................................................505 Главный и подчиненный узлы................................................507 Сообщение обмена данными в распределенной информационной базе.............507 Создание узла распределенной информационной базы..........................508 Запись и чтение сообщений обмена..........................................511 Подготовка конфигурации к работе в распределенной информационной базе.....512 Пример работы обмена данными в распределенной информационной базе.........513 Сценарии обмена данными в распределенной информационной базе..............514 Разрешение коллизий.......................................................516 Восстановление узла распределенной информационной базы из резервной копии.516 Особенности использования последовательности документов в распределенной информационной базе......................................517 Использование транзакций при организации обмена...............................518 Методика включения в сообщение обмена дополнительной информации...............519 Организация одностороннего обмена.............................................520 Примеры реализации автоматического обмена данными.............................521 Использование регламентных заданий........................................521 Использование объекта СОМСоединение.......................................522 Глава 20. Web-расширение..........................................................523 Основные положения............................................................524 ADO.NET...................................................................525 ASP.NET...................................................................526 Конструкторы Web-расширения для веб-приложений................................533 Том 2
Оглавление1 V8 List Form..............................................................534 V8 Item Form..............................................................545 V8 Report Form............................................................549 V8 Chart Form.............................................................554 Доступ к данным через ADO.NET.................................................555 Получение данных..........................................................556 Добавление данных.........................................................558 Изменение данных..........................................................559 Удаление данных...........................................................560 Web-сервисы...................................................................561 Обращение к Web-сервису из веб-формы......................................563 Вызов процедур, функций. Преобразование типов.................................563 Настройка прав доступа........................................................565 Идентификация пользователя....................................................565 Файл Web.config...........................................................565 Файл globaLasax...........................................................566 Форма, используемая для авторизации на основе форм........................567 Работа с метаданными..........................................................567 Пул соединений................................................................568 Полезные средства .NET Framework..............................................569 Объект Response...........................................................569 Объект Request............................................................570 Объект Session............................................................570 Подготовка веб-приложения к работе............................................571 Состав файлов.............................................................571 Параметры автоформ............................................................571 Форма списка (DefaultListForm)............................................572 Форма элементе объектной твблицы (DefaultObjectForm)......................572 Форма записи регистра (DefaultRecordForm).................................573 Форма строки табличной части (DefaultLineForm)............................573 Глава 21. Поставка прикладных решений.............................................575 Механизм поставки и поддержки прикладных решений..............................576 Изменение режима поддержки................................................578 Изменение правил поддержки................................................579 Поддержка на разных языках................................................581 Особенности работы с конфигурацией в хранилище, если конфигурация стоит на поддержке......................................582 Настройка поставки........................................................582 Обновление конфигурации, находящейся на поддержке.........................583 Общие технологические сведения о поддержке................................587 Сценарии поддержки........................................................589 Механизм создания комплектов поставки.........................................592 Файл поставки.............................................................592 Файл обновления...........................................................593
Оглавление1 Технологические особенности использования файлов поставки и обновления...594 Файл информационной базы.................................................595 Файл выгрузки информационной базы........................................595 Шаблоны конфигураций.....................................................595 Манифест.................................................................597 Удаленный каталог шаблонов...............................................600 Создание комплектов поставки.............................................601 Типичные сценарии создания комплектов поставки...........................605 Приложение Autorun для создания пользовательской оболочки дисков поставки.....611 Приложение SetupVS.......................................................613 Пример использования приложения Autorun..................................614 Создание файлов поставки и обновления из командной строки................616 Глава 22. Методика разработки....................................................619 Жизненный цикл прикладного решения...........................................619 Проектирование...........................................................619 Разработка...............................................................620 Функциональное тестирование..............................................620 Нагрузочное тестирование.................................................620 Внедрение................................................................621 Сопровождение в процессе эксплуатации....................................621 Выводы...................................................................622 Проектирование структуры метаданных..........................................622 Выбор между объектными и необъектными данными............................622 Анализ логики работы прикладных объектов с данными.......................623 Анализ производительности................................................623 Анализ возможностей использования обмена данными.........................623 Анализ параллельности работы.............................................624 Групповая разработка прикладных решений......................................624 Используемая терминология................................................624 Общие сведения о хранилище конфигурации..................................625 Создание хранилища конфигурации..........................................626 Пользователи хранилища...................................................626 Подключение к хранилищу..................................................627 Отображение состояния объектов конфигурации..............................629 Просмотр состояния объектов..............................................629 Захват и помещение объектов в хранилище..................................630 Администрирование хранилища..............................................633 Сравнение и сохранение текущей конфигурации хранилища....................634 Работа с версиями хранилища конфигурации.................................634 Отчеты по истории хранилища..............................................635 Варианты использования хранилища конфигурации............................636 Работа с хранилищем конфигурации из командной строки.....................639 Отладка прикладных решений...................................................640 Подключение предметов отладки............................................641
Настройка приложения для работы в отладочном режиме......................642 Многоязычные прикладные решения.............................................646 Информационная база......................................................648 Платформа «1С:Предприятие»...............................................649 Конфигурация.............................................................653 Редактирование текстов интерфейса........................................657 Приложение. Хранение данных......................................................661 Размещение данных системы «1С:Предприятие»..................................661 Информационные базы......................................................661 Хранилище конфигурации...................................................666 Журнал регистрации.......................................................666 Профайлы.................................................................667 Другие вспомогательные данные............................................668 Временные данные.........................................................669 Поля таблиц базы данных.....................................................670 Хранение значений полей примитивных и ссылочных типов....................670 Хранение значений полей составного типа..................................670 Индексы таблиц базы данных..................................................675 Справочник...............................................................675 Документ.................................................................677 Журнал документов........................................................677 План видов характеристик.................................................677 План счетов..............................................................677 План видов расчета.......................................................678 План обмена..............................................................678 Табличная часть..........................................................678 Регистр сведений.........................................................678 Регистр накопления.......................................................680 Агрегаты регистра накопления.............................................680 Регистр бухгалтерии......................................................680 Регистр расчете..........................................................681 Последовательность.......................................................681 Перечисление.............................................................681 Бизнес-процесс...........................................................682 Зедача...................................................................682 Таблицы регистрации изменений............................................682 Таблица списка пользователей.............................................683 Таблица истории работы пользователей.....................................683 Таблица хранилища системных настроек.....................................683 Таблица хранилища настроек отчетов.......................................683 Таблица хранилища настроек вариантов отчетов.............................683 Таблица хранилища общих настроек.........................................683 Таблица хранилища настроек данных форм...................................683 Профессиональная разработка в системе «1С:Предприятие 8»
Глава 13. Сложные периодические расчеты Помимо задач оперативного и бухгалтерского учета, платформа «1С:Предприятие» предоставляет широкие возможности для создания решений, предполагающих выполнение сложных периодических расчетов. Наибольшее распространение механизмы периодических расчетов полу- чили в решениях по расчету заработной платы. Однако сфера применения этих возможностей платформы значительно шире. Задачи сложных периодических расчетов имеют ряд особенностей, отли- чающих их от задач оперативного и бухгалтерского учета. Эти виды учета отличаются как по предназначению, так и по основным методам, используемым для их реализации. Так, оперативный учет служит для непрерывного учета состояния и движения средств в различных аналитических разрезах. Реализация подобных задач предполагает четкую привязку всех регистрируемых событий к непрерывной оси времени (каждое событие имеет так называемый момент времени, то есть точку на оси времени). Задачи бухгалтерского учета в целом схожи с опера- тивным учетом, но предполагают более сложную систему регистрации событий с возможностью использования корреспонденции счетов. Бухгал- терский учет также является по сути непрерывным. Отличительной особенностью периодических расчетов является отсутствие однозначной привязки событий к точке на оси времени. Регис- трируемые события в этом виде учета имеют отношение не к моменту времени, а к периоду в целом. При этом периодом расчета может быть день, месяц, квартал или год в зависимости от специфики решаемой задачи. Так, если для регистрации факта поступления товара важен точный момент его прихода, то при начислении премии важен период расчета (например, месяц), в котором она была начислена. Еще одним отличием периодических расчетов является протяжен- ность некоторых регистрируемых событий во времени. Например, при регистрации отпуска сотрудника указывается дата начала и дата окон- чания отпуска. В прочих видах учета регистрация подобных записей невозможна. Таким образом, помимо задач расчета зарплаты, механизм периодических расчетов может быть использован и в других областях, предполага- ющих периодическую регистрацию протяженных во времени событий, например, в задаче расчета аренды за помещения выставочного центра. Том 2
Пример, который будет рассматриваться в рамках данной главы, приво- дится в демонстрационной конфигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт-диске. В качестве примера выбрана задача по расчету зарплаты как наиболее часто реали- зуемая на практике. ТЕХНОЛОГИЯ РЕАЛИЗАЦИИ РАСЧЕТНЫХ ЗАДАЧ Основные понятия Вид расчета Одним из основных понятий механизма периодических расчетов явля- ется вид расчета. Любой расчет, выполняемый в системе, регистрируется с обязательным указанием вида расчета, под которым может пониматься как способ расчета данной записи, так и дополнительные свойства, характеризующие сущность именно этого расчета. Например, для целей расчета зарплаты различными видами расчета могут быть оклад, надбавка за вредность, оплата сверхурочных. В данном случае каждая из этих записей имеет свой алгоритм расчета, поэтому для каждого вида начис- ления сотрудникам вводится отдельный вид расчета. Тем не менее, оплата дежурства, например, может иметь тот же алгоритм расчета, что и оклад, но при этом это будет отдельный вид расчета, так как у него другой смысл. В общем случае список видов расчета, используемых в системе, зависит от специфики решаемой задачи. Расчетные инструменты платформы «1С:Предприятие» устроены таким образом, что пользователь может самостоятельно создавать и настраи- вать виды расчета, которые ему необходимы для решения прикладной задачи, в режиме 1С:Предприятие. Для организации системы взаимосвя- занных видов расчета в платформе предусмотрен объект конфигурации План видов расчета. План видов расчета определяет структуру хранения данных о видах расчета, используемых в прикладном решении для опре- деленных целей. Разработчик может создать в конфигурации несколько планов видов расчета для различный целей, в каждый из которых пользова- тель в режиме 1С:Предприятие сможет внести неограниченное количество видов расчета, а также настроить их взаимосвязь.
Принципы регистрации записей Все записи о расчетах регистрируются в системе в привязке к периоду расчета и конкретному виду расчета. Для хранения записей о расчетах в системе предусмотрен объект метаданных Регистр расчета. Каждый регистр расчета имеет определенную периодичность (день, месяц, квартал или год), рис. 13.1. В зависимости от периодичности записи в этом регистре имеют соответствующий период регистрации (подробнее о периоде регистрации ниже). Регистр расчета с периодичностью «месяц» Парюд Н1ЖОШМ ВМкрагж* Сотрздаае Суивп «варз 2010 Оккаж Имам 1UUUU февра»2010 оккаж Имам в ли март 2010 ипаж Петров У UUU Регистр расчета с периодичностью «квартал» мпспеом ВЬщгагвв* Соврдаовс Cjbh 1 квартал 2Л10 Оклад И1МШ1 32 000 Цшрпж 2010 Окпал Имам ЙщГ U квартам 2010 отлаем Мваяов —3000 Рис. 13.1. Периодичность регистров расчета Все записи регистра расчета, помимо периода регистрации, содержат информацию о виде расчета, примененном в данной записи. В одном регистре расчета могут содержаться виды расчетов только из одного плана видов расчетов. При этом регистров расчета, использующих один и тот же план видов расчета, может быть несколько. Например, виды расчета из плана видов расчета Начисления могут использоваться в двух разных регистрах - Управленческие начисления и Регламентированные начисления (рис. 13.2). Рис. 13.2. Использование видов расчета в разных регистрах расчета В данном примере один и тот же план видов расчета Начисления исполь- зуется как в регистре расчета Управленческие начисления для учета зарплаты работников в долларах для целей управленческого учета, так
и в отдельном независимом регистре расчета Регламентированные начис- ления, предназначенном для учета начислений в рублях для целей регламентированного учета. Записи в регистрах расчета могут быть определенным образом взаимо- связаны между собой. Вид этой взаимосвязи определяется настройками используемых видов расчета. Взаимосвязь, установленная для видов расчета, действует во всех регистрах, где эти виды расчета используются. Структура регистров расчета будет подробно рассмотрена позднее. Период регистрации Все расчеты в системе фиксируются в привязке к периоду расчета, в котором они зарегистрированы. Этот период называется периодом регистрации расчета. В зависимости от специфики задачи расчеты могут фиксироваться с периодичностью день, месяц, квартал и год. Период регистрации всегда существует у любой записи о расчете. При этом запись не может быть зарегистрирована сразу в нескольких периодах расчета. Например, при ведении ежемесячных периодических расчетов записи о расчетах могут быть привязаны к периоду регистрации следующим образом (рис. 13.3). январь февраль март апрель Периодичность расчетов: месяц Рис. 13.3. Привязка записей расчета к периоду регистрации В данном примере периодом регистрации оклада, начисленного в январе, будет являться месяц январь. Важно понимать, что периодом регистрации квартальной премии будет тот месяц, в котором она начислена (в данном случае март), а не весь первый квартал. Период действия Записи о расчетах, зарегистрированные в системе, могут быть как протя- женными во времени, так и нет. Например, командировка является протяженной во времени, так как для ее расчета важен период, в течение которого сотрудник находился в отъезде (рис. 13.4). В то же время, например, начисленный штраф не является протяженным во времени, а относится в целом к периоду, в котором он был начислен. Интервал, Профессиональная разработка в системе «1С:Предприятие 8»
в течение которого длится протяженная во времени запись, называется периодом действия этой записи. январь Командировка Период регистрации : Февраль Период действия : 08,02 - 24.02 Рис. 13.4. Записи расчета, протяженные во времени Период действия представляет собой непрерывный интервал времени, определяемый датой начала периода и датой его окончания. В приве- денном примере периода действия записи о командировке — это интервал с 8 по 24 февраля. Период действия одной записи регистра расчета может лежать только в рамках одного периода расчетов. Если необходимо ввести расчет, который длится в рамках нескольких расчетных периодов, его нужно разбить на несколько записей (рис. 13.5). Рис. 13.5. Ввод расчета, который длится в нескольких периодах Так, если установлена периодичность расчетов месяц, то нельзя ввести командировку с периодом действия с 10 января по 15 февраля, так как такой период не лежит в рамках одного месяца. Вместо этого вводятся две записи, у одной из которых период действия с 10 по 31 января, у другой - с 1 по 15 февраля. У протяженных во времени записей период действия может не прина- длежать периоду регистрации и лежать как в прошлом, так и в будущем относительно периода регистрации. Например, если работник болел в феврале, а оформленный больничный лист принес только в марте, то оплата больничного будет начислена в марте, так как за февраль зарплата уже рассчитана (рис. 13.6). Том 2
[Гехнол огия1реал иза ци и]рас^етн й1х{зада^ Рис. 13.6. Период действия раньше периода регистрации В этом случае периодом регистрации этой записи будет март, хотя расчет длился с 10 по 22 февраля. Обратный случай возможен, например, когда начисление за предстоящую в следующем месяце командировку производится текущим месяцем (рис. 13.7). Рис. 13.7. Период действия позже периода регистрации В этом случае периодом регистрации этого начисления будет февраль, а периодом действия - интервал с 9 по 25 марта. Вытесняющие расчеты и фактический период действия Протяженные во времени записи регистров расчета могут конкурировать между собой за период действия. Это означает, что они не могут действо- вать одновременно. Такая конкуренция необходима, когда виды расчета являются по сути взаимоисключающими. Например, виды расчета Оклад и Командировка не могут действовать в один и тот же момент, так как сотрудник не может одновременно работать на основном месте и находиться в командировке. При вводе записи о командировке на опре- деленный интервал времени система должна исключать действие оклада в этом интервале. Такие виды расчетов, которые исключают одновременное
действие записей других видов расчетов, называются вытесняющими (рис. 13.8). Рис. 13.8. Вытеснение по периоду действия В данном случае у записей о командировке и окладе возникает конку- ренция за период действия в интервале с 10.03 по 15.03 (т.е. в интервале действия командировки). Как уже было отмечено, эти записи не могут действовать одновременно, поэтому в указанном интервале происходит вытеснение оклада командировкой. Таким образом, вид расчета Команди- ровка по сути является вытесняющим по отношению к виду расчета Оклад. Это означает, что записи с видом расчета Командировка будут вытеснять записи с видом расчета Оклад. При вытеснении одного расчета другим период действия вытесняемого расчета не изменяется. Результат вытеснения влияет на так называемый фактический период действия вытесняемого расчета. Под фактическим периодом действия записи понимается совокупность интервалов времени в рамках периода действия, на протяжении которых расчет действует с учетом всех вытеснений. Если никаких вытеснений не происходило, фактический период действия совпадает с периодом действия (рис. 13.9). Таким образом, до вытеснений фактический период действия записи об окладе содержал только один интервал, совпадающий с периодом действия. В результате вытеснения период действия оклада не изменился, а конкуренция выразилась в разбиении фактического периода действия оклада на три интервала. ПРИМЕЧАНИЕ При формировании фактического периода действия принимаются во внимание также сторно-записи, о которых будет сказано ниже. Поскольку конкуренция и вытеснение взаимоисключающих записей происходят на интервалах пересечения периодов действия, то факти- ческий период действия таких расчетов никогда не будет пересекаться. Тем самым они никогда не будут действовать одновременно. И©
До вытеснения £ О клал Г После вытеснения Рис. 13.9. Фактический период действия Важно учитывать, что вытеснение срабатывает только при вводе вытес- няющих расчетов текущим или будущим периодом. При вводе расчетов за предыдущий период (задним числом) механизм вытеснения не действует. Это связано с тем, что записи, введенные в систему раньше (т.е. с меньшим периодом регистрации), имеют больший приоритет в конкуренции за период действия, чем более поздние записи (с большим периодом регистрации), причем это не зависит от настройки списка вытесняющих расчетов (рис. 13.10). февраль март Рис. 13.10. Записи ранних периодов не вытесняются В данном случае больничный за февраль зарегистрирован в марте, то есть период регистрации позднее периода действия. В такой ситуации вытес- нения оклада не произойдет, так как запись об окладе имеет более ранний период регистрации, чем запись о больничном, поэтому механизм вытес- нения не действует. В результате ввода такой записи фактический период Профессиональная разработка в системе «1С:Предприятие 8»
действия больничного будет пустым, так как записи не могут действовать одновременно, а вытеснения не происходит. Для того чтобы восстано- вить фактический период действия больничного, применяется механизм сторнирования, который будет описан позже. Зависимость по базовому периоду В определенных случаях результат одного расчета может зависеть от результата других расчетов, введенных в систему. Например, квар- тальная премия может зависеть от суммы начисленного за квартал заработка по окладу. В этом случае говорят, что оклад входит в базу расчета премии, а вид расчета Оклад является базовым по отношению к виду расчета Квартальная премия. При этом один вид расчета может иметь несколько базовых видов расчета, то есть зависеть одновременно от нескольких других расчетов. При расчете результата расчета по базе анализируется сумма базовых видов расчета за определенный период, который называется базовым периодом. Базовый период - это произ- вольный непрерывный интервал дат, который может покрывать несколько расчетных периодов. Например, при расчете оплачиваемого отпуска, как правило, производится расчет среднего заработка за 3 месяца, пред- шествующих отпуску. Этот интервал и будет базовым периодом расчета отпуска (рис. 13.11). январь февраль март апрель Рис. 13.11. Базовый период Отпуск Период регистрации : апрель Период действия : 05.04-2204 Базовый период : 01.01-31.03 В приведенном примере виды расчетов Оклад и Надбавка являются базовыми по отношению к отпуску. Если начисляется оплата отпуска за апрель, то базовым периодом этой записи будет интервал с 1 января по 31 марта (3 целых месяца, предшествующие отпуску). В этом случае в базу расчета отпуска войдут все базовые начисления, входящие в базовый период записи об отпуске. В данном случае база расчета отпуска состав- ляет 33 000 рублей и состоит из суммы начислений по окладу за 3 месяца и начисленной в феврале надбавки. Исходя из этой базы, будет произво- Том 2
диться расчет начисления отпускных в соответствии с алгоритмом расчета. То есть расчетная база - это еще не результат расчета, а лишь исходные данные, которые участвуют в алгоритме расчета. В данном случае пред- положим, что отпускные рассчитываются как среднее арифметическое заработков за 3 предыдущих месяца. В этом случае расчет отпуска произ- водится следующим образом: Результат расчета = База расчета /3 = 33 000 /3 = 11 000 Расчет по базе может применяться ко всем видам расчетов, независимо от того, являются они протяженными во времени или нет. Например, квартальная премия, которая не имеет периода действия, может иметь базовый период (например, I квартал). Ведущие расчеты и перерасчет Ведущими называют виды расчетов, при вводе или изменении которых необходимо перерассчитать результат уже существующих расчетов. Например, если работнику начислена премия за март в размере 10 % от заработка, то при вводе нового начисления в марте размер этой премии теряет актуальность. Премию необходимо пересчитать, чтобы учесть новое начисление (рис. 13.12). При вводе нового расчета... Базовый период расчета премии Надбавка | 3000 руб. 1 000 руб. ..результат расчета премии необходимо пересчитать 10000 руб. март апрель Рис. 13.12. Необходимость перерасчета при изменении базового вида расчета В данном случае премия изначально была рассчитана как 10 % от суммы оклада. При вводе за март надбавки в размере 3000 рублей результат расчета премии становится неверным, так как не учитывает этой надбавки. Виды расчетов Оклад и Надбавка являются ведущими по отношению к премии, так как влияют на ее расчет. В случае изменения этих расчетов или ввода новых результат премии необходимо перерассчитать. Под понятием перерасчет понимается повторный расчет результата записи с учетом произошедших изменений. Система позволяет авто- матически отслеживать изменения расчетов, которые могут повлечь перерасчет других записей, и формировать список расчетов, которые необ- ходимо перерассчитать. Для этого система при вводе расчета анализирует, ТО
по отношению к каким другим видам расчета данный вид расчета явля- ется ведущим. По сути, все виды расчета, являющиеся базовыми по отношению к данному виду расчета, должны быть одновременно и ведущими по отношению к нему. Это связано с тем, что если данный вид расчета использует резуль- таты базовых расчетов, то при изменении этой базы запись необходимо перерассчитать. В указанном случае оклад и надбавка составляют базу расчета премии, поэтому логично, что при их изменении нужно заново рассчитать премию. В то же время ведущими расчетами могут быть не только базовые. Ведущими могут быть также расчеты, влияющие на результат данного вида расчета косвенно. Например, вид расчета Невыход, который вытес- няет оклад, косвенно влияет на расчет премии, так как при вводе невыхода может измениться сумма оклада. В этом случае Невыход является ведущим по отношению к премии. Такая же ситуация возникает при косвенной зависимости по базе (рис. 13.13). Рис. 13.13. Ведущие виды расчета Премия Базовые: Ведущие: Доплата Доплата за разъезды за разъезды Комакифовка В данном случае командировка напрямую не входит в базу расчета премии, но влияет на доплату за разъезды, которая, в свою очередь, входит в базу расчета премии. Таким образом, изменение суммы за коман- дировку косвенным образом повлияет на премию. И хотя сама премия не рассчитывается на базе командировки, Командировка будет ведущим видом расчета по отношению к премии. Сторнирование Как уже отмечалось, записи с более поздним периодом регистрации ни при каких обстоятельствах не могут вытеснить по периоду действия записи с более ранним периодом регистрации. Больничный за февраль, введенный в марте, не изменит фактического периода действия февраль- ского оклада. При этом указанные записи в силу настройки вытесняющих И2
видов расчета не могут действовать одновременно, то есть их фактические периоды действия не должны пересекаться. В результате фактический период действия больничного будет пустым. Тем не менее эта ситуация должна быть как-то учтена, поскольку в этом случае работнику начислен завышенный оклад за февраль. Для решения этой задачи необходимо: в текущем периоде регистрации отменить неправильно начисленную часть оклада; позволить больничному иметь непустой фактический период действия, чтобы правильное начисление могло вступить в силу. Эта задача решается вводом в систему корректирующих записей, которые называются сторно-записями. Процесс такой корректировки называется сторнированием. Как было отмечено выше, при формировании факти- ческого периода действия записи учитывается наличие сторно-записей по конкурирующим видам расчета. Ввод в систему таких записей позволит больничному иметь непустой фактический период действия на интервале действия сторно-записи (рис. 13.14). Рис. 13.14. Сторно-записи В указанном примере изначально был начислен оклад в размере 10000 рублей за февраль. В марте становится очевидным, что совершена ошибка, так как в середине месяца сотрудник болел. Если просто ввести больничный за февраль с периодом регистрации март, он будет иметь пустой фактический период действия. Чтобы этого избежать, вводится сторно-запись по окладу, которая решает две задачи: отменяет начисление оклада за период болезни (за этот период сотруд- нику было ошибочно начислено 4000 рублей по окладу); позволяет больничному иметь непустой фактический период действия, в результате чего сотруднику начисляется 3000 рублей по больнич- ному листу. В результате этих действий общий результат записей становится верным. Важно понимать, что периодом регистрации сторно-записи будет Профессиональная разработка в системе «1С:Предприятие 8»
тот же месяц, которым введен больничный (в данном случае март). Иными словами, если в текущем периоде обнаружена ошибка и нужно внести изменения в предыдущий период, то соответствующая коррек- тирующая запись будет зарегистрирована в текущем периоде. При этом вид расчета сторно-записи такой же, как и в ошибочно введенной записи прошлого периода (в данном случае Оклад). В этой связи стоит еще раз остановиться на принципах формирования фактического периода действия записей. В данном случае при определении фактического периода действия больничного учитывался не только период действия оклада, но и период действия сторно-записи. Таким образом, при формировании фактического периода действия учитывается наличие сторно-записей конкурирующих видов расчета. Этот механизм можно пояснить на следующем примере (рис. 13.15). Рис. 13.15. Учет сторно-записей при формировении фектического периода действия В данном случае больничный, имеющий более поздний период регистрации, имел бы пустой фактический период действия на интервале пересечения с периодом действия дежурства (с 07.03 по 22.03). Однако наличие стор- но-записи позволяет больничному действовать параллельно с дежурством на интервале действия сторно-записи (с 07.03 по 15.03). При этом на интервале с 16.03 по 22.03 фактический период действия больничного будет по-прежнему прерываться, так как на этом интервале не действует сторно-запись по дежурству. Поэтому для того, чтобы больничный мог занять весь свой период действия, сторно-запись должна быть введена с периодом действия 07.03-22.03, то есть на всем интервале пересечения периодов действия дежурства и больничного. ПОДРОБНЕЕ Раздел «Сторнирование», стр. 30. Том 2
План£|1видов]раснета1 ПЛАНЫ ВИДОВ РАСЧЕТА Назначение планов видов расчета Планы видов расчета представляют собой прикладные объекты конфи- гурации, предназначенные для описания структур данных, в которых хранятся однотипные виды расчета. Для создания и настройки этих объектов предусмотрена отдельная ветка дерева конфигурации Планы видов расчета (рис. 13.16). €> 61НЯ8ЯВКЯИЕИ1 © ОсноеныеНачисления © ДополнительныеНачисления © Удержания Рис. 13.16. Планы видов расчета Каждый план видов расчета определяет отдельную структуру данных, где пользователь в режиме 1С:Предприятие может создавать неограниченное число элементов (видов расчета). Созданные виды расчета пользователь впоследствии может изменять и удалять из базы данных. Кроме этого, в режиме Конфигуратор в плане видов расчета можно создать неограниченное количество предопределенных видов расчета. Эти виды расчета также будут доступны для использования в режиме 1С:Предприятие, но со следующими ограничениями: предопределенный вид расчета не может быть удален в режиме 1С:Предприятие; в режиме 1С:Предприятие не могут быть удалены и изменены неко- торые свойства предопределенного вида расчета, заданные в режиме Конфигуратор. Об этих свойствах будет подробнее рассказано ниже. В конфигурации может быть создано неограниченное количество планов видов расчета. Планы видов расчета могут различаться между собой по свойствам или по назначению использования. В демонстрационной конфигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт-диске, присутствуют 3 плана видов расчета: ОсноеныеНачисления - в этом плане видов расчета хранятся виды расчета, характеризующие начисления, которые являются протяжен- ными во времени, то есть имеют период действия; ДополнительныеНачисления - виды расчетов, хранящиеся в этом плане видов расчета, отражают начисления, не являющиеся протяженными во времени; Удержа н ия - в этом плане видов расчета хранятся виды расчетов, харак- теризующие удержания из зарплаты работников. И®
ГлаваУГЗКСложн£|е]периодинеские]раснет£| Таким образом, планы видов расчета ОсновныеНачисления и Дополни- тельныеНачисления отличаются друг от друга по свойствам, а план видов расчета Удержания отличается еще и назначением использования. Свойства планов видов расчета При создании и настройке плана видов расчета разработчик может влиять на его свойства. Для каждого плана видов расчета задается его Имя, по которому можно обращаться к этому объекту конфигурации, и Синоним, а также Представление объекта, Представление списка и т.п. для представ- ления плана видов расчета в интерфейсе «1С:Предприятия» (рис. 13.17). Рис. 13.17. Имя, синоним и представление объекта плана видов расчета При настройке необходимо указать длину кода и наименования видов расчета, содержащихся в данном плане видов расчета (рис. 13.18). Кроме этого, указывается тип кода (строка или число) и основное пред- ставление видов расчета данного плана видов расчета для пользователя: в виде кода или в виде наименования. В зависимости от этой настройки в режиме 1С:Предприятие будет отображаться код или наименование вида расчета в полях, хранящих ссылку на этот вид расчета. План видов расчета ДополннгельныеНачмслення □ X Осное»ые Подсистемы Функциональные опции Дльна кода Дл та наименования |- Тип кеда I ю|г| ИЗ - Основное представление 1 ОВвиаекеда (•) В виде наименования к Датые Расчет | о Число Рис. 13.18. Код и наименование плана видов расчета
Использование указанных выше свойств аналогично их роли при настройке справочников. Кроме этого, у плана видов расчета существуют специфи- ческие свойства, определяющие расчетные свойства соответствующих видов расчета. К таким свойствам относятся: Использует период действия. Если в плане видов расчета установлено свойство Использует период действия, то все виды расчета, хранящиеся в данном плане, будут рассматриваться как протяженные во времени (рис. 13.19). Для таких видов расчета применима настройка вытес- нения по периоду действия. Планы видов расчета, использующие период действия, можно использовать в регистрах расчета с периодом действия (настройка регистров расчета будет рассмотрена позже). Рис. 13.19. Период действия и зависимость от базы Если свойство не установлено, все виды расчета данного плана видов расчета будут рассматриваться как непротяженные во времени, для них нет смысла настраивать вытеснение. Такие планы видов расчета не могут быть использованы в регистрах расчета с периодом дейс- твия. Зависимость от базы. Эта настройка определяет, будет ли в видах расчета данного плана видов расчета использоваться зависимость по базовому периоду. Если переключатель установлен в положение Не зависит, то виды расчета данного плана видов расчета не смогут зависеть по базовому периоду от других видов расчета. Установка переключателя в положение Зависит по периоду действия или Зависит по периоду регистрации позволит устанавливать в видах расчета зависимость по базовому периоду. Различие этих двух вариантов зави- симости будет рассмотрено позже. При этом любой вид расчета данного плана видов расчета теоретически может зависеть по базовому периоду от любых других видов расчета, в том числе из других планов видов расчета. Поэтому при настройке зависимости от базы необходимо указать, какие виды расчета могут выступать базовыми для видов расчета данного Профессиональная разработка в системе «1С:Предприятие 8»
плана. При этом базовые виды расчета могут принадлежать данному плану счетов или другому плану счетов. Например, виды расчета из плана видов расчета Дополнительные начис- ления могут зависеть от любых видов расчета этого же плана видов расчета, а также от плана видов расчета Основные начисления. В част- ности, вид расчета Годовая премия может зависеть по базовому периоду от оклада, принадлежащего плану видов расчета Основные начисления, и премии за месяц, принадлежащей плану видов расчета Дополнительные начисления (рис. 13.20). Рис. 13.20. Зависимость от видов расчета других планов видов расчета Структура планов видов расчета Структура плана видов расчета может существенно меняться в зависи- мости от его свойств. Общая структура плана видов расчета представлена на рис. 13.21. Структура плана видов расчета Реквизиты | Код | | Наименование | | ПериодДействияБаэовый | Рмвхзм | | Рмвхзм | | Рмвхзм | Табличные части | ВытесняющиеВидыРасчета |-Н------------------- | БазовыеВцдыРасчета |-Н----------------------- | ГаЙзянат часть | Табличная часть Только планы видов расчета, использующие иериод действия и зависящие от базы Только планы видов расчета, использующие период действия Только планы видов расчета, зависящие от базы Рис. 13.21. Структура плана видов расчета Том 2
План£11видов]ра~снета1 Если свойство плана видов расчета Длина кода больше 0, все виды расчетов этого плана видов расчета будут иметь предопределенный реквизит Код, тип кода будет установлен в зависимости от соответствующей настройки. Если свойство Длина наименования больше 0, то у всех видов расчета будет существовать предопределенный реквизит Наименование типа Строка. Если у плана видов расчета установлено свойство Использует период дейс- твия и одновременно установлена зависимость от базы, у всех видов расчета данного плана видов расчета будет доступен предопределенный реквизит ПериодДействияБазовый (Период действия является базовым пери- одом) типа Булево. Установка этого свойства у вида расчета будет означать, что при использовании механизма зависимости по базовому периоду вместо базового периода записи с этим видом расчета будет использо- ваться фактический период действия записи. Для предопределенных видов расчета реквизиты Код, Наименование и ПериодДействияБазовый можно указывать в конфигураторе (рис. 13.22). Вид расчета X ’ Основное] | Базовые 11 Вытесняющие 11 Ведущие | : ! Имя: [1^МИЩ ] Код: [0000000001 Наименование: [Сдельная опяета ] @ Период действия является базовым периодом | 0К ] | Отмена ] | Сгравка ] Рис. 13.22. Создание предопределенного вида расчета При этом код и наименование предопределенных видов расчета поль- зователь сможет изменить в режиме 1С:Предприятие, а признак Период действия является базовым периодом будет доступен для изменения только в конфигураторе. Помимо указанных реквизитов, разработчик может добавлять в план видов расчета произвольное количество других реквизитов любых типов. Для всех видов расчета, в том числе предопределенных, дополнительные реквизиты могут редактироваться только в режиме 1С:Предприятие. Предопределенные табличные части У всех планов видов расчета независимо от настройки существует предо- пределенная табличная часть ВедущиеВидыРасчета. Эта табличная часть позволяет для любого вида расчета данного плана видов расчета указать список ведущих расчетов. При этом ведущие расчеты могут выбираться из всех планов видов расчета конфигурации независимо от их настройки. Например, для уже упоминавшейся годовой премии ведущими могут быть виды расчета Оклад из основных и Премия за месяц из дополнительных начислений.
Глава113пСложн^1е]периодические]расчет^1 У планов видов расчета, использующих период действия, существует также предопределенная табличная часть ВытесняющиеВидыРасчета, в которой для каждого вида расчета задается список вытесняющих видов расчета. В качестве вытесняющих могут выступать только виды расчетов данного плана видов расчета. Если у плана видов расчета установлена зависимость от базы, в его струк- туре будет присутствовать еще одна предопределенная табличная часть БазовыеВидыРасчета, в которой для каждого вида расчета можно указать список базовых видов расчета. При этом в качестве базовых могут высту- пать только виды расчета тех планов видов расчета, которые отмечены в качестве базовых в свойствах данного плана видов расчета на закладке Расчет. Все три предопределенные табличные части имеют единственный предопределенный реквизит (колонку) - ВидРасчета. Состав реквизитов (колонок) предопределенных табличных частей не может быть изменен. Для предопределенных видов расчета эти табличные части могут быть заполнены в режиме Конфигуратор, но только видами расчета, также являющимися предопределенными. Эта настройка производится на соответствующих закладках формы предопределенного вида расчета (рис. 13.23). Рис. 13.23. Настройка базовых, вытесняющих и ведущих видов расчета Чтобы добавить в одну из предопределенных табличных частей вид расчета, не являющийся предопределенным, необходимо перейти в режим 1С:Предприятие. Помимо предопределенных табличных частей разработчик может создать произвольное количество дополнительных табличных частей с любым составом реквизитов (колонок). Редактирование таких табличных частей, в том числе для предопределенных видов расчета, доступно только в режиме 1С:Предприятие. и®
Проверки, выполняемые при записи вида расчета При записи вида расчета система производит ряд проверок на отсутс- твие конфликтов при заполнении свойств и предопределенных табличных частей. Проверки в предопределенных видах расчета Если вид расчета является предопределенным (введен в конфигураторе), то при записи объекта в режиме 1С:Предприятие система будет выполнять следующие проверки: проверка изменения свойства ПометкаУдаления. Как уже отмечалось, пользователь в режиме 1С:Предприятие не может интерактивно уста- новить или снять пометку удаления с предопределенного вида расчета. Эти изменения доступны только средствами встроенного языка. При попытке изменить это свойство интерактивно будет выдано предупреждение: «Пометка на удаление предопределенного вида расчета запрещена»; проверка изменения свойства ПериодДействияБазовый. Для предопре- деленных видов расчета свойство Период действия является базовым периодом может быть изменено только из конфигуратора либо средствами встроенного языка. При попытке изменить его интер- активно в режиме 1С:Предприятие будет выдано предупреждение: «Изменены свойства предопределенного вида расчета»; проверка модификации предопределенных табличных частей. У предо- пределенного вида расчета в режиме 1С:Предприятие не допускается модификация или удаление строк табличных частей ведущих, вытесня- ющих и базовых видов расчетов, заданных в конфигураторе. В режиме 1С:Предприятие можно добавлять новые строки в эти таблицы. Проверки предопределенных табличных частей Во всех видах расчета (не только предопределенных) при записи производятся следующие системные проверки табличных частей ВедущиеВидыРасчета, БазовыеВидыРасчета и ВытесняющиеВидыРасчета. Проверка повторяющихся строк. В каждой из предопределенных табличных частей производится проверка дублирующихся значений колонки ВидРасчета. Недопустимо, например, в список базовых видов расчета внести несколько раз один и тот же вид расчета. В этом случае будет выдано предупреждение: «Дублирование базовых видов расчета». Проверка «зацикливания» вытесняющих видов расчета. В таблице Вытес- няющиеВидыРасчета производится проверка отсутствия конфликтов при настройке вытеснения одного расчета другим. Если в списке вытесняющих указан вид расчета, который прямо или косвенно вытесняется текущим Профессиональная разработка в системе «1С:Предприятие 8»
(записываемым) видом расчета, то механизм вытеснения по периоду действия не сможет сработать, так как непонятно, как будут конкуриро- вать за период действия эти виды расчета. Например, если для оклада указан вытесняющий вид расчета Команди- ровка, то при попытке указать оклад как вытесняющий в командировке возникнет ошибка: «Вытесняющий вид расчета вытесняется текущим!» (рис. 13.24). ^_gwga(DcMoenoen»Mcne>Me) (1СПредприятие) Q jE| S3 ' М М* М- Оклад (Основное начисление) [ Эапнсегть и закрыть | И Все действия • । (?) Кел [0000000003 I Намак»аие;[Вклад | Базовый период как период действияСЭ^ч.^ Настрой^ Базовые виаы расч.. ВадуциейЬьщасч.. [ Вытеснжииицмеь-г.-^Г* ^Добавить । X । ф Q действия- Вт расчете Рис. 13.24. Проверка «зацикливания» вытесняющих видов расчета При этом проверяются табличные части всех видов расчета, являющихся вытесняющими (в данном плане счетов), а не только тех, которые указаны для данного вида расчета. Дело в том, что текущий вид расчета может вытесняться не напрямую, а опосредованно, через другие виды расчета. Например, вытеснение видов расчета может быть настроено так, как пока- зано на рис. 13.25. --->| Оклад |--------- I I Дождрство I Командировка Рис. 13.25. Проверка «зацикливания» вытесняющих видов расчета В данном случае система не позволит указать оклад в списке вытесняющих для командировки, так как сама командировка вытесняет оклад косвенно через вытеснение вида расчета Дежурство. Таким образом, проверка выполняется рекурсивно, и будет выявлена сколь угодно длинная цепочка взаимного вытеснения. Проверка полноты списка вытесняющих видов расчета. При записи вида расчета система требует указания полного списка вытесняющих расчетов. Это означает, что в списке должны присутствовать все виды расчета, вытесняющие текущий не только напрямую, но и косвенно. Например, если в список вытесняющих для оклада включен вид расчета Дежурство, который, в свою очередь, вытесняется командировкой, то система потребует включить в список еще и командировку. В противном Том 2
План£11видов]ра~снета1 случае при записи элемента возникнет ошибка: «Неполный список вытесняющих расчетов» (рис. 13.26). Рис. 13.26. Проверка полноты списка вытесняющих видов расчета Таким образом, все виды расчетов, вытесняющие текущий косвенно, необ- ходимо также включить в табличную часть ВытесняющиеВидыРасчета. Проверка полноты списка ведущих расчетов. По аналогичной схеме проверяется табличная часть ВедущиеВидыРасчета. Если в табличной части не указан вид расчета, который является ведущим косвенно (через влияние на другой вид расчета), то система выдаст ошибку: «Неполный список ведущих видов расчета». Так как ведущими могут быть виды расчета любого плана видов расчета, при проверке полноты списка будут анализироваться данные всех планов видов расчета конфигурации. Проверка правильного заполнения предопределенных табличных частей производится в момент записи вида расчета. При этом запись вида расчета может быть инициирована в следующих случаях: при интерактивной записи вида расчета в режиме 1 С:Предприятие; при записи вида расчета средствами встроенного языка (использо- вание метода Записать() объекта ПланВидовРасчетаОбъект); при реструктуризации базы данных после изменения конфигурации. Так как для предопределенных видов расчета возможно редактирование табличных частей в конфигураторе, при обновлении конфигурации базы данных должна производиться проверка табличных частей всех видов расчета. При этом учитываются не только предопределенные строки этих таблиц, но и введенные в режиме 1С:Предприятие. Структура таблиц базы данных Для каждого плана видов расчета в системе хранится основная таблица, а также отдельные таблицы на каждую табличную часть (как предопреде- ленную, так и добавленную разработчиком). Основная таблица содержит все виды расчета данного плана видов расчета с указанием предопре- деленных свойств, а также реквизитов, добавленных разработчиком. Основная таблица имеет структуру, представленную в табл. 13.1.
Глава113пСложн^1е]периодические]расчет^1 Таблица 13.1. Структура основной таблицы плана видов расчета Ссылка Код Наименование Предопределенный ПометкаУдаления ПериодДействияБазовый Реквизит 1 Реквизит N * 00001 Оклад Ложь Ложь Ложь * 00002 Командировка Ложь Ложь Ложь * 00003 Сдельный Истина Ложь Истина * 00004 Больничный Ложь Ложь Ложь Независимо от настройки плана видов расчета в основной таблице будут присутствовать поля Ссылка, Предопределенный и ПометкаУдаления. Поле Ссылка хранит внутренний уникальный идентификатор каждого вида расчета в базе данных. В полях Предопределенный и ПометкаУда- ления, имеющих тип Булево, хранится информация о том, является ли данный вид расчета предопределенным и помечен ли он на удаление. Поля Код и Наименование присутствуют в таблице в том случае, если в свойствах плана видов расчета для соответствующих полей установлена ненулевая длина. Поле ПериодДействияБазовый присутствует в таблицах тех планов видов расчета, которые используют период действия и зависят от базы. Кроме этого, в основной таблице могут присутствовать дополнительные поля любых типов для каждого реквизита, введенного разработчиком. Для каждой из предопределенных табличных частей в базе хранится отде- льная таблица. Для всех предопределенных табличных частей структура таблицы одинакова (на примере табличной части ВытесняющиеВидыРас- чета), табл. 13.2. Таблица 13.2. Таблица предопределенной табличной части «ВытесняющиеВцды Расчета» Ссылка НомерСтроки ВидРвсчета Предопределенный ‘Оклад 1 ‘Больничный Ложь ‘Оклад 2 ‘Дежурство Ложь ‘Оклад 3 ‘Командировка Ложь ‘Дежурство 1 ‘Командировка Ложь Набор полей этих таблиц не зависит от настроек плана видов расчета и одинаков для всех предопределенных табличных частей. В поле Ссылка хранится ссылка на вид расчета (строку основной таблицы), которому
данная строка табличной части принадлежит, то есть внутренний иден- тификатор этого вида расчета (здесь условно обозначен как наименование со знаком *). Таким образом, все строки этой таблицы со ссылкой на оклад представляют собой предопределенную табличную часть вида расчета Оклад. Строка табличной части не является ссылочным типом, поэтому собственной ссылки не имеет. Значение поля НомерСтроки формируется системой автоматически как порядковый номер строки табличной части в рамках данной ссылки. В рамках одного вида расчета (ссылки) номера строк таблицы уникальны. При помощи этого поля можно отличить одну строку табличной части от другой. Кроме этого, номер строки определяет порядок следования строк в табличной части. В поле ВидРасчета хранится ссылка на вид расчета (строку основной таблицы), выбранный в табличной части. Например, в приведенном примере для вида расчета Оклад в качестве вытесняющих указаны виды расчета Больничный, Дежурство и Командировка. Тип поля ВидРас- чета для всех предопределенных табличных частей может быть разным. Для таблицы ВытесняющиеВидыРасчета - это ссылка на текущий план видов расчета; ВедущиеВидыРасчета - составной тип, включающий ссылку на любой план видов расчета; БазовыеВидыРасчета - составной тип, определяемый настройками зависимости от базы текущего плана видов расчета. Поле Предопределенный хранит информацию о том, является ли данная строка табличной части заданной предопределенно в конфигураторе. Таблица ВедущиеВидыРасчета формируется в базе данных для всех планов видов расчета. Наличие таблиц для остальных предопределенных табличных частей определяется настройками плана видов расчета, о которых было сказано выше. Таблицы для табличных частей плана видов расчета, введенных разработ- чиком, будут иметь структуру, показанную в табл. 13.3. Таблица 13.3. Таблица табличной части плана видов расчета Ссылка НомерСтроки Реквизит 1 Реквизит N ‘Оклад 1 ‘Оклад 2 ‘Дежурство 1 Поля Ссылка и НомерСтроки будут присутствовать во всех таких таблицах и выполнять такие же функции, как и для предопределенных табличных частей. Кроме этого, для каждого реквизита табличной части, введен- ного разработчиком, в таблице будет предусмотрено соответствующее поле. Профессиональная разработка в системе «1С:Предприятие 8»
РЕГИСТРЫ РАСЧЕТА Назначение регистров расчета Регистры расчета - это прикладные объекты конфигурации, предназна- ченные для периодической регистрации данных о произведенных расчетах для определенных целей. Регистров расчета может быть неограниченное количество. Для их создания и настройки предусмотрена отдельная ветка дерева объектов конфигурации (рис. 13.27). © 0 ОсновныеНачмсленмРегл © Н ДооолнигельныеНачисленияРегл ® а УдержашяРагл ри(. 13.27. РвГИСТрЫ раСЧвТЭ Помимо собственно регистрации записей, регистры расчета обеспечи- вают правильное отображение взаимосвязей расчетов, о которых шла речь выше. Именно регистры расчета позволяют рассчитывать записи по базе, производить вытеснение записей, формировать сторно-за- писи. Кроме этого, регистры расчета обеспечивают учет протяженных во времени расчетов, хранят период действия и фактический период действия записей. Для расчетов, зависящих от базового периода, регистр расчета также хранит данные о базовом периоде. Иными словами, хотя взаимозависимость видов расчета настраивается в планах видов расчета, расчетные механизмы платформы заложены именно в регистры расчета. Свойства регистров расчета Настройка свойств регистра расчета определяет его способность исполь- зовать описанные выше расчетные механизмы платформы (рис. 13.28). Основная задача регистра расчетов - периодическая регистрация записей о расчетах. Поэтому главными свойствами регистра являются его перио- дичность, а также виды расчетов, которые в нем будут регистрироваться. Свойство Периодичность регистра расчетов определяет размерность пери- одов, для которых будет вестись учет в этом регистре. При настройке регистра доступны следующие виды периодичности: Год, Квартал, Месяц и День. Соответственно, записи в таком регистре будут фиксироваться в привязке к конкретному году, кварталу, месяцу или дню. Периодич- ность регистра определяет вид периода регистрации записей и зависит от задачи, которую он решает. Для целей расчета зарплаты, как правило, применяют регистры с периодичностью Месяц. В одном регистре расчета могут регистрироваться записи только с видами расчета из одного плана видов расчета. Используемый в данном регистре план видов расчета указывается в свойстве регистра План видов расчета. При этом регистров, использующих один план видов расчета, может быть несколько. Том 2
ЕегистрйПрасяета Н Регистр расчета ОсиовиыеНачислемияРегя □ X [ ► Основные | Подсистемы | Функциональные опции | Данью | Перерасчеты | Регистраторы | Формы | Команды | Макеты | Права | Обмен данными | Прочее Имя: [ОсноеныеНачисленияРегл ] Синоним [Основные начисления регл ] Комментарий: [ | План видов расчета: [ОсноеныеНачисления [.„ х| Период действия @ График: [ГраФиоРаботы [,,. х| Знача но графика: [Значение [.,. х| Дата графика: [Дата х| Базовый период @ Периодичность: [Месяц |^| Представление описка: [Основные начисления (регламентированные) ] Расширенное представление списка I Пояснение: [ Действия Но-сд [ Далее» ] [ Закрыть ] [ Справка ] Рис. 13.28. Свойства регистра расчета Свойство Период действия определяет, можно ли будет в данном регистре учитывать записи, протяженные во времени. Установленное свойство Период действия позволяет для каждой записи хранить не только период регистрации, но и период действия, отражающий протяженность этой записи. Кроме этого, установка этого свойства означает, что в данном регистре будет задействован механизм вытеснения и будет формиро- ваться фактический период действия записей. Для того чтобы учитывать протяженные во времени записи, в плане видов расчета, используемом в данном регистре, должно быть установлено свойство Использует период действия. Если свойство регистра расчета Период действия не установлено, то регис- трируемые записи не будут иметь периода действия и, соответственно, протяженности во времени. В таком регистре не будет использоваться механизм вытеснения. Тем не менее, в регистре без периода действия может быть назначен план видов расчета, использующий период дейс- твия. Например, план видов расчета ОсноеныеНачисления, использующий период действия, может регистрироваться как в регистре, где будет проис- ходить расчет зарплаты (в этом регистре период действия необходим для расчета), так и в регистре, где начисления учитываются для целей налого- обложения (в этом регистре период действия не нужен), рис. 13.29. В данном случае один и тот же вид расчета из плана видов расчета, исполь- зующего период действия, зарегистрирован в двух разных регистрах, в одном из которых период действия учитывается, в другом - нет, так как в нем нет необходимости. и®
Глава113пСложн^1е]периодические]расчет^1 Рис. 13.29. Использование плана видов расчета разными регистрами расчета Если в регистре будут учитываться записи, протяженные во времени, то необходимо настроить для данного регистра свойство График. При расчете записей, являющихся протяженными во времени, часто значимость периода действия этих записей не является равномерной, то есть отдельные его части имеют различную значимость. Например, если человек дежурил с 1 по 15 сентября, то этот интервал будет периодом действия этой записи. Однако в рамках этого периода не все дни могут являться одинаковыми. Например, человек работает различное количество часов в разные дни, а в какие-то дни у него выходные. Нерав- номерность значимости периода описывается при помощи графика. График хранит определенное значение для каждой даты года. Соответс- твенно, используя график, можно оценить значимость любого периода (рис. 13.30). Рис. 13.30. Неоднородность периода
В приведенном примере график хранит количество рабочих часов в рамках каждого календарного дня. В данном случае количество часов и есть число, отражающее значимость каждого дня в периоде. Полные рабочие дни имеют значимость 8 (рабочих часов), сокращенные дни - 6, а выходные и праздничные дни имеют нулевую значимость. График в системе должен быть создан разработчиком самостоятельно как непериодический регистр сведений, у которого как минимум одно изме- рение типа Дата и как минимум один ресурс типа Число (рис. 13.31). в Ц Измерения U Дата 1_ ВмУчетаВремени 1_ График Работы 6 J Ресурсы J Знамен* = Реквизиты IF] Формы © Команды W Макеты Рис. 13.31. График регистра расчета Разработчик может создавать и более сложную структуру регистра, но указанные измерение и ресурс там должны присутствовать обязательно. Для того чтобы привязать график к регистру расчета, необходимо в поле График свойств регистра указать нужный регистр сведений. После этого в поле Значение графика нужно указать ресурс этого регистра сведений, который является значением графика. В поле Дата графика указывается измерение регистра, которое является датой графика. Необходимость указания этих полей связана с тем, что в регистре может быть более одного измерения и более одного ресурса, поэтому поля даты и значения графика должны быть указаны явно. ПОДРОБНЕЕ Раздел «Настройка протяженных во времени расчетов», стр. 25. Свойство регистра расчета Базовый период позволяет хранить в регистре базовый период записей и, соответственно, использовать механизм зави- симости по базовому периоду. Только для записей регистров расчета с установленным свойством Базовый период возможно получение значения базы. При этом свойство Базовый период устанавливается независимо от свойства Зависимость от базы выбранного плана видов расчета. Даже если в плане видов расчета установлена зависимость от базы, в регистре свойство Базовый период может быть не установлено. В этом случае в данном регистре использование зависимости по базовому периоду будет недоступно. Профессиональная разработка в системе «1С:Предприятие 8»
Структура регистров расчета В зависимости от настроек регистра расчетов его структура будет различной. Общая схема структуры регистра расчета показана на рис. 13.32. Структура регистра расчета Поля, дебевляемые разработчиком I Измерения I Только регистры с установленным свойством “Период действия" Ресурсы Только регистры с установленным свойством “Базовый период" Реквизиты Рис. 13.32. Структура регистра расчета Предопределенные поля Таким образом, в простейшем регистре расчета без периода действия и базового периода всегда будут присутствовать следующие поля: Регистратор - ссылка на документ, который ввел запись в регистр; Период регистрации - период регистра расчета, к которому относится данная запись. Размер периода определяется периодичностью регистра расчета; Вид расчета - ссылка на вид расчета, используемый в данной записи; Номер строки - порядковый номер записи в рамках данного регистратора. В рамках одного документа-регистратора номера строк уникальны. Таким образом, совокупность значений Регистратор и НомерСтроки позволяет идентифицировать конкретную запись регистра расчета; Активность - признак активности данной записи. Запись влияет на учет только в том случае, если активность установлена в значение Истина. Данное поле используется в документах прямой записи в регистр. Том 2
В таких документах не хранятся данные, необходимые для формиро- вания движений по регистру. Ввод записей производится напрямую в регистр, через вывод на форму документа таблицы с привязкой к набору записей этого регистра. В демонстрационной конфигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт-диске, таким документом является РучнойВводНачислений. Типичным примером использования такого же принципа является документ Операция в решениях по бухгалтерскому учету. При пометке на удаление такого документа нельзя удалять записи из регистра, так как их нельзя будет восстановить. Вместо этого у записей регистра расчета, введенных этим документом, свойство Активность устанавли- вается в значение Ложь. При этом записи не удаляются из базы данных, но перестают влиять на учет. При необходимости снова задейство- вать эти записи достаточно установить свойство Активность в значение Истина. Именно это происходит при снятии пометки на удаление с такого документа; Сторно - это признак типа Булево, который обозначает, является ли данная запись сторно-записью. Сторно-записи записываются в регистр со значением истина в этом поле. Если у регистра установлено свойство Период действия, то в структуре появляются следующие предопределенные поля: ПерирдДействияНачало - дата, обозначающая начало интервала периода действия записи; ПериодДействияКонец - дата, обозначающая конец интервала периода действия записи; ПериодДействия - дата, отражающая период регистра расчета, в котором действовала запись. Эта дата всегда имеет значение начала первого дня соответствующего периода (по аналогии с полем ПериодРегистрации). Примеры заполнения этих полей для регистров разной периодичности приведены на рис. 13.33. Таким образом, запись с одним и тем же интервалом периода действия при записи в регистры разной периодичности будет иметь различное значение поля ПериодДействия. Это будет начало месяца в случае поме- сячного расчета, начало квартала при поквартальном расчете и т.д. У регистров, для которых установлено свойство Базовый период, в струк- туре будут присутствовать следующие поля: БазовыйПериодНачало - дата начала интервала базового периода; БазовыйПериодКонец - дата окончания интервала базового периода.
Периодичность регистра: месяц Рис. 13.33. Пример заполнения полей «ПериодДействияНачало», «ПериодДействияКонец» и «ПериодДействия» Периодичность регистра: квартал Поля, добавляемые при разработке Для каждого регистра расчета необходимо продумать структуру изме- рений, ресурсов и реквизитов, исходя из особенностей учетной задачи. Регистр расчета может и не иметь ни измерений, ни ресурсов, ни рекви- зитов. В этом случае в регистре можно вести периодический учет записей с различными видами расчета без привязки к конкретным объектам (например, сотрудникам) и без сохранения числовых результатов расчетов (например, суммы начисления). При этом в регистре можно использо- вать период действия, будут работать механизмы вытеснения записей и перерасчетов, а также механизм зависимости по базовому периоду. При этом механизм зависимости по базовому периоду не позволит получить расчетную базу. Возможности регистра расчета в такой ситуации сильно ограничены, поэтому для решения прикладных задач, как правило, необ- ходимо задать измерения, ресурсы и реквизиты регистра.
Измерения регистров расчета Ввод измерений регистров расчета позволяет обозначить объект учета и расчета. При отсутствии измерений регистра расчетные механизмы действуют в рамках всех записей. Например, в этом случае любая запись о больничном приведет к вытеснению всех записей об окладе, для которых произойдет пересечение периодов действия. В результате добавления в регистр измерения ФизЛицо работа регистра изменится следующим образом: при вводе больничного по сотруднику Иванов будут вытеснены только записи об окладе по сотруднику Иванов за соответству- ющий период действия. На рис. 13.34 представлен регистр без измерений, где ссылка на сотрудника хранится в реквизите, а также регистр, где ссылка на сотрудника хранится в измерении ФизЛицо. Сплошными стрелками указано вытеснение записей. Регистр расчета с измеоелием физЛиао —Оклад | 01.03.2010 1 1 1 I Оклад I 01.03.2010 ! | Оклад | 01.03.2010 —| Бельничный | 07.03.2010 Рис. 13.34. Использование измерений регистра расчета Такое же разделение произойдет и для механизма зависимости по базо- вому периоду. Так, при расчете месячной премии конкретного сотрудника в базу расчета можно будет включить оклады только этого сотрудника за базовый период расчета. Измерения регистров расчета могут иметь произвольный тип. К форми- рованию структуры измерений нужно подходить аккуратно, так как они имеют специфику, отличную, например, от регистров накопления. Измерения регистров расчета не связаны с получением аналитики в опре- деленных разрезах. Профессиональная разработка в системе «1С:Предприятие 8»
ВНИМАНИЕ! Например, если необходимо учитывать все начисления в разрезе статей затрат, не нужно добавлять измерение СтатьяЗатрат! Это при- ведет к нарушению учета, потому что, например, оклад со статьей затрат Основная з/п в этом случае не будет вытеснен командировкой со статьей затрат Командировочные, так как у этих записей разные значения измерений. Статья затрат в данном случае должна быть реквизитом регистра расчета. Свойство «Базовое» измерения регистра расчета Состав измерений регистра расчета имеет существенное значение при использовании механизма зависимости по базовому периоду. В разделе «Настройка зависимости по базовому периоду» на стр. 32 будут подробно рассмотрены методы получения базы для записи регистра расчета. При этом существует возможность получать базу с учетом значений определенных измерений регистра расчета. Это означает, что система при получении базы будет связывать таблицу регистра расчета вычисляемой записи с таблицами базовых регистров расчета, и в этих связях будет использоваться соединение по измерениям текущего регистра. Например, при получении базы для премии системой может быть выполнено следующее соединение таблиц (рис. 13.35). Рис. 13.35. Пример соединения таблиц при получении базы Том 2
ЕегистрйПрасяета В данном случае таблица регистра расчета дополнительных начислений будет соединена с таблицей регистра основных начислений для получения базы. При этом помимо соединения по измерениям будет присутство- вать соединение по периодам, но при изучении данного вопроса мы его опускаем. На больших объемах данных такое соединение может выполняться достаточно долго. Для того чтобы ускорить выполнение такого запроса, необходимо создать индексы по полям, входящим в условие соединения, в данном случае это измерения ФизЛицо и Организация. Если бы такое измерение было только одно, то эта проблема решалась бы установкой свойства Индексирование у соответствующего измерения, однако в данном случае необходим составной индекс, включающий оба поля. Для оптимизации получения базы по двум и более измерениям предусмот- рено свойство Базовое измерения регистра расчета. При установке этого свойства у измерений система создаст дополнительные индексы таблицы регистра расчета следующей структуры (табл. 13.4). Таблица 13.4. Дополнительные индексы таблицы регистра расчета Состав индекса Пояснение ПериодРвгистрации +[БазовоеИзмерение1] + [БазовоеИзмерение2] +... Если базовые измерения не заданы, то просто ПериодРегистрации [БазовоеИзмерение1] + [БазовоеИзмерение2] + ПериодРвгистрации +... Если базовые измерения не заданы, то отсутствует ПериодДействия + [БазовоеИзмерение1] + [БазовоеИзмерение2] +... Если базовые измерения не заданы, то просто ПериодДействия [БазовоеИзмерение1] + [БазовоеИзмерение2] + ПериодДействия +... Если базовые измерения не заданы, то отсутствует При этом базовые измерения в индексе будут следовать в том порядке, в котором они заданы в конфигураторе. Такая структура индекса позволяет оптимизировать выполнение запросов на получение базы с соединением таблиц по набору измерений, которые отмечены как базовые. Поэтому для оптимизации работы решения следует отме- чать как базовые те измерения регистров расчета, которые наиболее часто будут использованы при получении базы. Таким образом, свойство Базовое измерения регистра расчета не влияет на логику работы конфигурации, а влияет только на производительность запросов, получающих базу. Ресурсы регистров расчета Состав ресурсов регистра расчета влияет на возможность получения расчетной базы по данному регистру для записей данного регистра или других регистров. Например, если в регистре основных начис- лений есть ресурс Результат, хранящий рассчитанную сумму начисления, то для записей этого или другого регистра можно получить расчетную
базу по этому полю, то есть сумму начислений всех записей по базовым видам расчета за базовый период. Если числовой показатель необхо- димо хранить в регистре, но в расчете по базе он не участвует, то такой показатель должен быть введен в структуру регистра как реквизит. Например, поле Размер начисления, отражающее тариф, по которому был рассчитан оклад или размер процента для начисления премии, не должно вводиться в регистр как ресурс, так как получать базу по этому полю бессмысленно. Ресурсы регистров расчета всегда имеют тип Число (рис. 13.36). Рис. 13.36. Ресурсы регистра расчета В приведенном примере база расчета премии будет содержать данные по всем ресурсам регистра основных начислений. В данном случае можно получить сумму базовых начислений (ресурс Результат) и общее количество отработанных дней в зачет (ресурс Дни). В данном примере в ресурсе Дни сохраняется значение количества отработанных дней для целей последующего расчета оплаты по среднему заработку. При расчете по среднему через механизм зависимости по базовому периоду можно будет получить как данные о сумме заработка, так и о количестве дней, засчитанных в отработанное время.
Реквизиты регистров расчета Реквизиты регистра расчета - это произвольные дополнительные поля, которые необходимо хранить в регистре. Эти данные могут исполь- зоваться как при расчете записи, так и для формирования отчетов по регистру расчета. Например, реквизит РазмерНачисления участвует в формуле расчета записей, а реквизит СтатьяЗатрат может использо- ваться как группировка или отбор в отчете по начислениям. Добавление в регистр нового реквизита не оказывает принципиального влияния на учет и работу данного регистра (за исключением случаев, когда реквизит связан с графиком, см. раздел «Настройка протяженных во времени расчетов» на стр. 25). Структура таблиц базы данных Данные каждого регистра расчета в базе данных хранятся в виде одной основной таблицы. Структура таблицы определяется настройками регистра. В зависимости от настроек таблица будет содержать предопре- деленные поля, а также поля, добавленные разработчиком (табл. 13.5). Какими настройками определяется существование в таблице этих полей, а также их предназначение описано в разделе «Структура регистров расчета» на стр. 21. Таблица 13.5. Таблица регистра расчета X § |Начало S* ф X £ Начало S* ф X -? а. X X X S S £ £ е X X &£ Q. Q. g О Q. Р >х >х >х Ф С Ф С g 5 8. ь Q. 3" й f t t J) m J) m О X О X X X Q. ф О 5 ф ф ф й со ге g С Z СО с С С ш LQ о 01. 01. 01. 28. 02. ‘Начисление 02. 02. 02. 10 зарплаты № 1 1 Оклад 10 10 10 Истина Ложь 01. 01. 14. 24. 02. ‘Начисление 02. 02. 02. 10 зарплаты № 1 2 Командировка 10 10 10 Истина Ложь 01. 01. 01. 28. 02. ‘Начисление 02. 02. 02. 10 зарплаты № 1 3 Оклад 10 10 10 Истина Ложь 01. 01. 01. 31. 03. ‘Начисление 03. 03. 03. 10 зарплаты № 2 1 Оклад 10 10 10 Истина Ложь 01. 01. 01. 31. 01. 28. 03. ‘Начисление 03. 03. 03. 02. 02. 10 зарплаты № 2 2 Надбавка 10 10 10 10 10 Истина Ложь Профессиональная разработка в системе «1С:Предприятие 8»
В данной таблице поля ПериодРегистрации, Регистратор, НомерСтроки, ВидРасчета, Активность и Сторно присутствуют в таблице регистра неза- висимо от его настроек. Поля ПериодДействия, ПериодДействияНачало, ПериодДействияКонец, БазовыйПериодНачало и БазовыйПериодКонец будут присутствовать в таблице в зависимости от настроек, указанных выше. Кроме указанных полей, в таблице присутствуют дополнительные поля на каждое добавленное разработчиком измерение, ресурс и реквизит. Важно помнить, что в полях ПериодРегистрации и ПериодДействия хранятся даты начала соответствующего расчетного периода. Это нужно учитывать при построении отчетов. Например, при построении отчета по начис- лениям с условием по периоду действия с 03.02.2010 по 28.02.2010 в выборку не попадет ни одна запись, так как все записи, у которых период действия приходится на февраль, будут в поле ПериодДействия содержать значение 01.02.2010 00:00:00. Для регистров, использующих период действия, данные о фактическом периоде действия записей не хранятся в основной таблице. Для хранения этих данных для каждого такого регистра существует отдельная физи- ческая таблица следующей структуры (табл. 13.6). Таблица 13.6. Таблица фактического периода действия Регистратор Номер строки Дата начала интервала Дата окончания интервала ’Начисление зарплаты № 1 1 01.02.2010 13.02.2010 ’Начисление зарплаты № 1 1 25.02.2010 28.02.2010 ’Начисление зарплаты № 1 2 01.02.2010 28.02.2010 Названия полей приведены условно, так как таблица не предназначена для работы напрямую средствами встроенного языка. Заполнение таблицы производится системой автоматически при записи в регистр расчета с формированием фактического периода действия. Чтение данных этой таблицы доступно в запросе через виртуальную таблицу Фактичес- кийПериодДействия или специальными методами встроенного языка. ПОДРОБНЕЕ Раздел «Использование механизма вытеснения», стр. 25. Значения полей Регистратор и Номер строки однозначно указывают на запись основной таблицы, то есть запись регистра расчета. Для каждой записи основной таблицы, то есть для каждой пары значений регистратора и номера строки, в таблице могут храниться несколько непересекающихся интервалов фактического периода действия, даты начала и окончания которых хранятся в соответствующих полях таблицы. Если запись имеет пустой фактический период действия, в физической таблице даты начала и окончания интервала фактического периода действия для такой записи будут равны значению даты по умолчанию ('01.01.0001 00:00:00'). Том 2
Н астрой ка] п р отя жен н G i х< во] времени! расу ёто в НАСТРОЙКА ПРОТЯЖЕННЫХ ВО ВРЕМЕНИ РАСЧЕТОВ Использование механизма вытеснения Настройка планов видов расчета и регистров расчета Для организации учета протяженных во времени расчетов у плана видов расчета должно быть установлено свойство Использует период действия. Это позволит настраивать в видах расчета взаимное вытеснение путем заполнения предопределенной табличной части ВытесняющиеВи- дыРасчета. В используемом регистре расчета должно быть установлено свойство ПериодДействия, а также привязан график. При такой настройке все записи регистра помимо периода регистрации будут хранить данные о периоде действия, то есть о протяженности во времени. Формирование фактического периода действия При формировании записи в регистре расчета, поддерживающем период действия, происходит анализ конкуренции за период действия вводимого вида расчета с существующими в регистре записями. Результатом такой конкуренции будет изменение фактического периода действия вводимой или существующих записей. Понятие фактического периода действия применимо только к конк- ретной записи регистра расчета. При этом данные о фактическом периоде действия не хранятся в основной таблице регистра расчета, но могут быть получены системными средствами, о которых речь пойдет ниже. Фактический период действия записи можно представить в виде таблицы следующего вида (табл. 13.7). Таблица 13.7. Фактический периоддействия ДатаНачала ДатаОкончания 01.02.2010 13.02.2010 18.02.2010 28.02.2010 Каждая строка этой таблицы представляет собой один интервал факти- ческого периода действия. При отсутствии вытесняющих записей результатом формирования фактического периода действия будет одна строка таблицы. Интервал, заданный в этой строке, будет совпадать с пери- одом действия записи. При изменении фактического периода действия в результате ввода вытесняющих записей содержимое таблицы меня- ется, в ней остаются только интервалы, на которых запись не вытеснена другими записями. Пример изменения фактического периода действия приведен на рис. 13.37.
Рис. 13.37. Изменение фактического периода действия Таким образом, при вытеснении записи период действия не меняется, изменяется только состав таблицы фактического периода действия. При формировании фактического периода действия происходит анализ конкуренции записей только в рамках данного регистра расчета. Иными словами, запись регистра расчета может вытеснять только записи этого же регистра. При анализе конкуренции видов расчета на пересечении периодов действия учитывается период регистрации записей. Если запись с вытесняющим видом расчета имеет более поздний период регистрации, чем запись с вытесняемым видом расчета, механизм вытеснения работать не будет. При этом конкурирующие записи все равно не могут иметь пересекаю- щийся период действия, поэтому фактический период действия записи с более поздним периодом регистрации будет пустым на интервале пере- сечения. При формировании фактического периода действия учитывается наличие в анализируемом периоде сторно-записей по конкурирующим видам расчета. Если на интервале пересечения конкурирующих видов расчета присутствуют сторно-записи, то фактический период действия записи с более поздним периодом регистрации будет непустым на интер- вале периода действия сторно-записи конкурирующего вида расчета. Получение фактического периода действия при помощи запроса Для получения фактического периода действия при помощи запроса предусмотрена виртуальная таблица фактического периода действия. Структура полей этой таблицы полностью идентична структуре основной таблицы регистра расчета. Единственное ее отличие от основной таблицы состоит в том, что поля ПерирдДействияНачало и ПериодДействияКонец обозначают не собственно период действия, а интервал фактического
периода действия. Если фактический период действия записи задается несколькими интервалами, то в виртуальной таблице такая запись будет представлена несколькими строками (рис. 13.38). Оставим таблица регистра расчета Пер нодРег же грации ВхдРасчета ПеркодДействия ПерходДействхяНатале ПерходДействняКохец 01.02.2010 Оклад 01.022010 01.02.2010 28.02.2010 01.02.2010 Надбавка 01.022010 01.02.2010 28.02.2010 Виртуальная таблица ФактичвскнмПермодД^чствня ПериодРегистрации ВмдРасчета ПернодДвйствня ПерходЦеЙстажяНатале ПерходЦействняКохец 01.022010 Оклад 01.022010 01.022010 13X12.2010 01Л22010 Оклад 01.022010 18.022010 28X12.2010 01.022010 Надбавка 01.022010 01.022010 28X12.2010 Рис. 13.38. Фактический периоддействия В каждой из этих строк все данные повторяют данные строки основной таблицы, за исключением полей ПериодДействияНачало и ПериодДейст- вияКонец, которые обозначают границы интервалов фактического периода действия. Пример запроса, который считает количество календарных дней факти- ческого периода действия каждой записи документа, представлен в листинге 13.1. Листинг 13.1. Получение количества календарных дней фактического периода действия запросом Запрос = Новый Запрос; Запрос.Текст = ” |ВЫБРАТЬ | ФактическийПериод.НомерСтроки, | СУММА(РАЗНОСТЬДАТ(ФактическийПериод.ПериодДействияНачало, | КОНЕЦПЕРИОДА(ФактическийПериод.ПериодДействияКонец, ДЕНЬ), | ДЕНЬ)) +1 КАК КоличествоДней |ИЗ | РегистрРасчета.ОсновныеНачисленияРегл.ФактическийПериодДействия( | Регистратор = &Регистратор) КАК ФактическийПериод |СГРУППИРОВАТЬ ПО | ФактическийПериод.НомерСтроки"; Запрос.УстановитьПараметрС'Регистратор", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Количество дней фактического периода для строки №" + Выборка.НомерСтроки +":" + Выборка.КоличествоДней; Сообщение.Сообщить(); КонецЦикла; Профессиональная разработка в системе «1С:Предприятие 8»
ВНИМАНИЕ! В запросе при получении фактического периода действия использу- ется функция КонецПериода(). Но лучше сразу при записи движений в регистр расчета обеспечить попадание в регистр даты с «правильным» (на конец дня) временем. Для этого при записи движений в регистр расчета нужно написать, например, Движение.ПериодДействияКонец = КонецДня(ТекСтрокаНачисления.ДатаОкончания). ПОДРОБНЕЕ Этот фрагмент присутствует в обработке ДанныеРегистраРасчета в демонстрационной конфигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт-диске. Необходимо очень внимательно подходить к установке параметров вирту- альных таблиц. Виртуальная таблица по сути представляет собой запрос, который платформа самостоятельно строит по таблицам базы данных. Виртуальная таблица фактического периода действия формируется запросом по основной таблице регистра расчета и таблице фактического периода действия. У этой таблицы присутствует единственный пара- метр Условие. Если его заполнить, можно передать определенное условие в запрос платформы, формирующий виртуальную таблицу. В данном случае нас интересует фактический период действия только по движениям одного документа, поэтому в параметр Условие необходимо передать текст Регистратор = &Регистратор, после чего указать ссылку на документ как значение параметра Регистратор. В этом случае в вирту- альную таблицу попадет только фактический период действия для записей этого документа. Если то же самое условие задать не в виртуальной таблице, а в самом запросе через конструкцию ГДЕ, то результат будет аналогичным, но производительность существенно снизится, так как сначала будет сформирована виртуальная таблица фактического периода действия для всех записей регистра расчета, а потом запрос отберет из них те, которые относятся к нужному документу. Таким образом, в запросе будет обработано большое количество лишней информации. Использование графиков Протяженные во времени расчеты тесно связаны с данными графика, используемого в регистре расчета. Как уже отмечалось, данные графика содержат определенные значения для каждого календарного дня периода. Регистр расчета рассматривает график как таблицу следующего вида (табл. 13.8). Таблица 13.8. Таблица графика Дата графика 01.02.2010 02.022010 03.02.2010 04.022010 28.02.2010 Значение графика 1 1 1 1 Том 2
Н астрой ка] п р отя жен н G i х< во] времени! расу ёто в Эти данные хранятся в системе в виде регистра сведений, созданного при разработке конфигурации. При этом дату графика платформа полу- чает из измерения, заданного в свойствах регистра расчета в поле Дата графика, а значение графика - из ресурса, указанного в поле Значение графика. Рассмотрим использование данных графика на примере. Пусть в регистре сведений ГрафикиРаботы хранятся следующие значения для календарных дней февраля (табл. 13.9). Таблица 13.9. Календарный график февраля 1 2 3 4 5 6 7 6 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Фактически этот график представляет собой пятидневный график работы с двумя выходными и праздником 23 февраля. Рабочие дни в качестве значения имеют 1, выходные и праздники - 0. Использование данных графика для расчета записей Пример записи, расчет которой зависит от данных графика, - оклад по месячной тарифной ставке. Для расчета этой записи используется размер тарифа, а также данные о количестве рабочих дней в периоде и количестве фактически отработанных дней в этом периоде. Роль графика состоит в том, чтобы данные о фактически отработанных днях и норме дней могли быть получены системой автоматически. Формула расчета результата начисления в данном случае выглядит следу- ющим образом: Результат = Тариф * Кол-во отработанных дней / Кол-во рабочих дней периода Тариф может быть получен, например, из реквизита Размер регистра расчетов (например, 5 000 рублей). Для получения количества отрабо- танных и рабочих дней будут необходимы данные графика. Количество рабочих дней можно получить, просуммировав значения графика за период действия записи. Таким образом, если оклад назначен за месяц, будут просуммированы значения графика за весь месяц. Количество фактически отработанных часов может быть получено путем суммиро- вания значений графика за все интервалы фактического периода действия данной записи (рис. 13.39). Полученные таким образом данные могут быть использованы в формуле расчета оклада: Результат = 5000 * 12 /19 = 3157,89
1 | z | 3 | 4 | 4 | в | 7 | » | » | 10 | 11 | Iz | и | 14 | В | и | П | 1в | H | al | zl | И | и | M | И | М|ТГ|ТГ| Сумма значений графика за период действия - нормадней (всего 19) т т т т тг т^ тг тг тг тг тг тг тг тг тг тг тг тг тг тг тг тг тг тг тг тг тг 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Сумма значений графика за фактический период действия-отработано дней (всего 12) Рис. 13.39. Получение данных графика Использование данных графика для вычисления части записи В определенных ситуациях для протяженных во времени записей возни- кает необходимость вычислить значения ресурсов только части записи, попавшей в определенный интервал. Такая задача, в частности, возни- кает при частичном пересечении записью базового периода другой записи (рис. 13.40). Оклад пересекает базовый период гцземюн частично Рис. 13.40. Частичное пересечение с записью базового периода В данном случае вводится запись о премии на первую половину месяца. Следовательно, начисленный за месяц оклад в размере 10 000 рублей попа- дает в базовый период премии только частично. Таким образом, регистр расчета должен включить в базу расчета премии только часть из начис- ленных 10000 рублей. Делить сумму по количеству календарных дней, в данном случае поровну, было бы некорректно, так как в первой поло- вине месяца могло быть больше рабочих дней, чем во второй. Поэтому для вычисления части записи, попадающей в определенный период, исполь- зуются данные графика, которые служат относительным весом каждого 2®
дня этого периода. Иными словами, база расчета премии в данном случае будет рассчитана системой следующим образом: База расчета = Результат оклада * (Значения графика, попавшие в базовый период / Значения графика за период действия оклада) Данные графика будут использованы следующим образом^ Сумма значении графика за часть периода действия оютада, пересекающую базовый период премии (всего 11) Сумма значении графика за весь период действия оклада (всего 19) Рис. 13.41. Получение данных графика Расчетная база премии по окладу в этом случае составит (рис. 13.41): База расчета = 10 000 *11 /19 = 5 789,47 Настройка использования нескольких графиков в одном регистре расчета Выше было описано, каким образом можно привязать данные графика, хранящиеся в регистре сведений, к регистру расчета. Однако, как правило, при расчете записей используются различные данные графика. Например, один из сотрудников получает оклад по дням, и для его расчета нужен график, где рабочие дни отмечены значением 1, как в приведенных выше графиках. Другой сотрудник может получать оклад по часам, и для расчета нужен график, значением которого является количество рабочих часов в каждом календарном дне. Более того, сотрудники могут работать по разным графикам работы. Например, бухгалтер работает по пятидневке, а охранник - в режиме сутки через двое. Иными словами, для каждого сотрудника необходимо задавать различное значение графика для одной даты. При этом все эти начисления рассчитываются в одном регистре, а система позволяет привязать к регистру только один график. Для реализации хранения разных вариантов графика необходимо в соответствующем регистре сведений добавить новые измерения. Так, для хранения различных графиков для целей расчета зарплаты по дням или по часам можно ввести в регистр сведений новое изме- рение ВидУчетаВремени, тип которого - перечисление ВидыУчетаВремени с двумя возможными значениями - ПоДням и ПоЧасам. В этом случае для каждой даты графика можно будет указать два разных значения, каждое из которых будет соответствовать определенному виду учета времени. Профессиональная разработка в системе «1С:Предприятие 8»
Для того чтобы реализовать возможность хранения различных графиков работы (пятидневка, шестидневка и т.д.), можно добавить в регистр сведений еще одно измерение ГрафикРаботы, имеющее тип Спра- вочникСсылка.ГрафикиРаботы. Такая настройка позволит в режиме 1С:Предприятие создавать неограниченное количество графиков работы и вводить данные по ним в регистр сведений. Для каждого графика работы можно будет заполнить график как по дням, так и по часам. Эти данные могут быть использованы в последующих расчетах. Структура регистра сведений после этих изменений показана на рис. 13.42. Рис. 13.42. Структура регистра сведений «ГрафикиРаботы» Такая структура обеспечивает хранение в одном регистре сведений неогра- ниченного количества различных графиков. После разработки структуры регистра необходимо указать регистру расчета, какой конкретно график должен быть использован для расчета каждой записи. Для этого необходимо связать измерения или ресурсы регистра расчета с измерениями регистра сведений графиков. Иными словами, в каждой записи регистра расчета должна содержаться информация, необходимая для построения отборов по измерениям регистра сведений графиков. На основании данных записи регистра расчета должен быть определен конкретный график работы. Например, для регистра сведений приведенной выше структуры в регистре расчета должны фиксироваться данные о конкретном графике работы и виде учета времени, которые должны быть использованы в данной записи. Для этого нужно добавить в структуру регистра расчета допол- нительные поля (измерения или реквизиты в зависимости от специфики задачи), после чего связать эти поля с измерениями регистра сведений графиков (рис. 13.43). Перко дРег метр ации ВвдРас чета Физ Ливр ГрафикРаботы ВмдУчетаВренвкх 01.02.2010 Оклад Иванов Пятидневка ПоДням 01.02.2010 Оклад Петров Сутки через двое ПоЧасам 8- § ГрафикмРаботы 8 Ц Измерения L. Дата ► Ц. ВкаУчетаВрамени » L, ГрафикРаботы Рис. 13.43. Записи регистра расчета Том 2
Н астрой ка] п р отя жен н G i х< во] времени! расу ёто в В этом случае для расчета оклада сотруднику Иванов будет использован график работы Пятидневка с видом учета времени По дням, а сотруднику Петров оклад будет рассчитан по часам по графику работы Сутки через двое. Соответствующие графики будут получены системой из регистра сведений с отбором по указанным в записи значениям измерений ГрафикРаботы и ВидУчетаВремени. Связь измерений и реквизитов регистра расчета с измерениями регистра сведений производится через свойство Связь с графиком соответствующих полей регистра расчета (рис. 13.44). Свойства: ГрафикРаботы rj X И И»' х __________________________________________ ▼ Основные: Имя [ГрафикРаботы ] Синонич [График работы J Комментарий [ [ — Тип |СгравочникСсылка.ГраФикиРаботы [▼.,"] ▼Данные: ▼ Использование: ▼ Рис. 13.44. Связь измерения с графиком В данном примере для реквизита ГрафикРаботы регистра расчета в свойстве Связь с графиком указано соответствующее измерение регистра сведений, в котором хранятся данные графика. Получение данных графика при помощи запроса Для получения данных графика при помощи запроса используется вирту- альная таблица данных графика регистра расчета. Эта виртуальная таблица имеет единственный параметр - Условие, позволяющий передать произ- вольное условие в запрос, который платформа формирует по таблицам базы данных для получения виртуальной таблицы. Виртуальная таблица данных графика расширяет структуру основной таблицы, добавляя для каждой ее строки данные графика за все возможные виды периодов (рис. 13.45). Количество строк в виртуальной таблице равно количеству записей регистра расчета, удовлетворяющих условию, заданному в пара- метре виртуальной таблицы. Первая часть полей виртуальной таблицы данных графика полностью совпадает с полями основной таблицы регистра. Дополнительные поля добавляются по числу ресурсов регистра сведений графиков. На каждый ресурс в виртуальной таблице данных графика будет добавлено 4 поля, в которых будут рассчитаны значения графика по данному ресурсу за каждый из возможных периодов: период действия, фактический период действия, базовый период и период регистрации.
Глава113пСложн^1е]периодические]расчет^1 я-Го —— ПериодРегистрации IJ-— Регистратор — — НомерСтроки I ВиоРасчетв — « ПериооДействия — — ПарипрД^йгтАиаМ яцала — т ПериодДействияКонец - - БаэовыйПериодНачало -- БаэовыйПериодКонец — — Активность —т СТОРНО IJ-L. ФизЛицо — L. Организация — | Результат —— Размер 11— ГраФикРаботы . I Ь— ВидУчетаВремени S — — ЗначениеПериодДействия *1 — — ЗначениеФактическийПериодДействия I • — — — ЗначениеБазоеьйПериод Г -- ЗначениеПериодРегистрации J -- ДополнительноеЗначениеПериодДействия —— ДололнительноеЗначениеФакгическийПериодДействия —— ДололнительноеЗначениеБазовыйПериод —- ДополнительноеЗначениеПериодРегистрации | Данные основной J таблицы регистра I расчета Даням е графика по каждому ресурсу регистра сведений трафиков Рис. 13.45. Виртуальная таблица «ДанныеГрафика» Использование виртуальной таблицы данных графика позволяет получить данные графика не только по ресурсу регистра сведений, являющемуся значением графика, но и по любым другим ресурсам этого регистра. Виртуальная таблица также позволяет получить данные графика для набора записей с произвольным условием, например, не принадлежащих одному регистратору. Ниже приведен текст модуля, позволяющий получить данные графика за фактический период действия для всех записей документа (листинг 13.2). ПОДРОБНЕЕ Этот фрагмент присутствует в демоконфигурации в обработке ДанныеРегистраРасчета. Листинг 13.2. Получение данных графика запросом Запрос = Новый Запрос; Запрос.Тексг =" ВЫБРАТЬ ДанныеГ рафика.НомерСтроки, ДанныеГрафика.ЗначениеФакгическийПериодДействия КАК Данные РегисгрРасчета.ОсновныеНачисленияРегл .ДанныеГ рафика (Регистратор = &Регистратор) КАК ДанныеГрафика"; Эагиг‘тпатлпи P/M.iniraV Запрос.УстановитьПараметрС'Регистратор", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Данные фафика по фактическому периоду для строки № ” + Выборка.НомерСтроки +":" + ВыборкаДанные; Сообщение.Сообщить(); КонецЦикла;
Сторнирование Конкуренция с записями более раннего периода регистрации Возможность указать для записи период действия, отличный от периода регистрации, существует только у регистров, поддерживающих период действия. В этом случае, если у записи период действия раньше периода регистрации (то есть запись зарегистрирована «с опозданием»), эта запись может вступать в конкуренцию за период действия с запи- сями более раннего периода регистрации. При этом механизм вытеснения действовать не будет, так как запись имеет более поздний период регис- трации, но конкуренция видов расчета останется. В результате у записи с более поздним периодом регистрации может образоваться меньший фактический период действия в силу того, что она не может действовать одновременно с конкурирующими видами расчета. Например, больничный за март, введенный в апреле, вступает в конку- ренцию с дежурством, зарегистрированным и действовавшим в марте. В результате фактический период действия больничного будет меньше периода действия, так как записи не могут пересекаться по фактическому периоду действия (рис. 13.46). Рис. 13.46. Конкуренция в прошлом периоде В данном случае фактический период действия больничного на интервале с 15 по 22 марта будет пустым, так как этот интервал уже занят конкури- рующим расчетом, введенным ранее. Наличие сторно-записи по виду расчета Дежурство позволит записи о больничном занять весь свой период действия. При формировании фактического периода действия больничного будет учтен период дейс- твия сторно-записи по дежурству (рис. 13.47). Таким образом, при формировании записей, которые вступают в конку- ренцию с записями более раннего периода регистрации, необходимо ввести также сторно-записи по конкурирующим видам расчета, иначе Профессиональная разработка в системе «1С:Предприятие 8»
фактический период действия будет пустым на интервалах пересечения периода действия конкурирующих записей. ^Дежурство----------------------------- Больничный Период ре гистрацми Период ре гисГрации 15.03 22.03 март Рис. 13.47. Использование сторно-записей Формирование сторно-записей. Метод «ПолучитьДополнениеО» Сторно-записи, «прикрывающие» фактический период действия вводимой записи с более поздним периодом регистрации, могут быть сформиро- ваны вручную стандартными методами формирования записей регистра расчета. В этом случае разработчик должен самостоятельно предусмот- реть алгоритм, по которому будут сформированы сторно-записи, исходя из первоначального набора записей. Это достаточно сложный путь, пред- полагающий самостоятельный анализ взаимодействия периодов действия конкурирующих записей. Вместо формирования собственных алгоритмов можно воспользоваться методом ПолучитьДополнениеО объекта РегистрРасчетаНаборЗаписей. Суть его состоит в том, что система самостоятельно анализирует возможные конфликты формируемого набора записей с записями, имеющими более ранний период регистрации. Если обнаруживается пере- сечение периодов действия с конкурирующими записями, на каждое такое пересечение система предложит сформировать сторно-запись, которая позволит вводимому набору записей сохранить фактический период действия. При этом система укажет, по каким видам расчета необходимо ввести сторно-записи и какой период действия они должны иметь. Метод ПолучитьДополнениеО применяется к набору записей регистра расчета, поддерживающего период действия, и не требует указания пара- метров. Данный метод возвращает значение типа ТаблицаЗначений, в котором содержатся все необходимые данные для формирования стор- Том 2
Н астрой ка] п р отя жен н G i х< во] времени! расу ёто в но-записей. Таблица включает значение всех полей записей, для которых должны быть введены сторно-записи (кроме полей Регистратор и НомерС- троки, которые не нужны для формирования сторно-записей), а также дополнительные поля - период регистрации сторно-записи и даты начала и окончания периода действия сторно-записи. В приведенном примере для набора записей, состоящего из одной записи о больничном, метод ПолучитьДополнение() вернет таблицу следующего вида (табл. 13.10). Таблица 13.10. Запись дополнения Период регистрации Вид расчета Период действия Период регистрвции сторно Период действия начало сторно Период действия конец сторно 01.03.2010 Дежурство 01.03.2010 01.04.2010 15.03.2010 22.03.2010 Полученная таблица позволяет ввести необходимые сторно-записи без дополнительных вычислений. Ниже приведен текст модуля, в котором используется метод ПолучитьДополнение() и формируются сторно-записи в регистре расчета (листинг 13.3). ПОДРОБНЕЕ Пример использования данного метода можно также посмотреть в демо- конфигурации в обработке ДанныеРегистраРасчета. Листинг 13.3. Получение дополнения // Получить набор записей текущего документа. НаборЗаписей = РегистрыРасчета.ОсновныеНачисленияРегл.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Ссылка, Истина); НаборЗаписей.Прочитать(); // Получить таблицу сторно-записей для набора записей текущего документа. ТаблицаСторно = НаборЗаписей.ПолучитьДополнение(); // Сформировать сторно-записи в регистре расчета Для Каждого СтрокаСторно из ТаблицаСторно Цикл Запись = Движения.ОсновныеНачисленияРегл.Добавить(); Запись.ВидРасчета = СтрокаСторно.ВидРасчета; Запись.ПериодРегисграции = СтрокаСторно.ПериодРегистрацииСторно; Запись.ПериодДейсгвияНачвло = СтрокаСторно.ПериодДейсгвияНачвлоСторно; Запись.ПериодДейсгвияКонец = СтрокаСторно.ПериодДействияКонецСторно; // Заполнить измерения и реквизиты записи II... Запись.Сторно = Истина; КонецЦикла; Таким образом, сторно-записи имеют те же значения полей, что и исходные записи, за исключением периода регистрации и периода
Глава113пСложн^1е]периодические]расчет^1 действия. Сторно-записи отличаются от обычных записей значением Истина в предопределенном поле Сторно. Так, сторно-запись по дежурству будет выглядеть следующим образом (табл. 13.11). Таблица 13.11. Сторно-запись по дежурству Период регистрации Вид ресчета Периоддействия начало Периоддействия конец Сторно 01.04.2010 Дежурство 15.03.2010 22.03.2010 Истина Значения ресурсов сторно-записи не переносятся из исходной записи. Сторно-записи должны рассчитываться в том же порядке, что и обычные записи. ПОДРОБНЕЕ Раздел «Технология формирования и расчета записей регистров расчета», стр. 37. НАСТРОЙКА ЗАВИСИМОСТИ ПО БАЗОВОМУ ПЕРИОДУ Настройка планов видов расчета и регистров расчета Настройка зависимости от базы Для возможности ввода и расчета записей, зависимых по базовому периоду от других записей, необходимо настроить свойства соответству- ющих планов видов расчета и регистров расчета. В плане видов расчета, виды расчета которого будут зависеть по базовому периоду от других видов расчета, необходимо настроить зависимость от базы. Для этого свойство Зависимость от базы плана видов расчета должно быть установлено в одно из значений Зависит по периоду действия или Зависит по периоду регистрации. Зависимость по периоду действия предполагает анализ пересечения фактического периода действия записей базовых видов расчета с базовым периодом текущей записи. При такой зависимости возможно частичное попадание какой-либо записи в базу расчета текущей записи. Если у записи по базовому виду расчета нет периода действия, то будет проанализи- ровано попадание периода регистрации этой записи в базовый период текущей записи. Рассмотрим механизм зависимости от базы по периоду действия на примере начисления премии за 3 месяца, у которой базовый период установлен с 15.01.2010 по 15.04.2010 (рис. 13.48). В список базовых видов расчета этой премии входят виды расчета Оклад и Премия за месяц.
Базовый период расчета премии январь февраль март апрель май Рис. 13.48. Зависимость от базы по периоду действия Для базовых расчетов, имеющих период действия (в данном случае Оклад), будет анализироваться пересечение их фактического периода действия с базовым периодом премии. В данном случае оклад за январь и за апрель попадут в базовый период частично, а оклады на февраль и март - полно- стью. Если расчет попал в базу частично, в расчетную базу попадет только часть значения ресурсов этой записи. При вычислении этой части будут использованы данные графика записей об окладе. ПОДРОБНЕЕ Раздел «Настройка протяженных во времени расчетов», стр. 25. Для базовых расчетов, не имеющих периода действия (в данном случае Премия за месяц), будет проанализировано попадание периода регистрации в базовый период премии. Так как период регистрации - это фиксиро- ванная дата начала расчетного периода, такая запись либо полностью попадет в базовый период, либо не попадет совсем. В данном случае премия за январь вообще не будет учтена при расчете базы, а премия за апрель будет учтена полностью. Зависимость по периоду действия может быть установлена независимо от того, использует ли данный план видов расчета период действия или нет. В данном случае важен период действия не рассчитываемой записи, а базовых записей, на основании которых она рассчитывается. В приве- денном примере премия не использует период действия, при этом она зависит по периоду действия от других записей, например, начисленных окладов. В случае зависимости по периоду регистрации у базовой записи берется ее период, отсчитываемый от значения поля ПериодРвгистрации. Например, при периодичности базового регистра Месяц будет анализироваться пере- сечение периода от даты ПериодРвгистрации плюс месяц записей базовых видов расчета с базовым периодом текущей записи. Период действия базовых записей в данном случае значения не имеет. Профессиональная разработка в системе «1С:Предприятие 8»
Такой формат зависимости часто используется при расчете удержаний, так как удержания, как правило, рассчитываются с начисленных за период сумм, независимо от того, когда они действовали. В таких случаях важен период регистрации базовых записей, а не период действия. Например, при расчете удержания по исполнительному листу за март будет учтена оплата больничного, начисленная в марте, даже если работник реально болел в феврале (рис. 13.49). Базовьй период расчета удержания Надбавка Оклад февраль [^^дёржани^тЗсполнительномПмстт^! март апрель Рис. 13.49. Расчет удержания по исполнительному листу В данном случае в базу расчета удержания попадет оклад за март, а также больничный за февраль, зарегистрированный в марте. При этом мартов- ская надбавка, зарегистрированная в апреле, в базу расчета не попадет. При настройке расчетов, зависимых от базы по периоду регистрации, необходимо помнить, что период регистрации - это всегда дата начала периода, поэтому базовый период должен заполняться с учетом этого. После настройки зависимости от базы необходимо указать, от каких видов расчета могут зависеть по базовому периоду виды расчета текущего плана видов расчета. Для этого нужно указать список базовых планов видов расчета в свойствах текущего плана видов расчета. В результате этой настройки в любом виде расчета текущего плана видов расчета в табличной части БазовыеВидыРасчета можно будет выбрать любой вид расчета отме- ченных планов видов расчета. В данном случае расчет дополнительных начислений может базироваться на данных основных и дополнительных начислений. При такой настройке для вида расчета Премия за 3 месяца в списке базовых можно будет указать оклад из основных начислений и премию за месяц из дополнительных (рис. 13.50). Указанная настройка плана видов расчета будет действовать во всех регис- трах расчета, где участвует этот план видов расчета. В данном случае рассчитывать премии от оклада можно будет как в регламентированном, так и в управленческом учете. Более того, можно будет рассчитать, например, управленческую премию по окладам, начисленным в регла- ментированном учете. Том 2
Настройка1зависимости1по1базовому]периоду^ ГТЙспользчет период действий - Зависимость от базы-------------- О Не зависит (•) Зависит по периоду действия О Зависит по периоду регистрации Базовые планы видов расчета: 0^ ОсноеныеНачисления 0^ ДополнигельныеНачисления Удержания ® Пео>И»заЗ месяца!... (1 ^Предприятие) @| 1IBI О 1 М М+ М- 1 □ X Премия за 3 месяца (Дополнительное начисление) [ Записать и закрыть ] 63 Все действия » | (?) Код: [0000000002 ) Намменованж|Премия за 3 месяца ] Настройка | [ Базовые виды расчетов 11 Ведущие виды расчетов | © Добавить | X | 4 Ф Все действидл-!» Вид расчета ' План видов расчета “Основные начисления" Рис. 13.50. Настройка зависимости по базовому периоду План видов расчета "Дополнительные начисления" Ввод записей, зависимых по базовому периоду Для того чтобы можно было рассчитать запись по базе других записей, у этой записи в регистре должен быть указан базовый период, либо у соот- ветствующего вида расчета должно быть установлено свойство Период действия является базовым периодом. В противном случае базовый период будет пустым, и определить расчетную базу будет невозможно. Записи, зависимые по базовому периоду, могут формироваться только в регистре расчета, у которого установлено свойство Базовый период. Базовый период записи задается двумя датами БазовыйПериодНачало и БазовыйПериодКонец. В качестве базового периода можно указать произ- вольный интервал, в том числе перекрывающий несколько расчетных периодов. Запись о премии за 3 месяца будет выглядеть следующим образом (табл. 13.12). Таблица 13.12. Запись с указанием базового периода Период регистрации Вид ресчета Базовый период начало Базовый период конец 01.05.2010 Премия за 3 месяца 15.01.2010 15.04.2010 В базу расчета данной записи входят все записи любых регистров по видам расчета Оклад и Премия за месяц, у которых фактический период действия пересекает интервал с 15 января по 15 апреля.
Наиболее сложным вариантом зависимости по базовому периоду явля- ется установка у вида расчета свойства Период действия является базовым периодом. В этом случае в качестве базового периода система будет использовать фактический период действия записи с этим видом расчета. Это свойство является предопределенным и может быть задано только у видов расчета из плана видов расчета, использующего период действия, с установленным свойством Зависимость от базы по периоду действия или по периоду регистрации. Рассмотрим действие этого свойства на примере вида расчета Надбавка за вахту. Этот вид расчета предусматривает процентную надбавку к окладу на период работы на вахте. При этом надбавка за вахту не начис- ляется, если в это же время человек получает надбавку руководителю. Таким образом, вид расчета Надбавка за вахту зависит по базовому периоду от вида расчета Оклад. Кроме этого, надбавка за вахту вытесняется видом расчета Надбавка руководителю. То есть у вида расчета Надбавка за вахту в списке базовых указан Оклад, а в списке вытесняющих - Надбавка руководителю. Для расчета этой надбавки необходимо рассчитать сумму оклада за факти- ческий период действия надбавки, так как нужно учитывать вытеснение надбавкой руководителю. То есть базовым периодом надбавки должен быть ее фактический период действия. Такой базовый период нельзя задать только двумя датами БазовыйПериодНачало и БазовыйПериодКонец, так как фактический период действия может состоять из нескольких интервалов. Поэтому для вида расчета Надбавка за вахту необходимо уста- новить свойство Период действия является базовым периодом (рис. 13.51). Надбавка руководителю Рис. 13.51. Расчет надбавки за вахту То есть база расчета надбавки за вахту будет получена только за те интер- валы, в которых она не была вытеснена надбавкой руководителю. Для того чтобы рассчитать сумму оклада за эти интервалы, будут использованы данные графика записи об окладе. При установке свойства Период действия является базовым периодом принципы работы механизма зависимости по базовому периоду не меня-
ются, только вместо свойств записи, определяющих базовый период, система использует фактический период действия записи. В зависимости от варианта зависимости (по периоду действия или по периоду регист- рации) система проанализирует пересечение соответственно периодов действия или периодов регистрации базовых записей с фактическим периодом действия текущей записи. В записи, формируемой в регистре по виду расчета с установленным свойством Период действия является базовым периодом, поля БазовыйПери- одНачало и БазовыйПериодКонец не заполняются (табл. 13.13). Таблица 13.13. Структура записи регистра расчета Период регистрации Вид расчета Базовый период начало Базовый период конец 01.03.2010 Надбавка за вахту Получение базы при помощи запроса Для получения базы расчетов при помощи запроса используются вирту- альные таблицы регистров расчета, поддерживающих базовый период. У каждого регистра таких таблиц может быть несколько. Их число опре- деляется количеством регистров расчета, использующих планы видов расчета, которые являются базовыми по отношению к плану видов расчета данного регистра. Например, план видов расчета Дополнитель- ныеНачисления зависит по базе от планов видов расчета ОсновныеНачис- ления и ДополнительныеНачисления. Эти планы видов расчета, в свою очередь, используются в регистрах регламентированного и управленчес- кого учета (рис. 13.52). Рис. 13.52. Взаимосвязь планов видов расчета и регистров расчета Профессиональная разработка в системе «1С:Предприятие 8»
Это означает, что любые записи регистра Дополнительные начисления (регл) могут зависеть по базовому периоду от записей любого из четырех регис- тров. В этом случае у регистра Дополнительные начисления (регл) будет 4 виртуальные таблицы базовых данных (рис. 13.53). © Н Дооо1ГмтельньеНачнсленияРегл.БазаДооо1ТмтельныеНачнсленияРегл ® Н Дооо1ГмтельньеНачнсленияРегдБазаДооо1ТмтельныеНачисленияУпр ® Н Дооо1ТмтельньеНачнсленияРегл.БазаОсновныеНачисленияРегл ® Н Дооо1»«тельньеНачнсленияРегдБазаОсновныеНачисленияУпр Рис. 13.53. Виртуальные таблицы базы Имя виртуальной таблицы формируется по следующей схеме: <ИмяОсновного Регистра:*. БазасИмяБазового Регистра:* Таким образом, например, таблица ДополнительныеНачисленияРегл.Ба- заОсновныеНачисленияРегл позволяет получить записи регистра Основные начисления (регл), входящие в базу расчета записей регистра Дополни- тельные начисления (регл). Если необходимо получить базу по нескольким регистрам, нужно будет использовать в запросе несколько виртуальных таблиц базовых данных. Виртуальные таблицы базовых данных требуют указания параметров, которые позволяют указать, какие именно данные в каких разрезах нужно получить. ИзмеренияОсновногоРегистра — в этот параметр нужно передать массив, элементами которого являются строки с названиями измерений основного регистра, по которым нужно будет отбирать записи в базовых регистрах (рис. 13.54). Для отбора данных по сотруднику и организации в этот параметр нужно передать массив (табл. 13.14). Том 2
Настройка1зависимости1по1базовому]периоду^ Таблица 13.14. Структура массива «ФизЛицо» «Организация» Названия измерений основного регистра указываются без указания имени регистра, так как в данном случае понятно, что речь идет об основном регистре. ИзмеренияБазовогоРегистра - в этот параметр передается массив, элементами которого являются названия измерений базового регистра, соответствующие измерениям, переданным в параметр ИзмеренияОснов- ногоРегистра. Число элементов этого массива должно совпадать с числом элементов массива измерений основного регистра. Важен также порядок следования измерений: он должен быть таким же, как и в массиве изме- рений основного регистра. По измерениям, указанным в параметре ИзмеренияБазовогоРегистра, будет произведен отбор записей в базовом регистре. При этом в качестве значений отбора будут использованы значения соответствующих изме- рений основного регистра. Например, при получении базы по основным начислениям для премии, начисленной сотруднику Иванов в организации Ромашка, в виртуальную таблицу базы попадут только базовые записи с аналогичными значениями измерений. Если названия измерений одинаковы, в параметры Измере- нияОсновногоРегистра и ИзмеренияБазовогоРегистра можно передать один и тот же массив. Если названия различаются, нужно будет создать два массива (рис. 13.55). Основной рагнстр Базовый рагнстр МзмеремяЮоновюгоРегмсгра "ФизЛицо" "Организация** МзмфенюгБазовогоРвгматра "ФизЛицо** "Организация" Названия измерен^ совпадают МзмеремяЮановногоРепюгрс "ФизЛицо" "Организацив" МзмфенюгБазовогоРвгматра "Работник" "Фирма" Названия измерений различаются Рис. 13.55. Получение базы по основным начислениям Разрезы - в этот параметр передается массив, содержащий названия полей базового регистра, по которым необходимо получить разрез базы. В запросе можно получить разрез не только по измерениям и реквизитам, но и по следующим предопределенным полям базового регистра: НомерСтроки, Регистратор, ВидРасчета, ПериодРегистрации, ПериодДействия.
Глава113пСложн^1е]периодинеские]расчет^1 Например, для получения базы в разрезе периода регистрации и вида расчета в параметр Разрезы необходимо передать следующий массив (табл. 13.15). Таблица 13.15. Структура массива «ПериодРегистрации»________ «ВидРасчета» Параметр Разрезы можно не указывать, в этом случае база будет полу- чена общей суммой по каждому ресурсу базового регистра. В массиве недопустимо указание измерений, которые переданы в параметр Измере- нияБазовогоРегистра, так как в этом случае на эти измерения будет наложен отбор, и получать по ним разрез не имеет смысла. Условие - в этот параметр можно передать произвольное условие на записи основного регистра. База будет получена только для записей, удовлетворя- ющих этому условию. В отличие от метода ПолучитьБазу(), условия могут быть заданы произвольные. В запросе не обязательно отбирать данные по регистратору, теоретически можно вообще не указывать условий, тогда база будет получена для всех записей основного регистра. Виртуальная таблица базовых данных расширяет данные основной таблицы регистра расчета и имеет следующую структуру (рис. 13.56). в-s —— ПериойРегистрации "ч S-— Регистратор —— НомерСтроки ВиоРасчзта _________________________ -- БазоаыйПернодНачало — — БазоеьйПериойКонец — — Активность — — Сторно ЕЭ-i-. ФизЛицо Организация — | Результат —— Размер ЕЭ~“ Подразделение В— СтагьяЗвгрвг — | РезультатБаза -- ПериойРегистрацииРазрез Э~- РегистраторРаэрез —— НомерСтрокмРазрез I ВиоРасчетаРазрез —в ПериойДейсгвияРазрез I L. физЛицоРаэрез IJ-L. ОрганиэацияРазреэ РазмерРезрез Э— ГраФмкРаботыРаэреэ I Ь— ВидУчетаВрамениРаэреэ I ПсйрааделениоРазреэ СгатьяЗаграгРазрез Данные основного регистра Ресурсы базового регистра, по которым может быть получена база | Поля базового регистра, j по которым может быть I получен разрез базы Рис. 13.56. Виртуальная таблица базы В виртуальной таблице базовых данных будут присутствовать все данные основной таблицы основного регистра, а также отдельные поля для получения базы по всем ресурсам базового регистра, названия которых формируются по схеме <ИмяРесурса>База. Если параметр Разрезы
не задан, то в таблице не будет других полей, и для каждой записи основ- ного регистра, удовлетворяющей условию, будет рассчитана база общей суммой по каждому ресурсу базового регистра. Если разрезы заданы, то в виртуальной таблице будут присутствовать дополнительные поля по числу элементов массива разрезов. Названия этих полей в виртуальной таблице базовых данных будут формироваться по схеме <ИмяПоля>Разрез. Так, если в параметр Разрезы переданы значения ПериодРвгистрации и ВидРасчета, то в виртуальной таблице будут доступны поля ПериодРегистрацииРазрез и ВидРасчета- Разрез. Остальные поля, выводимые в конструкторе запроса, не будут доступны, и при выборе таких полей запрос не будет выполнен. Например, в запросе можно получить итоги по значениям разрезов и использовать его для построения отчета следующего вида по базовым начислениям для расчета отпуска (рис. 13.57). Рис. 13.57. Отчет по базовым начислениям Ниже приведен текст запроса, который может служить основой для пост- роения такого отчета (листинг 13.4). ПОДРОБНЕЕ Этот фрагмент присутствует в демоконфигурации в обработке ДанныеРегистра Расчета. Листинг 13.4. Отчет по базовым начислениям Запрос = Новый Запрос; Запрос.Текст =" |ВЫБРАТЬ | База.ПериодРегистрацииРазрез КАК ПериодРегистрацииРазрез, | База.ВцдРасчетаРазрез, | СУММА(База.РезультатБаза) КАК РезультатБаза |ИЗ | РегистрРасчета.ДополнительныеНачисленияРегл. БазаОсновныеНачисленияРегл( Профессиональная разработка в системе «1С:Предприятие 8»
| &Измерения, I &Измерения, I &Разрезы, I Регистратор = &Регистратор И НомерСтроки = &НомерСтроки) КАК База ^ГРУППИРОВАТЬ ПО | База.ПериодРегистрацииРазрез, | База.ВидРасчетаРазрез | ИТОГИ | СУММА(РезультатБаза) | ПО | ОБЩИЕ, | ПериодРегистрацииРазрез"; // Сформировать массив измерений основного и базового регистров // (названия измерений совпадают, поэтому используется один массив). Измерения = Новый Массив(2); Измерения^] = "ФизЛицо"; Измерения[1] = "Организация"; // Сформировать массив разрезов. Разрезы = Новый Массив(2); Разрезы[0] = "ПериодРегистрации"; Разрезы[1] = "ВидРасчета"; // Передать параметры в запрос. Запрос.УстановитьПараметр("Измерения", Измерения); Запрос.УстановитьПараметр(”Разрезы”, Разрезы); // Запрос строится по конкретной записи документа // с номером ТекущийНомерСтроки. Запрос.УстановитьПараметр("Регистратор”, Ссылка); Запрос.УстановитьПараметр("НомерСтроки”, ВыбранныйНомерСтроки); Результат = Запрос.Выполнить(); ТЕХНОЛОГИЯ ФОРМИРОВАНИЯ И РАСЧЕТА ЗАПИСЕЙ РЕГИСТРОВ РАСЧЕТА Формирование записей регистра расчета Регистры расчета не поддерживают независимого формирования записей без использования документа-регистратора. Поэтому ввод записей в регистр расчета должен быть организован с применением доку- ментов. В документе должны быть указаны все данные, необходимые для заполнения всех полей записи регистра расчета, кроме ресурсов. Такой документ заполняется пользователем в режиме 1С:Предприятие и формирует записи регистра расчета при проведении. В демонстрационной конфигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт-диске, для формирования записей в регистрах расчета предусмотрен документ НачислениеЗарплаты (рис. 13.58). Том 2
ТехнологияГф'ормирования1и1раснетаТзаписей1регистров]раснета Рис. 13.58. Документ «Начисление зарплаты» В шапке документа пользователь должен указать организацию, по которой будет производиться начисление, а также расчетный период, в который должны попасть записи, то есть период регистрации. Для ввода записей в каждый из регистров расчета в документе предусмотрена отдельная табличная часть. Так, для ввода записей в регистр расчета ОсновныеНачис- ленияРегл предусмотрена закладка Основные начисления. На этой закладке пользователь должен ввести начисления различным сотрудникам, указав физическое лицо, вид расчета, период действия записи и значения рекви- зитов регистра расчета. В данном случае пользователь должен указать значения реквизитов Размер и Подразделение. В реквизите Размер указы- вается размер начисления, который будет влиять на его расчет. Например, для оклада размером является тарифная ставка, для премии - коли- чество процентов премии. Для некоторых видов расчета размер указывать не нужно, так как он не влияет на расчет (например, сдельный заработок). В реквизите Подразделение указывается подразделение, на затраты кото- рого должно быть отнесено данное начисление. Реквизит регистра ГрафикРаботы будет заполнен значением, указанным в соответствующем реквизите выбранного физического лица. Это и будет график работы, по которому должна рассчитываться данная запись. Как правило, график работы у всех записей по одному сотруднику один и тот же. В приведенном примере реквизиты регистра ВидУчетаВремени и СтатьяЗатрат не вводятся в документ напрямую, а указываются как реквизиты вида расчета. Ресурсы регистра расчета не всегда заполняются из документа, они могут рассчитываться при проведении. Технология расчета записей будет подробно рассмотрена в следующем разделе. Для формирования записей регистра расчета используется метод Добавить() объекта РегистрРасчетаНаборЗаписей (листинг 13.5).
I ГлаваИ 3MG ложныеТпериодйнескйеТ^снёты Листинг 13.5. Формирование записей регистра расчета // Процедура добавляет запись в регистр основных начислений. Процедура ДобавитьСтрокуОсновныхНачислений(ДанныеСтроки, НаборЗаписей) Движение = НаборЗаписей.Добавить(); // Предопределенные поля. Движение.ПериодРегистрации = ПериодРегистрации; Движение.ПериодДейсгвияНачвло = ДанныеСтроки.ДатаНачвло; Движение.ПериодДейсгвияКонец = ДанныеСтроки.ДатаКонец; Движение.ВидРасчета = ДанныеСтроки.ВидРасчета; Движение.Сторно = ДанныеСтроки.Сторно; // Измерения. Движение.ФизЛицо = ДанныеСтроки.ФизЛицо; Движение.Организация= Организация; // Ресурсы. Движение.Результат = ДанныеСтроки.Результат; // Реквизиты. Движение! рафикРаботы = ДанныеСтроки.ФизЛицо.Г рафикРаботы; Движение.Размер = ДанныеСтроки.Размер; Движение.ВидУчетаВремени = ДанныеСтроки.ВидРасчета.ВидУчетаВремени; Движение.Подразделение = ДанныеСтроки. Подразделение; Движение.СтатьяЗатрат = ДанныеСтроки.ВидРасчета.СтатьяЗатрат; КонецПроцедуры // ДобавитьСтрокуОсновныхНачислений // Обработка проведения. Процедура ОбработкаПроведения(Отказ) Движения.ОсновныеНачисленияРегл.Записывать = Истина; Движения.ДополнительныеНачисленияРегл.Записывать = Истина; // Сформировать запрос по табличной части при помощи функции общего модуля. ВыборкаОсновныеНачисления = ОбщегоНазначения. СформироватьЗапросПоТабличнойЧасти(ЭтотОбьект, "ОсновныеНачисления”).Выбрать(); // По каждой строке табличной части сформировать запись в регистр. Пока ВыборкаОсновныеНачисления.Следующий() Цикл ДобавитьСтрокуОсновныхНачислений(ВыборкаОсновныеНачисления, Движения.ОсновныеНачисленияРегл); КонецЦикла; // Запись дополнительных начислений в регистр. ВыборкаДополнительныеНачисления = ОбщегоНазначения. СформироватьЗапросПоТабличнойЧасги(ЭтотОбъект, ”ДополнительныеНачисления").Выбрать(); Пока ВыборкаДополнительныеНачисления.Следующий() Цикл ДобавитьСтрокуДополнительныхНачислений(ВыборкаДополнительныеНачисления, Движения.ДополнительныеНачисленияРегл); КонецЦикла; КонецПроцедуры // ОбработкаПроведения
Настройка алгоритмов расчета Настройка способов расчета Способ расчета ресурсов записи может быть различным в зависимости от выбранного вида расчета и дополнительных реквизитов записи. Как уже было отмечено, технология периодических расчетов в системе «1С:Предприятие» предоставляет пользователю возможность самостоя- тельно вводить новые виды расчета в режиме 1С:Предприятие. Поэтому прописать в конфигураторе алгоритмы расчета каждого вида расчета нельзя. Пользователю должна быть предоставлена возможность настроить способ расчета того или иного вида расчета в режиме 1С:Предприятие. Под способом расчета подразумевается алгоритм или формула, по которой будут вычислены значения ресурсов записи регистра, исходя из параметров этой записи. При этом различные виды расчета могут иметь один и тот же способ расчета. Например, виды расчета Премия и Надбавка за вахту по сути имеют один и тот же способ расчета, предполагающий умножение расчетной базы записей с этими видами расчета на опреде- ленный процент. Так как все способы расчета должны быть прописаны разработчиком, их набор должен быть фиксированным и для их описания логичнее всего использовать перечисление. В демонстрационной конфигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт-диске, все доступные способы расчета описаны в перечислении СпособыРасчета. При необходимости ввести в систему новый способ расчета не обойтись без изменения конфигурации, так как алгоритм расчета нужно будет прописать в модулях. Для настройки способа расчета для видов расчета в режиме 1 (^Предприятие необходимо добавить в план видов расчета реквизит СпособРасчета, имеющий тип ПеречислениеСсылка.СпособыРасчета. В этом случае в любом виде расчета данного плана видов расчета можно будет указать одно из значений перечисления, определив тем самым способ расчета записей с этим видом расчета. В демонстрационной конфигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт- диске, предусмотрены следующие способы расчета (табл. 13.16). Таблица 13.16. Назначение видов расчета Имя Алгоритм расчета Пример использования ПоМесячнойСтавке Результат = Размер * Отработанное время / Норматив рабочего времени Используется для расчета окладов. В качестве отработанного времени используются данные графика работы за фактический период действия, норматив рабочего времени - данные графика за период действия. В поле Размер указывается тарифная ставка ПроцентомОтБазы Результат = Размер * Расчетная база /100 Можно использовать для расчета премий. В поле Размер указывается процент премии. Расчетная база складывается из суммы по ресурсу Результат базовых записей за базовый период Профессиональная разработка в системе «1С:Предприятие 8»
Имя Алгоритм расчета Пример использования ФиксированнойСуммой Результат = Размер Простейший способ, может использоваться для начисления фиксированных надбавок ПоСдельнойВыработке Результат = Сдельная выработка за период действия Используется для начисления зарплаты производственным рабочим. Сдельная выработка собирается по регистру накопления СдельнаяВыработка за интервал периода действия записи Настройка приоритета видов расчета При расчете нескольких записей в одном документе очень важен порядок расчета этих записей. Если рассчитывать записи в произвольном порядке, то может получиться, что запись, зависимая по базовому периоду, будет рассчитана раньше, чем базовая запись. Например, запись с видом расчета Надбавка руководителю будет рассчитана раньше, чем запись с видом расчета Оклад. В этом случае база этой надбавки будет равна 0, так как оклад еще не рассчитан и не записан в регистр. В результате часть записей будет рассчитана неправильно. Для того чтобы такой набор записей был рассчитан правильно, необходимо рассчитывать эти записи в правильной последовательности. При этом разработчик должен самостоятельно проду- мать механизм, который будет упорядочивать расчет записей регистра. Рассмотрим принципы упорядочивания расчетов на примере следующего набора записей, рассчитываемого в одном документе (рис. 13.59). □ а а а Рис. В данном примере производится расчет нескольких записей регистра расчета. При этом существует зависимость по базовому периоду этих записей между собой. В частности, Надбавка руководителю зависит по базовому периоду от оклада, а вид расчета Индексация заработка зависит от всех перечисленных видов расчета (Оклад, Командировка, Надбавка руководителю), так как предполагает начисление доплаты в размере 10 % от заработка. Если рассчитывать эти записи в том порядке, который приведен на схеме, результат расчета записей, зависимых по базовому периоду, будет Том 2
ВТёхнрлргия1фррмиррвания1и1расуета1запис^ей1р^егистррв]расуета неверным. В частности, надбавка руководителю будет равна 0, так как на момент расчета в регистре не будет данных об окладе. При расчете записи по индексации заработка не будет учтена командировка, а надбавка руководителю будет учтена с неверной суммой. Таким образом, для того чтобы определить, в каком порядке должны следовать записи, необходимо проанализировать взаимную зависи- мость по базовому периоду видов расчета, участвующих в этих записях. Виды расчета Оклад и Командировка не являются зависимыми по базо- вому периоду (табличная часть БазовыеВидыРасчета не содержит строк), поэтому они должны быть рассчитаны в первую очередь. Для их расчета не требуется наличия в регистре других рассчитанных записей. Такие виды расчета можно назвать первичными, приоритет их расчета равен 1, то есть они должны быть рассчитаны в первую очередь. Вид расчета Надбавка руководителю является зависимым по базовому периоду, при этом в его табличной части БазовыеВидыРасчета содержатся только первичные виды расчета (в данном случае Оклад). Запись с таким видом расчета можно записывать сразу после расчета первичных записей, так как в этот момент база их расчета сформирована полностью. Такие виды расчета можно назвать зависимыми от первого уровня, приоритет их расчета равен 2 (то есть они рассчитываются во вторую очередь). Наконец, вид расчета Индексация заработка в списке базовых видов расчета содержит не только первичные виды расчета (Оклад, Командировка), но и зависимые первого уровня (Надбавка руководителю). Поэтому эта запись может быть рассчитана только после того, как рассчитаны первичные записи и зависимые первого уровня. Такой вид расчета можно назвать зависимым второго уровня, приоритет его расчета равен 3. Таким образом, приоритет вида расчета определяется составом его базовых видов расчета (рис. 13.60). Первичный Приоритет: 1 Рис. 13.60. Приоритет видов расчета Завиоеный первого «ровня Приоритет: 2 Зависимый второго «ровня Приоритет. 3
Если текущий вид расчета в списке базовых содержит хотя бы один вид расчета, который является зависимым первого уровня, то такой вид расчета является зависимым второго уровня и должен иметь меньший приоритет. Количество уровней зависимости теоретически неограниченно. Если применить полученные значения приоритета к исходному набору записей, результат их расчета окажется правильным (рис. 13.61). Командировка ►I Надбевка рдковоаиголю~| ►I Индексация заработка Записи регистра расчета (расчет с учетом приоритета) Оклад | По данным графика | | Фиксированная сумма | 5Z от оклада | всаг начислений | 10 000 1 200 500 1 170 Рис. 13.61. Приоритет расчета записей Записи в рамках одного приоритета могут быть рассчитаны в произ- вольном порядке. Так, оклад и командировка могут быть рассчитаны в любой последовательности. После расчета записей каждого приоритета полученные значения ресурсов должны быть записаны в регистр расчета перед началом расчета следующих записей. Это связано с тем, что меха- низм зависимости по базовому периоду реализован в регистре расчета. Запись значений ресурсов в регистр формирует базу для расчета записей со следующим приоритетом. Настройка приоритета видов расчета должна быть доступна пользователю в режиме 1С:Предприятие. Вид этой настройки разработчик определяет самостоятельно. Например, можно добавить в план видов расчета реквизит Приоритет, который будет иметь тип Число. В этом случае пользователь должен указать приоритет видов расчета в этом реквизите. В дальнейшем при расчете записей разработчик должен предусмотреть модуль расчета таким образом, чтобы сначала были рассчитаны записи с видами расчета приоритета 1, затем 2, 3, 4 и так далее. Расчет записей регистра расчета Расчет записей регистра расчета может производиться в любой момент, определенный разработчиком. Например, расчет записей может произво- диться при проведении документа регистрации записей. В этом случае значения ресурсов будут рассчитываться в момент проведения, и поль- зователь не сможет вручную изменить результат расчетов. Также можно инициировать расчет записей из формы документа. Для этого можно создать на форме кнопку Рассчитать, при нажатии которой будет произ-
водиться расчет. В этом случае результат расчета можно поместить в табличную часть документа, для того чтобы пользователь мог скор- ректировать его вручную. При проведении такого документа записи регистра расчета будут сформированы с учетом ручных корректировок (рис. 13.62). Рис. 13.62. Формирование записей регистра расчета Автоматически рассчитанные данные В том и другом случае схема расчета модулей будет схожа (рис. 13.63). Рис. 13.63. Схема расчета Таким образом, расчет записей без проведения документа отличается только наличием двух дополнительных этапов. Рассчитанные значения ресурсов необходимо поместить в табличную часть документа, в соот- ветствующие поля, для того чтобы пользователь мог их изменить. Профессиональная разработка в системе «1С:Предприятие 8»
После этого необходимо удалить созданные в процессе расчета записи регистров расчета, так как пользователь в данном случае не просил проводить документ. Тем не менее, расчет не может быть выполнен без временной записи данных в регистр расчета, так как все расчетные меха- низмы платформы (вытеснение, зависимость по базовому периоду, расчет по графику, перерасчет) применимы только к записям регистров расчета. Если в документе настроен расчет записей без проведения, то в момент проведения такого документа собственно расчета уже не происходит. В ресурсы регистра расчета попадают значения из табличной части доку- мента, которые пользователь мог скорректировать после расчета. Рассмотрим основные этапы расчета записей более подробно. Далее будет рассмотрен вариант расчета без проведения документа на примере регистра расчета ОсновныеНачисленияРегл. Все рассматриваемые проце- дуры доступны в демоконфигурации в документе НачислениеЗарплаты, а также в общих модулях Расчеты и ОбщегоНазначения. Формирование набора записей по данным документа Для расчета записей необходимо сначала сформировать набор этих записей в регистре расчета. Это позволит использовать расчетные механизмы платформы. Формирование записей при расчете аналогично рассмотрен- ному выше модулю формирования записей при проведении. Однако если при проведении в качестве набора записей выступали движения доку- мента по регистру (Движения.ОсновыеНачисленияРегл), то при расчете без проведения такой набор необходимо создать. Ниже приведен модуль, позволяющий сформировать набор записей регистра расчета по данным документа (листинг 13.6). В тексте использу- ется процедура ДобавитьСтрокуОсновныхНачислений(), описанная выше. Этот модуль является начальным этапом процедуры РассчитатьОснов- ныеНачисления(), которая вызывается при нажатии кнопки Рассчитать в форме документа. Листинг 13.6. Формирование набора записей регистра расчета Процедура РассчитатьОсновныеНачисления() Экспорт // Расчет записей выполняется в транзакции. НачатьТранзакциюО; // Создать набор записей регистра расчета НаборОсновныеНачисления = РегисгрыРасчета.ОсновныеНачисленияРегл. СоздатьНаборЗаписей(); НаборОсновныеНачисления.Отбор.Регисгратор.Значение = Ссылка; ВыборкаОсновныеНачисления = ОбщегоНазначения. СформироватьЗапросПоТабличнойЧасги(ЭтотОбьекг, "ОсновныеНачисления").Выбрать(); Пока ВыборкаОсновныеНачисления.Следующий() Цикл ДобавитьСтрокуОсновныхНачислений(ВыборкаОсновныеНачисления, НаборОсновныеНачисления); Том 2
|ТехнологияГф~ормирования1и1расцетаТзаписей1регистров]расцёта КонецЦикла; // Расчет записей набора. II... ЗафиксироватьТранзакцию(); КонецПроцедуры // РассчитатьОсновныеНачисления При формировании набора записей значения ресурсов не играют роли, так как они будут в дальнейшем изменены при расчете. В том числе эти значения могут быть пустыми. Добавление в набор сторно-записей Если в рассчитываемом регистре установлено свойство Период действия, в сформированном наборе могут присутствовать записи, у которых период действия принадлежит более раннему периоду, чем период регистрации. В этом случае они могут вступать в конкуренцию на этом периоде дейс- твия с записями более раннего периода регистрации. Чтобы такие записи могли иметь непустой фактический период действия, необходимо допол- нить сформированный набор соответствующими сторно-записями. ПОДРОБНЕЕ Раздел «Сторнирование», стр. 30. Добавление сторно-записей происходит с использованием метода Полу- читьДополнение() набора записей регистра. Ниже приведен текст модуля, позволяющий добавить в набор сторно-записи. Добавление записи происходит при помощи вызова процедуры ДобавитьСтро- куСторноОсновныхНачислений(), которая должна быть описана в про- цедуре РассчитатьОсновныеНачисления(). При этом для каждой сторно- записи необходимо добавить новую строку в табличную часть документа, чтобы при проведении эта запись попала в регистр (листинг 13.7). Листинг 13.7. Добавление сторно-записей // Добавить сторно-записи в набор и в табличную часть. Процедура ДобавитьСтрокуСторноОсновныхНачислений(ДанныеСтроки, НаборЗаписей, ТабличнаяЧасть = Неопределено) Движение = НаборЗаписей.Добавить(); // Предопределенные поля. Движение.ПериодРегистрации = ДанныеСтроки.ПериодРегистрацииСторно; Движение.ПериодДейсгвияНачало = ДанныеСтроки.ПериодДействияНачалоСторно; Движение.ПериодДействияКонец = ДанныеСтроки.ПериодДействияКонецСторно; Движение. ВидРасчета = ДанныеСтроки.ВидРасчета; Движение.Сторно = Истина; // Измерения. 4Й
Глава113пСложн^1е]периодические]расчет^1 Движение.ФизЛицо = ДанныеСтроки.ФизЛицо; Движение.Организация = ДанныеСтроки.Организация; // Реквизиты. Движение! рафикРаботы = ДанныеСтроки! рафикРаботы; Движение.Размер = ДанныеСтроки.Размер; Движение.ВидУчетаВремени = ДанныеСтроки.ВидУчетаВремени; Движение.Подразделение = ДанныеСтроки. Подразделение; Движение.СтатьяЗатрат = ДанныеСтроки.СтатьяЗатрат; Если Не ТабличнаяЧасть = Неопределено Тогда НоваяСтрока = ТабличнаяЧасть.Добавить(); НоваяСтрока.ФизЛицо = ДанныеСтроки.ФизЛицо; НоваяСтрока.ВидРасчета = ДанныеСтроки.ВидРасчета; НоваяСтрока.ДатаНачало = ДанныеСтроки.ПериодДействияНачалоСторно; НоваяСтрока.ДатаКонец = ДанныеСтроки.ПериодДействияКонецСторно; НоваяСтрока.Размер = ДанныеСтроки.Размер; НоваяСтрока.Подразделение = ДанныеСтроки.Подразделение; НоваяСтрока.Сторно = Истина; КонецЕсли; КонецПроцедуры // ДобавитьСтрокуСторноОсновныхНачислений // Процедура расчета основных начислений. Процедура РассчитатьОсновныеНачисления() Экспорт НачатьТранзакцию(); // Сформировать набор записей. II... II Сформировать таблицу сторно-записей. ТаблицаСторно = НаборОсновныоНачисления.ПолучитьДополненио(); //Добавить сторно-записи в набор. Для Каждого СтрокаСторно из ТаблицаСторно Цикл ДобавитьСтрокуСторноОсновныхНачислоний(СтрокаСторно, НаборОсновныеНачисления, ОсновныеНачисления); КонецЦикла; II... ЗафиксироватьТранзакцию(); КонецПроцедуры // РассчитатьОсновныеНачисления При формировании сторно-записей данные всех измерений и реквизитов записи указаны в строке дополнения. Также в этой строке содержатся данные о периоде регистрации и периоде действия сторно-записи. Ресурсы сторно-записи не заполняются, так как запись будет рассчитана в общем порядке. №
Расчет набора записей в общем модуле Сформированный документом набор записей регистра расчета рекомен- дуется рассчитывать в процедурах общего модуля. Это связано с тем, что формирование записей, как правило, происходит в нескольких доку- ментах, тогда как модуль расчета этих записей один и тот же. Например, оплата отпусков может вводиться отдельным документом конфигу- рации, при этом записи об отпуске рассчитываются в общем порядке. Таким образом, функция документов в решениях по периодическим расчетам сводится, как правило, к формированию первоначального набора записей в регистре, а все сложные алгоритмы расчета должны быть распо- ложены в общем модуле как единые для всех документов. Ниже приведен пример вызова процедуры общего модуля РассчитатьЗа- писиРегистраРасчета(), листинг 13.8. Сама процедура будет описана позже. Листинг 13.8. Пример процедуры «РассчитатьОсновныеНачисления()» Процедура РассчитвтьОсновныеНачисления() Экспорт // Расчет записей выполняется в транзакции. НачатьТранзакцию(); // Сформировать набор и добавить сторно-записи. II... II Передать набор записей в процедуру общего модуля для расчета. Расчеты.РассчитатьЗаписиРегистраРасчета("ОсновныеНачисленияРегл", НаборОсновныеНачисления, ОсновныеНачисления); II Удалить движения по регистру. НаборОсновныеНачисления.Очистить(); НаборОсновныеНачисления.Записать(); ЗафиксироватьТранзакцию(); КонецПроцедуры // РассчитатьОсновныеНачисления В качестве параметров в процедуру расчета в данном случае передается название регистра, набор записей для расчета, а также табличная часть документа, в которую будут возвращены результаты расчетов. После полу- чения результатов расчетов происходит удаление записей регистра расчета, так как документ рассчитывался без проведения. Результаты расчетов помещаются в табличную часть, и пользователь может их скорректировать. Окончательные записи регистра расчета формиру- ются по табличной части документа при его проведении (рис. 13.64). Профессиональная разработка в системе «1С:Предприятие 8»
В процедуре общего модуля, выполняющей расчет записей переданного набора, необходимо предусмотреть выполнение следующих действий (рис. 13.65). Рис. 13.65. Действия в процедуре общего модуля Рассмотрим эти действия подробнее. В данном случае эти действия выполняются в процедуре общего модуля Расчеты, которая называется РассчитатьЗаписиРегистраРасчета(). Запись набора с формированием фактического периода действия Перед тем как рассчитывать записи каждого регистра расчета, в котором документ создает движения, необходимо сформировать и записать в регистр набор всех записей документа по этому регистру. Первоначальная запись движений в регистр расчета необходима для формирования правильного фактического периода действия этих записей. В случае последователь- Том 2
[Технол огия[фррм и pjbBaH ия1и1рас^ета1зап ncjeiiJpjerHCTpjDB] распета] ного ввода и расчета записей без предварительной записи всего набора результат расчета может оказаться неверным. Рассмотрим влияние этого действия на следующем примере записей документа (рис. 13.66). Фактической период действия на момент расчете записи Записи регистра расчета (расчет без предварительной записи) ,, 1 Вид расчета I I Пеоиод действия _1 1 1— Резчльтат | Оклад | | 01.03 31.03 | | 01.03 31.03 | | 12 00В 1 | Командировка | | 12.03 - 20.03 U I «•« 28.03 | | 2 500 1 | Надбавка руководителю | | 01.03 31.03 | I 01.03 31.03 I I 1 200 1 Рис. 13.66. Пример расчета записей регистра При последовательной записи и расчете этих начислений результат расчета оклада будет неверным, так как в момент расчета оклада записи о команди- ровке еще не будет в регистре, соответственно, фактический период действия оклада будет совпадать с периодом действия, и сотруднику будет начислен полный тариф оклада. В момент записи командировки произойдет вытес- нение, и фактический период действия оклада изменится, но на результат его расчета это уже не повлияет, так как запись уже рассчитана. Для формирования правильного фактического периода действия с учетом всех вытеснений в рамках одного набора записей необходимо предварительно записать весь набор в регистр. В момент записи срабо- тает механизм вытеснения, и будет сформирован фактический период действия каждой записи. В этом случае в момент расчета каждая запись будет иметь правильный фактический период действия (рис. 13.67). Рис. 13.67. Формирование фактического периода действия
Глава113пСложн^1е]периодические]расчет^1 Для того чтобы запись производилась с расчетом фактического периода действия и формированием записей перерасчетов, о которых будет сказано в следующем разделе, необходимо при вызове метода Записать() набора записей регистра расчета во второй параметр метода (параметр ТолькоЗапись) передать значение Ложь. При установке параметра ТолькоЗапись в значение Истина записи будут помещены в регистр без пересчета фактического периода действия (листинг 13.9). Листинг 13.9. Пример расчета записей регистра Процедура РассчитатьЗаписиРегистраРасчета(ИмяРегистра, НаборЗаписей, ТабличнаяЧасть = Неопределено) Экспорт // Первоначальная запись набора с формированием фактического // периода действия. НаборЗаписей.Записать(Исгина, Ложь); // Расчет записей. II... КонецПроцедуры Классификация записей по приоритету видов расчета Как уже отмечалось выше, расчет записей одного документа необходимо производить в последовательности, определяемой приоритетом видов расчета, участвующих в этих записях. Поэтому исходный набор записей должен быть разбит на несколько поднаборов, в каждом из которых будут записи одного приоритета. Затем необходимо последовательно рассчи- тать записи каждого из поднаборов, записав результат расчета в регистр. Запись каждого рассчитанного поднабора необходима для формирования базы расчета следующих по приоритету поднаборов. Ниже приведен пример процедуры, которая классифицирует записи исходного набора по приоритету видов расчета и для каждого уровня приоритета вызывает процедуру расчета поднабора записей. В данном случае из набора записей выгружается массив видов расчета, после чего по этим видам расчета строится запрос с иерархией по приоритету (листинг 13.10). Листинг 13.10. Расчет записей по приоритету видов расчета Процедура РассчитатьЗаписиРегисграРасчета(ИмяРегистра, НаборЗаписей, ТабличнаяЧасть = Неопределено) Экспорт НаборЗаписей.Записать(Исгина, Ложь); II Определить название плана видов расчета для запроса. ИмяПланаВидовРасчета = Метаданные.РегистрыРасчета[ИмяРегистра].ПланВидовРасчета.Имя;
II Получить массив видов расчета из набора записей. ТаблицаВидовРасчета = НаборЗаписей.Выгрузить(); ТаблицаВидовРасчета.Свернуть("ВидРасчета"); МассивВидовРасчета = ТаблицаВидовРасчета.ВыгрузитьКолонку("ВидРасчета"); II Запрос по приоритетам видов расчета. Запрос = Новый Запрос; Запрос.Текст = " (ВЫБРАТЬ РАЗЛИЧНЫЕ | Приоритет |ИЗ | ПланВидовРасчета." + ИмяПланаВидовРасчета +" КАК " + | ИмяПланаВидовРасчета+ " |ГДЕ | Ссылка В (&МассивВидовРасчета) (УПОРЯДОЧИТЬ ПО | " + ИмяПланаВидовРасчета + ".Приоритет (ИТОГИ ПО | Приоритет”; Запрос.УстановитьПараметр("МассивВидовРасчета", МассивВидовРасчета); ВыборкаПриоритетов = Запрос.Выполнить(). Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); II Для каждого значения приоритета выполнить расчет записей. Пока ВыборкаПриоритетов.Следующий() Цикл РассчитатьНаборЗаписей(НаборЗаписей, ВыборкаПриоритетов.Приоритет, ТабличнаяЧасть); II Записать набор в регистр для расчета записей следующего II приоритета, фактический период действия не пересчитывается. НаборЗаписей.Записать(Истина, Истина); КонецЦикла; КонецПроцедуры После расчета записей каждого приоритета необходимо перезаписать весь набор в регистр для образования базы расчета для записей следующего приоритета. При этом параметр ТолькоЗапись метода Записать() должен быть установлен в значение Истина, так как пересчитывать фактический период действия уже не нужно, он был рассчитан при первоначальной записи. ПРИМЕЧАНИЕ После расчета записей последнего приоритета набор записей можно не перезаписывать, но только в том случае, если в документе после этого не будет производиться расчет записей другого регистра, который может использовать данные текущего регистра как базу. Например, если после расчета регистра основных начислений в модуле будет сразу производиться расчет дополнительных начислений, то записи регистра основных начислений после расчета последнего приоритета должны быть перезаписаны. Профессиональная разработка в системе «1С:Предприятие 8»
Получение данных для расчета Собственно процесс расчета записей каждого поднабора состоит в получении всех необходимых данных для расчета каждой записи и вычислении значений ресурсов этой записи по формуле, определя- емой способом расчета данной записи. Например, для расчета записи об окладе нужно будет получить данные графика этой записи, для расчета премии необходимо будет рассчитать базу и так далее. Ниже приведен пример процедуры, осуществляющей расчет набора записей одного приоритета. Для каждой записи при помощи функции ПолучитьДанныеДляРасчета() возвращается структура данных, которая передается в процедуру РассчитатьЗапись(), листинг 13.11. Процедура РассчитатьЗапись() будет описана позже. Листинг 13.11. Расчет набора записей одного приоритета Процедура РассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено) Для каждого Запись из НаборЗаписей Цикл Если Запись.ВидРасчета.Приоритет = Приоритет Тогда // Получить данные для расчета записи. ДанныеДляРасчета = ПолучитьДанныеДляРасчета(Запись); // Вызвать процедуру расчета записи. Рассчитать3апись(3апись, ДанныеДляРасчета); // Возвратить результат расчета в табличную часть документа. Если Не ТабличнаяЧасть = Неопределено Тогда СтрокаТабличнойЧасги = ТабличнаяЧасть.Получить(Запись.НомерСтроки-1); СтрокаТабличнойЧасти.Результат = Запись.Результат; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры В функции ПолучитьДанныеДляРасчета() должны быть прописаны алго- ритмы, при помощи которых можно получить данные для расчета записи с любым способом расчета, существующим в конфигурации. Ниже приведен пример функции, которая получает данные для трех способов расчета (листинг 13.12). Листинг 13.12. Получение данных для трех видов расчета Функция ПолучитьДанныеДпяРасчета(Запись) СпособРасчета = Запись.ВидРасчета.СпособРасчета; СтруктураДанных = Новый Структура; Если СпособРасчета = Перечисления.СпособыРасчета.ПоМесячнойСтавке Тогда // Получить данные графика. Том 2
ЬТёхнологияТформирования1и1раснета1записёй1регистров]раснета Запрос = Новый Запрос(" | ВЫ БРАТЬ | ДанныеГрафика.ЗначениеФактическийПериодДействия КАК ГрафикФакт, | ДанныеГрафика.ЗначениеПериодДействия КАК ГрафикНорма |ИЗ | РегистрРасчета.ОсновныеНачисленияРегл.ДанныеГ рафика( | Регистратор = &Регисгратор | И НомерСтроки = &НомерСтроки) КАК ДанныеГ рафика"); Запрос.УстановитьПараметр("Регистратор”, Запись.Регистратор); Запрос.УстановитьПараметр("НомерСтроки", Запись.НомерСтроки); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда СтруктураДанных.Всгавить("ОтработаноВремени", Выборка.Г рафикФакт); СтруктураДанных.Всгавить("НормаВремени", Выборка.Г рафикНорма); Иначе СтруктураДанных.ВставитьС'ОтработаноВремени", 0); СтруктураДанных.Всгавить("НормаВремени", 0); КонецЕсли; ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПроцентомОтБазы Тогда Запрос = Новый Запрос(" | ВЫ БРАТЬ | База.РезультатБаза |ИЗ | РегистрРасчета.ОсновныеНачисленияРегл.БазаОсновныеНачисленияРегл( | &Измерения, &Измерения,, | Регистратор = &Регисгратор | И НомерСтроки = &НомерСтроки) КАК База"); Измерения = Новый Массив(2); Измерения[0] = "ФизЛицо"; Измерения[1] = "Организация"; Запрос.УсгановитьПараметреРегисгратор", Запись.Регистратор); Запрос.УсгановитьПараметр(”НомерСтроки", Запись.НомерСтроки); Запрос.УсгановитьПараметр("Измерения", Измерения); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда СтруктураДанных.ВставитьеБаза", Выборка. РезультвтБаза); Иначе СтруктураДанных.ВставитьеБаза", 0); КонецЕсли; ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПоСдельнойВыработке Тогда // Получить данные регистра накопления // фактическая выработка за период действия записи. Запрос = Новый Запросе
Глава113пСложн^1е]периодические]расчет^1 | ВЫБРАТЬ | СУММА(СдельнаяВыработкаОбороты.ВыработкаОборот) КАК ВыработкаОборот |ИЗ | РегистрНакопления.СдельнаяВыработка.Обороты( | ВДатаНачало, ЛДатаКонец, , | Организация = &Организация И ФизЛицо = &ФизЛицо) | КАК СдельнаяВыработкаОбороты"); Запрос.УстановитьПараметр("ДатаНачало“, НачвлоДня(Запись.ПериодДействияНачало)); Запрос.УстановитьПараметр("ДатаКонец", КонецДня(Запись.ПериодДействия Конец)); Запрос.УстановитьПараметр("ФизЛицо", Запись.ФизЛицо); Запрос.УстановитьПараметр("Организация", Запись.Организация); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда СтруктураДанных.Вставить("Выработка", Выборка.ВыработкаОборот); Иначе СтруктураДанных.Вставить("Выработка", 0); КонецЕсли; КонецЕсли; Возврат СтруктураДанных; КонецФункции // ПолучитьДанныеДляРасчета В данном случае для расчета записей со способом ПоМесячнойСтавке система получит данные графика за период действия и фактический период действия, для способа ПроцентомОтБазы будет получена расчетная база записи, а для способа ПоСдельнойВыработке будут рассчитаны обороты по соответствующему регистру накопления за интервал периода действия записи. Способ расчета ФиксированнойСуммой не требует полу- чения данных. Функция ПолучитьДанныеДляРасчета() возвращает структуру, содер- жащую различные поля в зависимости от способа расчета, применяемого в данной записи. Расчет значений ресурсов записи После того как данные для расчета получены, необходимо прописать в модуле формулу для заполнения реквизитов каждой записи в соответствии со способом расчета. В данном случае эту функцию выполняет процедура РассчитатьЗапись(). В процедуре РассчитатьЗапись() для каждого возмож- ного способа расчета описывается формула, позволяющая из реквизитов записи и полученных данных рассчитать значения ресурсов этой записи (листинг 13.13).
Листинг 13.13. Процедура расчета записей Процедура Рассчитать3апись(3апись, ДанныеДляРасчета) СпособРасчета = Запись.ВидРасчета.СпособРасчета; Если СпособРасчета = Перечисления.СпособыРасчета.ПоМесячнойСтавке Тогда Если Не ДанныеДляРасчета.НормаВремени = 0 Тогда Результат = Запись.Размер * ДанныеДляРасчета.ОтработаноВремени / ДанныеДляРасчета.НормаВремени; Иначе Результат = 0; КонецЕсли; ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПроцентомОтБазы Тогда Результат = Запись.Размер * ДанныеДляРасчета.База /100; ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ФиксированнойСуммой Тогда Результат = Запись.Размер; ИначеЕсли СпособРасчета = Перечисления.СпособыРасчета.ПоСдельнойВыработке Тогда Результат = ДанныеДляРасчета.Выработка; КонецЕсли; Запись.Результат = Результат * ?(Запись.Сторно, -1,1); КонецПроцедуры // Рассчитать запись При расчете записей следует учитывать, что сторно-записи рассчиты- ваются в общем порядке. Поэтому в ресурсы сторно-записи должно попадать отрицательное значение результата расчета. Например, сторно- запись отменяет начисленный оклад за период 5 дней. При расчете такой записи по формуле система получит сумму оклада за 5 дней, например 1200 руб. В ресурс сторно-записи в этом случае должно быть записано значение -1200. ПЕРЕРАСЧЕТ ЗАПИСЕЙ РЕГИСТРОВ РАСЧЕТА Объект конфигурации «Перерасчет» Платформа позволяет автоматически отслеживать влияние ввода и изме- нения записей регистра расчета на другие записи регистров расчета. Например, при изменении записи об окладе может потерять актуальность запись о начисленной премии. Автоматическое отслеживание записей, потерявших актуальность в результате изменения или ввода других записей в регистры расчета, производится при помощи механизма пере- расчетов. Перерасчет в системе представляет собой отдельную физическую таблицу. В таблице хранится информация о записях конкретного регистра расчета, Профессиональная разработка в системе «1С:Предприятие 8»
которые необходимо перерассчитать. В конфигурации можно создавать несколько таблиц перерасчета для различных регистров расчета, в том числе несколько таких таблиц может быть у одного регистра расчета. Для создания и настройки объектов Перерасчет предусмотрена отдельная ветка в объекте конфигурации Регистр расчета (рис. 13.68). Рис. 13.68. Перерасчеты Таблица перерасчета, создаваемая внутри определенного регистра расчета в дереве объектов конфигурации, будет хранить информацию о записях только этого регистра расчета. При этом физически таблица перерасчета представляет собой отдельную таблицу базы данных, никак не связанную с регистром расчета. При создании в рамках регистра расчета таблицы перерасчета без допол- нительных настроек эта таблица будет иметь следующую структуру (табл. 13.17). Таблица 13.17. Структура таблицы перерасчета ОбъектПерерасчета ВидРасчета '‘Начисление зарплаты № 1 ‘Надбавка руководителю ‘Начисление зарплаты № 1 ‘Надбавка за вахту ‘Начисление зарплаты № 2 ‘Надбавка руководителю В таблице перерасчета всегда присутствуют две колонки. В колонке ОбъектПерерасчета хранится ссылка на документ, который необходимо перерассчитать, а в колонке ВидРасчета - ссылка на вид расчета, записи по которому потеряли актуальность. В приведенном примере из таблицы перерасчета можно сделать вывод о том, что в документе Начисление зарплаты № 1 необходимо перерассчи- тать записи с видами расчета Надбавка руководителю и Надбавка за вахту, а в документе Начисление зарплаты № 2 - только записи с видом расчета Надбавка руководителю. Формирование записей таблицы перерасчета происходит при записи в регистр расчета данных по видам расчета, которые являются ведущими по отношению к другим видам расчета. Например, в списке ведущих для таких видов расчета, как Надбавка руководителю и Премия за месяц, содер- жится вид расчета Оклад. Это означает, что при вводе или изменении записи об окладе в таблицы перерасчета соответствующих регистров Том 2
П ёре ра'с.ч ет/за п и сёй!рё ги стро в] раем ёта! попадет запись о тех надбавках и премиях, которые в результате этого потеряли актуальность (рис. 13.69). Записи регистре расчета | Вид расчета | | Период действия | | Результат | | Октая | | 01.03 - 31.03 | | 12 00В | Перерасчет "ПерерасчетДсполнительныяНачислений** 1 Объект перерасчета I Видрасчета I Нвчмсленмв премии №1 ет 31ЛЗ^М0 Премия ва месяц Рис. 13.69. Формирование записей перерасчета Так как ведущими могут выступать виды расчета любых планов видов расчета конфигурации, при вводе записи в один регистр расчета могут возникать записи в таблицах перерасчета нескольких регистров. В данном случае при вводе оклада в регистр Основные начисления (регл) формиру- ются записи в таблицах перерасчетов регистров Основные начисления (регл) и Дополнительные начисления (регл). Порядок заполнения таблицы перерасчета будет подробнее рассмотрен позже. Важно понимать, что записи перерасчета имеют рекомендательный характер, то есть платформа лишь сигнализирует, что определенные записи потеряли актуальность. Собственно алгоритм перерасчета записей разработчик должен предусмотреть самостоятельно. Измерения перерасчета В приведенном выше примере при изменении оклада в таблицу перерасчета попадает информация о том, в каких документах нужно перерассчи- тать записи с определенными видами расчета. При этом зачастую эти данные недостаточно информативны, так как в таблице не указано, записи с какими значениями измерений необходимо перерассчитать. В частности, при изменении оклада только одному сотруднику в одной организации в таблице перерасчета возникнут записи обо всех документах, в которых были начислены премии и надбавки для всех сотрудников всех органи- заций. В этом случае, если таблица перерасчета имеет приведенную выше структуру, придется перерассчитывать все указанные записи. Для того чтобы в таблице перерасчета хранилась информация о значении измерений регистра расчета, данные по которым необходимо перерас- считать, предусмотрена возможность настройки измерений перерасчета.
Глава113пСложн^1е]периодические]расчет^1 При добавлении в перерасчет измерений, в таблицу перерасчета добавля- ются новые колонки. Например, если в перерасчет основных начислений добавить два измерения - ФизЛицо и Организация, таблица перерасчета примет следующий вид (табл. 13.18). Таблица 13.18. Таблица записей перерасчета ОбъектПерерасчета ВидРасчета ФизЛицо Организация '‘Начисление зарплаты № 1 “Недбавка руководителю “Иванов “Ромашка '‘Начисление зарплаты № 1 “Надбавка за вахту “Иванов “Ромашка “Начисление зарплаты № 2 “Надбавка руководителю “Кузнецова “Ромашка Данная таблица более информативна, так как в ней специфицированы конкретные сотрудники организаций, для которых необходимо выполнить перерасчет записей указанных видов расчета в указанных документах. При вводе записи об окладе по конкретному сотруднику в таблицу пере- расчета данной структуры попадут не все записи по зависимым видам расчета, а только записи по этому сотруднику. Фактически при анализе существования зависимых записей, которые необходимо перерассчитать, платформа будет анализировать данные регистров с отбором по конкретным значениям измерений. При этом структура регистра, в который вводится ведущая запись, может отличаться от структуры зависимого регистра. Поэтому при настройке измерений перерасчета необходимо указать связь измерений регистра, для которого будут формироваться записи перерасчета, с данными ведущих регистров. Ведущими регистрами являются регистры расчета, при вводе или изме- нении записей которых необходимо создавать записи перерасчета для текущего регистра. Настройка такой связи производится через свойства измерения перерас- чета (рис. 13.70). В свойстве Измерение регистра указывается измерение текущего регистра, на которое будет установлен отбор при анализе существования зависимых записей. В свойстве Данные ведущих регистров перечисляются измерения или реквизиты ведущих регистров, в которых хранится значение, по кото- рому должен быть установлен этот отбор. Если измерение или реквизит какого-либо регистра не будут указаны в этом свойстве, то при вводе записей в этот регистр не будет происходить формирование записей пере- расчета для текущего регистра. Например, если в измерении ФизЛицо перерасчета регистра Дополнительные начисления (регл) не указана ссылка на соответствующее измерение регистра Основные начисления (упр), то при вводе оклада для управленческого учета записи перерасчета регламентированных премий созданы не будут.
Свойства: ФнзЛицо •' X И Mill х *__________________________________________ ^Основные: Синоним [физлицо ] Комментарий [ ] ▼Связь: Измерение регистра [физЛицо |.,.х) Данные ведущих регистров [физЛицо,ФизЛицо Орс) Выбор об^р^ка X е яимуммм в 0 Ойровны^ачислвнияРегл в t— ^Измерения ФизЛицо QV Организация @ = Реквизиты в 0 Дополни^льныеНачисленияРегл в Ц Измерения 0Ц ФЙэЛицо QL. Организация © = Реквизиты ® 0 УдержанияРегл ® 0 ОсновныеНачислвнияУпр ® 0 ДополнительныеНачисленияУпр 1 ™ 1 | Отмена | Рис. 13.70. Настройка измерений перерасчета Перерасчет может действовать и в рамках одного регистра. Например, при изменении оклада нужно перерассчитать надбавку руководителю, которая учитывается в том же регистре. В этом случае необходимо в свойстве Данные ведущих регистров указать связь соответствующего измерения регистра с самим собой. Автоматическое формирование записей перерасчета при вводе вытесняющих расчетов Как уже отмечалось, платформа может создавать записи таблиц перерас- четов автоматически. В частности, анализ необходимости формирования записей перерасчетов производится системой в момент записи набора записей регистра расчета, содержащего виды расчета, которые являются вытесняющими по отношению к другим видам расчета. Если при вводе набора происходит вытеснение каких-либо записей регистра расчета, информация об этих записях будет автоматически записана в таблицу перерасчета. Например, при вводе Командировки, которая вытесняет существующий Оклад, запись об Окладе попадет в таблицу перерасчета. Механизм формирования записей перерасчетов при вводе вытесняющих расчетов действует независимо от того, включены ли соответствующие виды расчета в список ведущих по отношению к текущему виду расчета. Профессиональная разработка в системе «1С:Предприятие 8»
Тем не менее в определенных случаях есть смысл включить вытесняющий расчет в список ведущих. Такие случаи будут рассмотрены в разделе «Особенности использования таблицы вытесняющих видов расчета» на стр. 50. Автоматическое формирование записей перерасчета при вводе прочих расчетов Необходимость в формировании записей перерасчетов возникает не только в случае вытеснения. В частности, при вводе или изменении записей с базовыми видами расчета необходимо перерассчитать записи, которые от них зависят по базовому периоду. Например, при изменении Оклада необходимо сформировать запись перерасчета по Премии. Для того чтобы записи перерасчетов, не связанные с вытеснением, сформи- ровались автоматически, должны быть выполнены следующие условия. Зависимость видов расчета Для настройки зависимости видов расчета для целей перерасчета исполь- зуется предопределенная табличная часть ведущих видов расчета. При анализе необходимости перерасчета система проверяет, является ли вид расчета во вводимой записи регистра ведущим по отношению к видам расчета существующих записей регистров. В перерасчет попадут только те записи, по отношению к которым данный вид расчета является ведущим. Поэтому для автоматического формирования записей перерас- чета необходимо настроить списки ведущих видов расчета во всех видах расчета, которые должны перерассчитываться. Например, если в виде расчета Премия за месяц не указать Оклад как ведущий вид расчета, то запись о перерасчете Премии в случае изменения Оклада создана не будет. Связь измерений и реквизитов через измерения перерасчета Если у перерасчета есть измерения, формирование записей этого перерас- чета будет производиться только в случае ввода или изменения записей тех регистров, измерения или реквизиты которых указаны в свойстве Данные ведущих регистров измерений перерасчета. При этом в текущем регистре будет установлен отбор по значениям соответствующих полей ведущих регистров. Например, при вводе Оклада сотруднику Иванов в регистре дополни- тельных начислений будут анализироваться только записи по сотруднику Иванов. При отсутствии измерения перерасчета для соответствующей таблицы выполнение этого условия проверяться не будет. Том 2
Зависимость по базовому периоду При анализе существования зависимых записей учитывается, попадает ли ведущая запись в базовый период зависимой. Запись о перерасчете будет формироваться только в том случае, если ведущая запись пересекает базовый период зависимой. Например, при вводе оклада за март в таблицу перерасчета попадут только те премии, базовый период которых пересе- кает март (рис. 13.71). Базовый период расчета преьод При вводе оклада запись о перерасчете преьвш создана не будет Регистр "Основные начисления" Регистр "Дополнительные начисления" Базовый период расчета греьми При вводе оклада будет создана загмсь о перерасчете преьвш ^кл^ Регистр "Основные начисления" Регистр "Дополнительные начисления" Рис. 13.71. Формирование записей перерасчета При этом учитывается способ зависимости от базы, настроенный в плане видов расчета зависимого регистра: зависимость по периоду действия или по периоду регистрации.
ПОДРОБНЕЕ Раздел «Настройка зависимости по базовому периоду», стр. 32. При выполнении всех трех указанных условий записи таблиц перерас- четов будут формироваться платформой автоматически. Особенности использования таблицы вытесняющих видов расчета Таким образом, при заполнении табличной части ведущих видов расчета необходимо учитывать следующие общие правила: вытесняющие виды расчета в список ведущих включать не обяза- тельно, так как автоматическое формирование записей перерасчета по вытесняемым записям произойдет и без этого; базовые виды расчета рекомендуется включить в список ведущих, в противном случае при изменении записи с базовым видом расчета текущая запись не попадет в таблицу перерасчетов автоматически. Однако в определенных случаях есть смысл включить в список ведущих в том числе и вытесняющие виды расчета. Рассмотрим следующий пример зависимости видов расчета (рис. 13.72). =1 у действия Рис. 13.72. Пример зависимости видов расчета В данном случае вид расчета Невыход является вытесняющим по отно- шению к виду расчета Оклад, а Оклад, в свою очередь, является базовым по отношению к виду расчета Премия. При такой зависимости включать Невыход в список ведущих для Оклада необязательно, так как перерасчет сработает в любом случае. А вот сам Оклад необходимо включить в список ведущих для Премии, иначе запись о перерасчете Премии не будет создана автоматически при изменении Оклада. Настройки, указанной на схеме, в принципе достаточно для правильной работы начислений. При вводе или изменении Невыхода будет создана запись о необходимости перерасчета Оклада. После перерасчета Оклада и записи его в регистр система просигнализирует, что теперь возникла необходимость перерасчета Премии, так как Оклад является ведущим по отношению к Премии.
Несмотря на то, что зависимость отражена правильно, при такой настройке перерасчет записей приходится выполнять в два этапа. Первый раз таблица перерасчета анализируется после изменения Невыхода, после чего произ- водится перерасчет Оклада. Затем необходимо повторно анализировать таблицу перерасчета, после чего перерассчитывать Премию (рис. 13.73). Рис. 13.73. Последовательность перерасчета записей Для того чтобы избежать необходимости поэтапного перерасчета, следует настроить зависимость таким образом, чтобы запись о перерасчете Премии возникала сразу при изменении Невыхода, без промежуточного перерас- чета Оклада. Для этого достаточно включить Невыход в список ведущих видов расчета по отношению к Премии (рис. 13.74). Рис. 13.74. Пример зависимости видов расчета В результате этого перерасчет можно будет выполнить за один раз, так как при изменении Невыхода в таблицу перерасчета одновременно попадут Оклад и Премия. Необходимо учитывать, что перерасчет записей об Окладе и Премии в данном случае должен быть выполнен в правильной последо- вательности: сначала Оклад, затем Премия (рис. 13.75). Рис. 13.75. Последовательность перерасчета записей Профессиональная разработка в системе «1С:Предприятие 8»
Формирование записей перерасчета средствами встроенного языка Во всех случаях, когда выполнить указанные выше условия не пред- ставляется возможным, записи таблиц перерасчета при необходимости должны быть сформированы средствами встроенного языка. Такая необ- ходимость может возникнуть, например, если в регистре не используется базовый период. В этом случае таблица перерасчета данного регистра не будет формироваться автоматически. Также ручное формирование записей перерасчета может потребоваться в случае, когда необходимо отслежи- вать изменения данных, хранящихся не в регистре расчета, а, например, в регистре накопления. В этом случае при вводе данных в регистр накоп- ления разработчик может предусмотреть ввод данных о перерасчете записей регистра расчета средствами встроенного языка. В частности, в демонстрационной конфигурации «Сложные периоди- ческие расчеты», которая находится на прилагаемом компакт-диске, способ расчета ПоСдельнойВыработке предполагает расчет начислений на основе данных регистра накопления СдельнаяВыработка. При изменении данных этого регистра за определенный период может возникать необходи- мость перерасчета уже рассчитанных начислений по сдельному заработку. В этом случае записи перерасчета должны быть сформированы в соот- ветствующую таблицу средствами встроенного языка в момент изменения данных регистра накопления СдельнаяВыработка. Формирование записей таблицы перерасчета происходит с использо- ванием метода СоздатьНаборЗаписей() объекта ПерерасчетМенеджер. Создаваемый набор записей должен всегда содержать отбор по полю ОбъектПерерасчета. Для записи созданного набора применяется метод Записать() объекта ПерерасчетНаборЗаписей. В качестве параметра указывается значение типа Булево. Если будет передано значение Истина, перед записью набора будут удалены записи таблицы, удовлетворяющие установленному отбору. Установка параметра в значение Ложь позволит добавить созданные записи в таблицу без замещения существующих. Ниже приведен пример модуля, формирующего записи таблицы перерас- чета основных начислений (листинг 13.14). В запросе выбираются записи регистра расчета основных начислений с предопределенным видом расчета Сдельный, период действия которых содержит дату движения по регистру накопления. В результате для каждого сотрудника каждой организации запрос возвращает значение документа, который произвел данную запись о сдельном заработке в регистр. Данная процедура вызы- вается сразу после формирования движений по регистру накопления. ПОДРОБНЕЕ Фрагмент доступен в демоконфигурации, в модуле документа Регист- ра цияСдельнойВыработки. Том 2
П ёре ра'с.ч ет/за п и сёй!рё ги стро в] раем ёта! Листинг 13.14. Формирование записей перерасчета Процедура СформироватьЗаписиПерерасчета() // Запрос по записям регистра расчета. Запрос = Новый Запрос(" |ВЫБРАТЬ РАЗЛИЧНЫЕ | СдельнаяВыработка.ФизЛицо, | СдельнаяВыработка.Организация, | ОсновныеНачисленияРегл. Регистратор, | ОсновныеНачисленияРегл.ВидРасчета |ИЗ | РегистрНакопления.СдельнаяВыработка КАК СдельнаяВыработка | ЛЕВОЕ СОЕДИНЕНИЕ | РегистрРасчета.ОсновныеНачиспенияРегл КАК ОсновныеНачисленияРегл | ПО СдельнаяВыработка.ФизЛицо = ОсновныеНачисленияРегл.ФизЛицо | И СдельнаяВыработка.Организация = ОсновныеНачисленияРегл.Организация | И (СдельнаяВыработка.Период МЕЖДУ | ОсновныеНачисленияРегл.ПериодДействияНачало | И ОсновныеНачисленияРегл. ПериодДействияКонец) |ГДЕ | ОсновныеНачисленияРегл.ВидРасчета = &ВидРасчета | И СдельнаяВыработка.Регисгратор = &Регисгратор |ИТОГИ ПО | Регистратор"); Запрос.УстановитьПараметр("ВидРасчета", ПланыВидовРасчета.ОсновныеНачиспения.Сдельный); Запрос.УсгановитьПараметрС'Регистратор", Ссылка); ВыборкаДокументов = Запрос.Выполнить(). Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); // Получение объекта ПерерасчетМенеджер. Перерасчет = РегистрыРасчета.ОсновныеНачисленияРегл. Перерасчеты. ПерерасчетОсновныхНачислений; Пока ВыборкаДокументов.Следующий() Цикл // Создание набора записей. НаборЗаписей = Перерасчет.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.ОбьектПерерасчета.Значение = ВыборкаДокументов.Регисгратор; Выборка = ВыборкаДокументов.Выбрать(); // Создание записей перерасчета. Пока Выборка.Следующий() Цикл Запись = НаборЗаписей.Добавить(); Запись.ВидРасчета = Выборка.ВидРасчета; Запись.Организация = Выборка.Организация; Запись.ФизЛицо = Выборка.ФизЛицо; КонецЦикла; // Запись в таблицу без замещения. НаборЗаписей.Записать(Ложь); КонецЦикла; КонецПроцедуры
Глава113пСложн^1е]периодические]расчет^1 Автоматическое удаление записей перерасчета Записи автоматически удаляются платформой из таблицы перерасчета только в том случае, если из регистра расчета удалена запись, которую необходимо перерассчитать. При этом необходимо учитывать, что удаление записей регистра расчета происходит не только при отмене проведения соответствующего документа, но и при его повторном расчете. Расчет документа предполагает, что записи формируются и рассчитываются заново, при этом предыдущие записи документа удаляются. Собственно при перерасчете записей регистра расчета платформа авто- матически не удалит записи из таблицы перерасчета, так как при перерасчете не происходит удаления записи, меняются лишь значения ее ресурсов. Поэтому при формировании процедуры перерасчета разра- ботчик должен предусмотреть удаление записей перерасчета средствами встроенного языка. Пример такой процедуры будет рассмотрен в разделе «Реализация перерасчета записей регистров расчета» на стр. 53. Анализ данных таблицы перерасчета Данные таблицы перерасчета недоступны пользователю для интерак- тивного просмотра и изменения в режиме 1С:Г1редприятие. Поэтому для возможности интерактивной работы пользователя с этими данными следует предусмотреть соответствующий отчет или обработку. Например, это может быть обработка, в которой выведены данные о записях перерас- чета по конкретной организации в следующем виде (рис. 13.76). Рис. 13.76. Обработка «Перерасчет зарплаты» Данная обработка в верхнем списке отображает список сотрудников организации, по которым необходимо выполнить перерасчет записей. В нижней таблице приводится подробная информация о записях по теку- щему сотруднику с указанием документа и вида расчета. S2
Выбрав в списке нужных сотрудников, пользователь может нажать кнопку Выполнить перерасчет и инициировать перерасчет записей по соответству- ющим сотрудникам. Ниже приведен текст модуля, заполняющий список физических лиц, а также таблицу записей по выбранному сотруднику (листинг 13.15). ПОДРОБНЕЕ Полностью данная обработка представлена в демонстрационной кон- фигурации «Сложные периодические расчеты», которая находится на прилагаемом компакт-диске. Листинг 13.15. Заполнение списка сотрудников и заполнение таблицы записей по выбранному сотруднику // Заполнение списка физлиц для перерасчета по выбранной организации. Процедура ЗаполнитьФизлицаПоОрганизации() Запрос = Новый Запрос; Запрос.УстановитьПараметр("Организация", Организация); Запрос.Текст =" |ВЫБРАТЬ РАЗЛИЧНЫЕ | ПерерасчетОсновныхНачислений.ФизЛицо, | ИСТИНА КАК Пометка |ИЗ | РегистрРасчета.ОсновныеНачисленияРет.ПерерасчетОсновныхНачиспений | КАК ПерерасчетОсновныхНачислений ГДЕ | ПерерасчетОсновныхНачислений.Организация = Организация I | ОБЪЕДИНИТЬ I |ВЫБРАТЬ РАЗЛИЧНЫЕ | ПерерасчетДолопнитепьныхНачислений.ФизЛицо, | ИСТИНА |ИЗ | РегистрРасчетаДополнительныеНачисленияРегл. | ПерерасчетДополнительныхНачислений | КАК ПерерасчетДопопнительныхНачислений ГДЕ | ПерерасчетДолопнитепьныхНачислений.Организация = Организация"; ТаблицаФизлиц = Запрос.Выполнить().Выгрузить(); ТаблицаФизпиц.Свернуть("Физпицо"); МассивФизлиц = ТабпицаФизлиц.ВыгрузитьКопонку("ФизЛицо"); Физлица.ЗагрузитьЗначения(МассивФизлиц); КонецПроцедуры // Заполнить таблицу записей по выбранному физлицу. Процедура ЗапопнитьЗаписиПоФизлицу(ФизЛицо) Запрос = Новый Запрос; Запрос.УстановитьПараметрС'ФизЛицо”, ФизЛицо); Запрос.Текст =" Профессиональная разработка в системе «1С:Предприятие 8»
[ВЫБРАТЬ РАЗЛИЧНЫЕ | ПерерасчетОсновныхНачислений.ОбъектПерерасчета, | ПерерасчетОсновныхНачиспений.ВидРасчета |ИЗ | РегистрРасчета.ОсновныеНачиспенияРегл.ПерерасчетОсновныхНачислений | КАК ПерерасчетОсновныхНачислений ГДЕ | ПерерасчетОсновныхНачислений.ФизЛицо = &ФизЛицо I [ОБЪЕДИНИТЬ I [ВЫБРАТЬ РАЗЛИЧНЫЕ | ПерерасчетДополнительныхНачиспений.ОбъектПерерасчета, | ПерерасчетДополнительныхНачислений.ВидРасчета |ИЗ [Регистр Расчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений | КАК ПерерасчетДополнительныхНачислений ГДЕ | ПерерасчетДополнительныхНачислений.ФизЛицо = &ФизЛицо"; Результат = Запрос.Выпопнить(); Выборка = Результат.Выбрать(); ЗаписиПоФизЛицу.Очистить(); Пока Выборка.Спедующий() Цикл НоваяСтрока = ЗаписиПоФизЛицу.Добавипь(); НоваяСтрока.ОбъектПерерасчета = Выборка.ОбъектПерерасчета; НоваяСтрока.ВидРасчета = Выборка.ВидРасчета; КонецЦикла; КонецПроцедуры Процедура инициации перерасчета состоит в вызове соответствующей экспортной процедуры документа, записи которого должны быть перерас- считаны. Сама процедура описана в следующем разделе. Ниже приведен текст модуля, вызывающего процедуру перерасчета документов с пере- дачей списка сотрудников, по которым должен быть выполнен перерасчет. Для этого при помощи запроса строится выборка документов из таблиц перерасчета по выбранному списку сотрудников (листинг 13.16). Листинг 13.16. Пример вызова процедуры перерасчета &НаКлиенте Процедура ВыполнитьПерерасчет(Команда) ПерерасчетДокументов(); КонецПроцедуры &НаСервере Процедура ПерерасчетДокументов() СписокФизлиц = Новый СписокЗначений; Для каждого Элемент из ФизЛица Цикл Если Эпемент.Пометка Тогда СписокФизпиц.Добавить(Эпемент.Значение); Том 2
П ёре ра'с.ч ет/за п и сёй!рё ги стро в] раем ёта! КонецЕсли; КонецЦикла; Запрос = Новый Запрос; Запрос.УстановитьПараметрС'ФизЛица", СписокФизпиц); Запрос.Текст = ” |ВЫБРАТЬ РАЗЛИЧНЫЕ | ПерерасчетОсновныхНачислений.ОбъектПерерасчета |ИЗ | РегистрРасчета.ОсновныеНачисленияРегп.ПерерасчетОсновныхНачислений | КАК ПерерасчетОсновныхНачислений ГДЕ | ПерерасчетОсновныхНачислений.ФизЛицо В (&ФизЛица) I | ОБЪЕДИНИТЬ I |ВЫБРАТЬ РАЗЛИЧНЫЕ | ПерерасчетДополнительныхНачислений.ОбъектПерерасчета |ИЗ |РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений | КАК ПерерасчетДопопнительныхНачислений ГДЕ |ПерерасчетДопопнитепьныхНачислений.ФизЛицо В (&ФизЛица)"; ВыборкаДокументов = Запрос.Выпопнить().Выбрать(); // Выборка по документам, требующим перерасчета. Пока ВыборкаДокументов.Следующий() Цикл // Получить объект. ДокументОбьект = ВыборкаДокументов.ОбъектПерерасчета.ПолучитьОбъект(); // Вызвать процедуру перерасчета. Попытка ДокументОбъект.Перерассчитать(СписокФизлиц); Исключение Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = "Документ не может быть перерассчитан!" + ВыборкаДокументов.ОбъектПерерасчета; Сообщение.Сообщить(); КонецПопытки; КонецЦикла; КонецПроцедуры Реализация перерасчета записей регистров расчета Как уже отмечалось, записи перерасчета имеют рекомендательный характер, поэтому алгоритм собственно перерасчета записей регистра расчета, то есть изменения значения ресурсов этих записей, разработчик должен предусмотреть самостоятельно. Алгоритм перерасчета записей по сути не отличается от алгоритма их расчета, описанного в разделе «Технология формирования и расчета записей регистров расчета» на стр. 37. Специфика перерасчета состоит в его выборочной работе, перерасчет не предполагает, что все записи документа будут рассчитаны заново.
В частности, если в документе начислены премии нескольким тысячам сотрудников, то при изменении оклада только одного из них в процессе перерасчета премий не должны быть заново рассчитаны все записи. Модуль перерасчета должен быть настроен таким образом, чтобы были выборочно изменены значения ресурсов только тех записей, которые пользователь попросил перерассчитать. В процессе перерасчета не происходит создания новых записей регистров расчета или удаления существующих. При получении от пользователя команды о перерасчете записей по конкретным значениям измерений система должна произвести следующие действия (рис. 13.77). Рис. 13.77. Действия, которые необходимо выполнить по команде пользователя Перед началом перерасчета нужно проанализировать его необходимость. Это связано с тем, что с того момента, когда пользователь получил инфор- мацию о наличии записей в таблице перерасчета, до момента, когда он инициировал процедуру, данные регистра могли измениться, и необходи- мость в перерасчете могла отпасть. Например, за это время выполнить перерасчет мог успеть другой пользователь. Необходимость перерас- чета может быть проверена, например, с использованием такой функции (листинг 13.17). Листинг 13.17. Проверка необходимости перерасчета // Проверяет необходимость выполнения перерасчета документа. Функция НеобходимостьПерерасчета(Регистратор) Экспорт Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 1 | Перерасчет.ФизЛицо |ИЗ | (ВЫБРАТЬ ПЕРВЫЕ 1 | Перерасчет.ФизЛицо КАК ФизЛицо | ИЗ | РегистрРасчета.ОсновныеНачиспенияРегл.ПерерасчетОсновныхНачислений | КАК Перерасчет I ГДЕ Перерасчет.ОбьектПерерасчета = &Регистратор
| ОБЪЕДИНИТЬ ВСЕ I | ВЫБРАТЬ ПЕРВЫЕ 1 | Перерасчет.ФизЛицо | ИЗ |РегистрРасчета.ДополнительныеНачисленияРегп.ПерерасчетДополнительныхНачислений | КАК Перерасчет I ГДЕ | Перерасчет.ОбъектПерерасчета = &Регистратор) КАК Перерасчет"); Запрос.УстановитьПараметрС’Регистратор", Регистратор); Если Запрос.Выпопнить().Пустой() Тогда Возврат Ложь; Иначе Возврат Истина; КонецЕсли; КонецФункции // НеобходимостьПерерасчета Данная функция возвращает значение Истина, если хотя бы в одной из таблиц перерасчета есть хотя бы одна запись по данному документу. Если таких записей нет, то функция вернет значение Ложь, и перерассчи- тывать записи этого документа не нужно. ПОДРОБНЕЕ Функция приведена в демоконфигурации, в общем модуле Расчеты. Собственно перерасчет записей, как и их расчет, рекомендуется выполнять в процедуре общего модуля по тем же причинам, что и расчет. Процедура перерасчета отличается от процедуры расчета только тем, что в расчете участвуют не все записи документа, а только удовлетворяющие усло- виям проводимого перерасчета. Например, только записи по конкретным сотрудникам и конкретным видам расчета. Наконец, после того как нужные записи перерассчитаны, необхо- димо средствами встроенного языка удалить соответствующие записи из таблицы перерасчета, так как перерасчет больше не требуется. Процедуру перерасчета записей документа рекомендуется помещать в модуле этого документа как экспортную процедуру. В этом случае она может быть вызвана из других модулей, в том числе из обработки перерасчета, описанной в предыдущем разделе. В качестве параметров в процедуру должна передаваться информация о том, какие именно записи документа необходимо перерассчитать. Ниже приведен пример такой процедуры, где в качестве параметра используется список сотрудников, по которым необходимо выполнить перерасчет (листинг 13.18). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 13.16. Процедура перерасчета записей документа Процедуре Перерассчитать(Физлица = Неопредепено) Экспорт // Перерасчет выполняется в транзакции. НачатьТранзакцию(); Если Не Расчеты.НеобходимостьПерерасчета(Ссыпка) Тогда Возврат; КонецЕсли; // Считать движения документа по регистрам расчета. Движения.ОсновныеНачисленияРегп.Прочитать(); Движения.ДополнительныеНачисленияРегп.Прочитать(); // Перерасчет и перезапись движений по регистрам расчета. Расчеты. ПерерассчитатьЗаписиРегистраРасчета("ОсновныеНачисленияРет", Движения.ОсновныеНачисленияРегл, ОсноеныеНачисления, Физлица); Движения.ОсновныеНачисленияРет.Записать(Истина, Истина); Расчеты.ПерерассчитатьЗаписиРегистраРасчета("ДополнительныеНачисленияРегл", Движения.ДопопнитепьныеНачисленияРегл, ДополнительныеНачисления, Физлица); Движения.ДополнительныеНачисленияРет.Записать(Истина, Истина); // Записать измененные данные табличных частей документа. Записать(); // Удалить записи перерасчета, по которым выполнен перерасчет. Для Н = 1 По 2 Цикл Если Н = 1 Тогда НаборЗаписей = РегистрыРасчета.ОсновныеНачисленияРет. Перерасчеты. ПерерасчетОсновныхНачислений. СоздатьНаборЗаписей(); Иначе НаборЗаписей = РегистрыРасчетаДополнительныеНачисленияРегл. Перерасчеты. ПерерасчетДополнительныхНачислений. СоздатьНаборЗаписей(); КонецЕсли; НаборЗаписей.Отбор.ОбъектПерерасчета.Значение = Ссыпка; Если Физлица <> НеОпределено Тогда НаборЗаписей.Прочитать(); СтрокиКУдалению = Новый Массив; Для Каждого СтрокаПерерасчета из НаборЗаписей Цикл Если Физлица.НайтиПоЗначению( СтрокаПерерасчета.Физлицо) <> НеОпределено Тогда Строки КУдалению.Добавить(СтрокаПерерасчета); КонецЕсли; КонецЦикла; Для Каждого Строка Из СтрокиКУдапению Цикл НаборЗаписей.Удапить(Строка); КонецЦикла; КонецЕсли; Том 2
П ёре ра'с.ч ет/за п и сёй!рё ги стро в] раем ёта) Набор3аписей.3аписать(); КонецЦикла; // Перерасчет выполняется в транзакции. Зафиксировать! ранзакцию(); КонецПроцедуры Процедуры общего модуля, выполняющие непосредственный перерасчет записей, по алгоритму схожи с процедурами расчета. Основное отличие состоит в том, что в процедурах перерасчета происходит расчет только тех записей, которые удовлетворяют заданным условиям. В данном случае это записи по заданному списку сотрудников. Также при перерасчете не нужно производить предварительную запись набора с формированием фактического периода действия, так как набор уже записан в регистр (перерассчитываемый документ всегда проведен). Ниже приведен пример процедур ПерерассчитатьЗаписиРегистраРасчета() и ПерерассчитатьНа- борЗаписей(). Эти процедуры используют вызов тех же самых процедур и функций, которые используются при расчете (листинг 13.19). Листинг 13.19. Процедуры перерасчета записей Процедура ПерерассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабпичнаяЧасть = Неопредепено, ФизЛица = Неопределено) Для каждого Запись из НаборЗаписей Цикл Если Запись.ВидРасчета.Приоритет = Приоритет Тогда Если НЕ ФизЛица.НайтиПоЗначению(Запись.Физлицо) = Неопределено Тогда // Получить данные для расчета записи. ДанныеДляРасчета = ПолучитьДанныеДляРасчета(Запись); // Вызвать процедуру расчета записи. Рассчитать3апись(3апись, ДанныеДляРасчета); // Вернуть результат расчета в табличную часть документа. Если Не ТабличнаяЧасть = Неопределено Тогда СтрокаТабличнойЧасти = ТабпичнаяЧасть.Получить(Запись.НомерСтроки-1); СтрокаТабличнойЧасти.Результат = Запись.Результат; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ПерерассчитатьЗаписиРегистраРасчета(ИмяРегистра, НаборЗаписей, ТабпичнаяЧасть = Неопредепено, Физпица = Неопределено) Экспорт Регистратор = НаборЗаписей.Отбор.Регистратор.Значение; // Запрос по приоритетам видов расчета // только записей заданных сотрудников. 33
Глава113КСложн£|е]пёриодические]расчет£| Запрос = Новый Запрос; Запрос.Тексг =" |ВЫБРАТЬ РАЗЛИЧНЫЕ | " + ИмяРегистра + ".ВидРасчета.Приоритет КАК Приоритет |ИЗ | РегистрРасчета." + ИмяРегистра +" КАК ” + ИмяРегистра +" ГДЕ | ФизЛицо В (&СписокФизлиц) И Регистратор = &Регистратор УПОРЯДОЧИТЬ ПО | Приоритет |ИТОГИ ПО | ” + ИмяРегистра + ".ВидРасчета.Приоритет”; Запрос.УстановитьПараметрС'СписокФизлиц", Физлица); Запрос.УстановитьПараметр("Регистратор", Регистратор); ВыборкаПриоритетов = Запрос.Выполнить(). Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); // Для каждого значения приоритета выполняется расчет записей. Пока ВыборкаПриоритетов.Следующий() Цикл ПерерассчитатьНаборЗаписей(НаборЗаписей, ВыборкаПриоритетов.Приоритет, ТабличнаяЧасть, Физлица); // Записать набор в регистр для расчета записей следующего // приоритета, фактический период действия не пересчитывается. НаборЗаписей.Записать(Истина, Истина); КонецЦикла; КонецПроцедуры
Профессиональная разработка в системе «1С:Предприятие 8»
Глава 14. Бизнес-процессы С точки зрения автоматизации деятельность любой организации, пред- приятия представляет собой набор совершаемых сотрудниками операций. Очень часто эти операции не существуют по отдельности, а являются логическим следствием выполнения предыдущих действий (операций), т. е. являются элементом какой-либо технологической цепочки. Простым примером такой цепочки может являться процесс получения денег подот- четным лицом. В нем можно выделить следующие этапы: заявка на получение денежных средств; рассмотрение заявки руководителем подразделения (на предмет необ- ходимости); рассмотрение заявки главным бухгалтером (на предмет наличия денежных средств); выдача кассиром денежных средств; отчет об израсходованных средствах (авансовый отчет). Главный бухгалтер не будет рассматривать возможность выдачи денежных средств без наличия визы руководителя подразделения, кассир не будет выдавать деньги без указания главного бухгалтера, или если денег попросту нет и т. д. Другим примером может являться операция продажи товара оптовому покупателю. В данной операции можно выделить следующие этапы: выписка заказа покупателя, получение оплаты за товар, сборка заказа на складе, отгрузка товара. В контексте последней цепочки представим одну из задач, которая может возникнуть перед руководством организации, предприятия. Компания стремительно набирает обороты (огромное спасибо сотруд- никам отдела рекламы). Для того чтобы рост организации в какой-то момент не остановился, необходимо заранее подумать о своевре- менном наборе (и обучении) сотрудников, расширении штата. И вот он сам вопрос: «Кого набирать?». Набрать сотрудников в отдел рекламы... Но если не хватает персонала на выписке счетов, то это может привести не к росту, а, наоборот, к падению оборотов компании (за организацией может закрепиться репутация «не желающих даже счет выписать»). Том 2
Набрать менеджеров по выписке счетов... Но если сотрудники склада не будут справляться с задачей своевременной подготовки товара к отгрузке, это также может привести к плачевному результату. Что же делать? Спросить у персонала? Ответить на этот вопрос практически невозможно, если при решении задачи использовать данные только об отдельно осуществляемых опера- циях. Эти операции необходимо рассматривать как этапы единой цепочки действий. Только при рассмотрении данного процесса как единого целого можно определить узкий (и потенциально опасный) участок. С другой стороны, в реальной жизни не бывает простых процессов. Обычно этапы, из которых они состоят, конкретные исполнители этих этапов определяются в ходе выполнения процесса и зависят от множества факторов. При отражении в учете таких сложных цепочек перед сотруд- ником (который ведет учет) может встать довольно сложная задача: какие документы использовать, в какой последовательности их вводить и как. Любая программа (конфигурация) дает пользователю определенную свободу действий по отражению той или иной отдельно взятой операции, но с точки зрения всего процесса может оказаться, что существует только один-единственный правильный вариант. Чтобы не ошибиться, сотрудник должен в полном объеме представлять особенности отражаемого процесса и особенности работы конфигурации, в которой ведется учет. Что при наличии большого количества таких цепочек (и определенной текучке в кадрах) не всегда достижимо. Кроме этого, конкретный исполнитель иногда (можно сказать, что и чаще всего) и не должен знать всю цепочку, он отвечает только за ее конк- ретный участок. Не зная всей картины, он по определению не может принять оптимального (верного) решения. Как говорится, как он может думать, не зная всех входных условий процесса? Получается, что при таком варианте организации работы конечного пользователя должен быть кто-то (или что-то), кто подсказывал бы пользователю, что именно сейчас нужно сделать именно так и никак иначе. Возложить эту операцию на человека? (См. абзац выше...) Идеальным вариантом (для учета сложных процессов) является переход от учета «от документа» (когда пользователь должен знать, какие доку- менты, в какой последовательности, с какими особенностями он должен завести) к процессному учету (когда сам программный комплекс будет
Гл~ава114ЯБизнесгпр'оцесс£| подсказывать пользователю, что он сейчас должен сделать). В соответс- твии с логикой процесса, особенностями его старта определяется текущий этап, по возможности определяется исполнитель, особенности отражения операции и т. п. Для ведения учета (и автоматизации) цепочек действий в конфигурациях «1С:Предприятия» могут использоваться такие объекты, как бизнес-про- цессы и задачи. ПЕРВОЕ ЗНАКОМСТВО Бизнес-процессы в «1С:Предприятии» позволяют объединить отдельные операции в цепочки взаимосвязанных действий, приводящих к дости- жению конкретной цели. Они позволяют формализовать процедуры обработки тех или иных событий, возникающих в деятельности органи- зации, и обеспечить участие в них исполнителей. Цепочки взаимосвязанных действий бизнес-процесса представляются с помощью карты маршрута бизнес-процесса. Карта маршрута описы- вает логику бизнес-процесса и весь его жизненный цикл от точки старта до точки завершения. Она реализована в виде схематического изображения последовательности прохождения взаимосвязанных точек маршрута. Точка маршрута отражает определенный этап жизненного цикла бизнес- процесса и обычно связана с выполнением какой-либо операции (ручной или автоматической). Задачи в «1 (^Предприятии» соответствуют пользовательским заданиям (что должен сделать определенный пользователь). Выполнение задачи приводит к продвижению бизнес-процесса от одной точки к другой. Сами задачи могут создаваться как бизнес-процессом (в соответствии с картой маршрута), так и программно. Опишем цепочку продажи товара с точки зрения введенных терминов. Цепочка действий, выполняемая по одному выписанному счету, будет являться элементом (экземпляром) бизнес-процесса. Можно провести аналогию со справочником. Как справочник Номенклатура хранит данные обо всей номенклатуре (соответствующий объект конфигурации опре- деляет состав реквизитов, табличных частей, формы справочника), а отдельный элемент хранит данные о каком-либо одном товаре (но в соответствии со структурой, определенной для всего справочника), так и элемент бизнес-процесса содержит данные об отдельно взятом процессе (начатом с выписки конкретного счета), но состав этапов, логика их прохождения определяются в соответствии с объектом конфигурации Бизнес-процесс. При переходе к очередному этапу в рамках какого-либо процесса будет создаваться Задача. Задача содержит данные о бизнес-процессе, в рамках
которого она создана, этапе этого бизнес-процесса. Кроме этого, задача может содержать данные о пользователе, который должен ее выполнить, либо какие-то другие характеристики такого пользователя, такие как должность, принадлежность к подразделению и т. п. Например, после выписки счета может создаваться задача Оплата товара. При поступлении денежных средств от покупателя данная задача считается выполненной, и в соответствии с картой бизнес-процесса производится создание следующей задачи Подготовка к отгрузке (осуществляется переход к следующему этапу). Во вновь созданной задаче может быть указано, что она должна быть выполнена пользователем с ролью Кладовщик. КАРТА МАРШРУТА Для редактирования карты маршрута необходимо на закладке Прочее окна редактирования бизнес-процесса нажать кнопку Карта маршрута (рис. 14.1). Рис. 14.1. Редактирование карты маршрута После открытия окна карты маршрута для ее создания, корректировки можно использовать панель Вставка элементов схемы, в которой опреде- лены все возможные точки маршрута, кнопки вставки декораций, линий (рис. 14.2). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 14.2. Панель «Вставка элементов схемы» Панель по умолчанию размещается в нижней части окна конфигуратора, но, как и любая панель инструментов, может быть размещена в любом его месте. При определении карты маршрута допускается использование следующих видов маршрутизации: Жесткая - линейная, без каких-либо ветвлений; Свободная - адресаты точки карты маршрута бизнес-процесса не уста- новлены и определяются программно или интерактивно в течение жизненного цикла бизнес-процесса; Условная - карта маршрута предусматривает проверку условий и переход по соответствующим ветвям. Переходы могут быть как бинарными (условие), так и множественными (выбор варианта); Параллельная - карта маршрута предусматривает разделение бизнес- процесса на параллельные ветви с возможностью последующего слияния (ожидания). Продвижение бизнес-процесса по каждой из параллельных ветвей происходит независимо по мере выполнения соответствующих задач. На рис. 14.3 приведен пример карты маршрута с жесткой маршрутиза- цией. ___X______ £ Менеджер Выписать счет £ Кассир Оплатить товар £ Кладовщик Отгрузить товар Рис. 14.3. Пример карты маршрута с жесткой маршрутизацией В данном бизнес-процессе этапы расположены жестко друг за другом, задачи создаются, выполняются строго в соответствии с их порядком в карте маршрута. На рис. 14.4 приведен пример карты маршрута с условной маршрутиза- цией. Том 2
Рис. 14.4. Карта маршрута бизнес-процесса с условной маршрутизацией Данный бизнес-процесс реализует механизм согласования какого-либо документа. После отработки задачи Утверждение в зависимости от резуль- тата (проверяемого в точке условия «Утвержден?») производится либо завершение бизнес-процесса, либо переход к доработке документа с последующим возвратом на утверждение. К условному виду маршрутизации данная карта относится из-за отсутствия параллельных (сходящихся) ветвей. К параллельному виду маршрути- зации можно отнести карту следующего вида (рис. 14.5). L__I Рис. 14.5. Пример карты маршрута бизнес-процесса с параллельной маршрутизацией
Гл~ава114ЯБизнесгпр'оцесс£| В данном бизнес-процессе считается, что после выписки счета его оплата и подготовка к отгрузке (сборка заказа) могут выполняться параллельно, но отгрузка возможна только после выполнения обеих задач (и оплаты, и подготовки отгрузки). Чаще всего в реальных бизнес-процессах встречаются смешанные виды маршрутизации (и условная, и параллельная и т. п.). При работе с бизнес-процессами существует возможность отображения карты маршрута в пользовательском режиме. При этом в ней будет отра- жаться текущее состояние бизнес-процесса. Для этой цели в форме бизнес-процесса можно создать реквизит формы КартаМаршрута типа ГрафическаяСхема, перетащить его на форму или создать поле формы вида Поле графической схемы, связанное с рекви- зитом КартаМаршрута. Затем при создании формы бизнес-процесса можно получать карту маршрута бизнес-процесса, отражающую его текущее состояние, методом ПолучитьКартуМаршрута(). Для этого в обработчике события формы бизнес-процесса ПриЧтенииНаСервере нужно поместить следующий фрагмент кода (листинг 14.1). Листинг 14.1. Пример отображения карты маршрута &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) КартаМаршрута = ТекущийОбъект.ПолучитьКартуМаршрута(); КонецПроцедуры В результате, например, можно увидеть следующую картину (рис. 14.6). Пройденные точки маршрута отмечаются штриховкой, текущая точка (точки) отмечается красной пунктирной линией (точка, для которой существуют невыполненные задачи). При необходимости просмотра карты маршрута в других формах (не в форме самого бизнес-процесса) можно использовать следующий фрагмент кода (листинг 14.2). Листинг 14.2. Пример отображения карты маршрута в форме обработки // БП - Ссылка на интересующий бизнес-процесс. БизнесПроцессОбъект = БП.ПолучитьОбьект(); КартаМаршрута = БизнесПроцессОбьект.ПолучитьКартуМаршрута(); Результат будет таким же, как и в предыдущем случае. ПОДРОБНЕЕ Приведенный пример можно посмотреть в демонстрационной конфи- гурации «Бизнес-процессы», прилагающейся к книге на компакт-диске, в обработке РаботаСБП.
® C- W ' п- (^Предприятие ЕЙ LA V5 1§1 21 ill - - □ X Продажа товара 000000001 от 24.10.2011 20:45:17 | Стартовать и закрыть 1liRI । Старт i (§| Все действия > । (?) Номер: ,000000001 ~| Дате |Н11ДМ1МВЩВ 81 Ведущая задача: | ... Q| Счет: (Счет 000000001 от 05.08.2011 1:31:31 ... Q| Расходная накладная | Расходная накладная 000000003 от 27.12201012:00:00... Q| Стартовал: 0 Завершен О Рис. 14.6. Пример отображения карты маршрута ТОЧКИ МАРШРУТА Процесс определения карты маршрута (логики поведения бизнес- процесса) состоит в нанесении на карту точек маршрута, определении связей между ними, определении обработчиков событий, специфических для каждой точки. Существует несколько точек маршрута: точка старта, точка завершения, точка действия, точка условия, точка выбора варианта, точка разделения, точка слияния, точка обработки, точка вложенного бизнес-процесса. Профессиональная разработка в системе «1С:Предприятие 8»
У точек некоторых видов есть специфические свойства и события. Например, свойство Групповая есть только у точки действия, а событие ПроверкаУсловия - только у точки условного перехода. Также следует отметить, что по умолчанию (если иное поведение бизнес- процесса не описано программно) создание задачи (задач) происходит только при переходе на такие точки маршрута, как точка действия и точка вложенного бизнес-процесса. В остальных точках может производиться какая-либо обработка данных: проверка условия, выбор варианта продви- жения по карте, обработка каких-либо объектов системы и т. п. Рассмотрим точки маршрута подробнее. Точка старта, точка завершения Схематическое изображение данных точек показано на рис. 14.7. Рис. 14.7. Точка старта и точка завершения С точки старта бизнес-процесс стартует, в точке завершения (если иное не определено программно) он завершается. У бизнес-процесса может быть определено несколько точек старта и (или) несколько точек завер- шения. Карта бизнес-процесса может иметь следующий вид (рис. 14.8). Предположим, что старт бизнес-процесса осуществляется оператором, принимающим заявки по телефону. В ходе разговора с потенциальным клиентом он выясняет, интересует ли клиента предпродажная демонс- трация изделия (клиент уже может быть знаком с данной продукцией и вследствие этого откажется от демонстрации). В зависимости от варианта ответа клиента выбирается та или иная точка старта бизнес-процесса. Если после демонстрации клиент решает купить товар, выполняется цепочка действий, ответственных за продажу. Завершение бизнес-процесса производится либо при покупке товара (продажа состоялась), либо при отказе после демонстрации. ПОДРОБНЕЕ Особенности работы с данными точками (их событиями) описаны в разделах «Старт бизнес-процесса», стр. 67 и «Завершение бизнес- процесса», стр. 73. Том 2
Рис. 14.6. Карта бизнес-процесса продажи товара с демонстрацией Точка действия Точка действия является одной из точек, при переходе на которую созда- ется задача или несколько задач (если иное поведение не было определено программно). Допустим вариант, что при переходе на данную точку не будет создана ни одна задача. Эти и другие механизмы, связанные с определе- нием обработчиков событий данной точки маршрута, рассматриваются в разделах, связанных с формированием и выполнением задач. Схематическое представление точки действия на карте маршрута имеет следующий вид (рис. 14.9). & Адресация Точка действия Рис. 14.9. Точка действия Как уже сказано выше, обычно при переходе на точку действия произ- водится формирование задачи (или нескольких задач). Одним из важных моментов, которому уделяется внимание (при создании задач), является определение их исполнителей. За данный механизм отвечает так называ- емая система адресации бизнес-процессов. ©и
Гл~ава114ЯБизнесгпр'оцесс£| Можно выделить два вида адресации (адресной маршрутизации), реали- зованной в платформе: Персональная - пользователь (исполнитель) определяется в явном виде; Ролевая - исполнитель определяется исходя из назначенных ему ролей, принадлежности к подразделению, а также других реквизитов адресации. Примером персональной адресации может являться указание, что данная задача должна выполняться таким-то пользователем системы. При исполь- зовании ролевой адресации может указываться, что задача должна быть выполнена пользователем с ролью Кладовщик, работающим в подразде- лении Оптовый склад. Данные, используемые системой адресации, хранятся в регистре сведений. Каждое измерение такого регистра определяет возможный адресный разрез. Одно из измерений обычно связывают с персональной адресацией. Пример структуры такого регистра сведений приведен на рис. 14.10. Щ Регистр сведений РегистрАдресацми □ X Основные Подсистемы Функциональные опции | к Данные Регистраторы Формы Команды Макеты Права Обмен данными Прочее | Действия -11 <Назад 11 Далее> | | Закрыть 11 Справка | Рис. 14.10. Структура регистра сведений Имея такой регистр, конкретную задачу можно адресовать либо отде- льному сотруднику (измерение Сотрудник), либо сразу нескольким сотрудникам, имеющим одинаковую роль (измерение РольИсполнителя), либо сразу нескольким сотрудникам, относящимся к одному и тому же подразделению (измерение Подразделение). В табл. 14.1 приведен пример заполнения регистра сведений. Таблица 14.1. Пример заполнения регистра сведений Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Петров Бухгалтер Администрация Сидоров Кладовщик Оптовый склад Федоров Руководитель отдела Отдел продаж
Привязка системы адресации (регистра сведений) к бизнес-процессу осуществляется через объект Задача (при конфигурировании бизнес- процесса в нем указывается ссылка на объект конфигурации Задача). В самой задаче на закладке свойств Адресация определяется ссылка на используемый регистр сведений, и кроме этого необходимо определить используемые реквизиты адресации (рис. 14.11). Адресация |РегистрАдресации... х| Основной реквизит адресации | Текущий исполнитель |Тек*дцийИсполнигель ... Х| ф К Ф О ЕЯ в Реквизиты адресации = Сотрудник 1Ш1 Задача Задача П X Основные Подсистемы Функциональные опции | к Адресация Данные Нумерация Формы Команды Макеты Ввод на основапы Права Обмен данными Прочее = РольИсполнителя | Действия -| | < Назад || Далее> | | Закрыть || Справка | Рис. 14.11. Установка свойств задачи В качестве основного реквизита адресации обычно выбирают реквизит адресации, отвечающий за персональную адресацию. В свойство Текущий исполнитель выбирается параметр сеанса, содер- жащий текущего пользователя (обычно значение в данный параметр сеанса записывается при запуске «1С:Предприятия», исходя из данных авторизации). При определении реквизита адресации указывается его тип и произво- дится привязка к измерению выбранного регистра сведений (рис. 14.12). Исходя из этого, при самостоятельном определении задачи (а именно свойств, связанных с адресацией) необходимо придерживаться следую- щего порядка действий: 1. Выбрать ссылку на регистр сведений. 2. Добавить реквизиты адресации. 3. Выбрать основной реквизит адресации. Для описания способа адресации в каждой точке действия карты марш- рута можно использовать свойства группы Адресация (рис. 14.13). Профессиональная разработка в системе «1С:Предприятие 8»
Свойства: Сотрудник X ;i х <-__________________________________________________________ ▼ Основные: Имя [Сотрудник | Синоним [Сотрудник Q| Комментарий || {Тип |СлравочнмкСсылка.Сотрудники ▼ И слольэование: Индексировать |Не индексировать_________________________________▼ | Полнотекстовый поиск [Использовать ▼! ’ Представление: Подсказка ▼Адресация:______________________________________ ИНДиин ] Групповая С Сотрудник [ ... х| РольИсполкигеля[Кладовщш •••х1 Подразделение [ОтделПрсдаж ... х| Рис. 14.12. Свойства реквизита адресации Рис. 14.13. Свойства точки действия карты маршрута бизнес-процесса В этой группе каждому определенному в задаче реквизиту адре- сации соответствует свойство. На этапе конфигурирования в них уже можно устанавливать необходимые значения. Однако следует помнить, что для того, чтобы именно в режиме Конфигуратор (создание, редактиро- вание карты маршрута) можно было выбирать необходимые значения, они должны быть определены как предопределенные. Если в группе свойств Адресация точки действия установлены значения, показанные на рис. 14.13, то при переходе бизнес-процесса к данной точке будет создана одна задача (если иного не определено программно). В соответствующих ее реквизитах адресации будут автоматически запи- саны указанные при конфигурировании значения (РольИсполнителя = Кладовщик и Подразделение = ОтделПродаж). При отметке свойства Групповая в данной точке будет создаваться столько задач, сколько записей в регистре сведений, ответственном за адресацию, будет найдено с установленными значениями реквизитов адресации. Например, если настройка группы свойств Адресация будет выглядеть так, как показано на рис. 14.14, а регистр сведений будет заполнен данными согласно табл. 14.2, то при переходе бизнес-процесса к данной задаче Том 2
|Томки1маршру,та будут сформированы две задачи с соответствующими значениями рекви- зитов адресации (табл. 14.3). ▼Адресация: Пояснение Г Согрушшк Г РольИслолнигеля I____________ Паераадележе [ОтделПродаж~ Рис. 14.14. Свойства точки маршрута бизнес-процесса Таблица 14.2. Данные регистра сведений Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Петров Бухгалтер Администрация Сидоров Кледовщик Оптовый склед Федоров Руководитель отдела Отдел продаж Таблица 14.3. Значения реквизитов адресации Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Федоров Руководитель отдела Отдел продаж Точка условия Для реализации условного ветвления бизнес-процесса используется точка условного перехода. Точка условия обозначается в карте маршрута следу- ющим образом (рис. 14.15). Рис. 14.15. Точка условия
Гл~ава114ЯБизнесгпр'оцесс£| Важной особенностью этой точки является обработчик проверки условия, наличие которого обязательно и контролируется при проверке карты маршрута перед сохранением бизнес-процесса (листинг 14.3). Листинг 14.3. Синтаксис обработчика «ПроверкаУсловия» ПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат); | В обработчике в параметре Результат (Истина, Ложь) возвращается результат проверки условия. Если в параметре возвращается Истина, то бизнес-процесс пойдет по той ветви, которая на карте обозначена особым образом (точкой - см. рис. 14.16). По умолчанию эта ветвь назы- вается Да и находится справа. По умолчанию параметр Результат устанавливается равным значению Ложь. Это говорит о том, что если определить данный обработчик пустым (не содержащим внутри код на встроенном языке), то бизнес-про- цесс пойдет по ветви, не отмеченной точкой (по умолчанию - это ветвь Нет точки условия). Приведем пример обработчика события ПроверкаУсловия для карты маршрута со следующей схемой (рис. 14.16). Рис. 14.16. Пример карты маршрута ПОДРОБНЕЕ Приведенный пример (листинг 14.4) можно посмотреть в демонстра- ционной конфигурации «Бизнес-процессы», прилагающейся к книге на компакт-диске, в модуле объекта бизнес-процесса ПродажаТовара.
В точке условия «Скидка по счету выше стандартной?» проверяется тот факт, чтобы в табличной части документа Счет (ссылка на него опреде- лена в реквизите бизнес-процесса Счет) не было скидки, превышающей значение, хранимое в константе (листинг 14.4). Листинг 14.4. Пример обработчика события «ПроверкаУсловия» Процедура УсловиеОграниченияСкидкиПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) // Определяем значение функции по умолчанию. СкидкаБопьшеОбычной = Ложь; ОбычнаяСкидка = Константы.ОбычнаяСкидка.Получить(); // Проверяем, что скидка не превышает обычную. Для Каждого Элемент Из Счет.Состав Цикл Если Элемент.Скидка > ОбычнаяСкидка Тогда СкидкаБопьшеОбычной = Истина; Прервать; КонецЕсли; КонецЦикла; Результат = СкидкаБопьшеОбычной; КонецПроцедуры; Не стоит путать значение по умолчанию, устанавливаемое обработ- чиком события, и функциональность переменной СкидкаБопьшеОбычной. С помощью указанной переменной реализуется следующий алгоритм: «Если найдено превышение, то оставшиеся строки табличной части не перебираются». Точка выбора варианта Для реализации многовариантного выбора можно использовать несколько последовательно соединенных точек условного перехода, однако удобнее для этого применять точку выбора варианта. Точка выбора варианта обозначается в карте маршрута следующим образом (рис. 14.17). Точка выбора варианта Наличная Безналичная Взаимозачет Рис. 14.17. Точка выбора варианта Для определения нужного количества вариантов можно использовать пункты контекстного меню точки выбора Добавить вариант, Удалить вариант. Настройка имени варианта производится в свойствах варианта, в нижней его части (группа свойств Вариант), рис. 14.18. Профессиональная разработка в системе «1С:Предприятие 8»
Свойства: Точка выбора варианта X ▼Основные: Имя [ВыборВарианга!_______________________] Заголовок рочка выбора варианта । Г иперссылка О ► Характеристики: ► Оформление: ► Расположение: ▼Вариант: Наименование [Наличная___________________________| ЦеетФона [I IAbto х| Рис. 14.18. Свойства точки выбора варианта Важной особенностью этой точки является обработчик выбора вари- анта, наличие которого обязательно и контролируется при проверке карты маршрута перед сохранением бизнес-процесса (листинг 14.5). Листинг 14.5. Синтаксис обработчика события «ОбработкаВыбораВарианта» ОбработкаВыбораВарианта(ТочкаВыбораВарианта, Результат); | В переменную Результат должен быть записан один из определенных в точке маршрута вариантов. Для этой цели может использоваться следу- ющий фрагмент кода (листинг 14.6). Листинг 14.6. Пример установки значения параметра «Результат» Результат = ТочкаВыбораВарианта.Варианты. Наличная; | Если в процедуре-обработчике выбора варианта не установить какое-либо значение параметра Результат, то это приведет к ошибке и откату тран- закции, в рамках которой выполнялся выбор варианта. Точка разделения, слияния Для разделения бизнес-процесса на несколько параллельно (одновре- менно и независимо) исполняемых ветвей используется точка разделения. Точка разделения имеет один вход и неограниченное количество выходов (рис. 14.19). - Разделение - Слияние Рис. 14.19. Точка разделения и точка слияния Для синхронизации разделенных ранее ветвей используется точка слияния. Бизнес-процесс не будет выполняться дальше точки слияния, пока все входящие в нее ветви не будут пройдены. Таким образом, точка слияния является этапом бизнес-процесса, на котором должны быть завершены все задачи по разделенным ранее веткам (рис. 14.20). Том 2
|Томки1маршру,та Разделение Слияние Рис. 14.20. Использование точек разделения и слияния В приведенном выше примере, пока не будут выполнены обе задачи - и оплата товара, и подготовка к отгрузке, бизнес-процесс не пойдет дальше точки слияния. В ней бизнес-процесс ожидает закрытия всех сходящихся в ней веток. Разделение может быть и без слияния. В этом случае бизнес-про- цесс будет иметь несколько параллельных ветвей до своего завершения (в нем будет несколько точек завершения). Точка обработки Точка обработки предназначена для выполнения автоматических дейс- твий. Схематическое изображение точки на карте маршрута следующее (рис. 14.21). Точка обработки I Рис. 14.21. Точка обработки Совершаемые в данном случае действия определяются в обработчике события Обработка (листинг 14.7). Листинг 14.7. Синтаксис обработчика события «Обработка» | Обработка(ТочкаМаршрутаБизнесПроцесса); В данном обработчике события могут определяться различные регламен- тные или другие операции, связанные с обработкой данных, выполняемые над объектами базы данных, если их выполнение необходимо для даль- нейшего продвижения бизнес-процесса. Обработка проводится в автоматическом режиме и не приводит (в общем случае) к созданию задач. После завершения обработчика бизнес-процесс переходит к следующей точке маршрута в соответствии с картой.
Гл~ава114ЯБизнесгпр'оцесс£| Точка вложенного бизнес-процесса Точка позволяет запустить вложенные бизнес-процессы. Схематическое представление на карте маршрута имеет следующий вид (рис. 14.22). Вложенный процесс 7 Рис. 14.22. Точка вложенного бизнес-процесса При переходе бизнес-процесса на данную точку маршрута формируется ведущая задача. Для этой ведущей задачи создается и стартует другой бизнес-процесс, который и является вложенным для данного бизнес-про- цесса. После завершения вложенного бизнес-процесса ведущая задача считается выполненной и осуществляется переход к следующей точке по карте маршрута данного бизнес-процесса. В общем случае может создаваться не одна, а несколько ведущих задач, для каждой из которых создается и стартует собственный вложенный бизнес-процесс. Одно из важных свойств данной точки - это свойство БизнесПроцесс. Оно содержит ссылку на вид вложенного бизнес-процесса. ПОДРОБНЕЕ Пример использования данной точки маршрута приводится в разделе «Бизнес-процесс «Обход»», стр. 94. СОСТОЯНИЯ БИЗНЕС-ПРОЦЕССА Бизнес-процесс может находиться в одном из трех состояний: Не стартован — нет ни одной задачи, связанной с данным бизнес- процессом. Такое состояние устанавливается, если создать и записать бизнес-процесс без вызова метода Старт(); Стартовая — существует хотя бы одна задача, связанная с данным бизнес-процессом; Завершен — у бизнес-процесса установлено свойство Завершен. Наличие или отсутствие связанных с данным бизнес-процессом задач никак не влияет на это состояние. Состояние бизнес-процесса отражается с помощью одноименных свойств (Стартован, Завершен). Данные свойства имеют тип значения Булево и могут устанавливаться как интерактивно, так и программно. Следует помнить, что «самостоятельная» запись значений в данные свойства имеет определенные особенности. При записи в свойство Стартован значения Истина старт бизнес-процесса не производится (не создается ни одной задачи). Попытка после этого
выполнить метод Старт() приведет к ошибке (бизнес-процесс уже стар- товая). Прямая установка свойства Стартован может использоваться в бизнес- процессах со свободной маршрутизацией. Это может позволить произвольным образом создавать задачи (с произвольной привязкой их к точкам маршрута карты бизнес-процесса). Если у бизнес-процесса, по которому уже существуют какие-либо задачи, установить данное свойство в значение Ложь, а потом выполнить старт бизнес-процесса, то он распараллелится. С одной стороны бизнес-процесс продолжит продвижение в соответствии с существовавшими до сброса свойства задачами, с другой стороны запустится его повторное прохож- дение с самой начальной точки схемы бизнес-процесса. Рассмотрим пример поведения бизнес-процесса, обладающего следующей схемой (рис. 14.23). Рис. 14.23. Карта маршрута бизнес-процесса Процесс рассматривается с учетом того, что не определено ни одного обработчика событий, который меняет стандартный порядок формиро- вания и завершения задач. Последовательность интерактивных действий и реакция системы на эти действия приведены в табл. 14.4. Таблица 14.4. Последовательность интерактивных действий и реакция системы Интерактивные действия Реакция системы Старт бизнес-процесса Создание задачи Выписка счета Выполнение задачи Выписка счета Создание задачи Оплата товара Установка у бизнес-процесса свойства Стартован в значение Ложь Старт бизнес-процесса (например, по кнопке Старт) Создание задачи Выписка счета Профессиональная разработка в системе «1С:Предприятие 8»
К этому моменту в бизнес-процессе существуют две невыполненные задачи: оплата товара (от первого старта), выписка счета (от второго старта). Дальнейшая последовательность действий представлена в табл. 14.5. Таблица 14.5. Последовательность интерактивных действий и реакция системы Интерактивные действия Реакция системы Выполнение задачи Оплата товаре Не приводит к созданию задачи, система будет ожидать, когда параллельный процесс догонит ранее стартовавший Выполнение зедачи Выписке счета Создание задачи Оплвта товара Выполнение зедачи Оплвта товаре Создание задачи Отгрузка товвра Выполнение задачи Отгрузка товара Завершение бизнес-процесса Особый интерес представляет тот факт, что при выполнении задачи Оплата товара (созданной первой) не производится создание следу- ющей по схеме задачи (Отгрузка товара). Можно сказать, что фактически бизнес-процесс выполнялся по следующей схеме (рис. 14.24). Ожидание схождения Второй старт 1 Кладовщик Отгрузить товар I Рис. 14.24. Фактическая схема выполнения бизнес-процесса Даже если бы после рестарта бизнес-процесса стали бы исполняться задачи второй ветки, то, дойдя до точки слияния бизнеса-процесса для создания задачи Отгрузка товара, он ожидал бы выполнения задачи Оплата товара первой ветви. Свойство Завершен устанавливается системой автоматически в значение Истина при переходе бизнес-процесса на точку завершения при условии Том 2
остбя н ия[б из нес}п ро цесса1 отсутствия невыполненных задач. Это свойство можно установить и само- стоятельно. Если у завершенного бизнес-процесса в свойство Завершен записать значение Ложь и создать невыполненную задачу (либо отме- нить статус выполненной у ранее существовавшей), то бизнес-процесс продолжит свою работу в соответствии с его схемой. Если у незавершенного бизнес-процесса в это свойство записать значение Истина, то бизнес-процесс будет считаться завершенным и выполнение какой-либо его задачи не приведет к созданию новой в соответствии со схемой бизнес-процесса. При необходимости полностью завершить бизнес-процесс рекоменду- ется, помимо записи значения Истина в свойство Завершен, получать все невыполненные задачи данного бизнес-процесса и устанавливать для них статус выполненных. Визуально (например, в форме списка) бизнес-процессы в разных состоя- ниях имеют разные значки (иконки), рис. 14.25. Продажа товара (у)Создать । & [х] । Н । С^Найгн.. i Вседейстеия-» । (3) I Стартоевн Завершен । Ведущая задача 4 Дата =. Номер I *4» 0508.2011 0:54:04 000000001 < 0508.20111510:27 000000002 05.06.20111511:51 BBfflESSI Рис. 14.25. Пиктограммы бизнес-процессов Нестартованный бизнес-процесс имеет серую иконку, в стартованном она красная, в завершенном - зеленая. СТАРТ БИЗНЕС-ПРОЦЕССА Жизненный цикл бизнес-процесса начинается с его старта. В карте бизнес- процесса место старта отражается с помощью точки старта (рис. 14.26). . Рис. 14.26. Точка старта бизнес-процесса У данной точки маршрута можно определить обработчик события ПередСтартом. У данной процедуры два параметра. Первый параметр - это точка маршрута, с которой произошел вызов обработчика (у бизнес-про- цесса может быть несколько точек старта), второй параметр - Отказ. При записи в переменную Отказ значения Истина будет произведен отказ от старта бизнес-процесса.
Гл~ава114ЯБизнесгпр'оцесс£| В обработчике события ПередСтартом можно проверять условия, необходимые для старта бизнес-процесса, создавать «сопутствующие» объекты, ссылки на которые нужно хранить в самом бизнес-процессе. Пример обработчика данного события для бизнес-процесса Продажа товара (считаем, что в бизнес-процессе должны храниться ссылки на документы Счет и Расходная накладная) приведен в листинге 14.8. Листинг 14.8. Пример обработчика события «ПередСтартом» Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) // Признак, определяющий, изменялся ли бизнес-процесс в данном обработчике. НужноЗаписать = Ложь; // Если реквизит бизнес-процесса "Счет" содержит пустую ссылку, // создадим документ и запишем ссыпку на него. Если Счет.Пустая() Тогда СчетОбьект = Документы.Счет.СоздатьДокумент(); СчетОбъект.Дата = ТекущаяДата(); СчетОбъект.Записать(); Счет = СчетОбьект.Ссыпка; // Бизнес-процесс изменен (реквизит "Счет"). НужноЗаписать = Истина; КонецЕсли; // Еспи реквизит бизнес-процесса "РасходнаяНакладная" // содержит пустую ссыпку, создадим документ и запишем ссылку на него. Если РасходнаяНакладная.Пустая() Тогда РасходнаяНакладнаяОбъекг = Документы. РасходнаяНакладная. СоздвтьДокумент(); РасходнаяНакладнаяОбъект.Дата = ТекущаяДата(); РасходнаяНакладнаяОбъект.Записать(); РасходнаяНакладная = РасходнаяНакладнаяОбъект.Ссылка; НужноЗаписать = Истина; КонецЕсли; Если НужноЗаписать Тогда Записать(); КонецЕсли; Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = "Старт бизнес-процесса: ” ++ ЭтотОбъект.Метаданные().Синоним + Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); КонецПроцедуры Это событие происходит на сервере, поэтому в нем невозможно открыть различные диалоговые окна. Если перед стартом бизнес-процесса требуется организовать диалог с пользователем, то можно это сделать в обработчике клиентского события ПередСтартом формы бизнес- процесса, которое вызывается перед событием ПередСтартом точки Старт бизнес-процесса.
ПОДРОБНЕЕ Приведенный пример (листинг 14.8) можно посмотреть в демонстра- ционной конфигурации «Бизнес-процессы», прилагающейся к книге на компакт-диске, в модуле объекта бизнес-процесса ПродажаТовара. Сам старт бизнес-процесса может производиться по-разному: программный старт бизнес-процесса (из кода на встроенном языке); интерактивный старт (нажатие кнопки Старт формы бизнес-процесса) и т. п.; старт бизнес-процесса как вложенного. При использовании любого из перечисленных вариантов бизнес-про- цесс может иметь несколько точек старта (но в любом случае необходимо будет уточнять, какая из точек используется). Программный старт бизнес-процесса Для реализации старта бизнес-процесса из встроенного языка может использоваться следующий фрагмент кода (листинг 14.9). Листинг 14.9. Пример программного старта бизнес-процесса БП = БизнесПроцессы.ПродажаТовара.СоздатьБизнесПроцесс(); // Дата должна быть определена явным образом. БПДата = ТекущаяДата(); // Перед стартом бизнес-процесс должен быть обязательно записан. БП.Записать(); БП.Старт(); В этом случае происходят следующие действия (рис. 14.27). Старт бизнес-процесса Рис. 14.27. Действия, выполняемые при программном старте бизнес-процесса Профессиональная разработка в системе «1С:Предприятие 8»
Интерактивный старт бизнес-процесса Пользователь может произвести запуск бизнес-процесса интерактивно. Возможны следующие варианты. Пользователь создает новый бизнес-процесс. В форме нового бизнес-про- цесса нажимается кнопка Стартовать и закрыть. Пользователь может после создания бизнес-процесса только записать его. Далее в форме самого бизнес-процесса, используя кнопку Старт или соответствующую команду меню Все действия, произвести его старт (рис. 14.28). Рис. 14.26. Интерактивный старт бизнес-процесса Интерактивная активация бизнес-процесса Пользователь может активировать бизнес-процесс, используя кнопку Активировать или соответствующую команду меню Все действия в форме бизнес-процесса. Активацию бизнес-процесса можно производить не только для только что стартовавших процессов, но и для любых незавершенных (по которым существуют невыполненные задачи), рис. 14.29. Том 2
д>.та рт!б из нес}п роцесса! Рис. 14.29. Интерактивная активация бизнес-процесса При этом активируется текущая невыполненная задача (помеченная красной пунктирной рамкой) для пользователя, выполнившего активацию бизнес-процесса. Если процесс активирован пользователем, для которого не предназначена текущая задача, то ничего не происходит. Активация текущей задачи приводит к открытию формы этой задачи либо (если это специально оговорено, как показано в листинге 14.10) форм сопутствующих объектов конфигурации. При активации задачи вызывается обработчик события ОбработкаПолуче- нияФормы, размещенный в модуле менеджера задачи. Данный обработчик используется для переопределения открываемой формы. Например, когда пользователь захочет активизировать задачу Получение наличной оплаты, то будет крайне полезно, чтобы открылась не форма задачи, а форма счета (для того, чтобы на его основании ввести расходную накладную) и т.п. (листинг 14.10). Листинг 14.10. Обработчик события «ОбработкаПопученияФормы» Процедура ОбработкаПопученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта” Тогда ЗадачаСсыпка = Параметры.Ключ;
Гл~ава114ЯБизнесгпр'оцесс£| ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ПолучениеОплаты Тогда ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Обработчик события ОбработкаПолученияФормы вызывается при от- крытии любых форм задачи. Поэтому сначала проверяется, что откры- вается форма объекта задачи (параметр ВидФормы = "ФормаОбъекта"). Ссылка на задачу передается в структуре параметров открываемой формы (Параметры.Ключ). В процедуре обработчика переопределяется параметр ВыбраннаяФорма (тем самым указывается форма, которая должна быть открыта вместо формы задачи) и параметр Ключ коллекции параметров открываемой формы (т.е. вместо ссылки на задачу параметр Ключ будет содержать ссылку на счет, являющийся реквизитом бизнес-процесса, породившего задачу). В результате будет открыта форма счета, форма задачи при этом открыта не будет, т. к. параметр СтандартнаяОбработка устанавливается в значение Ложь. Данный обработчик также можно использовать для регистрации задач в других объектах (например, произвести запись открываемой задачи в регистр сведений). Представим себе, что какой-либо пользователь (группа пользователей) решает задачи, которые могут формироваться в контексте большого количества бизнес-процессов. Заставлять таких пользователей посто- янно просматривать все бизнес-процессы (задачи) не стоит. Им можно упростить процесс работы, создав «специализированные рабочие места» - обработки. Механизм работы таких обработок заключается в том, что при активации задач данные о задаче и текущем пользователе записываются в регистр сведений, содержимое которого и отображает соответствующее «рабочее место пользователя». Пример подобного обработчика события приводится в листинге 14.11.
Листинг 14.11. Обработчик события «ОбработкаПопученияФормы» Процедура ОбработкаПопученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбьекта" Тогда ЗадачаСсыпка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсыпка.ПолучитьОбъект(); // Регистр сведений "Просмотр задач" используется для регистрации //данных по текущим (невыполненным) задачам. НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Задача.Значение = ЗадачаСсыпка; НаборЗаписей.Отбор.Задача.Испопьзование = Истина; // В параметре "Текущий исполнитель” находится ссылка на текущего // пользователя; этот параметр сеанса выбран в свойство // "Текущий Исполнитель" соответствующей задачи. НаборЗаписей.Отбор.Сотрудник.Значение = ПараметрыСеанса.ТекущийИсполнитель; НаборЗаписей.Отбор.Сотрудник.Использование = Истина; НаборЗаписей.Прочитать(); Если НаборЗаписей.Количество() = 0 Тогда // В набор записей добавляем новую запись, //характеризующую активизированную задачу. НоваяЗапись = НаборЗаписейДобавить(); НоваяЗапись.Задача = ЗадачаСсыпка; НоваяЗапись.Сотрудник = ПараметрыСеанса.ТекущийИсполнитель; Попытка Набор3аписей.3аписать(); Исключение Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = ОписаниеОшибки(); Сообщен ие.Сообщить(); КонецПопытки; КонецЕсли; КонецЕсли; КонецПроцедуры ПОДРОБНЕЕ Приведенные примеры (листинги 14.10. 14.11) можно посмотреть в демонстрационной конфигурации «Бизнес-процессы», прилагаю- щейся к книге на компакт-диске, в модуле менеджера задачи Задача. Старт бизнес-процесса как вложенного При определении карты маршрута можно предусматривать старт вложенных бизнес-процессов. В этом случае основной бизнес-процесс ждет завершения вложенного бизнес-процесса и только после этого пере- ходит к следующей точке маршрута. На карте маршрута такая точка маршрута определяется с помощью следующего элемента (рис. 14.30). Профессиональная разработка в системе «1С:Предприятие 8»
Вложенньй процесс 1 Рис. 14.30. Вложенный бизнес-процесс Одной из важных характеристик (свойств) данной точки маршрута явля- ется ссылка на запускаемый бизнес-процесс (свойство БизнесПроцесс). Кроме этого, есть возможность определить ряд обработчиков событий. Рассмотрим порядок вызова части из них (последовательность действий представлена на рис. 14.31). Начало транзакции Завершение транзакции Рис. 14.31. Вызов событий при старте вложенного бизнес-процесса Сначала у точки вложенного бизнес-процесса происходит вызов обра- ботчика ПередСозданиемВложенныхБизнесПроцессов(), в котором можно добавить свои бизнес-процессы в массив формируемых бизнес-процессов (по умолчанию в обработчик массив приходит пустым). Если были добав- Том 2
д>.та рт!б из нес}п роцесса! лены бизнес-процессы в массив, то стандартная механика генерации бизнес-процессов будет отменена. Затем происходит формирование массива задач, при котором могут использоваться два обработчика событий: Перед созданием задач и При создании задач. Порядок работы с этими обработчиками более подробно рассматривается в разделе «Задачи», стр. 74. При формировании массива задач у точки маршрута сначала вызыва- ется обработчик ПередСозданиемЗадач(). В него передается пустой, еще не сформированный массив задач. Если параметр СтандартнаяОбработка установлен в Ложь, то обработчик может использоваться для создания собственного массива задач. Если стандартная обработка не изменена, то сформированный массив задач будет очищен и заполнен задачами, исходя из поведения системы по умолчанию. В обработчике ПриСозданииЗадач() можно донастроить сформированные задачи и добавить к ним новые, в случае необходимости. Далее происходит запись сформированных задач, после чего по каждой из них создается вложенный бизнес-процесс установленного в точке марш- рута типа. У созданных бизнес-процессов устанавливается дата и ссылка на ведущую задачу. Затем происходит вызов обработчика ПриСозданииВложенныхБиз- несПроцессов(). Обработчик этого события может донастроить вручную (в обработчике ПередСозданиемВложенныхБизнесПроцессов()) или авто- матически сформированные бизнес-процессы (их количество равно количеству задач после обработчика ПриСозданииЗадач()) или удалить некоторые из них, а также добавить к ним новые бизнес-процессы. После завершения обработчика будет осуществлена запись и старт сфор- мированных бизнес-процессов. Обработчик события Перед созданием вложенных бизнес-процессов рекомендуется использовать для определения массива бизнес-процессов по своему усмотрению. Если в этом обработчике событий сформиро- вать массив бизнес-процессов, но при этом параметр Отказ оставить в значении Истина, созданные в обработчике бизнес-процессы будут сброшены, и сработает стандартный механизм формирования бизнес-про- цессов. Если параметр Отказ установить в значение Ложь, но при этом массив сформированных бизнес-процессов не будет содержать ни одного элемента, то ведущая задача будет считаться выполненной, и, если все задачи в данной точке маршрута выполнены, будет произведен переход бизнес-процесса к следующей точке маршрута. Пример соответствующего обработчика события (в нем прину- дительно создается один вложенный бизнес-процесс) приведен в листинге 14.12.
Гл~ава114ЯБизнесгпр'оцесс^1 Листинг 14.12. Пример обработчика события «ПередСозданиемВложенныхБизнесПроцессов» Процедура ОбходПередСозданиемВпоженныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) БП = БизнесПроцессы.Поручение.СоздатьБизнесПроцесс(); БП.Дата = ТекущаяДата(); БП.Автор = ПараметрыСеанса.ТекущийИспопнитепь; БП.Записать(); ФормируемыеБизнесПроцессыДобавить(БП); Отказ = Ложь; КонецПроцедуры После того как массив вложенных бизнес-процессов сформирован (в обработчике события Перед созданием вложенных бизнес-процессов или штатным образом), вызывается обработчик события При создании вложенных бизнес-процессов. Его рекомендуется использовать для коррек- тировки (добавления, частичного удаления) массива сформированных вложенных бизнес-процессов. Если данный массив в результате таких изменений не будет содержать ни одного элемента (и иное не предусмот- рено в обработчике события При создании вложенных бизнес-процессов), то соответствующая ведущая задача будет считаться выполненной. Предположим, что в исходном бизнес-процессе определена табличная часть Участники. В точке вложенного бизнес-процесса необходимо уточ- нить ряд характеристик (свойств) созданных вложенных процессов. Для этого используется обработчик события При создании вложенных бизнес-процессов (листинг 14.13). Листинг 14.13. Пример обработчика события «ПриСозданииВложенныхБизнесПроцессов» Процедура ОбходПриСозданииВпоженныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) // Обходим табличную часть. Для Каждого Элемент Из Участники Цикл // Обходим массив бизнес-процессов. Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл // Настраиваем вложенный бизнес-процесс. Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель; Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда Процесс.Тема = Процесс.ВедущаяЗадача.Наименование; Иначе Процесс.Тема = Элемент.НаименованиеЗадачи; КонецЕсли; Процесс.Испопнитепь = Эпемент.Сотрудник; Процесс.ИспопнитепьРоль = Элемент.РольИсполнителя; Процесс.ИспопнитепьОтдеп = Элемент.Подраздепение; Процесс.3аписать(); КонецЦикла; КонецЦикла; КонецПроцедуры У2
Старт бизнес-процесса с несколькими точками старта Наличие нескольких точек старта предполагает, что выбор конкретной точки для старта определяется внешними по отношению к бизнес-про- цессу условиями. Если же бизнес-процесс обладает всей необходимой информацией, чтобы при старте самостоятельно принять решение о выборе того или иного маршрута, то достаточно одной точки старта, следом за которой будет идти точка проверки условия или точка выбора варианта. Если бизнес-процесс имеет несколько точек старта, то при вызове метода Старт() необходимо указать конкретную точку, в противном случае будет выдано сообщение об ошибке. Поэтому при создании бизнес-процесса с несколькими точками старта необходимо: переопределить команду Старт в форме списка и в форме объекта бизнес-процесса, переопределить кнопку Старт в форме объекта бизнес-процесса. Смысл всех модификаций, которые необходимо произвести, заключается в том, что при выполнении метода Старт() в него в качестве параметра необходимо передать точку старта бизнес-процесса. Примером бизнес-процесса с несколькими точками старта может быть торговля товаром, для которого возможна предварительная демонстрация (на дому, рабочем месте потенциального клиента). Заявка либо на покупку, либо на демонстрацию поступает к оператору (сотруднику компании). После опроса клиента он выясняет, какой из вариантов предпочтителен потенциальному покупателю. Если выбирается предварительная демонс- трация, то после ее окончания менеджер по продажам уточняет желание клиента приобрести товар. Если клиент согласен, выполняется ветка бизнес-процесса, связанная с продажей товара. Карта такого бизнес-про- цесса может выглядеть следующим образом (рис. 14.32). Если данный бизнес-процесс является вложенным для других бизнес- процессов, то в соответствующих точках маршрута нужно прописать обработчик При создании вложенных бизнес-процессов так, чтобы запи- сывать и стартовать с нужной точки все бизнес-процессы из массива сформированных (листинг 14.14). В остальном использование бизнес-процессов с несколькими точками старта ничем не отличается от обычных бизнес-процессов. Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 14.32. Пример бизнес-процесса продажи товара с предварительной демонстрацией Листинг 14.14. Пример обработчика события «ПриСозданииВложенныхБизнесПроцессов» Процедура ОбходПриСозданииВпоженныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) // Обходим табличную часть. Для Каждого Элемент Из Участники Цикл // Обходим массив бизнес-процессов. Дпя Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл // Настраиваем вложенный бизнес-процесс. Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель; Если ПустаяСтрока(Элемент.НаименованиеЗадачи) Тогда Процесс.Тема = Процесс.ВедущаяЗадача.Наименование; Иначе Процесс.Тема = Элемент.НаименованиеЗадачи; КонецЕсли; Процесс.Испопнитепь = Эпемент.Сотрудник; Процесс.ИсполнительРопь = Элемент.РольИсполнителя; Процесс.ИсполнительОтдеп = Элемент.Подраздепение; Процесс.3аписать(); // Явное указание точки старта. Процесс.Старт(БизнесПроцессы.ДемонстрацияИПродажа.ТочкиМаршрута. СтартДемонстрации); КонецЦикла; КонецЦикла; КонецПроцедуры Том 2
Е3авёршениё1бйзнёс}процесса1 ЗАВЕРШЕНИЕ БИЗНЕС-ПРОЦЕССА Завершение является последним этапом в жизненном цикле бизнес-про- цесса. Бизнес-процесс автоматически становится завершенным (свойству Завершен устанавливается значение Истина) при достижении точки завер- шения и при отсутствии невыполненных задач по этому бизнес-процессу. У бизнес-процесса может быть несколько точек завершения. В карте бизнес-процесса они отмечаются с помощью элемента «точка завер- шения» (рис. 14.33). | Рис. 14.33. Точка завершения бизнес-процесса При переходе на точку завершения вызывается обработчик При завер- шении. Если установить Отказ (параметр процедуры-обработчика) равным Истине, например если не выполнены все необходимые условия завершения бизнес-процесса, то обработка прерывается. Задача по точке маршрута, выполнение которой привело к переходу на точку завершения, при этом остается невыполненной. Рассмотрим следующую ситуацию. Существует бизнес-процесс, который отслеживает процесс согласования и выдачи денежных средств под отчет. При завершении бизнес-процесса (переход к этой точке осуществля- ется после ввода очередного авансового отчета) необходимо проверить, что подотчетник полностью отчитался за полученные им средства. Такую проверку можно разместить в обработчике события При завер- шении точки завершения бизнес-процесса (листинг 14.15). Листинг 14.15. Пример обработчика события «ПриЗавершении» Процедура ПодотчетникПриЗавершении(ТочкаМаршрутаБизнесПроцесса, Отказ) // РКО - реквизит бизнес-процесса, содержащий ссылку // на документ "Расходный кассовый ордер" // Исполнитель - реквизит бизнес-процесса, содержащий ссылку // на подотчетника. Если Не обДолгПодотчетника(РКО,Исполнитель) = 0 Тогда Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = "Есть долг! Бизнес-процесс:" + ЭтотОбъекг.Метаданные().Синоним + ” не завершен"; Сообщение.Сообщить(); Отказ = Истина; КонецЕсли; КонецПроцедуры Если у бизнес-процесса установлено свойство ВедущаяЗадача, т. е. он является вложенным, то при своем завершении он помечает эту задачу как выполненную. Это, в свою очередь, приводит к продвижению основ- ного бизнес-процесса дальше по маршруту. У®
Гл~ава114ЯБизнесгпр'оцесс£| Установка свойству Завершен значения Истина (средствами встроен- ного языка или интерактивно) может использоваться для прерывания хода бизнес-процесса или для исключения его из списка активных (неза- вершенных) бизнес-процессов. При этом никакие обработчики, кроме ПередЗаписыо и ПриЗаписи, не вызываются. Выполнение ведущей задачи при этом не производится. ЗАДАЧИ При продвижении бизнес-процесса по карте маршрута в определенных его точках, а именно при переходе на точку действия или вложенный бизнес-процесс, могут создаваться задачи. Упрощенно их можно назвать пользовательскими заданиями, которые должны быть кем-то выполнены. Каждая задача (конкретный элемент) существует в контексте какого-либо экземпляра (элемента) бизнес-процесса и какой-либо его точки маршрута (в задаче содержатся ссылки на перечисленные объекты). Создать задачу, не связав ее с каким-либо бизнес-процессом и точкой этого бизнес-про- цесса, нельзя. Связь бизнес-процесса (как объекта конфигурации) с соответству- ющей задачей устанавливается при конфигурировании бизнес-процесса (в свойствах бизнес-процесса указывается объект конфигурации Задача), рис. 14.34. •w Биенес-лродесс Продажа! овара П X Рис. 14.34. Свойства бизнес-процесса Можно сказать, что у задачи существуют следующие предопределенные свойства: ПометкаУдаления; Дата (тип Дата, состав даты Дата и время);
Номер (числовой или строковый); Наименование (тип Строка); Выполнена (тип Булево); БизнесПроцесс (ссылка на любой бизнес-процесс); ТочкаМаршрута (ссылка на точку маршрута бизнес-процесса). Кроме этого, в объекте конфигурации Задача могут определяться некие общие моменты (свойства), касающиеся «пользовательского задания», которые в общем случае не зависят от бизнес-процесса и его теку- щего состояния (один объект конфигурации Задача может быть связан с несколькими объектами конфигурации БизнесПроцесс). Например, в каждой задаче должны храниться данные о пользователе, выполнившем ее. С этой целью можно определить реквизит задачи Исполнитель. Можно определить ряд других реквизитов: ДатаВыпол- нения, ДатаАвтовыполнения (для реализации стратегии «время вышло, значит, задача выполнена») и т.д. При необходимости хранения списков можно определить любое количество табличных частей с произвольным составом. Формирование задач При прохождении маршрута бизнес-процесс на точках действия или точках вложенных бизнес-процессов может создавать одну или несколько задач. Несколько задач будут сформированы в том случае, если у точки марш- рута установлен признак Групповая либо задачи формируются программно (в соответствующих обработчиках событий). Если в точке маршрута уста- новлен признак Групповая, бизнес-процесс отбирает в регистре сведений, ответственном за адресацию, все записи, соответствующие установ- ленным в данной точке реквизитам адресации, и для каждой из них формирует свою задачу. Рассмотрим последовательность действий, порядок следования обрабаты- ваемых событий, возникающих при формировании задач (рис. 14.35). Обработчик события Перед созданием задач может использоваться для создания собственного набора задач. Причем можно создавать как одну задачу, так и несколько, вне зависимости от установленного в свойс- твах точки маршрута признака Групповая. Если при создании собственного массива задач в параметр процедуры Стандартная обработка не записать значение Ложь, то созданный массив очистится и заполнится задачами, исходя из поведения системы по умолчанию (так, как если бы этот обра- ботчик определен не был). Пример обработчика события ПередСозданиемЗадач приведен в листинге 14.16. Профессиональная разработка в системе «1С:Предприятие 8»
Начало транэакцщ Завершение транзакции Рис. 14.35. Последовательность вызова событий при формировании задач Листинг 14.16. Пример обработчика события «ПередСозданиемЗадач» Процедура ОтгрузкаПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачу(); Задача. Дата = Текущая Дата(); Задача. БизнесПроцесс = Ссылка; Задача.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.Отгрузка; Задача.Наименование = "Формирование расходной накладной"; ФормируемыеЗадачи.Добавить(Задача); СтандартнаяОбработка = Ложь; КонецПроцедуры При формировании задач стандартным образом для них автоматически определяются следующие свойства: наименование устанавливается равным наименованию соответству- ющей точки маршрута, например Выписка счета; ссылка на экземпляр бизнес-процесса, породившего эту задачу; ссылка на точку маршрута бизнес-процесса; Том 2
[___________________________________________________________________ЙЕЕЕШ реквизиты адресации задачи устанавливаются равными реквизитам адресации соответствующей точки маршрута. При возникновении необходимости определения других свойств задачи либо для корректировки состава массива задач может использоваться обработчик события При создании задач (листинг 14.17). Листинг 14.17. Пример обработчика события «ПриСозданииЗадач» Процедура ОтгрузкаПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) Склад = Справочники.Подразделения.НайтиПоНаименованию(РасходнаяНакладная.Склад); Если Не Склад.Пустая() Тогда Для Каждого Задача Из ФормируемыеЗадачи Цикл Задача.Подраздепение = Склад; КонецЦикла; КонецЕсли; КонецПроцедуры Следует отметить, что допускается создание новых задач и в обработчике события При создании задач. В этом случае обработчик события Перед созданием задач может содержать одну строку (листинг 14.18). Листинг 14.18. Пример обработчика события «ПередСозданиемЗадач» Процедура ОтгрузкаПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КонецПроцедуры Выполнение задач Выполнение задач может производиться как интерактивно (с по- мощью основных интерфейсных возможностей «1С:Предприятия»), так и программно. Под интерактивным выполнением задач будем понимать выполнение задачи, вызванной либо нажатием кнопки Выполнено или Выполнено, закрыть в форме задачи, либо выполнением соответствующей команды меню Все действия в форме задачи (рис. 14.36). Программное выполнение задач возможно с помощью метода Выпол- нитьЗадачуО, который существует у объекта ЗадачаОбъект.<Имя>. Необходимо обратить внимание на тот факт, что у задачи есть свойство Выполнена (тип Булево). В данное свойство можно установить значение Истина как программно, так и в форме задачи (если данное свойство представлено в диалоге формы задачи с помощью соответствующего элемента управления). Но данное действие не приведет к вызову специ- фических обработчиков событий (Перед выполнением и При выполнении) и, в случае выполнения всех задач в точке маршрута, к продвижению к следующей точке по карте маршрута бизнес-процесса. 7S
Гл~ава114ЯБизнесгпр'оцесс£| @ Утверзедениесчета000000005от05.08.201... (1С:Предприятие) |й1 '%| 'л| П X Утверждение счета 000000005 от 05.08.2011 15:13:52 (Задача) | Выполнено, закрыть 11ЁЙ1 С® Выполнено j/Q |гВсе действия ^|| (?) Номер: |000000005 | Наименование: Да™ 105.08.201115:13:52 И| Бизнес-процесс: | Продажа товара 000000002 от ( Точка маршрута: | Утвердить счет |?| Выполнено, закрыть |Й1 Записать Ctrl+S Перечитать [jjj Скопировать [х] Пометить на удаление /Снять пометку 'чх) Удалить 5 Выполнено Роль исполнителя^ Руководитель Подразделение: | Отдел продаж Q Активировать Изменить Форму... ф Справка F1 1 Рис. 14.36. Интерактивное выполнение задачи Выборка всех активных (невыполненных) задач и прямая установка в свойство Выполнена значения Истина рекомендуются при необходи- мости принудительного завершения бизнес-процесса. Порядок действий системы, последовательность вызываемых обработ- чиков событий при выполнении задачи представлены на рис. 14.37. Начало транзакции Завершений транзакции Рис. 14.37. Последовательность вызова событий при выполнении задачи Следует отметить, что в рамках пункта «Запись объекта задачи» вызыва- ется еще ряд обработчиков событий, показанных далее (рис. 14.38). Если хоть в одном из обработчиков (связанных с выполнением задачи) параметр Отказ установлен равным значению Истина, то дальнейшая У®
обработка выполнения прекращается, и задача не помечается как выпол- ненная. Рис. 14.38. Обработчики событий, вызываемые в процессе записи объекта задачи Рассматривая различные варианты выполнения задач, следует отме- тить, что выполнение метода ВыполнитьЗадачу() или команды Выполнено в форме задачи приводит к выполнению цепочки, находящейся в рамках транзакции (см. рис. 14.37). Обработчик события Перед выполнением задачи часто используется для заполнения реквизитов задачи, характеризующих ее выполнение (например, производится запись исполнителя и т. п.). Пример реализации обработчика события ПередВыполнением приведен в листинге 14.19. Листинг 14.19. Пример обработчика события «ПередВыполнением» Процедура ПередВыполнением(Отказ) II ДатаВыполнения и Исполнитель - реквизиты задачи. Если ДатаВыполнения = '00010101' Тогда ДатаВыполнения = ТекущаяДата(); КонецЕсли; Если Исполнитель.Пустая() Тогда Исполнитель = ПараметрыСеанса.ТекущийИсполнитель; КонецЕсли; КонецПроцедуры Обработчик события При выполнении задачи может использоваться для регистрации факта выполнения задачи в других объектах конфи- гурации. Например, таким объектом может быть регистр сведений, используемый при создании планировщиков - автоматизированных рабочих мест пользователей. Пример реализации обработчика события ПриВыполнении приведен в листинге 14.20. Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 14.20. Пример обработчика события «ПриВыпопнении» Процедуре ПриВыполнении(Отказ) Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = "Задача выполнена:" ++ Наименование + Сообщение.Сообщить(); // Просмотр задач - регистр сведений, предназначенный // для отражения невыполненных задач // разных бизнес-процессов. НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей(); НаборЗаписай.Отбор.Задача.Значение = Ссылка; НаборЗаписай.Отбор.Задача.Использование = Истина; Попытка // Попытка записать пустой набор записей. НаборЗаписей.Записать(Истина); Исключение Сообщение.Текст - ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; КонецПроцедуры В этом обработчике данные о выполненной задаче удаляются из регистра сведений путем записи пустого набора записей с отбором по задаче. Проверка выполнения Выполнение задач осуществляется не только пользователями, но и автома- тизированными процедурами. Мало того, в бизнес-процессе может быть предусмотрен этап, который выполняется не строго в цепочке бизнес- процесса (может быть выполнен раньше). В этом случае при переходе на какую-либо точку маршрута необходимо произвести соответству- ющую проверку: если действие выполнено, то выполнить и задачу, если нет, то инициировать выполнение действия и т. п. Например, если задача предусматривает проведение документа, то автоматическая процедура слежения за такими задачами может определять, что нужный документ уже проведен, и помечать задачу как выполненную путем вызова у нее метода ВыполнитьЗадачу(). Для организации такого рода автоматизированных процедур предназначен метод ПроверитьВыполнение() у задачи и соответствующие ему обработ- чики у задачи и точки маршрута (листинг 14.21). Листинг 14.21. Пример использования метода «ПроверитьВыполнение()» Если Задача.ПроверитьВыполнение() Тогда Задача.ВыполнитьЗадачуО; КонецЕсли; При вызове метода ПроверитьВыполнение() выполняется следующая последовательность действий (рис. 14.39). Том 2
Ззееип Рис. 14.39. Последовательность действий при вызове метода «ПроверитьВыполнениеО» Параметр Результат обработчика события и у задачи, и у точки маршрута по умолчанию имеет значение Ложь. Если в обработчике события задачи записать в параметр Результат значение Ложь или если этот обработчик оставить пустым, то обработка метода прекращается (вызов обработчика точки маршрута не производится), и он возвращает значение Ложь. Если обработчик ОбработкаПроверкиВыполнения(Результат) в модуле задачи отсутствует или возвращает Истину, то исполнение переходит в одноименный обработчик точки маршрута. В случае автоматического выполнения задачи и проверки ее выполнения этот обработчик должен обязательно присутствовать в модуле бизнес-процесса и хотя бы формально возвращать Истину, иначе задача выполнена не будет (листинг 14.22). Листинг 14.22. Обработчик «ОбработкаПроверкиВыполненияО» точки маршрута Процедура ОттрузкаОбработкаПроверкиВыполнения(ТочкаМаршрутаБизнесПроцесса, Задача, Результат) Результат = Истина; КонецПроцедуры Форма списка задач Для работы со списком задач пользователи могут использовать форму списка задач. Как и любая форма списка, она построена с помощью дина- мического списка. Поскольку динамический список использует систему компоновки данных, то разработчик может настроить группировку, отбор, порядок и условное оформление списка. Например, можно задать отбор в списке задач, в результате действия которого в списке отображаются только невыполненные задачи. тги
Гл~ава114ЯБизнесгпр'оцесс£| Для этого в конфигураторе, в форме списка задач, нужно открыть палитру свойств основного реквизита формы типа ДинамическийСписок и нажать гиперссылку Открыть (рис. 14.40). Свойства: Реквизит X S1 х -______________________________ Основные:___________________________ | Заголовок [ Q| I г Тип [ДинамическийСписок▼ Основной реквизит @ »’ Использование: Просмотр Открыть Редактирование Открыть_________________________________ Функциональные опции [ „,| v Объект: ПроизвольньйЭапрос Q ДинамическоеСчигыеаниеДанньк @ Дтастройка списка Открыть^______________________ ОсновнаяТабдца | |Щ Задача-Задача ... х| _____________________________ Динамический список Настройки |_ ТГ Отбор | Д Порядок -.3 Группировка & Условное оформление Доступные поля * X и- О i Подробно = Бизнес-процесс = Версия данък » UBGSEBBEI в Дета = Дета выполнения = Наименование а Номер •* а Подразделение " Пометка удаления * = Роль исполнителя = Сотрудник •f = Ссылка = Точка маршрута Левое значение Вид сравнения Правое значение Отбор @ »ШЯЖЯШЗ Равно Ложь | ОК || Отмена | Рис. 14.40. Настройка отбора в динамическом списке На приведенном рисунке создается отбор динамического списка по условию Выполнена = Ложь. Таким образом, при открытии списка задач будут показаны только те задачи, у которых свойство Выполнена имеет значение Ложь. Пользователь также может произвести аналогичную настройку списка в режиме 1С:Предприятие, выполнив команду Все действия к Настроить список... Например, пользователь может удалить отбор и задать условное оформление списка, чтобы невыполненные задачи выделялись особым цветом. Часто при конфигурировании формы списка задач требуется установить отбор, чтобы при открытии списка задач текущий исполнитель видел только свои задачи. Для этого в свойствах динамического списка уста- навливается соответствующее свойство ОсновнаяТаблица в значение Задача.Задача.ЗадачиПоИсполнителю (рис. 14.41).
Свойства: Реквизит X ▼Основные: Имя | Список ] Заголовок I QI I г Т ип |ДинамическмйСписок ▼ ...| Основной реквизит 0 ▼ Использование: Просмотр Открыть Редактирование Открыть Функциональные опции | ,,,| ▼Объект: ПроиэвольныйЗапрос О ДинамическоеСчитываниеДанных Настройка списка Открыть Рис. 14.41. Свойства основного реквизита формы типа «ДинамическийСписок» Можно также установить это свойство программно, например, при создании формы списка или при выполнении соответствующей команды (листинг 14.23). Листинг 14.23. Программная установка свойства «ОсновнаяТаблица» | Список.ОсновнаяТаблица = "Задача.Задача.ЗадачиПоИсполнителю"; При отображении задач по исполнителю активно используются настройки объекта конфигурации Задача, размещенные на закладке Адресация. Предположим, что существует список задач (несколько экземпляров, а не несколько объектов конфигурации) с разными значениями рекви- зитов адресации. При открытии формы списка (рассматривается поведение по умолчанию) из параметра сеанса, указанного в свойстве задачи Текущий исполнитель, выбирается его значение. Из регистра сведений выбираются записи, у которых в измерении, выбранном в качестве основного реквизита адресации, находится значение, взятое из параметра сеанса, либо пустая ссылка. Далее все задачи проверяются на непротиворечивость значений остальных реквизитов адресации и измерений регистра сведений. Данный алгоритм можно представить в виде следующей схемы (рис. 14.42). Процесс определения основного реквизита адресации из остальных реквизитов адресации называется разыменованием. Для примера рассмотрим следующую ситуацию. Структура регистра сведений, отвечающего за адресацию, представлена в табл. 14.6. Профессиональная разработка в системе «1С:Предприятие 8»
Задача отображается в списке задач пользователя Рис. 14.42. Алгоритм отображения задач по исполнителю Таблица 14.6. Структура регистра сведений Измерение Тип измерения Сотрудник СправочникСсылка.Сотрудники РольИсполнителя СправочникСсылка.РолиИспопнитепей Подразделение СправочникСсылка.Подраздепения Заполнение регистра данными показано в табл. 14.7. Таблица 14.7. Данные, содержащиеся в регистре сведений Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Петров Бухгалтер Сидоров Кладовщик Оптовый склад Федоров Отдел продаж Федоров Руководитель отдела Отдел продаж Степанов Кладовщик Оптовый склад Объект конфигурации Задача имеет имя Задача, и для него заданы следу- ющие свойства (табл. 14.8). Том 2
Таблица 14.8. Свойства объекта «Задача» Реквизиты адресации Тип реквизита Сотрудник СправочникСсылка.Сотрудники РопьИсполнителя СправочникСсылка.РолиИспопнителей Подразделение СправочникСсылка.Подраздепения Есть следующий список задач (приводятся только значения их реквизитов адресации), табл. 14.9. Таблица 14.9. Список задач № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение 1 Отдел продаж 2 Руководитель отдела Отдел продаж 3 Бухгалтер 4 Федоров Руководитель отдела Отдел продаж 5 Иванов Если в параметре сеанса будет ссылка на пользователя Петров, то, несмотря на тот факт, что нет ни одной задачи, в которой нужное значение было бы в основном реквизите адресации задач, список задач для данного испол- нителя будет содержать одну строку (табл. 14.10). Таблица 14.10. Список зедач для пользователя «Петров» № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение 3 Бухгалтер Фактически среди задач отбираются те, у которых в реквизите адресации Роль исполнителя установлено значение Бухгалтер, а в остальных рекви- зитах адресации находятся пустые ссылки. Если в параметре сеанса будет записана ссылка на элемент справочника, представляющего пользователя Федоров, то перечень задач будет следу- ющим (табл. 14.11). Таблица 14.11. Список задач для пользователя «Федоров» № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделение 1 Отдел продаж 2 Руководитель отдела Отдел продаж 4 Федоров Руководитель отдела Отдел продаж В данном случае в список задач попадают те из них, которые в основном реквизите адресации содержат ссылку на сотрудника Федоров. Если в рекви- зите адресации находится пустая ссылка, то тогда в подразделении указывается Отдел продаж и в роли исполнителя либо пустая ссылка, либо У®
Гл~ава114ЯБйзнесгпр'оцесс^1 значение Руководитель отдела (в регистре адресации на данного сотруд- ника существуют две записи). Для сотрудника Иванов список задач будет следующим (табл. 14.12). Таблица 14.12. Список задач для сотрудника «Иванов» № Основной реквизит адресации (Сотрудник) Роль исполнителя Подразделеиие 1 Отдел продаж 5 Иванов Обратная связь Для эффективного использования механизма бизнес-процессов возни- кает необходимость автоматически выполнять соответствующие задачи при выполнении требуемых операций с другими объектами информаци- онной базы. Например, при активизации задачи Выплата денежных средств лучше открыть форму нового документа Расходный кассовый ордер (для этой цели используется обработчик менеджера задачи ОбработкаПо- лученияформы). ПОДРОБНЕЕ Об открытии форм сопутствующих объектов конфигурации при акти- вации задачи рассказывается в разделе «Интерактивная активация бизнес-процесса», стр. 69. При проведении документа бизнес-процесс должен понять, что задача выполнена, и продолжить движение по карте маршрута. Такой механизм и называется обратной связью. Обратная связь может настраиваться несколькими способами. Какой способ выбрать, зачастую зависит от особенностей прикладной задачи. Но, несмотря на это, можно выделить два основных варианта органи- зации обратной связи: использование обработчиков ожидания, использование механизма оповещения. Строить механизм обратной связи на обработчиках ожидания (возмож- ности процедур вызываться через установленные промежутки времени) лучше всего, когда критерий выполнения не находится в информационной базе «1С:Предприятия». В этом случае можно периодически выполнять запрос и в случае получения нужного признака программно выполнять задачу. Реализовывать обратную связь на механизме оповещения лучше всего в том случае, когда выполнение задачи связано с каким-либо действием над объектом базы данных.
Бывают ситуации, когда критерий выполнения задачи не простой, а составной (требуется создание ряда документов, окончание выполнения каких-либо механизмов). В этом случае предпочтительным вариантом (в общем случае) является распараллеливание участков карты бизнес- процесса и реализация механизма обратной связи с использованием механизма оповещения. Рассмотрим пример реализации механизма обратной связи с использова- нием механизма оповещения. Постановка задачи. В карте маршрута существует точка действия Вьщача наличных денег (с именем ОформлениеВыплаты), при переходе на нее созда- ется задача. При активации этой задачи создается документ Расходный кассовый ордер. Документ заполняется на основании данных бизнес- процесса. Кассир как исполнитель должен только сохранить и провести документ, чтобы данная задача считалась выполненной. Как это организовать? Предположим, что в бизнес-процессе определен реквизит РКО, содер- жащий ссылку на оформляемый документ. В модуле формы документа Расходный кассовый ордер (отслеживаем интерактивные действия пользователя) в обработчике события После записи определяем следующую строку (листинг 14.24). Листинг 14.24. Вызов метода «Оповестить((» &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Оповестить("ЗаписьРасходногоКассовогоОрдера",, Объект.Ссылка); КонецЕсли; КонецПроцедуры В модуле управляемого приложения определяем процедуру, которая будет являться обработчиком при оповещении (листинг 14.25). Листинг 14.25. Процедура «ОбработчикОповещения» Процедура ОбработчикОповещения(ИмяСобытия, Параметр, Источник) Экспорт РаботаСБизнесПроцессами.ВыпопнитьЗадачуПрДокументу(ИмяСобытия, Источник); КонецПроцедуры Из обработчика оповещения вызывается процедура серверного общего модуля РаботаСБизнесПроцессами (с установленными свойствами Сервер и Вызов сервера), которая выполнит все необходимые проверки и выполнит задачу (листинг 14.26). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 14.26. Процедура серверного общего модуля Процедуре ВыполнитьЗадачуПоДокументу(ИмяСобытия, ДокументСсылка) Экспорт Если ИмяСобытия = "ЗаписьРасходногоКассовогоОрдера" Тогда Запрос = Новый Запрос; Запрос.УсгановитьПараметр ("Парам", ДокументСсылка); Запрос.Текст = "ВЫБРАТЬ | Задача.Ссылка |ИЗ | Задача.Задача.ЗадачиПоИспопнитепю КАК Задача | ВНУТРЕННЕЕ СОЕДИНЕНИЕ БизнесПроцесс.ВыдачаДенегПодотчетнику | КАК ВыдачаДенегПодотчетнику | ПО Задача.БизнесПроцесс = ВыдачаДенегПодотчетнику.Ссыпка ГДЕ | Задача.Выпопнена = ЛОЖЬ | И ВыдачаДенегПодотчетнику.РКО = &Парам"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ТекущаяЗадача = Выборка.Ссылка.ПопучитьОбьект(); Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы. ВыдачаДенегПодотчетнику.ТочкиМаршрута. ОформпениеВыппаты Тогда Если ТекущаяЗадача.ПроверитьВыполнение() Тогда ТекущаяЗадача.ВыполнитьЗадачуО; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; // ИмяСобытия = "ЗаписьРасходногоКассовогоОрдера" КонецПроцедуры В первую очередь в данном обработчике проверяется имя обрабатывае- мого события (в общем случае их может быть больше одного). После этого выполняется запрос. В выборку результатов запроса попадают (в общем случае) все невыполненные задачи бизнес-процесса, значение реквизита РКО которого совпадает со значением, переданным в пара- метр запроса (значение берется из параметра обработчика оповещения). Поэтому при работе с полученной выборкой необходимо проверять прина- длежность задачи интересующей нас точке маршрута. При прохождении всех условий методом ПроверитьВыполнение() прове- ряются условия выполнения найденной задачи. В случае положительного результата выполняется метод задачи ВыполнитьЗадачуО (приводит к отметке задачи как выполненной и продвижению бизнес-процесса к следующей точке по карте бизнес-процесса). Следует заметить, что если обработчики события ОбработкаПроверкиВыполнения и у точки марш- рута, и у самой задачи отсутствуют, то метод ПроверитьВыполнение() вернет Ложь. Поэтому должен существовать хотя бы один обработчик события ОбработкаПроверкиВыполнения, в котором, хотя бы формально, параметр Результат устанавливается в значение Истина. Том 2
Пример^1|реализации1бизнес}процёссов; То, что процедура ОбработчикОповещения() будет являться обработчиком оповещения, определяется выполнением следующей строки кода, разме- щенной в обработчике события При начале работы системы в модуле управляемого приложения (листинг 14.27). Листинг 14.27. Подключение обработчика оповещения | ПодключитьОбработчикОповещения("ОбработчикОповещения"); ПРИМЕРЫ РЕАЛИЗАЦИИ БИЗНЕС-ПРОЦЕССОВ В данном разделе разберем реализацию ряда бизнес-процессов. Следует воспринимать их как примеры (не претендующие на истину в последней инстанции), иллюстрирующие механизмы бизнес-процессов. ПОДРОБНЕЕ Познакомиться с различными примерами реализации бизнес-процессов можно в демонстрационной конфигурации «Бизнес-процессы», прила- гающейся к книге на компакт-диске. Единый объект «Задача» Во всех рассматриваемых бизнес-процессах будет использоваться один объект конфигурации Задача и, соответственно, один регистр сведений РегистрАдресации, отвечающий за адресацию. Этот регистр сведений будет иметь следующий состав измерений (табл. 14.13). Таблица 14.13. Измерения регистра сведений Измерение Тип измерения Сотрудник СправочникСсылка.Сотрудники РопьИсполнителя СправочникСсылка.РолиИспопнителей Подразделение СправочникСсылка. Подразделения Регистр имеет следующее наполнение (табл. 14.14). Таблица 14.14. Данные регистра сведений Сотрудник Роль исполнителя Подразделение Иванов Отдел продаж Петров Бухгалтер Сидоров Кладовщик Оптовый склад Федоров Отдел продаж Федоров Руководитель отдела Отдел продаж Степанов Кладовщик Оптовый склад
Гл~ава114ЯБизнесгпр'оцесс£| Объект конфигурации Задача имеет имя Задача и следующие реквизиты (табл. 14.15). Таблица 14.15. Реквизиты объекта конфигурации «Задача» Реквизиты адресации Тип реквизита Сотрудник СправочникСсылка.Сотрудники РольИсполнителя Сп ра воч н и кСсы л ка. Ро л и Исп о л н ителей Подразделение СправочникСсылка.Подразделения КонтрольныйСрок Дата (состав Дата и Время) ДатаВыполнения Дата (состав Дата и Время) Исполнитель СправочникСсылка.Сотрудники Приоритет Число ДатаАвтоВыполнения Дата (состав Дата и Время) В качестве основного реквизита адресации выбран реквизит адресации Сотрудник. В свойство Текущий исполнитель выбран параметр сеанса ТекущийИсполни- тель (тип СправочникСсылка.Сотрудники). Данный параметр сеанса инициализируется в обработчике события ПриУс- тановкеПараметровСеанса модуля сеанса (листинг 14.28). Листинг 14.26. Заполнение параметра сеанса «ТекущийИсполнитепь» Процедура УстановкаПараметровСеанса() ПараметрыСеанса.ТекущийИспопнитепь = Справочники.Сотрудники.НайтиПоНаименованию(ИмяПользователя()); КонецПроцедуры Считается, что имя пользователя, указываемое при входе в систему, совпа- дает с наименованием элемента справочника Сотрудники. Для заполнения ряда реквизитов задачи в модуле объекта Задача определен следующий обработчик события ПередВыполнением (листинг 14.29). Листинг 14.29. Обработчик события «ПередВыполнением» Процедура ПередВыполнением(Отказ) // Проверка даты на пустое значение. Если ДатаВыполнения = '000101ОГ Тогда ДатаВыполнения = ТекущаяДата(); КонецЕсли; // Если исполнитель до начала выполнения не определен, // он записывается из параметра саанса. // В этом случае записывается пользователь, в контексте которого запущено // "1С:Предприятие". Если Испопнитель.Пустая() Тогда Исполнитель = ПараметрыСеанса.ТекущийИспопнитепь; КонецЕсли; КонецПроцедуры
Данный обработчик события определяет, что при выполнении задачи (программном или интерактивном) в ней сохраняется время выполнения и исполнитель. Для удобства работы пользователей со списком задач существует форма списка с именем ФормаСпискаПоИсполнителю. В свойствах основного реквизита формы, содержащего динамический список задач, свойство ОсновнаяТаблица установлено в значение Задача.Задача.ЗадачиПоИспол- нителю (рис. 14.43). Свойства: Реквизит X ▼Основные: Имя | Список | Заголовок! Ц| I г Tki [ДннамическийСгзкок Основной реквизит @ ▼ Использование: Просмотр Открыть Репактироваже Открыть Фунщиональные опции [ „,| ▼ Объект: ПроизвольныйЗапрос О ДинамическоеСчитыеаниеДаннык Настройка списка Открыть Рис. 14.43. Свойства основного реквизита формы типа «ДинамическийСписок» Выбор этой виртуальной таблицы позволяет без каких-либо допол- нительных действий показать только те задачи, которые адресованы пользователю, авторизовавшемуся в данном сеансе «1С:Предприятия». Для удобства отображения списка задач в режиме 1 С:Предприятие в палитре свойств динамического списка можно настроить некоторые его свойства. В окне настройки списка (гиперссылка Открыть), на закладке Настройки к Порядок задана настройка сортировки динамического списка по убыванию поля Дата (рис. 14.44). Динамический список П X Настройки |_ | ОК 11 Отмена | Рис. 14.44. Настройка сортировки динамического списка Профессиональная разработка в системе «1С:Предприятие 8»
Свойства таблицы формы, отображающей данные динамического списка, установлены следующим образом - АвтоОбновление = Истина и ПериодАвтоОбновления = 5 (рис. 14.45). Свейстаа; Таблица г! > Yl ~ v X РежимВыаелек» Множествен^ ▼ , а РежимВьиелетмяСтрскм Ячейка Шапка 0 Подвал □ Вывод Авто АвтоВводНовойСтроки □ АвтоВводНеэаполнеяного Авто АвтоОтметкаНеэаполнеяного Авто ПоискЛ р£вада Авто СочетаниеКлавии х. РаэреимтоНачалоПеретасывания @ Разрешит ьПеретаскиваьме Подсказка □ Q, г АвтоОбновление 0 ^ермдАвтоОбновлетмя 53/ В ыборГ руппИЭ леменгов Элементы Восстанавл»еагьТекущ<роСтрок<) □ От обрежет ьКорень 0 РаэрешитьВыборКорня □ ОбновлениеПриИэмененииДаю*» Авто Рис. 14.45. Свойства таблицы формы, отображающей список задач Теперь рассмотрим возможность организации просмотра списка задач для разных пользователей. Вообще говоря, такая возможность должна предоставляться только администратору, но для упрощения примера этот момент опущен. Для демонстрации этой возможности в форме списка существует реквизит Пользователь (тип СправочникСсылка.Сотрудники), связанный через свойство ПутьКДанным с одноименным элементом формы вида Поле ввода. В палитре свойств динамического списка установлено свойство Произ- вольныйЗапрос. В модуле формы определены обработчики событий ПриСозданииНаСер- вере формы (листинг 14.30) и ПриИзменении поля ввода (листинг 14.31). Листинг 14.30. Обработчик события «ПриСозданииНаСервере» формы списка &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Пользователь = ПараметрыСеанса.ТекущийИсполнитель; КонецПроцедуры Листинг 14.31. Обработчик события «ПриИзменении» поля ввода // Процедура-обработчик изменения поля ввода "Пользователь". &НаКлиенте Процедура ПользовательПриИзменении(Элемент) Список.Параметры.УстановитьЗначениеПараметра("Испопнитепь", Пользователь); КонецПроцедуры Том 2
П римерй11реализации[бизн ес -п ро цессо в В первой процедуре (листинг 14.30) реквизит формы Пользователь инициализируется значением из параметра сеанса. Во второй процедуре (листинг 14.31) при изменении значения в поле ввода, связанном с реквизитом формы Пользователь, новое значение устанавливается в качестве параметра запроса методом Устано- витьЗначениеПараметра() коллекции параметров динамического списка (Список.Параметры). В коллекции параметров есть параметр Исполнитель, и он передается как параметр запроса в виртуальную таблицу Задача.Задача.ЗадачиПоИсполнителю, служащую источником данных для динамического списка. Это приводит к тому, что в списке отображаются задачи только по выбранному исполнителю (рис. 14.46). Задачи для бизнес-процессов (у) Создать । & [эс] । («) । QHaflru.. i Q Все действия» । ф Пользователь: | Федоров ...Q| Номер Цр 000000027 Наименование । Выписка счета Передача ие согласование Дата 24.10,2011 20:4645 1608.2011 21:5611 “ Вьполнена ч* Бизнес-процесс Продажа товара! Согласование 00! л 7 ! » Рис. 14.46. Список задач по выбранному пользователю Запустив «1С:Предприятие», мы можем убедиться, что задачи в списке задач отобраны по указанному в форме списка исполнителю и отсор- тированы по убыванию колонки Дата. Также можно создать отбор по невыполненным задачам (Выполнена = Ложь), как показано в разделе «Форма списка задач» на стр. 77, можно просматривать значения реквизитов адресации, реквизитов задачи. В ряде случаев этого может быть недостаточно. Например, необходимо отслеживать, была ли хоть раз выполнена активация задачи (была ли хоть раз предпринята попытка открыть форму задачи или форму сопутству- ющих объектов конфигурации). Для решения этой задачи можно использовать регистр сведений ПросмотрЗадач (табл. 14.16). Таблица 14.16. Структура регистра «ПросмотрЗадач» Измерение Тип измерения Задача ЗадачаСсылка.Задача Сотрудник СправочникСсылка. Сотрудники Ресурсов и реквизитов у данного регистра сведений нет. Сама идея механизма довольно проста: при активации задачи в регистр сведений будут записываться данные о задаче и ее текущем исполни- теле. При выполнении задачи данные о ней будут удаляться из регистра сведений.
Гл~ава114ЯБизнесгпр'оцесс£| Это можно реализовать с помощью обработчиков событий ОбработкаПо- лученияформы модуля менеджера задачи (листинг 14.32) и ПриВыполнении (листинг 14.33) модуля объекта Задача. Листинг 14.32. Обработчик события «ОбработкаПопученияФормы» Процедура ОбработкаПопученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДопопнитепьнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; // Регистр сведений "Просмотр задач" используется для регистрации //данных по текущим (не выполненным) задачам. НаборЗаписей = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписай(); НаборЗаписей.Отбор.Задача.Значение = ЗадачаСсылка; НаборЗаписей.Отбор.Задача.Использование = Истина; // В параметре "Текущий исполнитель" находится ссыпка на текущего // пользователя; этот параметр сеанса выбран в свойство // "Текущий Исполнитель" соответствующей задачи. НаборЗаписей.Отбор.Сотрудник.Значение = ПараметрыСеанса.ТекущийИсполнитель; НаборЗаписей.Отбор.Сотрудник.Испопьзование = Истина; НаборЗаписей.Прочитать(); Если НаборЗаписей.Копичество() = 0 Тогда // В набор записей добавляем новую запись, // характеризующую активизированную задачу. НоваяЗапись = НаборЗаписай.Добавить(); НоваяЗапись.Задача = ЗадачаСсылка; НоваяЗапись.Сотрудник = ПараметрыСеанса.ТекущийИспопнитепь; Попытка Набор3аписей.3аписать(); Исключение Сообщение = Новый СообщениеПользователю(); Сообщение. Текст = ОписаниеОшибки(); Сообщение. Сообщи ть(); КонецПопытки; КонецЕсли; КонецЕсли; КонецПроцедуры Обработчик события ОбработкаПопученияФормы вызывается при акти- вации задачи, а также при открытии любых форм задачи. Поэтому сначала проверяется, что открывается форма объекта задачи (параметр ВидФормы = "ФормаОбъекта"). Ссылка на задачу передается в структуре параметров открываемой формы (Параметры.Ключ). Затем данные о задаче и ее текущем исполнителе заносятся в регистр сведений ПросмотрЗадач. В обработчике ПриВыполнении данные о выполненной задаче удаляются из регистра сведений путем записи пустого набора записей с отбором по задаче (листинг 14.33).
Листинг 14.33. Обработчик события «ПриВыпопнении» Процедура ПриВыпопнении(Отказ) Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = "Задача выполнена: ” +"""" + Наименование + Сообщение.Сообщить(); НаборЗаписай = РегистрыСведений.ПросмотрЗадач.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Задача.Значение = Ссыпка; НаборЗаписей.Отбор.Задача.Использование = Истина; Попытка // Пытаемся записать пустой набор записей в регистр, // фактически удаляем из него данные о задаче, если они там были. НаборЗаписай.Записать(Истина); Исключение Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; КонецПроцедуры Одно дело - записать (и вовремя удалить) данные в регистр сведений, другое дело - это организовать для пользователя удобный механизм просмотра этих данных. Например, как сделать так, чтобы ни разу не активированные пользователем задачи выделялись бы жирным шрифтом? Для решения этой задачи вернемся к форме списка. Сначала в произвольный запрос для динамического списка добавляется таблица регистра сведений ПросмотрЗадач. В палитре свойств динамического списка, нажав гиперссылку Открыть, можно увидеть и отредактировать текст запроса, который выполняется при формировании динамического списка (рис. 14.47). В запросе виртуальная таблица Задача.Задача.ЗадачиПоИсполнителю левым соединением связывается с таблицей регистра сведений ПросмотрЗадач, отобранной по текущему пользователю (поле Сотрудник = Пользователь). То есть в результате выполнения запроса в список задач попадут все задачи по исполнителю, но у задач, не найденных в регистре сведений, в поле Задача будет значение Null. В обработчик события ПриСозданииНаСервере добавляется строка для передачи параметра Сотрудник в запрос (листинг 14.34). Листинг 14.34. Обработчик события «ПриСозданииНаСервере» формы списка &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Пользователь = ПараметрыСеанса.ТекущийИсполнитель; Список.Параметры.УстановитьЗначениеПараметра("Сотрудник", Пользователь); КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Динамический список □ X П Запрос | :У Настройки___________________________________________________________________ Janpoc: Е; Конструлор запроса.. ВЫБРАТЬ ЗалачаЗалачаЭалачиПоИсполнителю.Ссылка, ЗалачаЗалачаЗалачиПоИсполнителю.ПометкаУдаления, ЗалачаЗалачаЗалачиПоИсполнителю.номер, ЗалачаЗалачаЗалачиПоИсполнителю.Дата, ЗалачаЗалачаЗалачиПоИсполнителю.БизпесПропесс, ЗалачаЗалачаЗещачиПоИсполнителю.ТочхаНаршрута, ЗалачаЗалачаЗещачиПоИсполнителю.Наименование, ЗалачаЗалачаЗешачиПоИсполнителю.Выполнена, ЗалачаЗалачаЭадвчиПоИсполнителю.КонтрольныйСрок, ЗалачаЭалачаЭалачиЛоИслолкителп.ДатаВыполнения, ЗадачаЭадачаЗадачиПоИслолнителю.Исполнитель, ЗалачаЗапачаЗадачиЛ©Исполнител».ДатаАвтоВыполнения, ЗалачаЭалачаЗадачиЛоИсполкителп.Приоритет, ЗалачаЭалачаЗадачиЛоИсполкителп.РольИсполкителя, ЗалачаЭалачаЗадачиЛоИсполкителп.Подразделение, ЗалачаЭалачаЗадачиЛоИсполкителп.Сотрудник, ЗадачаЗапачаЗапачиПоИсполнителп.Представление, ПросмотрЗалач.Задача ИЗ Задача.Задача.ЗалачиПоИсполнителю КАК ЗалачаЗалачаЗалачиПоИсполнителю ЛЕВОЕ СОЕДИНЕНИЕ РепистрСведений.ПросмотрЗалач КАК ПросмотрЗалач ПО ЭалачаЭалачаЭалачиПоИсполнител».Ссылка ~ ПросмотрЗалач.Задача И ПросмотрЗалач.Сотрудник • «Сотрудник ; |>1 Основнаятаблаа: ||й) Задача.Задача.ЗааачиПоИсполнигеяо ▼ х| Динамическое считывание данных | ОК | Отмена | Рис. 14.47. Текст запроса для динамического списка В окне настройки списка на закладке Настройки к Условное оформление задается условное оформление динамического списка (рис. 14.48). Рис. 14.48. Настройка условного оформления динамического списка Во втором элементе отбора условного оформления динамического списка выбираются записи, у которых поле Задача (из регистра сведений ПросмотрЗадач) не определено (ВидСравненияКомпоновкиДанных.НеЗа- полнено). Поскольку в списке задач оформляется полностью вся строка, оформля- емые поля в настройках условного оформления не заданы. В результате в режиме 1С:Предприятие список задач будет выглядеть следующим образом (рис. 14.49). Том 2
Пример^1|реализации1бизнес}процёссов; Все действия* Задачи для бизнес-процессов (^Создать i & х] i (♦») 1 С^Найти... i Пользователь: | Петров Номер Наименование Дата “ Выполнена Бизнес-q Получен» оплаты 26.10.201116:19:01 * Пропажа ® 000000032 Получение оплаты 24.10.2011 22:... Продаж! Рис. 14.49. Список задач в режиме «1С:Предприятие» Выполнив команду Все действия к Настроить список..., пользователь может просмотреть, изменить, отключить или удалить сделанные разработчиком настройки в соответствии со своими предпочтениями. Бизнес-процесс «Продажа товара» Данный бизнес-процесс позволяет отследить всю последовательность действий: с выписки счета менеджером, получения оплаты бухгалтером и до отгрузки товара кладовщиком. При этом проверяется скидка, установ- ленная менеджером. Если она превышает некий предел, установленный для фирмы, то такой счет предварительно идет на утверждение к руково- дителю отдела. У бизнес-процесса определено два реквизита: Счет (ссылка на документ); РасходнаяНакладная (ссылка на документ). Карта маршрута бизнес-процесса имеет следующий вид (рис. 14.50). Рис. 14.50. Карта маршрута бизнес-процесса
Гл~ава114ЯБизнесгпр'оцесс£| Перед тем как перейти к рассмотрению внутренних механизмов данного бизнес-процесса, следует обратить внимание на тот факт, что для более удобной работы пользователей с задачами данного бизнес-про- цесса необходимо организовывать так называемый механизм обратной связи. При активации задач будут открываться формы других объектов (документов Счет, Расходная накладная), а при их проведении и записи соответствующие им задачи будут выполняться. Для этой цели необходимо внести изменения в сами документы. Например, в обработчик события ПослеЗаписи основной формы документа Счет можно поместить следующую строку кода (листинг 14.35). Листинг 14.35. Вызов метода «Оповестить!)» &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда Оповестить(”ЗаписьСчета",, Объект.Ссыпка); КонецЕсли; КонецПроцедуры В одноименный обработчик формы документа Расходная накладная можно добавить аналогичную строку, но с другим именем события (листинг 14.36). Листинг 14.36. Вызов метода «Оповестить!)» &НаКлиенте Процедура ПослеЗаписи(ПараметрыЗаписи) Если ПараметрыЗаписи.РежимЗаписи = РежимЗаписцДокумента.Проведение Тогда Оповесгить(”ЗаписьРасходнойНакладной",, Объект.Ссыпка); КонецЕсли; КонецПроцедуры В модуле управляемого приложения следует определить процедуру, которая будет являться обработчиком при оповещении (листинг 14.37). Листинг 14.37. Процедура «ОбработчикОповещения» Процедуре ОбработчикОповещения(ИмяСобытия, Параметр, Источник) Экспорт РаботаСБизнесПроцессами.ВыполнитьЗадачуПоДокументу(ИмяСобытия, Источник); КонецПроцедуры Из обработчика оповещения вызывается процедура серверного общего модуля РаботаСБизнесПроцессами (с установленными свойствами Сервер и Вызов сервера), который выполнит все необходимые проверки и выполнит задачу (листинг 14.38).
Листинг 14.38. Процедура серверного общего модуля Процедура ВыпопнитьЗадачуПрДокументу(ИмяСобытия, ДокументСсылка) Экспорт Если ИмяСобытия = "ЗаписьРасходнойНакладной" Тогда Запрос = Новый Запрос; Запрос.УстановитьПараметр("Парам”, ДокументСсылка); Запрос.Текст = "ВЫБРАТЬ Задача.Ссыпка ИЗ БизнесПроцесс.ПродажаТовара КАК ПродажаТовара ЛЕВОЕ СОЕДИНЕНИЕ Задача.Задача.ЗадачиПоИспопнитепю КАК Задача ПО ПродажаТовара.Ссылка = Задача.БизнесПроцесс ГДЕ (Задача.Выполнена = ЛОЖЬ) И ПродажаТовара.РасходнаяНакладная = &Парам"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Спедующий() Цикл ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект(); Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.Отгрузка Тогда Если ТекущаяЗадача.ПроверитьВыпопнение() Тогда ТекущаяЗадача.ВыполнитьЗадачуО; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; // ИмяСобытия = "ЗаписьРасходнойНакладной" Если ИмяСобытия = "ЗаписьСчета" Тогда Запрос = Новый Запрос; Запрос.УстановитьПараметр("Парам”, ДокументСсылка); Запрос.Тексг = "ВЫБРАТЬ Задача.Ссыпка ИЗ БизнесПроцесс.ПродажаТовара КАК ПродажаТовара ЛЕВОЕ СОЕДИНЕНИЕ Задача.Задача.ЗадачиПоИспопнитепю КАК Задача ПО ПродажаТовара.Ссылка = Задача.БизнесПроцесс ГДЕ (Задача.Выполнена = ЛОЖЬ) И ПродажаТовара.Счет = &Парам"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Спедующий() Цикл ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект(); Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ВыпискаСчета ИЛИ ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.ПолучениеОплаты ИЛИ ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы.ПродажаТовара.ТочкиМаршрута.УтверждениеСчета Тогда Если ТекущаяЗадача.ПроверитьВыпопнение() Тогда ТекущаяЗадача.ВыполнитьЗадачуО; КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; // ИмяСобытия = "ЗаписьСчета" КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Остается в обработчике события При начале работы системы в модуле управляемого приложения назначить вышеописанную процедуру обра- ботчиком оповещения. Сделать это можно с помощью строки следующего вида (листинг 14.39). Листинг 14.39. Подключение обработчика оповещения ПодключитьОбработчикОповещения("ОбработчикОповещения");| В итоге получается, что при записи какого-либо документа он опове- щает об этом систему. В обработчике оповещения производится поиск соответствующей задачи, и, если обработчик события ОбработкаПровер- киВыполнения соответствующей точки маршрута возвращает значение Истина, она выполняется. В дальнейшем (в данном разделе), когда будем говорить о выполнении задачи, при активации которой открывались формы документов (а форма самой задачи нет), будет подразумеваться вышеописанный механизм. Вернемся к бизнес-процессу. При запуске (старте) бизнес-процесса выполняется следующее событие (листинг 14.40). Листинг 14.40. Обработчик события «ПередСтартом» Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) НужноЗаписать = Ложь; Если Счет.Пустая() Тогда СчетОбъект = Документы.Счет.СоздатьДокумент(); СчетОбъект.Дата = ТекущаяДата(); СчетОбъект.Записать(); Счет = СчетОбьект.Ссыпка; НужноЗаписать = Истина; КонецЕсли; Если РасходнаяНакладная.Пустая() Тогда РасходнаяНакладнаяОбъекг = Документы. РасходнаяНакладная. СоздатьДокумент(); РасходнаяНакладнаяОбъект.Дата = ТекущаяДата(); РасходнаяНакладнаяОбъект.Записать(); РасходнаяНакладная = РасходнаяНакладнаяОбъект.Ссылка; НужноЗаписать = Истина; КонецЕсли; Если НужноЗаписать Тогда Записать(); КонецЕсли; Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = "Старт бизнес-процесса: ” +""" + ЭтотОбъект.Метаданные().Синоним + Сообщение.Сообщить(); КонецПроцедуры // СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) Том 2
Пример^1|реализации1бизнес}процёссов; В этом обработчике производится проверка на заполненность реквизитов Счет и РасходнаяНакладная. Если реквизиты содержат пустые ссылки, то тогда создаются документы соответствующих видов и ссылки на них записываются в бизнес-процессе. После старта бизнес-процесс переходит к точке действия Выписать счет (имя точки действия ВыпискаСчета). В этой точке установлено значение реквизита адресации Подразделение в значение ОтделПродаж. В результате при переходе к этой точке маршрута создается задача с установленным реквизитом адресации Подразделение. В случае, если соответствующая задача активирована, необходимо открыть форму счета, связанную через бизнес-процесс с соответству- ющей задачей. Для этого в обработчик события ОбработкаПолученияФормы модуля менеджера задачи нужно добавить следующий фрагмент кода (листинг 14.41). Листинг 14.41. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПопученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсыпка = Параметры.Ключ; ЗадачаОбъекг = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. ПродажаТовара.ТочкиМаршрута.ВыпискаСчета Тогда ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры В процедуре обработчика переопределяется параметр ВыбраннаяФорма (тем самым указывается форма, которая должна быть открыта вместо формы задачи) и параметр Ключ коллекции параметров открываемой формы (т.е. вместо ссылки на задачу параметр Ключ будет содержать ссылку на счет, являющийся реквизитом бизнес-процесса, породившего задачу). Результатом будет открытие формы счета, форма задачи при этом открыта не будет (СтандартнаяОбработка = Ложь). При попытке выполнения задачи точки маршрута Выписать счет срабаты- вает следующий обработчик события точки маршрута (листинг 14.42). ©У
Гл~ава114ЯБизнесгпр'оцесс£| Листинг 14.42. Обработчик события «ПередВыполнением» Процедуре ВыпискаСчетаПередВыпопнением(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) Если Счет.Состав.Количество() = 0 Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры В процедуре проверяется количество строк табличной части документа Счет. Если количество строк табличной части равно нулю, задача не будет выполнена и бизнес-процесс не пойдет дальше по карте маршрута. При выполнении задачи точки маршрута Выписать счет бизнес-процесс переходит к точке условия Скидка по счету выше стандартной? (имя точки действия УсловиеОграниченияСкидки). Обработчик проверки условия имеет следующий вид (листинг 14.43). Листинг 14.43. Обработчик события «ПроверкаУсловия» // Процедура обработчик события "ПроверкаУсловия" // точки маршрута "УсловиеОграниченияСкидки". Процедура УсловиеОграниченияСкидкиПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) СкидкаБольшеОбычной = Ложь; ОбычнаяСкидка = Константы.ОбычнаяСкидка.Получить(); // Проверяем, что скидка не превышает обычную. Для Каждого Элемент Из Счет.Состав Цикл Если Эпемент.Скидка > ОбычнаяСкидка Тогда СкидкаБольшеОбычной = Истина; Прервать; КонецЕсли; КонецЦикла; Результат = СкидкаБольшеОбычной; КонецПроцедуры Если скидка хотя бы в одной строке табличной части документа больше величины, определенной в константе, то в параметр процедуры Результат записывается значение Истина и бизнес-процесс идет по ветви Да (на утверждение скидки). В этом случае бизнес-процесс продвигается до точки Утвердить счет (имя точки действия УтверждениеСчета), в которой происходит создание задачи с установленным реквизитом адресации РольИсполнителя в значение РуководительОтдела, Подразделение в ОтделПродаж (соот- ветствующие значения определены в свойствах группы Адресация точки действия). Следует отметить, что в соответствии с такими значениями реквизитов адресации данная задача (в форме списка ФормаСпискаПоИс- полнителю) будет отображаться только для пользователя Федоров. При активации созданной задачи выполняется следующий код обра- ботчика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 14.44). Со) Со)
Листинг 14.44. Обработчик события «ОбработкаПопученияФормы» Процедура ОбработкаПопученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДопопнитепьнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка. ПолучитьОбьект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. ПродажаТовара.ТочкиМаршрута.УтверждениеСчета Тогда ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс.Счет; СтандартнаяОбработка я Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры При его выполнении открывается форма счета, а форма задачи не откры- вается. После выполнения текущей задачи бизнес-процесс переходит к точке условия Счет утвержден? (имя точки действия УсловиеУтверждения). Обра- ботчик проверки условия имеет следующий вид (листинг 14.45). Листинг 14.45. Обработчик события «ПроверкаУсловия» Процедура УсловиеУтвержденияПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) // Проверяем, что скидки согласованы. Результат = Счет.СкидкаСогпасована; КонецПроцедуры Признаком утверждения счета является отметка в документе Счет флажка СкидкаСогласована (запись в соответствующий реквизит значения Истина). Обратите внимание, что на карте маршрута бизнес-процесса у данной точки условия ветви Да и Нет направлены в противоположную сторону. В стандартном варианте по умолчанию ветка Нет находится слева. Поэтому, чтобы бизнес-процесс правильно реагировал на выполнение/ невыполнение условия, в данном случае необходимо поменять местами ветви Да и Нет, перетащив их мышью на карте маршрута. Если в параметр Результат записано значение Ложь, бизнес-процесс пере- ходит к точке завершения Отмена и бизнес-процесс завершается. В другом случае бизнес-процесс переходит к точке карты маршрута Полу- чить наличную оплату (имя точки действия ПолучениеОплаты). К этой же точке маршрута бизнес-процесс перейдет в случае, если скидка в счете не превышает порогового значения. Эта точка является точкой действия, Профессиональная разработка в системе «1С:Предприятие 8»
поэтому при переходе к ней создается задача с установленным рекви- зитом адресации РольИсполнителя в значение Бухгалтер (в соответствии с наполнением регистра сведений, ответственным за адресацию, данная задача будет присутствовать для пользователя Петров). При активации созданной задачи выполняется следующий код обра- ботчика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 14.46). Листинг 14.46. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДопопнитепьнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсыпка = Параметры.Ключ; ЗадачаОбъекг = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. ПродажаТовара.ТочкиМаршрута.ПолучениеОплаты Тогда ВыбраннаяФорма = "Документ.Счет.ФормаОбъекта"; Параметры.Ключ = ЗадачаОбъекг.БизнесПроцесс.Счет; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Откроется форма документа Счет (ссылка на который хранится в бизнес- процессе), форма задачи открыта не будет. После выполнения данной задачи (приема оплаты) бизнес-процесс перейдет к следующей точке карты маршрута Отгрузить товар со склада (имя точки действия Отгрузка). В данной точке свойство (группы свойств Адресация) РольИсполнителя установлено в значение Кладовщик. Для данной точки определено два обработчика событий :ПриСозданииЗадач в модуле объекта бизнес-процесса (листинг 14.47) и ОбработкаПолу- ченияФормы в модуле менеджера задачи (листинг 14.48). Один из них срабатывает при создании задачи. Листинг 14.47. Обработчик события «ПриСозданииЗадач» Процедура ОтгрузкаПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) Склад = Справочники.Подраздепения.НайтиПоНаименованию(РасходнаяНакладная.Склад); Если Не Склад.Пусгая() Тогда Для Каждого Задача Из ФормируемыеЗадачи Цикл Задача.Подразделение = Склад; КонецЦикла; КонецЕсли; КонецПроцедуры Том 2
Пример^1|реализации1бизнес}процёссов; В справочнике Подразделения ищется значение, равное по наименованию складу из документа Расходная накладная. В случае успеха (найденная ссылка не пустая) полученное значение записывается в реквизит адре- сации задачи Подразделение. При активации задачи открывается форма расходной накладной. Для этого в обработчик события ОбработкаПолученияФормы модуля менед- жера задачи нужно добавить следующий фрагмент кода (листинг 14.48). Листинг 14.48. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекга" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсыпка.ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. ПродажаТовара.ТочкиМаршрута.Отгрузка Тогда ВыбраннаяФорма = "Документ.РасходнаяНакладная.ФормаОбъекта"; Параметры.Ключ = ЗадачаОбъекг.БизнесПроцесс.РасходнаяНакладная; СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Кладовщик уточняет перечень отгружаемых товарных позиций и выпол- няет задачу. После выполнения текущей задачи бизнес-процесс переходит к точке Нормальное завершение и завершается. Бизнес-процесс «Продажа товара с предоплатой» Автоматизируемый бизнес-процесс очень похож на ранее рассмотренный (бизнес-процесс Продажа товара, стр. 85). Но есть одна отличительная особенность: во взаиморасчетах между покупателем и продавцом возможны случаи предоплаты. Применительно к ранее рассмотрен- ному бизнес-процессу это означает, что при переходе к точке маршрута Получение наличной оплаты в случае достаточности средств «на балансе покупателя» эта точка маршрута должна быть пройдена автоматически. Карта бизнес-процесса такая же, как и в предыдущем случае. Рассмотрим один из вариантов учета данной специфической особенности. Достаточно следующим образом определить обработчик события Перед созданием задач точки маршрута Получение наличной оплаты (листинг 14.49).
Гл~ава114ЯБизнесгпр'оцесс£| Листинг 14.49. Обработчик события «ПередСозданиемЗадач» Процедуре ПолучениеОплатыПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадач и, СтандартнаяОбработка) // С помощью реализованной в общем модуле функции получаем // сумму возможного аванса. СостояниеВзаиморасчетов = ПопучитьСостояниеВзаиморасчетов(Счет.Контрагент); СуммаПоДокументу = Счет.Состав.Итог("Сумма"); Если СостояниеВзаиморасчетов > СуммаПоДокументу Тогда ЗафиксироватьОплату(Счет); СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры Смысл механизма заключается в том, что при выполнении данного обра- ботчика проверяется наличие предоплаты. Если суммы предоплаты достаточно для оплаты данного счета, параметр СтандартнаяОбработка устанавливается в значение Ложь. Это приводит к тому, что штатный механизм формирования задач не срабатывает. А так как в данном обра- ботчике массив задач не формировался (и обработчик При создании задач для данной точки также не определялся), это приводит к тому, что не создается ни одной задачи и бизнес-процесс автоматически переходит к следующей точке бизнес-процесса. Следует обратить внимание, что попытка реализации данного процесса приведет к изменению текста процедуры - обработчика оповещения. Бизнес-процесс «Поручение» Данный процесс автоматизирует последовательность выдачи поручений (на проведение какого-либо действия). Например, кто-то должен заказать авиабилеты для директора (поездки в командировку), кто-то этот процесс должен проконтролировать и т. п. У бизнес-процесса определены следующие реквизиты (табл. 14.17). Таблица 14.17. Реквизиты бизнес-процесса «Поручение» Реквизит Тип Автор СправочникСсылка.Сотрудники Исполнитель СправочникСсылка. Сотрудники ИспопнительРоль СправочникСсылка.РолиИсполнителей ИсполнительОтдел СправочникСсылка.Подразделения Контролер СправочникСсылка.Сотрудники КонтроперРопь СправочникСсылка.РолиИсполнителей КонтроперОтдел СправочникСсылка. подразделения Приоритет Число Тема Строка
Реквизит Тип ТекстПоручения Строка ОтчетОВыполнении Строка ОтчетО Контроле Строка Пара ллепьныйКонт роль Булево ДатаВыполнения Дата ДатаКонтроля Дата КонтрольныйСрок Дата ОтметкаОВыполнении Булево ОтметкаОСнятииС Контроля Булево Карта бизнес-процесса имеет следующий вид (рис. 14.51). Рис. 14.51. Карта маршрута бизнес-процесса У данного бизнес-процесса определены две точки старта. Попытка запус- тить процесс штатными средствами приведет к ошибке (не определена точка старта). Забегая вперед, скажем, что данный бизнес-процесс будет использоваться как вложенный (в этом случае и будет использоваться точка старта СтартБезАвтора). Самостоятельный старт будет происходить с точки Старт. Как другую особенность данного бизнес-процесса можно отметить тот факт, что во всех точках действия не определено ни одно из свойств, ответственных за адресацию (эти свойства определяются программно). Старт бизнес-процесса можно реализовывать разными способами. Рассмотрим вариант, когда в модуле общей команды определяется проце- дура (листинг 14.50). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 14.50. Процедура, выполняющая старт бизнес-процесса Процедуре АктивироватьБП() Экспорт БизнесПроцесс = БизнесПроцессы.Поручение.СоздатьБизнесПроцесс(); БизнесПроцесс.Дата = Текущая Дата(); БизнесПроцесс.Записать(); БизнесПроцесс.Старт(БизнесПроцессы.Поручение.ТочкиМаршрута.Старт); КонецПроцедуры В самой процедуре уточняется точка старта, и бизнес-процесс стартует с этой точки. При старте выполняется следующий обработчик точки старта бизнес-про- цесса (листинг 14.51). Листинг 14.51. Обработчик события «ПередСтартом» Процедура СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) Автор = ПараметрыСеанса.ТекущийИсполнитель; КонтрольныйСрок = КонецНедели(ТекущаяДата()); Записать(); Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = "Старт бизнес-процесса: ” + + ЭтотОбъект.Метаданные().Синоним + Сообщение.Сообщить(); КонецПроцедуры В нем в реквизит бизнес-процесса Автор записывается значение из пара- метра сеанса, содержащего текущего пользователя (элемент справочника). Устанавливается контрольный срок исполнения. После старта бизнес-процесс переходит к точке действия Выдать пору- чение. Следует отметить, что в данной точке отключен механизм создания задач по умолчанию. В ней определен обработчик события Перед созда- нием задач (листинг 14.52). Листинг 14.52. Обработчик события «ПередСозданиемЗадач» Процедуре ВыдатьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачу(); Задача.БизнесПроцесс = Ссыпка; Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса; Задача Лата = ТекущаяДата(); Задача.Сотрудник = Автор; Задача.Наименование = ТочкаМаршрутаБизнесПроцесса. НаименованиеЗадачи; Если Не ПустаяСтрока(Тема) Тогда Задача.Наименование = Задача.Наименование +” + Тема; КонецЕсли; ФормируемыеЗадачи.Добавить(Задача); СтандартнаяОбработка = Ложь; КонецПроцедуры Том 2
Пример^1|реализации1бизнес}процёссов; В качестве значения реквизита адресации задачи устанавливается значение из реквизита бизнес-процесса Автор. Стандартный механизм создания задач отключается. При активации данной задачи выполняется следующий код обработ- чика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 14.53). Листинг 14.53. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка. ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.ВыдатьПоручение Тогда ВыбраннаяФорма = "БизнесПроцесс.Поручение.Форма.ФормаПоручения"; Параметры.Ключ = ЗадачаОбъекг.БизнесПроцесс; Параметры.Вставить("Задача", ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры При активации задачи открывается форма бизнес-процесса ФормаПо- ручения — специфическая форма бизнес-процесса, в которой каждый из участников процесса может оставлять какие-либо отметки, замечания. В ней реализовано разграничение прав доступа к различным полям (рекви- зитам бизнес-процесса) в зависимости от роли сотрудника. Например, исполнитель не может исправить текст поручения и т. п. При создании формы на сервере в реквизит формы ТекущаяЗадача в пара- метре формы передается текущая (активируемая) задача (листинг 14.54). Листинг 14.54. Обработчик события формы «ПриСозданииНаСервере» Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ТекущаяЗадача = Параметры.Задача; Если ТекущаяЗадача.Выпопнена Тогда Элементы.ВыпопнитьЗадачу .Доступность = Ложь; КонецЕсли; КонецПроцедуры Поскольку в бизнес-процессах Поручение и Согласование при активации задачи вместо формы задачи открываются специализированные формы бизнес-процессов, для выполнения этой задачи в формах существует команда ВыполнитьЗадачу и соответствующая ей кнопка. Эта кнопка
Гл~ава114ЯБизнесгпр'оцесс£| доступна в случае, если задача не выполнена. При ее нажатии задача выполняется (листинг 14.55). Листинг 14.55. Выполнение текущей задачи Процедура ВыполнитьТекущуюЗадачу() // Если ТекущаяЗадача.ПроверитьВыпопнение() Тогда ТекущаяЗадача.ПолучитьОбьекг().ВыполнитьЗадачу(); // КонецЕсли; КонецПроцедуры При необходимости перед выполнением задачи можно проверить условия ее выполнения методом ПроверитьВыполнение(). В дальнейшем этот механизм выполнения задач будет использоваться в других задачах бизнес-процессов Поручение и Согласование. Перед выполнением задачи Выдача поручений, созданной в точке Выдать поручение, необходимо проверить: не пустой ли текст поручения, определен ли его исполнитель. Данные проверки выполняются в обра- ботчике события Перед выполнением. Текст обработчика приведен ниже (листинг 14.56). Листинг 14.56. Обработчик события «ПередВыполнением» Процедуре ВыдатьПоручениеПередВыпопнением(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) Отказ = Ложь; // Проверяется заполнение хотя бы одного реквизита, // который будет использоваться в качестве значений // рекаизита адресации задачи. Если Исполнитель.Пустая() И ИсполнительРоль.Пустая() И ИсполнительОтдел.Пустая() Тогда Отказ = Истина; КонецЕсли; Если ПустаяСтрока(ТекстПоручения) Тогда Отказ = Истина; КонецЕсли; КонецПроцедуры В идеальном случае такую же проверку необходимо было бы реализовать и для сотрудника, осуществляющего контроль исполнения поручения. После выполнения задачи бизнес-процесс переходит к точке проверки условия. В ней производится выбор варианта выполнения бизнес-про- цесса. Выбор осуществляется в соответствии со значением реквизита ©2
бизнес-процесса ПараллельныйКонтроль (установленным интерактивно). Обработчик проверки условия содержит фактически одну строку (листинг 14.57). Листинг 14.57. Обработчик события «ПроверкаУсловия» | Результат = ПараллельныйКонтроль; Предположим (для начала), что был выбран вариант с параллельным контролем (т.е. контролер может установить отметку об успешности/ неуспешное™ результатов исполнения раньше, чем сам исполнитель зарегистрирует факт исполнения). При таком варианте бизнес-процесс распараллеливается и одновременно переходит к точкам действия Выпол- нить поручение и Контроль исполнения. В каждой из них формирование задач производится программно в обработчике событая Перед созданием задач. Текст обработчика для точки действия Выполнить поручение имеет следующий вид (листанг 14.58). Листинг 14.58. Обработчик события «ПередСоэданиемЗадач» Процедура ВыпопнитьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачу(); Задача.БизнесПроцесс = Ссылка; Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса; Задача.Дата = ТекущаяДата(); Задача.Приоритет = Приоритет; Задача.КонтрольныйСрок = КонтрольныйСрок; Если Не Исполнитель.Пустая() Тогда Задача.Сотрудник = Испопнитепь; КонецЕсли; Если Не ИсполнительРоль.Пустая() Тогда Задача.РольИспопнитепя = ИспопнитепьРоль; КонецЕсли; Если Не ИсполнительОтдел.ПустаяО Тогда Задача.Подраздепение = ИспопнитепьОтдеп; КонецЕсли; Задача.Наименование = ТочкаМаршрутаБизнесПроцесса.НаименованиеЗадачи; Если Не ПустаяСтрока(Тема) Тогда Задача.Наименование = Задача.Наименование +" + Тема; КонецЕсли; ФормируемыеЗадачи.Добавить(Задача); СтандартнаяОбработка = Ложь; КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
В качестве значений реквизитов адресации задачи устанавливаются значения из соответствующих реквизитов бизнес-процессов. Обработчик события Перед созданием задач для точки действия Контроль исполнения имеет такой же код, за исключением того, что реквизиты адресации задачи заполняются значениями реквизитов бизнес-процесса, связанных с сотрудником, выполняющим контроль. При активации данной задачи выполняется следующий код обработ- чика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 14.59). Листинг 14.59. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДопопнитепьнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъекг = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.ВыполнитьПоручение Или ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.ВыполнитьПоручение2Или ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.КонтрольИслолненияИли ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.КонтрольИслолнения2 Тогда ВыбраннаяФорма = "БизнесПроцесс.Поручение.Форма.ФормаПоручения"; Параметры.Ключ = ЗадачаОбъекг.БизнесПроцесс; Параметры.Вставить("Задача”,ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Ее выполнение приводит к открытию формы ФормаПоручения, форма задачи при этом не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 91. После того как обе задачи будут выполнены, бизнес-процесс пройдет точку слияния и перейдет к точке проверки условия Снято с контроля? В обработчике проверки условия проверяется значение реквизита Отмет- каОСнятииСКонтроля (устанавливается интерактивно в форме ФормаПору- чения сотрудником, осуществляющим контроль, и означает, что поручение выполнено). Если поручение не выполнено, производится возврат к точке проверки условия Параллельный контроль? В другом случае бизнес-про- цесс завершается (осуществляется переход к точке завершения). Том 2
Пример^1|реализации1бизнес}процёссов; Рассмотрим поведение бизнес-процесса в случае, когда в точке проверки условия Параллельный контроль? выполнение бизнес-процесса пойдет по ветви Нет. В соответствии с картой маршрута бизнес-процесс переходит к точке действия Выполнить поручение (2). Обработчик события Перед созданием задач для точки действия Выпол- нить поручение используется такой же, как и у точки Выполнить поручение при выполнении параллельного контроля (листинг 14.60). Листинг 14.60. Обработчик события «ПередСоэданиемЗадач» Процедура ВыпопнитьПоручениеПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Задача = Задачи.Задача.СоздатьЗадачу(); Задача.БизнесПроцесс = Ссылка; Задача.ТочкаМаршрута = ТочкаМаршрутаБизнесПроцесса; Задача.Дата = ТекущаяДата(); Задача.Приоритет = Приоритет; Задача.КонтрольныйСрок = КонтрольныйСрок; Если Не Исполнитель.Пустая() Тогда Задача.Сотрудник = Испопнитепь; КонецЕсли; Если Не ИсполнительРопь.Пусгая() Тогда Задача.РольИспопнитепя = ИспопнитепьРоль; КонецЕсли; Если Не ИсполнительОтдел.Пустая() Тогда Задача.Подраздепение = ИспопнитепьОтдел; КонецЕсли; Задача.Наименование = ТочкаМаршрутаБизнесПроцесса.НаименованиеЗадачи; Если Не ПустаяСтрока(Тема) Тогда Задача.Наименование = Задача.Наименование + " + Тема; КонецЕсли; ФормируемыеЗадачи.Добавить(Задача); СтандартнаяОбработка = Ложь; КонецПроцедуры В качестве значений реквизитов адресации задачи устанавливаются значения из соответствующих реквизитов бизнес-процессов. При активации вызывается та же процедура, что определена для точки Выполнить поручение при выполнении параллельного контроля (листинг 14.61).
Гл~ава114ЯБизнесгпр'оцесс£| Листинг 14.61. Обработчик события «ОбработкаПолученияФормы» Процедуре ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДопопнитепьнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъекг = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.ВыполнитьПоручение Или ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.ВыполнитьПоручение2Или ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.КонтрольИслолнения Или ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы. Поручение.ТочкиМаршрута.КонтропьИсполнения2 Тогда ВыбраннаяФорма = "БизнесПроцесс.Поручение.Форма.ФормаПоручения"; Параметры.Ключ = ЗадачаОбъекг.БизнесПроцесс; Параметры.Вставить("Задача",ЗадачаСсыпка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Ее выполнение приводит к открытию формы ФормаПоручения, форма задачи при этом не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 91. После выполнения задачи бизнес-процесс переходит к точке проверки условия Нужен контроль? Обработчик проверки условия содержит следу- ющий текст (листинг 14.62). Листинг 14.62. Обработчик события «ПроверкаУсловия» Процедура НуженКонтропьПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Результат = Истина; Если Контропер.Пустая() И КонтролерРоль.ПустаяО И КонтролерОгдеп.ПустаяО Тогда Результат = Ложь; КонецЕсли; КонецПроцедуры В процедуре производится проверка на заполненность какого-либо реквизита, значение которого может использоваться в качестве значения реквизитов адресации задачи. Если все соответствующие реквизиты
содержат пустые ссылки, бизнес-процесс переходит по ветви Нет к своему завершению. Если выполнение пошло по ветви Да, в соответствии с картой бизнес-процесса производится переход к точке действия Контроль испол- нения. Обработчики событий у данной точки описаны таким же образом, как и в точке Контроль исполнения при параллельном варианте проведения контроля. После выполнения задачи, созданной в точке маршрута Контроль испол- нения, бизнес-процесс переходит к точке проверки условия Снято с контроля? В случае успешного выполнения поручения (критерии были описаны ранее) бизнес-процесс завершается. Бизнес-процесс «Обход» Данный бизнес-процесс позволяет выдавать последовательные поручения (выполняемые друг за другом). Первоначально должен выполнить пору- чение сотрудник, значащийся первым в списке, потом второй и т. д. Карта бизнес-процесса имеет следующий вид (рис. 14.52). Рис. 14.52. Карта маршрута бизнес-процесса Следует обратить внимание на тот факт, что в данной карте нет ни одной точки действия, но есть точка вложенного бизнес-процесса. В свойстве БизнесПроцесс данной точки выбрано значение Поручение. У бизнес-процесса определена табличная часть Участники со следующим составом реквизитов табличной части (табл. 14.18). Таблица 14.18. Реквизиты табличной части бизнес-процесса Реквизит табличной части Тип Сотрудник СправочникСсылка.Сотрудники РольИспопнителя СправочникСсылка.РолиИсполнителей Подразделение СправочникСсылка.Подразделения НаименованиеЗвдачи Строка ПризнакОбхода Булево Профессиональная разработка в системе «1С:Предприятие 8»
В точке старта обработчик события Перед стартом не определен, поэтому после старта бизнес-процесс без предварительной обработки переходит к точке вложенного бизнес-процесса. В данной точке определен обра- ботчик события При создании вложенных бизнес-процессов. Текст обработчика приведен в листинге 14.63. Листинг 14.63. Обработчик события «ПриСозданииВложенныхБизнесПроцессов» Процедура ОбходПриСозданииВложенныхБизнесПроцессов(ТочкаМаршрутаБизнесПроцесса, ФормируемыеБизнесПроцессы, Отказ) Для Каждого Элемент Из Участники Цикл Если Не Элемент.ПризнакОбхода Тогда Для Каждого Процесс Из ФормируемыеБизнесПроцессы Цикл // Настраиваем вложенный бизнес-процесс. Процесс.Автор = ПараметрыСеанса.ТекущийИсполнитель; Если ПустаяСтрока(Эпемент.НаименованиеЗадачи) Тогда Процесс.Тема = Процесс.ВедущаяЗадача.Наименование; Иначе Процесс.Тема = Эпемент.НаименованиеЗадачи; КонецЕсли; Процесс.Исполнитель = Элемент.Сотрудник; Процесс.ИсполнительРопь = Эпемент.РольИсполнителя; Процесс.ИсполнительОтдел = Элемент.Подразделение; Процесс.ПараллельныйКонтроль = Ложь; Процесс.3аписать(); Процесс.Старт(БизнесПроцессы.Поручение.ТочкиМаршрута.СтартБезАвтора); Элемент.ПризнакОбхода = Истина; КонецЦикла; Записать!); Возврат; КонецЕсли; КонецЦикла; КонецПроцедуры При переходе к точке вложенного бизнес-процесса системой создается одна задача (иного не было определено программно). На каждую задачу (у нас она одна) создается вложенный бизнес-процесс. У создан- ного бизнес-процесса в свойство ВедущаяЗадача записывается ссылка на задачу, ее породившую. После этого производится вызов обработчика события При создании вложенных бизнес-процессов. Через параметр ФормируемыеБизнесПроцессы передается массив сформированных вложенных бизнес-процессов (в нашем случае один элемент). После этого производится обход табличной части бизнес-процесса. Ищется строка, в которой реквизит табличной части ПризнакОбхода установлен в значение Ложь (обхода данной задачи еще не было). Следует отметить, что могут использоваться и другие данные по адре- сации (не обязательно явно указывать сотрудника). Том 2
Прймерь|Треалйзацйй[бизнес-процессов Для текущей строки табличной части (со значением признака, равным Ложь) настраиваем полученный через параметр бизнес-про- цесс. После этого стартуем его, и при этом выбирается точка старта СтартБезАвтора бизнес-процесса Поручение. Реквизит табличной части ПризнакОбхода устанавливается в значение Истина. Далее производим выход из процедуры-обработчика. Исходя из заполняемых у вложенного бизнес-процесса свойств, можно с уверенностью сказать, что именно при такой настройке бизнес-процесса из всей определенной для вложенного бизнес-процесса карты маршрута будет использоваться следующий фрагмент (рис. 14.53). ___________i________ £ Исполютель Выполнить поручение Нджен контроль? - [ ислояНД,ется Рис. 14.53. Карта маршрута бизнес-процесса После завершения вложенного бизнес-процесса ведущая задача (поро- дившая бизнес-процесс) завершается, и осуществляется переход к точке проверки условия Обошли весь список? (с именем УсловиеОбхода). Обработчик проверки условия имеет следующий вид (листинг 14.64). Листинг 14.64. Обработчик события «ПроверкаУсловия» Процедура УсловиеОбходаПроверкаУсловия(ТочкаМаршрутаБизнесПроцесса, Результат) Для Каждого Элемент Из Участники Цикл Если Не Эпемент.ПризнакОбхода Тогда Результат = Ложь; Возврат; КонецЕспи; КонецЦикла; Результат = Истина; КонецПроцедуры
В обработчике проверяется, есть в табличной части строки, в которых признак обхода установлен в значение Ложь. Если таких строк нет, то производится завершение бизнес-процесса, в противном случае осуществляется переход на точку вложенного бизнес-процесса. Обобщенно вышеописанный алгоритм можно представить в виде следу- ющей схемы (рис. 14.54). Рис. 14.54. Схема выполняемого алгоритма Бизнес-процесс «Согласование» В ходе деятельности предприятия, организации может возникать необ- ходимость согласования каких-либо документов. В рамках задачи существует понятие «рецензент» (кто участвует в процессе рассмотрения). Рассмотрение документа рецензентами может осуществляться парал- лельно, но в каждом конкретном случае согласования их может быть произвольное количество (решает инициатор). В качестве примера реализации такого механизма рассмотрим бизнес-процесс Согласование. У бизнес-процесса определены следующие реквизиты (табл. 14.19).
Таблица 14.19. Реквизиты бизнес-процесса Реквизит Тип ДокументНаСогласование ДокументСсылка Инициатор Спра вочни кСсы л ка .Сотрудни ки КонтрольныйСрок Дата Важное Булево Согласовано Булево ОбрвботатьРецензии Булево ПовторноеСогласование Булево Пояснение Строка Определена табличная часть Рецензии (для указания списка рецензентов и получения рецензий), табл. 14.20. Таблица 14.20. Реквизиты табличной части бизнес-процесса Реквизит табличной части Тип Рецензент СправочникСсылка.Сотрудники РольИсполнителя СправочникСсылка.РолиИсполнителей Подразделение СправочникСсылка.подразделения Рецензия Строка Исполнено Булево Карта маршрута бизнес-процесса имеет следующий вид (рис. 14.55). Рис. 14.55. Карта маршрута бизнес-процесса Бизнес-процесс имеет одну точку старта. В этой точке определен обра- ботчик события Перед стартом (листинг 14.65). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 14.65. Обработчик события «ПередСтартом» Процедуре СтартПередСтартом(ТочкаМаршрутаБизнесПроцесса, Отказ) Инициатор = ПараметрыСеанса.ТекущийИсполнитель; Записать(); Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = "Старт бизнес-процесса:" ++ ЭтотОбъект.Метаданные().Синоним + Сообщение.Сообщить(); КонецПроцедуры В качестве инициатора бизнес-процесса записывается пользователь, в контексте которого был произведен старт бизнес-процесса. После старта в соответствии с картой маршрута бизнес-процесс пере- ходит к точке действия Определить список рецензентов. В данной точке определен обработчик события Перед созданием задач (листинг 14.66). Листинг 14.66. Обработчик события «ПередСозданиемЗадач» Процедура ОпределипьСписокРецензентовПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) Если Рецензии.Копичество() = 0 Тогда НоваяЗадача = Задачи.Задача.СоздатьЗадачу(); НоваяЗадача.БизнесПроцесс = Ссылка; НоваяЗадача.ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута. ОпределитьСписокРецензентов; НоваяЗадачаДата = ТекущаяДата(); НоваяЗадача.Наименование = БизнесПроцессы.Согласование.ТочкиМаршрута. ОпределитьСписокРецензентов. НаименованиеЗадачи; НоваяЗадача.Сотрудник = ПараметрыСеанса.ТекущийИсполнитель; Если Важное Тогда НоваяЗадача.Приоритет = 1; КонецЕсли; ФормируемыеЗадачиДобавить( НоваяЗадача); КонецЕсли; СтандартнаяОбработка = Ложь; КонецПроцедуры В обработчике события проверяется состав табличной части Рецензии. Если количество строк табличной части равно нулю, создается задача, в реквизит адресации Сотрудник которой (персональная адресация) запи- сывается пользователь, в контексте которого стартовал бизнес-процесс. Если к моменту выполнения обработчика Перед созданием задач список рецензентов уже определен (количество строк табличной части не равно нулю), задача не создается и, так как обработчик При создании задач Том 2
Пример^1|реализации1бизнес}процёссов; не был определен, в точке действия не создается ни одной задачи. В резуль- тате она считается пройденной, и бизнес-процесс продолжает движение по карте маршрута. Вернемся к случаю, когда задача была создана. При активации данной задачи выполняется следующий код обработчика события ОбработкаПо- лученияФормы модуля менеджера задачи (листинг 14.67). Листинг 14.67. Обработчик события «ОбработкаПолученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДопопнитепьнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка. ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы.Согласование. ТочкиМаршрута.ОпределитьСписокРецензентов Тогда ВыбраннаяФорма = "БизнесПроцесс.Согласование.Форма.ОсновнаяФорма"; Параметры.Ключ = ЗадачаОбъекг.БизнесПроцесс; Параметры.Вставить("Задача", ЗадачаСсылка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры В результате будет открыта форма бизнес-процесса с именем Основ- наяФорма (в ней можно определить список рецензентов), форма задачи не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 91. При выполнении задачи выполнится следующий обработчик события (листинг 14.68). Листинг 14.68. Обработчик события «ПриВыполнении» Процедура ОпределитьсяисокРецензентовПриВыполнении(ТочкаМаршрутаБизнесПроцесса, Задача, Отказ) ПроверитьСогласование(); КонецПроцедуры В теле процедуры производится вызов процедуры ПроверитьСогласование. Текст процедуры приведен ниже (листинг 14.69). ©У
Гл~ава114ЯБизнесгпр'оцесс£| Листинг 14.69. Процедура «ПроверитьСогласование» Процедуре ПроверитьСогласование() Для Каждого Элемент Из Рецензии Цикл Если Не Элемент.Испопнено Тогда Согласовано = Ложь; Возврат; КонецЕсли; КонецЦикла; Согласовано = Истина; Записать(); КонецПроцедуры Можно сказать, что в данной процедуре устанавливается «общий» статус согласования. Если у какого-либо рецензента определен статус согласования Ложь, то в целом в реквизит бизнес-процесса Согласовано записывается это значение. Следует отметить тот факт, что задачи в данный момент непосредственно до рецензентов еще не дошли (еще не были созданы) и подобная ситуация Согласовано = Ложь характеризует пессимистическую оценку инициа- тором процесса согласования (при заполнении табличной части он может проставлять значения согласования по умолчанию для каждого рецен- зента). После выполнения задачи бизнес-процесс переходит к следующей точке действия Передать на согласование (с именем НаСогласование). Свойство определено таким образом лишь для того, чтобы визуально на карте отметить групповую особенность данной точки маршрута (стандартный механизм создания задач отключается, фактически установка свойства не работает). Определен обработчик события Перед созданием задач (листинг 14.70). Листинг 14.70. Обработчик события «ПередСозданиемЗадач» Процедура НаСогласованиеПередСозданиемЗадач(ТочкаМаршругаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; КонецПроцедуры Установка параметра обработчика СтандартнаяОбработка в значение Ложь отключает стандартный механизм формирования задач. Это приводит к тому, что на входе в обработчик события При создании задач массив ФормируемыеЗадачи не содержит ни одной задачи.
Текст обработчика При создании задач представлен в листинге 14.71. Листинг 14.71. Обработчик события «ПриСоэданииЗадач» Процедура НаСогласованиеПриСозданииЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ) Для Каждого Элемент Из Рецензии Цикл // По умолчанию согласовано. Элемент.Исполнено = Истина; НоваяЗадача=Задачи.Задача.СоздатьЗадачу(); НоваяЗадача.БизнесПроцесс = Ссылка; НоваяЗадача.ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута. Несогласование; НоваяЗадача.Дата = ТекущаяДата(); НоваяЗадача.Наименование = БизнесПроцессы.Согпасование.ТочкиМаршрута. НаСогласование.НаименованиеЗадачи; Если Важное Тогда НоваяЗадача.Приоритет = 1; КонецЕсли; // Даты. НоваяЗадача.КонтрольныйСрок = КонтрольныйСрок; НоваяЗадача.ДатаАвтоВыпопнения = КонтрольныйСрок; // Реквизиты адресации. НоваяЗадача.Сотрудник = Элемент.Рецензент; НоваяЗадача.РопьИсполнителя = Эпемент.РольИспопнитепя; НоваяЗадача.Подразделение = Элемент.Подраздепение; ФормируемыеЗадачиДобавить(НоваяЗадача); Новая3адача.3аписать(); КонецЦикла; Записать(); КонецПроцедуры Количество сформированных задач равно количеству строк табличной части (на каждого рецензента по задаче). Реквизиты адресации созда- ваемых задач совпадают с адресными данными, указываемыми при определении списка рецензентов в табличной части бизнес- процесса. Несмотря на пессимистический взгляд инициатора, статус согласования в каждой задаче проставляется равным Истина, хотя можно и прислу- шаться к автору бизнес-процесса. При активации каждой задачи выполняется следующий код обработ- чика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 14.72). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 14.72. Обработчик события «ОбработкаПолученияФормы» Процедуре ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДопопнитепьнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсыпка = Параметры.Ключ; ЗадачаОбъекг = ЗадачаСсылка.ПолучитьОбъекг(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы.Согласование.ТочкиМаршрута.НаСогласование Тогда ВыбраннаяФорма 3"БизнесПроцесс.Согласование.Форма.ФормаРецензента"; Параметры.Ключ = ЗадачаОбъекг.БизнесПроцесс; Параметры.Вставить("Задача",ЗадачаСсыпка); СтандартнаяОбработка = Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Открывается форма для работы рецензента, обеспечивающая его удобную работу, форма задачи не открывается. Выполнение задачи осуществляется с помощью ссылки на задачу в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 91. При выполнении задачи вызывается обработчик события При выпол- нении задачи. В теле процедуры содержится только одна строка (вызов процедуры, текст и назначение которой уже рассматривались выше), листинг 14.73. Листинг 14.73. Текст обработчика события «ПриВыполнении» ПроверитьСогласование(); | * В Назначение обработчика - определение общего статуса процесса согла- сования. После выполнения задачи бизнес-процесс переходит на точку проверки условия Обработать рецензии? В теле процедуры обработчика проверки условия содержится одна строка (проверка значения реквизита бизнес- процесса, имеющего тип Булево), листинг 14.74. Листинг 14.74. Текст обработчика события «ПроверкаУсловия» Результат = ОбработатьРецензии; | Если обрабатывать рецензии нет необходимости, то бизнес-процесс идет по ветви Нет и завершается (осуществляется переход к точке завершения). В противном случае бизнес-процесс переходит к точке действия Обрабо- тать результаты согласования (с именем ОбработатьРезультаты). При переходе к этой точке выполняется обработчик события Перед созданием задач, в нем производится создание задачи, в основной Том 2
Пример^1|реализации1бизнес}процёссов; реквизит адресации которой записывается инициатор бизнес-процесса (листинг 14.75). Листинг 14.75. Обработчик события «ПередСоэданиемЗадач» Процедура ОбработатьРезультатыПередСозданиемЗадач(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, СтандартнаяОбработка) НоваяЗадача = Задачи.Задача.СоздатьЗадачу(); НоваяЗадача.БизнесПроцесс = Ссыпка; НоваяЗадача.ТочкаМаршрута = БизнесПроцессы.Согпасование. ТочкиМаршрута.ОбработатьРезупьтаты; НоваяЗадача Лата = ТекущаяДата(); НоваяЗадача.Наименование = БизнесПроцессы.Согласование.ТочкиМаршрута. ОбработатьРезультаты.НаименованиеЗадачи; НоваяЗадача.Сотрудник = Инициатор; Если Важное Тогда НоваяЗадача.Приоритет = 1; КонецЕсли; ФормируемыеЗадачи.Добавить(НоваяЗадача); СтандартнаяОбработка = Ложь; КонецПроцедуры Стандартный механизм формирования задач отключается. При активации каждой задачи выполняется следующий код обработ- чика события ОбработкаПолученияФормы модуля менеджера задачи (листинг 14.76). Листинг 14.76. Обработчик события «ОбработкаПопученияФормы» Процедура ОбработкаПолученияФормы(ВидФормы, Параметры, ВыбраннаяФорма, ДополнительнаяИнформация, СтандартнаяОбработка) Если ВидФормы = "ФормаОбъекта" Тогда ЗадачаСсылка = Параметры.Ключ; ЗадачаОбъект = ЗадачаСсылка.ПолучитьОбъект(); Если ЗадачаОбъекг.ТочкаМаршрута = БизнесПроцессы.Согпасование. Т очкиМаршрута.ОбработатьРезультаты Т огда ВыбраннаяФорма = "БизнесПроцесс.Согласование.Форма. ФормаОбработкиРецензий"; Параметры.Ключ = ЗадачаОбъект.БизнесПроцесс; Параметры.Вставить(''Задача",ЗадачаСсылка); СтандартнаяОбработка 3 Ложь; КонецЕсли; КонецЕсли; КонецПроцедуры Выполнение задачи осуществляется с помощью ссылки на задачу в реквизите формы ТекущаяЗадача и команды ВыполнитьЗадачу, как описано на стр. 91.
Гл~ава114ЯБизнесгпр'оцесс£| После выполнения этой задачи бизнес-процесс переходит к точке проверки условия Согласовать повторно? Обработчик проверки условия содержит одну строку (листинг 14.77). Листинг 14.77. Текст обработчика события «ПроверкаУсловия» Результат = ПовторноеСогпасование;| Признак необходимости повторного согласования устанавливается в форме обработки рецензий самим инициатором. В случае установки этого флажка бизнес-процесс возвращается на согласование, в противном случае переходит к точке завершения и завершается. Рассмотрение данного бизнес-процесса можно считать законченным, если не обратить внимание на строку обработчика события При создании задач (при создании задач для рецензентов), листинг 14.78. Листинг 14.76. Текст обработчика события «ПриСоэданииЗадач» НоваяЗадача.ДатаАвтоВыпопнения = КонтрольныйСрок; | Предполагается, что если при наступлении даты автовыполнения рецен- зент не разобрался с задачей, она должна быть выполнена автоматически. Те средства, которые до сих пор были рассмотрены, не позволяют этого сделать. Для выполнения автоматической обработки не исполненных в назначенный срок задач можно предусмотреть следующую процедуру (листинг 14.79). Листинг 14.79. Процедура «АвтоОбработкаЗадач» Процедура АвтоОбработкаЗадач() Запрос = Новый Запрос; Запрос.Тексг = "ВЫБРАТЬ Задача.Ссыпка ИЗ БизнесПроцесс.Согласование КАК Согласование СОЕДИНЕНИЕ Задача.Задача КАК Задача ПО Согласование.Ссыпка = Задача.БизнесПроцесс ГДЕ Задача.Выпопнена = ЛОЖЬ"; Выборка = Запрос.Выпопнить().Выбрать(); Пока Выборка.Спедующий() Цикл ТекущаяЗадача = Выборка.Ссылка.ПолучитьОбъект(); Если ТекущаяЗадача.ТочкаМаршрута = БизнесПроцессы. Согпасование.ТочкиМаршрута.НаСогласование Тогда Если ТекущаяЗадача.ПроверитьВыпопнение() Тогда ТекущаяЗадача.ВыполнитьЗадачу(); КонецЕсли; КонецЕсли; КонецЦикла; КонецПроцедуры Ц©©
Следует отметить, что данный механизм является частным случаем так называемой «эскалации действия» (когда система может принять решение об эскалации - либо передать задачу другому, либо принять решение о ее выполнении). Смысл этой процедуры заключается в том, что выбираются все невыпол- ненные задачи, связанные с бизнес-процессом Согласование, и в точке маршрута НаСогласование вызывается метод, проверяющий их выпол- нение. В случае возвращения значения Истина задача выполняется. Для того чтобы этот механизм работал, остается в точке действия НаСогла- сование определить обработчик события Обработка проверки выполнения (листинг 14.80). Листинг 14.80. Обработчик события «ОбработкаПроверкиВыпопнения» Процедура НаСогласованиеОбработкаПроверкиВыпопнения(ТочкаМаршрутаБизнесПроцесса, Задача, Результат) Результат = Ложь; Если Задача.ДатаАвтоВыпопнения <> '00010101' И Задача.ДатаАвтоВыполнения <= ТекущаяДата() Тогда Результат = Истина; КонецЕсли; КонецПроцедуры В данном обработчике события проверяется: если время указано и вышло, то задача выполнена. Вызов процедуры АвтоОбработкаЗадач можно производить по-разному: определить процедуру в серверном общем модуле и вызывать из обра- ботчика ожидания, размещенного в модуле управляемого приложения, или связать эту процедуру с регламентным заданием, выполняющимся по расписанию, например, раз в час. Минусы: каждый час процедура будет вызываться в рамках каждого запуска «1С:Предприятия»; определить во внешнем модуле и вызывать с необходимой периодич- ностью из внешнего скрипта (в рамках информационной базы это действительно будет раз в час); если в выполнении согласования заинтересован инициатор, поместить вызов процедуры в обработку (форму бизнес-процесса), являющуюся его рабочим местом. Профессиональная разработка в системе «1С:Предприятие 8»
Глава 15. Анализ данных и прогнозирование Механизм анализа данных и прогнозирования позволяет реализовывать в прикладных решениях различные средства для выявления зако- номерностей, которые обычно скрываются за большими объемами информации. Например, проанализировав данные о продажах товаров, можно выявить группы товаров, которые обычно покупаются вместе. В дальнейшем (один из многочисленных вариантов) эта информация может использоваться при раскладке товара в розничном магазине. Товары могут распола- гаться рядом (пришел покупатель за мангалом, увидел рядом жидкость для растопки, угли, мясо, удочки, резиновую лодку... в итоге купил все), могут располагаться в разных углах торгового зала (пришел покупатель за молоком, пока дойдет до хлеба, пройдет через весь магазин и еще чего- нибудь купит). Другим примером использования механизма анализа данных является прогнозирование поведения контрагента, исходя из имеющихся данных о нем. Проведя такой анализ, можно выяснить, как зависит объем их закупок от территориального расположения, размера компании, времени сотрудничества и прочих показателей. На основании этих зависимостей можно спрогнозировать поведение нового контрагента и выбрать соот- ветствующую стратегию для работы с ним. Используя возможность построения прогнозов, можно планировать закупочную кампанию. Рассмотрим пример: в прошлом месяце зоома- газин продал 100 морских свинок. Нужно спланировать закупку товара на следующий месяц. Одним из вариантов (очень часто использу- емых) является ввод поправочного коэффициента на продажи прошлых периодов. Считаем, что поправочный коэффициент (коэффициент повы- шения спроса) равен 1,5. В итоге при планировании закупок описанным методом будем к следующему месяцу планировать закупку 150 морских свинок. Но если проанализировать, что обычно покупают клиенты после покупки таких питомцев, то можно прийти к совершенно другому выводу. Воспользовавшись возможностью проведения анализа данных, постро- ения прогноза по этому анализу, можно прийти к выводу, что закупать на следующий месяц нужно корм, различные наполнители, сено и другие «аксессуары». Следует отметить, что материал данной главы в первую очередь будет посвящен обзору механизмов «1С:Предприятия» и только косвенно будет касаться (на простых примерах) способов использования полученной информации. Том 2
ОБЩИЕ ПОЛОЖЕНИЯ Общую схему работы механизма анализа и прогнозирования данных можно представить следующим образом (рис. 15.1). Рис. 15.1. Схема взаимодействия элементов механизма анализа данных и прогнозирования Механизм позволяет работать как с данными, полученными из информационной базы, так и с данными, полученными из другого источника, предварительно загруженными в таблицу значений или табличный документ. Применяя к исходным данным один из видов анализа, можно полу- чить результат анализа. Результат анализа представляет собой некую модель поведения данных; может быть отображен в итоговом документе или сохранен для дальнейшего использования. Дальнейшее использование результата анализа заключается в том, что на его основе может быть создана модель прогноза, позволяющая прогнози- ровать поведение новых данных в соответствии с имеющейся моделью. WD
____________________1 Например, можно проанализировать, какие товары приобретаются вместе (в одной накладной), и сохранить созданную на основе данного анализа модель прогноза в базе данных. В дальнейшем при создании очередной накладной ранее сохраненную модель прогноза можно извлечь из инфор- мационной базы, подать ей на вход новые данные, содержащиеся в этой накладной, и на выходе получить прогноз - список товаров, которые очередной клиент тоже приобретет (с определенной долей вероятности), если их ему предложить. Основные объекты механизма Схематично взаимосвязь основных объектов механизма анализа данных и прогнозирования можно показать следующим образом (рис. 15.2). Рис. 15.2. Взаимосвязь основных объектов АнализДанных - объект, непосредственно выполняющий анализ данных. Ему устанавливается источник данных, задаются параметры и исходные данные. Результатом работы данного объекта является результат анализа данных, причем для каждого типа анализа существует свой объект для работы с результатом анализа: в РезультатАнализаДанныхОбщаяСтатистика, в РезультатАнализаДанныхПоискАссоциаций, в РезультатАнализаДанныхПоискПоследовательностей, в РезультатАнализаДанныхДеревоРешений, в РезультатАнализаДанныхКластеризация.
Настройка колонок анализа данных - коллекция входных колонок анализа данных. Для каждой колонки указывается тип данных, содержащихся в ней, роль, выполняемая колонкой, дополнительные настройки, зави- сящие от типа производимого анализа. Параметры анализа данных - набор параметров производимого анализа данных. Состав параметров зависит от типа анализа. Например, для кластерного анализа указывается количество кластеров, на которые необходимо разбить исходные объекты, тип измерения расстояния между объектами и т. п. Источник данных - исходные данные для анализа. В качестве источника данных может выступать результат запроса, область ячеек табличного документа, таблица значений. Результат анализа данных - специальный объект, содержащий инфор- мацию о результате анализа. Для каждого вида анализа предусмотрен свой результат. Например, результатом анализа данных Дерево решений будет объект типа РезультатАнализаДанныхДеревоРешений. В даль- нейшем результат может быть выведен в табличный документ при помощи построителя отчета анализа данных, может быть выведен посредством программного доступа к его содержимому, может быть использован для создания модели прогноза. Любой результат анализа данных может быть сохранен для последующего использования. Модель прогноза - специальный объект, позволяющий выполнять прогноз на основании входных данных (выборка для прогноза, настройки колонок выборки и результата, результат анализа). Тип модели прогноза зависит от типа результата анализа данных. Например, модель, созданная для типа анализа Поиск ассоциаций, будет иметь тип МодельПрогнозаПоискАс- социаций. Такая модель сможет выдавать прогнозы типа: т.к. данный покупатель купил заданный набор товаров, то с определенной веро- ятностью он должен купить и другой набор товаров. На вход модели прогноза передается источник данных для прогноза. Результатом является таблица значений, содержащая прогнозируемые значения. Настройка входных колонок - набор специальных объектов, показывающих соответствие между колонками модели прогноза и колонками выборки прогноза. Например, колонке модели прогноза с именем Товар может соответствовать колонка выборки Номенклатура. Настройка колонок результата - позволяет управлять тем, какие колонки будут помещены в результирующую таблицу модели прогноза. Например, для поиска ассоциаций мы можем вывести в результат номенклатуру, которую, скорее всего, приобретет клиент, и вероятность подобной покупки. Колонки результата - таблица значений, состоящая из колонок, указанных в настройках результирующих колонок, и содержащая прогнозируемые данные. Конкретное содержимое определяется типом анализа. Профессиональная разработка в системе «1С:Предприятие 8»
Типы анализа данных В механизме анализа данных и прогнозирования реализовано несколько типов анализа данных: в общая статистика, в поиск ассоциаций, в поиск последовательностей, в кластерный анализ, в дерево решений. Общая статистика Тип анализа Общая статистика представляет собой механизм для сбора общей информации о данных, находящихся в полученном источнике данных. Этот тип анализа предназначен для предварительного исследо- вания анализируемой информации. Анализ показывает ряд характеристик дискретных и непрерывных полей. При выводе отчета в табличный документ заполняются круговые диаграммы для отображения состава полей. Поиск ассоциаций Данный тип анализа осуществляет поиск часто встречаемых вместе групп объектов или значений характеристик, а также производит поиск правил ассоциаций. Поиск ассоциаций может использоваться, например, для определения часто приобретаемых вместе товаров или услуг. Этот тип анализа может работать с иерархическими данными, что позво- ляет, например, находить правила не только для конкретных товаров, но и для их групп. Важной особенностью этого типа анализа является возможность работать как с объектным источником данных, в котором каждая колонка содержит некоторую характеристику объекта, так и с собы- тийным источником, где характеристики объекта располагаются в одной колонке. Поиск последовательностей Тип анализа Поиск последовательностей позволяет выявлять в источнике данных последовательные цепочки событий. Например, это может быть цепочка товаров или услуг, которые часто последовательно приобретают клиенты. Этот тип анализа позволяет осуществлять поиск по иерархии, что дает возможность отслеживать не только последовательности конкретных событий, но и последовательности родительских групп. Том 2
Кластерный анализ Кластерный анализ позволяет разделить исходный набор исследуемых объектов на группы объектов таким образом, чтобы каждый объект был более схож с объектами из своей группы, чем с объектами других групп. Анализируя в дальнейшем полученные группы, называемые кластерами, можно определить, чем характеризуется та или иная группа, принять решение о методах работы с объектами различных групп. Например, при помощи кластерного анализа можно разделить клиентов, с которыми работает компания, на группы, для того, чтобы применять различные стратегии при работе с ними. При помощи параметров кластерного анализа пользователь может настроить алгоритм, по которому будет производиться разбиение, а также может динамически изменять состав характеристик, учитываемых при анализе, настраивать для них весовые коэффициенты. Результат кластеризации может быть выведен в дендрограмму - специ- альный вид диаграммы, предназначенный для графического отображения результатов кластерного анализа. Дерево решений Тип анализа Дерево решений позволяет построить иерархическую струк- туру классифицирующих правил, представленную в виде дерева. Для построения дерева решений необходимо выбрать целевой атрибут, по которому будет строиться классификатор, и ряд входных атрибутов, которые будут использоваться для создания правил. Целевой атрибут может содержать, например, информацию о том, перешел ли клиент к другому поставщику услуг, удачна ли была сделка, качественно ли была выполнена работа и т.д. Входными атрибутами, например, могут выступать возраст сотрудника, стаж его работы, материальное состояние клиента, количество сотрудников в компании и т. п. Результат работы анализа представляется в виде дерева, каждый узел кото- рого содержит некоторое условие. Для принятия решения, к какому классу следует отнести некий новый объект, необходимо, отвечая на вопросы в узлах, пройти цепочку от корня до листа дерева, переходя к дочерним узлам в случае утвердительного ответа и к соседнему узлу - в случае отрицательного. Набор параметров анализа позволяет регулировать точность полученного дерева. Модели прогноза Модели прогноза, создаваемые механизмом, представляют собой специ- альные объекты, которые создаются из результата анализа данных и позволяют в дальнейшем автоматически выполнять прогноз для новых данных.
Гл~аваУ15!УА'нализУданн£|х4и1прогнозир'ование' Например, модель прогноза поиска ассоциаций, построенная при анализе покупок клиентов, может быть использована при работе с осуществля- ющим покупку клиентом, для того чтобы предложить ему товары, которые он с определенной степенью вероятности приобретет вместе с выбран- ными им товарами. ТИП АНАЛИЗА «ОБЩАЯ СТАТИСТИКА» Тип анализа Общая статистика может использоваться для предваритель- ного анализа данных (перед выполнением другого вида анализа) и т. п. В качестве источника данных, которые будут подвергаться анализу, может использоваться результат запроса, таблица значений или область ячеек табличного документа. Данные в источнике (с точки зрения проводимого анализа) могут иметь непрерывный или дискретный вид. К непрерывным относятся такие типы, как Число, Дата. Остальные типы относятся к дискретным. Для колонок разных видов предусмотрено получение различной инфор- мации. Дискретные данные: в Количество значений — количество значений, встреченных в колонке источника данных (Null значением не считается); в Количество уникальных значений (с исключением повторяющихся значений); в Мода - значение, которое в источнике данных встречается наиболее часто. Если в данных несколько значений, встречаемых с одинаковой частотой, в качестве моды берется первое найденное; в Частота - количество вхождений значения в выборку данных; в Относительная частота - определяется как отношение количества вхож- дения значения к общему количеству значений; в Накопленная частота - считается как сумма частоты значения и сумма частот предыдущих значений выборки данных; в Накопленная относительная частота - считается как сумма накоп- ленной частоты значения и сумма относительных частот предыдущих значений. Непрерывные данные: в Количество значений; в Минимум значения; в Максимум значения; в Среднее; в Размах - разность между максимальным и минимальным значениями;
в Стандартное отклонение (среднеквадратичное отклонение); в Медиана - значение, лежащее в середине выборки. Следует отметить, что если анализируется одновременно несколько полей различных видов, их анализ проводится вне зависимости друг от друга (исключается взаимная корреляция). Рассмотрим указанные характеристики на примере. ПОДРОБНЕЕ Познакомиться с приведенным ниже примером анализа данных можно в демонстрационной конфигурации «Анализ данных и прогнозиро- вание», прилагающейся к книге на компакт-диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является оборотный регистр накопления Продажи, в котором отражены дви- жения документа Расходная накладная. Выборка данных (источник анализа) имеет следующее наполнение (табл. 15.1). Таблица 15.1. Состав источника данных Номенклатура Количество Стол кухонный раскладной 1 Табурет круглый 2 Диван «УЮТ» 1 Диван «Джинс» 1 Кресло «Джинс» 2 Стол «Kitchen» 0.9x1.7 1 Диван «Комфорт» 1 Стол «Kitchen» 0.9x1.7 1 Стул «Summer» 4 Диван «УЮТ» 1 Стол кухонный раскладной 1 Табурет прямоугольный 3 Кресло «УЮТ» 2 Кресло «УЮТ» 2 Шкаф «Wardrobe» 1 Стол кухонный раскладной 1 Табурет прямоугольный 2 Стол обеденный 1 Стул «Summer» 2 Табурет круглый 2 В результате анализа данных для поля Количество (вид данных анализа Непрерывные) будут рассчитаны следующие характеристики (табл. 15.2). Профессиональная разработка в системе «1С:Предприятие 8»
Таблица 15.2. Характеристики, рассчитанные для поля «Количество» Характеристика Значение Значений 20 Минимум 1 Максимум 4 Среднее 1,6 Размах 3 Стандартное отклонение 0,8208 Медиана 1 Для поля Номенклатура будут получены следующие характеристики (табл. 15.3). Таблица 15.3. Характеристики, рассчитанные для поля «Номенклатура» Характеристика Значение Количество значений 20 Количество уникальных значений 12 Мода Стол кухонный раскладной Таблица частот для значений номенклатуры будет иметь следующий вид (рис. 15.3). Таблица частот Эн ач state Частота Относительная частета Накопленная частота Накопленная относительная частота Стол кухонный раскладной 3 15,00 3 15,00 Кресло "УЮТ" 2 10,00 5 25,00 Табурет гфямоупмъный 2 10,00 7 35,00 Стол "KBchen" 0.9x1.7 2 10,00 9 45,00 Стул "Summer" 2 10,00 11 55,00 Диван "УЮТ" 2 10,00 13 65,00 Табурет круглый 2 10,00 15 75,00 Стол обедежый 1 5,00 16 80,00 Шкаф 'Wercbnbe* 1 5,00 17 85,00 Диван "Комфорт" 1 5,00 18 90,00 Диван "Джинс" 1 5,00 19 95,00 Кресло "Джинс" 1 5,00 20 100,00 Рис. 15.3. Таблица частот Относительная частота в виде диаграммы представлена на рис. 15.4. Для выполнения данного анализа может использоваться фрагмент кода, аналогичный приведенному (листинги 15.1, 15.2). Листинг 15.1. Пример выполнения анализа «Общая статистика» &НаКлиенте Процедура ОбщаяСтатистика(Команда) Результат = АнализОбщаяСтатистика(); КонецПроцедуры Том 2
Диаграмма частот Номенклшу. Рис. 15.4. Относительная частота □ Стол. | Кресло. □ Табурет.. Д Стоя- □ Стал. П Диван "УЮТ" D Табурет. □ Стоя- ДШкаФ. Д Диван. □ Диван.. Листинг 15.2. Пример выполнения анализа «Общая статистика» &НаСервереБезКонтекста Функция АнапизОбщаяСтатистикаО Анализ = Новый АнализДанных; Анализ.ТипАнализа = Тип(”АнализДанныхОбщаяСтатистика”); Запрос = Новый Запрос; Запрос.Текст =11 |ВЫ БРАТЬ | Продажи.Номенклатура, | Продажи.Количество |ИЗ | РегистрНакопления.Продажи КАК Продажи"; Анализ.ИсточникДанных = Запрос.Выполнить(); РезультатАнализа = Анализ.Выполнить(); Построитель = Новый ПостроительОтчетаАнализаДанных(); Построитель.Макет = Неопределено; Построитель.ТипАнализа = Тип("АнализДанныхОбщаяСтатистика"); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа, ТабДок); Возврат ТабДок; КонецФункции Работа по проведению анализа данных выполняется в серверной внекон- текстной функции, которая возвращает на клиента табличный документ с результатами анализа. Сначала создается сам объект АнализДанных. После этого производится выбор типа проводимого анализа. Далее по тексту определяется запрос. Результат запроса устанавливается как источник данных анализа. Сам анализ выполняется в процессе работы метода Выполнить() объекта АнализДанных. fl©®
Сам анализ не имеет средств по визуализации результата полученного анализа. Для этой цели используется объект ПостроительОтчетаАнали- заДанных. При создании данного объекта повторно указывается тип проводимого анализа. Далее в качестве первого параметра метода Вывести() передается результат полученного анализа, вторым параметром передается ранее созданный объект ТабличныйДокумент. В конце алгоритма табличный документ с результатом анализа возвра- щается на клиента в реквизит обработки Результат, имеющий тип ТабличныйДокумент. В результате будут получены данные, аналогичные рассмотренным выше. ТИП АНАЛИЗА «ПОИСК АССОЦИАЦИЙ» Как уже было сказано ранее, данный тип анализа осуществляет поиск часто встречаемых вместе комбинаций объектов или значений харак- теристик. С его помощью можно определять группы одновременно закупаемых товаров, выявлять наиболее привлекательные источники информации (в процессе «оптимизации» затрат на них) и т. п. Схематично процесс проведения анализа Поиск ассоциаций можно представить следующим образом (рис. 15.5). Информационная база ЮПреоприягия Параметры анализа Минимальный процент случаев Минимальная достоверность Минимальная значимость Отсечение гравия Источник Объекты Элементы Результат анализа Информация о данных Ассоциативные группы Ассоциативные гравила Рис. 15.5. Схема выполнения анализа «Поиск ассоциаций» В качестве источника данных может использоваться результат запроса, таблица значений или область ячеек табличного документа. С точки зрения данного типа анализа колонки источника можно разделить на следующие: в Неиспользуемая - игнорируются анализом; в Объект - данные из этой колонки используются как объекты (или события) проводимого анализа. Исходя из значения данной Ц©®
колонки, значения другой колонки (Элемент) относятся к одной ассо- циируемой группе; в Элемент - данные из этой колонки используются для получения устой- чивых групп значений, построения ассоциативных правил. Кроме настройки типов колонок, на результат проводимого анализа влияют следующие параметры анализа: в МинимальныйПроцентСлучаев - определяется минимальный процент случаев, в которых должна встречаться комбинация элементов. Группы, у которых данное значение меньше указанного, не попадают в результат анализа; в МинимальнаяДостоверность - показывает минимальное значение процента случаев, когда правило соблюдается; в МинимальнаяЗначимость - группы, у которых данное значение меньше указанного, не попадают в результат анализа; в ТипОтсеченияПравил - один из вариантов системного перечисления ТипОтсеченияПравилАссоциации: Избыточные (отсекать избыточные правила), Покрытые (отсекать правила, покрытые другими прави- лами). В результате выполнения анализа получаем: в информацию о данных (количество объектов, количество элементов, среднее количество элементов в объекте, количество найденных групп, количество найденных правил ассоциаций); в найденные группы элементов - указывается состав группы, количество случаев, процент случаев, в которых эта группа встречается; в найденные ассоциативные правила - указывается исходный состав элементов, следствие (состав элементов), процент случаев, достовер- ность, значимость правила. ПОДРОБНЕЕ Познакомиться с приведенным ниже примером анализа данных можно в демонстрационной конфигурации «Анализ данных и прогнозиро- вание», прилагающейся к книге на компакт-диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является оборотный регистр накопления Продажи, в котором отражены дви- жения документа Расходная накладная. Рассмотрим особенности проведения данного типа анализа на следующей выборке данных (постараемся определить состав одновременно закупа- емых товаров), табл. 15.4. Признаком, по которому данные относятся к одной группе, будем считать значение регистратора (номенклатура, указанная в одном документе, считается закупленной одновременно). То есть Регистратор будет объектом анализа, Номенклатура - элементом. Профессиональная разработка в системе «1С:Предприятие 8»
Таблица 15.4. Список закупленных товаров Регистратор Номенклатура Расходная накладная № 000000001 Стол кухонный раскладной Табурет круглый Расходная накладная № 000000002 Диван «УЮТ» Расходная накладная № 000000003 Диван «Джинс» Кресло «Джинс» Расходная накладная № 000000005 Стол «Kitchen» 0.9x1.7 Диван «Комфорт» Расходная накладная № 000000004 Стол «Kitchen» 0.9x1.7 Стул «Summer» Диван «УЮТ» Расходная накладная № 000000006 Стол кухонный раскладной Табурет прямоугольный Расходная накладная № 000000007 Кресло «УЮТ» Расходная накладная № 000000008 Кресло «УЮТ» Расходная накладная № 000000009 Шкаф «Wardrobe» Расходная накладная № 000000010 Стол кухонный раскладной Табурет прямоугольный Стол обеденный Расходная накладная № 000000011 Стул «Summer» Табурет круглый Для проведения анализа будем использовать следующий фрагмент кода (листинги 15.3, 15.4). Листинг 15.3. Пример выполнения анализа «Поиск ассоциаций» &НаКпиенте Процедура ПоискАссоциаций(Команда) Результат = АнализПоискАссоциаций(); КонецПроцедуры Листинг 15.4. Пример выполнения анализа «Поиск ассоциаций» &НаСервереБезКонтекста Функция АнализПоискАссоциаций() Анализ = Новый АнализДанных; Анализ.Тип Анализа = Тип("АнализДанныхПоискАссоциаций"); Запрос = Новый Запрос; Запрос.Текст = ” ВЫБРАТЬ Продажи.Регистратор, Продажи.Номенклатура ИЗ РегистрНакопления.Продажи КАК Продажи”; Анализ.ИсточникДанных = Залрос.Выполнить(); II Строка приводится в качестве примера, II такое значение типа колонки по умолчанию. Анализ.НастройкаКолонок.Номенклатура.Т ипКолонки = ТипКолонкиАнапизаДанныхПоискАссоциаций.Элемент; Том 2
*1?ПТ1ГГТ1ТГТТОП^117Р^ II Строка приводится в качестве примера, II такое значение типа отсечения по умолчанию. Анализ.Параметры.ТипОтсеченияПравил.Значение = ТипОтсеченияПравилАссоциации. Избыточные; РезультатАнапиза = Анализ.Выполнить(); Построитель = Новый ПостроительОтчетаАнапизаДанных(); Построитель.Макет = Неопределено; Построитель.ТипАнализа = Тип(“АнапизДанныхПоискАссоциаций”); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнапиза, ТаВДок); Возврат ТабДок; КонецФункции Результат анализа будет выглядеть следующим образом (рис. 15.6). Информация о данных Количество элементов: 12 Количество объектов: 11 Среднее количество элементов в объекте: 1 ,В2 Результат анализа Найдено часто встречаемых (рупп: 1 Найдено ассоциативных правил: 2 Рис. 15.6. Результат анализа «Поиск ассоциаций» В выборе используются данные из одиннадцати документов (ссылка содержится в поле Регистратор), количество различных номенклатурных позиций равно двенадцати (табл. 15.5). Таблица 15.5. Различные номенклатурные позиции Номенклатура Стол кухонный раскладной Табурет круглый Диван «УЮТ» Диван «Джинс» Кресло «Джинс»_________ Стол «Kitchen» 0.9x17 Диван «Комфорт»________ Стул «Summer» Табурет прямоугольный Кресло «УЮТ»___________ Шкаф «Wardrobe»________ Стол обеденный Найдена следующая группа товаров (рис. 15.7).
Часто встречаемые группы На [Количество слуиев [Процент случаев Состав 1| 2| 18,16 Номенклатура = Стол кухонный раскладной_ Номенклатура = Табурет прямоугольный Рис. 15.7. Найденная группа товаров Вся группа встречается в документе только в двух случаях из одиннад- цати (это и показано в колонках Количество случаев и Процент случаев). Получены следующие ассоциативные правила (рис. 15.8). Ассоциативные правила Исходный набор (Следствие Процент случаев Востоверность Значимость 1 18.18 100,00 3,67 Номенклатура = Табурет прямоугольный Номенклатура = Стол кухонный раскладной 2 18.18 66,67 3,67 Номенклатура = Стол кухонный раскладной Номенклатура = Табурет прямоугольный Рис. 15.8. Ассоциативные правила Разберем второе из них. В двух случаях из одиннадцати в документе вместе с позицией Стол кухонный раскладной встречалась позиция Табурет прямоугольный. Исходя из этого, был рассчитан процент случаев: (2/11 * 100=18,18%). Достоверность была рассчитана следующим образом: обе номенкла- турные позиции закупались в двух случаях, товарная позиция Стол кухонный раскладной встречалась в покупках 3 раза. Исходя из этого, достоверность равна: 2 / 3 * 100 = 66,67 %. Значимость определяется как отношение достоверности правила к проценту нахождения Табурет прямоугольный в закупаемых товарах. Эта позиция встречается в двух документах из одиннадцати (18,18 %). Значимость равна: 66,67 % / 18,18 % = 3,67. Типы отсечения правил Рассмотрим такой важный параметр данного типа анализа, как ТипОтсе- ченияПравил. Возможные значения отсечения содержатся в системном перечислении ТипОтсеченияПравилАссоциации, их состав: в Покрытые, в Избыточные. Перед тем как перейти к рассмотрению особенностей вариантов отсе- чения, рассмотрим несколько общих моментов, применимых к правилам ассоциации. Любое правило состоит из предпосылки и следствия. Например: в Предпосылка: Если купили Товар № 1. в Следствие: То купят Товар № 2. Ц©®
При этом не нужно забывать, что следствие наступает с определенной достоверностью. При отсечении правил вероятностные характеристики могут рассматриваться, а могут и игнорироваться (важно только содер- жание правила). Отсечение покрытых правил Рассмотрим вариант отсечения Покрытые. Правило может быть покрыто как по предпосылке, так и по следствию. Например: в Правило № 1: Если купили товар № 1 и № 3, То купят товар № 2. в Правило № 2: Если купили товар № 1, То купят товар № 2. В этом случае правило № 1 будет считаться покрытым, т. к. предпосылка первого правила получается «избыточной» по отношению к предпосылке второго правила. Пример покрытия по следствию: в Правило № 1: Если купили товар № 1, То купят товар № 2, № 3. в Правило № 2: Если купили товар № 1, То купят товар № 3. Правило № 2 будет покрыто по следствию, так как следствие правила № 1 более полное. Отсечение избыточных правил Покрытие не учитывает вероятностных характеристик правил, они учиты- ваются в случае, если используется вариант отсечения Избыточные. Правило будет считаться избыточным по предпосылке, если оно покрыто по предпосылке и его достоверность равна достоверности покрывающего правила. Например: в Правило № 1: Если купили товар № 1 и № 3, То купят товар № 2 с достоверностью 75 %. в Правило № 2 Если купили товар № 1, То купят товар № 2 с достовер- ностью 75 %. Правило № 1 избыточно по отношению к правилу № 2 (оно содержит дополнительное условие, не вносящее «возмущения» в вероятностные характеристики правила). Правило № 1 будет считаться избыточным по следствию, если коли- чество случаев данного правила равно количеству случаев покрывающего правила. Правило № 1: Если купили товар № 1, То купят товар № 2, № 3 в трех случаях. Профессиональная разработка в системе «1С:Предприятие 8»
Правило № 2: Если купили товар № 1, То купят товар № 3 в трех случаях. Правило № 2 будет считаться избыточным по отношению к правилу № 1, так как оно содержит более простое следствие с теми же вероятностными характеристиками. ТИП АНАЛИЗА «ПОИСК ПОСЛЕДОВАТЕЛЬНОСТЕЙ» Данный тип анализа позволяет выявить цепочки возникающих событий (шаблоны последовательностей). Он может использоваться тогда, когда одним из важных анализируемых показателей является последователь- ность наступления событий во времени. Например, можно выявить последовательность товаров, которые закупаются друг за другом в течение какого-либо определенного промежутка времени и т. п. Схематично процесс проведения анализа Поиск последовательностей можно представить следующим образом (рис. 15.9). Информационная база 1С:Праа приятие Рис. 15.9. Схема выполнения анализа «Поиск последовательностей» В качестве источника данных может использоваться результат запроса, таблица значений, область ячеек табличного документа. С точки зрения данного типа анализа колонки источника можно разделить на следующие: в Неиспользуемая - игнорируются анализом; в Последовательность - данные из этой колонки используются для анализа как объект события последовательности. По значению данной колонки анализ и ассоциирует данные с одной цепочкой событий; в Элемент - данные из этой колонки используются как элементы после- довательности; Том 2
в Время - именно по данной колонке определяется время наступления события. Наличие данной колонки обязательно при проведении данного типа анализа. Кроме настройки типов колонок, на результат проводимого анализа влияют следующие параметры анализа: в МинимальныйПроцентСлучаев - минимальный процент после- довательностей, в которых наблюдается найденный шаблон последовательности; в МинимальныйИнтервал - признак установки минимального интервала последовательности (должна быть установлена единица измерения интервала, кратность); в МаксимальныйИнтервал - признак установки максимального интервала последовательности (должна быть установлена единица измерения интервала, кратность); в ИнтервалЭквивалентностиВремени - признак установки интервала экви- валентности времени (должна быть установлена единица интервала эквивалентности времени, ее кратность); в МинимальнаяДлина - минимальная длина искомых последователь- ностей; в ПоискПоИерархии - признак осуществления поиска по иерархии (распространяется на колонки с типом Элемент). Ряд свойств оперирует таким понятием, как ТипЕдиницыИнтервалаВреме- ниАнализаДанных. Данное системное перечисление содержит следующие значения (табл. 15.6). Таблица 15.6. Значения системного перечисления «ТипЕдиницыИнтервалаВремениАнализаДанных» Секунда Минута ТекущаяМинута Час ТекущийЧас День ТекущийДень Неделя ТекущаяНеделя Декада ТекущаяДекада Месяц ТекущийМесяц Квартал ТекущийКвартал Полугодие ТекущееПолугодие Год ТекущийГод Основным результатом анализа являются найденные шаблоны последова- тельностей. Эти шаблоны содержат следующую информацию: в состав шаблона последовательности; в количество случаев, в которых наблюдалась данная последователь- ность;
Гл~аваУ15!УА'нализУданн£|х4и1прогнозир'ование' в максимальные интервалы между событиями (в случае, если событий 2, то интервал один); в минимальные интервалы между событиями (в случае, если событий 2, то интервал один); в процент случаев, когда данная последовательность выполнилась; в средние интервалы между событиями (в случае, если событий 2, то интервал один). ПОДРОБНЕЕ Познакомиться с приведенным ниже примером анализа данных можно в демонстрационной конфигурации «Анализ данных и прогнозиро- вание», прилагающейся к книге на компакт-диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является оборотный регистр накопления Продажи, в котором отражены дви- жения документа Расходная накладная. Особенности выполнения данного типа анализа рассмотрим на примере следующей выборки данных (табл. 15.7). Таблица 15.7. Выборка данных Контрагент Первая покупка Вторая покупка Тратья покупка Интервал Бондарев В.И. Стол кухонный рескл адной Диван «УЮТ» Кресло «УЮТ» 25 дней, 31 день Табурет круглый Иванов И.П. Диван «Джинс» Кресло «Джинс» Петров Б.С. Стол «Kitchen» 0.9x1.7 Кресло «УЮТ» 43 дня Стул «Summer» Диван «УЮТ» Сидоров Г.0. Стол кухонный раскладной Табурет прямоугольный Степанов В.К. Стол кухонный раскладной Табурет прямоугольный Стол обеденный Федоров Д.Е. Стол «Kitchen» 0.9x1.7 Шкаф «Wardrobe» Стул «Summer» 58 дней, 29 дней Диван «Комфорт» Табурет круглый Данные из колонки Контрагент будут определять принадлежность к конк- ретной цепочке событий, т. е. они определяют последовательность анализа. Номенклатура будет являться элементом получаемой последовательности. Для проведения анализа может использоваться фрагмент кода, анало- гичный приведенному ниже (листинги 15.5, 15.6). И©
Листинг 15.5. Пример выполнения анализа «Поиск последовательностей» &НаКлиенте Процедура ПоискПоследовательностей(Команда) Результат = АнализПоискПоследовательностей(); КонецПроцедуры Листинг 15.6. Пример выполнения анализа «Поиск последовательностей» &НаСервереБезКонтекста Функция АнализПоискПоследоватепьностей() Анализ = Новый АнапизДанных; Анализ.ТипАнализа = Тип("АнапизДанныхПоискПоследовательностей”); Запрос = Новый Запрос; Запрос.Текст =" |ВЫБРАТЬ | Продажи.Контрагент, | Продажи.Номенклатура, | Продажи.Период |ИЗ | РегистрНакопления.Продажи КАК Продажи"; Анапиз.ИсточникДанных = Запрос.Выполнить(); Анализ.НастройкаКолонок.Период.ТипКолонки = ТипКолонкиАнализаДанныхПоискПоследовательностей.Время; РезультатАнапиза = Анализ.Выполнить(); Построитель = Новый ПостроительОтчетаАнапизаДанных(); Построитель.Макет = Неопределено; Построитель.Тип Анализа = Тип("АнализДанныхПоискПоследовательностей"); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа, ТабДок); Возврат ТабДок; КонецФункции Поле Период определяется как Время непосредственно из кода (самостоя- тельно анализом не определяется). Параметры анализа, установленные по умолчанию (рис. 15.10). Параметры анализа Минимальный процент случаев: 10 Минимальный интервал: — Максимальный интервал: — Интервал эквивалентности времеш: — Минимальная длина последовательности: 2 Рис. 15.10. Параметры анализа После проведения анализа получены следующие общие данные (рис. 15.11). Профессиональная разработка в системе «1С:Предприятие 8»
Информация о данных Количество элементов: 12 Количество последовательностей Б Результат анализа Найдено последовательностей 2 Рис. 15.11. Общие данные анализа Количество элементов равно двенадцати. Ровно столько номенклатурных позиций встречается в приведенной выборке данных. Найдены две последовательности (рис. 15.12). Последовательности Ns |Количество случаев | Процент случаев Средний Минимальный Макснмальньй Состав интервал 1| 2| 33,33 Номенклатура - Диван "УЮГ Номенклатура = Кресло "УЮТ* 1 мес.7д. 1 мес.1 д. 1 нес. 14 д. 2| 1| 16.67 Номенклатура = Стол "Kftchen" 0.9x1.7 Номенклатура = Стул "Summer" 2мес. 28 д. 2мес.28д. 2мес.28д. Рис. 15.12. Найденные последовательности Первая последовательность встречается в двух случаях из пяти. Исходя из этого, процент случаев равен 40 %. Так как глубина последователь- ности равна 2, существует по одному значению каждого из приводимых интервалов. ТИП АНАЛИЗА «ДЕРЕВО РЕШЕНИЙ» С помощью данного типа анализа можно получить причинно-следс- твенную иерархию условий, приводящую к определенному решению. Например, получить дерево условий, по которому (с определенной долей вероятности) можно понять причину расторжения договоров с клиентами компании, определения условий, влияющих на вариант заключаемого договора. Можно проводить «профилирование» менеджеров компании по различным видам ее клиентов и т. п. Схематично процесс проведения анализа Дерево решений можно предста- вить следующим образом (рис. 15.13). Том 2
|Ти п1анал иза1«Дёрёвр]решён и й >> Информационная база 1С:Пред приятие Параметры анализа Минимальное количество элементов в узле лг Источник Входная Лрогноз1фуемая Максимальная глубина дерева Тип угфощения дерева решений Результат анализа Информация сданных Результат анализа Дерево решений Ошибки классификации Рис. 15.13. Схема выполнения анализа «Дерево решений» С точки зрения данного типа анализа колонки источника можно разделить на следующие: в Неиспользуемая, в Входная, в Прогнозируемая. Используемые параметры анализа: в МинимальноеКоличествоСлучаев - минимальное количество элементов в узле; в МаксимальнаяГлубина - максимальная глубина дерева; в ТипУпрощения - тип упрощения дерева решений. В результате проведенного анализа можно получить: в дерево решений, в ошибки классификации. ПОДРОБНЕЕ Познакомиться с приведенным ниже примером анализа данных можно в демонстрационной конфигурации «Анализ данных и прогнозиро- вание», прилагающейся к книге на компакт-диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является справочник Контрагенты, группа Юридические лица. Разберемся с особенностью данного типа анализа на примере следующей выборки данных (табл. 15.8). ТОГО
Таблица 15.8. Исходная выборка данных ! t £ Количество розничных точек Количество автомобилей Время работы организации Время заключения договора Вид договора Состояние взаимоотношений ЗАО Игорь 1 0 Меньше года Меньше года Дилер Несоблюдение договора ЗАО ТогрМебель 15 4 От трех до десяти лет Меньше года Дистрибьютор Прекращение контрагентом ЗАО ТогрМебель 1 10 От трех до десяти лет От года до трех Дистрибьютор Прекращение контрагентом ИЧП Дубрава 1 1 От года до трех Меньше года Дилер Прекращение контрагентом Магазин № 15 1 1 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ООО Гросс 3 2 Меньше года Меньше года Постоянный партнер Не прекращены ООО Интарис 7 3 От трех до десяти лет От года до трех Постоянный партнер Прекращение контрагентом ООО ТогрТрест 2 2 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ПБОЮЛ Курочкин 0 1 Меньше года Меньше года Дилер Не прекращены Для проведения анализа может использоваться фрагмент кода, анало- гичный приведенному ниже (листинги 15.7, 15.8). Листинг 15.7. Пример выполнения анализа «Дерево решений» &НаКпиенте Процедура ДеревоРешений(Команда) Результат = АнализДеревоРешений(); КонецПроцедуры Листинг 15.8. Пример выполнения анализа «Дерево решений» &НаСервереБезКонтекста Функция АнализДеревоРешений() Анализ = Новый АнализДанных; Анализ.Тип Анализа = Тип("АнализДанныхДеревоРешений"); Группа = Справочники. Контрагенты. НайтиПоНаименованию("Юридические лица"); Запрос = Новый Запрос; Запрос-Текст ="
|ВЫБРАТЬ I Контрагенты.Ссылка, I Контрагенты.КоличествоРозничныхТочек, I Контрагенты. КопичествоАвтомобилей, | Контрагенты. ВремяРаботыОрганизации, | Контрагенты.ВремяЗаключенияДоговора, | Контрагенты. ВидДоговора, | Контрагенты.ПрекращениеОтношений |ИЗ | Справочник.Контрагенты КАК Контрагенты ГДЕ | (НЕ Контрагенты.ЭтоГрулпа И Контрагенты.Родитель = &Родитель)"; Запрос.УстановитъПараметр("Родитепь”, Г рулпа); Анализ.ИсточникДанных = Запрос.Выполнить(); Ан ализ.Параметры.ТипУпрощения.Значение = ТилУпрощенияДереваРешений.НеУпрощать; РезультатАнапиза = Анализ.Выполнить(); Построитель = Новый ПостроительОтчетаАнапизаДанных(); Построитель.Макет = Неопределено; Построитель.Тип Анализа = Тип("АнализДанныхДеревоРешений"); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнапиза, ТабДок); Возврат ТабДок; КонецФункции В результате проведения анализа получено следующее дерево решений (рис. 15.14). Дерево решений Услевие Решение Вероятность Количество Коретъ ПрекрашениеОтноаений = ГЪекращение контрагентом 44,44 9 КвличествоАвтомобнлей <= 0,5 ПреодашеинеОтношений = Несоблюдение договора 100,00 1 КотмчествоАвтомобилей > 0,5 ПрекрашениеОтноаений = Прекращение контрагентом 50,00 8 КоличествоАвтомобилей <= 2,5 ПрекрашениеОтноаений = Не прекращены 80,00 5 ВремяРаботыОрганнтацин = Меньше года ПреодашеинеОтношений = Не прекращены 100,00 2 ВремяРаботыОрганнтацин = От года дв трек ПреодашеннеОтношений = 100,00 1 ВремяРаботыОрганнтацин = Свыше десяти лот ПреодашеннеОтношений = Не прекращены 100,00 2 КоличествоАвтомобилей > ПреодашеннеОтношений = Поешкашение контоагентом 100,00 3 Рис. 15.14. Дерево решений Данное дерево можно представить в виде следующей схемы (рис. 15.15). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 15.15. Представление дерева решения в виде схемы Ошибки классификации показывают, в каких случаях полученные правила расходятся с действительностью (исходной выборкой данных), рис. 15.16. Рис. 15.16. Ошибки классификации Исходя из приведенных данных, видно, что ошибок в полученной класси- фикации нет, то есть данные в фактической выборке совпадают с данными классификации. Том 2
Предыдущий пример получен, исходя из значения НеУпрощать параметра анализа ТипУпрощения. Данное значение параметра мы задали программно в листинге 15.8. Если установить значение Упрощать параметра, дерево решений примет такой вид (рис. 15.17). Дерево решений Условие Решение Вероятность Количество Корень ПрекрашениеОтносений = Прекращение контрагентом 44,44 9 КоличествоАвтомобилей <= 0,5 ПретфашегетеОтношеннй = Несоблюдение договора 100ДО 1 КоличествоАвтомобилей > 0,5 ПрекрашениеОтноиений = Прекращение контрагентом 50,00 8 КоличествоАвтомобилей <= 2,5 Пре>фашениеОгношенж = Не прекращены 00ДО 5 КоличествоАвтомобилей > 2,5 Пре>фашешеОтношеннй « Пршфащение контрагентом 100ДО 3 Рис. 15.17. Дерево решений Упрощение дерева заключается в том, что по определенным правилам (формулам, которые будут рассмотрены ниже) узлы дерева превращаются в листья (отсекается лишнее ветвление). При принятии решения о том, будет ли произведено преобразование узла в лист, учитываются следующие показатели: в Ошибок - количество ошибок в узле; в ОшибокДочерних - количество ошибок в дочерних узлах; в Листов - количество листов в узле; в Случаев - количество случаев. J {ОшибокДочерних + ^истов^ * {Случаев - {ОшибокДочерних + ^истову^ ---------------------2----------------------------------2---- Случаев Решение о превращении узла в лист принимается в случае выполнения условия: Ошибок + 0,5 -< ОшибокДочерних + Лис™ов + СКОшибки В нашем примере для узлов Время работы организации условие выполня- ется (0,5 < 1). В связи с использованием упрощений появились и ошибки в классифи- кации, что показано в результате анализа (рис. 15.18). №
Ошибки классификации Рис. 15.16. Ошибки классификации Например, существует один случай, когда в реальной выборке данных было значение Прекращение контрагентом, а по полученной классифи- кации должно быть значение Не прекращены и т. п. ТИП АНАЛИЗА «КЛАСТЕРИЗАЦИЯ» Кластерный анализ - математическая процедура многомерного анализа, позволяющая на основе множества показателей, характеризующих ряд объектов, сгруппировать их в кластеры таким образом, чтобы объекты, входящие в один кластер, были более однородными, сходными, по срав- нению с объектами, входящими в другие кластеры. В основе данного анализа лежит вычисление расстояния между объек- тами. Именно исходя из расстояний между объектами и производится их группировка по кластерам. Определение расстояния может проводиться разными способами (по разным метрикам). Поддерживаются следующие метрики: в Евклидова метрика, в Евклидова метрика в квадрате, в Метрика города, в Метрика доминирования. После определения расстояний между объектами может использоваться один из нескольких алгоритмов распределения объектов по кластерам.
Поддерживаются следующие методы кластеризации: в Ближняя связь, в Дальняя связь, в к-средних, в Центр тяжести. Схематично механизм проведения кластерного анализа можно предста- вить следующим образом (рис. 15.19). Рис. 15.19. Схема выполнения кластерного анализа На вход объекту АнализДанных подается источник данных. В качестве источника может выступать результат запроса, таблица значений, область ячеек табличного документа. Колонки источника определяются как входные либо неиспользуемые. Следует отметить, что все значения колонок содержатся в системном перечислении ТипКолонкиАнализаДан- ныхКластеризация. В этом перечислении значений больше (не только неиспользуемые и входные), но другие значения используются при пост- роении прогнозов. Анализ производится в соответствии с установленными параметрами анализа. ПОДРОБНЕЕ Познакомиться с приведенным ниже примером анализа данных можно в демонстрационной конфигурации «Анализ данных и прогнозиро- вание», прилагающейся к книге на компакт-диске, в обработке Анализ данных и прогнозирование. Источником данных для анализа является справочник Контрагенты, группа Юридические лица. Профессиональная разработка в системе «1С:Предприятие 8»
В качестве примера, иллюстрирующего возможность проведения кластерного анализа, будем использовать следующий фрагмент кода (листинги 15.9, 15.10). Листинг 15.9. Пример выполнения кластерного анализа &НаКпиенте Процедура КпастерныйАнализ(Команда) Результат = АнализКпастеризация(); КонецПроцедуры Листинг 15.10. Пример выполнения кластерного анализа &НаСервереБез Контекста Функция АнализКпастеризация() Анализ = Новый АнализДанных; Анализ.ТипАнализа = Тип('АнализДанныхКпастеризация'); Группа = Справочники. Контрагенты. НайтиПоНаименованию("Юридические лица"); Запрос = Новый Запрос; Запрос.Текст = ” |ВЫБРАТЬ | Контрагенты.Ссылка, | Контрагенты.КоличествоРозничныхТочек, | Контрагенты.КоличествоАвтомобилей, | Контрагенты.ВремяРаботыОрганизации, | Контрагенты.ВремяЗаключенияДоговора, | Контрагенты.ВидДоговора, | Контрагенты.ПрекращениеОтношений |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | (НЕ Контрагенты.ЭтоГруппа И Контрагенты.Родитепь = &Родитепь)"; Запрос.У становитьПараметр("Родитель", Г руппа); Анализ.ИсточникДанных = Запрос.Выполнить(); II Выбор метрики. Анализ.Параметры.МераРасстояния.Значение = ТипМерыРасстоянияАнализаДанных.ЕвклидоваМетрикаВКвадрате; II Выбор метода кластеризации. Анализ.Параметры.МетодКпастеризации.Значение = МетодКпастеризации.КСредних; РезультатАнализа = Анапиз.Выполнить(); Построитель = Новый ПостроительОтчетаАнализаДанных(); Построитель.Макет = Неопределено; Построитель.ТипАнализа = Тип("АнализДанныхКластеризация"); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа, ТабДок); Возврат ТабДок; КонецФункции Том 2
|Ти п[анал иза!« Кластеризация » Запрос выполняется по справочнику Контрагенты. По условию запроса выбираются только детальные записи справочника из группы Юриди- ческие лица. Выполнение указанного кода приведет к тому, что в качестве начальных установок анализа данных будут определены следующие значения (часть установлена явно, часть - по умолчанию), рис. 15.20. Параметры ан ал та Количество искомых кластеров: 3 Стандартизация: Стандартизировать Мера расстояния: Евклидова метрика в квадрате Метод кластеризации: Метод к-средних Колонки источника данных Входные колонки Имя КОЛОНЮ1 Тнндашых Вес Ссылса Дискретный 1 КоличествоРозничныхТочек Непрерывньм 1 КоличествоАвтомобилей Непрерывньм 1 ВрамяРаботыОр ганизации Дискретный 1 В ремяЗаключенияДо говора Дискретный 1 В идДо говора Дискретный 1 ПрекраиениеОтношений Дискретный 1 Рис. 15.20. Параметры анализа Состав колонок определился, исходя из состава полей выборки запроса. По умолчанию они определены с равным весом. Для типов Число и Дата определен вид данных Непрерывные, для остальных типов - Дискретные. При необходимости изменить параметры колонок это можно сделать по аналогии с приведенным фрагментом (листинг 15.11). Листинг 15.11. Пример изменения параметров колонок Анализ. НастройкаКопонок.КопичествоАвтомобилей.ДополнительныеПараметры.Вес= 2; В данной строке для колонки КоличествоАвтомобилей увеличен вес. Выборка данных, для которых будет произведен анализ, имеет следующее наполнение (табл. 15.9). ms
Гл~аваУ15!УА'нализУданн£|х4и1прогнозир'ование' Таблица 15.9. Исходная выборка данных ! t £ Количество розничных точек Количество автомобилей Время работы организации Время заключения договора Вид договора Состояние взаимоотношений ЗАО Игорь 1 0 Меньше года Меньше года Дилер Несоблюдение договора ЗАО ТогрМебель 15 4 От трех до десяти лет Меньше года Дистрибьютор Прекращение контрагентом ЗАО ТогрМебель 1 10 От трех до десяти лет От года до трех Дистрибьютор Прекращение контрагентом ИЧП Дубрава 1 1 От года до трех Меньше года Дилер Прекращение контрагентом Магазин № 15 1 1 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ООО Гросс 3 2 Меньше года Меньше года Постоянный партнер Не прекращены ООО Интарис 7 3 От трех до десяти лет От года до трех Постоянный партнер Прекращение контрагентом ООО ТогрТрест 2 2 Свыше десяти лет От трех до десяти лет Постоянный партнер Не прекращены ПБОЮЛ Курочкин 0 1 Меньше года Меньше года Дилер Не прекращены Результат анализа будет получен в следующем виде (рис. 15.21). Отметим тот факт, что в результате анализа получаются данные именно о найденных кластерах (их количество, центры, расстояния между ними). В результате анализа не получаются данные о том, какие объекты (в нашем случае контрагенты) в какие кластеры входят. Подобное пове- дение наблюдается в случае, если настройка параметров проводимого анализа не проводится явным образом (а именно параметра ТипЗаполне- нияТаблицы). Для того чтобы в результате анализа увидеть распределение объектов по кластерам, необходимо перед выполнением анализа (но после опреде- ления его типа) определить следующую строку кода (листинг 15.12). Листинг 15.12. Установка параметра «ТипЗаполненияТаблицы» Анализ.Параметры.ТипЗапопненияТаблицы.Значение = I ТипЗаполненияТаблицыРезультатаАнализаДанных.ИспользуемыеПоля;| №
Количество объектов: 9 Рчультаг аналша Найдено кластеров: 3 Кластеры Ns кнастера Количество объектов Прецент 1 6 66,67 2 2 22,22 3 1 11,11 Центры кластеров Пеле \ Кластер 1 2 3 Ссылса = ЗАО ТофМебель 1,0000 Ссылса = ООО Интарис 0,5000 Ссылса = ЗАО МабельКрафт 0,5000 Ссылса = ПБОЮП Курочкин 0,1667 Ссылса = ЗАО Игорь 0,1667 Ссылса - ИФ1 Дубрава 0,1667 Ссылса = Магазин №15 0,1667 Ссылса = ООО ТосрТрест 0,1667 Ссылса = ООО Гросс 0,1667 КоличаствоРозничнькТочек 1,3333 11,0000 1,0000 КоличествоАвтомобилей 1,1667 3,5000 10,0000 ВремяРаботыОрганизации = Свыше десяти лет 0,3333 ВремяРаботыОрганизации = От года до трех 0,1667 ВремяРаботыОрганизации = Меньше года 0,5000 ВрамяРаботыОрганизас^си = От трах до десяти лет 1,0000 1,0000 ВремяЗаключенияДоговора “ Меньше года 0,6667 0,5000 ВремяЗаключенияДоговора = От трех до десяти лет 0,3333 ВремяЗаключенияДоговора = От года до трех 0,5000 1,0000 ВидДоговора = Дилер 0,5000 ВидДоговора = Посте янньм партнер 0,5000 0,5000 ВидДоговора = Дистрибьютор 0,5000 1,0000 ПрекрашениеОтновений = Несоблюдение договора 0,1667 ПрекраоениеОтновений = Прекращение контрагентом 0,1667 1,0000 1,0000 ПракрашениеОтновений = Не прекращены 0,6667 Расстояния между кластерами Кластеры 1 2 3 1 8,7740 15,4524 2 8,7740 11,5370 3 15,4524 11,5370 Рис. 15.21. Результат кластерного анализа Используемые метрики Сразу отметим такой факт: несмотря на то, что в предыдущем примере входные колонки имели непрерывный тип (для этого типа очевидно понятие «расстояния»), при анализе могут использоваться и колонки диск- ретных типов (ссылки на справочники, значения перечислений и т. п.). Разберемся с метриками, которые могут использоваться при проведении кластерного анализа. Профессиональная разработка в системе «1С:Предприятие 8»
Евклидова метрика В данной метрике расстояние между двумя объектами вычисляется по формуле: Расстояние = Где: в Xi, И - значения атрибутов двух объектов (между которыми определя- ется расстояние); в Wi — весовой коэффициент атрибута (устанавливается в колонке анализа); в z — номер атрибута, от 1 до и; в п - число атрибутов. Предположим, что объекты характеризуются одним свойством, которое у одного объекта имеет значение 9, у другого - 5. Весовой коэффициент данного атрибута равен единице. Расстояние между объектами будет равно: = 7Е(1Ф(4)2)=4 Евклидова метрика в квадрате В данной метрике расстояние между двумя объектами вычисляется по формуле: Расстояние = Zw*^-^)2) Где: в Xi, 1? - значения атрибутов двух объектов (между которыми определя- ется расстояние); в Wi - весовой коэффициент атрибута (устанавливается в колонке анализа); в i - номер атрибута, от 1 до и; в п - число атрибутов. Предположим, что объекты характеризуются одним свойством, которое у одного объекта имеет значение 5, у другого - 3. Весовой коэффициент данного атрибута равен двум. Расстояние между объектами будет равно: 52(2,*(51 -з,)2) = J2(2,*(2)2) = 8 Том 2
[Ги п[анал иза!« Кластеризация >> Метрика города В данной метрике расстояние между двумя объектами вычисляется по формуле: Расстояние = ZW* Iх< ~ D Где: в Xi, И - значения атрибутов двух объектов (между которыми определя- ется расстояние); в Wi - весовой коэффициент атрибута (устанавливается в колонке анализа); в i - номер атрибута, от 1 до и; в п - число атрибутов. Предположим, что объекты характеризуются двумя атрибутами, которые имеют значения 3 и 5, 7 и 3. Вес первого равен 2, вес второго равен 1 (рис. 15.22). Рис. 15.22. Характеристики объектов Расстояние= *(|*,-у; |)+^2 *(|*2-r2 |) = 2*(|3-7 |)+1*(|5-з |) = 10 Метрика доминирования В данной метрике расстояние между двумя объектами вычисляется по формуле: MAX(W*\X, -Y, |) Где: в Xi, И - значения атрибутов двух объектов (между которыми определя- ется расстояние); в Wi - весовой коэффициент атрибута (устанавливается в колонке анализа); в i - номер атрибута, от 1 до и; в п - число атрибутов. Предположим, что объекты характеризуются двумя атрибутами, которые имеют значения 3 и 5, 7 и 3. Вес первого равен 2, вес второго равен 1 (см. рис. 15.22). Расстояние = махщ * (| х, - у, |), w, * (| х, - у, |» = млх(2 • (| 3 - 71),1 * (| 5 - з I) =8
Методы кластеризации Вариант метода кластеризации определяет, исходя из каких принципов объект соотносится к той или иной группе, по какому алгоритму произво- дится формирование кластеров. Можно сказать, что целью любого алгоритма кластеризации является: в минимизация изменчивости внутри кластеров, в максимизация изменчивости между кластерами. Различия между методами будем рассматривать на объектах, представ- ленных на рисунке (рис. 15.23). Будем считать, что объекты образуют две группы. Первая состоит из объектов 1, 2 и 3. Вторая группа состоит из объектов 4, 5 и 6. Рис. 15.23. Группы объектов Ближняя связь Метод кластеризации, в котором объект присоединяется к той группе, для которой расстояние до ближайшего объекта минимально. В рассматриваемом примере объект 7 будет включен в группу, в которой находится объект 4. Самыми близкими объектами двух групп являются объекты 4 и 3. Расстояние до объекта 4 минимально. Дальняя связь Метод кластеризации, в котором объект присоединяется к той группе, для которой расстояние до наиболее дальнего объекта минимально. В рассматриваемом примере объект 7 будет включен в группу, в которой находится объект 5. Самыми дальними объектами двух групп являются объекты 1 и 5. Расстояние до объекта 5 меньше. те
Центр тяжести Метод кластеризации, в котором объект присоединяется к той группе, для которой расстояние до центра тяжести минимально (рис. 15.24). Рис. 15.24. Группы объектов В примере, рассмотренном на рисунке, объект 7 добавится в группу, содержащую объекты 4, 5 и 6. Расстояние до центра тяжести (некоего мифического объекта со средними значениями атрибутов) минимально. к-средних В данном методе выбираются объекты, находящиеся первыми в выборке. Они считаются центрами кластеров. Далее выбирается следующий объект и, в соответствии с расстоянием до центров кластеров, относится к тому или иному кластеру. Центр кластера, к которому был добавлен объект, пересчитывается. Процедура повторяется до полного перебора всех объектов. Далее опять производится новая выборка объектов (начиная с первого). Процедура повторяется до тех пор, пока изменяются центры кластеров (рис. 15.25). Рис. 15.25. Пример расположения объектов Предположим, что произвольно выбраны в качестве центров клас- теров объекты 1 и 2. Объект 3 добавляется к кластеру, центром которого является объект 1. Центр первого кластера перерассчитывается (он нахо- дится между объектом 1 и 3). Объект 4 добавляется ко второму кластеру (его центр также перерассчитывается). Профессиональная разработка в системе «1С:Предприятие 8»
После перебора всех анализируемых объектов к первому кластеру относятся объекты 1 и 3, ко второму - остальные объекты (его центр пред- положительно находится в центре треугольника из объектов 4, 7, 6). Далее опять производится выборка объектов и распределение их по клас- терам (относительно постоянно рассчитываемых центров кластеров). Где-то на третьей выборке объектов, скорее всего, объект 2, который изначально был центром второго кластера, станет относиться к первому кластеру. В конце алгоритма к первому кластеру будут относиться объекты 1, 2, 3. Ко второму - объекты 4, 5, 6, 7. Вывод данных в дендрограмму При выводе данных кластерного анализа, если используется алгоритм, отличный от алгоритма k-средних, результаты кластерного анализа выво- дятся в виде дендрограммы (алгоритм анализа должен предусматривать вывод распределения анализируемых объектов по кластерам), рис. 15.26. Рис. 15.26. Дендрограмма ПРОВЕДЕНИЕ ПРОГНОЗОВ Если рассмотреть задачу прогнозирования в общем, то в ней можно выде- лить две важные части: в обучение модели на какой-либо выборке данных, в использование обученной модели для работы с фактическими данными для получения какого-либо прогноза. Том 2
П рб веде н ие] п ро гн озо в Даже в реальной жизни, когда речь идет о каком-либо экспертном заклю- чении, можно говорить об этих этапах. Прежде чем давать заключения, прогнозы, эксперт длительное время учится принимать правильные решения, изучает закономерности в интересующей его прикладной области и т. п. С точки зрения «1С:Предприятия» в качестве такого эксперта выступает модель прогноза. Данный объект может быть получен только на осно- вании проведенного анализа данных. Можно сказать, что при проведении анализа производится обучение будущей модели прогноза (правильнее сказать, что она создается после проведения анализа на некой анали- тической выборке). После создания модели прогноза в нее может быть передана некая фактическая выборка данных, по которой (на основании закономерностей, полученных во время анализа) будет построен прогноз (рис. 15.27). анализ Рис. 15.27. Схема прогнозирования Создание модели прогноза доступно для всех типов анализа, за исключе- нием общей статистики. Поставим задачу - определить рекомендуемый товар клиенту, который подобрал уже какой-то набор номенклатурных позиций. В конфигурации «Анализ данных», прилагающейся к книге на компакт- диске, в обработке Анализ данных и прогнозирование реализован пример прогнозирования данных на основе двух моделей прогноза по анализу данных розничных продаж Поиск ассоциаций и Поиск последовательностей. Разберем подробно первую модель прогноза. Получение модели прогноза производится на закладке Анализ данных, при нажатии кнопки Поиск ассоциаций. При этом выполняется анализ (поиск ассоциаций), направленный на выявление одновременно закупаемых позиций (рис. 15.28). те
Гл~аваУ15!УА'нализУданн£|х4и1прогнозир'ование' 'JS1 Л Л Анализ даншх и прогнозирование-Конфигурация (ЮПреолриятие) ©I Чв) Li л' S) ЛИ jil ~ - О X Анализ данных и прогнозирование Все действия» АнатзАвгвшх Прогнозирование Общая статистика Поиск ассоциаций Поиск последовательностей Дерево решений Кластерный анализ Результат: Поиск ассоциативных правил ' - Параметры анализа hHiwawinjii процент случаев: 10 ЪЫнимагъная достоверность: 60 Жмшшъная энечшость: О Отсечение правил: Избыточные - Колонки источника данных - Входные колонки |Мме кодон»* |Типдениых I Номенклатура |дискретный | - Информация о данных «отчество элементов: 12 «отчество объектов: 11 Среднее количество элементов в объекте: 1 fi2 - Результат анализа Найдено часто встречав**» групп: 1 Найдено ессофативных правил: 2 - Часто встречаемые группы He iKomrtecnto случаев [Процент с*>чеев Состав ____________________________________ - 1| 21 16,16 Нометлатура Стол кухс* ый раскладной_ Нометлатура Табурет прямоугольный - Ассоциативные правила Рис. 15.28. Обработка «Анализ данных и прогнозирование» Из обработчика нажатия кнопки Поиск ассоциаций вызывается серверная процедура АнализПоискАссоциаций(), листинг 15.13, в которой выпол- няется поиск ассоциативных правил. Более подробно данный вопрос рассматривался в разделе «Тип анализа «Поиск ассоциаций», стр. 106. После выполнения анализа создается модель прогноза и сохраняется в реквизите Модель типа ХранилищеЗначения предопределенного элемента (ПродажаТоваров) справочника МоделиПрогноза. Листинг 15.13. Получение модели прогноза &НаСервереБез Контекста Функция АнализПоискАссоциаций() Анализ = Новый АнализДанных; Анализ. Тип Анализа = Тип("АнализДанныхПоискАссоциаций“); Запрос = Новый Запрос; Запрос.Текст =’ [ВЫБРАТЬ
| ПродажиОбороты. Регистратор, I ПродажиОбороты.Номенклатура |ИЗ | РегистрНакопления.ПродажиПоискАссоциаций КАК ПродажиОбороты”; Анализ.ИсточникДанных = Запрос.Выполнить(); РезультатАнализа = Анализ.Выполнить(); МодельПрогноза = РезультатАнализа.СоздатьМодельПрогноза(); II Сохранение модели прогноза в предопределенном элементе справочника. Объект = Справочники.МоделиПрогноза.ПродажаТоваров.ПолучитьОбъект(); Объект.Модель = Новый ХранилищеЗначения(МодельПрогноза); Объект.3аписать(); Построитель = Новый ПостроительОтчетаАнапизаДанных(); Построитель.Макет = Неопределено; Построитель.ТилАнапиза = Тип("АнализДанныхПоискАссоциаций"); ТабДок = Новый ТабличныйДокумент; Построитель.Вывести(РезультатАнализа, Т абДок); Возврат ТабДок; КонецФункции Сам прогноз осуществляется на закладке Прогнозирование, при нажатии кнопки Получить прогноз ассоциаций. При этом выбирается документ, данные которого (табличная часть Состав, в которой определен реквизит Номенклатура) будут служить источником данных для модели прогноза (рис. 15.29). Рис. 15.29. Обработка «Анализданных и прогнозирование» Профессиональная разработка в системе «1С:Предприятие 8»
Из обработчика нажатия кнопки Получить прогноз ассоциаций (листинг 15.14) вызывается серверная процедура ПолучитьПрогнозПо- искАссоциаций(), листинг 15.15, в которой сохраненная ранее модель получается из реквизита справочника, выполняется прогноз и данными прогноза заполняется реквизит РезультатПрогноза типа ТаблицаЗначений, отображаемый в форме. Листинг 15.14. Получение прогноза &НаКлиенте Процедура ПолучитьПрогноз(Команда) ПолучитьПрогнозПоискАссоциаций(); Если РезультатПрогноза.Количество() = 0 Тогда Предулреждение("Предложений нет"); КонецЕсли; КонецПроцедуры Листинг 15.15. Пример прогнозирования &НаСервере Процедура ПолучитьПрогнозПоискАссоциаций() РезультатПрогноза.Очистить(); МодельПрогноза = Справочники.МоделиПрогноза.ПродажаТоваров.Модель.Получить(); ДокументОбъект = ДокументСсыпка.ПолучитьОбъект(); Если МодельПрогноза <> Неопределено Тогда МодельПрогноза.ИсточникДанных = ДокументОбъект.Состав.Выгрузить(); МодельПрогноза.Колонки Результата.Очистить(); МодельПрогноза.КолонкиРезультата.Добавить(МодельПрогноза.Колонки.Найти( "Следствие", ТилКолонкиМоделиПрогноза.Прогнозируемая)); МодельПрогноза.Колонки Результата.Добавить(МодельПрогноза.Колонки.Найти( "Достоверность”, Т ипКолонкиМрделиПрогноза.Прогнозируемая)); ТЗРезультатаПрогноза = МодельПрогноза.Выполнить(); Если ТЗРезультатаПрогноза.КопичествоО > 0 Тогда Для Каждого Строка Из ТЗРезультатаПрогноза Цикл НоваяСтрока = РезультатПрогноза.Добавить(); НоваяСтрока.Следствие = Строка.Следствие; НоваяСтрока.Достоверность = Строка.Достоверность; КонецЦикла; КонецЕсли; КонецЕсли; КонецПроцедуры Том 2
В результате в таблице формы содержится прогноз, какой товар чаще всего закупается совместно с теми, которые уже выбрал покупатель. Из рис. 15.29 видно, что, выбрав в качестве источника данных для прогноза документ, содержащий две номенклатурные позиции - Стол кухонный раскладной и Табурет круглый, на основе ассоциативных правил, содержащихся в модели прогноза, получаем предложение добавить в список товаров номенклатурную позицию Табурет прямо- угольный, которую покупатели купят с достоверностью 66,67 %. Модель прогноза Модель прогноза обладает определенными свойствами, с помощью которых можно управлять проводимым прогнозом. При работе с коллекцией колонок Колонки можно указывать следующие типы колонок (значение системного перечисления ТипКолонкиМоде- лиПрогноза): в Входная, в КолонкаИсточникаДанных, в Прогнозируемая. Следует отметить, что для кластерного анализа в коллекции Колонки опре- делено свойство ДополнительныеПараметры (определяется вес колонки и значение нормализации). Коллекция НастройкаВхрдныхКолонок содержит описание соответствия колонок источника данных (по которому строится прогноз) колонкам модели прогноза. Коллекция КолонкиРезультата содержит колонки, выводимые в результат прогноза. Пример работы с данными колонками приведен в листинге 15.16. Листинг 15.16. Пример работы с колонками модели прогноза МодельПрогноза.КолонкиРезультата .Добавить) МодельПрогноза.Колонки.Найти(”Следствие", ТипКолонкиМоделиПрогноза.Прогнозируемая)); МодельПрогноза.КолонкиРезультата Добавить) МодельПрогноза.Колонки.Найти("Достоверность", ТипКолонкиМоделиПрогноза. Прогнозируемая));
Гл аваЛ15лАнал изтданн t^ix< итп рогнози рованиё1 m
Профессиональная разработка в системе «1С:Предприятие 8»
Глава 16. Сложные аналитические отчеты УСТРОЙСТВО СИСТЕМЫ КОМПОНОВКИ ДАННЫХ В данном разделе описывается общее устройство системы компоновки данных, рассматривается последовательность и назначение каждого этапа компоновки. Подробно описываются все составляющие схемы компо- новки данных, структура отчета и его настроек. Система компоновки данных - мощный и гибкий инструмент для создания отчетов на основе их декларативного описания. Исполь- зование декларативного описания отчетов позволяет реализовать следующие возможности: в создание отчета без программирования, в возможность создания различных вариантов отчета, в возможность задания различных вариантов пользовательских настроек, в использование автоматически генерируемых форм просмотра и настройки отчета, в разбиение исполнения отчета на этапы, в исполнение отдельных этапов построения отчета на различных компьютерах, в независимое использование отдельных частей системы компоновки данных, в программное влияние на процесс выполнения отчета, в настройки структуры отчета, в совмещение в отчете нескольких таблиц, в создание вложенных отчетов и др. Система компоновки данных состоит из набора элементов, каждый из которых имеет свое декларативное описание, возможность програм- много доступа и сериализации, то есть сохранения в XML или загрузки из XML. Это позволяет гибко управлять всеми этапами выполнения отчета. Формирование отчета с использованием системы компоновки данных разбивается на несколько этапов. При этом разбиение на этапы - не логи- ческое, а физическое. То есть в каждый из этих этапов разработчик может вмешаться, программно или визуально, выполнить различные этапы компоновки данных в различных модулях и даже на различных компью- терах (рис. 16.1). Том 2
Компоновщик макета | Схема I компоновш 1 данных Процессор компоновки данных X_________ ИБ Результирующий документ ___________ Рис. 16.1. Схема взаимодействия объектов системы компоновки данных На схеме представлены следующие этапы формирования отчета. Разработчик создает схему компоновки данных и стандартные настройки компоновки, которые содержат полную информацию о компоновке. 1. На основе схемы компоновки данных и настроек компоновки компо- новщик макета создает макет компоновки данных, который является уже готовым заданием для процессора компоновки. 2. Процессор компоновки данных в соответствии с макетом компоновки извлекает данные из информационной базы, агрегирует, оформляет эти данные и формирует результат компоновки. Результат компоновки состоит из массива элементов, которые можно получать последова- тельно, но в большинстве случаев результат компоновки получается целиком. 3. Процессор вывода обрабатывает результат компоновки и выводит его в различные форматы: □ табличный документ, □ HTML-документ, □ таблица значений, □ дерево значений. Процесс разработки отчета с помощью системы компоновки данных и его дальнейшего использования на практике реализуется следующим образом.
Исходя из прикладной задачи, для которой разрабатывается отчет, разра- ботчик создает схему компоновки данных, в которой описывает наборы данных, связи между ними, определяет поля отчета, параметры полу- чения данных и т. п., а также задает стандартные настройки компоновки данных - структуру отчета, порядок, отбор и другие. У каждого отчета разработчик может предусмотреть несколько вариантов настроек, представляющих данные в виде диаграммы, таблицы или груп- пировок, имеющих различный состав полей, итогов и т.п. Разработчик может описать, какие настройки отчета будут доступны пользователю (пользовательские настройки) и какие из этих настроек будут присутс- твовать прямо в форме отчета (быстрые пользовательские настройки). С их помощью пользователь может настроить вариант отчета под себя и сохранить его для дальнейшего использования. Пользователь запускает отчет. При его формировании выполняется программная компоновка данных и вывод результатов компоновки поль- зователю. Данные в отчете выводятся в соответствии со стандартными настройками для основного варианта отчета. Пользователь может выбрать вариант отчета, являющийся с его точки зрения наиболее информативным, а может, при желании и соответству- ющей квалификации, задать собственные настройки и получить другой отчет, основанный на той же схеме компоновки данных. При этом данные будут представлены в соответствии с пользовательскими настройками. Таким образом, на основе одной схемы компоновки данных может быть получено множество различных отчетов. Применение настроек компо- новки данных, созданных разработчиком или измененных пользователем, к схеме компоновки данных и определяет конечный результат. Этот процесс может быть представлен с помощью следующей схемы (рис. 16.2). Пользователь Рис. 16.2. Схема разработки и использования отчета с помощью системы компоновки данных
Схема компоновки данных Основой для компоновки отчета является схема компоновки данных. Создание схемы компоновки данных может быть выполнено: в визуально при помощи конструктора схемы компоновки данных; в визуально при помощи любого редактора, позволяющего редактиро- вать текст XML; в программно при помощи объектов встроенного языка системы «1 С:Предприятие». Схема компоновки данных содержит следующие разделы: в наборы данных, в связи наборов данных, в вычисляемые поля, в ресурсы, в параметры, в макеты, в вложенные схемы, в настройки. Наборы данных Наборы данных являются источниками данных для отчета и описывают способ получения этих данных. Данные можно получить из информаци- онной базы или из некоторых объектов, находящихся в памяти (например, из таблицы значений). Один отчет может использовать одновременно несколько наборов данных, отбирая, объединяя и связывая между собой данные из разных наборов. Существуют различные виды наборов данных. Они отличаются тем, откуда получаются данные и как эти данные обрабатываются: в Запрос - содержит запрос к базе данных на языке запросов с использо- ванием дополнительных синтаксических элементов (расширений); в Объект - содержит информацию о внешнем наборе данных, например, таблице значений; в Объединение - объединяет информацию из нескольких наборов данных. Разработчик, создавая схему компоновки данных, может добавить в нее наборы данных такого вида и в таком количестве, которые ему необхо- димы. В зависимости от вида набора данных нужно выполнить различные действия для того, чтобы отчет мог использовать данные этого набора. Например, если используется набор данных - запрос, то в схеме компоновки данных нужно задать текст запроса, обращающегося Профессиональная разработка в системе «1С:Предприятие 8»
к информационной базе «1С:Предприятия». Если используется набор данных - объект, то в схеме компоновки нужно описать поля этого набора данных, чтобы система компоновки знала, данные какого типа будут получены из этого набора, затем с помощью встроенного языка создать внешний набор данных и инициализировать им процессор компоновки данных. Если используется набор данных - объединение, то в схеме компоновки данных нужно описать наборы данных, которые входят в это объединение. ПОДРОБНЕЕ Типичные сценарии использования наборов данных содержатся в первых четырех примерах раздела «Примеры разработки отчетов», стр. 131. Связи наборов данных Схема компоновки данных может содержать несколько наборов данных. В случае, когда требуется получить связанную информацию из этих наборов, в схеме компоновки данных описывается их связь по какому-то полю. При связывании наборов данных в схеме компоновки используется Левое соединение. Однако в случае, если требуется вывести в отчет все записи из обоих наборов данных, используется набор данных - объединение. Такой набор содержит два или более подчиненных набора данных, но информация в них не связывается, а объединяется. По аналогии с языком запросов в этом случае используется Объединение. ПОДРОБНЕЕ Отличие связывания и объединения наборов данных рассматривается в разделе «Примеры разработки отчетов», стр. 131. Вычисляемые поля Отчет может содержать не только те поля, которые описаны в наборе данных, но и дополнительные поля, созданные разработчиком и вычисляющиеся на их основе (стр. 283). Значения этих полей получа- ются в результате вычисления выражений, написанных разработчиком в схеме компоновки данных, или в результате выполнения функций, описанных в общих модулях конфигурации. В приведенном примере выводится вычисляемое поле Прибыль как разница между полями СтоимостьПриход и СтоимостьРасход (рис. 16.3). Том 2
Устройство1системй11компон6вкиРданнй1х Продажа системных блоков Параметры: Немало периода: 01.12.2011 Конец периода: 31.122011 Склад_ _ Системный блок Основной__________ Компьютер для дома Компьютер для офиса Итого Количество Количество Конечный Стоимость Стоимость / Приход________Расход_______остаток Приход Рвсход 2 2 17 500Д10 20 0004)0 9000,00 8 500,00 17 5004)0 1рнбыль 2 500,00 10 000JX 1 000,00 ЮОООД ' 1 500,00 20 000J10K 2 500w 2 2 Рис. 16.3. Вывод в отчете вычисляемого поля Ресурсы При исполнении отчета с помощью системы компоновки данных из источника данных, например из информационной базы данных, извле- каются данные для отчета. В базе данных они представлены в виде таблиц. Соответственно, все эти данные можно построчно вывести в отчет. Это детальные записи. Но поскольку, как правило, эти данные привязаны к некоторым иерархическим данным (например, в отчет выводятся остатки номенклатуры, где номенклатура содержит много- уровневые группы), то возникает желание сгруппировать записи в отчете и показать остатки номенклатуры по группам (например, сколько на складе телевизоров определенной марки и сколько телевизоров в целом). Для этого система компоновки данных может рассчитывать и добавлять в отчет записи, которые называются итоговыми. Этих записей в явном виде нет в базе данных, но они получаются в результате исполнения отчета, на основании некоторой обработки детальных записей, которую выполняет система компоновки данных. Эти групповые итоговые данные называются ресурсами схемы компо- новки данных (стр. 290). Обычно данные в отчете группируются по каким-то позициям, например по номенклатуре. Смысл группи- ровки не только в определенном расположении данных, но и в выводе итоговых данных - ресурсов по этой группировке. На основании значений ресурсов формируются общие итоги отчета. В приведенном примере детальные записи группируются по складам и выводятся групповые и общие итоги отчета (рис. 16.4). Остатки номенклатуры Склад Номенклатура WM Начальный остаток НИ I Конечный! I остаток Основной С 13,00» 9,»00 мое Материнская плата 5,000 3,000 2,000 Память 5,000 3,000 2,000 Жесткий диск 3.000 3.000 Розничный С 24,00» 7,»00 17,Мб Монитор LCD 4,000 2,000 2,000 Веб-камера 10,000 3,000 7,000 Микрофон 10,000 2,000 8,000 :• 37.000 I— 16.000 21.000; Рис. 16.4. Вывод ресурсов в группировке
Глава116пСложнй1еТаналитическиеТоъчет^1 В таблице ресурсы выводятся как бы на пересечении соответству- ющей строки и колонки таблицы, например остатки конкретного товара на конкретном складе. В приведенном примере в отчет выводится таблица, в которой в колонках данные сгруппированы по складам, а в строках - по номенклатуре (рис. 16.5). Номенклатура Основной Розничный • Итого Приход Расход Конечный Приход Расход) Конечный Приход Расход Конечный ____________________________________остаток у остаток ____________________остаток Веб-камера -- ———И ю дю 3,Mfi fpoo 10,000 3,000 7,000 Жесткий диск ЗЛ00 ЗЛ00 3,000 3,000 Материнская плата I 5.000 3,000 2 ДЮ 5,000 3,000 2,000 Микрофон 10.000 2000 8 Л00 10,000 2 ЛОО В,000 Монитор LCD 4.000 2.000 2 ЛОО 4,000 2 ЛОО 2,000 Память 5,000 3,000 2Д00 5.000 злоо 2Л00 Итого 13,000 9 Л00 4 Л00 24 Л00 7 Л00 17JOOO 37,000 16,000 21 Л00| Рис. 16.5. Вывод ресурсов в таблице Таким образом, для вывода таблиц и диаграмм обязательно опреде- лять ресурсы для отчета. Отчет, выводящий данные в группировку, может и не содержать ресурсов. Например, в случае вывода простых списков, когда групповые итоги не нужны. Параметры Параметры являются критериями получения данных для отчета (стр. 292). Параметры могут быть явно определены в запросе, например вид номенклатуры (&ВидНоменклатуры), а могут быть пара- метрами виртуальных таблиц базы данных, например начало и конец отчетного периода. Как правило, параметры выводятся пользователю перед формированием отчета. Затем заданные пользователем значения параметров передаются в отчет, и отчет формируется заново, например с новым отчетным периодом (рис. 16.6). @ W Отчет по системам блокам • Демонстрационная к... (1С:Предпрмягие) iinl |_Д Ё П<1 '311 М М* М" - - □ X Рис. 16.6. Вывод в отчете параметров отчетного периода
Макеты По умолчанию внешний вид отчета формируется системой автома- тически. Но разработчик может задать собственное расположение и оформление различных областей отчета. Для этого в схеме компо- новки данных создаются предопределенные макеты (стр. 295). В отличие от стандартных макетов оформления, предопределенные макеты привя- заны к одному отчету, его конкретным полям и структуре. Можно создавать макеты отдельных полей, группировок, итоговых полей и ресурсов отчета. В приведенном примере группировка по номенклатуре оформлена с помощью предопределенного макета (рис. 16.7). Склад '13.000 ' Начальный Приход Расход Конечный остаток остаток Жесткий диск 3 3 Материнская плата 5 3 2 Память 5 3 2 Розничный И.ЯИ ?,вм 1?,ВВ6 5? .ОМ1 1В.М0 3 2 2 WT 10| 4! 'Веб-камера Микрофон Монитор LCD Итого Ж Рис. 16.7. Макет группировки «Номенклатура» Вложенные схемы Часто бывает нужно использовать данные одного отчета внутри другого. Разработав схему компоновки одного отчета, можно затем многократно использовать ее в других отчетах, связав родительский и вложенный отчеты по общему полю. В приведенном примере выводится список контрагентов с вложенными данными по продажам номенклатуры для каждого из них (рис. 16.8). Контрагент ООО "Атлант" 9000,00 100,00 100,00 9 600,00 4000,00 100,60 ___________100,00 44,44 44,44 5 000,00 55,56 55,56 Рис. 16.8. Вывод вложенного отчета Профессиональная разработка в системе «1С:Предприятие 8»
ПОДРОБНЕЕ Пример использования вложенного отчета рассматривается в разделе «Примеры разработки отчетов», стр. 191. Настройки В схеме компоновки данных разработчик задает стандартные настройки, которые определяют, как первоначально будет выглядеть отчет, опре- деляет его иерархическую структуру и настройки как отчета в целом, так и его отдельных элементов. Практически то же самое окно настроек, что и в схеме компоновки данных, будет доступно и пользователю при исполнении отчета в режиме 1С:Предприятие по команде Все действия ► Изменить вариант... Но пользо- ваться этим окном рекомендуется лишь очень опытному пользователю, понимающему, что он делает. Иерархическая структура отчета состоит из следующих элементов: в Группировка - предназначена для вывода информации в виде обычного линейного отчета (рис. 16.9). Список номенклатуры на складах Номенклатура .Склад1 Монитор LCD______ Веб-камера_______ Микрофон_________ Материнская плата Память___________ Жесткий диск Розничный Розничный Розничный Основной Основной Основной ||ЦПШЦ4 ИП!1ШМ.11 ___________ШЯ1____1 Итого 4,000 10,000 10,000 5,000 5,000 3,000 2 ЛОО 3,000 2 ЛОО 3,000 злоо 3,000 2 ЛОО 7 ЛОО В ЛОО 2 ЛОО 2 ЛОО 37,000 16,000. 21,000 Рис. 16.9. Вывод группировки в Таблица - предназначена для вывода информации в виде таблицы (рис. 16.10). Остатки номенклатуры Номенклатура Основной Приход Расход Конечный остаток Розничный Приход Расход Конечный остаток Итого Приход Расход Конечный остаток Веб-камера 10 лоо 3,000 7,000 10,000 злоо 7,000 Жесткий диск Материнская плата злоо 5,000 злоо злоо 2Д00 3,000 5,000 злоо злоо 2,000 Микрофон ю лоо 2,000 В,ООО 10,000 2 ЛОО В,ООО Монитор LCD 4,000 2,000 2,000 4,000 2 ЛОО 2,000 Память 5 Л00 зда 2,000 5,000 злоо 2,000 Итого 13,000 9 Л00 4 Л00 24,000 7,000 17 ЛОО 37,000 16,000 21 ДЮ Рис. 16.10. Вывод таблицы в Диаграмма - предназначена для вывода информации в виде диаграммы (рис. 16.11). Том 2
Устройство1системй11компон6вкиРданнй1х 11 Рис. 16.11. Вывод диаграммы в Вложенный отчет - предназначен для вывода вложенного отчета (см. рис. 16.8). На первый взгляд элементы структуры отчета Группировка и Таблица похожи. Но в таблице информация группируется по строкам и по столбцам, а на их пересечении выводятся групповые итоговые данные - ресурсы. А также рассчитываются общие итоги по вертикали и горизонтали. В группировке данные группируются по строкам, и общие итоги рассчи- тываются только по вертикали. Группировку можно вывести в табличном виде (горизонтально), а можно - в виде вертикального списка. Для каждого элемента структуры отчета и для всего отчета в целом сущес- твуют следующие элементы настроек: в Выбранные поля - с помощью этого элемента настроек разработчик или пользователь может определить список полей, выводящихся в отчет (рис. 16.12). Параметры | Выбранные поля | Отбор Сортировка Условное оФормле... Пользовательские... Драгие настройки Доступные поля <+'= = Склад J КоличествоКонечныйОстаток <t' J КоличествоНачальныйОсгагок •:t> J КоличествоПриход J КоличествоРасход +• Сэ СиствмнывПоля +• Сэ ПараметрыДанных Поле 0 = Склад 0 J КоличествоНачальныйОсгеток ® J КоличествоПриход 0 J КоличествоРасход J КоличествоКонечныйОстаток Рис. 16.12. Настройка списка полей отчета 'Ш
Глава116пСложнй1еТаналитическиеТоъчет^1 в Отбор - с помощью этого элемента настроек разработчик или поль- зователь может определить условия фильтрации записей в отчете (рис. 16.13). Поля группировки Выбранные поля I Отбор I Сортировка Условное оформление Другие настройки Доступные поля +* о +' = Склад + <1 КоличествоКонечныйОстаток + <1 КоличествоНачальныйОстаток * <1 КоличествоПриход * <1 КоличествоРасход ♦ ' □ СистемныеПоля ♦ ' □ ПараметрыДанных Левое значение Вид сравнения Правоезнач... Примен... П... т Отбоо та J BESmSESSBSSa Больше 1.000 Обычное Рис. 16.13. Настройка отбора в Порядок - с помощью этого элемента настроек разработчик или поль- зователь может определить порядок записей в отчете (рис. 16.14). Поля группировки Выбранные поля Отбор | Сортировка | Условное оформление Другие настройки Доступные поля Поле Направление сортцюеки + о ’«□1 -.и-;Г|-та По убьва!ио 5 * А * А * А *. А Склад КоличествоКонечныйОстаток КоличествоНачальныйОстаток КоличествоПриход КоличествоРасход Рис. 16.14. Настройка сортировки в Параметры - с помощью этого элемента настроек разработчик или пользователь может задать значения параметров отчета (рис. 16.15). Параметры | Выбранные поля Отбор Сортировка Условное оформле-.. Пользовательские... Другие настройки □ Отображать недоступные параметры (устанавливать значения недоступных параметров не рекомендуется) Параметр Значение Дета 0 Начало периода Произвольная дата /51.02.20120:00:00 > 0 Конец периода П роизвогьная дата Я а 5S Рис. 16.15. Настройка параметров данных в Пользовательские поля - с помощью этого элемента настроек пользова- тель может создать собственные дополнительные поля (рис. 16.16). Параметры Выбранные поля Отбор Сортировка Условное оформле... | Пользовательские... | Другие настройки Рис. 16.16. Создание пользовательских полей
в Условное оформление - с помощью этого элемента настроек разра- ботчик или пользователь может задать условия оформления записей в отчете (рис. 16.17). Поля группировки Выбранные поля Отбор Сортировка | Условное оформление | Другие настройки Рис. 16.17. Настройка условного оформления в Другие настройки - с помощью этого элемента настроек разработчик или пользователь может задать значения параметров вывода, таких как макет оформления, заголовок, расположение итогов и др. (рис. 16.18). Поля группировки Выбранные поля Отбор Сортировка Условное оформление I Другие настройки Параметр Макет оформлешя □ Количество записей □ Процент засмсей □ Тип макета □ Расположение итогов □ Расположение полей группировок □ Расположение группировок О Расположение реквизитов Авто Авто Вместе Начало Вместе с владельцем Рис. 16.18. Настройка параметров вывода В следующем разделе познакомимся с настройками подробнее на примере конкретного отчета. Пример изменения настроек Отчет, полученный с помощью системы компоновки данных, представ- ляет собой сложную иерархическую структуру, куда входят и простые линейные записи, и группировки, и таблицы, и диаграммы. Например, отчет Остатки номенклатуры имеет такой вид (рис. 16.19). Структура отчета, созданная разработчиком, имеет вид как на рис. 16.20. В верхней таблице окна результата отчета представлены обычные детальные записи, полученные из информационной базы данных. Для вывода детальных записей используется элемент структуры отчета Группировка, но без указания поля группировки. Когда поле группировки указано, записи в отчете группируются по нему без более подробной детализации. Обычно это делается для вывода промежуточных групповых итогов. Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 16.19. Отчет «Остатки номенклатуры», первоначально настроенный разработчиком Структура отчета е- Q] 0“° < Детальные записю г 002 Таблица - Строки 0Ш Номенклатура •- Колонки 0“ Склад г- 0|Ц Диаграмма -• Точки 0“ Склад Серии 0“= Номенклатура Рис. 16.20. Структура отчета в окне настроек Том 2
Устройство1системй11компон6вкиРданнй1х Создадим новую группировку отчета. Для этого выделим корневой элемент Отчет в структуре элементов отчета, нажмем кнопку Добавить в командной панели окна настроек, добавим новую группировку и укажем поле группировки Склад. Сравним ее с группировкой Детальные записи (рис. 16.21, 16.22). Структура отчета a Di» gon <Детальные записи> -QB] Таблица - Строки 0™ Номенклатура - Колонки 0™ Склад -©U Диаграмма ~ Точки 0™ Склад -• Серии 0е111 Номенклатура Рис. 16.21. Выбор поля группировки Остатки номенклатуры Вариант отчета: [новый вариант) | Выбрать вариант... | | |> Сформировать |i Qq Настройка... Все действия» i (?) Остатки номенклатуры Номенклатура Микрофон Веб-камера Монитор LCD Матерюсхая плата Память Жесткий диск Итого Розжчньм Розжчньм Розжчньм Основной Основной Основной ------------------------I 10,000 2,000 B.000 10,000 3,000 7,000 4,000 5,000 5,000 3,000 2,000 3,000 3,000 3,000 2,000 2,000 2,000 37,000 16,000 21,000 Рис. 16.22. Детальные данные отчета «Остатки номенклатуры» и данные, сгруппированные по складам Мы видим, что в нижней группировке (Склад) присутствуют только две записи, то есть данные в отчете сгруппированы по складам. Однако это не таблица, а группировка, представленная в табличном виде. Если задать значение параметра вывода Тип макета - Вертикально, то те же данные будут представлены в виде вертикального списка (рис. 16.23). U2®
Глава116пСложнй1еТаналитическиеТоъчет^1 Рис. 16.23. Данные отчета «Остатки номенклатуры», сгруппированные по скледам, представленные в виде вертикального списка В средней части отчета (см. рис. 16.19) находится элемент структуры отчета Таблица, где по строкам данные группируются по полю Номен- клатура, а по столбцам - по полю Склад. На пересечении строк и столбцов, в ячейках таблицы находятся групповые итоговые данные - ресурсы, например, остаток конкретного товара на конкретном складе. Таким образом, элемент структуры отчета Таблица используется в случае, если требуется различным образом сгруппировать информацию по строкам и по столбцам, на их пересечении вывести итоговые данные, а также вывести общие итоги по вертикали и горизонтали. В других случаях не имеет смысла создавать таблицу, а можно воспользоваться группировкой. В нее можно вложить подчиненную ей группировку. Добавим в группировку Склад вложенную группировку по полю Номен- клатура. Для этого выделим группировку Склад в структуре элементов отчета, нажмем кнопку Добавить в командной панели окна настроек, добавим новую группировку и укажем поле группировки Номенклатура (рис. 16.24). Структура отчета Ц] Отчет 0“= Склад_____________ 0 ™ •8 0® Таблица г Строки 0е111 Номенклатура т Колонки 0™ Склад +: Olli Диаграмма @ Группировка-Демонстрац... (1С:Предпрмягие) X Г руппировка Поле:[Номенклатура... Х| Тип: | Без иерархии„.I | ОК | Отмена (?) Рис. 16.24. Добавление вложенной группировки «Номенклатура» в группировку «Склад»
В нижней части отчета (см. рис. 16.19) находится Диаграмма, которая служит для более наглядного графического представления данных. В режиме 1С:Предприятие командой Все действия к Изменить вариант... пользователь может изменить настройки отчета, его структуру, отбор, упорядочивание записей, оформление и т.п. Настройки отчета могут относиться как ко всему отчету в целом, так и к его отдельным элементам - группировкам, таблицам, диаграммам (стр. 138). Например, пользователь может для элемента отчета Номенклатура установить сортировку по полю Конечный остаток. У каждого элемента настроек есть признак использования в отчете - флажок слева от его названия. Допустим, пользователь не хочет видеть в отчете диаграмму. Для этого достаточно просто снять флажок использования у данного элемента структуры отчета. Аналогично можно отключить в настройках любое поле, отбор, параметр и т.п. В результате сделанных изменений настройки отчета примут вид (рис. 16.25). @ Вариант "Новьй вариант" отчета "Остатки номенклатуры" • Демонстрационная конфигурация "Система компоновки дшмых" (1СПреаприятие( X Вариант "Новый вариант" отчета "Остатки номенклатуры" Добавить । [J । X I О' Q IIJ3S £8 Все действия * Все действия Йх| Парапет... Гн1 Погьзов... fflj Группиру... Поля Qyl Отбор | пЬн Сортира.. | gfi Условно... ftjj Дополни.. 0Т екущий элемент имеет собственную сортировку (для упорядочивания записей, выводимых в элемента) Выбрать В се действия’ (^Добавитьновыйэлементпорядка i Доступные поля Склад Конечный остаток Начальный остаток Приход Расход Поле Направление сортировки | Завершить редактирование | Отмена i Все действия* i (?) Рис. 16.25. Окно для редактирования пользовательских настроек Выполнение отчета с новыми настройками даст следующий результат (рис. 16.26). Очевидно, что обе таблицы очень схожи между собой. Но поскольку первая таблица представляет собой результат вывода группировки Склад и вложенной в нее группировки Номенклатура, то данные в ней группиру- ются только по строкам, и общие итоги выводятся только по вертикали. В соответствии с новыми настройками записи первой таблицы внутри группировки Номенклатура отсортированы по возрастанию поля Конечный остаток, и диаграмма в отчет не выводится. Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 16.26. Изменение отчета с помощью пользовательских настроек Помимо изменения стандартных настроек в основном варианте отчета пользователь может создать собственный вариант настроек (стр. 136) и затем сохранить его (Все действия ► Сохранить вариант). Например, можно переместить диаграмму в новый вариант отчета, затем перед формированием отчета выбрать этот вариант, нажав кнопку Выбрать вариант..., и получить отчет, содержащий только диаграмму остатков номенклатуры. Однако следует иметь в виду, что окно полных настроек отчета, вызыва- емое по команде Все действия к Изменить вариант..., предназначено лишь для хорошо подготовленного, опытного пользователя. Для большинства же пользователей следует помещать необходимые им настройки в состав пользовательских настроек, которые будут доступны в отдельном окне по команде Настройка. При этом наиболее часто используемые настройки должны быть быстрыми, то есть располагаться непосредственно в отчетной форме (стр. 164). При этом для каждого варианта отчета пользователь может создать свои комбинации пользовательских настроек и сохранить их для дальнейшего использования (Все действия ► Сохранить настройку...). Затем пользователь может вернуться к этим настройкам, выполнив команду Все действия ► Выбрать настройку... ВНИМАНИЕ! Сохранение и последующая загрузка пользовательских настроек очень удобны для пользователя, потому что ему не приходится каждый раз редактировать настройки вручную. Однако пользователь может выби- рать только те настройки, которые он сам сохранил. Том 2
ПРИМЕРЫ РАЗРАБОТКИ ОТЧЕТОВ Данный раздел содержит набор практических примеров, основанных на реальных задачах. Он будет полезен как для начинающих разработ- чиков, так и для специалистов, желающих углубить свои знания и навыки по разработке отчетов с помощью системы компоновки данных. Исходные данные для примеров Разрабатываемые нами отчеты будут базироваться на данных о хозяйс- твенной деятельности небольшой фирмы, которая оказывает услуги по сборке, ремонту и продаже компьютеров и комплектующих к ним. Приобретение комплектующих отражается в документах ПриходнаяНа- кладная. Предоставление компьютерных услуг, продажа комплектующих и собранных системных блоков отражаются в документах РасходнаяНа- кладная. Оба эти документа формируют движения в регистре накопления ОстаткиНоменклатуры, который имеет вид Остатки и содержит два изме- рения - Номенклатура и Склад и ресурсы - Количество и Цена. Сборка готовых системных блоков отражается в документах Сбор- каКомпьютера, который формирует движения типа Приход в регистре накопления СобранныеСБ. Этот регистр имеет вид Остатки и содержит два измерения - СБ и Склад, ресурсы - Количество и Стоимость и реквизит - Мастер. Одновременно при проведении этого документа формируются движения типа Расход в регистре ОстаткиНоменклатуры. Здесь отражаются комплектующие, которые были израсходованы при сборке. Документы РасходнаяНакладная также формируют движения в регистре накопления Продажи. Этот регистр имеет вид Обороты и содержит два измерения - Номенклатура и Контрагент и ресурсы - Количество и Стоимость. Документы ПриходнаяНакладная также формируют движения в регистре сведений Цены. Этот регистр является периодическим и имеет измерение Номенклатура и ресурс Цана. В базе данных также содержится регистр сведений ДополнительныеХарак- теристики для хранения значений характеристик объектов. Этот регистр является непериодическим и имеет два измерения - Объект и ВидХаракте- ристики и ресурс - ЗначениеХарактеристики. Пример 1. Набор данных - запрос Практическое знакомство с системой компоновки данных начнем с простого отчета, целиком реализованного с помощью визуальных средств разработки. В этом примере подробно, шаг за шагом описыва- ются действия разработчика по визуальному конструированию отчета с помощью системы компоновки данных. В следующих примерах эти действия будут лишь кратко перечисляться. Поэтому данный пример
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты будет полезен для новичков, не знакомых с системой компоновки данных, а остальным просто позволит вспомнить некоторые моменты разработки отчетов. После создания отчета мы разработаем другой вариант этого же отчета и на нем покажем возможности настройки отдельных элементов отчета. Итак, разработаем отчет, который будет отражать приход, расход и остатки номенклатуры на складах (рис. 16.27). Номенклатура Основной Розничный Итого Начальный Приход Расход Конечный Начальный Приход Расход Конечный Начальный остаток остаток Приход Расход Конечный остаток остаток остаток остаток Веб-камера 10,000 3,000 7,000 10,000 э.ооо 7,000 Жестом диск 3,000 э.ооо э.ооо 3,000 Матермсмя плата 5,000 3,000 2,000 5,000 3,000 2,000 М«рофон 10,000 2,000 8,000 10,000 2,000 8,000 MowropLCD <1,000 2,000 2,000 4,000 2,000 2,000 Память 5,000 3,000 2,000 5,000 3,000 2,000 Итого 13.000 9 ДЮ 4 ДЮ 24 ДЮ 7,000 17,000 37 ДЮ 16,000 21 ДЮ Рис. 16.27. Требуемый вид отчета ПРИМЕЧАНИЕ Все действия, описанные в этой главе и далее, будут выполняться на демонстрационной конфигурации «Сложные аналитические отчеты», прилагающейся к книге на компакт-диске. Визуальное конструирование Для визуального конструирования отчетов с использованием системы компоновки данных предназначен объект конфигурации Отчет. Выделим в дереве объектов конфигурации ветвь Отчеты и добавим новый отчет. В появившемся окне редактирования назовем отчет ОстаткиНоменклатуры и создадим схему компоновки данных отчета, нажав кнопку Открыть схему компоновки данных или кнопку открытия со значком лупы (рис. 16.28). |М Отчет ОстаткиНоменклатуры - □ X Рис. 16.26. Окно редактирования объекта конфигурации «Отчет»
Так как у нашего отчета еще нет схемы компоновки данных, платформа предложит создать новую схему и откроет конструктор макета. В открыв- шемся окне конструктора макета будет доступен для выбора единственный тип макета - Схема компоновки данных (рис. 16.29). Конструктор макета Имя: Синоним | Основная схема компоновки данных | ai Комментарий: || - Выберите тип макета:---------------- Т абличный документ Т екстовый документ Двоичные данные Active document HTML документ Географическая схема Г рафическая схема (*) Схема компоновки данных Макет оформления компоновки данных Загрузить из файла | Гстооо | | Отмена | | Справка | Рис. 16.29. Конструктор макета Нажмем кнопку Готово. Платформа создаст макет отчета, содержащий схему компоновки данных, которая в дальнейшем будет доступна на закладке свойств отчета Макеты наряду с другими макетами отчета. Затем конструктор макета откроет окно конструктора схемы компоновки данных. В нем происходит основная работа по визуальному конструиро- ванию отчета. Для этого конструктор предоставляет массу разнообразных возможностей. Но мы пока рассмотрим лишь те из них, которые понадо- бятся в нашем отчете. Остальные возможности по мере усложнения будут представлены в других примерах. Любой отчет основывается на данных, извлекаемых из каких-либо источников по определенным условиям и параметрам. Мы рассмотрим наиболее простой случай, когда используется один набор данных. Он будет содержать запрос к базе данных, сформулированный на специ- альном языке - языке запросов. Итак, на закладке Наборы данных добавим новый набор данных - запрос (рис. 16.30). Й Отчет ОстаткиНоменклатуры: ОсноенаяСхемаКомпоновкиДанным Рис. 16.30. Добавление набора данных в окне конструктора схемы компоновки данных Профессиональная разработка в системе «1С:Предприятие 8»
В правом нижнем окне конструктора схемы компоновки данных мы можем создавать и редактировать текст запроса. Текст запроса можно написать вручную, но гораздо проще сделать это с помощью конструктора запроса, нажав кнопку Конструктор запроса (рис. 16.31). Т^1 Отчет ОсгеткиНоменклагуры: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборы данных I Связи наборов д... Вычисляемые п... Ресурсы Параметры Макеты Вложенные схе... Настройки Поля: . 1-2 т Наборыданных ПТ! Поле Путь Заголовок Ограничение поля 1 Роль 1 п... и... Г... и...' Ограничение рек... п... и... г... и... 1 Выражени... Проверка иерархи ' Выражения ' Набор данных упорядочив...' Параметр 1 |> Запрос: £ 5S; Конструктор запроса..?^ I» L5 Н Аэтозаполнение 0 Рис. 16.31. Вызов конструктора запроса Конструктор запроса позволяет визуально конструировать запрос. Даже пользователь, не знакомый с языком запросов, может с помощью конструктора создать синтаксически правильный запрос. Мы пока рассмотрим лишь основную закладку конструктора Таблицы и поля. Остальные возможности по мере усложнения будут представлены в других примерах. Сначала в списке База данных нам нужно выбрать таблицы, с которыми будет работать запрос. Раскроем ветку Регистры накопления, здесь мы видим объектную таблицу ОстаткиНоменклатуры, в которой накапливаются данные об остатках номенклатуры. Ниже нахо- дятся несколько виртуальных таблиц, созданных платформой. Так как в нашем отчете будут отражаться как остатки, так и данные о приходе и расходе номенклатуры, то очевидно нам нужна таблица ОстаткиНоменк- латуры.ОстаткиИОбороты. Выделим ее. ПРИМЕЧАНИЕ Выделенные элементы можно перенести из одного списка в другой перетаскиванием мышью или двойным щелчком на них. Либо можно использовать кнопки Щ I»., i«j. Перенесем выделенную таблицу в список Таблицы. Раскроем ее. Здесь отобразятся все доступные для выбора поля этой таблицы. Затем перенесем в список Поля нужные нам в отчете поля таблицы: в Номенклатура, в Склад, в КоличествоНачальныйОстаток, в КоличествоКонечныйОстаток, Том 2
в КоличествоПриход, в КоличествоРасход. Итак, в результате наших действий окно конструктора запроса примет вид (рис. 16.32). О Каструктор запроса Груптфоака Услвеия Дополнительно Обьеаинентя/Псе... Порядок Компоновка данеях Характеристики Пакет запросов -X База лакеях • г! ОсгапшНоменимгуры-Оборсты ' г! ОстатхмНомемимтуры.Остатки ' г! ОсгатхмНоменимгуры.Осгатк14б • СобрмвыеСС • 3 СобрмвыеСС.Обороты * СобратчлеСС.Остатки___________ е р .•> х и «и Таблицы L. Номенклатура |0статкйнб^^ен|3|атцр5|0статкйи0борот3^о^ёнклатура| т1 Пропажи 'l ПроцажнОборсты J Ксим«стмНача<ы*АОсгвпж J К01М«естмКсне<е*Й)сгвпж J КогмчествоОборот J КолпестасЛрипй J KcuwwcrecPacNoa L. Остап<мНомени1втурыОстатк1440бороты.Склаа J Остап<мНомени1втурыОстатк1440бороты.Ксим«стмНача<ы*АОс J Остап<мНомени1втурыОстатк1440бороты.Ко1М«естмКсне<е*Й)ст J Остап<мНомени1втурыОстатк1440бороты.Ксмм«стасЛри<сп J ОстатхиНомен(лвтурыОстапи410борогь1Коп*<есгэо₽асхоа Запрос Далее > ОК Отмена Справка Рис. 16.32. Выбор данных для запроса Нажмем ОК и вернемся в конструктор схемы компоновки данных (рис. 16.33). й Отчет ОстаткиНоменклатуры: ОсиовнаяСхемаКомпоновкиДанных □ X Наборы данных | Связи наборов дамьи Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы Настройки tffl- X__________________ - Наборы данных Поле Путь Автоэаголовок КоличествоКонечньЛО стагок Ограничение поля 'Роль Выр... Прове; Поле Ус... Гру... Uno... Выр... Набор. ' „ упор.. „ Ограничение реквизита Парам Поле Ус... Гру... Упо... О О О О КонОст, ___О Количество Конечный остаток = КоличествоРасход КоличествоРасход ООО О КоличествоРасход = КоличествоНачальныйОстагок КоличествоНачальныйОстагок ООО О Количество Начальный оста.. = КоличествоПриход КоличествоПриход ООО О КоличествоПриход = Номенклатура Номенклатура ООО О Номенклатура ООО = Склад Склад ООО О Склад ООО О О НачОст, Количество О О Измерение О О Намерение О Автоэапотение 0 Рис. 16.33. Конструктор схемы компоновки данных Итак, мы добавили набор данных - запрос и создали текст запроса, выбирающего данные из информационной базы «1С:Предприятия».
Глава116пСложнй1еТаналитическиеТоъчет^1 Текст запроса отображается в поле Запрос. Здесь его можно вручную отредактировать или снова вызвать Конструктор запроса для внесения в него изменений. Так как свойство Автозаполнение включено, платформа автоматически заполнила список доступных полей текущего набора данных исходя из запроса (стр. 278). Пока мы не будем рассматривать другие возможности конструктора схемы компоновки данных, а приступим к настройке отчета, то есть к формиро- ванию его структуры и внешнего вида. Представим наш отчет в виде таблицы, где по строкам данные группи- руются по позициям номенклатуры, а в колонках - по позициям складов. Групповые итоговые данные - Ресурсы (стр. 290), например остаток конкретного товара на конкретном складе, выводятся в ячейках таблицы. Поэтому для того, чтобы увидеть какие-либо значения в таблице, мы должны определить ресурсы схемы компоновки данных. ВНИМАНИЕ Для всех отчетов, где выводятся итоговые данные по каким-либо груп- пировкам, нужно определить поля ресурсов отчета! Итоговые данные формируются на закладке Ресурсы. На закладке Ресурсы схемы компоновки данных в списке Доступные поля расположены все поля из текущего набора данных отчета. Нажмем кнопку I”., чтобы конструктор выбрал все доступные ресурсы, по которым можно вычислять итоги (рис. 16.34). Т^1 Отчет ОстаткмНоменклатуры: ОсновнаяСхемаКомпеновкиДанньш - □ X Наборыданных Связи наборов... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные сх... Настройки I Выражение Рассчитывать по... С«рма(КоличествоКонеч№йОстаток) Доступные поля ^3 КоличествоКонечныйОстаток1 Поле = КотчесгеоКонечшйОстаг... = КоличестеоНачальныйОетаток = КотычествоПрихсп = КоличесгеоРасхм ° Номенклатура в Склеп 00 КошчествоНачальныйОст... С«рима(КоличествоНачальныйОстаток) = КодачествоПрихсц = Ко/мчвствоРасхм Суима(КоличествоПрихсц) Сумма[Количест&оРёс>:оа) Среднее(КоличествоРасхап) Макси мум(КоличеетвоРасход) Ми»ымум(КоличествоРасхаа) Количество(КоличествоРасход) Количество(Раэличные КоличветвоРа... Рис. 16.34. Выбор ресурсов отчета ПРИМЕЧАНИЕ Поля в список ресурсов можно перенести из списка доступных полей перетаскиванием мышью или_двойным щелчком на них. Либо можно использовать кнопки 'Л, 0; I21,1«л В колонке Выражение здесь содержится выражение, по которому будет вычисляться значение ресурса. По умолчанию предлагается функция Сумма, но доступны и другие распространенные функции агрегирования данных (см. рис. 16.34).
Теперь перейдем на закладку Настройки и создадим стандартные настройки, определяющие, как будет выводиться информация в отчет. Напомним, что иерархическая структура отчета содержит три основных элемента: в Группировка - для вывода информации в виде обычного линейного отчета; в Таблица - для вывода информации в виде таблицы; в Диаграмма - для вывода информации в виде диаграммы. Выделим корневой элемент Отчет и добавим в него новую таблицу. Для этого нужно нажать кнопку Добавить, расположенную в коман- дной панели окна, или правой кнопкой мыши вызвать контекстное меню элемента Отчет (рис. 16.35). Й Отчет ОетвткиНоможлетдры: ОоновнмСяемаКомпоновкиДмных _ □ X Рис. 16.35. Добавление новой таблицы в отчет В структуре отчета появится элемент Таблица, включающий в себя Строки и Колонки. Выделим элемент Строки и нажмем кнопку Доба- вить в командной панели или клавишу Ins для добавления новой группировки. В появившемся окне выбора поля группировки выберем поле Номенклатура (рис. 16.36). ПРИМЕЧАНИЕ Для выбора поля группировки следует нажать кнопку выбора - в строке Поле и выбрать нужное поле из списка доступных полей. Также можно использовать механизм «ввод по строке» и ввести в строку Поле первые буквы имени поля, а платформа выполнит авто- подстановку. Аналогичным образом в колонки таблицы добавим группировку по полю Склад. Таким образом мы указали, что в строках таблицы данные будут группироваться по позициям номенклатуры, а в колонках - по позициям складов. Профессиональная разработка в системе «1С:Предприятие 8»
Отчет ОстаткиНоменклатуры: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.36. Окно выбора группировки На закладке Выбранные поля перенесем мышью из списка доступных полей поля, которые будут выводиться в отчет: в КоличаствоНачальныйОстаток, в КоличествоПриход, в КоличествоРасход, в КоличествоКонечныйОстаток. ПРИМЕЧАНИЕ Добавление доступных полей в список выбранных полей можно осу- ществить перетаскиванием мышью, двойным щелчком на доступных полях либо нажатием кнопки Добавить справа от списка выбранных полей. Порядок выбранных полей можно изменить позже кнопками Вверх, Вниз или перетаскиванием мышью. Поля Номенклатура и Склад можно не переносить. Они все равно будут выводиться в отчет в составе автополей группировок (стр. 281). В результате окно настроек отчета должно принять вид как на рис. 16.37. Запустим отчет на исполнение в режиме 1С:Предприятие. Нажмем кнопку Сформировать. Отчет примет вид как на рис. 16.38. Мы видим, что данные в отчете представлены в виде таблицы, строки которой сгруппированы по номенклатуре, а колонки - по складам, а также выведены общие итоги по вертикали и горизонтали. Том 2
Т^1 Отчет ОсгагкиНоменклагуры: ОсновналСжзмаКомпоновкиДанных _ □ X Рис. 16.37. Окно настроек отчета iai Ост4Ткиноммимгуры-Демонстр«пио»мммнФИ>л«ция"Систем»коикиовкимп*и" (1С:Преалриягие) Остатки номенклатуры Вариант отчвга' Основной р Сформировать Выбрать вариант.. Все действия • I Номенклатура Жестов! диск Мвтермеавя плата аЬирофон MCHTTCpLCD Память Итого Основной Ровничный Начальный Приход Расход Конечный Начальный остаток остаток остаток здю здю 5ДЮ ЗДЮ ЗДЮ Итого Приход Расход Конечный Начальный остаток остаток юдю’ здю' 7до Приход Расход Конечный остаток 5ДЮ ЗДЮ 2ДЮ 13,000 9,000 4 дао ЮДЮ ЗДЮ ВДВ 4ДЮ ЗДЮ ЗДЮ 24,000 7,000 17,000 юдю здю' 7 дю здю здю 5ДЮ ЗДЮ 2ДЮ ЮДЮ 2ДЮ адю 4Д0 2Д0 2ДЮ 5ДЮ ЗДЮ 2Д0 37 дао 16,000 21 дао Рис. 16.38. Результат отчета Заметьте, что при прокручивании отчета вниз и вправо положение шапки отчета и самой левой колонки остается зафиксированным. Для удобства пользователя платформа автоматически фиксирует табличный доку- мент, в который выводится результат отчета, когда в отчет выводится одна таблица (ФиксацияСлева и ФиксацияСверху) или одна группировка (ФиксацияСверху). Таким образом, мы быстро и легко создали простой отчет Остатки номенк- латуры, представив данные в виде таблицы. На этом примере мы научились создавать и настраивать схему компоновки данных для нового отчета и рассмотрели следующие ее возможности: в создание набора данных на основе запроса с помощью конструктора запроса; в создание иерархической структуры отчета - добавление таблицы и группировок в отчет; в определение ресурсов для расчета групповых итогов отчета. B3S
Глава116пСложнй1еТаналитическиеТоъчет^1 Варианты отчета Теперь продемонстрируем возможности различных настроек отчета. Настройки могут относиться как ко всему отчету в целом, так и к его отдельным элементам - группировкам, таблицам, диаграммам. Последнее может быть полезно, чтобы выделить разные элементы индивидуаль- ными стилями оформления, установить для каждого элемента свой отбор, сортировку и т.д. ВНИМАНИЕ! При установке настроек отчета в средней части окна, под деревом струк- туры отчета должна быть выделена кнопка, соответствующая режиму настроек. Кнопка Отчет - для настройки отчета в целом или кнопка с именем группировки, например, Детальные записи, если настройки относятся только к ней. Создадим новый вариант отчета Остатки номенклатуры и на его примере продемонстрируем несколько вариантов настройки различных элементов структуры отчета. У одного и того же отчета может существовать несколько вариантов, представляющих одни и те же данные в различном виде. Например, для отчета Динамика продаж одним вариантом отчета может служить диаграмма, показывающая продажи товаров по периодам, а другим - табличный отчет, показывающий продажи товаров в разрезе покупателей. При этом каждый вариант отчета обладает своим набором пользовательских настроек. Вернемся в конфигуратор и откроем схему компоновки данных на закладке Настройки. В левой части окна находится список вариантов отчета. При создании настроек отчета в первый раз система компоновки данных по умолчанию создает Основной вариант настроек. Чтобы добавить новый вариант, нажмем кнопку Добавить над этим списком. Зададим имя вари- анта и его представление как Оформление (рис. 16.39). Отчет ОстаткиНоменклатуры: ОсновнаяСкемаКомпоиовкиДаннын _ П X Наборыданных Связи наборов... Вычисляемые... Ресурсы Параметры Макеты Вложетмыесх... Настройки jj X V ' £ • Ч +s bS Имя варианта Пршставоеже Основной Основной Настройки. Ттчет Отчет Парамег.. Выбрани... Отбор Сортцюе... Условно... Пользое... Другие и... Доступные поля Поле "Ь= * «э Склад * J КоличесгвоКоне«мыйОст8гок * J КоличествоНачальныйОствгок * J КоличествоПриход * J КоличествоРаскод * и СистемныеПоля * -I ПараметрыДанньн Рис. 16.39. Добавление нового варианта настроек
Мы видам, что структура отчета и все его настройки очистились. Но они не пропали, а стали невидимы, так как относятся к основному варианту настроек. Если у отчета есть несколько вариантов, то мы видим и можем изменять настройки того варианта, который выделен в данный момент. Причем вся остальная информация в схеме компоновке данных (ресурсы, параметры, наборы данных) осталась без изменений. Данные для отчета будут получены с помощью того же запроса к базе данных. Изменятся лишь настройки, которые определят, как будет представлен отчет. Добавим в структуру отчета новый элемент Группировка и покажем возможности настройки отдельных элементов отчета. Элемент Группировка позволяет выводить в отчете не только сгруппиро- ванную каким-то образом информацию, но и обычные детальные записи, выбранные платформой из источников данных согласно нашему запросу. Выделим корневой элемент Отчет и добавим в него новую группировку (рис. 16.40). Й Отчет ОстаткиНоменклатуры: ОсновнаяСхемаКомпоновкмДанных _ □ X Рис. 16.40. Добавление новой группировки в отчет В появившемся окне выбора поля группировки оставим поле ввода Поле пустым, так как мы не хотим группировать записи в отчете. Такая группи- ровка называется Детальные записи. На закладке Выбранные поля перенесем мышью из списка доступных полей поля, которые будут выводиться в отчет: в Номенклатура, в Склад, в КоличествоНачальныйОстаток, в КоличествоПриход, Профессиональная разработка в системе «1С:Предприятие 8»
в КоличествоРасход, в КоличествоКонечныйОстаток. Сначала продемонстрируем настройки отчета в целом. Дадим заголовок отчету. Перейдем на закладку Другие настройки. В средней части окна настроек выделим кнопку Отчет и введем остатки номенклатуры в строку Заголовок (рис. 16.41). 1*1 Отчет ОсгагкиНоменклатуры: ОснорнаяСяомаКомпоновкиДанныя _ □ X Рис. 16.41. Настройка заголовка отчета ПРИМЕЧАНИЕ Для установки значения параметра настроек нужно выделить двойным щелчком поле Значение и, нажав кнопку выбора •••, выбрать из списка значений нужный вариант. Флажок использования значения при этом появится автоматически. Его можно также снять и поставить вручную. Установим для параметра Макет оформления значение Море (стр. 300). Важным элементом настроек является присвоение более коротких и понятных для пользователя заголовков полей отчета. Это можно сделать на закладке Наборы данных. Мы видим, что так как свойство Автозаполнение включено (стр. 278), плат- форма автоматически заполнила колонки Поле, Путь и Заголовок полей текущего набора данных исходя из запроса. Поясним их назначение: в в колонке Поле отображается нередакгируемое значение имени поля, которое платформа автоматически сформировала из текста запроса. Это внутреннее имя поля, использующееся только в тексте запроса; в в колонке Путь содержится строка, содержащая путь к данным, по кото- рому к нему можно обратиться в других закладках конструктора схемы компоновки данных. Оно может быть отредактировано. Имена полей, описанные в этой колонке, появляются для разработчика на закладке Том 2
выбора полей в отчете, описания вычисляемых полей, полей группи- ровки и др., поэтому имеет смысл настроить их понятнее для себя; в заголовок содержит название поля, под которым поле будет фигуриро- вать в настройках отчета в режиме 1С:Предприятие и в шапке отчета. Отредактируем заголовки полей, сделаем их более короткими и понят- ными. Для этого нужно установить флажок слева от заголовка поля (рис. 16.42). Й Отчет ОстагкиНомонклетуры: ОоновнмСвемаКомпоновкмДеннык □ X Рис. 16.42. Установка заголовков полей Запустим отчет на исполнение в режиме 1С:Предприятие. В открывшемся окне отчета нажмем кнопку Выбрать аариант... (рис. 16.43). В окне вари- антов отчета мы видим теперь два варианта - Основной и только что созданный нами вариант Оформление. Выделим его и нажмем кнопку Выбрать. Рис. 16.43. Выбор варианта отчета
Глава116пСложнй1еТаналитическиеТоъчет^1 Нажмем кнопку Сформировать. Отчет примет следующий вид (рис. 16.44). @ W Остатки но... (1С:Предприягие) ijjjl L4 Ё S 31I Остатки номенклатуры Вариант отчета: |Оформление| |j Вь«?рэтьвариант... j | l> Сформировать 11 0^ Настройка... Воеаействия - i (?) Остатки номенклатуры Номенклатураия! Склад Монитор LCD_________Розничный Веб-камера Розничный Микрофон Розничный Материская плата [Основной Память Основной Жесткий диск (Основной '|— 37,000 |— 16,000 |— 21.000 Рис. 16.44. Результат отчета Мы видим, что в отчет выведена группировка в виде простых детальных записей. Отчет имеет заголовок, и все его элементы оформлены макетом оформления Море. Заметьте, что при прокручивании отчета вниз положение шапки отчета остается зафиксированным. Так происходит потому, что у табличного документа в форме отчета, в который по умолчанию выводится отчет, автоматически установлено свойство ФиксацияСверху. Настройка отдельных группировок Теперь продемонстрируем настройку отдельных элементов отчета. Настроим элемент отчета Детальные записи. Для этого выделим режим настроек отчета Детальные записи и на закладке Другие настройки дадим заголовок группировке - Список номенклатуры на складах, а также установим значения параметров Расположение общих итогов по вертикали - Нат и Макет оформления - Яркий (стр. 300), рис. 16.45. На закладке Сортироака отсортируем записи группировки в порядке убывания конечного остатка номенклатуры. Для этого перенесем из списка доступных полей поле КоличествоКонечныйОстаток и установим направ- ление сортировки - По убыванию (рис. 16.46). На закладке Условное оформление выделим цветом записи группи- ровки с конечным остатком меньше или равным единице. Для этого нажмем кнопку Добавить, расположенную в правом верхнем углу окна настроек (рис. 16.47). Сначала укажем Оформление для выделения полей. Нажмем кнопку выбора в поле Оформление и установим красный цвет текста и желтый цвет фона.
Т^1 Отчет ОстаткиНоменклатуры: ОсновналСявмаКомпоновкиДанных _ □ X Рис. 16.45. Редактирование настроек элемента отчета «Детальные записи» Поля группу...Выбранные по... Отбор | Сортировка | Условное офо... Другие настр... Доступные поля = Номенклатура = Склад___________________ j |^QSQ§939SSSl9SEEiS! +' <1 КоличествоНачальныйОстагок J КоличествоПрихсд <1 КоличествоРасход 1 Поле Направление сортдовки Рис. 16.46. Настройка сортировки элемента отчета «Детальные записи» Поля группир...Выбранные по... Отбор Сортировка | Условное офо... | Другие настр... Оформление Условие Оформляемые поля Представление Редактирован^ параметров X Параметр Значение 0 Цвет Фона О 255.255.0 0 Цвет текста D 255.0.0 £7 > □ Цвет в диаграмме И 0.0.0 □ Цвет границы Н 0,0,0 | ОК ] | Отмена 11 Справка | Рис. 16.47. Настройка условного оформления элемента отчета «Детальные записи» Затем укажем условие, при наступлении которого будет применяться оформление. Нажмем кнопку выбора в поле Условие и в появившемся окне добавим новый элемент отбора (рис. 16.48). Для этого нажмем кнопку Добавить и укажем в графе Левое значение поле КоличествоКонеч- Профессиональная разработка в системе «1С:Предприятие 8»
ныйОстаток, в графе Вод сравнения - Меньше или равно, а в графе Правое значение -1. Поля группир... Выбранные по... Отбор Соргодовка | Условное офо... | Другие настр... Оформление Условие Оформляемые поля Представление Цвет фона. Цвет текста Отбор X X и <’ 11 Подробно | I Левое значение Вод сроо нения Прооое значение Пр.. т Отбор______________________________________________ ____________________ ® | <1 КоличесгеоКонечшйОстаток Меньше или равно ^2н5ммХ1В1 | ОК || Отмена | Рис. 16.48. Настройка условного оформления элемента отчета «Детальные записи» Затем зададим список оформляемых полей. Если мы хотим выбрать все поля отчета, то можно оставить этот список пустым. Можно указать конкретные поля, нажав кнопку выбора в поле Оформляемые поля. Для этого в появившемся окне, нажимая кнопку Добавить, нужно выбрать поля, например, Номенклатура и КоличествоКонечныйОстаток (рис. 16.49). Рис. 16.49. Настройка условного оформления элемента отчета «Детальные записи» Затем зададим представление условного оформления как Маленький запас. Это является хорошим тоном при создании стандартных настроек для пользователя. В результате, открыв окно пользовательских настроек, вместо непонятной строки «Конечный остаток меньше или равно 1» пользователь увидит осмысленное выражение, которое задано в поле Представлениа. В результате окно условного оформления должно принять вид (рис. 16.50). В заключение перейдем на закладку Выбранные поля и раскроем список полей Автополя (стр. 281). Для этого выделим его, вызовем его контекс- тное меню и выберем пункт Развернуть (рис. 16.51). Том 2
Рис. 16.50. Настройка условного оформления элемента отчета «Детальные записи» Поля группир... | Выбранные по... | Отбор Сортировка УслооноеоФо... Другие настр... £ X Поле Доступные поля = Склеп J КолжествоКонечшйОстаток <1 КоличествоНачальныйОстаток •+• J КогмчесгеоПрихоп <1 КоличествоРасхоа +• О СистемныеПолй Сэ ПараметрыДанных Новое поле Новая группа Новое авто поле Изменить Скопировать X Удалить Переместить вверх Переместить вниз Свойстваэлемента пользовательских н< Установить заголовок... Сгруппировать поля Разгруппировать Развернуть Рис. 16.51. Раскрытие списка полей «Автополя» группировки «Детальные записи» Здесь мы видим список полей детальной группировки отчета. Так как начального остатка по номенклатуре у нас нет, уберем признак использо- вания у поля КоличествоНачальныйОстаток, или можно просто удалить его из списка (рис. 16.52). Поля группир... I Выбранные па.. I Отбор Сортировка Условное офо... Другие настр... Рис. 16.52. Выбор полей для группировки «Детальные записи» Все настройки, которые мы проделали (рис. 16.45-16.52), касались груп- пировки отчета Детальные записи.
Глава116пСложнй1еТаналитическиеТоъчет^1 Теперь для наглядности добавим в отчет еще одну группировку (внешне похожую на таблицу) и настроим ее по-другому. Выделим корневой элемент Отчет и добавим в него группировку по полю Склад. Выделим группировку Склад и добавим подчиненную ей группировку Номенклатура. Переместим группировку Склад вместе с вложенной в нее группировкой Номенклатура в самый верх структуры отчета. Это можно сделать кнопкой Вверх в командной панели настроек отчета или перетаскиванием мышью. Перейдем к настройкам группировки Номенклатура. Для этого выделим режим настроек этой группировки в средней части окна настроек. На закладке Отбор установим отбор записей для группировки Номен- клатура с конечным остатком больше единицы. Для этого перенесем из списка доступных полей поле КоличествоКонечныйОстаток. Установим Вад сравнения - Больше, а Правое значение -1. Условие отбора примет вид (рис. 16.53). Й Отчет ОстаткиНвменклвтдры: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.53. Настройка отбора для группировки «Номенклатура» ПРИМЕЧАНИЕ Выделенные пиктограммы справа от элементов структуры отчета (см. рис. 16.53) отражают наличие настроек — выбранных полей, отбора, условного оформления, сортировки и т.п. конкретного эле- мента отчета. В заключение выделим корневой элемент структуры отчета Отчет и на закладке Другие настройки установим параметр Расположение полей группировок в значение Отдельно и только в итогах (рис. 16.54). Это придаст группировке Склад табличный вид. И©
Параметры Выбранные.., Отбор Сортцювка Условное о... Пользовете... | Другие нас... I Параметр Значение 0 Макет оформления Море □ Расположение итогов Дето Расположение полей группировок Отдельно и в итогах — □ Расположение грулпфовок Начало □ Расположение реквизитов Вместе с владельцем □ Расположение ресурсов Горизонтально □ Расположение общих итогов по горизонтали Авто □ Расположение общих итогов по вертикали Авто □ Тип заголовка полей Авто ▼ SS я a Рис. 16.54. Настройка вывода полей группировок для отчета в целом Запустим отчет на исполнение в режиме 1С:Предприятие. Нажмем кнопку Сформировать. Отчет примет следующий вид (рис. 16.55). @ 3 U Остатки номенкл.. (1 СПредприятие] Й| L4 W @ „-ПК Остатки номенклатуры Вариант отчета: [Оформлеше | |> Выбрать вариант... ,| | 1> Сформировать 11 Настройка... Вседействия । (?) Рис. 16.55. Результат отчета Итак, мы видим, что у каждого элемента структуры отчета теперь есть свое оформление. В верхней группировке записи сгруппированы по складам и номенкла- туре. В результате отбора отражаются только записи с конечным остатком номенклатуры больше единицы. Заметьте, что заголовок над группи- ровкой, так же как и макет оформления и список полей отчета, относится не к этой конкретной группировке, а ко всему отчету в целом. Но поскольку для самой группировки эти элементы оформления не установлены, она их наследует от главного отчета. Профессиональная разработка в системе «1С:Предприятие 8»
Детальный список выводится без общих итогов, в порядке убывания конечного остатка номенклатуры. Записи с конечным остатком меньше или равным единице выделены цветом. В списке отсутствует поле Начальный остаток. Также список выводится со своим заголовком и макетом оформ- ления. Итак, на этом примере мы научились создавать новый вариант отчета. Затем мы познакомились с индивидуальной настройкой каждого элемента структуры отчета. Мы научились устанавливать для них: в сортировку, в отбор, в условное оформление, в заголовок, макет оформления и другие. Таким образом, применяя различные варианты настройки отчета, можно получить множество отчетных форм, использующих один и тот же набор данных. Пример 2 Дальнейшие возможности системы компоновки данных будем изучать на примере отчета, который будет отражать информацию по собранным и проданным системным блокам за указанный период (рис. 16.56). Склад Ns Системный блок п/п Количество приход Количество Конечный расход остаток Стоимость приход Стоимость расход Прибыль обций Основной | 1 Компьютер для дома 2 I < 2 < 17 500ЛЮ 9000,00 20 000ДЮ 10 000,00] 2 500Д)В 1 000,00' 100,00 40,00 I 2 Компьютер для офиса I 1 1 6 500ДО 10 000,001 1 500,00 60,00 Итого 2 2 17 500ЛЮ 20 0004)0 2 500Д)В 100,00 Рис. 16.56. Требуемый вид отчета Создадим новый объект конфигурации Отчет и назовем его ОтчетПоСис- темнымБлокам. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Откроем конструктор запроса. В качестве источника данных для запроса выберем вирту- альную таблицу регистра накопления СобранныеСБ.ОстаткиИОбороты. В список полей перенесем поля из этой таблицы: в КоличаствоНачальныйОстаток, в КоличествоКонечныйОстаток, в КоличествоПриход, в КоличествоРасход, в СтоимостьПриход, в СтоимостьРасход, в СБ, в Склад. Том 2
Нажмем ОК и вернемся в конструктор схемы компоновки данных. Изменим заголовки и пути полей на более понятные: Системный Блок (СБ), Начальный остаток, Конечный остаток. Напомним, что заголовки будут отражаться в шапке отчета и окне настроек пользователя, а пути - в настройках разработчика, в выражениях вычисляемых полей, ресурсов и т. п. Вычисляемые поля В отчете мы хотим видеть прибыль от продажи собранных системных блоков, то есть разницу между его продажной стоимостью (поле регистра СтоимостьРасход) и стоимостью комплектующих и услуг, израс- ходованных на сборку компьютера (поле регистра СтоимостьПриход). Значит, для этого нам понадобится создать вычисляемое поле (стр. 283). Перейдем на закладку Вычисляемые поля и добавим его кнопкой Добавить. Дадим ему имя (Путь к данным) - Прибыль, в колонку Выражение введем следующий текст (листинг 16.1). Листинг 16.1. Выражение для расчета вычисляемого поля «Прибыль» | СтоимостьРасход - СтоимостьПриход Заголовок для отображения в отчете формируется по умолчанию, но его можно изменить (рис. 16.57). □ х Т^1 Отчет ОтчетЛоСмстемнымБлвкам: ОоиовналСжвмаКомпоновкмДанных Наборыданных Связи наборов д... | Вычисляемые а.. | Рзоуроы Параметры Макеты Вложенные схе...Настройки Путь к Выражение данным I 'Заголовок Ограничение досту... Вьражение Выражения Тип значения 'Доступные Оформление _ ,, _ ,, представлен... упорядочиеа... значения _ П... У... Гр... У... Параметры... ‘’СтоимостьРасход ^Прибыль О О О О СтокиостъПриход ) Рис. 16.57. Создание вычисляемого поля Перейдем на закладку Ресурсы и определим поля ресурсов отчета (стр. 290). Обратите внимание, что созданное ранее вычисляемое поле Прибыль тоже добавилось в ресурсы отчета, так как по нему можно подсчитывать групповые итоги (рис. 16.58). Й Отчет ОтчетПоСмстемнымБлокам: ОсновнаяСяемаКомпоновкиДанньш _ □ X Наборыданных Связи неборое д... Вычисляемые п... | Ресурсы | Параметры Макеты Вложенные схе... Настройки Доступные поля Лоле Выражение Рассчитывать по... = КоличествоРасход = КонечныйОстеток = НачальньйОствгок Ры Прибыль = СистемныйБлок = Склад = СтоимостьПриход = СтоимостьРасход 1Z1 l«j Суима(КонечныйОствгок) = НачальньйОствгок Суима(НачальньйОстаток) = КоличествоПриход Сумма(КоличествоПриход) = КоличествоРасход Су*4а(КоличествоРасход) = СтоимостьПриход Сумма(СтоимостьПриход) = СтоимостьРасход Сумма(СтоимостьРасход) № Прибыль Суима(Прибыль) Рис. 16.58. Определение ресурсов отчета МЙ1
Глава116пСложнй1еТаналитическиеТоъчет^1 Параметры. Период отчета Теперь определим параметры отчета (стр. 292). Для этого перейдем на закладку Параметры. Мы видим, что платформа уже создала два пара- метра: НачалоПерирда и КонецПериода. Эти параметры используются практически в каждом отчете, так как пользователя интересуют данные о хозяйственной деятельности за определенный период. Первым параметром в отчет передается дата начала периода расчета итогов, вторым - конец отчетного периода. В результате отчет будет содержать только данные за указанный период. Мы можем также добавить свой параметр, но в данном случае нас устраивает список параметров, предло- женный нам по умолчанию (рис. 16.59). Т^1 Отчет ОтчетПоСистомнымБлокам: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборыданных Свяэинаборовд... Вычисляемые п... Ресурсы | Параметры | Макеты Вложенныесхе...Настройки и- О Имя Заголовок Тип Доступные... । Д... Значение Вьражение Парам... В... 0... 3... Использо... НачалоПериода Начало периода | □ 0 D D Авто КонецПериода Конец периода Дата О 0 О О Авто I 1 II» Рис. 16.59. Параметры компоновки данных Поле Заголовок можно изменить, так как эти заголовки выводятся при запросе параметров у пользователя. Мы оставим их по умолчанию, но изменим колонку Тип. Дело в том, что если в отчет передается пара- метр, содержащий значение типа Дата, то дата всегда содержит и время с точностью до секунды. Однако пользователя, как правило, не интере- суют данные в отчете с такой точностью. И ему незачем указывать еще и время при вводе даты. Поэтому в колонке Тип нажмем кнопку выбора ••• и в нижней части окна редактирования типа данных установим состав даты в значение Дата для обоих параметров (рис. 16.60). Редактирование типа данных X □ Составной тип данных □W3 Число □>ьс Строка 0|Э1| □й| Булево □ £i ХранилицеЗначения □lD УникальныйИденгиФикатор '* □jylJ СлравочникСсылка •+• □д|^ ДокументСсылка •+ □£]} ПеречислениеСсылка □Э ПлагёидоеХарактеристикСсьика □Jr ПланСчетовСсылка □^ ПлагёидоеРасчетвСсылка □^ БизнвоПроцессСсылка Состав даты । | ОК || Отмена | ---------------Рис. 16.60. Редактирование состава даты Но в таком случае, если пользователь задаст даты периода как 01.12.2011 и 11.12.2011, итоги регистра будут рассчитаны с начала дня 01.12.2011 М2
00:00:00 по начало дня 11.12.2011 00:00:00. То есть данные за 11-е число, отличные от начала дня, в отчет не попадут, а пользователь, конечно, подразумевал этот день включить. Чтобы этого избежать, внесем в поле Выражение для параметра КонецПериода следующий текст (листинг 16.2). Листинг 16.2. Выражение для расчета параметра «КонецПериода» | КонецПериода(&КонецПериода, "День") Это выражение, сформулированное на языке выражений системы компо- новки данных, содержит функцию КонецПериода(), возвращающую дату, соответствующую концу какого-либо периода, например, дня. ПОДРОБНЕЕ Описание языка выражений системы компоновки данных содержится во встроенной справке системы, в разделе Справка ► Содержание справки к Встроенный язык к Общие объекты к Система компоновки данных ► Язык выражений системы компоновки данных. В результате окно параметров компоновки примет следующий вид (рис. 16.61). й Отчет ОгчетПоСиствмнымБлокам: ОсновнаяСхемаКомпоноекиДанных □ X Наборыдашых Связи наборов да... Вычисляемые поля Ресурсы | Параметры | Макеты Вложенные схемы Настройки ® 6» о Имя Заголовок Тип Доступные... Д...1 Значение Вьфажение Пара... В... 0... 1 3.. И сл оль а... НачалоПериода Начало периода Дата □ 0(С О V Авто КонецПериода Конецпериода Дата □ 1 |*/] \| ] 11 | /Авто Ll Рис. 16.61. Параметры компоновки данных Заметим, что у параметров снят флажок Ограничение доступности. Это значит, что эти параметры будут видны в окне настроек пользователя. Также снят флажок Запрещать незаполненные значения. В случае установки этого флажка при использовании параметров в отчете (признак исполь- зования слева от параметра) система проверяет обязательное заполнение параметра. Если значение параметра не указано, то будет выдана ошибка. В нашем случае флажок Запрещать незаполненные значения не установлен, поэтому отчет будет формироваться без ошибки и с пустым значением параметра. Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Склад. Выделим группировку Склад и добавим подчиненную ей группировку СистемныйБлок. Затем на закладке Выбранные поля перенесем из списка доступных полей поля (рис. 16.62): в НачальныйОстаток, в КоличествоПриход, Профессиональная разработка в системе «1С:Предприятие 8»
в КоличествоРасход, в КонечныйОстаток, в СтоимостьПриход, в СтоимостьРасход, в Прибыль. Т^1 Отчет ОтчетПоСистомнымБлокам: ОсновнаяСхемаКомпоновкмДанных _ □ X Рис. 16.62. Определение полей и группировок отчета На закладке Другие настройки дадим заголовок отчету - Отчет по системным блокам и установим Макет оформления (стр. 300) - Арктика. Быстрые пользовательские настройки В заключение мы должны предоставить пользователю возможность задавать отчетный период перед формированием отчета. То есть пара- метры Начало периода и Конец периода должны быть включены в состав пользовательских настроек. Причем эти настройки должны находиться непосредственно в отчетной форме, поскольку задавать отчетный период требуется практически всегда. На закладке Параметры установим для каждого из параметров признак использования (флажок слева от пара- метра). Затем нажмем кнопку Свойства элемента пользовательских настроек, расположенную в правом нижнем ушу окна настроек. Установим флажок Включать в пользовательские настройки и оставим предложенное по умол- чанию для свойства Режим редактирования значение Быстрый доступ (рис. 16.63). Флажок Включать в пользовательские настройки означает, что эта настройка будет доступна пользователю в отдельном окне (2) при нажатии кнопки Настройка (то есть такая настройка, которой он может пользоваться, но не Том 2
очень часто). А режим редактирования, установленный в значение Быстрый доступ, означает, что эта настройка будет быстрой пользовательской настройкой, которая будет автоматически отображаться непосредственно в отчетной форме (1). Это настройка, которая нужна пользователю посто- янно, чуть ли не при каждом запуске отчета, поэтому она всегда на виду (рис. 16.64). Рис. 16.63. Настройки отчета Рис. 16.64. Быстрые (1) и обычные (2) пользовательские настройки Запустим отчет на исполнение в режиме 1С:Предприятие. В открывшейся отчетной форме зададим период отчета с 01.12.2011 по 11.12.2011. Нажмем кнопку Сформировать. Отчет примет следующий вид (рис. 16.65).
Глава116пСложнй1еТаналитическиеТоъчет^1 Рис. 16.65. Результат отчета Поскольку в базе есть документы по сборке и продаже системных блоков за 11.12.2011, мы видим, что эти данные попали в отчет. Системные поля Немного усовершенствуем наш отчет. Уберем признак использования у поля НачальныйОстаток. Добавим в список выбранных полей отчета вычисляемое поле, сформированное платформой, показывающее процент прибыли по каждому системному блоку от ее общей суммы. Для этого раскроем поле Прибыль и перенесем поле ПроцентОбщий (рис. 16.66). Т^1 Отчет ОтчетАоСисгемнымБлокам: ОсновнвяСкемаКоипоновкиДаннык _ П X Рис. 16.66. Добавление поля «% от общей прибыли» в отчет
Выделим режим настроек группировки СистемныйБлок и добавим нумерацию внутри нее. Для этого раскроем список Системные поля и перенесем поле НомерПоПорядку так, чтобы поле было первым в списке (рис. 16.67). Т^1 Отчет ОтчетПоСнстемнымБлокам: ОсноенаяСхемаКомпоновкиДанных _ □ X Рис. 16.67. Добавление поля «№ по порядку» в группировку «СистемныйБлок» Запустим отчет на исполнение в режиме 1С:Предприятие. В открыв- шейся отчетной форме зададим период отчета с 01.12.2011 по 11.12.2011. Нажмем кнопку Сформировать. Отчет примет следующий вид (рис. 16.68). 3- W Отчет по системнлл блокам-Демонстрациожая конфигурация "С... (1С:Предприятие) ят! La lai П>1 311 М М+ М- • - □ X Отчет по системным блокам Вариант отчета. [Основной j | Выбрать вариант... | | Сформтфоветь |i ПЗ Настройка... Все действия’ i (?) 0 |ТП Начало периода ииимм! ▼ 0 3 iffi Коней периода 11.122011 1 Отчет по системным блокам Параметры: Начало периода 01.122011 Конец периода: 11.122011 Склад Количество Количество Конечный Стоимость Стоимость Прибыль .% Не Системный блок приход расход остаток приход расход общий п/п 1 Основной 2 2 17 500,00 20 008,08 2 500,00 100,00 1 Компьютер для дома 1 1 9000.00 10 000,00 1000,00 40ДЮ' 2 Компьютер для офиса 1 1 8500.00 10 000.00 1500,00 ВОД) Итого 2 2 17 500,00 20 000,00 2 500Л0 100,00 > Рис. 16.68. Результат отчета Профессиональная разработка в системе «1С:Предприятие 8»
Обязательность использования параметров Если отчетный период для пользователя не важен, то он может снять признак использования параметров (флажок слева от параметра). В этом случае отчет будет формироваться по всем записям регистра СобранныеСБ, находящихся в базе данных. При включенном признаке использования параметров также можно не задавать их значения. В этом случае отчет будет формироваться без ошибки, поскольку у параметров отчетного периода флажок Запрещать незаполненные значения не установлен (см. рис. 16.61). Если же, наоборот, отчетный период нужно вводить всегда, то у пара- метров в поле Использование можно задать Всегда (рис. 16.69). Й Отчет ОтчетЛоСмстемнымБлокам: ОсновнаяСхемаКомпоновкиДанньш Наборыданных Связи наборов да... Вычисляемые поля Ресурсы | Параметры | Мвкеты Вложенные схемы Настройки Имя Заголовок Тип Доступные... Д.. Значение Вьражение Пара... В... 0... 3... Нспольэ... НачалоПериода Начало периода Дата □ 0 (_|/О Всегдач"' КонецПериода Конец периода Дата □ КонецПернода(&КонецПериода,"День') 0 Всегда !► Рис. 16.69. Параметры отчета В этом случае флажок использования параметра в пользовательских настройках отсутствует, т.е. параметр используется всегда. Если допол- нительно к этому установить также флажок Запрещать незаполненные значения (см. рис. 16.69), то при формировании отчета с пустым значе- нием параметра будет получена ошибка (рис. 16.70). @ Отчет по системным бло... (ЮПредприятие) jg) [Д |й] 'П>| 'зЦ М М* М~ — □ X Отчет по системным блокам Вариант отчета: |Основной | | Выбрать вариант... | Рис. 16.70. Результат отчета Таким образом, на примере этого отчета мы научились: в создавать вычисляемые поля, Том 2
в работать с параметрами отчета, в использовать в отчете системные поля. Также мы разработали для отчета удобный пользовательский интерфейс, позволяющий вводить параметры отчета непосредственно в отчетной форме. Позднее мы рассмотрим примеры, задающие в форме пользова- тельских настроек другие настройки отчета - сортировку, отбор и т.д. Также мы научимся программно задавать значения настроек и переда- вать их в отчет. Пример 3. Связь наборов данных Отчет, разработанный с помощью системы компоновки данных, может использовать данные из нескольких (в нашем случае двух) наборов данных. Эти наборы данных описываются каждый по отдельности, а затем в схеме компоновки данных указывается, каким образом они связаны между собой. Для демонстрации этой возможности системы компоновки данных разра- ботаем отчет, отражающий информацию о последних ценах поступления товаров, а также связанную с ней информацию о поставщиках, датах и номерах документов, которые произвели движения в регистре сведений Цены (рис. 16.71). Номенклатура Контрагент Дата Номер Цена Веб-камера ООО “Стандарт* 111.01201214:20:00 000000005 | 1 000,00 Жесткий диск ООО ’Атяэнт" 105.122011122239 000000001 | 3 000,00 Материнская плата ООО •Дтяэнт" 105.12201115:53:17 000000002 | 2 000,00 Микрофон ООО “Стандарт* |11.01201214:20:00 000000005 | 700,00 Монитор LCD ООО “Стандарт* |11.01201211:10:00 000000004 | 10 000,00 Память ООО “Атлант* 105.12201115:53:17 000000002 J Рис. 16.71. Требуемый вид отчета Для этого создадим набор данных, получающий информацию из документов Приходная накладная, и свяжем его с исходным набором, получающим данные из регистра сведений Цены. Затем мы выведем полученные данные в табличный документ с помощью конструктора настроек. Создадим новый объект конфигурации Отчет и назовем его ЦеныКомплек- тующихОтПоставщиков. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Он будет назван по умолчанию НаборДанных1. Для большей наглядности назовем его Цены. Чтобы ввести новое имя набора данных, можно дважды щелкнуть по его названию. Откроем конструктор запроса. В качестве источника данных для запроса выберем виртуальную таблицу регистра сведений Цены.СрезПоследних. В список полей перенесем поля из этой таблицы (рис. 16.72): в Номенклатура, №
Глава116пСложнй1еТаналитическиеТоъчет^1 в Цена, в Регистратор. Поля |ЦеныСрезПоследннх Номенклатура J ЦеныСрезПоследних.Цена = ЦеныСрезПоследних.Регистретор Рис. 16.72. Выбор полей для запроса Поле Регистратор нам понадобится в качестве ссылки на документ ПриходнаяНакладная, который произвел движения в регистре сведений Цены, чтобы установить связь со вторым набором данных. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Таким образом, в этом наборе данных мы получим информацию о последних ценах поступления товаров. Но нам нужна еще другая, связанная с ней более детальная информация из документов Приходная накладная. Выделим корневой элемент дерева наборов данных и добавим еще один набор данных - запрос. Назовем его Поставщики. Откроем конструктор запроса. В качестве источника данных для запроса выберем объектную таблицу документа ПриходнаяНакладная. В список полей перенесем поля из этой таблицы (рис. 16.73): в Ссылка, в Номер, Дата, в Контрагент. Поля IПриходнаяНакладная СсылкаI = ПриходнайНаклёцная-Номер = Прмходна(Лаклааная.Дага = ПриходнайНаклёцная-Контрагенг Рис. 16.73. Выбор полей для запроса Поле Ссылка нам понадобится в качестве ссылки на регистр сведений Цены, чтобы установить связь с первым набором данных. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Если в схеме компоновки данных присутствуют несколько наборов данных, то между ними требуется установить связь (стр. 268). На закладке Саязи наборов данных добавим новую строку. Связей в общем случае может быть несколько, даже если набора данных только два. В поле Источник связи, то есть в качестве родительского набора данных, укажем Цены, в поле Приемник связи, то есть в качестве зависимого набора данных, укажем Поставщики. В поле Выражение источник выберем из полей родительского набора поле Регистратор, а в поле Выражение приемник - поле зависимого набора данных Ссылка (рис. 16.74).
Й Отчет ЦеныКомплектдющихОтПоставтнков: ОсноенаяСхемаКомпоновкиДанных □ X Наборыданных | Связи наборов... | Вычисляемые... Ресурсы Параметры Макеты Вложенные схе... Настройки Приемник связи Выражение источник Вьражение Гфиемник Параметр Список пар.. Условие с... Начальное... 0... Поставщики Регистратор Ссылка О 0 Рис. 16.74. Создание связи наборов данных Все связи, созданные в схеме компоновки данных, считаются Левыми внешними соединениями, то есть в отчет будут включены записи из обоих наборов данных, удовлетворяющих условию связи Регистратор = Ссылка (рис. 16.75). Набор данных "Цены" [Регистратор- Приходная накладная 000000001 ст 05.12201112223Э< Приходная накладная 000000002 ст 05.12201115:53:17 Приходная накладная 000000002 ст 05.12201115:53:17 Приходная накладная 000000004 ст 11.01201211:10:00 Приходная накладная 000000005 ст 11.01201214:20:00 Приходная накладная 000000005 ст 11.01201214:20:00 I Номенклатура Жесткий диск Материнская плата Память___________ Монитор LCD______ д Веб-камера_________ 1 д Микрофон Цена_______ 3000,00 2000,00 1 200,00 10000ДО 1 000,00 700,00 Набор данных "Поставщики" [Ссылка Приходная накладная 000000001 ст 05.12201112223Вт Приходная накладная000000002 ст 05.12201115:53:17 * Приходная накладная 000000003 ст 06.12201114:04:13 Приходная накладная 000000004 ст 11.01201211:10:00 Приходная накладная 000000005 ст 11.01201214:20:00 1Дата_____________ 05.122011122239 05.12201115:53:17 06.12201114:04:13 11.01201211:1000 ' 11,012012 1 4:20:00 Номер 000000001 000000002 000000003 000000004 000000005 Контрагент ООО’Атлант" ООО’Атлант* ООО "Стандарт’ ООО "Стандарт’ ООО "Стандарт’ Рис. 16.75. Связь записей в наборах данных Кроме того, у родительского набора данных Цены будут отражаться в отчете все записи, независимо от того, найден ли соответствующий им документ в наборе данных Поставщики или нет. Поэтому при опре- делении связей наборов данных требуется внимательно обдумать, какой из наборов данных будет родительским, а какой - зависимым. Для быстрого создания стандартных настроек воспользуемся конструк- тором настроек, который вызывается нажатием кнопки Открыть конструктор настроек на закладке Настройки схемы компоновки данных (рис. 16.76). й Отчет ЦеныКомплвктдк>1цих0тПостав1циков: ОсновнаяСкемаКомпоновкмДанных _ □ X Рис. 16.76. Настройки схемы компоновки данных Профессиональная разработка в системе «1С:Предприятие 8»
Сначала выберем тип отчета Список, что соответствует элементу струк- туры отчета Группировка, где информация выводится по строкам (рис. 16.77). S; Конструктор настроек компоновки данным X Тип отчета: ©Список. Данные по всем измерениям отчета выводятся списком.} Т аблица. Данные выводятся по измерениям расположенным как по ' горизонтали, так и по вертикали О Диаграмма. Данные выводятся в виде диаграммы. | Далее > || ОК || Отмена || Справка | Рис. 16.77. Конструктор настроек. Шаг 1 Нажмем кнопку Далее. На следующем шаге определим поля, выводя- щиеся в отчет. Список доступных полей включает поля из обоих наборов данных. Мышью перетащим из него поля (рис. 16.78): в Номенклатура, в Контрагент, Дата, в Номер, в Цена. Конструктор настроек компоновки данных Выберите поля которые будут отображаться в отчете. Доступные поля = Дата .+ = Контрагент +. = Номенклатура = Номер +. = Регистратор * = Ссылка = Сз СистемныеПоля .+. о ПараметрыДанных | < Назад 11 Далее > 11 ОК 11 Отмена 11 Справка | Рис. 16.78. Конструктор настроек. Шаг 2 Том 2
Нажмем кнопку Далее. На следующем шаге определим поля для группи- ровки записей в списке. Мышью перетащим из списка доступных полей поле Номенклатура (рис. 16.79). Конструктор настроек компоновки данных | < Назая 11 Далее > 11 ОК 11 Отмена 11 Справка | Рис. 16.79. Конструктор настроек. Шаг 3 Нажмем кнопку Далее. На следующем шаге определим поля для сорти- ровки записей в отчете. Мышью перетащим из списка доступных полей поле Дата (рис. 16.80). Конструктор настроек компоновки данных NS Hqwihiuimwu i ic:fioen..7.7 Выберите поля упорядочивания Поля упорядочивания задают порядок 2 . icinpea. 811 следования данных в отчете. 3 ПС:Пр»д 81 Доступные поля t = Контрагент + = Номенклатура = Номер .+ в Регистратор т = Ссылка = Цона Поле Направление со... По возрастанию | < Назад | |: ОК *|1 Отмена 11 Справка | Рис. 16.80. Конструктор настроек. Шаг 4 Нажмем ОК. В результате наших действий в окне настроек появилась группировка Номенклатура и вложенная в нее группировка Детальные записи, определен список выбранных полей и задано поле сортировки (рис. 16.81). Аналогичный результат можно получить, самостоятельно создавая нужные элементы настроек, но в данном случае проще и быстрее это сделать с помощью конструктора настроек. Запустим отчет на исполнение в режиме 1С:Предприятие. Нажмем кнопку Сформировать. Наш отчет примет следующий вид (рис. 16.82).
Глава116пСложнй1еТаналитическиеТоъчет^1 Й Отчет ЦеныКомплектующмкОтПоставщмков: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.81. Настройки схемы компоновки данных @ W Ц*1- (^Предприятие) igl |Д 151 ш| 'ail М М* М* * - □ X Цены комплектующих от поставщиков Вариант отчета: [Основной| | Выбрать вариант.,, | | 1> Сформировать 11 Ов Настройка... Все действия * i (?) [Номенклатура I I- ______Контрагент________________________________Дата____________________________Номер_Цена_~ А Веб-камере_______________________________________________________________ "[ ООО‘Стандарт' 11.01201214:20:00 [000000005 | 10ОО.ОО" А Жесткий диок___________________________________________________________ "[ ООО'Атлант' 05.122011122239 [000000001 | Э ООО.ОО" I—i Материнская плате____________________________________________________ "[ ООО ’Атлант' 05.12201115:53:17 1000000002 [ 2 000,00 А Микрофон [ ООО “Стандарт' ’11.01201214:20:00 [000000005 [ 700,00 А Монитор LCD "[ ООО “Стандарт' ’11.01201211:10:00 [000000004 [ 10000,00 А Память 1 ООО "Атлант- OS.T 2.2011 15: S3:17 [000000002 [ 1200,00 . ‘ I Рис. 16.82. Результат отчета Мы видим, что записи в отчете сгруппированы по полю Номенклатура, то есть для каждой позиции номенклатуры выводится список с указанием поставщика, даты и номера документа Приходная накладная, в котором было учтено ее поступление. Цена номенклатуры заполняется из регистра сведений Цены. Внутри каждой группы записи упорядочены по полю Дата. Таким образом, данные выводятся в отчет с помощью группировки Номенклатура ► ДетальныеЗаписи, представленной в табличном виде. Но это не таблица. Отличие структуры настроек Группировки и Таблица было рассмотрено на стр. 127.
Пример 4. Связь таблиц внутри набора данных На этом примере мы познакомимся с работой системы компоновки данных с помощью встроенного языка. Разработаем отчет, отражающий список номенклатуры с остатками на складах, и реализуем его програм- мный запуск из списка номенклатуры (рис. 16.83). Группа Н о иен кл В йд^Н^В[ Склад^^Н О ст ат о к Комплектую цие Материей л плате Материалы Основной 2,000 Память Жесткий диск Материалы Материалы Основной 2,000 MoterropLCD Материалы РОЭ»МЧ№М 2,000 Веб-камера Микрофон Материалы Материалы РОЭ»МЧ№М РОЭ»МЧ№М 7,000 9Д00 Моя иерархия Моюггоры ОЗУ Материалы Материалы Основные детали Товары для сборки Цэочие детели Материалы Материалы Сибранные компьютеры Компьютер для офиса Компьютер для дома Комплекты Комплекты Компьютер игровой Услуга Комплекты Сборка компьютера Услуга Диатостика компьютера Ремонт компьютера Сопутствующие услуги Услуга Услуга Услуга Восстановление деннях Услуга Рис. 16.63. Требуемый вид отчета Создадим новый объект конфигурации Отчет и назовем его СписокНо- менклатуры. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Откроем конструктор запроса. В качестве источника данных для запроса выберем объектную ссылочную таблицу Номенклатура и виртуальную таблицу регистра накопления ОстаткиНо- менклатуры.Остатки. Чтобы исключить неоднозначность имен в запросе, переименуем таблицу Номенклатура в спрНоменклатура. Для этого выделим ее в списке Таблицы и вызовем ее контекстное меню (рис. 16.84). Таблицы «у? Добавить Удалить Переименовать таблицу . Заменить таблицу... Рис. 16.84. Переименование таблицы в запросе В список полей перенесем поля из этих таблиц (рис. 16.85): в Ссылка, в Родитель, в ВидНоменклатуры, в Склад, в КоличествоОстаток. = слрНоменклагур&Радитель = сгфНоменклагур&ВиаНсменклатуры 1_ ОстепиМоменклетурыОстаткнСклад J 0 стетмМ оменклятурыО стеткн КоличесгвоОстепж Рис. 16.85. Выбор попей для запроса Профессиональная разработка в системе «1С:Предприятие 8»
Связывание таблиц в запросе Перейдем на закладку Связи. Так как в запросе теперь участвуют несколько таблиц, требуется определить связь между ними. По умол- чанию платформой уже будет создана связь по полю Номенклатура. Но нам нужно снять флажок Все у таблицы ОстаткиНоменклатуры.Остатки и установить его у таблицы спрНоменклатура. Тем самым мы задаем тип связи как Левое соединение, то есть в результат запроса будут вклю- чены записи обеих таблиц, удовлетворяющих условию связи по полю Номенклатура. Кроме того, у таблицы спрНоменклатура, которая будет слева в тексте запроса, будут отражаться в отчете все записи, независимо от того, найдено ли им соответствие в таблице справа ОстаткиНоменк- латуры.Остатки или нет. Это нужно потому, что в регистре ОстаткиНомен- клатуры отражаются записи только по материалам, а отчет выводится по всем видам номенклатуры (рис. 16.86). •lLI Кеистрдктор эапром * О Таблмшипола См» Гр^пцквка Успеем Доломпе*но 06ьеа*<еи«»/Псеыот**1ы Помоек Кемином а ое»*» Характеристкм Пакет запросов № Т«б1М1«1 В Таблице? В П Услееиесемк 1 • ! 0ст«гкй4омепимг*ы0сгвпш L1L1 слрНомепимг*» L Остапи4<ом«1*ла^|рь1ОсгвгкмНомепимг*» Q епрНоме>«лвг<|ре.Ссы1Кв < Нема Далее > | ОК | Отмена Сг^аега Рис. 16.86. Определение связи между таблицами Перейдем на закладку Условия и на уровне запроса установим отбор, чтобы наименования групп не попадали в отчет. Для этого раскроем таблицу спрНоменклатура, перетащим мышью поле ЭтоГруппа в список условий, установим флажок Произвольное и внесем в поле Условие следу- ющий текст (листинг 16.3). Листинг 16.3. Условие запроса спрНоменклатура.ЭтоГруппа = ЛОЖЬ Закладка Условия примет вид (рис. 16.87). И Конструктор запроса " □ X Табдацы... Связи Групгмро... | Условия | Дополни.. Обьедин...Порядок Компоно... Характер... Пакет за... X ___________________________________________________________________________ Номер П.. Условие 1 ^^спрНоменклегтураЭтоГруппа» Ложь Поля •*- 0 ОстаткмНоменклагурыОстап ЙП спрНоменклатура = Ссылка в ВерсияДаншк = ПометкаУдалежя = Предопределенный •+ в Родитель в Код | Запрос | | < Назае | | Далее > | | ОК | | Отмена | | Ставка | Рис. 16.87. Создание условия запроса Том 2
Примерен раз р а б от к и [отд ёто в СОВЕТ Отбор можно применять и в самом запросе, и в настройках отчета. То же касается сортировки и группировки. Отбор лучше применять в запросе, если записи, не удовлетворяющие условию запроса, навер- няка не понадобятся в отчете. Сортировку и группировку лучше применять уже в настройках отчета, чтобы сделать его более гибким. На закладке Объединения/Псевдонимы изменим имена у полей запроса на более понятные (рис. 16.88). Конструктор запроса " СК Таблицы... Связи Группою... Условия Дополни... | Обьэдин... | Порядок Кцыпомо... Характер... Пакет за.. I^i । -и- о х । ф о Нмя Запрос 1 Безду... Ц-—- Имя ПОЛЯ = Номенклатура “ Группа = Ока L. Склад Запрос 1 = слрНоменклащра.Ссылка = спрНоменклапраРодитель = спрНомемклапраВиаНоменклгггурь1 L. ОстеткиНоменклэтурыОстэтки.Склад — J ОстеткиНоменклетурыОстаггки.Кол«ествоОстигок | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.88. Установка псевдонимов полей запроса СОВЕТ Имена полей лучше изменять в запросе, так как в этом случае в схему компоновки данных они перенесутся сразу в три колонки: Поле, Путь и Заголовок, и не нужно будет лишний раз их изменять. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Текст запроса, сформированный платформой, примет вид (листинг 16.4). Листинг 16.4. Текст запроса ВЫБРАТЬ спрНоменклатура.Ссылка КАК Номенклатура, спрНоменклатура.Родитель КАК Группа, спрНоменклатура.ВидНоменклатуры КАК Вид, Остатки НоменклатурыОстатки.Склад, ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК Остаток ИЗ Справочник.Номенклатура КАК спрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ПО ОстаткиНоменклатурыОстатки.Номенклатура = спрНоменклатура.Ссылка ГДЕ спрНоменклатура.ЭтоГруппа = ЛОЖЬ Для решения нашей задачи - вывода списка номенклатуры с остат- ками - мы выбрали вариант соединения двух таблиц в запросе, чтобы продемонстрировать эту возможность системы компоновки данных. И®
Глава116пСложнй1еТаналитическиеТоъчет^1 Но эту же задачу можно решить с использованием двух связанных наборов данных - данных из справочника Номенклатура и регистра накопления ОстаткиНоменклатуры.Остатки. Второй вариант лучше использовать в том случае, если получение данных одним запросом породит слишком сложный запрос, когда необходимо выводить в отчет данные с расчетом итогов, без учета дублирующихся записей, при выводе в результат данных из различных типов наборов данных (например, из запроса и таблицы значений). Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Группа. Выделим группировку Группа и добавим подчиненную ей группировку, не указывая группировочное поле, - Детальные записи. Затем на закладке Выбранные поля перенесем из списка доступных полей поля (рис. 16.89): в Номенклатура, Вид, в Склад, в Остаток. Т^1 Отчет СписокНвменклатуры: ОсновнаяСиемаКомпеновкиДанных _ □ X Рис. 16.89. Определение полей и группировок отчета На закладке Другие настройки установим Макет оформлания (стр. 300) - Яркий. Запустим отчет на исполнение в режиме 1С:Предприятие. Нажмем кнопку Сформировать. Наш отчет примет следующий вид (рис. 16.90).
Рис. 16.90. Результат отчета Программный запуск отчета Теперь реализуем вызов нашего отчета из формы списка справочника Номенклатура. Для этого создадим основную форму списка справочника и отредактируем ее. Создадим команду Печать и соответствующую ей кнопку формы, по нажатии которой содержимое отчета СписокНоменкла- туры будет выводиться в табличный документ и показываться пользователю. В обработчике команды напишем следующий код (листинг 16.5). Листинг 16.5. Обработчик команды «Печать» &НаКлиенте Процедура Печать(Команда) Результат = ВывестиСписокНоменклатуры(); Результат.ОтображатьСетку = Ложь; Результат.ОтображатьЗагоповки = Ложь; Результат.Показать(); КонецПроцедуры Отчет формируется в серверной внеконтекстной функции ВывестиСпи- сокНоменклатуры(). Затем заполненный данными табличный документ возвращается на клиента и показывается пользователю (листинг 16.6). Листинг 16.6. Функция «ВывестиСписокНоменклатуры()» &НаСервереБезКонтекста Функция ВывестиСписокНоменклатуры() // В качестве схемы компоновки данных используем макет отчета "Список Номенклатуры". Профессиональная разработка в системе «1С:Предприятие 8»
СхемаКомпоновкиДанных = Отчеты.СписокНоменклатуры. ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); II Получим настройки по умолчанию. Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; II Сформируем макет компоновки данных. КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки); II Выполним компоновку данных. ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки); II Выведем результат компоновки в табличный документ. ДокументРезультат = Новый ТабличныйДокумент; ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); Возврат ДокументРезультат; КонецФункции Из комментариев в тексте обработчика видно, что здесь программно реализуются все этапы компоновки данных, которые были описаны в разделе «Устройство системы компоновки данных» на стр. 123. Запустим «1С:Предприятие». Откроем справочник Номенклатура и нажмем кнопку Печать. На экране появится новый табличный документ с данными отчета (рис. 16.91). В данном случае результат отчета выводится в новый табличный документ. Это сделано, чтобы продемонстрировать изнутри процесс формирования отчета. Но можно просто программно открыть форму отчета и при этом передать в нее параметр СформироватьПриОткрытии, установленный в значение Истина, чтобы отчет выводился сразу без нажатия кнопки Сформировать. Для демонстрации этой возможности создадим в форме списка справоч- ника Номенклатура команду Отчет и соответствующую ей кнопку формы, по нажатии которой будет открываться форма отчета СписокНоменклатуры и при этом будет сразу же формироваться результат отчета. В обработчике команды напишем следующий код (листинг 16.7). Листинг 16.7. Обработчик команды «Отчет» &НаКпиенте Процедуре Отчет(Команда) ПараметрыФормы = Новый Структуре("СформироватьПриОткрыгии”, Истина); ОткрыгьФорму("Отчет.СписокНоменклатуры.Форма", ПареметрыФормы); КонецПроцедуры Том 2
Номенклатура ^Создать I L+ G& й I С^Найти.. i ^(Печать, Все действия’ । (?) Наименование in с? ЩЗУ EL3 Моя' \j I... ПСЛредп.®) &i Lft V5 Ей Услу (омплектующие Матервмская плата______ Память_________________ Жесткий диск___________ MowTOpLCD Веб-камера Микрофон_______________ Нал иерархия____________ Могмторы ОЗУ Основные детали Товары для сборки______ Проста детали__________ Забранные компьютеры Компьютер для офиса Компьютер для дома Компьютер игровой______ Услуги__________________ Сборка компьютера Диагностика компьютера Ремонт компьютера Солутствуюиие услуги Восстановление даннж w Материалы Материалы Материалы Материалы Материалы Материалы Материалы Услуга Услуге Услуга Услуга Услуга К ад 000000001 00000001 в 000000008 00000000? Основной Основной Розничный Розничный Розничный Материалы Материалы Материалы 2,000 2,000 2ЦЮ0 7 ДЮ едю Комплекты Комплекты Комплекты Рис. 16.91. Вывод отчета из формы списка справочника «Номенклатура» Запустим «1С:Предприятие». Откроем справочник Номенклатура и нажмем кнопку Отчет. На экране появится наш отчет (рис. 16.92). Номенклатура ^Создать I |_? lx| ! QНайти... i Печать Все действия »i (?) Нааиеномние I+1LJ Моя! V С... (1С:Пр«гфия..|Ц) L<i V5 loi 'ПЦ '311 М М+ М- EL3 Услуг Список номенклатуры Вариант отчета [Основной_ | | Выбрать вариант... I | i> Сформировать 11 0^ Настройка... Era Материал»! Материал»! Материалы Материалы Материалы Материал»! Комплектующие____________ Матерзмскаяплата_______ Память_________________ Жесткий диск___________ Монитор LCD____________ Poff камера Микрофон Мол иерархия_____________ Могмторы ОЗУ Основные детали Товары для сборки Пдочйе детада__________ Собранные компьютеры Компьютер для офиса [Комплекты Компьютер для дома [Комплекты Компьютер игровой [Комплекты Услуги Сборка компьютера Диагностика компьютера Ремонт компьютера Сопутствую ине услуги Восстановление данных Услуга Услуга Услуга Услуга Услуга .Склад? Основной Основной Розы1 или Розы1 или Розы1 или Вседействия’ (?) 2 ДЮ 2 ДЮ 2 ДЮ 7 ДЮ 6 ДЮ Материала Материал»! Материал»! Материал»! Код | 000000001 00000001В I 000000008 00002 Рис. 16.92. Вывод отчета из формы списка справочника «Номенклатура»
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Результат отчета будет тот же, но поскольку в последнем случае откры- вается форма отчета, то пользователю предоставляется стандартный сервис - выбор варианта отчета, открытие формы пользовательских настроек, работа с расшифровкой и т. п. Однако в этом случае (см. листинг 16.7) результат отчета стан- дартно выводится в реквизит формы отчета типа ТабличныйДокумент. Если же требуется выводить результат отчета в другие форматы - таблицу значений, дерево значений и т. п., то нужно использовать первый вариант (см. листинг 16.6). Таким образом, на этом примере мы научились: объединять в запросе несколько таблиц и устанавливать связь между ними, создавать условия отбора, псевдонимы полей на уровне запроса, запускать и программно формировать отчет из формы списка справочника. Пример 5. Набор данных - объединение Набор данных - объединение предназначен для разработки отчета, содер- жащего объединенную информацию из различных наборов данных. Такой набор содержит два или более подчиненных набора данных, но информация в них не связывается, а объединяется. В третьем примере (стр. 145) раздела «Примеры разработки отчетов» объяснялось, что при связывании наборов данных в схеме компоновки используется Левое соединение. То есть в отчете будут показаны все записи из левого набора данных, описанного в выражении связи, а из правого набора будут показаны только те записи, которые соответствуют условию связывания. Если же требуется вывести в отчет все записи из обоих наборов данных, используется набор данных - объединение. Для примера создадим отчет, объединяющий информацию о поступлении и продаже номенклатуры. В нем мы сгруппируем полученные данные по позициям номенклатуры и выведем их в табличный документ с помощью конструктора настроек (рис. 16.93). Номенклатура Поступило Продано Сумма Сумма _____________________________________________поступления продажи Вебчоамера тпдд) 3,000 5П 000,00 *500,00 Восстаиоелаиое дамых 1,000 5 500,00 Диетостип коиъютера 3,000 2500,00 Жестом диск 3,000 9 000,00 Комгыстер для доме 1.000 Ю50ОДО Комгыстер для Офисе 1.000 Ю50ОД0 Комгыстер игровой 1.000 1Э500ДО Матереют плота 5,000 Ю 000Д0 Ммсрофон 10,000 2,000 7 000,00 2500,00 MotMtcpLCD 4,000 2,000 34000Д0 22500,00 Память 5,000 6000Д0 Ремонт коиъютера 2,000 6 500,00 Сопутствуюк^ю услуги 4,000 2 000 ДО Итога 37.000 20,000 76 000,СО 70 500,00 РИС. 16.93. ТрвбувМЫЙ ВИД ОТЧвТЭ Создадим новый объект конфигурации Отчет и назовем его АнализПоступ- ленияПродаж. Откроем конструктор схемы компоновки данных и добавим новый набор данных - объединение (рис. 16.94). ЙИ
Й Отчет АналивПоступлвнивПроАаж: ОсновнаяСдемаКомпоиовкнДаниых _ □ X Наборы данных | Связи наборов... Вычисляемые... Ресурсы Параметры Макеты Вложенные сяе... Настройки Ей I Добавить набор данных-запрос Добавить набор данных-объект Добавить набор данных объединение — I I— Рис. 16.94. Добавление набора данных - объединение В схеме компоновки данных будет создан набор данных типа Объединение с именем НаборДанных1. Выделим его в дереве наборов данных и, вызвав его контекстное меню или нажав кнопку Добавить, добавим в него новый набор данных - запрос (рис. 16.95). Й Отчет АналнэПоступлемияПроааж: ОсновнаяСхемаКомпсновкыДанных □ X Рис. 16.95. Добавление набора данных - запрос Назовем его Поступление. Чтобы ввести новое имя набора данных, можно дважды щелкнуть по его названию. Откроем конструктор запроса. В качестве источника данных для запроса выберем табличную часть ПереченьНоменклатуры таблицы документа ПриходнаяНакладная. В список полей перенесем поля из табличной части этого документа (рис. 16.96): Номенклатура, Количество, Сумма. в Приканатйакладнат<1еречв№Номени1ап|}ыКол4чесгво = Приходна^акладна^еречечьНомен<лапрыСумма Рис. 16.96. Выбор полей для запроса На закладке Объединения/Псевдонимы изменим имя у поля Количество на Поступило, Сумма на СуммаПоступления (рис. 16.97). lid Конструктор запроса □ х Таблицыи... Групгмровка Условия Дополните... Обьешечен.. Порядок Компоновк... Характера.. Пакет запр.. -и- X v О Имя Безду.. Загрос! □ Имя поля Запрос 1 = BEBSS = ПрихаднаяНакладначЛереченьНомепслагуры.Номенклатура j = СуммаПоступления = ПрихаднаяНакладна^1ереченьНометжлвгурыСулла ! Запрос < Назад Далее > ОК | Отмена Справка Рис. 16.97. Изменение имен полей в конструкторе запроса Профессиональная разработка в системе «1С:Предприятие 8»
Нажмем ОК и вернемся в конструктор схемы компоновки данных. Затем выделим родительский набор данных НаборДанных1 в дереве наборов данных и добавим в него еще один набор данных - запрос. Назовем его Расход. Откроем конструктор запроса. В качестве источника данных для запроса выберем табличную часть ПереченьНоменклатуры таблицы документа РасходнаяНакладная. В список полей перенесем поля из табличной части этого документа (рис. 16.98): Номенклатура, Количество, Сумма. Поля = РасходнаяНаютаднаяПереченьНоменклатурыКоличество = РасходнаяНамаднаяЛеречен>Номенклэтуры.Сумма Рис. 16.98. Выбор полей для запроса На закладке Объединения/Псевдонимы изменим имя у поля Количество на Продано, Сумма на СуммаПродажи. Нажмем ОК и вернемся в конс- труктор схемы компоновки данных. На закладке Ресурсы схемы компоновки данных, в списке Доступные поля расположены все поля из объединенного набора данных отчета. Нажмем кнопку l2>.l, чтобы конструктор выбрал все доступные ресурсы, по которым можно вычислять итоги (рис. 16.99). Отчет АналиэПоступленмяПродаж: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборыданных Связи наборов... Вычисляемые... | Ресурсы |_ Параметры Макеты Вложенные сх... Настройки Доступные поля Поле Выражение Рассчитывать по... & nRRSISHIflfflSRIfBEb 1 > 1 в Поступило Сумма(Поступило) в Поступило = Продано = СдомаПоступления = СдомаПродами 1±1Ы®1 в Продано = СуммаПоступления в СуммаПродажи Сумма(Пршано) Сумма(СуммаП вступления) Сумма(СуммаП родами) Рис. 16.99. Выбор ресурсов для отчета Для быстрого создания стандартных настроек воспользуемся конструк- тором настроек. Для этого нажмем кнопку в командной панели схемы компоновки на закладке Настройки. Сначала выберем тип отчета Список, что соответствует элементу структуры отчета Группировка, где инфор- мация выводится по строкам. Нажмем кнопку Далее. На следующем шаге определим поля, выводящиеся в отчет. Список доступных полей включает поля из объединенного набора данных. Нажмем кнопку '>> и выберем из него все поля (рис. 16.100). Нажмем кнопку Далее. На следующем шаге определим поля для группи- ровки записей в списке. Мышью перетащим из списка доступных полей поле Номенклатура (рис. 16.101). Том 2
S Конструктор настроек компоновки данным саНвмниаитуц «Склад Выберите поля, которые будут отображаться в отчете. Доступные поля Поле Поступило Продано С^маЛ вступления СдомаП родажи СистемныеПоля Поступило Продано СдомаП остуиммм С^имаП родами | < Назад 11[ Далее > i| | ОК 11 Отмена 11 Справка | Рис. 16.100. Конструктор нестроек. Шег 2 Конструктор настроек компоноеки данным | < Назад 11 Далее > 11 ОК 11 Отмена 11 Сграака | Рис. 16.101. Конструктор настроек. Шаг 3 Нажмем кнопку Далее. Следующий шаг пропустим, так как сортировка в данном случае нам не важна. Нажмем ОК. В результате наших действий в окне настроек появи- лась группировка Номенклатура и определен список выбранных полей (рис. 16.102). Отчет АнализПоступленияПрадаж: ОсновнаяСяемаКомпоновкиДанныи _ □ X Рис. 16.102. Настройки схемы компоновки данных
Запустим отчет на исполнение в режиме 1 (^Предприятие. Нажмем кнопку Сформировать. Наш отчет примет следующий вид (рис. 16.103). @ ' W АналиэПосту... (^Предприятие) й| [Д 14 Й !®|(аГмм*М--'-ПХ АнализПоступленияПродаж Вариант отчета |Основной| | Выбрать вариант,,. | | 1> Сформировать |i 03 Настройка., Все действия’ । \?) Номенклатура (Поступило Продано Сумма Сумма I поступления продажи Веб-камера ЮДЮ Восстановление данных Диагностика компьютера ЗДЮ 10 000,00 4 500,00 1ДЮ' 5 000,00 ЭДЮ‘ 2 000,00 Жесткий диск ЗД Ю 9 000 ДО Компьютер для дома 1ДЮ 10 000,00 Компьютер для офиса Компьютер игровой Материнская плата 5ДЮ 1ДЮ 10 000,00 1ДЮ' 13 000,00 10000,00' Микрофон ЮДЮ 2 ДЮ 7 000,00 2 000,00 Монитор LCD 4Д Ю 2ДЮ 34 000,00 22 000,00 Память 5ДЮ Ремонт компьютера Сопутствую аре услуги Итого 37,000 6 000 ДО 2 ДЮ 6 000,00 4Д00 2 000,00 20,000 76 000,00 76 500,00 S La. Рис. 16.103. Результат отчета Поступление левое Детальные записи Объединение Детальные записи Номенклатура Жесткий диск Материнская плата Память___________ MoncTopLCD_______ Моистор LCD______ Веб-камера Микрофон_________ Веб-камера_______ Итого Поступило Продано Сумма Сумма поступления продажи ЗДЮ 5 ДЮ 5 ДЮ 2 ДЮ 2Д0 5 ДЮ ЮДЮ 5 ДЮ 2,000 2ДОО 3,000 2ДОО 3,000 37,000 7,000 9 000 ДЮ 10 000 ДЮ 6 000,00 14 000 ДЮ 20 000,00 5 000 ДЮ 7 000,00 5 000 ДЮ 22 000,00 22 000,00 4 500,00 2 OOOJMJ 4 500,00^ 76 000,00 28 500,00 Группировка по номенклатуре Номенклатура Поступило Продано Сумма Номенклатура Веб-камера Жесткий диск Материнская плата Микрофон Монитор LCD Память___________ Итого поступления 10 000,00 _______9 000,00 ЮОООДО 7 000,00 34 000,00 ______6 000,00 Сумма продажи 4 500,00 *3 Жесткий диск Материнская плата_______ Память________________ Монитор LCD Монитор LCD Веб-камера____________ Микрофон______________ Веб-камера Диагностика компьютера Компьютер для офиса Монитор LCD Диагностика компьютера Компьютер для дома Ремонт компьютера Солутстеуювре услуги Восстановление денных Ремонт компьютера Диагностика компьютера Солутстеуювре услуги Монитор LCD Веб-камера____________ Микрофон______________ Компьютер игровой Итого_________________ Поступило Продано Су ПО) 3,000 5ДОО 5,000 2ДОО 2,000 5,000 10,000 5ДОО 1ДЮ __________ 1ДЮ 1ДЮ 1ДЮ __________ 2 ДЮ 1ДЮ _____ 1ДЮ __________ 2 ДЮ 1ДЮ _____ здю _____2 ДЮ 1ДЮ 37,000 20,000 3,000 Группировка по номенклатуре Номенклатура ! Веб-комсро ЛДДРО. здоо 3,000 2,000 2Д0О 2 000,00 22 000,00 ЙЬ',. 76 000ДО 28 500.00 ЮДЮ здю 5 ДЮ Компьютер игровой скея плата 2J0Q!— 2 ДЮ 4 Память 5ДОО 5,000, Ремонт компьютера Сопутствую язе услуги Итого Восстановление данных гностика компьютера Поступило Продано Су _____________________ПО1 —адю1— 4 ДЮ | 37,000 20,000 Рис. 16.104. Результат отчета с использованием объединения и связывания наборов данных
Мы видим, что записи в отчете сгруппированы по полю Номенклатура, и для каждой позиции номенклатуры выводятся суммарные значения количества и суммы ее поступления и продажи. Эти данные попадают в отчет путем объединения информации из документов Приходная накладная и Расходная накладная. В заключение продемонстрируем отличие набора данных - объединение (на рисунке в центре) от связи этих же наборов данных в схеме компо- новки (на рисунке слева и справа). Для наглядности мы вывели в отчет детальные записи и поочередно расположили слева в выражении связи наборы данных Поступление и Расход (рис. 16.104). мма Сумма лупления продажи 9 000Д) 10 000,00_________ 6 000,00_________ 14 000,00 20000Д) 5 000,00_________ 7 000,00_________ 5 000,00 ___________ 1 000,00 ___________10 000 Д) 10 000,00 500,00 ___________ 10 000,00 ___________3 000,00 1 000,00 5 000,00 ___________ ЗОООД) ___________500,00 1 000,00 12 000,00 ___________ 4 500,00 ___________2 000,00 13ОООД) 76 000,00 76 500,00' Расход левый Детальные записи Номенклатура Диа мостика комгаютера Компьютер для офиса Монитор LCD___________ Диамстлмка комгъютера Компьютер для дома Ремонт компьютера Сопутствую азе услуги Восстановление данных Ремонт комгъютера Диагностика комгъютера Сопутствую язе услуги Монитор LCD___________ Веб-камера Микрофон Компьютер игровой Итого Поступило продано Сумма Сумма ______________________поступления продажи 1 000,00 10 000 Д) юооо до 500Д) 10 000 Д) ЗОООД) 1 000,00 5 000Д) ЗОООД) 500Д) 1 000,00 12 000Д) 4 500Д) 2 000 Д) _______________________________________13 000,00 51 000 ДО 76 500 ДО 1ДЮ 1ДЮ 1ДЮ 1ДЮ 1ДЮ 1ДЮ 2ДЮ _1j000_ 1ДЮ 1ДЮ 2ДЮ _1j000_ здю 2 ДЮ 1ДЮ' 24,000 20Д00 4 дю 34 000,00 4ДЮ юдю юдю 34 000,00 10 000 Д) 7 000,00 Группировка по номенклатуре мма Сумма лупления продажи Номенклатура —&еео^е-" > Веб-камера Восстановление данных Поступило Продано Сумма поступления ----------- — 10 000Д) юдю ta компьютера ,10. РОДОС Д^оооЫ. — Компьютер для дома -* Компьютер для офиса ” Компьютер игровой — Микрофон____________ — Монитор LCD_________ Ремонт компьютера Сопутствую a/ie услуги ________________6 000,00 ________________2 000,00 76 000 ДО 76 500,00 Итого ЗДЮ 1ДЮ здю ЦООО 1ДЮ 1,000 2 ДЮ 2ДЮ 2ДЮ 4 ДЮ 24Д00 20.000 юдю 4Д0 7 000,00 34 000 Д) 51 000 ДО Сумма продажи 4 500Д) 5 000Д 2 000,00 10 000 Д) 10 000 Д) 13 000,00 2 000 Д) 22 000 Д) 6 000 Д) ЗОООД) 76 500 ДО —?ееодг*-~ ГоооТю Профессиональная разработка в системе «1С:Предприятие 8»
Пример 6. Автоматическое формирование отчета Теперь на основе полученных знаний усовершенствуем отчет ОтчетПоСистемнымБлокам так, чтобы при открытии отчета задава- лись значения параметров по умолчанию и передавались в отчет. Также было бы удобно, чтобы отчет формировался автоматически, без нажатия кнопки Сформировать. Для реализации этих возможностей создадим основную форму отчета ОтчетПоСистемнымБлокам. Создадим обработчик события формы ПриСо- зданииНаСервере и заполним его следующим образом (листинг 16.8). Листинг 16.8. Обреботчик события формы «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Параметры.СформироватьПриОткрытии = Истина; КонецПроцедуры В обработчике события параметр СформироватьПриОткрытии устанавлива- ется в значение Истина. Таким образом, отчет будет формироваться сразу при открытии формы отчета. Теперь программно установим значения параметров НачалоПериода и КонецПериода и передадим их в отчет. Для этого сначала представим последовательность событий, которые возникают в модуле формы отчета и в модуле объекта отчета при форми- ровании отчета при его открытии (рис. 16.105). Рис. 16.105. Последовательность событий при формировании отчета при открытии Том 2
Сначала у формы отчета вызывается событие ПриСозданииНаСервере. В нем мы задаем необходимость формирования отчета сразу же при его открытии. Затем происходят четыре события, поставляемые расширением управляемой формы для отчета. Сначала выполняется загрузка настроек варианта отчета (основного или выбранного пользователем при последнем формировании отчета) в компоновщик настроек. При этом вызываются события ПередЗагруз- койВариантаНаСервере и ПриЗагрузкеВариантаНаСервере. Очевидно, нам нужно создать обработчик события ПередЗагрузкойВариантаНаСервере, чтобы в нем изменить параметры настроек перед их загрузкой в компо- новщик (листинг 16.9). Листинг 16.9. Обработчик события «ПередЗагрузкойВариантаНаСервере» &НаСервере Процедура ПередЗагрузкойВариантаНаСервере(Насгройки) Настрой ки.ПараметрыВывода.УстановитъЗначениеПараметраСЗа головок", "Продажа системных блоков"); Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(”НачалоПериода”, '20111201'); Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(”КонецПериода", '20111231'); КонецПроцедуры В параметре Настройки в обработчик передаются настройки варианта отчета, имеющие тип НастройкиКомпоновкиДанных. В данном обработ- чике методом УстановитьЗначениеПараметра() изменен заголовок отчета, а также установлены значения параметров начала и конца отчетного периода. Однако если настройки являются пользовательскими (в нашем случае - это параметры отчетного периода) и пользователь хоть раз задавал их значения в форме отчета, то устанавливать их в этом обработ- чике бесполезно. Это происходит потому, что после загрузки настроек варианта отчета восстанавливаются пользовательские настройки, сделанные пользова- телем при последнем формировании отчета и автоматически сохраненные платформой. Пользовательские настройки накладываются на настройки варианта и загружаются в компоновщик настроек. При этом вызываются события ПередЗагрузкойПользовательскихНастроекНаСервере и ПриЗа- грузкеПользовательскихНастроекНаСервере. Так как в схеме компоновки данных мы указали параметры НачалоПе- риода и КонецПериода в составе быстрых пользовательских настроек (стр. 143), то нам нужно создать обработчик события ПередЗагруз- койПользовательскихНастроекНаСервере, чтобы в нем изменить пара- метры пользовательских настроек перед их загрузкой в компоновщик (листинг 16.10).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Листинг 16.10. Обработчик события «ПередЗагрузкойПопьзовательскихНастроекНаСервере» &НаСервере Процедура ПередЗагрузкойПользовательскихНастроекНаСервере(Настройки) Настройки.Элементы[0],Значение = '20111201'; Настройки.Элементы[0].Использование = Истина; Настройки.Элементы[1].Значение = '20111231'; Настройки.Элементы[1].Использование = Истина; КонецПроцедуры В параметре Настройки в обработчик передаются настройки варианта отчета, имеющие тип ПользовательскиеНастройкиКомпоновкиДанных. Так как параметра всего два, то можно обращаться к ним по индексу (О, 1) в коллекции элементов пользовательских настроек. Мы устанавли- ваем значения параметров начала и конца отчетного периода и задаем для них признак использования. Эти настройки загружаются в компо- новщик настроек, и отчет формируется с заданными параметрами. Дальше платформа автоматически вызывает метод СкомпоноватьРе- зультат(), и происходит событие отчета ПриКомпоновкеРезультата. Отчет компонуется и выводится пользователю. Запустим «1С:Предприятие» и откроем наш отчет (рис. 16.106). Рис. 16.106. Открытие отчетной формы Как мы видим, отчет формируется сразу же при его открытии, и пара- метрам Начало периода и Конец периода по умолчанию присвоены значения - начало и конец месяца. Дальше пользователь может произ- вольно их менять и переформировывать отчет, пользуясь кнопкой Сформировать.
Пример 7 На примере этого отчета мы продемонстрируем использование в схеме компоновки данных информации из двух (нескольких) наборов данных, а также передачу параметров в объектную (ссылочную) таблицу запроса. Отчет должен отражать информацию о сборке системных блоков за период с детализацией информации по номеру, дате и мастеру сборки (рис. 16.107). Системный блок Компьютер для офиса Количество 1 1 Стоимость Мастер 8 508,08 8 5МД0 Соколов Аодрей Дата Номер 1 0 500,00 06.122011 000000001 Компьютер для дома 1 1 9 000,08 9 080,80 Ильин Сергей 1 9 000 ХЮ 11.122011 000000002 Компьютер игровой 1 1 1 18 500Д)8 18 580,80 Соколов Аодрей 10 500,00 11.012012 000000003 Итого 3 28 800,08 Рис. 16.107. Требуемый вид отчета Создадим новый объект конфигурации Отчет и назовем его Сбор- каСистемныхБлоков. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Он будет назван по умолчанию НаборДанных1. Откроем конструктор запроса. В качестве источника данных для запроса выберем объектную таблицу регистра накопления СобранныеСБ. В список полей перенесем поля из этой таблицы: СБ, Количество, Стоимость, Мастер, Регистратор. Поле Регистратор нам понадобится в качестве ссылки на документ Сбор- каКомпьютера, который произвел движения в регистре накопления СобранныеСБ, чтобы установить связь со вторым набором данных. Перейдем на закладку Условия, раскроем таблицу СобранныеСБ и перетащим мышью поле ВидДвижения в список условий. Оставим предложенное условие по умолчанию. Это условие нам нужно, чтобы в отчете отражались данные из регистра с видом движения Приход (рис. 16.108). На закладке Объединения/Псевдонимы изменим имя у поля СБ на Систем- ныйБлок. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Таким образом, в этом наборе данных мы получим информацию о собранных системных блоках, их количестве, стоимости, мастере, выполнившем сборку. Но нам нужна еще другая, связанная с ней более детальная информация из документов по сборке системных блоков. Есть несколько путей осуществления этой задачи, но мы будем получать эти данные из связанного набора данных. Профессиональная разработка в системе «1С:Предприятие 8»
1Й Конструктор запроса * □ X Таблмцыи... Группировка I Условия I Дополните... Объединен,. Порядок Компоновк... Характеры.,. Пвкетэап... т 3 СобранныеСБ 19 Период +' В * * * * * * * * * * 19 Регистратор = НомерСгроки = Активность e QiQSSSSS + Ц СБ U Склад J Количество J Спмность Номер П.. Условие = Собрам1ыеСБ.ВмДвижения > ВццДвижения | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.106. Создание условия запроса Добавим еще один набор данных - запрос. Он будет назван НаборДанных2. Чтобы добавление стало доступным, нужно выделить корневой элемент дерева наборов данных (рис. 16.109). Й Отчет СборкаСистемныхБлоков: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборы данных | Связи наборе... Вычисляемые... Ресурсы Параметры Макеты Вложенные сх... Настройки (fi}.. ~ ВБЗЗЗЯбЗ Имя источника данных а 1111 НаОорДаншх! СЗ И Рис. 16.109. Добавление нескольких наборов данных В качестве источника данных для запроса выберем объектную таблицу документа СборкаКомпьютера. В список полей перенесем поля из этой таблицы: Дата, Номер, Ссылка. Поле Ссылка нам понадобится в качестве ссылки на регистр накопления СобранныеСБ, чтобы установить связь с первым набором данных. Нажмем ОК и вернемся в конструктор схемы компоновки данных. С точки зрения эффективности исполнения отчета лучше получать в дочернем наборе сразу только те записи, которые удовлетворяют условию связи наборов данных. Для этого нужно указать в запросе дочер- него набора параметр связи и использовать его в схеме компоновки при описании связи (см. рис. 16.110). Иначе в дочернем наборе будет полу- чено много лишних записей, которые затем будут откидываться как не удовлетворяющие условию связи. В текст запроса добавим условие с параметром Ссылка, в который будет помещено значение связи набора данных - источника. В результате набор данных - приемник НаборДанных2 будет получать только те документы Том 2
СборкаКомпьютера, которые произвели движения в регистре накопления СобранныеСБ (листинг 16.11). Листинг 16.11. Текст запроса для получения набора данных «НаборДанных2» ВЫБРАТЬ Сбор каКом пьютера.Дата, СборкаКомпьютера.Номер, Сбор каКом пьютера.Ссылка ИЗ Документ.СборкаКомпьютера КАК СборкаКомпьютера ГДЕ СборкаКомпьютера.Ссылка В (&Ссылка) Можно было создать это условие интерактивно, в конструкторе запроса, аналогично тому, как это сделано для первого набора данных (см. рис. 16.108), но здесь продемонстрирована возможность сделать это вручную в тексте запроса. Для большей наглядности назовем первый набор данных РегистрСБ, второй - ДокументСБ. Чтобы ввести новое имя набора данных, можно дважды щелкнуть мышью по его названию. Если в схеме компоновки данных присутствуют несколько наборов данных, то между ними требу- ется установить связь (стр. 268). На закладке Связи наборов данных добавим новую строку. В поле Источник связи, то есть в качестве родительского набора данных, укажем РегистрСБ, в поле Приемник связи, то есть в качестве зависимого набора данных, укажем ДокументСБ. В поле Выражение источник выберем из полей роди- тельского набора поле Регистратор, а в поле Выражение приемник - поле зависимого набора данных - Ссылка. В поле Параметр выберем из списка параметров параметр Ссылка родительского набора данных, в котором будет храниться значение связи (рис. 16.110). Й Отчет СборкаСистемныхБлоков; ОсновнаяСхемаКомпоновкиДанных □ X Наборыданных | Связи наборе... | ВычисляемыеРесурсы Параметры Макеты Вложенные сх... Настройки Источник связи Приемник овяеи Выражение источник I Выражение приемник Параметр Список... Условие... Началь... Обяээт... РегистрСБ ДокументСБ Регистратор ] Ссылка 0 Рис. 16.110. Создание связи наборов данных Все связи, созданные в схеме компоновки данных, считаются Левыми внешними соединениями, то есть в отчет будут включены записи из обоих наборов данных, удовлетворяющих условию связи Регистратор = Ссылка. Кроме того, у родительского набора данных РегистрСБ будут отражаться в отчете все записи, независимо от того, найден ли соответствующий им документ в наборе данных ДокументСБ или нет. Поэтому при опреде- лении связей наборов данных требуется внимательно обдумать вопрос, какой из наборов данных будет родительским, а какой - зависимым.
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Передача параметров в запрос набора данных Перейдем на закладку Ресурсы и определим доступные поля ресурсов отчета (стр. 290), рис. 16.111. Й Отчет СборкаСистемныхБлоков: ОсновнаяСхемаКомпоновкиДаяных _ □ X Наборыданных Связи наборо... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные сх.., Настройки Доступные поля Поле Выражение Рассчитывать по... 19 Количество = Мастер 19 Номер в Регистратор 19 СистемньйБлок = Ссылка = Стоимость iZi Г«1 С«длма(Ко1Мчество) = Стоимость Сумма(Стоимость) Рис. 16.111. Определение ресурсов отчета На закладке Параметры (стр. 292) мы видим параметры компоновки данных, созданные платформой (рис. 16.112). Й Отчет СборкаСистемныхБлоков: РсновнаяСхемаКомпоновкиДанных □ X Наборыданных Связи наборов дан,, Вычисляемые поля Ресурсы | Параметры | Макеты Вложенные схемы Настройки Ф 'С* Имя Заголовок 'im Д., 1 Д... Значение Выра.. Пара.. В... 0.. 3... Исполь... ВцдДвижен-п В цц движения Системные перечислен».... □ Приход 00 □ Авто Ссылка Ссылка ДокументСсылка СборкаК... □ Документ. СборкаКомпьюгера 0 1© [_) Авто Рис. 16.112. Параметры компоновки данных, созданные платформой Параметру ВидДвижения по умолчанию установлен тип СистемныеПе- речисления.ВидДвиженияНакопления, присвоено значение Приход, и установлена его недоступность для пользователя. Также недоступен параметр Ссылка, который служит для получения значения связи наборов данных, используемых в схеме компоновки данных отчета. Это нас устраивает, но мы не видим здесь автоматически созданных параметров начала и конца периода, так как в обоих наборах данных мы использовали объектные, а не виртуальные таблицы. В этом случае мы должны явно задать эти параметры в запросе родительского набора данных. Откроем конструктор запроса набора РегистрСБ и перейдем на закладку Условия. Раскроем таблицу СобранныеСБ и перетащим в список условий поле Период. Отметим, что условие является произ- вольным, и внесем в поле Условие следующий текст (листинг 16.12). Листинг 16.12. Условие запроса для параметра «НачалоПериода» СобранныеСБ.Период >= &НачалоПериода Аналогично добавим еще одно условие (листинг 16.13).
Листинг 16.13. Условие запроса для параметра «КонецПериода» | СобранныеСБ.Период <= &КонецПериода Закладка Условия примет вид (рис. 16.113). ffl Конструктор запроса * □ X Таблицыи... Группировка | Условия | Дополните... Объединен.. Порядок Компоновк... Характери.. Пакет зад.. Поля •?. lai Номер П.. Условие 1 □ = СображыеСБ.ВшДвижения • 2 /0\СобранныеС6.Период >= ЬНачалоПериода ВиоДвижения 3 ДуНСобранныеСБ. Период <= ЬКонецПериода | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.113. Использование параметров в условиях запроса Нажмем ОК. Зададим настройки параметров так же, как и во втором примере (см. рис. 16.59-16.61). На закладке Параметры для параметров НачалоПериода и КонецПериода в колонке Тип нажмем кнопку выбора - и в нижней части окна редактирования типа данных установим Состав даты в значение Дата. Для параметра КонецПериода зададим значение колонки Выражение, чтобы данные за последний день отчета были вклю- чены в расчет (листинг 16.14). Листинг 16.14. Выражение для расчета параметра «КонецПериода» | КонецПери<эда(&КонецПериода, "День") Снимем флажок Ограничение доступности у этих параметров, так как они будут задаваться пользователем при формировании отчета. А также установим для них свойство Использование в значение Всегда. Так как параметры передаются в запрос всегда, то установка обяза- тельного использования параметров позволит сформировать отчет без ошибки, даже если значения параметров не указаны. В результате параметры компоновки данных примут вид (рис. 16.114). Наборыданных Связи наборов дан... Вычисляемые поля Ресурсы | Параметры | Макеты Вложенные схемы Настройки В л О Й Отчет СборхаСистемныхБлоков: ОсновнаяСхемаКомпоновкиДанных Имя Заголовок Тип Д... Д.. Значение ! Вьражение Па... В... 0... 3... Испол... ВиоДвижетмя В кд движет*» Сисгемше переч... □ Приход 0 0 □ Авто Ссылка Ссылка ДокументСсылка... □ Документ... 0 0 □ Авто НачалоПериода Началопериода Дата □ 0/СТ и Всегда'' КонецПериода Конец периода Дата | КонецПериада(ЬКонецПериада,"День") □ Рис. 16.114. Параметры компоновки данных Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Систем- Профессиональная разработка в системе «1С:Предприятие 8»
ныйБлок. Затем добавим вложенную в нее группировку Мастер. Выделим группировку Мастер и добавим вложенную в нее группи- ровку без указания группировочного поля ДетальныеЗаписи. Затем на закладке Выбранные поля перенесем из списка доступных полей поля (рис. 16.115): Количество, Стоимость, Дата, Номер. Отчет СборкаСистемныхБлоков: О оновнаяСхемаКомпоновкиДанных _ П X Рис. 16.115. Определение полей и группировок отчета На закладке Сортировка зададим порядок сортировки записей в отчете. Для этого перенесем мышью из списка доступных полей поля Дата и Номер. Тем самым мы установили, что внутри группировки детальные записи будут сортироваться по дате, а в пределах одной даты - по номеру документа. Поля группировок автоматически упорядочиваются по груп- пировочному полю. Нажмем кнопку Свойства элемента пользовательских настроек, расположенную вверху, в командной панели окна настроек, и включим настройку Порядок в состав пользовательских настроек отчета (рис. 16.116). Усовершенствуем внешний вид отчета. На закладке Наборы данных выделим набор данных ДокументСБ и в колонке Оформление зададим формат поля Дата, чтобы дата отображалась без времени. Вызовем диалог Формат поля и в строку Формат введем выражение (листинг 16.15). Для этого можно также воспользоваться конструктором. Листинг 16.15. Формат поля «Дата» ДФ=(Й.ММ.уууу | Том 2
Примерен раз ра б от к и [отд ето в Рис. 16.116. Выбор попей сортировки записей отчета На закладке Параметры установим параметры НачалоПериода и КонецПе- риода в состав быстрых пользовательских настроек. То есть эти настройки будут находиться непосредственно в отчетной форме. Для этого выделим каждый из параметров и нажмем кнопку Свойства элемента пользова- тельских настроек, расположенную в правом нижнем углу окна настроек. Установим флажок Включать в пользовательские настройки и оставим пред- ложенное по умолчанию для свойства Режим редактирования значение Быстрый доступ. На закладке Другие настройки установим заголовок отчета Сборка системных блоков, а макет оформления (стр. 300) отчета - Арктика. Также продемонстрируем возможность управлять расположением ресурсов. Стандартной позицией ресурсов является позиция После всех полей. Мы установим параметр Авто позиция ресурсов (стр. 329) в значение Не использовать и включим эту настройку в состав обычных пользователь- ских настроек, доступных в форме Настройка (рис. 16.117). Параметры Выбранные... Отбор Сортировка Условное о...Польэовате... | Другие наст... I Пар» □ Г[ □ ш □ Ui □ с> □ Pl □ п. □ Pl Пользовательские настройки элемента Включать в пользовательские настроОш Представление________ Съёжим редактирования □ Выводить заголовок @ Заголовок Сборка системных блоков □ Выводить параметры Авто □ Выводить отбор Авто поэзия ресурсов Авто | ОК || Отмена 11 Справка | Рис. 16.117. Настройка позиции ресурсов
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 При этом значении параметра поля ресурсов будут располагаться в порядке расположения в отчете - сначала поля группировок, потом в том порядке, в котором они расположены на закладке Выбранные поля настроек отчета (см. рис. 16.115). Запустим «1 (^Предприятие» и сформируем отчет за период 01.12.2011— 31.12.2011 (рис. 16.118). (}2) Сборка системных блоков • Демонстрационная ко... (1 ^Предприятие) iiR| Cgi [Д "ц? IS] 'П*| 'зЯ - □ X Сборка системных блоков Вариант отчета: [Основной____ | Сформировать | Настройка^ * @ Настройки отчета "Сборка системных блоков"- Дем... (ЮПредприягие) X Настройки отчета "Сборка системных блоков" itti Начало периода iTTi Конец периода ОЙ Сортировка Системный блок Мастер Параметры: Начало периода: 01.122011 Конецпериода: 31.122011 Настройка itti Начало периода itti Конец периода ОЙ Сортировка 0 Off Авто позиция ресурсов I Значение 31.122011 Дета, Номер Не испогьзоееть Сборка системных бл< | Завершить редактирование | Отмена । Вое действия ▼ i (?) Количество Стоимость Компьютер для дома Ильин Сергей Номер Компьютер для офиса Соколов Аццрей Итого Дате 1 9 800,08 j__________9 080,80___________________________ ___________9 000,00 11,122011 [000000002 1 8 500Д)8 J__________8 580,80___________________________\ 8 500,00 06,122011 [000000001 2 17 500,08 ~| Рис. 16.118. Результат отчета Программная установка параметров отчета Теперь разработаем специальную отчетную форму для автоматического запуска отчета и инициализации параметров при открытии формы. Для реализации этих возможностей создадим основную форму отчета СборкаСистемныхБлоков. Создадим обработчик события формы ПриСозда- нииНаСервере и заполним его следующим образом (листинг 16.16). Листинг 16.16. Обработчик события формы «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Параметры.СформироватьПриОткрытии = Истина; КонецПроцедуры В обработчике события параметр СформироватьПриОткрытии устанавлива- ется в значение Истина. Таким образом, отчет будет формироваться сразу при открытии формы отчета.
Теперь программно установим значения параметров Началопериода и Конецпериода и передадим их в отчет. Так как в схеме компоновки данных мы указали параметры Началопе- риода и КонецПериода в составе быстрых пользовательских настроек, то нам нужно создать обработчик события формы ПередЗагруз- койПользовательскихНастроекНаСервере, чтобы в нем изменить пара- метры пользовательских настроек перед их загрузкой в компоновщик (листинг 16.17). Листинг 16.17. Обработчик события «ПередЗагрузкойПользоватепьскихНастроекНаСервере» &НаСервере Процедура ПередЗагрузкойПользовательскихНастроекНаСервере(Настройки) Настроики.Элементы[0].Значение = НачалоМесяца(20111210'); Настройки.Эпементы[1].Значение = КонецНедепи('20120110'); ПорядокНомер = Настройки.Элементы[2].Элементы[1]; ПорядокНомер.Использование = Ложь; Если Настройки.Элементы[2].Элементы.Копичество() <= 2 Тогда ЭлементПорядка = Настройки.Элементы[2].Элементы. Добавить(Тип("ЭпементПорядкаКомпоновкиДанных")); ЭлементПорядка.Попе = Новый ПолеКомпоновкиДанных("Стоимость"); ЭлементПорядка.Использование = Истина; КонецЕсли; КонецПроцедуры В параметре Настройки в обработчик передаются настройки варианта отчета, имеющие тип ПользовательскиеНастройкиКомпоновкиДанных. Сначала мы устанавливаем значения параметров начала и конца отчет- ного периода (с индексами 0, 1 в коллекции элементов пользовательских настроек), причем можно не задавать для них признак использования, поскольку параметры используются всегда. Затем отключаем использо- вание в сортировке (с индексом 2 в коллекции элементов пользовательских настроек) поля Номер. Его индекс в коллекции настроек сортировки равен 1. После этого добавляем поле Стоимость в коллекцию настроек сортировки. Если пользовательские настройки отчета еще ни разу не сохранялись, их нужно задавать в обработчике события ПередЗагрузкойВариантаНаСер- вере (листинг 16.18). Листинг 16.18. Обработчик события «ПередЗагрузкойВариантаНаСервере» &НаСервере Процедура ПередЗагрузкойВариантаНаСервере(Настройки) Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(20111210')); Настройки.ПараметрыДанных.УстановитьЗначениеПараметраСКонецПериода", КонецНедепиС'гмгОПО')); КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
В результате настройки, программно установленные при открытии формы отчета, загружаются в компоновщик настроек, и отчет формируется с заданными параметрами. Запустим «1 (/Предприятие» и откроем наш отчет (рис. 16.119). ® >3- Vf Сборка системных блоко... (1С:Предприягие) iHl Gai L4 W 1й1 Hi| 'з~|| М М* М- - - □ X Сборка системных блоков Вариант отчета: [Основной| | Выбрать вариант... | | Сформировать 11 0^ Настройка... Все действия i (?) Начало периода iTFi Коней периода 15.01.2012 flM Сортировка Дата. Стоимость 1 Г Сборка системных блоков Т Параметры: Начапо периода 01.122011 КонецПериода 15.012012 Системный блок Количество Стоимость Мастер ____________________________________________________________Дате__________Номер i=i Компьютер для офиса 1 8 508,08 Т R Соколов Авдрвй________________________1_________8 500,80______________________ [ "[ _____________________________________1_________8 500,00 06.122011 000000001 1=1 Компьютер для дома 1 9 008,08 Т А Ильин Сергей__________________________1_________9 000,00______________________ [ "[ _____________________________________1_________9 000,00 11.122011 000000002 А Компьютер ифовой 1 18 508,08 Hi Соколов Авдрей 1 10 500,00 [ { __________________________;_________1 ________10500,0011.012012 000000003 ' Итого 3 28 888.08 | I 1 1> Рис. 16.119. Открытие отчетной формы Он будет сформирован автоматически со значениями настроек, задан- ными по умолчанию при открытии формы. Таким образом, на примере этого отчета мы научились: и использовать в схеме компоновки несколько наборов данных и зада- вать связь между ними, и передавать параметры в объектные таблицы на уровне запроса, и отображать в форме настройки сортировки отчета, и автоматически запускать отчет при открытии формы, в задавать значения настроек по умолчанию при открытии формы и программно передавать их в отчет. Том 2
Пример 8 Рассмотрим пример отчета, который будет отражать информацию по продажам номенклатуры за указанный период (рис. 16.120). Контрагент Номенклатура Период__________________ ООО 'Автоматика* Диагностике компьютера 5 декабря 2011 г. 11 декабря 2011 г. Компьютер для дома 11 декабря 2011 г. ООО "Система* Компьютер для офиса 9 декабря 2011 г. ООО "Стиль* Монитор LCD 0 декабря 2011 г. Итого Количество Стоимость 11 500,00 2 1 500,00 I 1 1 000,00 | 1 500,00 1 10 000,00 I 1 10000,00 10000 до 1| 10 000,00 I 1| юооодо 10000 до 11 10000,00 | 1| 10000 до 31 500 ДО Рис. 16.120. Требуемый вид отчета Для этого нам потребуется извлечь данные из оборотного регистра Продажи. Создадим новый объект конфигурации Отчет и назовем его ПродажиНоменклатуры. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Откроем конструктор запроса. Извлечение данных по периодам В качестве источника данных для запроса выберем виртуальную таблицу регистра накопления Продажи.Обороты. Вызовем диалог параметров виртуальной таблицы. Для этого в списке таблицы нужно нажать кнопку Параметры виртуальной таблицы (рис. 16.121). Xi SK(*P) I Таблицы 1пподажиОбороты| Рис. 16.121. Вызов диалога параметров виртуальной таблицы В открывшемся окне параметров зададим значение параметра Периодич- ность - День (рис. 16.122). Параметры виртуальной таблицы Началопериода КонецПериода Периодичность Условие I | 0К || Отмена | | Справка | Рис. 16.122. Установка параметра «Периодичность» В®!!
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В список полей перенесем поля из таблицы Продажи.Обороты: Период, Номенклатура, Контрагент, КоличествоОборот, СтоимостьОборот. На закладке Объединения/Псевдонимы изменим имя у поля Количест- воОборот на Остаток и СтоимостьОборот на Стоимость (рис. 16.123). ffl Конструктор запроса * □ X Таблицыи... Группировка Условия Дополните... | Объединен.. | Порядок Компоновк... Характеры... Пакет зап.., 1^ . । и О М । и- Q Нмя Запрос! — Беэду... Имя ПОЛЯ e ЩцщД 1_ Номенклатура 1_ Контрагент J Количество J Стоимость — — Запрос! = ПродажиОборотыПериод 1_ ПродажиОборотыНоменклатура 1_ ПродажиОборотыКонтрагент J ПродажиОборотыКоличествоОборот J ПродажиОборотыСтоимостьОборот | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.123. Установка псевдонимов полей запроса Нажмем ОК и вернемся в конструктор схемы компоновки данных. Обра- тите внимание, что в тексте запроса указана периодичность выбираемых данных-День (листинг 16.19). Листинг 16.19. Задание периодичности виртуальной таблицы ИЗ РегистрНакоппения.Продажи.Обороты(,, День,) КАК ПродажиОбороты | Благодаря этому мы можем указать в полях запроса поле Период. Перейдем на закладку Ресурсы и определим доступные поля ресурсов отчета (стр. 290), рис. 16.124. fS] Отчет ПродажиНемвнклаггуры: ОсновнаяСхемаКомпоновкиДанных О X Наборыданных Связи наборов д... Вычисляемые по,., | Ресурсы | Параметры Макеты Вложенные схемы Настройки Гй Г>Г| Zi i«j Доступные поля в Контрагент = Номенклатура в Период в Стокиость Поле = Количество = Стоимость Выражение С«д4ма(Ко1Мчество) Сумма(Сгоммость) Рассчитывать по... Рис. 16.124. Определение ресурсов отчета Для ресурса Количество в колонке Рассчитывать по нажмем кнопку выбора ... и укажем поле Номенклатура и НоменклатураИерархия (рис. 16.125).
Поля группировки Рассчитывать. Поле □ Контрагент □ Контрагент Иерархия Номенклатура g Номенклатура Иерархия J □ Период □ Стоимость □ ОбщйЭигог | ОК || Отмена | Рис. 16.125. Выбор полей группировки для расчета итогов Это сделано для того, чтобы итоги по количеству выводились для конк- ретной номенклатуры и ее иерархических группировок, так как не имеет смысла складывать количество услуг с количеством комплектующих. На закладке Параметры (стр. 292) будем действовать так же, как и в предыдущих примерах (см. рис. 16.59-16.61). Для параметров НачалоПериода и КонецПериода в колонке Тип нажмем кнопку выбора ... и в нижней части окна редактирования типа данных установим Состав даты в значение Дата. Для параметра КонецПериода зададим значение колонки Выражение, чтобы данные за последний день отчета были включены в расчет (листинг 16.20). Листинг 16.20. Выражение для расчета параметра «КонецПериода» | КонецПери<эда(&КонецПериода, "День") В результате параметры компоновки данных примут вид (рис. 16.126). Й Отчет ПродажиНоменклаггуры; ОсновнаяСхемаКомпоновяиДанных □ X Наборыданных Связи наборов... Вычисляемые.,, Ресурсы | Параметры | Макеты Вложенные схе,.. Настроит Dj г-ь Ф О Имя Заголовок Тип Дос... Д... Значение Выражение Парам... В... 0... 3... Исло.. НачалоПериода Начало периода Дата О 0 0 0 Авто КонецПериода Конец периода Дата О SOD Авто 1 । н Рис. 16.126. Параметры компоновки данных Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Контрагент. Затем добавим вложенную в нее группировку Номенклатура. Выделим группировку Номенклатура и добавим вложенную в нее группировку Период. Затем на закладке Выбранные поля перенесем из списка доступных полей поля Количество, Стоимость (рис. 16.127). Теперь усовершенствуем немного внешний вид отчета. На закладке Другие настройки дадим заголовок отчету - Продажи товаров и услуг. Профессиональная разработка в системе «1С:Предприятие 8»
Й Отчет ПродажиНоменклатурьс ОсновнаяСхемаКомпоновкиДанные _ □ X Рис. 16.127. Определение полей и группировок отчета На закладке Наборы данных в списке полей набора данных в колонке Офор- мление зададим формат поля Количество (рис. 16.128). Формат поля X | ОК || Отмена 11 Справка | Рис. 16.126. Формат поля «Количество» Для этого можно воспользоваться конструктором (рис. 16.129). Конструктор Форматной строки X ОЯэык (Страна! __________________________ Число | Дата Булево___________________________________________________ Длина | О Разделитель дробной части | х| □Точность |0 $ | ОРааделнгель групп | ▼ х| О Сдвиг |О С | ОГруппировка |▼! О Представление нуля | х | О Представление отрицательных чисел | у | О Выводить лидирующие нули -Пример:--------------------------------------------------------- | -987 654,321 ,..| Д> 1-987654 | ЧЦ-15 | ОК 11 Отмена | | Справка | Рис. 16.129. Выбор формата для поля «Количество» Том 2
Аналогично зададим формат поля Период (рис. 16.130). Формат поля I Параметр □ Аетоотступ □ Горизонтальное положение О Вертикальное положение Q Размещение □ Ориенгациятексга 0| Формат □ Выделять отрицательные □ Отметка незаполненного □ Минимальная ширина О Максимальная ширина Q Минимальная высота □ Максимальная высота □ Текст Значение Прижать влево Прижать вверх Забивать Ш11ВШК Ложь Ложь | ОК || Отмена 11 Сгдовка | Рис. 16.130. Формат поля «Период» Для этого можно воспользоваться конструктором (рис. 16.131). Конструктор Форматной строки X ОЯэык (Страна! |▼ | Число | Дата | Булево_____________________________________ ОФормагдаты | ▼! (ЙЛокальныйФорметдеть^^^™ 100 -О О Представление пустой даты | .- Пример:-------------------------------------------- [ 30.122011 0:47:30... Х| Е> |30 декабря 2011 г. | ДЛФ=00 | ОК || Отмена | | Справка | Рис. 16.131. Выбор формата для поля «Период» В заключение предоставим пользователю возможность задавать отчетный период перед формированием отчета. Включим параметры НачалоПе- риода и КонецПериода в состав быстрых пользовательских настроек. То есть эти настройки будут находиться непосредственно в отчетной форме. На закладке Параметры выделим каждый из параметров и нажмем кнопку Свойства элемента пользовательских настроек, расположенную в правом нижнем углу окна настроек. Установим флажок Включать в пользовательские настройки и оставим предложенное по умолчанию для свойства Режим редактирования значение Быстрый доступ (рис. 16.132). Запустим отчет на исполнение в режиме 1С:Предприятие. В открывшейся отчетной форме зададим период отчетас01.12.2011 по 15.12.2011. Нажмем кнопку Сформировать. Отчет примет следующий вид (рис. 16.133). и®®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Рис. 16.132. Настройки отчета ® i ’ п- tlfc-al W L4' гй @ ' Я а м м* м- - - □ х Продажи номенклатуры Вариант отчета: | Основной| | Выбрать вариант... | | 1> Сформировать 11 03 Настройка... Все действия ▼ i (?) 0 iTTl Начало периода 0 ithl Конец парима 01.122011 ммми « Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 Контрагент Количество Стоимость Номенклатура Период I .1 ,т .т ООО "Автоматика" Диагностика компьютера 11 500,00 2 1 500,00 5декабря2011 г. 1 1 000,00 11 декабря 2011 г. 1 500,00 Кютыотер для дома 1 10 000,00 11 декабря 2011 г. 1 10 000,00 ООО "Система* Комшотер для офиса В декабря 2011 г. ООО "Стиль" Монитор LCD В декабря 2011 г. Итого 10000до 1 10 000,00 Г 10 000,00 ioooojoo 1 10 000,00 Г 10 000,00 31 500ДО Рис. 16.133. Результат отчета Мы убедились, что формат представления даты и количества соот- ветствует желаемому, а итоги по количеству подсчитываются отдельно для каждого вида номенклатуры.
Интерактивное оформление отчета Теперь предоставим пользователю возможность задавать отбор и условное оформление отчета. Для этого вернемся в конфигуратор и сначала создадим эти настройки в схеме компоновки данных отчета. Откроем закладку Настройки. На закладке Отбор установим отбор записей отчета по определенному виду номенклатуры. Для этого в списке доступных полей раскроем поле Номенклатура и выберем поле ВидНоменклатуры. Остальные параметры отбора оставим по умолчанию - Вид сравнения - Равно, а Правое значение - Перечисление.ВидыНоменклатуры.ПустаяСсылка. Условие отбора примет вид (рис. 16.134). Параметры Выбранные поля I Отбор I Сортировка Условное оформление Пользовательские поля Другие настройки Доступные поля Левое значение Видсравн... Правое значение Режимото... П... = Количество * = Контрагент г = Номенклатура = ВерсияДанных в Код .♦ = МойРдоигель = Наименование Отбор 0 = НоменклатураВкНомемстатуры Равно Перечисление.ВиоыНомеиклагуры... Быстрый... Рис. 16.134. Настройка отбора записей отчета Включим настройку отбора в состав быстрых пользовательских настроек. Для этого нажмем кнопку Свойства элемента пользовательских настроек, расположенную в правом нижнем углу окна настроек, и уста- новим флажок Включать в пользовательские настройки (рис. 16.135). Пользовательские настройки элемента Включать в пользовательские настройки; ®________________________ Представление I^1 Режим редактирования | Быстрый досту|▼ | | ОК | | Отмена 11 Сгдовка | Рис. 16.135. Включение настройки в состав пользовательских настроек отчета На закладке Условное оформление выделим цветом записи отчета со стоимостью продаж меньше 3000 руб. Подробно процесс создания условного оформления описан в первом примере (см. рис. 16.47-16.50). Перечислим кратко наши действия. Нажмем кнопку Добавить справа на командной панели окна. Выберем Оформление для выделения полей. В нашем случае это красный цвет текста. Зададим Отбор - условие для выделения полей (рис. 16.136). Профессиональная разработка в системе «1С:Предприятие 8»
Отбор X Ц’ X и* €- ||П0Дробно| I Левое значение Виц сравнения Правое значение Представление т Отбор 0| J ШНВ9 Меньше 3000,00 | ОК || Отмена | Рис. 16.136. Настройка условного оформления отчета Зададим список оформляемых полей, в нашем случае - поле Стоимость, то есть укажем, какие поля требуется выделить. Обозначим Представление условного оформления как Мелкий заказ. Именно это представление будет выведено пользователю в окне настроек отчета. В результате окно услов- ного оформления должно принять вид (рис. 16.137). Параметры Выбранные п... Отбор Сортировка | Условное оФ... I По/ьэовэтел... Другие наст... Оформление Условие Оформляемые поля Стоимость Пользовательские настройки элемента §ключать в пользовательские wctdc^h; Представление |___ Режим редактирования | Быстрый доступ ОК 11 Отмена | [ Сгравка Представление Мелкий заказ Рис. 16.137. Настройка условного оформления отчета Включим настройку условного оформления в состав быстрых поль- зовательских настроек. Для этого нажмем кнопку Свойства элемента пользовательских настроек, расположенную в правом нижнем углу окна настроек, и установим флажок Включать в пользовательские настройки (см. рис. 16.137). Запустим отчет на исполнение в режиме 1С:Предприятие. В открывшейся отчетной форме зададим период отчета с 01.12.2011 по 15.12.2011. Мы видим, что в форме отчета, под настройками отчетного периода, добавились настройки отбора и условного оформления, которые пользо- ватель может включить или выключить. В настройке отбора пользователь может указать критерий отбора записей в отчет, в нашем случае выбрать вид номенклатуры, или выключить использование отбора. Выберем вид номенклатуры - Комплекты. После этого нажмем кнопку Сформировать. Отчет примет следующий вид (рис. 16.138). Том 2
® С/ Vf ' Прада... (1С:Предприятие) irnl |4 W й '&! 'л! М М* М- * - □ X Продажи номенклатуры Вариант отчета: [Основной | 1> Сформировать 11 Настройка... J | Выбрать вариант... | Все действия - । (?) iTTl Начало периода iTTl Конецпериода |М Номенклатура-Вад но... Равно J[ Мелкий заказ 01.122011 15.122011 Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конец периода: 15.12.2011 Отбор: Номенклатура.Вид номенклатуры Равно "Комплекты" Контрагент Количество Номенклатура Период__________________________________ ООО "Автоматике" Коьгыотер для дома_________________1_ 11 декабря 2011 г. | 1 ООО "Система"_________________________ Коьгыотер для офиса________________1_ 9 декабря 2011г, | 1 Итого Стоимость 10000 ДО 10000,00 10000 ДО 10 000 до 10 000,00 10 000 до 20 000,00 Рис. 16.136. Результат отчета В результате мы видим, что отчет сформирован с учетом введенных нами настроек. Правда, из-за отбора не видно записей с условным оформле- нием. Отключим отбор и увидим следующий результат (рис. 16.139). ® >3. ' П... ПС..|о1 ^*9 1Д 14 й 'iiil 'ail - - □ X Продажи номенклатуры Вариант отчете: [Основной| I Выбрать вариант... | | 1> Сформировать |i 3S Настройка... Все действия ▼ । (?) 0 iTTl Начало пепима 01.122011 0 iTTl Конец периода 15.122011 О j |М НомеадлатураВ... Равно Комплекты 0 gfl Мелкий заказ Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конец периода: 15.12.2011 "т Тт Тт Контрагент Номенклатура Период__________________ ООО "Автоматике" Диагностике компьютера 5 декабря 2011 г, 11 декабря 2011 г. Коьгыотер для дома 11 декабря 2011 г. ООО "Система" Коветыотер для офиса 9 декабря 2011 г. ООО "Стиль" Монитор LCD___________ 6 декабря 2011 г. Итого Количество Стоимость \\f 1 500.00s ' { 1 ooo.ool "V" 500 Д0и 10000,061 10000 до | 10000,00 | юооо,о6| 10000 до I 10 000,00 I 10000,661 31 500 ДО 2 Рис. 16.139. Результат отчета USS
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Нажмем кнопку Настройка. Перед нами появится окно пользовательских настроек отчета, содержащее параметры отчетного периода, настройку отбора и условного оформления (рис. 16.140). В нашем случае все эти настройки являются быстрыми, то есть распола- гаются непосредственно в отчетной форме. Так произошло потому, что в схеме компоновки данных мы установили для них свойство Режим редак- тирования в значение Быстрый доступ (см. рис. 16.135, 16.137). Но если пользователь не считает их жизненно важными и не собирается задавать их перед каждым формированием отчета, то он может изменить состав настроек, выполнив команду Все действия ► Изменить состав настроек. Рис. 16.140. Окно пользовательских настроек отчета в режиме «1С:Предприятие» В открывшемся окне Состав настроек пользователь может указать, какие настройки будут редактироваться в форме отчета (правый список), то есть будут быстрыми, а какие будут доступны по команде Настройка (левый список). Кнопками Добавить, Удалить или двойным щелчком мыши можно перенести настройки из левого списка в правый и наоборот. В данном случае удалим из списка быстрых настроек настройку отбора (рис. 16.141). Йо > Состав настроек Демонстрационная конфигурация "Система компоновки данных" ПСПредприятме) К Состав настроек Вов настройки 1астрой<и, редактируемые в Форме отчета: Настройка Значение «/ иТ| Начало парном </ 1*1 Конец парном 1512.2011 ,1И Номенклатура.,.. Равно Комплекты </ йЗ Мелкийэакаэ | Добавить > | | Добавить все » | | < Удалить | | << Удалить рое | Настройка 1ТП Начало перима 01.122011 </ 1ТП Конец периода 15.122011 Щ jiffi Мелкийэакаэ а : i> | ОК | Отмена । Все действия * । (?) Рис. 16.141. Редактирование состава настроек в режиме «1С:Предприятие»
В результате мы не увидим настройки отбора в отчетной форме, но она будет доступна в окне полных пользовательских настроек по команде Настройка. Мы убедились, что пользовательский интерфейс по настройке и форми- рованию отчета вполне удобен. Однако настройки отбора и условного оформления заданы жестко. Пользователь может лишь включить/выклю- чить признак их использования или выбрать для отбора отчета вид номенклатуры. Этого, как правило, вполне достаточно для неопытных пользователей. Но для более подготовленных пользователей мы можем предоставить более полную свободу в использовании настроек, то есть возможность, например, самостоятельно задавать настройки отчета: отбор, порядок, условное оформление и пр. Вернемся в конфигуратор. На закладке Настройки схемы компоновки данных содержатся полные настройки отчета, которые задает разра- ботчик. Часть из них может быть предоставлена пользователю для создания произвольного отбора, условного оформления отчета и пр. Для этого нажмем кнопку Свойства элемента пользовательских настроек, расположенную вверху командной панели окна настроек (рис. 16.142). В появившемся окне мы можем редактировать состав пользовательских настроек отчета. Установим признак использования для настроек Отбор и Условное оформление и установим для них свойство Режим редактиро- вания в значение Обычный. Рис. 16.142. Состав настроек отчета Таким образом, мы включили настройки отбора и условного оформления в состав пользовательских настроек и предоставили пользователю возмож- ность задавать их в отдельном окне, вызываемом кнопкой Настройка. Профессиональная разработка в системе «1С:Предприятие 8»
Запустим отчет на исполнение в режиме 1 (^Предприятие и откроем окно пользовательских настроек отчета. Мы видим, что здесь находятся две настройки отбора и две настройки условного оформления. Отметим их различие на примере настроек условного оформления. Настройку Мелкий заказ мы заранее создали в конфигураторе. А сейчас мы предоставили пользователю возможность создавать любое количество собственных условий для условного оформления аналогично тому, как мы это делали в конфигураторе. В строке Условное оформление нажмем кнопку выбора и зададим условие, при котором записи отчета с количеством продаж больше 1 будут выделяться желтым цветом фона (рис. 16.143). Рис. 16.143. Настройка условного оформления отчета в режиме «1С:Г1редприятие» Нажмем ОК, Завершить редактирование и переформируем отчет (рис. 16.144). Мы видим, что в отчете применены обе настройки условного оформления. Причем одна из них расположена непосредственно в отчетной форме, а вторая доступна в окне пользовательских настроек по команде Настройка. Вызвав окно настроек, мы можем очистить настройку отбора или услов- ного оформления, нажав кнопку очистки х, или создать ее по другому критерию, нажав кнопку выбора ••• в строке Отбор или Условное оформ- ление. Таким образом, пользователь сможет, при наличии определенной квалификации, задавать многие настройки по своему желанию. Если же такого желания или соответствующих знаний у него нет, лучше задавать эти настройки жестко, а пользователю останется только включать или выключать их использование. При закрытии окна отчета настройки, сделанные пользователем, запо- минаются и становятся настройками по умолчанию для текущего пользователя. Том 2
® с w ' П- пьпр.. |Ё1 GbJ L4 ' гез й ЗУ jH Продажи номенклатуры Вариант отчета: [Основной J | Выбрать вариант... | | 1> Сформировать 11 OS Настройка... Все действия » । (?) @ |ТП Начало периода 0 iTTl Конец периода 0 Мелкий заказ 01.122011 15.12.2011 Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конец периода: 15.12.2011 Контрагент Номенклатура Период__________________ ООО “Автоматика1' Г Диагностика компьютера S декабря ЯН г. 11 декабря 2011 г. Коаетыотер для дома 11 декабря 2011 г. ООО "Система" Коаетыотер для офиса 9 декабря 2011 г. 000"Стюъ“ Монитор LCD___________ 6 декабря 2011 г. Итого Количество Стоимость 11 500до 1 зоб.осг 1 ма,бо 500,00 10 000,00 юооо.оо! 10 000,00 юооо.оо' юооо.оо! 10 000,00 10000,00' юооо.оо! 31 500 ДО т 2 □ X Рис. 16.144. Результат отчета В заключение поясним, что те настройки, которые мы создавали в конфигураторе (отбор, условное оформление и т.п.), можно сделать и в режиме 1 С:Предприятие по команде Все действия К Изменить вариант... (рис. 16.145). @ Вариант "Основной" отчета “Продаим номенклатуры"-Демонстрационная конфигурация "Система компоновки д... (ЮПрадприятие) X Вариант "Основной" отчета "Продажи номенклатуры" Добавить ’I jj|i X I Q I §Й [сЙ В се действия * Структура отчета flg ® ОЙ OS е Q Qgg| пЕ ® OS •:?: 0™ Контрагент - 0™ Номенклатура 0™ Период |ТГ| Парам... r№i Польэо... Грулпи... fig Поля | Отбор" | п!Л Сортир... affl Ясловн... rff Допол... Текущий элемент имеет собственный отбор (для фильтрации записей, выводимых вэлеменге) Выбрать Все действия’ (j?) Добавить новый элемент i Сгрупгофовагь условия i $£ I Ф Q I !J9 Все действия’ Поле Вод сравнения Значение Отбор _____________ = Равно Доступные поля = + в Контрагент +. = Номенклатура = Период = Стоимость +• О Параметры 0 | Завершить редактирование | Отмена i Все действия ’ i (?) Рис. 16.145. Изменение варианта отчета в режиме «1С:Предприятие»
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 При этом пользователю открывается окно настроек отчета, очень похожее на закладку Настройки в схеме компоновки данных. Различие состоит в том, что настройки, сделанные в конфигураторе, называются стандарт- ными настройками и будут сохранены в самой схеме компоновки данных, то есть будут являться частью конфигурации. Это означает, что любой пользователь конфигурации будет видеть отчет именно в таком виде, как мы его настроили в конфигураторе. Все то же самое можно настроить и в режиме 1С:Предприятие, но эта настройка уже не будет являться частью конфигурации и будет доступна только одному конкретному пользователю конкретной информационной базы (если в конфигурации не разработан какой-либо механизм для обмена настройками между различными пользователями). Возможность изменения варианта отчета в режиме 1С:Предприятие пред- назначена не для рядового пользователя (для него - быстрые настройки и пользовательские настройки), а для разработчика, осуществляющего внедрение, администратора или для очень опытного пользователя. Настройки, сделанные в режиме 1С:Предприятие, естественно пере- крывают стандартные настройки. И если пользователь настолько все перестроил в отчете, что его не узнать, то всегда можно вернуться к стан- дартным настройкам по команде Все действия к Установить стандартные настройки. СОВЕТ Для повышения удобства работы с отчетом рекомендуем также устанавливать значения настроек по умолчанию и автоматически формировать отчет при открытии формы, как это показано в шестом примере на стр. 155. Таким образом, на примере этого отчета мы научились: задавать периодичность для виртуальной таблицы в запросе, устанавливать поля группировок для расчета ресурсов отчета, определять формат для представления полей в отчете, отображать пользовательские настройки в форме настроек отчета и самостоятельно определять состав быстрых пользовательских настроек. Пример 9. Свободная структура таблицы отчета В данном примере мы рассмотрим вывод данных в таблицу. Также мы покажем, как сделать отчет максимально универсальным, чтобы позво- лить пользователю в режиме 1 (^Предприятие, не обращаясь к полным настройкам отчета (не выполняя Все действия ► Изменить вариант...), изме- нять его структуру и внешний вид. Например, поменять местами строки и колонки таблицы или изменить данные, выводящиеся в ячейках таблицы.
Создадим отчет, отражающий информацию о работе мастеров по сборке системных блоков в виде таблицы (рис. 16.146). Мастер Компьютер для дома Количество Стоимость Компьютер для офиса Количество Стоимость Компьютер игровой Количество Стоимость Итого Количество Стоимость Ильин Сергей 1 В ООО ,00 1 вооода Соколов Андрей 1 в SCO,00 1 10500,00 2 19 000,00 Итого 1 9 000,00 1 8 500 да 1 10 500,00 3 28 000,00 Рис. 16.146. Требуемый вид отчета Создадим новый объект конфигурации Отчет и назовем его РаботаМастеров. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Откроем конструктор запроса. В качестве источника данных для запроса выберем объектную таблицу регистра накопления СобранныеСБ. В список полей перенесем поля из этой таблицы: СБ, Мастер, Количество, Стоимость. Перейдем на закладку Условия, раскроем таблицу СобранныеСБ и пере- тащим мышью поле ВидДвижения в список условий. Оставим предложенное условие по умолчанию. Это условие нам нужно, чтобы в отчете отража- лись данные из регистра с видом движения Приход (рис. 16.147). QZl Конструктор запроса * □ X Таблицы и... Группировка | Условия | Дополните,., Объединен... Порядок Компоновк... Характери.,, Пакет эапр.., Поля •- 0 СобранныеСБ в Период в Регистратор = НомерСтроки = Активность ИХ Ь Номер П.. Условие ВидДвижения L. Склад | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.147. Создание условия запроса Нажмем ОК и вернемся в конструктор схемы компоновки данных. Чтобы вывести данные отчета в виде таблицы, нам нужно определить ресурсы отчета, так как данные в таблице группируются по строкам и столбцам, а на их пересечении, в ячейках таблицы, находятся групповые итоги, то есть ресурсы (стр. 290). На закладке Ресурсы перенесем из доступных полей все возможные ресурсы Количество и Стоимость (рис. 16.148). Профессиональная разработка в системе «1С:Предприятие 8»
Т^1 Отчет РабетаМасторов: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборы данных Связи наборов... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные сх... Настройки Доступные поля Поле Выражение Рассчитывать по... 1 > 1 = Количество С^мма(Количество) 19 Мастер = СБ = Стоимость (Ы) ш в Стоимость С^мма(Стоимость) Рис. 16.148. Определение ресурсов для отчета Для быстрого создания стандартных настроек воспользуемся конструктором настроек: нажмем кнопку в командной панели схемы компоновки на закладке Настройки. На первом шаге выберем тип отчета Таблица (рис. 16.149). Конструктор настроек компоновки данных Тип отчета: О Список. Данные по есем измерениям отчета выводятся списком. ф|Таблица. Данные выводятся по иемераниям расположенным как no i '•-'горизонтали, так и по вертикали.______________________| О Диаграмма Данные выводятся в виде диаграммы. | Далее > 11 ОК 11 Отмена | Справка j Рис. 16.149. Конструктор настроек. Шаг 1 Нажмем кнопку Далее. На следующем шаге определим поля, выводящиеся в отчет. Перенесем из списка доступных полей все поля (рис. 16.150). Конструктор настроек компоновки данных pHqwkmtvm =С*лад Выберите поля, которые будут отображаться в отчете. Доступные поля = СБ + J Количество + J Стоимость t О СистемныеПоля t о ПараметрыДанных Поле I > I в @ “ 06 ,—, J Количество I < I . _ ~ J Стоимость I <£| | < Назад 11 Далее > 11 ОК 11 Отмена 11 Справка | Рис. 16.150. Конструктор настроек. Шаг 2 Том 2
Нажмем кнопку Далее. На следующем шаге определим поля для груп- пировки строк и столбцов таблицы. Мышью перетащим из списка доступных полей в поля Строки поле Мастер, а в поля Колонки - поле СБ (рис. 16.151). Конструктор настроек компоновки данных Выберите поля по которым будет производиться грулгыроека табтмц. строк и колонок отчета. Поля группировок отображаются в отчете. Рис. 16.151. Конструктор настроек. Шаг 3 Нажмем кнопку Далее. Четвертый шаг пропустим, так как сортировка в данном случае нам не важна. Нажмем ОК. В результате наших действий в окне настроек появи- лась таблица, в строках которой находится группировка Мастер, в колонках - группировка СБ, а также определен список выбранных полей (рис. 16.152). ?1 Отчет РабетаМастеров: ОсновнаяСхемаКомпоновкыДанных - □ X Рис. 16.152. Настройки схемы компоновки данных в®®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Выполним отчет в режиме 1С:Предприятие (рис. 16.153). ® -X/ W Работа мастеров-Демонстрационная конфипюация "Система... (ЮПредприягие) gTj Gai L<i icj |й1 'ПЦ 'ail М М+М-, - □ X Работа мастеров Вариант отчета: | Основной | | Выбрать вариант... | | 1> Сформировать |i ОЗ Настройка... Все действия » । (?) Мастер 1 Компьютер для дома (Количество Стоимость Компьютер для офисе Количество Стоимость Компьютер игровой Количество Стоимость Итого Количество Стоимость Ильин Сергей | 1 9000,00 1 9 000,001 Соколов Андрей l| 8 500,00 1 10 500,00 2 19 000,001 Итого 1 9 000,00 1 В 500,00 1 10 500,00 3 28 000ДО Рис. 16.153. Результат отчета Отчет выводится в таблицу, в строках которой данные сгруппированы по полю Мастер, а в колонках - по полю СБ (системный блок). Сделаем наш отчет более гибким, чтобы он выводился в таблицу со свободной структурой. Для этого в схеме компоновки данных на закладке Настройки снимем признак использования у всех полей отчета. Затем выделим в структуре элементов отчета элемент Таблица и нажмем кнопку Свойства элемента пользовательских настроек, расположенную вверху, в командной панели окна настроек. В появившемся окне мы можем редактировать состав пользовательских настроек таблицы. Установим признак использования для настроек Выбранные поля, Группировки строк и Группировки колонок и оставим для них по умолчанию свойство Режим редактирования в значении Быстрый доступ (рис. 16.154). £] Отчет РабетаМастеров: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.154. Состав пользовательских настроек Таким образом, мы предоставили пользователю возможность само- стоятельно определять состав выбранных полей, группировок строк
и колонок таблицы непосредственно в отчетной форме перед формиро- ванием отчета. Откроем отчет в режиме 1 (^Предприятие. Зададим новую структуру отчета перед его формированием. Нажмем кнопку выбора в строке Выбранные поля и выберем из доступных полей поле Стоимость. Нажмем кнопку выбора в строке Строки и добавим в строки таблицы группировку по полям СБ и Количество. Нажмем кнопку выбора в строке Колонки и добавим в колонки таблицы группировку по полю Мастер. Нажмем Сформировать. Отчет примет следующий вид (рис. 16.155). ® >3. W ' Работ - (ЮПредприятие) ijn| ЭД |_4 ' из Й Ж 12 □ X Работа мастеров вариант отчета: | Основной | | Выбрать вариант.,, 1> Сформировать |i Q3 Настройка... Все действия » i ф ) Ш Выбранные поля Стоимость S Строки I СБ, Количество fl3] Колонки Мастер | |iIh-’iji—'iji—1 | СБ Ильин Сергей Соколов Андрей Итого Количество Стоимость Стоимость Стоимость Комшотер для дома 9000,00 9000,00 1 9000,00 9000,00 Коышотер для офиса 6 500,00 6 500,00 1 | 0 500,00 0 500,00 Комшотер игровой 10 500ДО 10 500,00 1 | 10 500,00' 10 500,00 Итого 9 000,00 19000Д0 28 000,00 ► Рис. 16.155. Результат отчета Как мы видим, ресурсы можно не только выводить в ячейках таблицы (Стоимость), но и группировать по ним данные (Количество). Изменим порядок полей группировки в строках таблицы - Количество, СБ, а в список полей отчета добавим поле Количество. Сформируем отчет. Он примет следующий вид (рис. 16.156). Работа мастеров • Демонстрационная конфигу... (ЮПредприятме) itnl [Д "uj |й1 ffi] jii| □ X Работа мастеров Вариант отчета: | Основной_ | Сформировать || Настройка.. | | Выбрать вариант... | Все действия* । (?) fig Выбранные поля Щ] Строки jTFi Колонки Количество СБ_______________ ^Количество, Стоимость Количество, СБ Мастер Ильин Сергей Соколов Андрей Итого Количество Стоимость Количество Стоимость Количество Стоимость HI э 1 9 000,00 2 19000,00 3 28 000,00 Комшотер для дома 1 9 000,00 1| 9 000,001 Комшотердля офиса 11 В 500,001 l| 8 500,001 Комшотер игровой Итого 1 9 000 ДО 2 10 500,00 j 19 000 ДО l| 10 500,001 3 28 000,00 Рис. 16.156. Изменение структуры отчета Профессиональная разработка в системе «1С:Предприятие 8»
Итак, с помощью конструктора настроек мы вывели данные отчета в виде таблицы и предоставили пользователю возможность самостоятельно определять структуру отчета в соответствии со стоящими перед ним задачами. Пример 10 На примере этого отчета мы продемонстрируем возможность полу- чения данных из нескольких наборов, связанных по периодам. Допустим, требуется выдать в отчет данные по остаткам товаров на складах по месяцам и выдать объем продаж по каждому товару за каждый месяц (рис. 16.157). I Номенклатура Продано Начальный Конечный Начало периода_______________остаток остаток веб-камера ЭДО 7,000 Январь 2012 | 3,00| [ 7,000' Жесткий диск_________________________________________ Декабрь 2011 I I I <000 Январь 2012______I_________I______1,0001________\ Материюкалппата _______________________________2,000 Декабрь 2011 I I I ЗДЮ Январь 2012______j_________I______3,0001 2,000' Микрофон 2Д0 8,000 Январь2012 | 2,00| | 8,000 MowrropLCD_______ 2Д0____________________ 2,000 Декабрь 2011 I <001 I <000 Январь2012 | 1,00| 1Д00| 2,000' Память___________________________________ 2,000 Декабрь 2011 I I I ЗДЮ Январь 2012______I_________I______3,0001 2,000' итого ?.оо 21,000 Рис. 16.157. Требуемый вид отчета Создадим новый объект конфигурации Отчет и назовем его ОстаткиИПро- дажиТоваров. Для реализации такого отчета создадим два набора данных: набор данных с остатками товаров по периодам, набор данных с продажами товаров за период. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Назовем его Остатки. Откроем конструктор запроса. Для того чтобы получить остатки товаров по периодам, воспользу- емся виртуальной таблицей регистра накопления ОстаткиНоменклатуры. ОстаткиИОбороты. Выберем эту таблицу в качестве источника данных для запроса. Вызовем диалог параметров виртуальной таблицы. Для этого в списке таблицы нужно нажать кнопку Параметры виртуальной таблицы. В открывшемся окне параметров зададим значение параметра Периодич- ность - Месяц (рис. 16.158). Параметры виртуальной таблицы Условие X НачалоПериода КонецПериода Периодичность МетодДололнения Рис. 16.158. Параметры виртуальной таблицы Том 2
В список полей перенесем поля из таблицы ОстаткиНоменклатуры.Остат- киИОбороты: Период, Номенклатура, КоличествоНачальныйОстаток, КоличествоКонечныйОстаток. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Плат- форма автоматически сформирует следующий запрос (листинг 16.21). Листинг 16.21. Текст запроса набора данных «Остатки» ВЫБРАТЬ Остатки НоменкпатурыОстаткиИОбороты.Период, Остатки НоменкпатурыОстаткиИОбороты.Номенклатура, Остатки НоменкпатурыОстаткиИОбороты.КопичествоНачальныйОстаток, Остатки НоменкпатурыОстаткиИОбороты.КоличествоКонечныйОстаток ИЗ РегистрНакопления.ОстаткиНоменкпатурь1.ОстаткиИОбороты(,, Месяц,,) КАК ОстаткиНоменкпатурыОстаткиИОбороты Добавим еще один набор данных - запрос. Назовем его Продажи. Откроем конструктор запроса. Продажи за период можно получить при помощи виртуальной таблицы регистра накопления Продажи.Обороты. Выберем эту таблицу в качестве источника данных для запроса. Вызовем диалог параметров виртуальной таблицы. В открывшемся окне параметров зададим значение параметров НачалоПериода и КонецПериода (рис. 16.159). Параметры виртуальной таблицы X НачалоПериода I ЬНачалоПериодаПродаж▼ ! КоиецПериода | ЬКонецПериодаПродаж▼ | Периодичность | х| Условие I ...I 9СЛОВИС ...| I г | ОК || Отмена | | Справка | Рис. 16.159. Параметры виртуальной таблицы В список полей перенесем поля из таблицы ОстаткиНоменклатуры.Остат- киИОбороты: Номенклатура, КоличествоОборот. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Плат- форма автоматически сформирует следующий запрос (листинг 16.22).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Листинг 16.22. Текст запроса набора данных «Продажи» ВЫБРАТЬ ПродажиОбороты.Номенкпатура, ПродажиОбороты.КоличествоОборот ИЗ РегмстрНакопления.Продажи.Обороты(&НачалоПериодаПродаж, &КонецПериодаПродаж,,) КАК ПродажиОбороты Связь наборов данных по периодам Однако в данном случае нам недостаточно текста запроса наборов данных, сформированного конструктором запроса. Так как система компоновки данных позволяет выполнять связь между наборами данных только по их полям, нам нужно обеспечить в обоих наборах данных поля начала и конца периода. Для этого вручную изменим запросы наборов данных следующим образом (листинги 16.23, 16.24). Листинг 16.23. Текст запроса набора данных «Остатки» ВЫБРАТЬ ОсгаткиНоменклатурыОстаткиИОбороты.Период КАК НачалоПериода, КОНЕЦПЕРИОДА(ОстаткиНоменкпатурыОстаткиИОбороты.Период, МЕСЯЦ) КАК КонецПериода, ОстаткиНоменкпатурыОстаткиИОбороты. Номенклатура, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоКонечныйОстатокКАККонечныйОстаток ИЗ РетстрНакопления.ОстаткиНоменкпатуры.ОстаткиИОбороты(,, Месяц,,) КАК ОстаткиНоменклатурыОстаткиИОбороты Листинг 16.24. Текст запроса набора данных «Продажи» ВЫБРАТЬ &НачалоПериодаПродаж КАК НачалоПериода, &КонецПериодаПродаж КАК КонецПериода, ПродажиОбороты.Номенкпатура, ПродажиОбороты.КопичествоОборот КАК Количество {ВЫБРАТЬ НачалоПериода, КонецПериода, Номенклатура.*, Количество) ИЗ РегистрНакоппения.Продажи.Обороты(&НачалоПериодаПродаж, &КонецПериодаПродаж,, {(Контрагент).*, (Номенклатура).*}) КАК ПродажиОбороты В наборе данных Продажи снимем признак Автозаполнение (стр. 278), так как список полей мы формируем в запросе в секции {ВЫБРАТЬ...} (рис. 16.160). Теперь нам нужно обеспечить связь наборов данных Остатки и Продажи по номенклатуре и полям периодов. На закладке Связи наборов данных добавим новую строку. В поле Источник связи, то есть в качестве роди- тельского набора данных, укажем Остатки, в поле Приемник связи, то есть в качестве зависимого набора данных, укажем Продажи. ву!
Й Отчет ОстаггкнИПродажиТоэаров: ОсновнаяСхемаКомпоновкиДанных □ X Рис. 16.160. Описание набора данных «Продажи» Для указания связи по номенклатуре в полях Выражение источник и Выра- жение приемник выберем поле Номенклатура. Продублируем строку еще два раза. Для указания связи по полям-пери- одам в полях Выражение источник и Выражение приемник выберем поле НачалоПериода/КонецПериода. В поле Параметр выберем из списка пара- метров параметр НачалоПериодаПродаж/КонецПериодаПродаж зависимого набора данных, в котором будет храниться значение связи (рис. 16.161). Й Отчет ОстаггкмИПродажиТоваров: ОсновлпяСхемаКомпоновкмДанных □ X Наборы даншх | Связи наборов дан,. | Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы Настройки Источник связи Приемник связи Выражение источник Выражение приемник ! Параметр ' Список п... УсловиеНачальн... (С Остатки Продажи Номенклатура Номенклатура О 0 Остатки Продажи НачалоПериода НачалоПериода НачалоПериодаПродаж О @ Остатки Продажи КонецПериода КонецПериода О ® Рис. 16.161. Создание связи наборов данных Из описания связей видно, что для записей набора данных Остатки будут получаться записи набора данных Продажи для нужного периода и нужных товаров. При этом значения полей НачалоПериода и КонецПериода набора данных Остатки будут использоваться в качестве значений параметров виртуальной таблицы Продажи.Обороты. Перейдем на закладку Ресурсы и определим доступные поля ресурсов отчета (стр. 290), рис. 16.162. Профессиональная разработка в системе «1С:Предприятие 8»
Й Отчет ОстаткнИПродажиТоваров: О оновнаяСхемаКомпоновки Данных □ X Наборыданных Свяеи наборов... Вычисляемые- | Ресурсы | Параметры Макеты Вложенныесх... Настройки = КонецПериода = КонечныйОстеток = НачалоПериода = НачальныйОстаток = Номенклатура = Количество = НачальньйОстаток Поле Выражение С«рма(Ко1Мчество) Сумма(КонечныйОстеток) Сумма(НачальныйОстеток) Рассчитывать по... 1 Рис. 16.162. Определение ресурсов отчета На закладке Параметры (стр. 292) мы видим параметры компоновки данных, созданные платформой (см. рис. 16.163). У параметров Нача- лоПериодаПродаж и КонецПериодаПродаж установлен флажок Ограничение доступности, так как они служат для получения значения связи наборов данных, используемых в схеме компоновки данных отчета. Зададим настройки параметров, как и в предыдущих примерах. Для пара- метров НачалоПериода и КонецПериода в колонке Тип нажмем кнопку выбора и в нижней части окна редактирования типа данных уста- новим Состав даты в значение Дата. Для параметра КонецПериода зададим значение колонки Выражение, чтобы данные за последний день отчета были включены в расчет (листинг 16.25). Листинг 16.25. Выражение для расчета параметра «КонецПериода» КонецПериода(&КонецПериода, "День") | В результате параметры компоновки данных примут вид (рис. 16.163). Й Отчет ОстеткиИПродажиТоваров: О сноенаяСхемаКемпоновки Данных □ X Наборыданных Связи наборов,,, Вычисляемые,,. Ресурсы | Параметры | Макеты Вложенные схе,,, Настройки ф О' Q Имя Заголовок Тип Д... Д... Значение Выражение Пара... В... 0... 3... НачалоПериода Началопериода Дета □ 0 □ □ КонецПерита Коней периода Дета Q РИМ 0 □ □ КонецПериодаПродаж Коней периода продаж Дета □ 0/ЕкО НачалоПериодаПродаж Начало периода продаж Дета □ 01g) □ 1, Рис. 16.163. Параметры компоновки данных Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Номенклатура. Затем добавим вложенную в нее группировку по полю Началопериода. На закладке Выбранные поля перенесем из списка доступных полей поля (рис. 16.164): Количество, НачальныйОстаток, КонечныйОстаток. Том 2
Й Отчет ОстагкиИПродажиТоваров: ОсновнаяСкемаКомпоновкиДаннык _ П X Рис. 16.164. Определение полей и группировок отчета Усовершенствуем внешний вид отчета. Для поля Количество установим заголовок Продано. Для этого нужно вызвать контекстное меню выбран- ного поля и выполнить команду Установить заголовок (см. рис. 16.164). На закладке Наборы данных выделим набор данных Остатки и в колонке Оформление зададим формат поля НачалоПериода. Вызовем диалог Формат поля и в строку Формат введем выражение (листинг 16.26). Для этого также можно воспользоваться конструктором. Листинг 16.26. Формат поля «НачалоПериода» | ДФ=ММММ.уууу И обязательно нужно указать роли полей (стр. 287) НачальныйОстаток и КонечныйОстаток, чтобы остатки по номенклатуре считались правильно. В данном случае, так как свойство Автозаполнение вклю- чено (стр. 278), платформа установила эти роли автоматически. Вызовем диалог роли этих полей и удостоверимся, что для полей НачальныйОстаток и КонечныйОстаток указано, что эти поля являются полями остатка (рис. 16.165). На закладке Параметры включим параметры НачалоПериода и КонецПе- риода в состав быстрых пользовательских настроек. Запустим «1С:Предприятие» и сформируем отчет за период 01.12.2011- 31.01.2012 (рис. 16.166). НУ®
Гл'ава116лСлЬжнй1еТаналитинескиеТотлетй1 Рис. 16.165. Роли полей остетка Роль - КонечныйОстаток X | ОК || Отмена 11 Справка | @ W °- (1С:Предпр..|^ Щ 1Д vs IS] 'Hil 'ail Остатки и продажи товаров Вариант отчета: [Основной | | Выбрать вариант... I | 1> Сформировать 11 Q3 Настройка... Все действия ▼ i 0 iTFl Начало периода gj Конецпериода 01.12.2011 0:00:00 31.01.2012 0:00:00 Параметры: Начало периода: 01.12.2011 0:00:00 Конец периода: 31.01.2012 0:00:00 Номенклатура Начало периода Веб-камера________ 01.012012 0:00:00 Жесткий диск______ 01,122011 0:00:00 01.012012 0:00:00 Материнская плата 01,122011 0:00:00 01Д12012 0:0ft 00 Микрофон__________ 01.012012 0:00:00 Монитор LCD_______ 01,122011 0:00:00 01Д12012 0:00:00 Память____________ 01,122011 0:00:00 01Д12012 0:00:00 Итого Продано Начальный Конечный __________остаток остаток 3,00 з,оо |’ 7,000 7,0001 Тооо] 1,0001 1,001 1,001 2,000 3,0001 2,0001 8,000 8,0001 2,000 1,000l 2,0001 _________2,000 I 3,0001 2,0001 21 ,000 S3 7.00 □ X Г I т Рис. 16.166. Результат отчета Функциональные опции Теперь рассмотрим, как влияют функциональные опции на вывод отчета. При включении/выключении функциональных опций автоматически изменяется состав выводимых в отчет группировок, полей, отборов, сортировки и т. п. В демонстрационной конфигурации, прилагающейся к книге на компакт- диске, реализована функциональная опция ДанныеОПродажах, значение
которой хранится в константе ПоказыватьДанныеОПродажах булевого типа (рис. 16.167). Функциональная опция ДанныеОПродажах _ □ X | Основные Подсистемы Состав Синоним: | Данные о продажах Q | Комментарий I | ^Хранение: |Констанга.ПоказыввтьДанныеОПрсюажак 0 Привилегированньй режим при получении | Действия -1 | Далее> | | Закрыть | | Справка | Рис. 16.167. Функциональная опция «ДанныеОПродажах» В состав функциональной опции входят измерение Контрагент и ресурс Количество регистра накопления Продажи (рис. 16.168). В:: Функциональная опция ДанныеО Продажах □ X |Регистры оведений; 0 Регистры накопления t О0 ОстатккНоменклаггуры + Q0 СобранныеСБ т 03 Продажи - Ц. Измерения 0!_ Номенклатура 01— Контрагент J Ресурсы 0 J Количество Q Стоимость А Зходящив в функциональную опцию объекты Q Регистры накопления - 3 Продажи •т !_ Измерения ✓** 1— Контрагент X ( т J Ресурсы ) V J Количество Ad ► | Действия - | | <Наэад | | Закрыть | | Справка | Рис. 16.166. Состав функциональной опции «ДанныеОПродажах» Посмотрим, как изменится результат отчетов, получающих данные из регистра Продажи в зависимости от значения функциональной опции ДанныеОПродажах. Напомним, что если константа ПоказыватьДан- ныеОПродажах имеет значение Истина, то функциональная опция включена. Если константа имеет значение Ложь, то функциональная опция выключена. На рисунке 16.169 приводится результат выполнения отчета Остатки и продажи товаров при включенной (слева) и выключенной (справа) функциональной опции ДанныеОПродажах. Профессиональная разработка в системе «1С:Предприятие 8»
ф П... (ЮПредп. Т| 21) □ X Показывать данные о продажах Записать и закрыть д! бездействия» Покаэьеагь дат, и о продажей) (jc) п... ПСПредп. ~i Ун □ : Показывать данные о продажах Запивать и закрыть тя! Вседвйсгвия • vj; Показьввгьдамм о продан » и 0... (ICflpeanaj *01 ~i lil Ф - u Ofid Щ 1л а; !ё) Т| 21) М М* ? □ X Остатки и продажи товаров Вариант отчета Основной Выбрать вариант.. р Сформировать do Нестрога Вседвйствия • О |й Начало порист [О . |Д Конец периода_______________________________________________________ | Номенклатура Началопериода Ве&*амера ’ Я<вф»3012 Жестом диск Деке0рьЗО11 Я<ец»3012 - Мотермсаао плата ДекеОрьЗОИ Я«варь3012 - Йкрофоп Я<вф»3012 - MotmtopLCD ’ ДекеОрьДОП Я«варь3012 Деке0рьЗО11 ’ Теперь .2012 Итого Продано Начатьный Конечный остаток остаток ЭДО 7,000 ЭДО 7,000 1,000 1,000 2,000 3,000 3,000 2,000 2ДО 8.000 2до еда 2Д0 2,000 1Д0 1.000 1ДО 1,000 2,000 2,000 3,000 3,000 2,000 7 ДО 21 лоо Остатки и продажи товаров Вариант отчета Оснсеной Выбрать вариант. р Сформировать UoHacTpcfea Все действия’ О |й Начало перист О |Д Конец периода_____________________________________ [Номенклатура 1 Начальный Конечный Началопериода остаток остаток ___________________ Ве6-*аыере 7,000 Я«вц»3012 7,000 Жестом диск ДекеОрьЗОИ 1,000 Я<0ц»Д012 1,000 - Матереоккоа плата 2,000 ДекеОрьДОП 3,000 Я«вц»3012 3,000 2,000 - Мкрофсм 8,000 Я1вц»зо12 еда - MomtopLCD 2,000 ДекеОрьДОП 1,000 *аарь2012 1,000 2,000 - Память 2,000 ДекеОрьЗОИ Эда Я<ац»Д012 3,000 2,000 Итого 21Д00 » Рис. 16.169. Результат отчета Мы видим, что при выключенной функциональной опции поле Количество (в отчете оно называется Продано) не показывается, так как ресурс Коли- чество регистра накопления Продажи входит в состав функциональной опции ДанныеОПродажах. Теперь поэкспериментируем, как будут отражаться настройки отбора, условного оформления, сортировки в зависимости от значения этой функ- циональной опции. В режиме 1С:Предприятие изменим вариант отчета (Все действия к Изменить вариант...) и зададим следующее условное оформление для группировки Начало периода (рис. 16.170). Рис. 16.170. Настройка условного оформления Том 2
На рисунке 16.171 приводится результат выполнения отчета Остатки и продажи товаров при включенной (слева) и выключенной (справа) функ- циональной опции ДанныеОПродажах. Номенклатура Продано Начальный Конечный Начало периода остаток остаток Веб-камера эдо 7 ДОО Январь .2012 3,00 7,000 Жесткий диск Декабрь 2СМ1 1 доо Январь 2012 1 1 'дао Материнская плата 2 ДОС Декабрь2011 эдоо Январь 2012 I I элоо 2 ДОО (Микрофон 2 ДО 8 ДОО Январь.2012 I 2.00 8,000 Монитор LCD 2 ДО 2 ДОО Декабрь2011 I 1-°°| 1 ДОО Январь 2012 ] 1Д0] 1Д00 2 ДОО Память 2 ДОО Декабрь2011 ЭДОО Январь 2012 I | 3,000 2,000 Итого □ 7.00 21 дао Рис. 16.171. Результат отчета Номенклатура Начало периода Начальный остаток Конечный остаток Веб-камера 7 ДОО Январь2012 J 7 ДОО Жесткий диск Декабрь 2011 1 доо Янверь2012 1 1Д001 Материнская плата 2 ДОО Декабрь 2011 1 1 эдоо Янверь2012 1 ЗД001 2 ДОО (Микрофон 8 ДОО Январь.2012 1 1 8,000 (Монитор LCD 2 ДОО Декабрь 2011 1 1 1 ДОО Янверь2012 1 1.0001 2 ДОО Память 2 ДОО Декабрь 2011 1 1 ЗДОО Январь2012 J здоо 2ДОО Итого □ 21 дао Мы видим, что при включенной функциональной опции условное оформ- ление отчета содержит два элемента - розовым цветом фона выделяются записи, в которых количество продаж больше или равно 3 и синим цветом текста выделяются записи, в которых конечный остаток больше 5. При выключенной функциональной опции первый элемент условного оформления, содержащий условие с полем Количество, в отчете не пока- зывается, так как ресурс Количество регистра накопления Продажи входит в состав функциональной опции ДанныеОПродажах. Изменим вариант отчета - отключим настройки условного оформления и зададим следующий отбор для отчета в целом (рис. 16.172). Рис. 16.172. Настройка отбора
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 На рисунке 16.173 приводится результат выполнения отчета Остатки и продажи товаров при включенной (слева) и выключенной (справа) функ- циональной опции ДанныеОПродажах. (Отбор: Конечный остаток Равно *2* И I Количество Равно *Г Номенклатура Начало периода Продано Начальный остаток Конечный остаток (Монитор LCD 1 ДО 1Д00 2,000 I Ян в ерь 2012 I 1Л0 1.0001 2ДОО| Итого 1Д0 1 .000 2.000 Отбор: Конечный остаток Равно *2* Номенклатура Начальный Конечный Начало периода остаток остаток Материнская плата эдоо 2Д00 Январь 2012 1 3,000 2Д)01 Монитор LCD 1.000 2Д00 Январь 2012 1 дао 2,000] Память 3,000 2 ДОС Январь 2012 I 3,000 2Д)0] Итого 7Д00 6,000 Рис. 16.173. Результат отчета Мы видим, что при включенной функциональной опции отбор в отчете накладывается по двум условиям, содержащим поля КонечныйОстаток и Количество. При выключенной функциональной опции второй элемент отбора, содержащий условие с полем Количество, в отчете игнорируется, так как ресурс Количество регистра накопления Продажи входит в состав функциональной опции ДанныеОПродажах. Изменим вариант отчета - отключим настройки отбора и зададим следу- ющую сортировку записей в отчете (рис. 16.174). ® Вариант "Вариант" отчета "Остагкии продажитоваров" - Демонстрациотая конфкурация "Систе... (1С:Предприягие) X Вариант "Вариант" отчета "Остатки и продажи товаров" Добавить - । [J । X । О' Q । JjS Все действия-' Структура отчета QS fijjj Iflft 3® Q8 е Ql gjjgj л! |Щ i Q яп Номенклатура 0™ Начало периода iTTl Пар... Fit! Поль... fflj Труп... П1 Поля |М Отбор I fih Сорт... I jffl Уело... Доп... Текущийэлемент имеет собственную сортировку (для упорядочивания ваписей, выводимых вэлеменге) Выбрать Вседействия» (^Добавить ноеыйэлеменг порядка । Все действия » Доступные поля = Конецпериода = Начало периода +' = Номенклатура J Количество J I2S2SBS9EESE3SI J Начальный остаток Поле Направление сортировки В J Количество По возрастанию РГ 1 КонечныйОстаток По возрастанию | Завершить редактирование | Отмена i Все действия* । (?) Рис. 16.174. Настройка сортировки На рисунке 16.175 приводится результат выполнения отчета Остатки и продажи товаров при включенной (слева) и выключенной (справа) функ- циональной опции ДанныеОПродажах.
Номенклатура Начало периода Жесткий диск Январь2012 Декабрь 2011 Материнская плате Январь2СИ2 Продано Начальный Конечный остаток остаток 1,0001 Декабрь 2011 Память Январь2СИ2 Декабрь 2011 Монитор LCD_______ Декабрь 2011 Янеерь2012 Микрофон__________ Янверь2012______ Веб-камера________ Январь2012 Итого 3.000 1,0001 2,000 2,сю 1,00 1,00 2,СЮ 2,СЮ 3,00 3,00 7ро здою| Togo] 2,000 2ДОо! здою| 2 ДОО ijoool 2ДО0| ЭДОО gjoool 7ДОО 7ДОр| 21,000 Номенклатура Начальный Конечный Начало периода остаток______остаток Жесткий диск Январь.2012_______j________1 ДОо|___________I Декебрь2О11 I | 1 ДО0| Материнская плата 2ДО0 Январь.2012_______I________здоо!_______2ДО0| Декабрь2СИ1 I | здоо] MOHHTOPLCD 2ДОЮ Декабрь2011_______I_____________I______1 доо| Январь.2012 ] 1 ДОо| 2ДО0] Память____________________________________2 ДОО Январь.2012 j 3,0001 2Д00| Декабрь2011 I | ЗДОО] Веб-камера________________________________7ДОО Январь.2012 | | 7ДО0] Микрофон__________________________________8 ДОО Январь.2012 i | ЗДОО1 Итого I 21.000 Рис. 16.175. Результат отчета Мы видим, что при включенной функциональной опции записи в отчете отсортированы в порядке возрастания полей Количество и Конеч- ныйОстаток. При выключенной функциональной опции сортировка по полю Количество в отчете игнорируется, так как ресурс Количество регистра накопления Продажи входит в состав функциональной опции ДанныеОПродажах. И так далее по аналогии вычисляемые поля, пользовательские поля, параметры, группировки, содержащие поля, связанные с выключенными функциональными опциями, считаются недоступными полями системы компоновки данных и игнорируются в отчете. Для примера продемонстрируем, как влияет значение функциональной опции ДанныеОПродажах на результат отчетов Продажи номенклатуры и Отчет по продажам, целиком получающих данные из регистра накоп- ления Продажи. Понятно, что если бы в состав функциональной опции входил весь регистр целиком, то мы бы ничего не увидели в результате выполнения этих отчетов. Но в нашем случае в состав функциональной опции входит измерение Контрагент и ресурс Количество регистра накоп- ления Продажи. На рисунке 16.176 приводится результат выполнения отчета Продажи номенклатуры при включенной (слева) и выключенной (справа) функцио- нальной опции ДанныеОПродажах. Мы видим, что при выключенной функциональной опции группировка по полю Контрагент в отчете не выполняется и колонка Количество в отчете не показывается, так как измерение Контрагент и ресурс Количество регистра накопления Продажи входят в состав функциональной опции ДанныеОПродажах. Также условное оформление, содержащее условие с полем Количество, в отчете игнорируется. На рисунке 16.177 приводится результат выполнения отчета Отчет по продажам при включенной (слева) и выключенной (справа) функцио- нальной опции ДанныеОПродажах. Профессиональная разработка в системе «1С:Предприятие 8»
to па бй 1Д $ й лу 531 м м* Продажи номенклатуры Вариант отчета: [Основной | > Сформировать 11 Настройка.. J Выбратъеарианг... | Все действия* । (?) Продажи номенклатуры Вариант отчета: Основной J | Выбрать вариант... | 0 ffTl Началопериода @ |ТГ1 Конец периода @ Меткий заказ 01.122011 16.122011 Продажи товаров и услуг Количество Стоимость Итого ООО "Стил»" MOHTropLCD 6 декабря 2011 г. Параметры: Начало периода: 01.122011 Конецлериода: 15.12.2011 Рис. 16.176. Результат отчета Контрагент Номенклатура Период________________ ООО'Автоматика* Дна мостика компьютера 5 декабря 2011 г. 11 декабря 2011 г. Компьютер для дома 11 декабря 2011 г. ООО'Система*___________ Компьютер для офиса 9 декабря 2011 г. 11 $00,00 1 $00,00 1 000,00 500,00 10 000,00 10 000 до 10 РОС до юооодо 10 000 до 10 000,00 10 000 до 10 000,00 31 500 ДО | р» Сформировать 11 Jb Настройка... Все действия* । (?) Рис. 16.177. Результат отчета Том 2
Примерен р а з р а б от к и [отд ето в; Мы видим, что при выключенной функциональной опции группировка по полю Контрагент в отчете не выполняется, так как измерение Контрагент регистра накопления Продажи входит в состав функциональной опции ДанныеОПродажах. Таким образом, на примере этого отчета мы научились: получать информацию из нескольких наборов данных, связанных по периодам; указывать роль поля в схеме компоновки данных; задавать заголовок поля в настройках схемы компоновки данных; влиять на вывод отчета с помощью функциональных опций. Пример 11 В платформе «1С:Предприятие» есть специальный объект - План видов характеристик, с помощью которого можно создавать механизмы для того, чтобы пользователь имел возможность создавать и описывать произвольные характеристики для каких-либо объектов информационной базы. Например, для описания свойств номенклатуры пользователь может создать такие виды характеристик, как Цвет, Качество и т.п., и задать их значения. Система компоновки данных позволяет использовать эти характе- ристики при разработке отчетов (стр. 245). То есть пользователь может отобразить поля характеристик в отчете, установить по ним отбор, условное оформление и т.д. Для извлечения характеристик из базы данных в языке запросов разработано специальное расширение, применя- ющееся только в системе компоновки данных. В демонстрационной конфигурации, прилагающейся к книге на компакт- диске, реализована возможность добавления дополнительных свойств к элементам справочника Контрагенты, таких как Категория и Регион. В качестве источника характеристик используется план видов характеристик ВидыХарактеристик, а значения характеристик находятся в регистре сведений ДополнительныеХарактеристики. Характеристики объектов конфигурации можно описывать и хранить в свойстве Характеристики этих объектов, а можно описывать в каждом конкретном отчете. Первый способ наиболее универсален (он показан в следующем примере на стр. 184), но в данном разделе мы покажем второй способ. При этом если характеристики описаны в конкретном отчете, то именно они используются системой компоновки данных. Создадим отчет, отражающий информацию о продажах контрагентам, и отразим в отчете эти характеристики контрагентов. Затем мы выведем полученные данные в диаграмму с помощью конструктора настроек (рис. 16.178). ВУ27
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 ООО И "Аэтоматика"Хо ролее ООО И "Стиль".Санкт- Петербург Рис. 16.178. Требуемый вид отчета Создадим новый объект конфигурации Отчет и назовем его Прода- жиКонтрагентам. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Откроем конструктор запроса. В качестве источника данных для запроса выберем виртуальную таблицу регистра сведений Продажи.Обороты. В список полей перенесем поля из этой таблицы: Контрагент, СтоимостьОборот. Характеристики в отчете Перейдем на закладку Характеристики. Нажмем кнопку Добавить и приступим к описанию полей характеристик. В поле Тип введем СправочникСсылка.Контрагенты - это тип данных, для которого описы- ваются характеристики. Затем опишем источник списка характеристик. В нашем случае им является план видов характеристик ВидыХаракте- ристик. Поэтому в поле Источник видов выберем Таблица, а в поле Виды характеристик укажем ПланВидовХарактеристик.ВидыХарактеристик. Далее следует описать назначение полей источника, «поставляющего» виды характеристик. В поле Поле ключа выберем Ссылка, в поле Поле имени - Наименование, а в поле Поле типа значения - ТипЗначения (рис. 16.179). Теперь опишем источник значений характеристик. В нашем случае им является регистр сведений ДополнительныеХарактеристики. Поэтому в поле Источник значений выберем Таблица, а в поле Значения характе- ристик укажем РегистрСведений.ДополнительныеХарактеристики. Далее следует описать назначение полей источника, «поставляющего» значения характеристик. В поле Поле объекта выберем измерение регистра Объект, в поле Поле вида - измерение регистра ВидХарактеристики, а в поле Поле значения - ресурс регистра ЗначениеХарактеристики (рис. 16.180). НУ®
1Й Конструктор запроса * □ X Таблицыи... Группировка Условия Дополните.., Объединен.. Порядок Компоновк... I Характеры.,. I Пвкетэап... К Гмп Источник ВИПОВ СправочникСсылка.Контрагенгы Таблица Вилы характеристик "ХИсто... _ _ _ 13НВЧ.. Поле ключа Поле имени Поле типа значения I ПланВидоеХаракгеристик.ВидьХаракгеристик |Табл.. Ссылка Наименование ТипЗначения J Значения характеристик а Полеобъ... Поле вида Полезна... РегистрСведений. Дополнительные... Объект ВидХара... 0SSS9I_____________ | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.179. Описание источника видов характеристик ffl Конструктор запроса * □ X Таблицыи... Группировка Условия Дополните... Объединен... Порядок Компоновк... | Характеры... | Пакетзаа.. ® Q> <> к Исто... Виды характеристик /Источник Значения характеристик видов ’ _ _ _ । значений ’ п . По... Поле... Полет... I Поле объекта Поле вида Поле значения Табл.. ПлагёидоеХарактери... I Таблица РегислгрСведенАДополнигельныеХаракгеристики Сс... Нам... ТипЗн... у, Объект ВцдХаракгеристжи ЗначеииеХарактерисгиюг | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.180. Описание источника значений характеристик Нажмем ОК. В результате текст запроса, сформированный платформой, примет вид (листинг 16.27). Листинг 16.27. Текст запроса ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты {ХАРАКТЕРИСТИКИ ТИП(Справочник.Контрагенты) ВИДЫХАРАКТЕРИСТИКПланВидовХарактеристик.ВидыХарактеристик ПОЛЕКЛЮЧА Ссыпка ПОЛЕИМЕНИ Наименование ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения ЗНАЧЕНИЯХАРАКТЕРИСТИКРегистрСведений.ДополнительныеХарактеристики ПОЛЕОБЪЕКТА Объект ПОЛЕВИДА ВидХарактеристики ПОЛЕЗНАЧЕНИЯ ЗначениеХарактеристики} После ключевого слова ХАРАКТЕРИСТИКИ здесь следует секция, в которой для системы компоновки данных и описываются те характеристики, которые будут использованы в нашем отчете. Профессиональная разработка в системе «1С:Предприятие 8»
Вывод данных в диаграмму Для решения нашей задачи наиболее подходит вывод результата отчета в виде круговой диаграммы (стр. 237), чтобы наглядно продемонстри- ровать долю каждого контрагента в объеме продаж. Продемонстрируем эту возможность. Но сначала нам нужно определить ресурсы отчета (стр. 290). На закладке Ресурсы перетащим мышью из доступных полей поле СтоимостьОборот (рис. 16.181). Й Отчет ПродажиКонгагенгам: ОсновнаяСхемаКемпоновки Данных П X Наборыданных Связи наборов... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные сх... Настройки Рис. 16.161. Определение ресурсов для отчета Для быстрого создания стандартных настроек воспользуемся конструк- тором настроек. Для этого нажмем кнопку в командной панели схемы компоновки на закладке Настройки. На первом шаге выберем тип отчета Диаграмма (рис. 16.182). Конструктор настроек компоновки данных X Тип отчета: О Список. Данные по воем намерениям отчета выводятся списком. I аблица. Данные выводятся по измерениям расположенным как по горизонтали, так и по вертикали. | Далее > 11 ОК 11 Отмена 11 Справка | Рис. 16.162. Конструктор настроек. Шаг 1 Нажмем кнопку Далее. На следующем шаге определим поля, выводя- щиеся в отчет. Мышью перетащим из списка доступных полей ресурс СтоимостьОборот (рис. 16.183). Том 2
Примерен раз ра б от к и [отд ёто в Si Конструктор настроек компоновки данных «Склад «Сумма Выберите поля, которые будут отображаться в отчете. Доступные поля * = Контрагент j I2S2SBS9EESE3SI •+ О СистемныеПоля + О ПараметрыДанных | < Назад 11 Далее > 11 ОК 11 Отмена 11 Сгфавка | Рис. 16.183. Конструктор настроек. Шаг 2 Нажмем кнопку Далее. На следующем шаге определим поля для груп- пировки серий и точек диаграммы. Логически Диаграмма является совокупностью Точек, Серий и значений серий в точке. В качестве значений выступают ресурсы отчета, в качестве точек - объекты, для которых мы получаем значения характеристик, в качестве серий - характеристики, значения которых нас интересуют. Для круговой диаграммы, которую мы хотим вывести в отчет, достаточно определить серии. Мышью перетащим из списка доступных полей в поля Серии поле Контрагент (рис. 16.184). Si Конструктор настроек компоновки данных Выберите поля по которым будет производиться группировка диаграмм, серий и точек диаграммы Поля группировок отображаются в отчете. Доступные поля J СгоимосгьОборот | < Назад 11 Далее > 11 ОК 11 Отмена 11 Сгравка | Рис. 16.164. Конструктор настроек. Шаг 3 Нажмем кнопку Далее. Четвертый шаг пропустим, так как сортировка в данном случае нам не важна. Нажмем кнопку Далее. На следующем шаге определим тип диаграммы. Выберем круговую объемную диаграмму (рис. 16.185). Нажмем ОК. В результате наших действий в окне настроек появилась диаграмма, в сериях которой находится группировка Контрагент, опре- делен список выбранных полей (рис. 16.186).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 _Si Конструктор настроек компоновки данным Типдиаграммы: |О| | < Назад | | ОК 11 Отмена 11 Справка | Рис. 16.165. Конструктор настроек. Шаг 5 Т°1 Отчет ПродажиКонгагенгам: ОоноенаяСхемаКомпоноекнДанных — □ X Рис. 16.166. Настройки схемы компоновки данных Откроем и выполним отчет в режиме 1 (^Предприятие (рис. 16.187). Теперь мы видим графическое представление объемов продаж по контрагентам. Серии - наименования контрагентов отражаются справа. При наведении мыши на определенный сектор диаграммы отобража- ется всплывающая подсказка с наименованием контрагента и значением ресурса. Однако пока мы не отразили в отчете дополнительные свойства контр- агентов. Дело в том, что в процессе настройки отчета в режиме Конфигуратор мы не видим полей дополнительных характеристик контрагентов - Регион и Категория. Применить их мы сможем только после запуска отчета из режима 1С:Предприятие. Это связано с тем, что сначала должен быть выполнен запрос, извлекающий характеристики из базы данных.
® c.‘ Vf Продажи шнгротенгам-Демонстрационна... (ЮПредлриятие) i^l [Д '«5 й НИ '311 - - □ X Продажи контрагентам Вариант отчета: [Основной | h Выбрать вариант... j| Рис. 16.167. Результат отчета Выполним команду Все действия к Изменить вариант... В открывшемся окне полных настроек варианта отчета на закладке Поля раскроем поле Контрагент в списке доступных полей. Здесь мы увидим две наши допол- нительные характеристики - Регион и Категория. Перенесем в список полей поле Регион (рис. 16.188). Рис. 16.186. Диалог настроек варианта отчета Профессиональная разработка в системе «1С:Предприятие 8»
Нажмем Завершить редактирование и сформируем отчет (рис. 16.189). ® -3- Vf Продажи контрагентам-Демонстрационна... (ЮПредприягие) iH Li Й JBJ 'ail »- - □ X Продажи контрагентам Вариант отчета: [Основной| || Выбрагьедриект... J| Рис. 16.169. Результат отчета Мы видим, что характеристика контрагента Регион теперь отражается рядом с его наименованием. Заметьте, что характеристика отражается не для всех контрагентов, а только для тех, у кого есть соответствующая запись в регистре сведений Дополнительные характеристики. Так проис- ходит потому, что в запросе (см. рис. 16.180) мы описали именно такой способ хранения значений характеристик (рис. 16.190). Дополнительные характеристики ^Создать । (5 X । Q Найти... । ГД Все действия । (2) Объект Виц характеристики Категория Значение характеристики Постоянный партнер i J53 ООО "Автоматика" Регион Королев > 53 ООО "Система" Категория Зарубежньй партнер ^3 ООО "Система" Регион Москва > 53 ООО "Стиль" Категория Постоянный партнер ООО "Стиль" Регион Санкт-Петербург J L Рис. 16.190. Значения характеристик контрагентов Однако настройки, сделанные в режиме 1 (^Предприятие, не сохраняются в настройках по умолчанию схемы компоновки данных. Поэтому, чтобы в дальнейшем использовать характеристики контрагентов в нашем отчете, нужно сохранить их. Сохраним сделанные изменения в новом варианте отчета. При закрытии отчета запрос о сохранении варианта появится автоматически, или можно выполнить команду Все действия к Сохранить вариант... (рис. 16.191). Том 2
@ Сохранение варианта отчета Де... (ЮПредприягие) X Сохранение варианта отчета Ранее сохраненные варианты: Имя сохраняемого варианта: | Характеристики| | Сохранить | Отмена Рис. 16.191. Сохранение варианта отчета В дальнейшем вариант отчета Характеристики будет формироваться с учетом характеристик контрагентов. Следует понимать, что этот вариант отчета будет доступен только конкретному пользователю, создавшему новый вариант. Итак, мы получили графическое представление объемов продаж по контрагентам в виде круговой диаграммы. А также мы вывели в отчет характеристику контрагентов Регион. Пример 12 Создадим отчет, который будет отражать объем продаж по контрагентам с детализацией данных за указанный период (рис. 16.192). Рис. 16.192. Требуемый вид отчета Для этого нам потребуется извлечь данные из оборотного регистра Продажи. Создадим новый объект конфигурации Отчет и назовем его ОтчетПоПродажам. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Откроем конструктор запроса. В качестве источника данных для запроса выберем виртуальную таблицу регистра накопления Продажи.Обороты. Вызовем диалог параметров виртуальной таблицы. Для этого в списке таблицы нужно нажать кнопку Параметры виртуальной таблицы.
I ЕлаваИ 6nG лояачыеТанагтитйческйеТотяеты Детализация в выбранном периоде В открывшемся окне параметров зададим значение параметра Периодич- ность-Авто (рис. 16.193). Параметры виртуальной таблицы НачалоПериода КонецПериода Периодичность Условие | ОК || Отмена | | Справка | Рис. 16.193. Установка параметра «Периодичность» В список полей перенесем поля из таблицы Продажи.Обороты: ПериодДень, ПериодМесяц, Контрагент, КоличествоОборот, СтоимостьОборот. На закладке Объединения/Псевдонимы изменим имя у полей Количест- воОборот, СтоимостьОборот на Количество, Стоимость. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Мы видим, что на основании запроса платформа заполнила доступные поля набора данных и для полей, являющихся измерениями регистра, задала вид роли Измерение, а для полей, связанных с детализацией по периодам, - вид роли Период. Напомним, это обусловлено тем, что свойство Автозаполнение (стр. 278) включено (рис. 16.194). Рассмотрим свойства Роли (стр. 287) у поля ПериодМесяц (рис. 16.195). Здесь установлено, что поле является периодом. Его порядковый номер - 2, так как самое «младшее» поле, в нашем случае Период- День, имеет порядковый номер 1, его родительский период - 2 и т.д. Тип периода может быть Основным и Дополнительным. Установка типа периода в значение Дополнительный говорит о том, что поле не должно обязательно использоваться в компоновке, если в отчете использованы его дочерние периоды. Иначе при использовании в отчете дочернего поля в группировке должен присутствовать и его родительский период. В колонке Оформление зададим формат поля ПериодДень, чтобы дата отображалась без времени (рис. 16.196). Для этого можно воспользоваться конструктором, а можно это сделать вручную, отредактировав строку Формат. Для поля ПериодМесяц введем выражение (листинг 16.28).
Й Отчет ОтчетПоПродажам: ОсновнаяСкемаКомпоновкнДанных Рис. 16.194. Автозаполнение доступных попей набора данных и их свойств Роль - ПериодМесяц О Без роли (ё^Перивд'1 | 2 т | 0 Дополнигельньй О | - И эмерение----------------------------- Родитель ▼ О । - Счет----------------------------------- Виа О -Остатки- Имя: Бух. тип: Поле счета ^Игнорировать значения NULL ^Обязательное Формат поля | ОК || Отмена 11 Справка | | ОК || Отмена 11 Справка | Рис. 16.195. Окно свойств роли поля-периода Рис. 16.196. Формат поля «ПериодДень» Листинг 16.28. Формат поля «ПериодМесяц» | ДФ=ММММ.уууу Профессиональная разработка в системе «1С:Предприятие 8»
Выражения для представления полей Система компоновки данных позволяет определять выражения для представления полей в отчете (стр. 282). Например, мы хотим отоб- ражать код контрагента в скобках слева от его наименования. Для поля Контрагент в колонку Выражение представления введем следующий текст (листинг 16.29). Листинг 16.29. Выражение для представления в отчете поля «Контрагент» "(|'+Контрагент.Код+|') +Контрагент.Наименование | В результате выражение представления для поля Контрагент примет вид (рис. 16.197). Выражение представления Выражения упорядочивания Поле Путь Аетозаголовок Ограничение поля Роль 1П... У... Г... У... Ограничение рек... П... У... г... У... = ПерисдДень ПериодДень □ □ □ Q Период. 1, Доп □ Периш, день = ПериодМесяц ПериодМесяц □ □ □ Q Период. 2, Доп О Периш, месяц = Контрагент Контрагент □ □ □ Q Намеренна □ Контрагент □ □ □ □ » Номежлатура Номеишагура □ О Номенклатура □ » Стоимость Стоимость □ □ □ □ 0 Стоимость = Количество Количество □ □ □ □ Рис. 16.197. Выражение представления для поля «Контрагент» В выражении для представления можно также использовать функции из общих модулей. Чтобы функцию можно было использовать в схеме компоновки данных, необходимо, чтобы в ее описании присутствовало ключевое слово Экспорт. Перейдем на закладку Ресурсы и определим доступные поля ресурсов отчета (стр. 290), рис. 16.198. Й Отчет ОтчетПоПродажам: ОсновнаяСхемаКомпоновкиДанных D X Наборы данных Связи наборов д..._Вычисляемые поля | Ресурсы | Параметры Макеты Вложенные сеемы Настройки Доступные поля Поле Выражение Рассчитывать по... I > I Сумла(Количество) Сумиа(Сгоимость) в Контрагент в ПериодДетъ = ПериодМесяц = Стоимость I 1|Н0© = Стоимость Рис. 16.198. Определение ресурсов отчета Том 2
Продемонстрируем использование стандартного периода для указания периода отчета (стр. 293). На закладке Параметры добавим параметр с именем Период типа СтандартныйПериод, а для пара- метров НачалоПериода и КонецПериода укажем Выражение для расчета и запретим их редактирование пользователем (листинг 16.30). Листинг 16.30. Выражение для расчета параметров «НачалоПериода» и «КонецПериода» &Период.ДатаНачапа &Период.ДатаОкончания Заметим, что даты начала и конца стандартного периода также содержат и время. Однако здесь, в отличие от параметров НачалоПериода и КонецПериода, начальная дата имеет время 00:00:00, а конечная дата - 23:59:59. Таким образом, последний день включается в отчет, и не нужно использовать функцию КонецПериода(). В результате параметры компо- новки данных примут вид (рис. 16.199). ?1 Отчет ОтчетПоПродажам: ОсновнаяСхемаКомпоновкиДанных □ X Наборы данных Связи наборов д.,. Вычисляемые поля Ресурсы | Параметры | Макеты Вложенные схемы Настройки Ё х Рис. 16.199. Определение параметров отчета Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Контрагент. Затем добавим вложенную в нее группировку ПериодМесяц. Выделим группировку ПериодМесяц и добавим вложенную в нее группировку ПериодДень. На закладке Выбранные поля перенесем из списка доступных полей поля (рис. 16.200): Стоимость, Стоимость.ПроцентВГруппе, Стоимость.ПроцентОбщий.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Т5! Отчет ОтчетПоПродажам: О сновнаяСхемаКомпоновкн Данных _ □ X Рис. 16.200. Определение полей и группировок отчета На закладке Параметры установим значение параметра Период - Прошлый месяц и включим этот параметр в состав быстрых пользовательских настроек (рис. 16.201). |й Отчет ОтчетПоПродажам: ОсновнаяСхемаКомпоноекиДанных _ П X Рис. 16.201. Настройка периода отчета Заметим, что реальные значения дат стандартного периода определяются во время исполнения отчета. Поэтому период отчета будет автоматически меняться в зависимости от фактической даты запуска отчета. Пользоваться стандартным периодом отчета удобно, когда пользователь регулярно
выполняет отчет за определенный интервал времени, например, текущий месяц. Тогда можно заранее установить в настройках нужный период, и пользователю не придется задавать его перед формированием отчета. В нашем случае нам нужны данные за прошлый месяц. ПРИМЕЧАНИЕ Использованный в книге стандартный период в момент выпол- нения примера может измениться и не содержать данных для отчета. В этом случае его нужно откорректировать. На закладке Другие настройки установим макет оформления отчета (стр. 300) - Море. Выполним отчет (рис. 16.202). @ ' Отчет по продажам-... (ЮПредприягие) |£| |4 W й 'Й1| 'ail - - □ X Отчет по продажам Вариант отчета: | Основной| |Л Вымяла.вариант... ;| | 1> Сформировать 11 Настройка... Все действия ~ । (?) В |ТП Период Прошлый месяц J Параметры Период: СИ .12.2011 -31.12.2011 Рис. 16.202. Результат отчета Мы видим, что представление поля Контрагент и формат полей периодов соответствуют заданному, а также в отчет выводятся системные поля, отражающие для каждой группировки процент от общей стоимости продаж и процент от стоимости продаж в группе. Характеристики в метаданных Теперь на примере отчета Отчет по продажам продемонстри- руем работу с характеристиками объектов с помощью системы компоновки данных (стр. 245). Пользователь может отобразить поля харак- теристик в отчете, установить по ним отбор, условное оформление и т. д. Для извлечения характеристик из базы данных в языке запросов разработано специальное расширение, применяющееся только в системе компоновки данных. Профессиональная разработка в системе «1С:Предприятие 8»
В демонстрационной конфигурации, прилагающейся к книге на компакт- диске, реализована возможность добавления дополнительных свойств к элементам справочника Контрагенты, таких как Категория и Регион. Характеристики объектов конфигурации можно описывать в свойстве Характеристики этих объектов, а можно описывать в каждом конкретном отчете. Второй способ показан в предыдущем примере на стр. 177, но в данном разделе мы покажем первый способ, являющийся наиболее универсальным. При этом если характеристики описаны в самом объекте конфигурации, то все отчеты и динамические списки, основанные на системе компоновки данных, могут использовать эти характеристики. В этом примере мы покажем другой (отличный от предыдущего примера) способ хранения характеристик контрагентов. Здесь в качестве источника характеристик используется план видов характеристик ВидыХарактеристик, а значения характеристик находятся в табличной части Дополнитель- наяИнформация справочника Контрагенты. Данный способ хранения характеристик контрагентов описывается в свойстве Характеристики справочника Контрагенты (рис. 16.203). Дополнительные характеристики объекта метаданных © В х Виды характеристик Значения характеристик Поле ключа Поле отбора видов Значение отбора вццов Поле объекта Поле вица Поле значения Справочник. Контрагенты. ТабличнаяЧасть. ДополнигельнаяИвформация Ссылка Ссылка Дополнит ельноеСвойсгво Значе1 иеСвойства | ОК || Отмена 11 Сгфавка | Рис. 16.203. Описание дополнительных характеристик справочника «Контрагенты» ПОДРОБНЕЕ Том 1, глава 9, раздел «Хранение дополнительных характеристик». Однако применить характеристики контрагентов мы сможем только после запуска отчета из режима 1С:Предприятие. Это связано с тем, что сначала должен быть выполнен запрос, извлекающий характеристики из базы данных. Откроем отчет в режиме 1С:Предприятие. Выполним команду Все дейс- твия к Изменить вариант... В открывшемся окне полных настроек варианта отчета на закладке Поля раскроем поле Контрагент в списке доступных полей. Здесь мы увидим две наши дополнительные характеристики - Регион и Категория. Перенесем в список полей поле Регион (рис. 16.204). Нажмем Завершить редактирование и сформируем отчет за период - Этот месяц (рис. 16.205). Том 2
@ Вариант "Основной" отчета "Отчет no продажам"-Дeмoнстpaциoннaякoнфигypaция"Cистeмaкoмnoнoeкидaнньк’, (ЮПредприягие) X Вариант "Основной" отчета "Отчет по продажам" Добавить* I iJ I X I О Q । 5® В се действия* Структура отчета л! |М ОЙ Sffi О® о Q ООЙ Of 0Й US S 0™ Контрагент - 0™ Период, месяц 0™ Период день Поле - Выбранные поля 0 J Стоимость 0 J Сгоимость.%вгруппфовке 0 J Стоимость. £ общий □: = Конграгенг.Регион ittl Парам... Гм1 Польэо... Щ Группи... | Qf Поля | |М Отбор дД Сортир,.. jjffi Ясловн... ft.fl Допол... Iекущий э леменг имеет собственные настройки выбранных полей (для детальной настройки э леменга) Выбрать Все действия* ^Добавить новое поле I Сгруппировать поля i й Q i Все действия* Доступные поля - в Контрагент = Версияданньи Ш Дополниге1ъная информация + = Категория = Код = Наименование = Пометкаудаления = Предопределенный ® цдр в Родитетъ | Завершить редактирование | Отмена i Вое действия* i ф Рис. 16.204. Диалог настроек варианта отчета Рис. 16.205. Результат отчета Мы видим, что характеристика контрагента Регион теперь отражается радом с его наименованием. Заметьте, что характеристика отражается не для всех контрагентов, а только для тех, у которых характеристика US®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Регион описана в табличной части ДополнительнаяИнформация справоч- ника Контрагенты (см. рис. 16.209). Так происходит потому, что в свойстве Характеристики справочника Контрагенты (см. рис. 16.203) описан именно такой способ хранения значений характеристик. Поскольку характеристики аналогичны другим реквизитам поля Контр- агент, то управлять их выводом можно на закладке Дополнительные/Другие настройки (стр. 316), рис. 16.206. Параметр Значение 0 Макет оформления Море □ Расположен* итогов Авто Q Расположение полей группировок Вместе □ Расположение группировок Начало ТП Расположение реквизитов Н—""* □ Расположение ресурсов Вместе О Расположение общих итогов по горизон... □ Расположение общих итогов по вертикали □ Тип заголовка полей | В специальной позщии________________________________ Q ~ Тип диаграммы Гистограмма объемная Рис. 16.206. Диалог настроек варианта отчета Теперь используем в отборе характеристику Категория. Выполним команду Все действия ► Изменить вариант. В открывшемся окне полных настроек варианта отчета на закладке Отбор создадим новый элемент отбора по полю Категория со значением Постоянный партнер. Нажмем кнопку Свойства элемента пользовательских настроек и включим отбор в состав быстрых пользовательских настроек (рис. 16.207). @ Вариант '□оновной'' отчета "Отчет по продажам" Демонстрационная конфигурация "Система компоновки данный" (1С:Предприятие) X Вариант "Основной" отчета "Отчет по продажам' Добавить « I *[t| I X । & Q । §9 jS8 Все действия » Структура отчета 0™ Контрагент :? 0™ Период, месяц 0™ Период, день '(в ® 1цй й й .________________________________________________ni 1W пМ nfl @ Пользовательские настройкиэлеменга-Демонстрац... (ЮПредприягие) X Пользовательские настройки элемента * Включать в пользовательские настройк|{^^ Представление: Режим редактирования iTTl Парам.. [Д'] Польза.. Группи... Поля | |М Отбор | дУ] Сортир... Текущийэлеменг имеет собствен ый отбор (для Фильтрации записей, выводимых вэлементе) Выбрать Все действия ~ fgr) Добавить новый элемент i Сгруппировать условия । | Быстрый досту!▼! | ОК | Отмена (?) =Ц- <йф| Условн}. fl-ft Допел.. Доступные поля в Контрагент = Версияданньк + И Дополнительная инфо... в = Код = Наименование Поле Отбор 0___________° Контрагент-Категория Равно Все действия ~ Виц сравнения Значение | Завершить редактирование | Отмена i Вседействия* । (?) Рис. 16.207. Диалог настроек варианта отчета
Нажмем Завершить редактирование и сформируем отчет (рис. 16.208). ® -I- W Отчетпопродажам-... (1С:Предлриягие) i^l Li V5 [й] ПЛ 'ail » □ X Отчет по продажам Вариант отчет® |Характеристики I I Выбрать вариант,.. | Рис. 16.206. Результат отчета Мы видим, что в отчете присутствуют данные только по тем контр- агентам, для которых значение характеристики Категория (в табличной части ДополнительнаяИнформация справочника Контрагенты) соот- ветствует заданному отбору (рис. 16.209). Рис. 16.209. Дополнительные свойства контрагента Однако настройки, произведенные в режиме 1 (^Предприятие, не сохра- няются в настройках по умолчанию схемы компоновки данных. Поэтому, чтобы в дальнейшем использовать характеристики контр- агентов в нашем отчете, нужно сохранить их. Поскольку мы изменяли настройки варианта отчета, то вопрос о сохра- нении варианта отчета автоматически появится при закрытии отчета. Можно сохранить сделанные изменения в новом варианте отчета, и в даль- Профессиональная разработка в системе «1С:Предприятие 8»
нейшем этот вариант отчета будет формироваться с учетом характеристик контрагентов (рис. 16.210). @ Сохранение варианта отчета - Де... (ЮПредприягие) X Сохранение варианта отчета Ранее сохраненные варианты Имя сохраняемого варианта: О<арактеристит^ | | Сохранить | Отмена (?) Рис. 16.210. Диалог сохранения настроек При этом если редактировался вариант отчета, созданный разработ- чиком в схеме компоновки данных, то предлагается сохранить изменения настроек в новом варианте отчета. Дальнейшие изменения нового вари- анта по умолчанию сохраняются в нем же. Это удобно, чтобы стандартный вариант оставался таким, как его создал разработчик, в качестве образца, к которому всегда можно вернуться. Если же пользователь хочет само- стоятельно выбрать вариант для сохранения изменений, то ему нужно выполнить команду Все действия ► Сохранить вариант... Следует понимать, что вариант отчета Характеристики будет доступен только конкретному пользователю, создавшему этот вариант, в то время как варианты отчета (Основной, Динамика продаж), созданные разработ- чиком в схеме компоновки данных, будут доступны для всех пользователей прикладного решения. Вывод всех дат в периоде Посмотрев на результат отчета, можно заметить, что в отчете выводятся только те дни, которые имеют ненулевые записи в регистре накопления Продажи. Чтобы этого избежать, нужно указывать для группировок дополнение периодов. Использование дополнения периодов позволяет детализировать данные в отчете с заданной периодичностью в указанном интервале (стр. 240). Для большей наглядности динамики объема продаж контрагентам восполь- зуемся диаграммой типа График. Для этого создадим новый вариант отчета Отчет по продажам и на его примере продемонстрируем возможность дета- лизации данных в выбранном периоде. Вернемся в конфигуратор и откроем схему компоновки данных на закладке Настройки. Чтобы добавить новый вариант, нажмем кнопку Добавить слева над списком вариантов отчета. Зададим имя варианта и его представление как ДинамикаПродаж и создадим настройки нового варианта отчета. Том 2
Выделим корневой элемент Отчет, нажмем кнопку Добавить в коман- дной панели и добавим диаграмму (стр. 237). Затем выделим ветку Серии и добавим в нее группировку по полю Контрагент, а в ветку Точки - группировку ПериодДень. На закладке Выбранные поля перенесем из списка доступных полей поле Стоимость (рис. 16.211). Й Отчет ОтчетПоПродажам: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.211. Настройка структуры отчета На закладке Параметры установим значение параметра Период - Прошлый месяц и включим этот параметр в состав быстрых пользовательских настроек. На закладке Другие настройки дадим отчету заголовок Динамика продаж и установим тип диаграммы - График (рис. 16.212). Парамет... Выбрани...Отбор Сортиров... Условное... Пользова... | Другие н... I Параметр Значение л 0 □ Тип диаграммы Базовое значение $ др □ Пропускать базовое значение Истжа □ Состав подписей Серия + процент 5.Й □ Режим раздвижения Нет □ Отображать таблицу данных Ложь □ Максилагъное значение □ Минимальное значение ▼ Рис. 16.212. Настройка типа диаграммы Запустим отчет на исполнение в режиме 1С:Предприятие. В открывшемся окне отчета нажмем кнопку Выбрать вариант... Выберем вариант Динамика продаж и сформируем отчет (рис. 16.213).
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты ® C- Vf Отчет no продажам-Демонстрационная кон.. (ЮПредприятие) ifej |<i W й 'ii<l 'ail М М+М-, - □ X Отчет по продажам Вариант отчета: | Динамика продаж | | Выбреть вариант... | Рис. 16.213. Результат отчета Из диаграммы видно, что дни, за которые отсутствовали движения, в отчет не выводятся. Поэтому сложно визуально оценить динамику изменения продаж в отчетном периоде. Чтобы изменить ситуацию, введем Допол- нение для группировки диаграммы ПериодДень. Для этого достаточно выделить ее и двойным щелчком мыши вызвать диалог редактирования ее свойств. Укажем Тип дополнения - Неделя (рис. 16.214). Поли грдвя предки 1-х vO Поле Начальная дата периода Тип дополнения Конечная дата периода 0 = ПериодДень Год Полугодие Квартал Месяц Декада л День Час Минуте Секунда | ОК 11 Отмена 11 Справка | Рис. 16.214. Установка типа дополнения группировки «ПериодДень» ио
После этого следует указать, в каком периоде будет выполняться это допол- нение. В поля, расположенные строчкой ниже, можно ввести даты начала и окончания этого периода. Но вряд ли стоит задавать эти даты в явном виде, так как пользователь может получить отчет за произвольный период. И нам нужно, чтобы дополнение выполнялось именно в этом, заданном пользователем периоде. Для этого войдем в режим редактирования поля Начальная дата периода, дважды щелкнув на нем мышью. Нажмем кнопку очистки т, затем кнопку выбора типа данных х и выберем тип данных Поле компоновки данных (рис. 16.215). Поля группировки X Рис. 16.215. Выбор типа данных Теперь нажмем в поле ввода кнопку выбора - и в открывшемся окне выбора поля укажем параметр НачалоПериода (рис. 16.216). Выбор поля Доступные поля - О ПараметрыДанных = КонецПериода = Период ОК | | Отмена | _ ---------------Рис. 16.216. Выбор поля Аналогичным образом укажем, что Конечная дата периода дополнения будет получена из параметра КонецПериода (рис. 16.217). Поля группировки 1’ X -и- о X | Поле ' Начальная дата периода Тип дополнения Конечная дета периода 0| = ПериодДень Неделя | ПараметрыДанных.НачалоПериода | ОК || Отмена 11 Справка | Рис. 16.217. Настройка группировки «ПериодДень» Профессиональная разработка в системе «1С:Предприятие 8»
Теперь выполним отчет и увидим диаграмму, отражающую динамику продаж по контрагентам с периодичностью в неделю (рис. 16.218). ® <3/ W Отчет по продажам-Демонстрационная кон.. (ЮПредприягие) ®| [Д 14 Й 111 Й] М М+М-- - □ X Отчет по продажам Вариант отчета | Динамика продаж| | Выбрать вариант,| | 1> Соормиравать |i 0^ Настройка.. Все действия’ । \?) Прошлый месяц1 I Динамика продаж Параметры: Период: 01.01.2012 - 31.01.2012 1Л Рис. 16.218. Результат отчета Таким образом, на примере этого отчета мы научились: указывать роль поля в схеме компоновки данных, определять выражение для представления полей в отчете, использовать стандартный период для параметров периода отчета, использовать характеристики в отчете, указывать дополнения периодов для детализации данных в отчете и представлять эти данные в виде диаграммы. Пример 13 На примере этого отчета мы продемонстрируем другие, не рассмотренные ранее возможности системы компоновки данных, а также использование в схеме компоновки вложенного отчета. Разработаем простой отчет, пред- ставляющий список услуг фирмы и соответствующую информацию из отчета продаж номенклатуры для каждой услуги (рис. 16.219). Том 2
Список услуг Код 000000014 Наименование____________________Ремонт компьютера Контрагент Количество Стоимость Номенклатура Период ООО'Атяент” 1 3 000,00 Ремонт компьютера__________________1______3 000,00 13 янверя2012 г. 1| 3000,00 ООО “Стандарт" 1 3 000,00 Ремонт компьютера 1 3 000,00 14 января 2012 г._______________11 3 000,00 Итого 2 6 000.00 Код 000000016 Наименование____________________Восстановление дет Контрагент Количество Стоимость Номенклатура Период рОО'Атяент” _ _________ 1 _ 5 000,00 Восстановление данных |__________1____________5 000,00 15 янверя2012 г. | 1 5 000,00 Итого 1 5 000,00 Рис. 16.219. Требуемый вид отчета Создадим новый объект конфигурации Отчет и назовем его Оказа- ниеУслуг. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Откроем конструктор запроса. В качестве источника данных для запроса выберем объектную таблицу справоч- ника Номенклатура. В список полей перенесем поля из этой таблицы: Ссылка, Код, Наименование. Поле Ссылка нам понадобится в качестве ссылки на вложенную схему компоновки данных. Перейдем на закладку Условия, раскроем таблицу Номенклатура и перетащим мышью поле ВидНоменклатуры в список условий. Оставим предложенное условие по умолчанию. Это условие нам нужно, чтобы в отчете отражались только услуги из справочника номенклатуры (рис. 16.220). S Конструктор запроса Таблицы и... Групгыровка I Условия Дополните... Объединен... Порядок Компоновк... Характерна,. Пакет загр... ВноНомвмслагуры | Запрос | | < Назад | | Далее > | | 0К | | Отмена | | Справка | Рис. 16.220. Создание условия запроса Нажмем ОК и вернемся в конструктор схемы компоновки данных. На закладке Параметры мы видим параметры компоновки данных, созданные платформой. Для параметра ВидНоменклатуры по умолчанию
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 установлен тип ПеречислениеСсылка.ВидыНоменклатуры и установ- лена его недоступность для пользователя. Зададим значение параметра по умолчанию - Перечисление.ВидыНоменклатуры.Услуги (рис. 16.221). Т^1 Отчет ОкаэаниеУслуг: ОсновнаяСхемаКомпоновкиДанных □ X Наборыданных Связи наборов данных Вычисляемые поля Ресурсы | Параметры | Макеты Вложенные схемы Настройки и Ф Имя Заголовок Тип Д... Д... Значение В... П,„ В... 0... 3... И,., ВндНоменклатуры Вка номенклатуры ПеречислетеСсылкаВидыНоменк... О IBffiOWSSBKSHSRKBKMBN @ А- I ' ! 1>1 Рис. 16.221. Параметры компоновки данных, созданные платформой Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим группировку без указания группировочного поля ДетальныеЗаписи. Затем на закладке Выбранные поля перенесем из списка доступных полей поля (рис. 16.222): Код, в Наименование. Т$1 Отчет ОкаэанмвУслуг: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.222. Определение полей и группировок отчета На закладке Сортировка укажем, что данные в отчете будут упорядочи- ваться по полю Наименование. Для этого перенесем это поле из списка доступных полей в список сортировки. Но вместо стандартного представ- ления для этого поля на закладке Наборы данных мы зададим собственное выражение, по которому и будет проводиться упорядочивание записей в отчете (стр. 313). Нажав кнопку выбора ••• для поля Наименование в колонке Выражение упорядочивания, вызовем диалог его свойств, который содержит: в Выражение - текст выражения на языке выражений системы компо- новки данных; Тип упорядочивания - по убыванию или по возрастанию; Необходимость упорядочивания - флажок для определения упорядочи- вания ссылочных полей.
Нажмем кнопку Добавить и введем в колонку Выражение следующий текст (листинг 16.31). Листинг 16.31. Выражение для упорядочивания поля «Наименование» | Выбор Когда Наименование = "Ремонт компьютера" Тогда 1 Иначе 2 Конец Укажем Тип упорядочивания - По возрастанию. Нажмем еще раз кнопку Добавить и выберем в колонке Выражение поле Код. Укажем Тип упорядочи- вания - По убыванию. Таким образом, мы установили, что первой в списке услуг должна располагаться услуга с наименованием Ремонт компьютера, а остальные записи в отчете должны располагаться по мере убывания кода услуги. В результате окно диалога примет вид (рис. 16.223). Выражения упорядочивания X о Выражение Тип упорядочивания Н... А Выбор Когда Наименование = "Ремонт компьютера" Т огда 1 И... по возрастанию Q Код О | ОК11 Отмена 11 Справка | Рис. 16.223. Задание выражения упорядочивания В результате выражение упорядочивания для поля Наименование примет вид (рис. 16.224). ' Поле Путь Автозаголовок = Код Код __________________О Код = Наименование Наименование □ Наименование = Ссылка Ссылка П Ссылка Выражение представления Выражения упорядочивания Ограничение поля Роль П... У... Г... У... Ограничение рек... П... У... Г... У... Рис. 16.224. Выражение упорядочивания для поля «Наименование» Пользовательские поля Система компоновки данных позволяет определять в отчете Пользователь- ские поля (стр. 285), используя либо собственные выражения, либо наборы вариантов с условиями их выбора. В настройках отчета на закладке Пользовательские поля нажмем кнопку Добавить и добавим новое поле - Выбор. Зададим заголовок поля - В составе сборки и создадим условия отбора для различных вариантов его представления (рис. 16.225). Профессиональная разработка в системе «1С:Предприятие 8»
Пользовательское поле выбор X Заголовок: В составе сборки варианты: (jg) X т_г О 1 Отбор Значение Представление 0 j Км Равно "000000006" 1 | ОК || Отмана 11 Справка | Рис. 16.225. Добавление пользовательского поля выбора Добавим еще одно пользовательское поле - Выражение. Зададим заголовок поля - Популярная услуга и выражение на языке выражений компоновки данных для отображения детальных записей. Нажмем кнопку Доба- вить и введем в колонку Выражение детальных записей следующий текст (листинг 16.32). Листинг 16.32. Выражение детальных записей для пользовательского поля - выражения «Популярная услуге» Выбор Когда Наименование = "Ремонт компьютера" Или Код = "000000007" Тогда "да" Иначе "нет” Конец В результате окно пользовательского поля - выражения примет вид (рис. 16.226). Пользовательское поле выражение X Заголовок: Выражение детальных записей: Выбор Когда Наименование = 'Ремонт компьютера" Или Код = 'VXXfXXDT' Тогда “да" Иначе “нет" Конец Выражение итоговых записей: | 0К || Отмена 11 Справка | Рис. 16.226. Добавление пользовательского поля выражения ВНИМАНИЕ! В выражениях пользовательских полей не могут быть использованы функции общих модулей. Теперь добавим новые пользовательские поля в отчет. На закладке Выбранные поля раскроем список Пользовательские поля и перенесем из списка доступных полей поля Популярная услуга и В составе сборки (рис. 16.227). Том 2
Параметры | Выбранны... | Отбор Сортировка Условное.., По/ьзовет.,, Другие на.,, Доступные поля Поле = Км = Наименование = Ссылка Сэ СистемныеПоля •'+• о ПараметрыДанных ?- Сэ Пользовательские поля = Популярная услуга Выбранные поля 0 - Км 0 = Наименование 0 = В составе сборки 0 = Популярная услуга Рис. 16.227. Добавление пользовательских полей в отчет На закладке Другие настройки установим заголовок отчета Список услуг, а макет оформления (стр. 300) отчета - Яркий. Выполним отчет (рис. 16.228). ® ф Vf ' °- (1С:Предпри iH |Q W 0 [ДУ 'ill М М+ м- - - □ X Оказание услуг Вариант отчета: [Основной | | Выбрать вариант... | | Сформировать 11 Настройка... Все действия ’ । (?) Рис. 16.226. Результат отчета Мы видим, что записи в отчете расположены в заданном порядке и пользовательские поля отражаются в соответствии с условиями их пред- ставления. Теперь дополним список услуг информацией из вложенного отчета. Вложенный отчет В нашем отчете мы хотим видеть список услуг из справочника номен- клатуры с вложенными данными из отчета Продажи номенклатуры (стр. 161) для каждой услуги. В действительности всю эту инфор- мацию можно получить прямо из отчета по продажам номенклатуры, но данная задача позволит нам продемонстрировать еще одно интересное свойство системы компоновки данных - работу с вложен- ными отчетами. Сначала откроем схему компоновки данных отчета ПродажиНоменклатуры и сохраним ее в файл, нажав кнопку с иконкой Сохранить в левом нижнем углу окна конструктора схемы компоновки данных (рис. 16.229).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Т5! Отчет ПродажиНоменклетуры: ОоновнаяСхемаКомлоновкыДанных _ □ X Рис. 16.229. Сохранение схемы компоновки данных В появившемся диалоговом окне зададим произвольное имя для схемы и нажмем кнопку Сохранить (рис. 16.230). Coxpai (ить схему □ файл из Папка: & База Имя Файла: Тип Файла: 11 Itfl осема_продажи_иоменклатурь|0 |£]о(ема_СБ 1=?1 осема_СБ_мастера 1=1 осема_составСБ 1’11 осема_список_номенклатуры 1=1 осема_цены„комплектующих |схемц_продажи_номенклатуры ~^1 | Сохранить* I Документ XML Г,xml) ^1 Отмена Рис. 16.230. Создание файла, содержащего схему компоновки данных Вернемся в схему компоновки нашего отчета, перейдем на закладку Вложенные схемы и добавим новую схему. Назовем ее ПродажиНоменкла- туры и в поле Схема нажмем кнопку выбора (рис. 16.231).
Й Отчет ОказашеУслуг: ОсновнаяСхемаКомпоновкиДанных □ X Наборы данных Связи наборов Д-,. Вычисляемые по.,, Ресурсы Параметры Макеты | Вложенные схемы | Настройки ф X Имя Заголовок Схема Настройки ПрооажиНоменклатуры Продажи номенклатуры О Рис. 16.231. Добавление вложенной схемы в отчет В открывшемся окне конструктора схемы компоновки данных загрузим из файла вложенную схему компоновки данных, нажав кнопку с иконкой Открыть. Выберем файл XML с сохраненной ранее схемой - Схема_ продажи_номенклатуры (рис. 16.232). Й Конструктор схемы компоновки данных _ П X Рис. 16.232. Выбор файла вложенной схемы Теперь вернемся в схему компоновки данных основного отчета ОказаниеУслуг, нажмем кнопку выбора - в поле Настройки и зададим настройки вложенной схемы. Зададим связь вложенной схемы с родительской так, чтобы для каждой услуги из нашего отчета отражалась соответствующая информация из вложенного отчета. Добавим новый элемент отбора и нажмем кнопку выбора - в поле Левое значение. В открывшемся окне выбора поля укажем поле вложенного отчета Номенклатура (рис. 16.233). В поле Правое значение нажмем кнопку очистки х, затем кнопку выбора типа данных т и выберем тип данных Поле компоновки данных (рис. 16.234). Профессиональная разработка в системе «1С:Предприятие 8»
Отчет ОкаэаниеУслуг: ОсноенаяСхемаКомпоноекиДанных _ □ X Рис. 16.233. Задание условий отбора в настройках вложенной схемы Настройки вложенной схемы до Параметр Выбор типа данных О Конецпериода Предопределенное еначение компон... I °К I | Отмена | V |[Пйоро6но| Левое значение Вид сравнения Правое энаф... Режим отобре... П... 0 Отбор = Номенклатура Равно Быстрой доступ ОК 11 Отмена 11 Справка | Рис. 16.234. Задание условий отбора в настройках вложенной схемы Теперь нажмем в поле ввода кнопку выбора - и в открывшемся окне выбора поля раскроем поле ОбъектНастройки.Владелец и выберем поле родительского отчета Ссылка (рис. 16.235). Настройки вложенной схемы________________________________________Х_ & Выбор поля X | ОК || Отмена 11 Сгдовка | т Рис. 16.235. Задание условий отбора в настройках вложенной схемы Том 2
В результате окно настроек вложенной схемы примет вид (рис. 16.236). Настройки вложенной схемы X ОК 11 Отмена 11 Справка | Рис. 16.236. Окно настроек вложенной схемы Теперь добавим вложенный отчет в структуру отчета. На закладке Настройки в дереве структуры отчета выделим элемент Детальные записи и в контекстном меню выберем пункт Новый вложенный отчет... Обратите внимание, что пока мы не добавили вложенную схему в отчет, этот пункт был недоступен (рис. 16.237). Й Отчет ОкаэаниеУслуг: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборы данных Связи наборов д... Вычисляемые па.. Ресурсы Параметры Макеты Вложенные схемы Настройки |_ ® Е> .. -и- с- -в - X TJ- О 1 щ. Cl5 га 1 т Ц] Отчет Имя варианта Представле... Основной "в й й tn Новая группировка.. 1*ГП Новая таблица iti Новаядиаграмма Новый вложенный отчет... Скопировать Ins F9 Параметры | Выбранные... Доступные поля Изменить Удалить Конструктор настроек... Переместить вверх Переместить вниз F2 Del Ctrl+Shift+Up Ct(l*Shift*Oown Сгруппировать... Разгруппировать Установить имя... Включить вое Выключить все Станоаргная настройка.. Друие нас... g а $ Рис. 16.237. Добавление вложенного отчета Из списка доступных вложенных отчетов выберем отчет ПродажиНо- менклатуры. В результате окно настроек нашего отчета примет вид (рис. 16.238).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Т°1 Отчет ОказаннеОслуп ОсновнаяСхемаКемпоновкиДанныя _ □ X Рис. 16.238. Окно настроек отчета ВНИМАНИЕ! Вложенная схема вместе со своими настройками добавилась в основной отчет. Чтобы активизировать режим настроек основного отчета, нужно выделить одну из его ветвей или корневой элемент дерева структуры отчета. Для настройки вложенного отчета достаточно выделить одну из его ветвей в дереве структуры отчета. При установке настроек отде- льной группировки основного или вложенного отчета в средней части окна, под деревом группировок отчета, должна быть выделена соот- ветствующая ей кнопка. Выделив ветку ПродажиНоменклатуры, настроим вложенный отчет. На закладке Другие настройки уберем признак использования его заголовка (рис. 16.239). На закладке Условное оформление уберем признак использования его условного оформления. А также исключим эту настройку из состава поль- зовательских настроек, поскольку в форме основного отчета она не нужна (рис. 16.240). На закладке Отбор уберем признак использования у первого элемента отбора. А также исключим эту настройку из состава пользователь- ских настроек, поскольку в форме основного отчета она не нужна. Второй элемент отбора нам нужен для установки связи между основным и вложенным отчетом (рис. 16.241).
_ □ X Й Отчет ОкаэениеУслуг: ОсновнаяСхемаКомпоновкиДанных Рис. 16.239. Настройка вложенного отчета Параметры Выбранные,,, Отбор Сортировка | Условное о... | Польэовет,,, Другие нас,., Оформление Цвет текста Условие Оформляемые поля Стоимость Меньше "3... Стоимость Представление Мелкий заказ Пользовательские настройки элемента Включать в пользовательские настройки! Представление Режим редактирования [Быстрый доступ | ОК || Отмена 11 Справка | Рис. 16.240. Настройка вложенного отчета Параметры Выбранные поля | Отбор | Сортировка Условное оформление Пользовательские поля Другие настройки Доступные поля = Контрагент = Номенклатура = Период Левое значение ? Отбор = Номенклатура.ВиоН... Равно = Номенклатура Равно Видсрав... Правое значение Перечисление.ВиоыНоменклатурыПуствя... Б... = ОбъектНастройиО ладелец-Соылка Б... *13 = Стоимость о ОбъектНастройиОладелец + о ПараметрыДанных Пользовательские настройки элемента Включать е пользовательские настройки! Представление Режим редактирования I QI [Быстрый доступ*1 К | ОК || Отмена 11 Справка | Рис. 16.241. Настройка вложенного отчета Профессиональная разработка в системе «1С:Предприятие 8»
Выделив ветку Детальные записи, настроим основной отчет. На закладке Выбранные поля уберем признак использования его полей Популярная услуга и В составе сборки (рис. 16.242). Й Отчет ОкаэаяиеОслуг ОсновнаяСхемаКомпоновкиДанных________________________________________________________ □ X Наборыданных Свяеи наборов а... Вычисляемые по... Ресурсы Параметры Макеты Вложенные схемы | Настройки |_ Ф и v 1 ’ х ж v о । М । G1 Йй Имя варианте Представле... ВВИЙЭВВ J Основной ? Отчет 11S ОЙ Ой •т 0Ц] Продажи номенклатуры fig [fj! •т 0™ Контрагент - 0™ Номенклатура 0™ Период Застройки: | Отчет | <Датальные записи> Параметры | Выбранные... | Отбор Сортировка Условное о... Польвоват... Другие нас... Доступные поля = = Наименование *• = Ссылка *• О СистемшеПоля О ПараметрыДаннык t о Пользоеаггелэские поля Поле - Выбранные поля 0 = Код 0 = Наименование О\ = Популярная услуга ’ — | Ф О X -мй Рис. 16.242. Настройка основного отчета Выполним отчет (рис. 16.243). ® Vf °- (ЮЛредпри wslS] ’ail М М* М- - □ X Оказание услуг Вариант отчета: [Основной I | Выбрать вариант,,, | | 1> Сформировать 11 0^ Настройка... Все действия » i (?) I Список услуг Код Наименование 000000014 Ремонт компьютера Отбор: Номенклатура Равно Объект владелец.Ссылке Контрагент Номенклатура Период ООО "Атлант” Ремонт компьютера 12 января 2012 г. ООО "Стандарт" Ремонт компьютера 12 января 2012 г. Итого Количество Стоимость 1 3 000,00 1 3 000,00 1| зооодо| 1 3 000,00 1 3 000,00 1| зооодо| 2 6 000,00 Код Наименование 000000016 Восстановление данных Отбор: Номенклатура Равно Объект владелец.Ссылка Контрагент Номенклатура Период ООО "дтлант" Восстановление данных 12 января 2012 г. Итого_________________ Количество Стоимость 5 000 ДО 5 000 ДО 5 000 ДО 5 000 ДО Рис. 16.243. Результат отчета Том 2
Мы видим, что услуги располагаются в заданном ранее для основного отчета порядке, пользовательские поля отключены, а каждой услуге соот- ветствуют записи вложенного отчета по продажам номенклатуры. Также мы видим, что настройки отбора и условного оформления вложенного отчета отключены и отсутствуют в составе пользовательских настроек. Но было бы хорошо иметь возможность задавать отчетный период для вложенного отчета непосредственно в отчетной форме. Усовершенствуем внешний вид отчета. Выделим в дереве отчета элемент ПродажиНоменклатуры и на закладке Другие настройки отключим вывод отбора у вложенного отчета, так как это не несет никакого смысла, а лишь указывает на его связь с основным отчетом. Также отключим вывод параметров, так как параметры отчетного периода будут находиться непосредственно в отчетной форме (рис. 16.244). ?1 Отчет ОкаэаниеУслуг: ОсновнаяСяемаКомпоновкиДанных _ □ X Рис. 16.244. Настройка вывода отбора и параметров вложенного отчета А также исключим настройки отбора и условного оформления из состава полных пользовательских настроек отчета, нажав кнопку Свойства элемента пользовательских настроек вверху командной панели окна настроек (рис. 16.245). Состав польаовагельокмк настроек отчета X Представление Режим редактирования |_| Вложенный отчет I Q| [Быстрый доступ ▼[ иВыбранныеполя I Q| [Быстрый доступ ▼[ (^тбор | Q| [Обычный ▼[ U Порядок I Q| [Быстрый доступ (^_Д1слсвное оформление! | Q| [Обычный ▼[ LJ Группировки I Q| [Быстрый доступ | ОК || Отмена 11 Справка | Рис. 16.245. Состав пользовательских настроек отчета №5
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Заметим, что эти настройки добавились в отчет из вложенного отчета и их нужно отключить, поскольку в форме основного отчета они не нужны. В заключение настроим параметры отчетного периода вложенного отчета. Выделим в дереве отчета элемент ПродажиНоменклатуры. На закладке Параметры включим параметры начала и окончания отчетного периода в состав быстрых пользовательских настроек (рис. 16.246). Й Отчет ОказаниеУслуг: ОсновнаяСхемаКомпоновкиДанныи _ П X Рис. 16.246. Настройка параметров вложенного отчета Запустим отчет на исполнение в режиме 1С:Предприятие. Зададим отчетный период 13.01.2012-15.01.2012 и нажмем кнопку Сформировать. Отчет примет вид (рис. 16.247). Мы видим, что вложенный отчет формируется за указанный отчетный период, так как данные за декабрь 2011 года отсутствуют. Таким образом, на примере этого отчета мы научились: задавать выражение упорядочивания для поля, задавать пользовательские поля-выражения и поля выбора, использовать в отчете вложенные отчеты, управлять настройками основного и вложенного отчета. В®®
® «3, W ' °- (1С:Предпри ®| |Q W й 'ЛИ 'ill - - □ х Оказание услуг Вариант отчета: [Основной | | Выбрать вариант... | | > Сформировать । 0^ Настройка... В се действия» । <^) ® iTTl Началопеонода 13.01.2012 В ДД Конец периода 115101.2012......................................... Список услуг Код 000000014 Наименование_______________Ремонт компьютера Количество Стоимость Контрагент Номенклатура Период 000'Атязит* Ремонт компьютера 13 енеарй 2012 г. ООО "Стандарт* Ремонт компьютера 14 енеарй 2012 г. Итого 1 3 000,00 1 3 000,00 | 1 3000,00 1~ 3000,00 1 3000,00 I 1 3000,00 2' 6 000 ДО Код Наименование Контрагент Номенклатура Период ООО "Атлант* Восстановление дажых 15 енваря 2012 г. Итого 00000001 в Восстановление данных Количество Стоимость 1 5 000,00 1 5 000,00 1| 5 000,00[ 1 5 000.00 Рис. 16.247. Результат отчета Пример 14 На примере этого отчета мы рассмотрим особенности расчета итогов по полям остатка и возникающие при этом проблемы. В качестве исход- ного образца разработаем простой отчет, отражающий движение и остатки номенклатуры на складах (рис. 16.248). Склад ^Начальный Приход Расход Конечный Номенклатура остаток остаток Основной 13,000 9,000 4,008 Жесткий диск ЗДОО 3,000 2 Д00 Материнская плата 5 ДОО 3,000 Память 5 ДОО 3,000 2 ДОО Розничный 24,000 7,000 17,008 Веб-камера юдоо 3,000 7 Д00 Микрофон юдоо 2,000 8 ДОО Монитор LCD 4 ДОО 2,000 2 ДОО Итого 37,000 16,000 21,008 Рис. 16.248. Требуемый вид отчета В принципе это модификация отчета ОстаткиНоменклатуры, но для демонс- трации проблем при расчете остатков мы разработаем другой отчет с детализацией данных по периодам. Создадим новый объект конфигу- рации Отчет и назовем его ОстаткиНоменклатурыПоПериодам. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Источником данных для запроса будет служить Профессиональная разработка в системе «1С:Предприятие 8»
виртуальная таблица регистра накопления ОстаткиНоменклатуры.Остат- киИОбороты. Не будем пользоваться конструктором запроса, а сразу внесем в поле Запрос следующий текст (листинг 16.33). Листинг 16.33. Текст запроса ВЫБРАТЬ ОстаткиНоменкпатурыОстаткиИОбороты. Номенклатура, ОстаткиНоменкпатурыОстаткиИОбороты.Скпад, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоНачальныйОстатокКАКНачапьныйОстаток. ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОсгаткиНоменкпатурыОстаткиИОбороты.КоличествоРасход КАК Расход ИЗ РегистрНакопления.ОстаткиНоменкпатуры.ОстаткиИОбороты КАК Остатки НоменклатурыОстаткиИОбороты Перейдем на закладку Ресурсы и определим доступные поля ресурсов отчета (стр. 290), рис. 16.249. Рис. 16.249. Определение ресурсов отчета На закладке Параметры (стр. 292) зададим настройки параметров, как и в предыдущих примерах. Для параметров НачалоПериода и КонецПериода в колонке Тип нажмем кнопку выбора ... и в нижней части окна редактиро- вания типа данных установим Состав даты в значение Дата. Для параметра КонецПериода зададим значение колонки Выражение, чтобы данные за последний день отчета были включены в расчет (листинг 16.34). Листинг 16.34. Выражение для расчета параметра «КонецПериода» КонецПериода(&КонецПериода, "День") | Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Склад. Затем добавим вложенную в нее группировку по полю Номенклатура. На закладке Выбранные поля перенесем из списка доступных полей поля (рис. 16.250): НачальныйОстаток, Приход, Расход, КонечныйОстаток. Том 2
^1 Отчет ОстаткиНомсмклатурыПоПериолам: ОоновнаяСхомаКомпоновкиДажых _ □ X Рис. 16.250. Определение полей и группировок отчета На закладке Другие настройки установим макет оформления (стр. 300) отчета - Зеленый. Запустим и сформируем отчет в режиме 1 (^Предприятие (рис. 16.251). Vf Осгепшн... (1£Преджятие) Й Зй W Ё цЦ '3tl М М+М-. Остатки номенклатуры по периодам Вариант отчета: |Основной_______ | > Сформтровать 11 ИЗ Настройка... | | Выбрать вариант... I Все действия ’ । (?) Склад Номенклатура Основной Жесткий диск Материнская плата Память Розничный________ Веб-кемера Микрофон MotxTopLCD_____ Итого ^Начальный Приход Расход Конечный остаток______________________остаток УДЮО 3,000' 3,000' 13ДИ 3,000 5,000___________ 5,000 3.000 24ДВ0 7,000 3,000 2,000’ 2,000' 16,000 10.000 10,000 4,000 37 ДИ 4ДЮ0 2,000' 2,000 17,000 7,000 6,000 2,000' 21Д001 Рис. 16.251. Результат отчета Теперь детализируем отчет по периодам. Например, требуется отобра- зить движение и остатки номенклатуры с детализацией по регистратору за указанный отчетный период. Изменим текст запроса для получения отчета (листинг 16.35). Листинг 16.35. Текст запроса ВЫБРАТЬ Остатки НоменклатурыОстаткиИОбороты.Номенклатура, Остатки НоменкпатурыОстаткиИОбороты.Скпад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменкпатурыОстаткиИОбороты.КопичествоКонечныйОстаток КАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход КАК Расход, Остатки НоменкпатурыОстаткиИОбороты.Регистратор ИЗ РегистрНакопления.ОстаткиНоменкпатуры.ОстаткиИОбороты(,, Авто,,) КАК ОстаткиНоменклатурыОстаткиИОбороты W7
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Изменим структуру отчета. В группировку Номенклатура вложим груп- пировку Детальные записи, в поля отчета добавим поле Регистратор (рис. 16.252). Т^1 Отчет ОстаткмНоменклатурыПоПериодам: ОоновнаяСиемаКомпоновкиДаннык _ □ X Рис. 16.252. Требуемый вид отчета Рис. 16.253. Результат отчета
На закладке Параметры включим параметры НачалоПериода и КонецПе- риода в состав быстрых пользовательских настроек. Сформируем отчет в режиме 1С:Предприятие (рис. 16.253). Мы видим, что итоги по полю НачальныйОстаток посчитаны непра- вильно. Расчет итогов по полям остатка Проблема в том, что в запросе при получении поля Регистратор обязательно должно быть получено и его родительское поле-период ПериодСекунда. Это относится ко всем полям-периодам - при получении поля-периода в запросе должно присутствовать его родительское поле-период. Изменим текст запроса для получения отчета (листинг 16.36). Листинг 16.36. Текст запроса ВЫБРАТЬ Остатки НоменкпатурыОстаткиИОбороты.Номенклатура, Остатки НоменклатурыОстаткиИОбороты.Склед, ОстаткиНоменклатурыОстаткиИОбороты.КопичествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоРасход КАК Расход, Остатки НоменкпатурыОстаткиИОбороты.Регистратор, Остатки НоменкпатурыОстаткиИОбороты.ПериодСекунда ИЗ РегистрНакопления.ОстаткиНоменкпатуры.ОстаткиИОбороты(,, Авто,,) КАК ОстаткиНоменкпатурыОстаткиИОбороты Так как свойство Автозаполнение (стр. 278) установлено, платформа авто- матически заполнит роли (стр. 287) полей-периодов в наборе данных (рис. 16.254). Роль - Регистратор Роль - ПериодСекунда - Роль О Без роли О Б ез роли □ Игнорировать значения NULL О Обязательное ^|)fiepnoflj|^2 С| □ Дополнительный^ О .-Измерение Родитель: | Вод: О -Остатки Имя: Бух. тип: Поле счета: □ Игнорировать значения NULL О Обязательное | ОК || Отмена 11 Справка | | ОК || Отмена 11 Содавка | Рис. 16.254. Роли полей-периодов Профессиональная разработка в системе «1С:Предприятие 8»
Поля-периоды для правильного расчета остатков должны иметь непре- рывную нумерацию, начиная с 1. При этом чем меньше номер периода, тем более точным должен быть период. Например, поле НомерСтроки является уточнением поля Регистратор, поэтому номер периода поля НомерСтроки должен быть меньше, чем номер периода поля Регистратор. Аналогично и номер периода поля ПериодДень должен быть меньше, чем номер поля ПериодГод. В нашем примере поле Регистратор (номер периода - 1) является уточне- нием поля ПериодСекунда (номер периода - 2). Если по какой-то причине роли полей-периодов не проставлены автоматически, необходимо сделать это вручную. В результате мы получим правильные итоги остатков номенклатуры за период с детализацией по регистратору (рис. 16.255). Рис. 16.255. Результат отчета Другой вероятной причиной неправильного расчета остатков является отсутствие в запросе парного поля-остатка. Например, следующий запрос будет неправильным (листинг 16.37). Том 2
Примерен раз ра б от к и [отд ёто в Листинг 16.37. Текст запроса ВЫБРАТЬ Остатки НоменкпатурыОстаткиИОбороты.Номенкпатура, Остатки НоменкпатурыОстаткиИОбороты.Скпад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоРасход КАК Расход, Остатки НоменкпатурыОстаткиИОбороты.Регистратор, Остатки НоменкпатурыОстаткиИОбороты.ПериодСекунда ИЗ РегистрНакопления.ОстаткиНоменкпатуры.ОстаткиИОбороты(,, Авто,,) КАК ОстаткиНоменкпатурыОстаткиИОбороты При наличии в запросе парного поля-остатка (см. листинг 16.36) и уста- новленном свойстве Автозаполнение (стр. 278) платформа автоматически заполнит роли (стр. 287) полей-остатка в наборе данных (рис. 16.256). Роль - НачальныйОстаток Q Игнорировать значения NULL О Обязательное | ОК || Отмена 11 Справка | Рис. 16.256. Роли полей-остатка Роль - КонечныйОстаток | ОК ] | Отмена 11 Справка | Парные поля-остатки должны иметь одинаковое имя группы полей- остатков. Непарные остатки должны иметь различные имена групп полей-остатков. Если по какой-то причине роли полей-остатков не простав- лены автоматически, необходимо сделать это вручную. В результате мы получим правильные итоги остатков номенклатуры за период с детализацией по регистратору (см. рис. 16.255). Также для корректного расчета остатка должны быть правильно указаны роли полей (стр. 287), являющихся измерениями и реквизитами изме- рений. Поля, являющиеся измерениями, в разрезе которых получаются остатки, должны быть отмечены как измерения. Поля, не отмеченные как измерения при расчете итогов по полям остатка, учитываться не будут, это может привести к получению неправильных остатков. И наоборот, поле, по сути не являющееся измерением, не должно быть отмечено как изме- рение. В противном случае остатки могут быть получены неправильно. и®®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В нашем примере платформа автоматически проставила роли полей-изме- рений у полей Номенклатура и Склад. Это правильно. Но посмотрим, что будет, если в запросе получается реквизит измерения. Изменим текст запроса для получения отчета (листинг 16.38). Листинг 16.36. Текст запроса ВЫБРАТЬ ОсгаткиНоменкпатурыОстаткиИОбороты. Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, ОстаткиНоменкпатурыОстаткиИОбороты.Скпад, ОстаткиНоменкпатурыОсгаткиИОбороты.КоличествоНачальныйОсгаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстатокКАККонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоРасход КАК Расход, ОстаткиНоменкпатурыОстаткиИОбороты.Регистратор, ОстаткиНоменклатурыОстаткиИОбороты.ПериодСекунда ИЗ РегистрНакоппения.ОстаткиНоменкпатуры.ОстаткиИОбороты(,, Авто,,) КАК Остатки НоменклатурыОстаткиИОбороты Сгруппируем записи по полю ВидНоменклатуры (рис. 16.257). - Q] Отчет * 0™ Склэд______ - 0™ Оагаалывин» рис 16.257. Структура ОТЧвТЭ В результате мы получим неправильные итоги по полю КонечныйОстаток (рис. 16.258). Проблема в том, что у поля ВидНоменклатуры не указана роль реквизита измерения. Для решения этой проблемы нужно указать родительское поле в роли поля-реквизита. Так, в приведенном выше примере нужно у поля ВидНоменклатуры указать роль Измерение и указать в качестве родитель- ского поле Номенклатура (рис. 16.259). 2©@
W Остатки номенклатуры по периодам-Демонстрационная кон.. (ЮПредприягие) Й Gai La 1x5 1й1 'ffil ail ММ+М-» □ X Остатки номенклатуры по периодам Вариант отчета: | Основной | | Выбрать вариант... | | > Соермировать || Настройка... Вседействия- i (?) 0 (Ttl Начало периода 01.122011 @ |?Г| Конец периода 20.01.2012 т Параметры; Начало периода; 01.122011 Конецпериода; 20.012012 Склад Начальный Приход Расход Конечный Вид номенклатуры остаток остаток Регистратор Основной 13,000 9,000 2,000 Материалы 13,000 9Д00 2,000 ► Приходнаянакладнай000000002ст05.12201115:5317 5,000 5,000 Сборка компьютера 000000001 cr08.12.201119:3340 5 ДОС 1,000 4 ДОС Сбсркакомпыотера000000002ст11.12201115:09:13 4 ДЮ 1.000 3,000 Сбсрка компьютера 000000003 ОТ 11.012012 2220:17 ЭДОО 1,000 2,000 2,000 2,000 Гкжходнаянекладнай000000002ст05.12201115:5317 5,000 5,000 Сборка компьютера 000000001 OT0S.12201119:33:40 5,000 1,000 4,000 Сбсркакомпыотера000000002ст11.12201115:09:13 4 ДОС 1,000 3,000 Сбсрка компьютера 000000003 ОТ 11.012012 2220:17 3,000 1,000 2,000 2,000 2,000 ГЪиходнаянаклааная000000001 ст05.12201112:2239 3,000 3,000 Сборка компьютера 000000001 ОТ06.12201119:33:40 3,000 1,000 2,000 Сбсркакомпыотера000000002ст11.12201115:09:13 2,000 1Д00' 1,000 Сбсркакомпыотера000000003ст11й120122220:17 1ХЮО 1,000 Розничный 24,000 7ДВ0 0,000 матеркалы 24,000 7Д00 6,000 ГЪиходна я накладная 000000003 ст 06.12201114:04:13 2,000 2.000 Расходнаянакладная 000000003 от06.122011 21:11:04 2,000 1,000 1,000 ГЪиходнаянакладная000000004ст11Л1201211:10:00 1ХЮО 2.000' 3,000 Расходнаянакладная000000008от12Л1201219:19:52 3,000 1,000 2,000 2,000 2,000 ГЪиходнаянакладная000000004ст11Л1201211:10:00 5,000 5.000 Г^жходная накладная 000000005 ст 11.01201214:20:00 5,000 5,000 10ДОС Расходнаянакладная000000008от12Д1201219:19:52 10,000* 3,000' 7,000 7Д00' 7Д00 Приходная накладная 000000005 ст 11.01201214:20:00 10Д00 10Д00 Расходнаянакладная000000008от12Д1201219:19:52 10,000’ 2,000* 8,000 едоо' 6.000 Итоге 37Д00 16Д00| 4Л0В Рис. 16.258. Результат отчета Роль - Номенклатура Роль------- О Без роли Роль - ВидНомонклаггуры X | ОК || Отмена 11 Справка | О Игнорировать значения NULL О Обязательное | ОК || Отмена 11 Справка | Рис. 16.259. Роли полей-измерений В результате будут получены правильные остатки по полю - реквизиту измерения (рис. 16.260). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 16.260. Результат отчета Итак, мы рассмотрели наиболее вероятные проблемы при расчете итогов по полям-остаткам. ПОДРОБНЕЕ Раздел «Расчет итогов по полям остатка», стр. 198. Вывод в диаграмму нескольких ресурсов Теперь на примере этого отчета продемонстрируем вывод данных в диаграмму. При этом покажем новую возможность платформы - вывод в диаграмму нескольких ресурсов и возможность изменения их поло- жения. Для этого создадим новый вариант отчета Остатки номенклатуры по пери- одам и на нем продемонстрируем настройки условного оформления диаграммы. Чтобы добавить новый вариант, на закладке Настройки схемы компоновки данных нажмем кнопку Добавить слева над списком вариантов отчета. Зададим имя варианта и его представление как ДвижениеНоменкла- туры и создадим настройки нового варианта отчета. Том 2
Выделим корневой элемент Отчет, нажмем кнопку Добавить в коман- дной панели и добавим диаграмму (стр. 237). Затем выделим ветку Серии и добавим в нее группировку по полю Склад, а в ветку Точки - группировку Номенклатура. На закладке Выбранные поля перенесем из списка доступных полей поля ресурсов Приход и Расход (рис. 16.261). Й Отчет ОстаткиНеменклагурыПоПврмодам: ОсновнаяСкамаКомпоновкиДаннык _ □ X Рис. 16.261. Настройка структуры отчета На закладке Другие настройки установим параметр Расположение ресурсов в диаграмме в значение Серии и включим эту настройку в состав быстрых пользовательских настроек (рис. 16.262). Рис. 16.262. Настройка расположения ресурсов в диаграмме ЗОН
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты Настроим условное оформление диаграммы. На закладке Условное оформ- ление установим вертикальную ориентацию текста для точек диаграммы (поле Номенклатура). Зададим представление этой настройки как Верти- кально (рис. 16.263). Параметры Выбраним... Отбор Сортировка | Условное... I Пользова... Другие на.. Оформление Условие Оформляемые поля Представление @ •• х Номенклатура Вертикально Редактирова! ие параметров X Я Д | ОК || Отмена 11 Справка | Рис. 16.263. Настройка условного оформлания диаграммы Создадим еще один элемент условного оформления диаграммы. Уста- новим фиолетовый цвет для точек диаграммы (поле Номенклатура), в которых значение поля Приход больше 8. Зададим представление этой настройки как Большая закупка (рис. 16.264). Параметры Выбранны_ Отбор Сортировка I Условное._ I Пользова... Другие на.. Рис. 16.264. Настройка условного оформлания диаграммы Включим обе эти настройки в состав быстрых пользовательских настроек. Запустим отчет на исполнение в режиме 1С:Предприятие. В открывшемся окне отчета нажмем кнопку Выбрать вариант... Выберем вариант Движение номенклатуры и сформируем отчет (рис. 16.265). Мы видим, что данные о приходе/расходе номенклатуры по складам выво- дятся в диаграмму (тип диаграммы по умолчанию - Гистограмма объемная), в точках которой данные группируются по номенклатуре, а в сериях - по складам. Текст в точках диаграммы (наименования номенклатуры) располагается вертикально, столбцы номенклатуры с большим приходом выделяются цветом. Ресурсы диаграммы расположены в сериях, поэтому мы видим не две серии - по числу складов, а четыре - на каждый склад по два ресурса (Приход, Расход).
® W Остатки номенклатуры по периодам • Демо... (ЮПреоприятие) iird |4 'Я=1 'iil М М+ М- - □ X Остатки номенклатуры по периодам Вариекг отчета | Движение комемклатяры] I Выбрать вариант... | Рис. 16.265. Результат отчета Поскольку все перечисленные настройки расположены непосредст- венно в отчетной форме, то очень удобно ими манипулировать и сразу видеть результат отчета. Например, если мы отключим настройки Вертикально и Большая закупка, а параметр Расположение ресурсов в диаграмме установим в значение Авто, то мы получим следующий результат (рис. 16.266). В результате текст в точках диаграммы располагается горизонтально (это стандартный вариант), а ресурсы в диаграмме автоматически также стандартно располагаются в сериях. Теперь включим настройку Большая закупка, а параметр Расположение ресурсов в диаграмме установим в значение Точки и сформируем отчет (рис. 16.267). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 16.266. Результат отчета @ W Остатки номенклатуры по периодам-Демо... (1СПреаприягие) ®j Ев) L& 151 'id з*11 □ X Остатки номенклатуры по периодам Вариант отчета: | Движете номенклатуры| I Выбрать вариант... I | 1> Сформировать 11 П5 Настройка... Все действия । (?) О Вертикально 0 I Большая закдоа 0 ЛЯ Расположение ресурсов в диаграмме Точки Рис. 16.267. Результат отчета Том 2
Примерен р а з р а б отк и [отд е то в] В результате большие закупки номенклатуры выделяются цветом, ресурсы в диаграмме располагаются в точках, и, поскольку точек получается много (на каждую номенклатуру по два ресурса), текст в точках диаграммы автоматически располагается вертикально, независимо от того, включена настройка ориентации текста Вертикально или нет. Таким образом, на примере этого отчета мы научились: создавать корректные запросы для получения остатков по полям-пери- одам, полям-измерениям, полям-остаткам, задавать роли полей-периодов, полей-измерений, полей-остатков для получения корректных остатков, выводить данные в диаграмму и управлять ее настройками. Пример 15 На этом примере мы продемонстрируем использование в качестве источ- ника данных объектов встроенного языка. Ими могут быть: наборы записей регистров, таблицы значений, табличная часть, результат запроса, область ячеек табличного документа, прикладной объект. Наборов данных, получающих информацию из объектов встроенного языка, в схеме компоновки данных может быть несколько. Их можно связывать и объединять между собой. Разработаем свою печатную форму документа СборкаКомпьютера, используя систему компоновки данных, и покажем на ней использование собственного макета оформления (рис. 16.268). Сборка системных блоков № 000000003 от11.01.12 Системный блок: "Компьютер игровой" собрал мастер: Соколов Андреи склад: Основной N° Номенклатура — Количество — Цена — Сум ма 1 (Жесткий диск I 1| 4 000| 4 000 2|материнская плата i| эооо| 3 000 з|память 1 2 000 2 000 4|сборка компьютера l| 1 500| 1 500 Итого: 10 500 Рис. 16.266. Требуемый вид печатной формы документа Конечно, эту задачу можно решить гораздо проще, разработав макет табличного документа для печати и задав ему нужное оформление. Но для демонстрации заявленных возможностей системы компоновки данных нам эта задача вполне подходит.
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты Сначала создадим схему компоновки данных, позволяющую сформировать печатную форму документа нужного вида. Затем программно заполним используемые в ней наборы данных. Далее с помощью встроенного языка осуществим компоновку данных. Последняя задача уже знакома нам по предыдущим примерам. Набор данных - объект Выделим ветку Макеты документа СборкаКомпьютера в дереве объектов конфигурации и вызовем ее контекстное меню или нажмем кнопку Добавить в командной панели окна конфигурации (рис. 16.269). Конфигурация X ДействияL'/ ч_- Э _______________ i.i СистемаКомпоновкиДаншх '+' Общие :* Ва Константы + ffij Справочники с □ Документы Нумераторы st Последовательности Q ПриходнаяНакладная + Q РасходнаяНакладная т Q СборкаКоьпыотера +• “ Реквизиты £ ШП Табличные части Формы О Команцы ® ИИГ^ Добавить Ins | QI Журналы докртенпи---------------------' :* Перечисления +• 1Д| Отчеты t (fj7 Обработки 't О Планы видов характеристик Тр Планы счетов т Рис. 16.269. Создание макета документа В открывшемся конструкторе макета зададим имя макета ПечатьСборки, выберем тип макета Схема компоновки данных и нажмем кнопку Готово. В окне конструктора схемы компоновки данных добавим новый набор данных - объект (рис. 16.270). Т*1 Документ СборкаКомпьптера: ПечатьСборки □ X Наборы данных | Связи наборов... Вычисляемые... Ресурсы Параметры Макеты Вложенные сх... Настроен 1Й- _________________________________________________________________________________________________________isS .. frri Добавить набор данных • запрос 'V Добавить набор данных-объект — ti । Добавить набор данных • объединение а и Рис. 16.270. Добавление набора данных - объект
Назовем его СоставСБ и такое же имя зададим в поле Имя объекта, содержа- щего данные. Этот набор данных будет отражать информацию из табличной части нашего документа. Нажмем кнопку Добавить, создадим список полей набора данных с аналогичными именами (рис. 16.271): Номенклатура, Цена, Сумма, Количество. Й Документ СборкаКомпьютера: ПечатъСборкм □ X Рис. 16.271. Список полей набора данных Затем, выделив корневой элемент дерева наборов данных, добавим еще один набор данных - объект. Назовем его ДокументСБ и такое же имя зададим в поле Имя объекта, содержащего данные. Этот набор данных будет отражать информацию о реквизитах нашего документа. Нажмем кнопку Добавить, создадим список полей набора данных с аналогичными именами (рис. 16.272): Дата, Номер, Мастер, СистемныйБлок (Продукция), Склад. Профессиональная разработка в системе «1С:Предприятие 8»
Наборы данных | Связи наборов,,. Вычисляемые,,, Ресурсы Параметры Макеты Вложенные сх.,. Настройки Т*1 Документ СборкаКомпьютера: ПечагьСборки □ X Рис. 16.272. Список полей набора данных ВНИМАНИЕ! При программном заполнении полей набора данных их имена должны соответствовать именам полей в схеме компоновки данных. Дальше выполним уже знакомые действия по формированию настроек схемы компоновки данных. Сначала определим поле ресурса (стр. 290) Сумма для подсчета общего итога по табличной части документа. По умолчанию для расчета выражения ресурса нам будет предложено выра- жение Количество(Сумма). Изменим его на Сумма(Сумма), рис. 16.273. Й Документ СборкаКомпьютера: ПачатьСборки Наборыданных Связи наборов,,, Вычисляемые,,. Ресурсы | Параметры Макеты Вложенные сх... Настройки Доступные поля в Дата “ Количество = Мастер = Номемслагура = Номер = СистеммйБлок = Склад = Цена Поле Выражение Расстыгыватьпо... » < « Рис. 16.273. Определение выражения для расчета ресурса «Сумма» На закладке Настройки определим вид печатной формы нашего документа. Добавим в отчет группировку, составленную из полей реквизитов доку- мента: Номер, Дата, СистемныйБлок, Мастер, Склад. Том 2
Чтобы это сделать, можно добавить группировку без указания группи- ровочного поля Детальные записи. Затем выделить режим настроек этой группировки и на закладке Поля группировки мышью перетащить в список группировки нужные поля (рис. 16.274). Полягруппир... | Выбранные по... Отбор Сортировка Условное офо... Друиенасгро... Рис. 16.274. Определение списка полей группировки Затем на уровне глобального отчета добавим еще группировку без указания группировочного поля Детальные записи. На закладке Выбранные поля перенесем в список выбранных полей поля табличной части доку- мента: Номенклатура, Количество, Цена, Сумма. И выберем еще из системных полей поле НомерПоПорядку (рис. 16.275). Т*1 Документ СборкаКомпыотора: ПечетьСборкм _ □ X Рис. 16.275. Добавление полей в отчет Выделим режим настроек первой, составной, группировки и на закладке Другие настройки установим значения параметров вывода Тип макета -
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Вертикально (стр. 320) и Расположение итогов - Нет (стр. 332). Тем самым мы зададим вывод реквизитов документа в виде вертикального списка без итогов (рис. 16.276). Поля группир... Выбренные по... Отбор Сортировка Условное офо... I Другие настро... Параметр О Макет оформления О Количество записей О Процент записей 13 Тип макета Расположение итогов О Расположение полей группировок О Расположение группировок О Расположение реквизитов О Расположение ресурсов О Расположение общих итогов по вертикали Значение Основной I Вместе Начало Вместе е владельцем Горизонтально Авто Рис. 16.276. Определение списка полей группировки Программная компоновка Теперь поместим в документ СборкаКомпьютера кнопку Печать, при нажатии которой будет исполняться программный код, выполняющий компоновку данных и представление отчетной формы документа. Создадим основную форму документа, так как до этого мы пользовались формой, автоматически сгенерированной платформой. Затем создадим команду Печать и соответствующую ей кнопку формы и поместим ее в командную панель формы документа (рис. 16.277). Рис. 16.277. Добавление в форму документа кнопки «Печать» В обработчике команды Печать напишем следующий код (листинг 16.39). Листинг 16.39. Обработчик команды «Печать» &НаКлиенте Процедура Печать(Команда) Результат = ПечатьДокумента(); Результат.ОтображатъСетку s Ложь; Результат.ОтображатъЗагоповки = Ложь; Результат.Показатъ(); КонецПроцедуры 20®
Отчет формируется в серверной функции ПечатьДокумента(). Затем заполненный данными табличный документ возвращается на клиента и показывается пользователю (листинг 16.40). Листинг 16.40. Функция «ПечатьДокумента()» &НаСервере Функция ПечатьДокумента() ДокументОбъект = РеквизитФормыВЗначение("Объект"); Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ |СборкаКомпьютера.Дата, | Сборка Компьютера. Номер, |СборкаКомпьютера.Мастер, |СборкаКомпьютера.Продукция КАК СистемныйБлок, | Сборка Компьютера.Скпад |ИЗ |Документ.СборкаКомпьютера КАК СборкаКомпьютера ГДЕ |СборкаКомпьютера.Ссыпка = &Ссылка"; Запрос.УстановитьПараметр("Ссыпка”, ДокументОбьект.Ссылка); Результат = Запрос.Выполнить(); ШапкаДок = Результат.Выгрузить(); ВнешниеНаборыДанных = Новый Структура; ВнешниеНаборыДанных.Вставить("СоставСБ", ДокументОбъект.ПереченьНоменкпатуры); ВнешниеНаборыДанных.Вставить("ДокументСБ", ШапкаДок); СхемаКомпоновкиДанных = ДокументОбьект.ПолучитъМакет("ПечатьСборки"); Настройки = СхемаКомпоновкиДанных.НастройкиПоУмопчанию; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициапизировать(МакетКомпоновки, ВнешниеНаборыДанных); ДокументРезультат = Новый ТабпичныйДокумент; ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитъДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); II Получение доп. макета для шапки и подвала. Макет = ДокументОбъект.ПолучитьМакет("Подписи"); II Вывод своего макета. Область = Макет.ПолучитьОбласть("Ответственный“); Область.Параметры. Руководитель = Справочники.Сотрудники.НайтиПоКоду("000000003").Наименование; ДокументРезультат.Вывести(Обпасть); Возврат ДокументРезультат; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
В функции определяется запрос для выбора реквизитов текущего документа. Поле документа Продукция в запросе представлено как Систем- ныйБлок. В качестве параметра запроса используется ссылка на документ. Затем создаются два внешних набора данных - СоставСБ и ДокументСБ. Набор СоставСБ заполняется данными табличной части документа. Набор ДокументСБ заполняется данными результата выполнения опреде- ленного ранее запроса. Заметим, что в данном случае запрос к информационной базе «1 (^Предприятия» применен только для упрощения примера. На самом деле предполагается, что данные для внешних наборов данных нужно получать не из базы «1С:Предприятия», а из какого-то другого источника (например, из программного объекта или из какого-то внешнего источника). Затем программно выполняется компоновка данных с использованием внешних наборов данных и выдача результата в табличный документ. Иногда бывает нужно выводить какой-либо подвал под отчетом, например, подпись руководителя. Можно добавить эту строку в макет отчета, но мы покажем, как это сделать программным путем в отдельном макете, не изменяя схему компоновки данных отчета. У документа создан макет Подписи с областью Ответственный и параметром этой области Руководитель. После формирования отчета в функции ПечатьДокумента() получа- ется макет табличного документа Подписи, и параметр Руководитель заполняется наименованием определенного сотрудника из справочника Сотрудники. Затемобласть, содержащая этот параметр, выводитсявтабличный документ. После этого заполненный данными табличный документ возвращается на клиента и показывается пользователю. Запустим «1 (^Предприятие». Откроем документ СборкаКомпьютера. Нажмем кнопку Печать. На экране появится разработанная нами печатная форма документа (рис. 16.278). ® Z '-i т s! 1л Номер Дета Систем*м Блок Мастер Склад № Номенклатура п/п 1 Жесткий диск 2 матерююкая плате 3 Память 4 Сборке компьютера Итого Руководите» 7J >jj М М* М- ” - □ X 000000002 11.12201115:09:13 Компютер для дома Илым Сергей Основной Количество Цена Сумма 1' 3300 3300 1 3000 3000 1 1000 1500 1 1200 1 200 вооо Рис. 16.276. Печатная форма документа Теперь продемонстрируем оформление полученной печатной формы с помощью собственного макета оформления. Для этого возможны два решения: 1. Создать предопределенный макет оформления непосредственно в схеме компоновки данных макета документа. Том 2
2. Создать собственный общий макет оформления, добавив его в Общие макеты объектов конфигурации, и использовать его при настройке отчетов. Второй вариант более универсален, так как может применяться в даль- нейшем для различных отчетов, но может понадобиться и индивидуальный макет оформления для конкретного отчета. Общий макет оформления Рассмотрим вариант создания общего макета оформления (стр. 301). Раскроем ветвь Общие дерева объектов конфигурации. Выделим ветку Общие макеты и нажмем кнопку Добавить в командной панели окна конфигурации (рис. 16.279). Конфигурация Действия •©/' . v ‘ О ¥ - Общие & Подсистемы * ® Общие модули ф Параметры сеанса * 1 Роли ! I Трупы команд Е Давить t 0 XDTO-пекеты * Web-сервисы WS-ссыжи Рис. 16.279. Добавление макета оформлания В открывшемся конструкторе макета создадим макет типа Макет оформ- ления компоновки данных с именем Радуга (рис. 16.280). Конструктор макета X Имя |Радуа I Синоним: [Радуа 5I Комментарий: I I - Выберите тип макета:--------------- 01 абличный дскуиеит О Т екстовый документ О Двоичные данные О Active document О HTML документ О Географичеокая схема О Графическая схема О Схема компоновки даиди ® Макет оформления компоновки данньк Загрузить из Файла | Готово | | Отмена j | Справка | Рис. 16.280. Создание нового макета оформлания
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Нажмем кнопку Готово. Откроется редактор макета оформления с загру- женным новым макетом, в котором мы можем отредактировать цвета фона, текста и границы, шрифты областей макета оформления и т.п. (рис. 16.281). Fil Конфигурация сиДаннык: Рад^-а ~ I V О Псин» Подвал груплфовки Заголовок иерархической группировки Подвал иерармтческой гр<рпфоеки Заголовок грюмроеки стмска Подвал груплфовки опека Заголовок иерармтческой грдофоеки опека Подвал иерармтческой грдофоеки опека Заголовок группировки колонки Подвал груплфовки колонки □форм ламе* □ □ □ □ □ □ □ □ □ Параметр Цвет Фона Цвет текста Цвет границы t Стиль гратыцы Шрифт Отстут Аетоотсгуп Горизонтальное поло... Вертикальное полок.. Значение о. 0.0 Нет леем Шрифт диалогов и мемо Прижать влево Прижать вверх 2| Й । Станааргный макет _ । Очистить макет Пример отчета Параметры Параметр. 01.01.2006 0:00:00 Отбор: ГрутлфоекаТ Содержит тругпфоака" Пример таблмф! Грулпфовка! ГрутпфовкеЗ Группфовкв1 Иерархия Грутфовка1 -1 ГругтровкеЗИерархия ГрутфовкаЗ • 1 ГрултроекаЗ -1 Груплировке2-2 ГрутфоекаЗ - 3 ГругпфовкаЗИерархия Грутфовка1 -1 Грутфовке1 - 2 ГруплировквЗИерархия ГрутфоекаЗ -1 ГругпфоекаЗ -1 ГругпфовкаЗИерархия ГругтровШ - 2 ГругпфовкаТ Иерархий Грутфо Грутфо Грутфо Грутфо Грутфо Грутфо вка1 Иера вка1 * 1 екеЗИера екеЗ • 1 рхия рхия Ресурс Ресурс Ресурс 10 10 10 10 10 10 10 10 10 10 10 10 10 10 Ресурс екаЗИера вкаЗ*1 рхия Ресурс Ресурс 00 3 3 3 3 3 Рис. 16.281. Редактор макета оформления Выделив в верхнем левом окне нужную область макета, мы можем изме- нить элементы ее оформления в нижнем левом окне и сразу увидеть результат оформления этой области в правом окне редакторе макета. При этом названия областей, содержащих оформление, выделяются жирным шрифтом. При выделении в списке областей макета нужной позиции двойным щелчком мыши одновременно выделяется соответствующая ей область результата оформления, при условии что для этой области задано специ- фическое оформление. И наоборот. Для каждой области макета существует возможность создать несколько уровней оформления. Это можно сделать, выделив нужную область и нажав кнопку Добавить над списком областей. В нижнем левом углу редактора есть возможность сохранить и загру- зить макет в XML-формате. Кроме того, можно в любой момент очистить макет или загрузить предопределенный Стандартный макет. Это полезно, если вы не хотите разрабатывать свой макет оформления с нуля или чтобы получить недостающий опыт в оформлении макетов. Тогда вы берете за основу какой-либо стандартный вариант оформления, например, Зеленый и меняете необходимые области. Поясним все вышеизложенное на конкретном примере. Откроем макет ПечатьСборки документа СборкаКомпьютера на закладке Настройки
и изучим еще раз структуру нашей печатной формы (см. рис. 16.275). Первой, составленной из реквизитов документа группировке мы придали вид вертикального списка. В списке областей макета выделим строку Заголовок группировки списка. Установим для нее в нижнем окне элементы оформления - цвет текста и шрифт. В окне результата оформления мы видим пример оформления группировки списка - она отображается жирным шрифтом и зеленым цветом текста (рис. 16.282). fy Конфигурация СистемаКомпоновкиДанных: Радуга □ X Области Пример: 5 5 Заголовок группировки Подвал группировки Заголовок иерархической группировки Подвал иерархической группфовки (Заголовок группировки списка! Подвал группировки списка Заголовок иерархической группировки списка Подвал иерархической группфовки списка Заголовок группировки колоти Подвал группировки колонки Оформление: Параметр Значение О Цвет Фона М 0,0,0 *[/! Цвет текста И 0,126,0 О Цвет границы ^ИоГоГо □ Стиль границы Нет линии О Отступ О Авгооггступ О Горизонгвяьноеполо... Прижать влево О Вертикальное полок.. Прижать вверх Груплкфовка2Иерархий ГруппфовиЛ * 2 ГругпфоеиЛ Иерархий Итого Пример списка I Группировка! Ресурс Группировка1 Ресурс Группировка? Ресурс Группировка? Ресурс ГруппировкаЗ Ресурс ГруппировкаЗ Ресурс ДеталыыеЗеписи ДеталыыеЗеписи Группировка1Иерархия ' 15 Группировка1 -1 10 Группировка?Иераркия 10 Группировка? -1 6 ГруппировкаЗИерархия 6 ГруппировкаЗ -1 3 ДеталыыеЗеписи * 1 ДеталыыеЗеписи * 1 Я Д I Т| । Стандартный макет... i Очистить макет Рис. 16.282. Оформление группировки списка Вторая группировка, отражающая табличную часть документа, будет выводиться в виде обычной таблицы с итоговой строкой. В списке областей макета выделим строку Заголовок таблицы. Установим для нее в нижнем окне элементы оформления - цвет фона, текста, цвет границы, стиль границы и шрифт. В окне результата оформления мы видим пример оформления шапки группировки (рис. 16.283). Аналогично, выделив в примере группировки строку детальных записей, установим элементы оформления для соответствующей выделенной области макета Детальные записи. Выделив итоговую строку в примере группировки, установим оформление для области макета Общие итоги по вертикали. Мы пока для простоты не использовали возможность создания нескольких уровней оформления для областей макета. Но в случае вложенных друг в друга группировок это свойство желательно использо- вать для большей наглядности отчета. Профессиональная разработка в системе «1С:Предприятие 8»
- □ X fy Конфигураций СистемаКомпоноекиДанных: Радуга Рис. 16.283. Оформление шапки группировки СОВЕТ Чтобы приобрести необходимый опыт, можно после оформления каждой области проверять получившийся результат. Если вы указали оформление не той области, которая отображается в отчете, она будет выводиться без оформления либо в виде оформления области по умол- чанию, если оно задано. Проверим результат. На закладке Другие настройки установим макет оформления - Радуга. Запустим «1С:Предприятие» и откроем документ СборкаКомпьютера. Нажмем кнопку Печать. Документ будет оформлен созданным нами макетом оформления (рис. 16.284). ® -Z. U Т 1й1 »ai L4 ' W Номер Дата Системный Бяок Мастер Склад ' Ц и ' м м* м- У - □ х 000000003 Г 11.01.2012 22:20:17 Компьютер игровой Соколов Андрей Основной Ns Номенклатура л/л__________________ ____£ Жесткий диск ____2 материнская плата ____3 Память_________ ____4 Сборка компьютера Июго Количество Цена Сумма 1 4 000 1 3 000 1 2 000 1 1500 4 000 3 000 2 000 1 600 10 500 Руководитель Алексееве Дарья Рис. 16.264. Печатная форма документа Том 2
Чтобы создать универсальный макет оформления, применяемый к разным отчетам, нужно заполнить остальные области макета, не исполь- зованные в нашем примере. В первую очередь это области заголовка отчета и информации об отборе и параметрах, которые содержатся в областях макета Заголовок и Информация. Далее, применяя новый макет оформления для других отчетов, содержащих таблицы и вложенные группировки, путем нескольких итераций нужно заполнить те области макета, которые остались без оформления. Макет оформления в схеме компоновки Теперь рассмотрим пример создания предопределенного макета оформ- ления непосредственно в схеме компоновки данных (стр. 295). Откроем макет ПечатьСборки документа СборкаКомпьютера на закладке Макеты. Как видно, макет представлен в виде обычного табличного документа, областям которого можно задать нужное оформление. Но сначала мы должны установить имена группировок, чтобы использо- вать их в макетах оформления. На закладке Настройки выделим нужную группировку и вызовем ее контекстное меню. Выберем в нем пункт Установить имя (рис. 16.285). ?1 Документ СборкаКомпьютера: ПечатьСборки □ X Наборыданных Связи наборов... Вычисляемые Ресурсы Параметры Макеты Вложенные сх„ | Настройки |_ -и- о Имя вариа... Прадставл.. Основной Ц] Отчет 0™ Номер. Дата, СистемныйБлок. Мастер. Склад (Шапка) ЯКОВОЯНИОВГёэ* й Новая группировка.. Новая таблица Ins Новая диаграмма Новый вложенный отчет Выбранные по.. Отбор Скопировать Изменить Удалить Параметр @ Макет оформления Расположение итогов Расположение полей группи Расположение группировок Расположение реквизитов . Расположение ресурсов Расположение общих итогов Расположение общих итогов □ □ □ □ □ □ □ Конструктор настроек... Переместить вверх Переместить вниз Сгруппировать... Разгруппировать Установить имя... Включить все 3 Выключить все Del Ctrl*Shilt*Up Ctrl+Shift+Down внастро... I X О Рис. 16.285. Установка имени группировки Первой, составленной из реквизитов документа группировке зададим имя Шапка, а группировке Детальные записи - имя Табличная часть. Перейдем на закладку Макеты и создадим макет оформления для группи- ровки с именем Шапка (рис. 16.286).
Глава116лСложнШеТаналитинеские1от.нетШ Й Документ СборкаКомпыотера: ПечатьСборки □ X Набор.,, Связи и.. Вычисл.. Ресурсы Парам.,, | Макеты | Вложен... Кастро... Рис. 16.266. Добавление макета группировки Можно создать следующие типы макетов: макет поля используется для оформления определенных выводимых полей; макет группировки используется для оформления группировки; макет заголовка группировки используется для оформления имен выводимых в группировке полей; макет ресурсов используется для оформления ресурсов таблицы, т. е. данных, расположенных в ячейках таблицы. Выберем пункт Добавить макет группировки. В открывшемся диалоге выберем либо имя группировки Шапка, либо список полей этой груп- пировки и тип макета Заголовок, который используется для оформления значений группировки, выводящихся в начале группировки (рис. 16.287). Макет группировки X (*)Имя группировки |И1ИМ | О П оля грулпфоеки Поля Тип макета: ^Заголовок ▼ | | ОК || Отмена || Справка | ------------------------Рис. 16.287. Выбор имени и типа макета группировки В правом окне, как и для обычного макета печатной формы, настроим свойства ячеек области макета, где будет располагаться шапка доку- мента. Так, для ячейки R2C1 в строку Текст введем следующее выражение (листинг 16.41). 211®
Листинг 16.41. Шаблон для ячейки макета «R2C1» | Сборка системных блоков № [Номер] от [Дата] Укажем вариант заполнения Шаблон и элементы оформления ячейки - шрифт и цвет текста (рис. 16.288). Свойства: Ячейки aginх у | Ячейки ▼ Макет: ПараметрРасимФровки ИспольэованиеРасшиФровки [Ячейка ▼ Значения: СодержигЗначение Q Т ипЗначения Э лементУ правления Рис. 16.288. Свойства ячейки группировки «Шапка» В этом шаблоне использованы параметры Номер и Дата. Для ячейки R3C1 в строку Текст введем следующее выражение (листинг 16.42). Листинг 16.42. Шаблон для ячейки макета «R3C1» | Системный блок: "[СистемныйБлок]" собрал мастер: [Мастер] Укажем вариант заполнения Шаблон и элементы оформления ячейки. В этом шаблоне использованы параметры СистемныйБлок и Мастер. Для ячейки R4C1 в строку Текст введем следующее выражение (листинг 16.43). Листинг 16.43. Шаблон для ячейки макета «R4C1» |склад: [Склад] Укажем вариант заполнения Шаблон и элементы оформления ячейки. В этом шаблоне использован параметр Склад. Теперь зададим границы области макета оформления группировки Шапка. Вызовем окно настройки диапазона границ, и, не закрывая это окно, выделим мышью в правом окне нужную область. Сохраним диапазон, нажав в его окне кнопку выбора. После этого в левом нижнем окне появится список параметров, определенных для макета (рис. 16.289). Профессиональная разработка в системе «1С:Предприятие 8»
Т*1 Документ СборкаКомпьптера: ПечатьСборки Рис. 16.289. Определение границ области макета По умолчанию платформа присвоит выражения для расчета значений параметров. Переопределим выражение для параметра Дата, чтобы дата документа отражалась в привычном формате (листинг 16.44). Листинг 16.44. Выражение для параметра «Дата» Формат(Дата, "ДФ-dd.MM.yy”) | ВНИМАНИЕ! Список параметров, заданных для макета, появится в окне Пара- метры макета только после определения границ диапазона области. Припереопределениидиапазонасписокпараметровформируется заново, и выражения параметров заменяются значениями по умолчанию. Для группировки с именем Табличная часть потребуется создать три макета оформления: макет заголовка группировки - для вывода шапки группировки; макет группировки - для вывода значений группировки; макет группировки - для вывода общих итогов группировки. Добавим макет заголовка группировки для вывода шапки группировки (см. рис. 16.286). В открывшемся диалоге выберем имя группировки Табличная часть и тип макета Заголовок. Зададим элементы оформления ячеек заголовка группировки - шрифт, цвет текста, фона и границы. У всех ячеек в строке Текст укажем произвольный текст шапки, а в строке Заполнение - Текст (рис. 16.290). Определим границы диапазона области заголовка группировки. Параметров для этой области мы не использовали. Том 2
Свойства: Ячейки | Ячейки ▼ Макет: Заполнение [Текст yj ПараметрРасшифроеки |________________________________________] ИслользованиеРасшиФрсвки [Ячейка ▼ ! ► Значения: ► Положение: ▼Оформление: Шрифт | Шрифт диалогов и меню ЦветТекста |l I 255,255,0... х| АвгоОтметкаНезаполненного О ВыделягьОтрицательные О ЦветФона |Д 153,51,0 ... х] ЦветУзора |И Авто ... х] Узор |Нет затеки▼! ГраницаСлева [— Сплотая ▼ ~| ГраницаСверху [— Сплонная ▼ ~| ГраницаСпраеа [— Сплотая ▼ ,7] ГраницаСнизд [— Сплотая ▼ ~| Обвести [ Нетлчии ▼ ЦветРамки[Д 153,51,0 ... х| Рис. 16.290. Свойства ячейки заголовка группировки «Табличная часть» Добавим макет группировки для вывода значений группировки (см. рис. 16.286). В открывшемся диалоге выберем либо имя группи- ровки Табличная часть, либо список полей этой группировки и тип макета Заголовок. Зададим элементы оформления ячеек значений группировки - шрифт, цвет текста, фона и границы. У всех ячеек в строке Заполнение укажем Параметр, а в строке Параметр - имя конкретного параметра (рис. 16.291). Определим границы диапазона области заголовка группировки. Платформа сформирует список параметров для этой области и заполнит значениями по умолчанию. Так как для поля порядкового номера не найдено соответс- твия, зададим его значение, нажав кнопку выбора (рис. 16.292). Добавим макет группировки для вывода итогов по группировке (см. рис. 16.286). В открывшемся диалоге выберем имя группировки Табличная часть и тип макета Общий итог заголовок, который используется для оформления итогов группировки, выводящихся в начале группировки. Зададим элементы оформления ячеек итоговой строки группировки - шрифт, цвет текста, фона и границы. Зададим ячейку Итого с заполнением Текст и ячейку Сумма с заполнением Параметр. Определим границы диапазона области заголовка группировки. Параметр этой области Сумма определится автоматически. 2D11
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Свойства: Ячейки ?! И’Й' х -______________________ | Ячейки__________________________ ▼ Основные: Размещение! екста [Авто Имя |АВС1 Защита @ Гиперссылка Q РежимИзменанияРазмераКолонки [Обычный 'Макет: уПараметр [Порядок Пф^етрРасшиФроёкк^^^^^^^™ ИспользованиеРасшиФрсвки [Ячейка ► Значения: ► Положение: ▼ Оформление: Шрифт [Шрифт диалогов и меню... Х| ЦеегТекста [И 153,51,0 ... х] АэтоОтметкаНезаполненного О ВыделятъОтрицательные Ц ЦветФона |Д Авто_______________________... х| ЦветУзора|И Авто... х| Узор |Нет заливки▼! ГраницаСлева | — Сплошная ▼ ~| ГраницаСверху |— Сплошная______________▼ ...| ГраницаСправа |— Сплошная______________▼ ...| ГраницаСнизу |— Сплошная______________▼ ...| Обвести | Нет лании__________________▼ Ц вег Рамки [15Я51Л)... х| Рис. 16.291. Свойства ячейки группировки «Табличная часть» |Й Документ СборкаКомпьютера: ПечатьСборки Наборыданных Связинаборовд. Вычисляемые по. Ресурсы Параметры | Макеты | Вложенные схемы Настройки а- х Макет Область П»1 Шапка: Заголовок R2R6 Ej Табличная часть: За.,. R12 П»1 Табличная часты За. _ ~ I 2_|<Сборка системных блок з | <Системный блок: "[Системный 4 |<склад: [Склад]> а ;<Пор4<Номенклэтурэ> |<Копк Параметры макета: Имя параметре Вырежение = Порядок = Номенклатура Номенклатура = Количество Количество = Цена Цена = Сумма Сумма 12 ЯЯВЯВОЕЕЕОЯЗОВЕКВВЕ 1S Г 16 I 17_1 16 I 19 I 20 I 21 I 22 I 23—1 Выбор поля | ОК || Отмена | 9 I □ X Рис. 16.292. Установка выражения для параметра «Порядок» Чтобы общие макеты оформления не влияли на макет нашего документа, в режиме настроек на закладке Другие настройки установим макет оформ- ления (стр. 300) Без оформления. Запустим «1С:Предприятие» и откроем документ СборкаКомпыотера. Нажмем кнопку Печать. Документ будет оформлен созданным нами макетом оформления (рис. 16.293). 2D2
® \g, w т... tie.. Й La w 'iH м м* м- ф □ х Сборка системных блоков № 000000003 от 11.01.12 |7 Системный блок: "Компьютер игровой" собрал мастер: Соколов Андрей > склад: Основной | № — Номенклатура — Количество - Цена — Сумма 1 Жесткий диск___________________1 4 000 4 000 2 Материнская плата 1 3 000 3 000 3 Память 1 2 000 2 000 4|сборка компьютера | l| 150о| 1500 Итого: 10600 Руководитель Алексеева Дарья Рис. 16.293. Печать документа «Сборка компьютера» Таким образом, на этом примере мы научились: использовать в схеме компоновки наборы данных - объекты; заполнять объекты встроенного языка данными и осуществлять программную компоновку отчета, используя внешние наборы данных; разрабатывать собственный общий макет оформления; разрабатывать предопределенный индивидуальный макет оформления в схеме компоновки данных. Пример 16 Система компоновки данных позволяет выводить в отчете иерархические данные. ПОДРОБНЕЕ Раздел «Иерархия», стр. 252. Допустим, пользователю нужно видеть информацию в отчете с промежу- точными итогами: по группам номенклатуры, созданным в иерархическом справочнике; по другому признаку иерархии, построенному произвольным способом. Вывод иерархических данных Для решения первой задачи откроем отчет Продажи номенклатуры в режиме 1 (^Предприятие. Выполним команду Все действия ► Изменить вариант... и выделим в структуре отчета группировку Номенклатура. На закладке Группируемые поля для группировки Номенклатура укажем Тип группировки - Иерархия (рис. 16.294). Профессиональная разработка в системе «1С:Предприятие 8»
@ Вариант "Основной" отчета "Прсдажиноменклатуры" • Демонстрационная конфигурация "Си... (ЮПредприягие) X Вариант "Основной" отчета "Продажи номенклатуры" Добавить” । it| । X । ф Ф । £S В се действия” Структура отчета Qg '[gj 'q*J Q) Отчет Qi [Й ЙЙ lift т @™ Контрагент & ®== | 0™ Период Номенклатура fl) Пар... [Й Под,. | ffR Гру... | Qj Поля jg Отб... Д|Д Сор... gfi Уся- QS Лв"- Выбрать Все действия” (55) Новое поле i Новое авто поле 1 X I Q Все действия” Доступные поля +' = Номенклатуре = Период J Количество +' J Стоимость Поле @ = Номенклатура Тип группировки Бее иерархии Только иерархия | Завершить редактирование | Отмена । Все действия » i Рис. 16.294. Настройка иарархической группировки Нажмем Завершить редактирование и сформируем отчет. Информация в отчете представлена с промежуточными итогами по группам спра- вочника Номенклатура - Комплектующие, Услуги, Собранные компьютеры (рис. 16.295). @ - и п... пслришри^ Щ) L4 w @ ' 'fflj ’ м м* м- - □ х Продажи номенклатуры Вариант отчета: [Основной| | Выбрать вариант... | Сформировать 11 0^ Настройка... Все действия” i (?) ® ittl Начало периода 01.12.2011 0 ittl Конец периода 15.12.2011 0 igtl Мелккй заказ Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 Контрагент Количество Стоимость Номенклатура Период____________________________________________________ ООО'Автоматжа* 11 500.00 Собранна конкьютеры 1 10000,0р| Компьютер для дома I 11 10000Д01 11 декабря2О11 г. | 1| 10000,0р| I Услуги 2 1 500.001 Диагностюса компьютера 2 1 500,00 5 декабря 2011 г. [ 1, 1 000,00, 11 декабря 2011 г. ] 1] 500,00) ООО'Система' 10000.00 I Собрание компьютеры 1 10000-00,1 Компьютер для офиса_____I__________11 10000,001 В декабря 2011г ) Г) 10000ДО | ООО'Стиль' Ю000Д0 Комплектующие 1 10 000,001 Монитор Ltt I 1| 16 М6,М| В декабря20117 | Г] 10000ДО| Итого__________________________________ 31 500,00 г " —ГУ Рис. 16.295. Результат отчета с иерархической группировкой по номенклатуре Том 2
Вывод данных в собственной иерархии Теперь рассмотрим пример построения собственной иерархии. Создадим отчет, который будет отражать поступление товаров по складам с иерархией номенклатуры, построенной по собственному принципу (рис. 16.296). Склад Приход Номенклатура Основной 13,000 Товары для сборки 13,000 ОЗУ 5,000 Память 5,000 Основные детали 6,000 Жесткий диск 3,000 Материнская плата 5,000 Розничный 24,000 Товары для сборки 24,000 Мониторы 4,000 Монитор LCD 4,000 Прочие детали 20,000 Веб-камере 10,000 Микрофон 10,000 Итого злооо Рис. 16.296. Трабуемый вид отчата Для этого в справочнике Номенклатура создадим еще один реквизит МойРодитель, указав тип данных СправочникСсылка.Номенклатура (рис. 16.297). Свойства: МойРодитель X х *______________________________________________ ▼Основные: Имя (МойРодитель j Синоним | Мой родитель Q | Комментарий | | ▼ Использование: Использование |Дляэлеменга -I Индексировать | Не индексировать -I Полнотекстовый поиск | Использовать -I ► Представление: Рис. 16.297. Создание поля для построения иарархии В режиме 1 (^Предприятие создадим в справочнике Номенклатура новую группу Моя иерархия для хранения списка элементов собственной иерархии. Внутри этой группы создадим элементы и заполним у них поле Мой родитель (табл. 16.1). Таблица 16.1. Заполнение поля «Мой родитель» у элементов группы «Моя иарархия» справочника «Номенклатура» Наименование Значение попя «Мой родитель» Товары для сборки Мониторы Товары для сборки ОЗУ Товары для сборки Основные детали Товары для сборки Прочие детали Товары для сборки 2И®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Далее откроем группу Комплектующие и заполним у них поле Мой роди- тель (табл. 16.2). Таблица 16.2. Заполнение поля «Мой родитель» у элементов группы «Комплектующие» справочника «Номенклатура» Наименование Значение поля «Мой родитель» Жесткий диск Основные детали Материнская плата Основные детали Память ОЗУ Монитор LCD Мониторы Веб-камера Прочие детали Микрофон Прочие детали Таким образом, мы подготовили данные для построения новой иерархии. Конечно, можно было организовать такую иерархию с помощью групп и получить отчет, используя стандартную иерархию справочника, но мы хотим показать пример, который можно использовать для любого, в том числе неиерархического, объекта данных. Теперь перейдем к созданию самого отчета. Добавим новый объект конфи- гурации Отчет и назовем его ПоступлениеТоваров. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Назовем его Приход. Откроем конструктор запроса. В качестве источника данных для запроса выберем виртуальную таблицу регистра накопления ОстаткиНоменклатуры.Обороты. В список полей перенесем поля: Склад, Номенклатура, КоличествоПриход. На закладке Объединения/Псевдонимы изменим имя у поля Количест- воПриход на Приход. Из этого запроса мы будем получать нужные нам данные о поступлении товаров. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Чтобы выполнить иерархическую группировку, процессору компоновки данных требуется информация об источнике данных для построения иерархии. Поэтому нам необходимо создать набор данных, содержащий информацию о текущем элементе справочника Номенклатура и его роди- теле, с последующим указанием связи набора к самому себе. Выделив корневой элемент наборов данных, добавим набор данных - запрос. Назовем его Иерархия. Откроем конструктор запроса. В качестве источ- ника данных для запроса выберем объектную таблицу справочника Номенклатура. В список полей перенесем поля: Ссылка, МойРодитель. 2М
Перейдем на закладку Условия, раскроем таблицу Номенклатура и перетащим мышью поле Ссылка в список условий. В предложенном по умолчанию условии выберем вид сравнения - В (рис. 16.298). И Конструктор запроса □ X Рис. 16.298. Создание условия запроса На закладке Объединения/Псевдонимы изменим имя у поля Ссылка на Номенклатура. Это важно, так как мы будем использовать это поле для связи наборов данных, и оно должно в обоих наборах иметь одина- ковый путь (рис. 16.299). ffl Конструктор запроса " □ X Таблицыи... Группировка Условия Дополните... | Объединен... | Порядок Компоновк... Характера.. Пакетэапр... (2) .... I v О X । V Q Имя Беэду... I Имя ПОЛЯ Запрос 1 Задос! □ = Q9S93SEE1 = МойРодитель “ Номенклагура.Ссылка = НоменклагураМойРодитель | Запрос | | < Назад | | Далее >| | ОК | | Отмена | | Справка | Рис. 16.299. Изменение псевдонима поля в запроса Нажмем ОК и вернемся в конструктор схемы компоновки данных. Текст запроса набора Иерархия примет вид (листинг 16.45). Листинг 16.45. Текст запроса набора «Иерархия» ВЫБРАТЬ Номенкпатура.Ссылка КАК Номенклатура, Номенкпатура.МойРодитель ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура-Ссылка В(&Ссылка) На закладке Связи наборов данных необходимо добавить связь: между наборами данных Приход и Иерархия по полю Номенклатура; Профессиональная разработка в системе «1С:Предприятие 8»
для набора данных Иерархия нужно установить связь к самому себе от поля МойРодитель к полю Номенклатура. Это условие позволит последовательно получить всех родителей элемента. В настройках связи зададим параметр Ссылка, который был определен для запроса набора данных Иерархия. В этот параметр будет помещено значение связи источника (рис. 16.300). Т»| Отчет ПаступлониеТонеров: ОсновнаяСхемаКомпоновкиДанныа □ X Наборы данных | Связи набороед.. | Вычисляемые по... Ресурсы Параметры Макеты Вложенные схемы Настройки йВх Приемник связи Выражение источник Выражение приемник Параметр I Список пар... Условна ое... Начальное... 0.. Иерархия Номенклатура Номенклатура Ссылка j @ @ Иерархия МойРодитель Номенклатура Ссылка @ @ Рис. 16.300. Установка связей наборов данных ВНИМАНИЕ! Поле для связи наборов данных обязательно должно иметь одинаковое имя в обоих наборах, иначе наименования родителей в отчете будут пустыми! На закладке Ресурсы определим ресурсы отчета (стр. 290), рис. 16.301. в Номенклатура в Прикса в Склад £] Отчет Поступление!оваров: ОсновнаяСхемаКомпоновкиЛанных □ X Наборы данных Связи наборов д. Вычисляемые по... | Ресурсы | Параметры Макеты Вложенные схемы Настройки Поле Выражение Рассчитывать по... |о ЩйЦИЬЙ 1 СуммаЩриюй) Рис. 16.301. Окно ресурсов отчета На закладке Параметры (стр. 292) мы видим параметры компоновки данных, созданные платформой. Для параметра Ссылка по умолчанию установлена недоступность для пользователя. Мы будем использовать стандартный период для указания периода отчета. Добавим параметр с именем Период типа СтандартныйПериод, а для параметров НачалоПе- риода и КонецПериода укажем Выражение для расчета и запретим их редактирование пользователем (листинг 16.46). Листинг 16.46. Выражение для расчата пара мэтров «НачалоПериода» и «КонецПериода» &Период.ДатаНачала I &Период.ДатаОкончания | В результате параметры компоновки данных примут вид (рис. 16.302). Том 2
Й Отчет Поступление!оваров: ОсновнаяСхомаКомпеновккДанных □ X Наборы данных Связинабороэд... Вычисляемые по... Ресурсы | Параметры | Макеты Вложенные схемы Настройки Имя Заголовок Тип Д.. Д... Значение Выражение Пар... В... 0...'3... Начало периода Дата О /Й1ериод.ДагаНачала О КонеиПериода Коней периода Дата О \|Л1ериод.ДагаОкончания J @ \17|/ О Ссылка__________Ссылка_________СправочникСсылка.Номенклагура □ Справочник.... @ ® О Период Период СгатартмыйПериод ® О □ |> Рис. 16.302. Установка параметров отчета Определим структуру отчета. На закладке Настройки выделим корневой элемент Отчет и добавим в него группировку по полю Склад. Затем добавим вложенную в нее группировку Номенклатура. При выборе поля группировки укажем тип группировки Иерархия. На закладке Выбранные поля перенесем из списка доступных полей поле Приход (рис. 16.303). Т*1 Отчет ПоступлениеТоверов: ОсноонаяСхемаКомпоновкиДвяныя _ □ X Рис. 16.303. Определение полей и группировок отчета На закладке Параметры установим значение параметра Период - Прошлый месяц и включим этот параметр в состав быстрых пользовательских настроек (рис. 16.304). Параметры | Выбранные... Отбор Сортировка Условное... Пользоваг... Другиенас... О Отображать недоступные параметры (устанавливать значения недоступных параметров не рекомендуется) ' Параметр Значение 9 Дета начале Дета окончания а ® Период 01.12.2011 31.12.2011 э Рис. 16.304. Настройка периода отчета Заметим, что реальные значения дат стандартного периода определяются во время исполнения отчета. Поэтому период отчета будет автоматически меняться в зависимости от фактической даты запуска отчета. На закладке Другие настройки установим макет оформления (стр. 300) отчета Радуга и заголовок отчета Поступление товаров. Выполним отчет (рис. 16.305). 2Ж
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 ® -ф w пе| L4 ' w Ё1 U jil Поступление товаров Вариант отчета: [Основной | | Выбрать вариант... | | > Сформировать 11 Оц Настройка.. Все действия » । (?) □ J ДЙ Период Прошлый месяц Поступление товаров Склад_________________ Номенклатура Основной______________ Товары для сборки___ ОЗУ_______________ ______Память__________ Основные детали ______Жесткий диск ______материнская плата Ровничный_____________ Товары для сборки Мониторы__________ ______Монитор LCD_____ Прочие детали_____ ______Веб-камера______ ______микрофон________ Июю___ Приход 13,000 13,000 5,000 5,000 8,000 3,000 5,000 24,000 24,000 4,000 4,000 20,000 10,000 10,000 37,000 Рис. 16.305. Результат отчета Мы видим, что данные в отчете выводятся с заданной нами новой иерар- хией, кроме того, отчет оформлен созданным нами в предыдущем примере макетом оформления. Стандартная расшифровка полей отчета Продемонстрируем теперь на этом же примере работу с расшифровкой (стр. 260). Предположим, мы хотим иметь возможность открывать из отчета первичные документы по поступлению товаров. Для этого нам нужно детализировать записи в отчете по полю Регистратор, то есть доку- менту, который произвел движения о поступлении товаров в регистре накопления ОстаткиНоменклатуры. Откроем схему компоновки данных на закладке Наборы данных и вызовем конструктор запроса набора данных Приход. Вызовем диалог параметров виртуальной таблицы ОстаткиНоменклатуры.Обороты. Для этого в списке таблицы нужно нажать кнопку Параметры виртуальной таблицы. В открывшемся окне параметров зададим значение параметра Периодичность - Регистратор (рис. 16.306). Параметры виртуальной таблицы X НачалоПериода КонацПериода Периодичность Условие Рис. 16.306. Установка параметра «Периодичность» 24®
В список полей запроса добавим поле Регистратор. Нажмем ОК и вернемся в конструктор схемы компоновки данных. Поле Регистратор появится в списке доступных полей набора данных Приход. Теперь добавим его в структуру отчета. На закладке Настройки выделим группировку Номен- клатура (Иерархия) и добавим вложенную в нее группировку Детальные записи без указания группировочного поля. На закладке Выбранные поля перенесем из списка доступных полей поле Регистратор (рис. 16.307). Й Отчет ПоступлениеТонаров: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.307. Добавление группировки «Детальные записи» и поля «Рагистратор» в отчет @ Посгу1лететоварое-. (ЮПредприягие) Д [Д IS1 '%! 'ail М М+ М- □ X Поступление товаров Вариант отчета: | Основной | | Выбрать вариант... | | О Сформировать 11 Настройка.. Все действия * i (?) Прошлый месят Поступление товаров Параметры: Период: 01.12.2011 - 31.12.2011 Склад_______________________________________________ Номенклатура________________________________________ Регистратор Основной____________________________________________ Товары для сборки_________________________________ ОЗУ_____________________________________________ Память_______________________________________ Приходная накладная 000000002 от 05.12.2011 15:53:17 Основные детали_________________________________ Жесткий диск_________________________________ Приходная накладная 000000001 от 05.12.2011 1222:39 ^^Латецинскащ1лат^^^^^^^^^^^^^^^^^^^^в Приходная накладная 000000002 от 05.12201115:53:17 Расшифровать... Открыть 'Регистратор = Приходная накладная ОООООО002 от 0512.2011 15:5317" Отфильтровать Упорядочить Сгруппировать Оформить Копировать Рис. 16.308. Результат отчета Приход 13.000 13,000 5,000 5.000 5,000 8,000 3,000 Э.ООО 5,000 5 ДОО Г Профессиональная разработка в системе «1С:Предприятие 8»
Выполним отчет. Записи в нем будут детализированы по документу- регистратору. Двойным щелчком мыши на этом поле мы можем открыть соответствующий документ о поступлении товаров, а правой кнопкой мыши вызвать выпадающее меню расшифровки. Двойным щелчком на поле ресурса (колонка Приход) можно вызвать диалог выбора поля для расшифровки (рис. 16.308). Таким образом, если мы хотим расшифровывать информацию по какому-либо детальному полю, мы должны добавить его в список доступных полей отчета. Переопределение поля для расшифровки В некоторых ситуациях необходимо, чтобы при расшифровке, выполня- емой пользователем над одним полем, расшифровка выполнялась над другим полем. Рассмотрим эту возможность на примере отчета Сборка системных блоков (стр. 156). Допустим, необходимо, чтобы при расшиф- ровке по полю Номер открывалось значение документа-регистратора. Для того чтобы переопределить расшифровку для поля Номер, создадим для этого поля макет. Для этого откроем схему компоновки данных отчета, перейдем на закладку Макеты и создадим макет поля Номер (рис. 16.309). Рис. 16.309. Создание макета поля «Номер» После этого в добавленной строке, в поле ввода колонки Область нажмем кнопку выбора. При этом табличный документ с макетом перейдет в режим выбора области. Выберем ячейку, в которой будем располагать макет поля, и нажмем клавишу Enter. Колонка Область при этом запол- нится адресом выбранной области. В свойствах ячейки области укажем заполнение ячейки Параметр, имя параметра Номер и укажем имя пара- метра расшифровки Расшифровка (рис. 16.310). Том 2
X Свойства: Ячейки нН'й' х - Вчейки ▼ 1 ▼Основные: Размещение! екста |Аето ▼1 Имя |R1C1 1 Защита 0 Гиперссыма □ РежимИэмеиетыяРаэмераКолонки | Обычный ▼1 ▼Макет: /Заполнение (Параметр 1 Параметр (Номер Испоя>зоеашеРасимФроеки | Ячейка ’ Значения: СшержигЗначение Т ипЗначения □ 3 лементУ правления ~ Формат | Q| ФормагРепактирования | Q| Маска [ Q| ► Полононие: к Оформление: Рис. 16.310. Свойства ячейки поля макета В выражении параметра Расшифровка введем выражение для поля Регис- тратор и зададим для поля основное действие расшифровки - Открыть значение (рис. 16.311). Д Отчет СборкаСистемныхБ локов: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборыдан... Связи набор. Вычисляем...Ресурсы Параметры | Макеты | Вложенные.. Настройки Рис. 16.311. Свойства параметра расшифровки Выполним отчет. При двойном щелчке мыши на детальных записях отчета в колонке Номер будет сразу же открыт документ-регистратор Сборка компьютера с соответствующим номером (рис. 16.312). При этом для всех полей отчета выполняются стандартные действия расшифровки. Двойным щелчком на поле ресурса вызывается диалог выбора поля для расшифровки, двойным щелчком на поле не ресурса открывается значение поля, а также при нажатии правой кнопки мыши вызывается выпадающее меню расшифровки, которое состоит из возможных действий над расшифровкой: Расшифровать, Открыть, Отфильтровать, Упорядочить, Сгруппировать, Оформить. Действие Расшифровать недо- ступно, если данный элемент расшифровки - Детальные записи, кроме случая, когда он содержит поля-ресурсы.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 (jc) •» Сборка комтмтео» 000000001 or 0... (1С:Прешфиягие) Го1 ~| '?! - _ □ X tic) ,3. Сборка системьк блоко. (1СПредлриятие| Сборка системных блоков Вариант отчета Основной______________________________ р Сформировать Uо Настройка.. пТ1 Началопериода iTTl Конецпериода 15.01.< nil Сорпфовка Двта.1 Сборка системных блоков Сборка компьютера ОООООООО I от 06.12.2011 19:33:40 Провоет и закрыть цп! _ * Провести Печать Все действия ’ Номер: 000000001 Дата МНЙЩИОИГ а Склш Основной... Q Мастер. Соколов Андрей...Q П реакция Комтютер для офиса______ ___...Q ^Добавить X V О Все действия' N Номенклатура Количество Цена Срлма > Я ЖеспиДдиек 1.00 3500.00 3500.00 2 Материская плата 1.00 2500.00 2500.00 3 Память 1.00 1500.00 1500.00 4 Сборка кеммотера 1.00 1000.00 1000.00 Переметрьс Началопериода:О1.122СП1 Конец периодо: 1501.2012 Стоимость Дата 8 500ДО • 5О0Д0 8500,00 06.122011 9 ОМ ДО •«мда 9000,00 11.122011 10 600Д0 ««оме _______________________________________________10 000 ДО 11Д12012 Итого 3 28 000,00 Системный блок Количество Мастер Компьютер для офисе Соковое Андрей Компьютер для дема Няьин Сергей Компьютер игровой Соковое Андрей Номер __________ |66666666i ' | Ра:иьхрэсэть Открыть "Регистратор «Сборка компьютера 000000001 от 00122011 193340" ОтФшътроевтъ Упорядочить Сгрупфовать Оформить Кспфовать Свойства Рис. 16.312. Результат отчета Изменение действий расшифровки Однако разработчик может реализовать и свой, нестандартный, вариант расшифровки. Продемонстрируем этот вариант на примере отчета Сборка системных блоков. Откроем форму отчета. Создадим обработчик события ОбработкаДополнительнойРасшифровки для поля табличного документа Результат (рис. 16.313). Свойства: Поле y|5]Ti' х - ▼ Основные: Заголовок I Q| I_______________________________г Вид [ П оде табличгого документа_____▼ ! П утьКДажьм [Результат______________________... | ПоложениеЗаг оловка [Нет I Видимость 0 Пользовательская вишфюсть Открыть Достдоюсть 0 ТолькоПросмотр О ПролускагьПрмВвоае |Аето АктиеиэкроватьПоУмолчашю 0 > Использование: ► Оформоннме: к Расположение: ▼События: ПрмИзменении Г Выбор [" ОбработкаРасимФровки Г 0 бработкаДополнительнойРасшифровки Г ПриИзмененииСодержимогоОбласти | ▼ Q] '41 33- Рис. 16.313. Обработчик события «ОбработкаДополнительнойРасшифровки» для поля «Результат» 2D®
В процедуре этого обработчика и будет формироваться контекстное меню расшифровки отчета и определяться поведение отчета при возникновении события ОбработкаДополнительнойРасшифровки, когда пользователь нажатием правой кнопки мыши на ячейке результата отчета вызывает меню расшифровки. Заполним его следующим образом (листинг 16.47). Листинг 16.47. Процедура обработчика события «ОбработкаДополнительнойРасшифровки» для поля «Результат» &НаКлиенте Процедура РезупьтатОбработкаДопопнитепьнойРасшифровки(Эпемент, Расшифровка, СтандартнаяОбработка) Перем ВыбранноеДействие; Перем ПараметрыВыбранногоДействия; СтандартнаяОбработка = Ложь; ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет)); ДоступныеДействия = Новый Массив(); ДоступныеДействияДобавитъ( ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытъЗначение); ДоступныеДействия .Добавитъ( ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтроватъ); ДоступныеДействия .Добавитъ( ДействиеОбработкиРасшифровкиКомпоновкиДанных.Расшифровать); ДополнительныеДействия = Новый СписокЗначений; ДополнительныеДействия.ДобавитьСДействие 1"); ДополнительныеДействия.Добавить("Действие2"); ДополнительныеДействия.Добавить(”ДействиеЗ"); II Осуществим выбор действия расшифровки пользователем. ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыбранноеДействие, ПараметрыВыбранногоДействия, ДоступныеДействия, ДополнительныеДействия); Если ПараметрыВыбранногоДействия <> Неопределено Тогда Если ВыбранноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда ОткрытьЗначение(ПараметрыВыбранногоДействия); Иначе ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("СформироватъПриОткрытаи", Истина); ПараметрыФормы.Вставить("Расшифровка", Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных( ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия)); ОткрытьФорму("Отчет.СборкаСистемныхБпоков.Форма", ПараметрыФормы,, Истина); КонецЕсли; Иначе Сообщить(ВыбранноеДействие); КонецЕсли; КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
В процедуре обработчика мы сначала отменяем стандартную обработку расшифровки. Затем создаем новый обработчик расшифровки - объект ОбработкаРасшифровкиКомпоновкиДанных и инициализируем его данными расшифровки отчета (реквизит формы ДанныеРасшифровки) и источником доступных настроек для отчета. Затем задаем список доступных действий расшифровки - ОткрытьЗна- чение, Отфильтровать, Расшифровать, а также задаем список дополни- тельных действий расшифровки, например, «Действие 1», «Действие 2», «Действие 3». После этого мы вызываем интерактивный выбор действия расшифровки, используя метод ВыбратьДействие() объекта ОбработкаРасшифров- ки КомпоновкиДанных. Мы передаем в него идентификатор расшифровки (параметр Расшифровка обработчика события ОбработкаРасшифровки), список доступных действий (ДоступныеДействия) и список дополни- тельных действий (ДополнительныеДействия) меню расшифровки. После выбора пользователем действия расшифровки мы получаем значение выбранного действия во втором параметре ВыбранноеДействие. Если выбрано действие Открыть, то третий параметр ПараметрыВыбран- ногоДействия содержит значение, которое нужно открыть. Если выбрано действие Расшифровать, Отфильтровать, Упорядочить, Сгруппировать, Офор- мить, то параметр ПараметрыВыбранногоДействия содержит настройки, применяемые к отчету. Если выбрано дополнительное действие, то пара- метр не заполняется. В зависимости от выбранного действия (ВыбранноеДействие) мы либо открываем выбранное значение, либо формируем новую форму отчета с параметрами СформироватьПриОткрытии и Расшифровка. Параметр СформироватьПриОткрытии, установленный в значение Истина, обеспе- чивает формирование отчета сразу при открытии формы. В параметре Расшифровка мы описываем расшифровку, которую нужно применить к открываемому отчету, и передаем в конструктор объекта ОписаниеОб- работкиРасшифровкиКомпоновкиДанных данные расшифровки (реквизит формы ДанныеРасшифровки), идентификатор расшифровки (параметр Расшифровка обработчика события ОбработкаРасшифровки) и новые настройки, применяемые к отчету (ПараметрыВыбранногоДействия). Выполним отчет. Нажав правую кнопку мыши на поле отчета, мы можем вызвать меню собственной расшифровки и выполнить перечисленные в нем действия расшифровки (рис. 16.314). ВНИМАНИЕ! Переопределять действия по расшифровке отчета, вызываемой при нажатии правой кнопки мыши, нужно в обработчике события ОбработкаДополнительнойРасшифровки. А в обработчике события ОбработкаРасшифровки нужно переопределять действия, происхо- дящие при двойном щелчке мыши на поле отчета. Том 2
Рис. 16.314. Результат отчета Таким образом, на этом примере мы научились: выводить в отчете данные, отражающие структуру иерархического справочника; задавать собственную иерархию по произвольному реквизиту и отоб- ражать ее в отчете; выводить данные с детализацией по первичному документу-регистра- тору; переопределять стандартную расшифровку для поля; создавать собственные обработчики события расшифровки отчета. Пример 17 На этом примере мы рассмотрим использование в отчетах языка выра- жений системы компоновки данных. Разработаем отчет о продажах номенклатуры и покажем на нем применение языка выражений для расчета различных показателей продаж. Создадим новый объект конфигурации Отчет и назовем его РасчетПоказа- телейПродаж. Откроем конструктор схемы компоновки данных и добавим новый набор данных - запрос. Источником данных для запроса будет служить виртуальная таблица регистра накопления Продажи.Обороты. Не будем пользоваться конструктором запроса, а сразу внесем в поле Запрос следующий текст (листинг 16.48).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Листинг 16.48. Текст запроса ВЫБРАТЬ ПродажиОборсты.Период КАК Период, ПродажиОбороты.Номенклатура, ПродажиОбороты.Контрагент, ПродажиОбороты.СтоимостьОборот КАК Стоимость ИЗ РегистрНакопления.Продажи.Обороты(,, День,) КАК ПродажиОбороты В набор доступных полей отчета добавятся поля: Период, Номенклатура, Контрагент, Стоимость. На закладке Настройки определим следующую структуру отчета - отчет будет содержать группировку по полю Контрагент с вложенной группи- ровкой Номенклатура, содержащей группировку Период (рис. 16.315). — cti •? @™ Контрагент - Номенклатура ®™ Период Рис. 16.315. Структура отчета Язык выражений Для расчета различных показателей продаж будем использовать вычис- ляемые поля (стр. 283), то есть поля, которых изначально нет в наборе данных отчета, но которые вычисляются на основе доступных полей отчета. Система компоновки данных предоставляет возможность вычисления выражений для родительских группировок. Например, с помощью функции ВычислитьВыражение() можно вычислить для каждой вложенной группировки (Номенклатура, Период) процент продаж по родительской группировке (Контрагент). Для реализации этой возможности перейдем на закладку Вычисляемые поля и добавим вычисляемое поле ПроцентПродажПоКонтрагенту. Выра- жение для его расчета мы здесь определять не будем, а зададим его на закладке Ресурсы, так как у нас в отчете нет детальных записей (рис. 16.316). В колонке Оформление зададим формат поля, чтобы ограни- чить число выводимых десятичных знаков. Вызовем диалог Формат поля и в строку Формат введем выражение (листинг 16.49). Листинг 16.49. Формат поля «ПроцентПродажПоКонтрагенту» . ЧДЦ=2 | 220
Т*1 Отчет РасчетПоказателейПродаж: ОсновнаяСхемаКомпоновкмДа! Наборыданных Связи наборов дан... | В ычисляемые поля | Ресурсы Параметры Макеты Вложенные схемы Настройки И й X Путь к данным Вьфажемие Заголовок Ограничение до... Выражение Выражения Тип Доступные ' Оформление _ .. <- .. 1 тоадстае... упорядоч... значения значения _ П... У... Г... У... > Параметр... Процент продаж □ □ □ □ по контрагенту >ормаг Рис. 16.316. Создание вычисляемого поля Перейдем на закладку Ресурсы и определим доступные поля ресурсов отчета (стр. 290), рис. 16.317. В колонку Выражение для ресурса ПроцентПродажПоКонтрагенту введем следующий текст (листинг 16.50). Листинг 16.50. Выражение для расчета ресурса на основе вычисляемого поля «ПроцентПродажПоКонтрагенту» | Сумма(Стоимость) *100/ ВычислитъВыражение('Сумма(Стоимость)", "Контрагент”) Т*1 Отчет РасчетПоказателейПродаж: ОсновнаяСхемаКомпоновкиДанных □ X Наборыданных Связи наборо... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные с... Настрсйш Доступные поля 1_>_1 Поле Вьраженна Рассчи... = Стоимость Суьма(Сгоимость) = Номенклатура в Период FH ПроценгПродажПоКонграгенгу = Стоимость mg Fh ПроценгПродажПоКонграгенгу Рис. 16.317. Определение ресурсов отчета Функция ВычислитьВыражение() вычисляет выражение в контексте некоторой группировки. В качестве первых трех параметров в нее пере- дается выражение для расчета (например, "Сумма(Стоимость)"), имя группировки, в которой вычисляется выражение (например, "Контрагент"), и область вычисления - "Общийитог", имя группировки или "Иерархия” (в нашем случае третий параметр опущен). В других параметрах, передаваемых в функцию, имеется возможность указать, с какой записи начинать и какой записью заканчивать массив записей для расчета (возможно указание первой, последней, следующей, предыдущей, текущей записи). ПОДРОБНЕЕ О функциях языка выражений системы компоновки данных можно прочитать в книге «1С:Предприятие 8.2. Руководство разработчика», раздел 10.3.7.2.11. В настройках отчета на закладке Выбранные поля перенесем из списка доступных полей поля Стоимость и ПроцентПродажПоКонтрагенту. Профессиональная разработка в системе «1С:Предприятие 8»
На закладке Другие настройки установим макет оформления (стр. 300) отчета - Арктика. Запустим и сформируем отчет в режиме 1С:Предприятие (рис. 16.318). @ С, V? р- ПСЛредлриятие) ifftl tgj |4 W Й ' «У 'ail М М* М- - Расчет показателей продаж Вариант отчета: | Основной_____ | > Сформировать 11 Настройка... | | Выбрать вариант,. | Вседействия* । (?) Контрагент Номенклатура Период ООО "Автоматико" Диагностика компьютера 5декабрй2011 г._____ ] Стоимость Процент продаж по контрагенту 24 500.08 16ВОД0 1 000.00 108,00 М2 4,08 11 декабря 2011 г. 500ДО 2Д4 Компьютер для дома 10 090Д0 48Д2 11 декабря 2011 г. 10 000до 40,82 Компьютер атровой 13 0В0Д0 ЮДв 12 янверя2О12 г. 13 000до 53 Д8 ООО "Атлант" 9 000,00 100,00 Восстаноеленно данных 5 0В0Д0 55Д6 15 янверя2О12 г. 5 000,00 SSfiB ЭОВОДО ЗЗДЗ 13 янверя2О12 г. 3 000до 33,33 Сопутствуюирю услуги ЮВОД0 11,11 13 янверя2О12 г. 1 000,00 11,11 ООО "Система" 10 000,00 1В0ДЮ Компьютер дм офиса Ю0ВОД0 ювдм 9декебря2011 г. 10 000до 100 до ООО "Стондарт" 4 500,00 100,00 Диагностика компьютера 5ЮД0 11,11 14 янверя2О12 г. 500,00 11,11 эоводо ВМ7 14 янверя2О12 г. 3 000до 68,67 Сопутствутеирю услуги ЮВОД0 22Д2 14 янверя2012 г. 1 000,00 22,22 ООО "Стиль" 20 500,00 1В0ДЮ Веб-манора 46ВОДО 15,79 12 янверя2О12 г. 4 500ДО 15,79 Микрофон 2 0ВОД0 7Д2 12 янверя2012 г. 2 000ДО 7Д2 Монитор LCB 22 0В0Д0 77,19 6декебря2011 г. 10 000до 35,09 12 янверя2О12 г. 12 000ДО 42,11 Итого 76 500,00 100,001 Рис. 16.318. Результат отчета В колонке Процент продаж по контрагенту мы видим процентное отношение стоимости продаж по группировке Период и Номенклатура к стоимости продаж по группировке Контрагент. Теперь продемонстрируем обратную возможность. Система компо- новки данных предоставляет возможность вычисления выражений для вложенных группировок. Например, с помощью функции Вычис- литьВыражениеСГруппировкойМассив() для каждого контрагента можно вычислить максимальную сумму продаж купленного им товара. Для реализации этой возможности на закладке Вычисляемые поля добавим вычисляемое поле МаксимальнаяСуммаПродажТовара. На закладке Ресурсы добавим вычисляемое поле в список ресурсов отчета. В колонку Выражение для ресурса МаксимальнаяСуммаПродажТо- вара введем следующий текст (листинг 16.51). Том 2
Листинг 16.51. Выражение для расчета ресурса на основе вычисляемого поля «МаксимальнаяСуммаПродажТовара» | Максимум(ВычислитьВыражениеСГ руппировкойМассив("Сумма(Стоимость)", "Номенклатура")) Функция ВычислитьВыражениеСГруппировкойМассив() возвращает массив, каждый элемент которого содержит результат вычисления выражения для группировки по указанному полю. ПОДРОБНЕЕ О функциях языка выражений системы компоновки данных можно прочитать в книге «1С:Предприятие 8.2. Руководство разработчика», раздел 10.3.7.2. В нашем случае для родительской группировки Контрагент возвраща- ется массив, содержащий стоимость продаж по вложенной группировке Номенклатура. Затем из этого массива берется максимальный элемент и отображается в вычисляемом поле. Добавим поле МаксимальнаяСуммаПродажТовара в список полей отчета. Выполним отчет (рис. 16.319). ® vj, W Расчет показателей ододаж... (ЮПреогрияпю) i«nl lie) 1Д, VJ IS1 fill Ji| M M+ M- - □ X Расчет показателей продаж Вариекг отчета | Основной| | Выбрать вариант... | | 1> Сформировать || Настрсйса._ Все действия’ । (т) т Lt !' ! Lt Р Т Т Lt t t Контрагент I Стоимость Процент продаж Максимальная Номенклатура по контрагенту сумма продаж Период товара ООО "Автоматико" 24 506,08 100 ДЮ 13 000 Диагностика компьютера 1600Д0 М2 1609 5 декабря 2011 г. 1 000,00 4Д8 1 000 11 декабря 2011 г. 500,00 2,04 500 Компьютер для дома ЮОООДО 40Д2 10 900 11 декабря 2011 г. 10 000,00 40,82 10000 Компьютер играной 13 ВМД0 БЗД6 13 900 12 янееря2О12 г. 13 000,00 53.08 13000 ООО “Атлант" 9 BBDJJD 100 ДЮ 5 000 5 000,00 идв 5 000 1S янееря2О12 г. 5 000,00 55 Дб 5000 зооодо 33^3 3 000 13 янееря2О12 г. 3 000,00 1 ооодо 33,33 11,11 3 000 1000 13 янееря2О12 г. 1 000,00 11,11 1 000 ООО “Система" 10 ооодю 100 ДЮ 10 000 Компьютер для офиса 1в вводе 168,00 10 000 9 декабря 2011 г. 10 000,00 100 до 10 000 ООО "Стондарт" 4 500,00 100 дю 3 000 Диагностика компьютера 5ЮД0 11,11 500 14 января 2012 г. 500,00 11,11 500 ЗОООДО 3 000,00 6М7 68,67’ 3 000 3 000 14 января 2012 г. 1 вводе 1 000.00 22Д2 7222 1000 1 000 14 января 2012 г. ООО "Стиль” 28 500,00 100 ДЮ 22 000 Веб-камера 45ЮД0 15,79 4600 12 января 2012 г. 4 500ДО 16,79 4 500 Микрофон 2 000ДО 7Д2 2 000 12 января 2012 г. 2 000,00 7.02 2 000 Монитор LCD 22 ВООДО 77,19 22 000 6 декабря 2011 г. 10 000,00 35,09 10 000 12 янверя2012 г. 12000ДО 42,11 12000 Итоге 76 500,08 100 ДЮ 22 000 Рис. 16.319. Результат отчета
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Мы видим, что в колонке Максимальная сумма продаж товара для каждого контрагента отражена максимальная сумма продаж купленного им товара. Рассмотрим еще пример. В некоторых аналитических отчетах требу- ется сравнить объем продаж каждого товара с объемом продаж заданного товара. Создадим вычисляемое поле, в котором для каждого товара будет выведено процентное отношение его суммы продаж к сумме продаж исследуемого товара. Для демонстрации этой возможности создадим новый вариант отчета РасчетПоказателейПродаж. Для этого на закладке Настройки схемы компо- новки данных нажмем кнопку Добавить слева над списком вариантов отчета. Зададим имя варианта и его представление как СписокПродаж и добавим в структуру нового варианта отчета одну группировку по полю Номенклатура. На закладке Вычисляемые поля добавим вычисляемое поле ПроцентПро- дажОтИсследуемогоТовара. В колонке Оформление зададим формат поля, чтобы ограничить число выводимых десятичных знаков. Вызовем диалог Формат поля и в строку Формат введем выражение (листинг 16.52). Листинг 16.52. Формат поля «ПроцентПродажОтИсследуемогоТовара» ЧДЦ=2 | На закладке Ресурсы добавим вычисляемое поле в список ресурсов отчета. В колонку Выражение для ресурса ПроцентПродажОтИсследуемогоТовара введем следующий текст (листинг 16.53). Листинг 16.53. Выражение для расчата ресурса на основе вычисляемого поля « ПроцентПродажОтИсследуемогоТовара» Сумма(Стоимостъ) * 100 / ВычислитьВыражение("Сумма(Выбор Когда Номенклатура = I &ИсспедуемыйТовар Тогда Стоимость Конец)",, "ОбщийИтог") | На закладке Параметры (стр. 292) добавим параметр ИсследуемыйТовар и укажем тип значения параметра СправочникСсылка.Номенклатура (рис. 16.320). Добавим поля Стоимость и ПроцентПродажОтИсследуемогоТовара в список полей отчета. Для того чтобы пользователь мог вводить значение иссле- дуемого товара, добавим параметр Исследуемый товар в состав быстрых пользовательских настроек. Запустим отчет на исполнение, выберем вариант отчета Список продаж, введем значение параметра Исследуемый товар и получим следующий результат (рис. 16.321). Мы видим, что в колонке Процент продаж от исследуемого товара выво- дится процентное отношение суммы продаж по каждому товару к сумме продаж товара, заданного в параметре Исследуемый товар. 222
Отчет РасчетПоказетелейПродаж: 0сновнаяСхемаКомпоновкиДанных Наборыданиых Связи наборо... Вычисляемые... Ресурсы | Параметры | Макеты Вложенные С- Настроен ф G& X О С Имя Заголовок Тип НачалоПериода Началопериода Дата КонецПериода Конец периода Дата ИсследуемыйТовар Исследуемый товар ж Редактирование типа данных X О Составной тип данных Q1B3 Число О*ЬС Строка □&| Дата Булево О$ Храни1МцеЗначения □ ID ЧникальньйИдентиФикатор т 050 СправочекСсыжа 3... Исполь. □ Авто О Авто □ Авто Номенклатура | □2В Контрагенты □ЙН СКЛМ □5D Сотрудники □5D ЗначенияХарактеристик 050 Филиалы | ОК || Отмена | Рис. 16.320. Добавление параметра отчета ® >3 W ' Р- (1СЛредпри.Д Lq W Й '^1 '311 М М* М- - □ X Расчет показателей продаж Вариант отчета: | Список продаж| | Выбрать вариант... | | > Сформировать 11 03 Настройка... Вседейстеия । <?) { Параметры: Исследуемый товар: Монитор LCD Номенклатура Стоимость Процент продаж ст исследуемого товара Веб-камера____________________4 500,00_______________20,45 Восстановление данных_________5 000,00_______________22,73 Диамостика компьютера_________2 000,00_________________9Д9 Компьютер для дома____________10 000ДО_______________45,45 Компьютер для офиса___________10 000ДО_______________45,45 Компьютер игровой_____________13 000ДО________________59Д9 Мжрофон_________________________2000,00_________________ВДВ Монитор LCD__________________22 000 ДО______________100,00 Ремонт компьютера В ООО ДО 27,27 Сопутствующие услуги 2 000 ДО ВДВ Итого 76 500,00 347,73 Рис. 16.321. Результат отчета Теперь на этом же варианте отчета продемонстрируем возможность вывода в ячейке отчета списковых данных. Допустим, рядом со стоимостью продаж по каждому товару требуется вывести список контрагентов, которые покупали этот товар. Для этого можно использовать функцию языка выражений системы компоновки данных Массив(). На закладке Вычисляемые поля добавим вычисляемое поле СписокКонтр- агентов. На закладке Ресурсы добавим вычисляемое поле в список ресурсов отчета. В колонке Рассчитывать по... укажем, что ресурс нужно рассчи- тывать для группировки Номенклатура. В колонку Выражение для ресурса СписокКонтрагентов введем следующий текст (листинг 16.54). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 16.54. Выражение для расчета ресурса на основе вычисляемого поля «СписокКонтрагентов» Массив(Различные Контрагент) Результатом работы функции Масси в() является массив, в котором элементом является значение параметра для каждой детальной записи. Перед параметром функции допустимо указывать ключевое слово Различные, в этом случае получаемый массив не будет содержать одина- ковых значений. ПОДРОБНЕЕ О функциях языка выражений системы компоновки данных можно прочитать в книге «1С:Предприятие 8.2. Руководство разработчика», раздел 10.3.7.2. Добавим поле СписокКонтрагентов в список полей отчета. Выполним отчет (рис. 16.322). Рис. 16.322. Результат отчета Мы видим, что в колонке Список контрагентов для каждого товара через запятую выводится список контрагентов, покупавших этот товар. Теперь на этом же варианте отчета продемонстрируем возможность расчета ресурсов по интервалу. Например, с помощью функции Вычис- литьВыражение() можно вычислить стоимость продаж номенклатуры с накоплением по указанному интервалу. На закладке Вычисляемые поля добавим вычисляемое поле СтоимостьПродажСНакоплением. На закладке Ресурсы добавим вычисля- емое поле в список ресурсов отчета. В колонку Выражение для ресурса введем следующий текст (листинг 16.55). Том 2
Листинг 16.55. Выражение для расчета ресурса на основе вычисляемого поля «СтоимостьПродажСНакопланием» | ВычислитьВыражение("Сумма(Стоимость)",,, “Первая", "Текущая”) Таким образом, суммарная стоимость продаж для ресурса будет вычис- ляться с первой по текущую запись отчета. Добавим поле СтоимостьПродажСНакоплением в список полей отчета. Выполним отчет (рис. 16.323). Рис. 16.323. Результат отчета Мы видим, что в колонке Стоимость продаж с накоплением для каждого товара выводится стоимость продаж с накоплением с первой по текущую запись отчета. Теперь рассмотрим возможность группировки записей отчета по значению ресурса, определенного с помощью языка выражений системы компо- новки данных. Для демонстрации этой возможности создадим новый вариант отчета РасчетПоказателейПродаж. Для этого на закладке Настройки схемы компо- новки данных нажмем кнопку Добавить слева над списком вариантов отчета. Зададим имя варианта и его представление как ОбъемПродаж. На закладке Вычисляемые поля добавим вычисляемое поле ОбъемПродаж. На закладке Ресурсы добавим вычисляемое поле в список ресурсов отчета. В колонку Выражение для ресурса введем следующий текст (листинг 16.56). Листинг 16.56. Выражение для расчета ресурса на основе вычисляемого поля «ОбъемПродаж» Выбор Когда Сумма(Стоимость) <= 3000 Тогда "Малый" Иначе Выбор Когда Сумма(Стоимость) >= 10000 Тогда "Большой" Иначе "Средний" Конец Конец
I ГлаваИ 6nG лояаТыеТанагтйтйческйеТотяеты В выражении для расчета ресурса ОбъемПродаж мы задаем градацию суммарной стоимости продаж - <= 3000 («Малый»), от 3000 до 10000 («Средний»), >= 10000 («Большой»), На закладке Настройки определим следующую структуру нового вари- анта отчета - отчет будет содержать составную группировку по полям ОбъемПродаж и Номенклатура с вложенной группировкой Номенкла- тура. Добавим поля Стоимость и ОбъемПродаж в список полей отчета (рис. 16.324). Т*1 Отчет РасчетПокаэателейПродалс ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.324. Структура отчета Запустим отчет на исполнение, выберем вариант отчета Объем продаж и получим следующий результат (рис. 16.325). ® ’ w ’ Р- (icn.jg) tyj |4 ' vs й ' 'll lil ’ м м* м- - □ х Расчет показателей продаж Вариант отчета: |0бъем продаж| I Выбрать вариант... | | > Сформировать 11 OS Настроена... В се действия ~ i (?) Объем продаж Номенклатура___________ Больиой________________ Кокьютер для дома Кокьютер для офиса Кокыотер И1ровой Монитор LCD__________ Малый__________________ Диагностика компьютера Микрофон_____________ Сопутствую и/и услуги Средний________________ Веб-камера___________ Восстановление данных Ремонт компьютера Итого J Стоимость Объем ______________продаж 55 000,00 Больиой 10 000,00 Больиой 10 000,00 Больиой 13 000,00 Больиой 22 000,00 Больиой ~ 6 000,00 Средний I 2 000,00 Малый 2 000,00 Малый | 2 000,00 Малый 15 500,00 Больиой I 4 500,00 Средний | 5 000,00 Средний I 6 000,00 Средний 76 500 ДО Большой Рис. 16.325. Результат отчата
Мы видим, что в колонке Объем продаж выводится значение выражения, которое мы задали для ресурса в листинге 16.56. Кроме того, записи отчета группируются по значению ресурса Объем продаж - сначала выво- дятся записи с большим (Сумма(Стоимость) >= 10000) объемом продаж, затем записи с малым (Сумма(Стоимость) <= 3000) объемом продаж и затем записи со средним (3000 < Сумма(Стоимость) < 10000) объемом продаж. Таким образом, мы рассмотрели некоторые примеры использования в отчетах языка выражений системы компоновки данных: вычисление выражений для родительских группировок, вычисление выражений для вложенных группировок, расчет ресурсов для определенного значения измерения, вывод в ячейке отчета списковых данных, расчет ресурсов по интервалу, возможность группировки записей отчета по значению ресурса. Вывод отчета в общую форму В заключение мы покажем возможность использования общих форм в качестве формы отчета. Платформа предоставляет возможность создать, например, общую форму конфигурации типа Форма отчета, описать в ней некоторые общие алгоритмы поведения форм отчета и назначить ее основной формой для конкретных отчетов или для всей конфигурации в целом. Например, при разработке большинства отчетов мы не создавали для них специальных отчетных форм. Поэтому при их открытии используется автоматически сгенерированная платформой форма, которая обладает стандартными свойствами и поведением форм отчета. После открытия таких форм нам приходилось нажимать кнопку Сформировать, чтобы получить отчет. В отчетах Сборка системных блоков (стр. 156), Отчет по системным блокам (стр. 155) мы разработали основную форму отчета, в модуле которой написали программный код, обеспечивающий формирование отчета сразу при открытии формы. Однако эти формы предназначались не только для этого. В них реализовался индивидуальный алгоритм поведения форм конкретных отчетов. Если же ряд отчетных форм должен обладать сходным поведением, например, отчет в них должен формироваться сразу при открытии формы, то имеет смысл описать этот алгоритм в общей форме отчета и затем назначить ее основной формой для конкретных отчетов или для конфигурации в целом. Для реализации этой возможности раскроем ветвь Общие дерева объектов конфигурации. Выделим ветку Общие формы и нажмем кнопку Добавить Профессиональная разработка в системе «1С:Предприятие 8»
в командной панели окна конфигурации. В открывшемся конструкторе общих форм выберем тип формы Форма отчета, зададим произвольное имя общей формы и нажмем кнопку Готово (рис. 16.326). Конструктор общни форм - Выберите тип формы:----- Q Произвольная Форма О Форма констант Форма отчета Q Форма настроек отчета О Форма варианта отчета @ Н аэначить Форму основной Имя: |ОбщаяФормаОтчета Синоним: [Общая Форма отчета Комментарий: | 5 Расширенное представление: | Пояснение: 31 Ч| | Двяее> | | Готово | | Отмена | | Справка | Рис. 16.326. Создание общей формы отчета Поскольку при создании общей формы флажок Назначить форму основной был установлен (см. рис. 16.326), то общая форма ОбщаяФор- маОтчета становится основной формой отчета для конфигурации в целом (рис. 16.327). Это свойство конфигурации можно использовать, например, при отправке отчета по электронной почте. Свойства X Основная Форма настроек отчета | ... х Q|, Основной форма варианта отчета | ... х Q|j » Разрабетка: ► Справочная информация: I ▼ Совместимость: [ Режим управления блокировкой данных [Управляемый [*|| Режим аетонумераиии объектов [Не освобождать автоматиче», * || Режим ссвместиосги [Не использовать [*||~ Рис. 16.327. Свойства конфигурации Открыв форму ОбщаяФормаОтчета, мы видим, что по внешнему виду и свойствам она ничем не отличается от индивидуальных форм отчета, Том 2
кроме того, что основной реквизит формы имеет тип ОтчетОбъект, а не ОтчетОбъект.<ИмяОтчета> (рис. 16.328). V •• 3 Q X "З Реквизит ап Командная панель - . ГрупаВарианта (аЗ ЗагруэитъВариант 1 . 0снсенет*»4а»анм<1анель LL1 Комюновтл<НастроекПо*зовагельскиеНастройки “ Реэугътвт Свойства: Ф орма «] > V. А - X Заголовок Q а АвтоЗаголовок 0 3 Элементы ~ Доступность 0 Гр,™»». Bvnu»». Шц^иаПол^ыетыыхЭлемеитов Авто СФОРМИРО, ^Испояьвом<=в: ' ТипФормыОтчега Основная АетоОтображентеСостомя Авто Состав команд Откоыть РежилОткрытияОкна Независим^ ПовваениеКлавишСтКет Переходов элементам ПроеерягьЗапо<ыен«еАвтоматическиЭ АвтометическоеСохраноыеДатембНэс Не использовать /Реэутьтат отчета Результат 1 Дажые расимфроаки ДатомРасдмФровки .. 1 Представление варианта НамченоватыеТекущегоВариФтге оцифровки ™ Испо/ъзовать Тип всегда (ОтчетОбъект) \ Строка I ига о Строка 1 о ТабллеиЛДтжучеит (.ООЙСЮО РсКОИЭИ! X “ Кометы и г| Vi а у » Осиош: Имя Отчет 1 Заголовок Qi \рсноеной реквизит 0 _у X С скраплен Просмотр Реаакпфо ' '-j ДокучентОбьект л Фуешим ' LJ ПлеЛндовХерактеристжОбьект * 1. J ОтчетОбъект • О РегистрСведетлОНаборЗатмсей • i_j РегистрСваимбМанаджерЗатысм □в? КоистаитьНабор 0 mi qqqbbs । I ОК Отмена Рис. 16.326. Общая форма отчета В модуле формы создадим обработчик события формы ПриСозда- нииНаСервере и заполним его следующим образом (листинг 16.57). Листинг 16.57. Обработчик события формы «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Параметры.СформироватъПриОткрытии = Истина; КонецПроцедуры В обработчике события параметр СформироватьПриОткрытии устанавли- вается в значение Истина. Таким образом, отчет будет формироваться сразу при открытии формы отчета. После этого форму ОбщаяФормаОтчета можно назначить в качестве основной формы для конкретного отчета (рис. 16.329). Но в данном случае можно было этого и не делать. Поскольку форма ОбщаяФормаОтчета является основной формой отчета для конфигурации в целом (см. рис. 16.327), то для любого отчета, вне зависимости, назначена для него основная форма отчета или нет (см. рис. 16.329), будет откры- ваться ОбщаяФормаОтчета, и отчет будет автоматически формироваться сразу же при ее открытии. При этом если для отчета разработана индиви- дуальная форма, то она имеет приоритет и будет открыта именно она. 225
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты 151 Отчет РасчетЛоказвтелейПродаж г Общие Формы I ок I | Отмена | | Дейс Рис. 16.329. Основная форма отчета Фоновое выполнение отчета Создадим еще одну общую форму конфигурации ФоновыйОтчет типа Форма отчета и назначим ее в качестве основной формы для отчета РасчетПоказателейПродаж (рис. 16.330). Рис. 16.330. Основная форма отчета Таким образом, при вызове отчета Расчет показателей продаж будет открыта форма ФоновыйОтчет, на которой мы покажем возможность формирования отчета в фоновом режиме. Для этого в модуле формы создадим обработчик события формы ПриОткрытии и заполним его следу- ющим образом (листинг 16.58). 22®
Листинг 16.58. Обработчик события формы «ПриОткрытии» &НаКлиенте Процедура ПриОткрытии(Отказ) СкомпоноватъРезультат(РежимКомпоновкиРезультата.Фоновый); II Элементы.Результат.ОтображениеСостояния.Видимость = Истина; КонецПроцедуры В обработчике события мы вызываем метод формы отчета Скомпоно- ватьРезультат() с параметром, определяющим фоновый режим компо- новки результата (РежимКомпоновкиРезультата.Фоновый). Таким образом, отчет Расчет показателей продаж будет формироваться при открытии формы ФоновыйОтчет в фоновом режиме. Все остальные отчеты, для которых не назначена форма отчета, будут формироваться сразу при открытии формы ОбщаяФормаОтчета (поскольку она является основной формой отчета для конфигурации в целом) в непосредственном обычном режиме (это стандартный режим компоновки). А для отчетов Сборка системных блоков (стр. 156), Отчет по системным блокам (стр. 155) будут открываться конкретные, разработанные для них формы, при открытии которых происходит программная установка значений параметров и авто- матическое формирование отчета. Все сказанное относится также и к общим формам настроек отчета, и к общим формам варианта отчета. Таким образом, мы показали, как можно обеспечить однотипное поведение форм без лишних усилий и дублирования кода. Этот дополнительный сервис для разработчика очень удобен и экономит много времени при разработке отчетов. Пример 18. Работа с системой компоновки данных из встроенного языка В этом примере мы продолжим работать с объектами встроенного языка и рассмотрим их объединение в наборе данных. Такое решение нам подходит, так как мы хотим разработать отчет, содержащий объеди- ненную информацию о поступлении и расходе комплектующих на сборку системных блоков. Этот отчет будет вызываться из документа Сбор- каКомпьютера и представлять информацию о списке комплектующих, содержащихся в документе (рис. 16.331). Анализ цен комплектующих Номенклатура Поступило Собрано Выручка ____________________Количество Цена Количество Цена________________ Жесткий диск Э 3 000 3 3 600 1 600 Материнская плата 5 2 000 3 2 833 2 500 Память 5 1 200 3 1 687 1 400 Рис. 16.331. Трабуемый вид отчета Решив поставленную задачу средствами схемы компоновки данных, мы затем осуществим программную настройку и компоновку отчета. Профессиональная разработка в системе «1С:Предприятие 8»
Итак, сначала создадим схему компоновки данных, позволяющую полу- чить нужный отчет. Затем программно заполним используемые в ней наборы данных. Далее с помощью встроенного языка осуществим компо- новку данных. Затем попробуем выполнить программную настройку отчета и программное описание схемы компоновки данных. Выделим ветку Макеты документа СборкаКомпьютера в дереве объектов конфигурации и нажмем кнопку Добавить в командной панели окна конфигурации. В открывшемся конструкторе макета зададим имя макета АнализЦенКомплектующих и выберем тип макета Схема компоновки данных. Нажмем кнопку Готово. В окне конструктора схемы компоновки данных добавим новый набор данных - объединение (рис. 16.332). Т*1 Документ СборкаКомпьютера: АнализЦенКомплектующих - □ X Наборыданных | Связи наборов... Вычисляемые... Ресурсы Параметры Макеты Вложенные сх... Настройки rtTI Добавить набор данных - запрос Добавить набор данных - объект Добавить набор данных-объединение j I v Рис. 16.332. Добавление набора данных - объединение Затем выделим его и добавим два вложенных в него набора данных - объект. Назовем первый набор ЦеныСборки и такое же имя зададим в поле Имя объекта, содержащего данные. Этот набор данных будет отражать инфор- мацию о расходе комплектующих, указанных в документе, на сборку системных блоков. Нажимая кнопку Добавить, создадим список полей набора данных с аналогичными именами (рис. 16.333): Номенклатура, ЦенаСборки (Цена), Собрано (Количество). Т*1 Документ СборкаКомпьютера: АналноЦенКомплектующим □ X Рис. 16.333. Список полей набора данных Том 2
Второй набор назовем ЦеныПоступления и такое же имя зададим в поле Имя объекта, содержащего данные. Этот набор данных будет отражать информацию о поступлении комплектующих, указанных в документе, на сборку системных блоков. Нажимая кнопку Добавить, создадим список полей набора данных с аналогичными именами (рис. 16.334): Номенклатура, ЦенаПриход (Цена), Поступило (Количество). Т»| Документ СборкаКомпыотера: АналноЦонКомплвктующнк □ X Рис. 16.334. Список полей набора данных ПРИМЕЧАНИЕ Обратите внимание, что имена полей (Цена, Количество) табличной части документов СборкаКомпыотера и ПриходнаяНакладная, данными которых будут заполняться объекты, одинаковы, но мы дали им разные имена, чтобы использовать их в ресурсах и настройках отчета. Дальше выполним уже знакомые действия по формированию настроек схемы компоновки данных. На закладке Вычисляемые поля (стр. 283) добавим поле Выручка, но не будем указывать выражение для его расчета, так как мы зададим его позже при определении полей ресурсов (стр. 290). На закладке Ресурсы перетащим в список ресурсов доступные поля отчета и введем вручную Выражения для них (табл. 16.3). Таблица 16.3. Заполнение полей ресурсов и выражений для их расчета Поле ресурса Выражение ЦенаПриход Среднее(ЦенаПриход) ЦенаСборки Среднее* ЦенаСборки) Выручка Сумма(Собрано) * (Среднее(ЦенаСборки) - Сраднее(ЦенаПриход)) Собрано Сумма(Собрано) Поступило Сумма(Поступипо) 22У
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты В отчете мы будем группировать данные по полю Номенклатура, а в итогах по группировке хотим получать суммарные сведения о количестве и средние сведения о ценах поступления и расходования комплектующих. Ресурс Выручка рассчитывается как произведение разницы между ценами сборки и поступления на сумму количества комплектующих, израсходо- ванных на сборку. В результате окно ресурсов схемы компоновки данных примет вид (рис. 16.335). Т*1 Документ СборкаКомпыотера: АнализЦенКомплектующих Наборы даняях Связи наборов... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные сх... Настройки Доступные поля юЛИМ ~ = Номенклатура = Поступило = Собрано = ЦенаПршод = ЦенаСборки Выражение Рассчитывать по... СреднееЩенаПрмхсд) Поле = ЦенаПриход Собрано в Поступило СреднееЩенаСборки) Сумма(Собрано)* (СреднееЩенаСборки) • СреднееЩенаПрмход)) Сумма(Собрано) Сумма(Пост!<мло) Рис. 16.335. Определение ресурсов отчета На закладке Настройки добавим в отчет группировку по полю Номенклатура, так как по этому полю будут группироваться данные о количестве и ценах поступления и расходования комплектующих. На закладке Выбранные поля создадим многоуровневую структуру полей отчета. Сначала, нажав кнопку Добавить, создадим две группы: Поступило и Собрано. Затем в первую группу из списка доступных полей перетащим поля Поступило и ЦенаПриход, во вторую - Собрано и ЦенаСборки. В заключение пере- тащим в основной уровень отчета поле Выручка (рис. 16.336). Документ СборкаКомпыотера: АнализЦенКомплектующих _ D X Рис. 16.336. Определение полей и группировок отчета На закладке Другие настройки установим заголовок отчета - Анализ цен комплектующих и параметр вывода Расположение общих итогов по вертикали - Нет. На закладке Наборы данных изменим заголовки у полей ЦенаПриход и ЦенаСборки на Цена, Собрано и Поступило 22®
на Количество, так как мы ввели для них в шапке отчета поясняющее общее поле (рис. 16.337). Й Документ СборкаКомпьютера: АнализЦенКомллектуюших— □ X Наборыданных | Связи наборов... Вычисляемые... Ресурсы Параметры Макеты Вложенью сх... Настройки tfl- К -т Наборыданных Поля Поле • ЦемыСборки • ЦеньЛоступления 1 Путь Заголовок Ограничение поля Роль Ограничение рек... Выражени... Прове Выражения Набор упор«очи&.. Парек = Номвнклаг... Номенклатура Д Номенклатура = ЦенаПриход ЦенаПриход = ЦенаСборм = Собрано = Поступило /® Цена ЦенаСборки 0 Цена Собрано 01 Количество Поступило □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ □ Рис. 16.337. Определение заголовков полай в шапке отчета Для полей ЦенаПриход и ЦенаСборки на закладке Наборы данных и поля Выручка на закладке Вычисляемые поля в колонке Оформление зададим формат, чтобы значения отображались без копеек. Вызовем диалог Формат поля и в строку Формат введем выражение (листинг 16.59). Листинг 16.59. Формат полей «ЦенаПриход», «ЦенаСборки», Выручка | ЧЦ=6; ЧДЦ=О На этом закончим работу со схемой компоновки данных. Заполнение наборов данных и компоновка отчета Теперь разместим в документе СборкаКомпьютера кнопку Анализ цен, при нажатии которой будет исполняться программный код, заполняющий внешние наборы данных и выполняющий компоновку и представление отчета. Откроем форму документа ФормаДокумента, созданную нами ранее. Затем создадим команду АнализЦен и соответствующую ей кнопку формы и поместим ее в командную панель формы документа (рис. 16.338). Рис. 16.338. Добавление в форму документа кнопки «Анализ цен» Профессиональная разработка в системе «1С:Предприятие 8»
В обработчике команды АнализЦен напишем следующий код (листинг 16.60). Листинг 16.60. Обработчик команды «АнализЦен» &НаКлиенте Процедура АнализЦен(Команда) Результат = АнапизЦенДокумента(); Результат.ОтображатъСетку = Ложь; Результат.ОтображатьЗагоповки = Ложь; Результат.Показатъ(); КонецПроцедуры Отчет формируется в серверной функции АнализЦенДокумента(). Затем заполненный данными табличный документ возвращается на клиента и показывается пользователю (листинг 16.61). Листинг 16.61. Функция «АнализЦенДокуманта()» &НаСервере Функция АнализЦенДокумента() ДокументОбъект = РекаизитФормыВЗначение(”Объект”); Запрос = НовыйЗапрос; Запрос.Текст = "ВЫБРАТЬ |ПриходнаяНакладнаяТовары.Номенклатура КАК Номенклатура, {ПриходнаяНакпаднаяТовары.Количество Как Поступило, {ПриходнаяНакпаднаяТовары.Цена КАК ЦенаПриход |ИЗ {Документ.ПрихеднаяНакпадная.ПереченьНоменкпатуры | КАК ПриходнаяНакпаднаяТовары |ГДЕ {Номенклатура в (&СписокНоменклатуры)"; Запрос.УстановитьПараметрС'СписокНоменклатуры", ДокументОбъект.ПереченьНоменклатуры.ВыгрузитьКолонку(”Номенклатура")); Результат = Запрос.Выпопнитъ(); Поступление = Результат.Выгрузитъ(); Запрос = НовыйЗапрос; Запрос.Текст = "ВЫБРАТЬ |СборкаКомпьклераТовары.Номенклатура КАК Номенклатура, {СборкаКомпьклераТовары.Количество КАК Собрано, {СборкаКомпьклераТовары.Цена КАК ЦенаСборки |ИЗ Щокумент.СборкаКомпыотера.ПереченьНоменкпатуры | КАК СборкаКомпьютераТовары |ГДЕ {Номенклатура в (&СписокНоменклатуры) И {Номенклатура.ВидНоменклатуры = &ВидНоменклатуры”; Запрос.УстановитьПараметр(”СписокНоменклатуры", ДокументОбьект.ПереченьНоменкпатуры.ВыгрузитьКолонку("Номенкпатура")); Том 2
Примерен р а з р а б от к и [отд ето в Запрос.УстановитьПараметр("ВидНоменкпатуры", Перечисления. Виды Номенклатуры. Материалы); Результат = Запрос.Выполнить(); Сборка = Результат.Выгрузить(); ВнешниеНаборыДанных = Новый Структура; ВнешниеНаборыДанных.Вставить("ЦеныПоступпения", Поступление); ВнешниеНаборыДанных.Вставить("ЦеныСборки", Сборка); СхемаКомпоновкиДанных = ДокументОбъект.ПопучитьМакетС'АнвлизЦенКомплектующих"); Настройки = СхемаКомпоновкиДанных.НастройкиПоУмопчанию; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкнДанных; ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкнДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициапизировать(МакетКомпоновки, ВнешниеНаборыДанных, ДанныеРасшифровки); ДокументРезультат = Новый ТабличныйДокумент; ПроцессорВывода = Новый ПроцессорВыводаРезупьтатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезультат); ПроцессорВывода.Вывести(ПроцессорКомпоновкнДанных); Возврат ДокументРезультат; КонецФункции Прокомментируем процедуру обработчика. Сначала определяется запрос для выбора поступлений комплектующих из документов Приход- наяНакладная. При этом полям табличной части Цена и Количество присваиваются псевдонимы ЦенаПриход и Поступило. В качестве параметра запроса используется список номенклатуры табличной части текущего документа. Затем определяется запрос для выбора расхода комплектующих из документов СборкаКомпьютера. При этом полям табличной части Цена и Количество присваиваются псевдонимы ЦенаСборки и Собрано. В качестве параметров запроса используется список номенклатуры табличной части текущего документа и вид номенклатуры - Материалы, так как в отчете нужно отображать только комплектующие. Затем созда- ются два внешних набора данных - ЦеныПоступления и ЦеныСборки и заполняются результатами запросов. Затем программно выполня- ется компоновка данных с использованием внешних наборов данных и выдача результата в табличный документ. После этого заполненный данными табличный документ возвращается на клиента и показывается пользователю. Запустим «1С:Предприятие». Откроем документ СборкаКомпьютера. Нажмем кнопку Анализ цен. На экране появится наш отчет (рис. 16.339). 22®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 ® W Т... (1С:Предлр. gj L4 W □ X Анализ цен комплектующих Выручка Номенклатура Поступило Количество Собрано Количество Жесткий диск 3 3000 3 3600 1 600 Материнская плата 5 2000 3 2 633 2 500 Память 5 1 200 3 1 687 1 400 Рис. 16.339. Результат отчета Настройка отчета Теперь продемонстрируем возможность программной настройки нашего отчета. Для этого сначала удалим все настройки, которые мы сделали в схеме компоновки данных. СОВЕТ Советуем перед удалением настроек сохранить схему компоновки данных в файл. На закладке Настройки нажмем кнопку \ (Заменить настройки стандартной настройкой), расположенную вверху командной панели окна настроек. На запрос конфигуратора о подтверждении потери текущих настроек ответим утвердительно. В результате все сделанные нами настройки будут очищены, а мы восстановим их программным образом. В модуле формы документа откроем функцию АнализЦенДокумента() и отредактируем фрагмент кода следующим образом (листинг 16.62). Листинг 16.62. Фрагмент функции «АнализЦанДокументаО» СхемаКомпоновкнДанных = ДокументОбъект.ПолучитьМакет("АнализЦенКомплектую1цих"); II Настройки s СхемаКомпоновкиДанных.НастройкиПоУмолчанию; Настройки s УстановитьНастройки(СхемаКомпоновкиДанных); КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; Как видим, мы закомментировали использование стандартных настроек схемы компоновки данных АнализЦенКомплектующих и добавили вызов функции УстановитьНастройки(), которая будут возвращать программно установленные настройки схемы компоновки данных. В функцию переда- ется схема компоновки данных АнализЦенКомплектующих, содержащаяся в макете документа. Функцию УстановитьНастройки() будем вносить и комментировать по частям для лучшего восприятия материала. Сначала получим настройки по умолчанию схемы компоновки данных, которые мы предварительно очистили. Создадим группировку по полю Номенклатура и назначим для нее автовыбор полей (листинг 16.63).
Листинг 16.63. Процедура программной установки настроек &НаСервере Функция УстановитьНастройки(СхемаКомпоновкиДанных) Настройки = СхемаКомпоновкиДанных.НастройкиПоУмопчанию; Г руппировкаНоменклатура = Настройки.СтруктураДобавить(Тип("Г руппировкаКомпоновкиДанных")); ГруппировкаНоменкпатура. Использование = Истина; ПопеНоменкпатура = ГруппировкаНоменкпатура.ПопяГруппировки.Элементы. Добавить(Тип("ПопеГруппировкиКомпоновкиДанных")); ПопеНоменкпатура. Использование = Истина; ПолеНоменклатура.Попе = Новый ПолеКомпоновкнДанных("Номенклатура"); ВыбранныеПопяДляНоменклатуры = Г руппировкаНоменклатура.Выбор.Элементы. Добавить(Тип("АвтоВыбранноеПолеКомпоновкиДанных")); ВыбранныеПопяДляНоменкпатуры. Использование = Истина; В общем списке выбранных полей создадим группу Поступило и добавим в нее поля Поступило с заголовком Количество и ЦенаПриход с заголовком Цена. Затем создадим группу Собрано и добавим в нее поля Собрано с заго- ловком Количество и ЦенаСборки с заголовком Цена. Затем в общий список выбранных полей добавим поле Выручка (листинг 16.64). Листинг 16.64. Процедура программной установки настроек Г руппаВыбранныхПолей = Настройки. Выбор.Элементы.Добавить( Т ип(Т руппаВыбранныхПолейКомпоновкнДанных”)); ГруппаВыбранныхПолей. Использование = Истина; ГруппаВыбранныхПолей.Заголовок = "Поступило"; Поле1 = Г руппаВыбранныхПолей.Эпементы Добавить)! ип("ВыбранноеПолеКомпоновкиДанных")); Поле1 .Использование = Истина; Поле1 .Заголовок = "Количество”; Поле1.Поле = Новый ПолеКомпоновкиДанных("Поступипо”); Поле2 = Г руппаВыбранныхПолей.ЭпементыДобавить(!ип("ВыбранноеПолеКомпоновкиДанных")); Поле2.Испопьзование = Истина; Попе2.3аголовок = "Цена"; Попе2.Попе = Новый ПолеКомпоновкиДанных("ЦенаПриход"); ГруппаВыбранныхПолей = Настройки.Выбор.Элементы Добавить) Т ип("Г руппаВыбранныхПолейКомпоновкнДанных")); ГруппаВыбранныхПолей.Использование = Истина; ГруппаВыбранныхПолей.Заголовок = "Собрано"; Поле1 = Г руппаВыбранныхПолей.ЭпементыДобавить(!ип("ВыбранноеПолеКомпоновкиДанных")); Поле1 .Использование = Истина; Поле1 .Заголовок = "Количество”; Поле1.Поле = Новый ПолеКомпоновкиДанных("Собрано"); Поле2 = Г руппаВыбранныхПолей.ЭпементыДобавитъ(!ип("ВыбранноеПолеКомпоновкиДанных")); Поле2.Испопьзование = Истина; Попе2.3аголовок = "Цена"; Поле2.Попе = Новый ПолеКомпоновкиДанных("ЦенаСборки”); ВыбранныеПоля = Настройки.Выбор.Элементы.Дрбавить(Тип("ВыбранноеПолеКЬмпоновкиДанных")); ВыбранныеПопя.Использование = Истина; ВыбранныеПопя.Загоповок = "Выручка"; ВыбранныеПопяПоле = Новый ПопеКомпоновкнДанных("Выручка"); Профессиональная разработка в системе «1С:Предприятие 8»
Настроим параметры вывода Заголовок и ВертикальноеРасположе- ниеОбщихИтогов. Обратите внимание, что названия некоторых пара- метров вывода не совпадают с названиями в окне настроек схемы компоновки данных (листинг 16.65). Листинг 16.65. Процедура программной установки настроек Настройки.ПараметрыВывода.УстановитьЗначениеПараметра( "ВертикальноеРасположениеОбщихИтогов", РасположениеИтоговКомпоновкнДанных.Нет); Настройки. ПараметрыВывода.УстановитьЗначениеПараметра( "Заголовок", "Анализ цен комплектующих1'); Возврат Настройки; КонецФункции ПОДРОБНЕЕ Список имен параметров для программного использования можно увидеть в разделе синтакс-помощника Общие объекты - Систама компоновки данных — Настройки компоновки данных — ЗначанияПарамет- ровВыводаКомпоновкиДанных. Чтобы продемонстрировать программную настройку отбора, уберем отбор по виду номенклатуры на уровне запроса для набора данных ЦеныСборки. В модуле формы документа откроем функцию АнализЦенДокумента() и отредактируем фрагмент кода следующим образом (листинг 16.66). Листинг 16.66. Фрагмент функции «АнализЦанДокумента()» |ГДЕ (Номенклатура в (&СписокНоменклатуры)”; //|Номенклатура.ВидНоменклатуры з &ВидНоменклатуры"; Запрос.УстановитъПараметр(”СписокНоменклатуры", ПереченьНоменклатуры.ВыгрузитьКопонку("Номенкпатура")); //Запрос.УстановитьПараметр("ВидНоменклатуры", Перечисления.ВидыНоменклатуры. Материалы); Как видим, мы закомментировали использование в отборе параметра ВидНоменклатуры. Запустим «1С:Предприятие». Откроем документ Сбор- каКомпьютера. Нажмем кнопку Анализ цен. В отчете будет присутствовать услуга Сборка компьютера, которой не должно быть по условию задачи. Поэтому мы добавим отбор в функцию УстановитьНастройки() так, чтобы в отчет попадала только номенклатура из группы Комплектующие, и отключим вывод информации об отборе (листинг 16.67). Листинг 16.67. Процедура программной установки настроек ЭлементОтбора = Настройки.Отбор.Элементы.Дрбавить(Тип("ЭпементОтбораКомпоновкиДанных")); ЭлементОтбораЛевоеЗначение = Новый ПолеКомпоновкнДанных("Номенкпатура"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии; Том 2
ЭлементОтбора.ПравоеЗначение = Справочники. Номенкпатура.НайтиПоНаименованиюСКомплектующие"); Настройки.ПараметрыВывода.УстановитъЗначениеПараметра(”ВыводитьОтбор'', ТипВыводаТекстаКомпоновкнДанных.НеВыводить); Возврат Настройки; КонецФункции Проверим результат. Ввд отчета в точности соответствует разработан- ному ранее в схеме компоновки данных отчету (см. рис. 16.339). Описание схемы компоновки данных Попробуем теперь программно описать саму схему компоновки данных, ее наборы данных, поля, ресурсы и вычисляемые поля, используемые затем в настройке отчета. Эта задача довольно трудоемкая, но полезная с точки зрения освоения методов и свойств объектов системы компоновки данных. ПОДРОБНЕЕ Информацию об объектах системы компоновки данных можно увидеть в разделе синтакс-помощника Общие объекты — Система компоновки данных — Схема компоновки данных... В модуле формы документа откроем функцию АнализЦенДокумента() и отредактируем фрагмент кода следующим образом (листинг 16.68). Листинг 16.68. Фрагмент функции «АнализЦенДокументаО» II СхемаКомпоновкиДанных s ПолучитьМакет(" АнализЦенКомплектующих''); СхемаКомпоновкиДанных ® УстановитьСхему(); Настройки = УстановитьНастройки(СхемаКомпоновкнДанных); Как видим, мы закомментировали использование схемы компоновки данных АнализЦенКомплектующих, содержащейся в макете документа, и добавили вызов функции УстановитьСхему(), которая будет возвращать программно созданную новую схему компоновки. Функцию УстановитьСхемуО будем вносить и комментировать по частям для лучшего восприятия материала. Сначала создадим новую схему компоновки данных. Добавим локальный источник данных инфор- мационной базы. Затем создадим НаборДанныхОбъединение с именем НаборДанных1 и два его элемента НаборДанныхОбъект с именами ЦеныСборки и ЦеныПоступления. Обратите внимание, что имена наборов и их полей должны совпадать с указанными именами в процедуре их програм- много заполнения при нажатии кнопки Анализ цен (листинг 16.69).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Листинг 16.69. Процедура программной установки схемы компоновки &НаСервере Функция УстановитьСхемуО СКД = Новый СхемаКомпоновкиДанных; ИД = СКД.ИсточникнДанных.Добавить(); ИД.Имя = "ИсточникДанных"; ИД.ТипИсточникаДанных = "Local”; НаборДанных = СКД.НаборыДанных.Добавить( Тип(''НаборДанныхОбъединениеСхемыКомпоновкиДанных")); НаборДанных.Имя = "НаборДанныхГ; Набор1 = НаборДанных.Элементы.Дрбавить(Тип("НаборДанныхОбьектСхемыКомпоновкиДанных")); Набор1.Имя = "ЦеныСборки"; Набор1.ИмяОбъекга = ЦеныСборки”; Набор1 .ИсточникДанных = "ИсточникДанных"; Набор2 = НаборДанных.Эпементы.Добавить(Тип("НаборДанныхОбьектСхемыКомпоновкиДанных")); Набор2.Имя = "ЦеныПоступления”; Набор2.ИмяОбъекга = "ЦеныПоступления"; Набор2.ИсточникДанных = "ИсточникДанных"; В первый набор - объект добавим поле: Номенклатура, ЦенаСборки с заго- ловком Цена и Собрано с заголовком Количество. Во второй набор - объект добавим поле: Номенклатура, ЦенаПриход с заголовком Цена и Поступило с заголовком Количество. Обратите внимание, что имя поля и путь к данным у полей внешних наборов данных совпадают (листинг 16.70). Листинг 16.70. Процедура программной установки схемы компоновки Попе1 = Набор1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); Попе1.Попе = "Номенклатура"; Поле1.ПутьКДанным = "Номенклатура"; Попе1 .Заголовок = "Номенклатура"; Попе2 = Набор1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); Попе2.Попе = "ЦенаСборки"; Поле2.ПутьКДанным = "ЦенаСборки”; Попе2.3агоповок = "Цена"; ПопеЗ = Набор1.Поля.Добавить(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПопеЗ.Поле = "Собрано"; ПопеЗ.ПутьКДанным = "Собрано"; ПопеЗ.Загоповок = "Количество"; Поле1 = Набор16.Поля.Добавитъ(Тип("ПопеНабораДанныхСхемыКомпоновкиДанных")); Попе1.Попе = "Номенклатура"; Попе1.ПутьКДанным = "Номенклатура"; Попе1 .Заголовок = "Номенклатура"; Поле2 = Набор16.Поля.Добавитъ(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); Попе2.Попе = "ЦенаПриход”; Попе2.ПутьКДанным = "ЦенаПриход"; Попе2.3агоповок = "Цена"; ПолеЗ = Набор16.Поля.Добавитъ(Тип("ПолеНабораДанныхСхемыКомпоновкиДанных")); ПопеЗ.Поле = "Поступило"; ПопеЗ.ПутьКДанным = "Поступило"; ПопеЗ.Загоповок = "Количество";
Далее добавим вычисляемое поле Выручка и зададим его формат без вывода дробной части. Затем добавим поля ресурсов ЦенаПриход, ЦенаСборки, Поступило, Собрано и Выручка и зададим выражения для их расчета (листинг 16.71). Листинг 16.71. Процедура программной установки схемы компоновки ВычПоле = СКД.ВычисляемыеПоля.Добавить(); ВычПоле.ПутьКДанным = "Выручка"; ВычПоле.Заголовок = "Выручка”; ВычПоле.Оформпение.УстановитъЗначениеПараметра("Формат", "ЧЦ=6; ЧДЦ=0"); ПолеРесурса = СКД.ПоляИтога.Добавить(); ПолеРесурса.ПутьКДанным = "ЦенаПриход"; ПопеРесурса.Выражение = "Среднее(ЦенаПриход)"; ПолеРесурса = СКД.ПоляИтога.Добавить(); ПолеРесурса. ПутьКДанным = "ЦенаСборки"; ПопеРесурса.Выражение = 'Среднее(ЦенаСборки)"; ПолеРесурса = СКД.ПоляИтога.Добавить(); ПолеРесурса.ПутьКДанным = "Поступило"; ПопеРесурса.Выражение = "Сумма(Поступипо)"; ПолеРесурса = СКД.ПоляИтога.Добавить(); ПолеРесурса.ПутьКДанным = "Собрано"; ПопеРесурса.Выражение = 'Сумма(Собрано)”; ПолеРесурса = СКД.ПоляИтога.Добавить(); ПолеРесурса.ПутьКДанным = "Выручка"; ПопеРесурса.Выражение = "Сумма(Собрано) * (Среднее(ЦенаСборки) - Среднее(ЦенаПриход))"; В заключение нам осталось задать формат полей ЦенаПриход и ЦенаСборки также без вывода дробной части. Но поскольку на уровне наборов данных - объектов нет возможности задать оформление, эти поля сначала нужно добавить в набор данных - объединение. Автоматически, как в конструкторе компоновки данных, в родительский набор они не добавляются (листинг 16.72). Листинг 16.72. Процедура программной установки схемы компоновки ПопеЦены = НаборДанных.ПоляДобавить(Тип("ПопеНабораДанныхСхемыКомпоновкиДанных")); ПопеЦены.Поле = "ЦенаСборки"; ПолеЦены.ПутьКДанным = "ЦенаСборки"; ПопеЦены.Оформление.УстановитъЗначениеПараметра("Формат", "ЧЦИ5; ЧДЦ=0"); ПопеЦены = НаборДанных.ПоляДобавить(Тип("ПопеНабораДанныхСхемыКомпоновкиДанных")); ПопеЦены.Поле = "ЦенаПриход"; ПолеЦены.ПутьКДанным = "ЦенаПриход"; ПолеЦены.Оформление.УстановитъЗначениеПараметра("Формат", "ЧЦ=6; ЧДЦ=0"); Возврат СКД; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
Проверим результат. Мы получим абсолютно такой же отчет, как и при использовании схемы компоновки данных (см. рис. 16.339). Таким образом, мы убедились, что каждый этап процесса компоновки данных можно сформировать программным образом. Стоит ли это делать - зависит от конкретной задачи и подхода разработчика. В боль- шинстве случаев при разработке отчетов можно обойтись интерактивными возможностями платформы. Итак, на этом примере мы научились: использовать в схеме компоновки наборы данных - объединения объектов, выполнять программную настройку отчета, программно создавать и описывать схему компоновки данных. Пример 19. Консоль системы компоновки данных В заключение покажем возможность отладки схем компоновки данных с помощью консоли системы компоновки данных. Консоль опубликована на ИТС (http://its.1c.rU/db/metod81#content:3401:1), ее можно получить как внешний отчет/обработку и добавить в свою конфигурацию или открыть как внешний файл. Консоль системы компоновки данных позволяет загрузить и выпол- нить уже готовый отчет или разработать новый отчет с нуля, используя встроенный конструктор схемы компоновки данных. При этом можно просмотреть XML-текст схемы компоновки данных и проанализировать результирующий запрос к информационной базе, который формирует платформа для получения данных отчета после применения всех настроек, параметров и т. п. Это бывает нужно для анализа сложных схем компоновки данных, когда в результате отчета появляются непонятные ошибки и требуется понять изнутри, что же делает система компоновки данных. Для примера рассмотрим схему компоновки данных разработанного ранее отчета ОстаткиИПродажиТоваров (стр. 171). Напомним, что в данном отчете использовалась связь наборов данных (Остатки и Продажи) по периодам с использованием параметров связи. Во втором наборе данных мы отклю- чали свойство Автозаполнение (стр. 278) и сформировали набор полей и их роли самостоятельно в тексте запроса. Дело в том, что автомати- ческое заполнение полей и значений параметров не всегда оптимально и иногда может привести к ошибкам. Чтобы это увидеть, проанализируем текст запроса платформы в сгенерированном макете компоновки данных при помощи консоли системы компоновки данных. Сначала сохраним в файл схему компоновки данных нужного нам отчета ОстаткиИПродажиТоваров (рис. 16.340). Том 2
Отчет ОстаткиИПродажиТоваров: ОсновнаяСхемаКомпоновкиДанных - □ X Наборыданных | Сведи наблпоя пан Дычисляямыйппля Ряпипсы Папямятлы Макеты К [Сохранить схему в файл R ЛЛЖЯННЫЯ ЛХЯМЫ Щл1 — Настройки т Наборы данных m Ё0 Продажи & База Папка: £jlCv9FTxt ^ICvSLog •j?i анализ„поступленил „гродаж gi настройкм_анаг1иэЦен_СБ настр ойки_гродажи_н ом енклатуры •=i предопределеньй_макет ^пример макета gi схема_анал43Цен_СБ ®]схема_макетСБ =Г1 схема_оказание_услуг gi схема_остаткиноменкпатуры gi схема_остаткиноменкпатуры_макет afi схема_поступление_товаров igi схема_продажи 1=^ схема_продажи„контрагентам l=j схема„продажи„номенклатуры igi схема_СБ„мастера l=j схема_составСБ ig] схема_список_номенкпатуры l=j схемалены„комплектующих Имя файла: ]осгатки_продажи_товарое Тип Файла: | Документ XML (".xml) Автоэаполнение @ t иерархии иных нструктор запроса... у | | Сохранить | у| Отмена I КАК КовепПе КАК Начальна АК КонечныЖ Рис. 16.340. Сохранение схемы компоновки данных в файл Запустим «1С:Предприятие» в режиме Толстый клиент (управляемое приложение). Консоль системы компоновки данных добавлена в нашу демонстрационную конфигурацию в качестве обработки, и ее можно вызвать из группы команд Сервис. Запустим ее и добавим новый отчет в консоль системы компоновки данных. Для этого нажмем кнопку Доба- вить в командной панели консоли (рис. 16.341). ® W Консоль системы коьвкгновкида**» • Демонстрг Консоль системы компоновки данных Файл - | > Сформировать | | Добавить •’I JC i *0“ Все действия » Добавить отчет Добавить вариант отчета Добавить пользовательские настроСки Добавить папку Рис. 16.341. Добавление отчета в консоль системы компоновки данных После этого нажмем кнопку Загрузить схему из файла и загрузим из файла ранее сохраненную схему компоновки данных. В верхнем правом окне консоли мы увидим XML-текст загруженной схемы компоновки данных. Затем нажмем кнопку Сформировать. В нижнем окне консоли, на закладке Табличный документ мы увидим результат выполнения отчета в виде табличного документа (рис. 16.342).
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты •ic) Консояьсистемы компоновки дажьм - Демонстрационная конфигурация "Снеге... ПСЛредприятие] Консоль системы компоновки данных Файл» p Сформировать Констдотор схемы коншновки данных x'Sl Ikliil м м* м- - □ х Лане» резу<ьтэтов Отчеты £j QQ <?xml verslonB"1.0" encoding""UTF-8"?> <DacaCcmpoaicionSchema xn>lns""http://v8.lc.ru/8.l/daca-ccmpoaicion-ayscen/ac j <dacaSource> <dataSourceType>Local</dataSourceType> </dacaSource> <dataSet xsl:type""DataSetQuery"> <мипе>Остатки</мипе> <fleld xsiitypeB"t>aca3etFleldField"> <dacaPach>KoBeanepMOAa</dacaPach> <£ ield>KotmaHepi«OAa</£ ield> <tole> Номенклатура Начало периода - Веб-камера 01-01.20120:00:00 - Жестом диск 01.122011 0:00:00 01.0120120:00:00 - Мвтертекхея плата 01.1220110:00:00 01.0120120:00:00 у МЖрОфОН 01-012012 0:00:00 - Могмтор LCD 01.122011 0:00:00 01.0120120:00:00 01.1220110:00:00 Продано Начальный Конечный остеток остаток 3,00 ?доо' 3,00 7.000 1Д00 1.000 2,000 э.ооо 3,000 2,000 2,00 8,000 2Д0 8,000 2,00 2,000 1Д0 1.000 1Д0 1,000 2,000 2,000 3.000 Сохратыть эталон Сравтыть с эталоном Табличный доку Макет длятабли... Результат длят... Исполняемые н... Исполппс1-ме н„ Коллекция Макетдляков.. Реэукгат дляк Рис. 16.342. Результат отчета в консоли системы компоновки данных Откроем конструктор схемы компоновки данных и введем значения пара- метров отчетного периода (рис. 16.343). (i^ \j Консоль системы компоновки данных • Демонстрационная конфигурация "Смете [1С Предприятие] Консогь системы компоновки данных 4 Файл» р Сформировать Панель результатов Добавить» X Веедейстеия» i_j ия! ^Конструктор схемы компоновки данньи) •je) з, Конструстор схемы ксммновки данных-Демонстрационная ко... ПСЛредприятие) J7 jil М М» М- j - - □ X Наборы датемх Связи наборов данных Вышсляет-ыеполя Ресурсы Параметры Макеты Вложемше схемы Настройки & ’ .? \ -.г • • *>. Ц 1И ,чо Имя варианта Представление < * bl Основной j - 0“ Номенклатура । 0Ш НачалоПериода Настроями Отчет Отчет Параметры Выбратемпо... Отбор Сортировка Условное офо... Пользователь... Другие настр... С Отображать недоступные параметры [устанавливать значения недостуьых параметров не рекомендуется) Параметр 0 Началопермода 0 Конецпериода Значение Производная дата Производная дата Рис. 16.343. Редактирование настроек отчета в конструкторе схемы компоновки данных
Нажмем ОК, сформируем отчет и в нижней части консоли перейдем на закладку Макет для табличного документа XML. Здесь мы видим XML- текст сгенерированного макета компоновки данных, внутри которого мы можем найти и проанализировать текст запроса, выполняемого плат- формой для получения данных отчета (рис. 16.344). ift) з Консоа системы ксмкмеки денных •Демонстрвциожаяконф1гураиия "Смете... (ЮПреоприягие) ml |Д .< Ш дц1 jj » - □ X Консогь системы компоновки данных * Файл • р Сформировать Панель резуыэтов Добавить'' jj X & Все действия» ия! Конструкторсхеьым»«юноекмдат»*>1х - Отчеты <dataCompositlonSchema xmlnsa*'htcp://v8.1c.Eu/8.1/daca-coinposicion-9yscein/st ВЯД <dacaSource> <мипе>ИсточникДам1шх 1</ па»е> <dacaSouEceType>Local</dacaSouEceType> </dataSource> <dacaSec xsi:cypeB"DacaSecQuery"> <мипе>Остатки</мипе> <f leld x9i:cype~rrDataSecFieldFieldrr> <daCaPath>Koitaanepxoaa</daCaPath> <f1е1в>КонеаПериола</1ield> <role> <dc3com:periodNuntoer>2</dcsct»i:perlodNuntoer> <dc3can>:dimen3ionJLtcribuce>true</dcscom:dimen3ionJLtcribute> i </role> </£ield> < dac aSo ur с e ЖсточникДашаах 1 < 7 dac aSo ur ее > " <query>BbIEPATb 'Ч ОстаткиНоменклатурыОстаткиИОборота.Период КАК Началопериода, КОНЕЦПЕРИОДА(ОстаткиНоиенклатурыОстаткиИОборота. Период, НЕСЯЦ) КАК Конецпериода, ОстаткиНоменклатурыОстаткиИОборотм.Номенклатура КАК Номенклатура, ОстаткиНохеиклатурыОстаткиИОборота.КоличествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОборота.КоличествоКомечныйОстаток КАК КонечныйОстаток, ПРЕДСТАВЛЕНИЕССЫЛКМ(ОстаткиНоменклатурыОстаткиИОборо™.Номенклатура) КАК НоменклатураПредставление, ОстаткиНоменклатурыОстаткиИОборота.Номенклатура.Наименование КАК НоменклатураНаииенование ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОборо™(вал1р;П, «еотр;П2, Несла, , ) КАК ОстаткиНононклату k/dataSet!>--------------------------------------- | <dacaSec xsi:cype""t»acaSecQuery"> т Выпотмтть втаб<м**йдск<рленг с текущим макетом Выполнить с текущим макетом Дохранить этэлен Сравшть с эталоном) Табличный доку Резутътат для к. Рис. 16.344. Сгенерированный макет компоновки данных Поскольку схема компоновки данных, макет компоновки и т. п. представ- лены в виде XML-текста, разработчик должен представлять структуру описания этих объектов в XML-формате. Рассмотрим структуру описания схемы компоновки данных: между тегами <?> и </?> располагается служебный комментарий; тег <DataCompositionSchema> открывает описание схемы компо- новки данных. Сначала идет описание типа схемы компоновки данных в пространстве имен «1С:Предприятия»; между открывающим и закрывающим тегом <dataSource> находится описание источника данных схемы компоновки; тег <dataSet> открывает описание набора данных схемы компо- новки. Здесь определяется имя набора, список полей и текст запроса. Описание полей, их имени, роли, формата представления и т. п. заклю- чено между открывающими и закрывающими тегами <field>; Профессиональная разработка в системе «1С:Предприятие 8»
между открывающим и закрывающим тегом < query> находится описание текста запроса набора данных; тег </dataSet> закрывает описание набора данных схемы компо- новки; между открывающими и закрывающими тегами <dataSetLink> нахо- дится описание связей между наборами данных; между открывающими и закрывающими тегами <calculatedField> нахо- дится описание вычисляемых полей схемы компоновки данных; между открывающими и закрывающими тегами <totalField> находится описание полей ресурсов схемы компоновки данных; между открывающими и закрывающими тегами <parameter> нахо- дится описание параметров схемы компоновки данных; тег <settingsVariant> открывает описание настроек варианта отчета; между открывающими и закрывающими тегами <dcsset:selection> находится описание списка выбранных полей настроек схемы компо- новки данных; между открывающими и закрывающими тегами <dcsset:dataParameters> находится описание настроек параметров данных схемы компоновки данных; между открывающими и закрывающими тегами <dcsset:filter> нахо- дится описание условий отбора настроек схемы компоновки данных; между открывающими и закрывающими тегами <dcsset:conditionalAppearance> находится описание условного оформ- ления настроек схемы компоновки данных; между открывающими и закрывающими тегами <dcsset:outputParameters> находится описание настроек вывода схемы компоновки данных; между открывающими и закрывающими тегами <dcsset:item> нахо- дится описание элементов структуры настроек схемы компоновки данных; тег </settingsVariant> закрывает описание настроек варианта отчета; тег </DataCompositionSchema> закрывает описание схемы компоновки данных. ПРИМЕЧАНИЕ Некоторые символы, зарезервированные в XML, отображаются в тексте при помощи специальных обозначений. Так, символ «&» отображается как «&ашр;», символ «<» отображается как «&lt;», символ «>» - как «&gt;». Найдем в тексте схемы компоновки данных (в верхнем правом окне консоли) запрос для первого набора данных Остатки (листинг 16.73). Том 2
Листинг 16.73. Запрос для набора данных «Остатки» в схема компоновки данных <циегу>ВЫБРАТЬ ОстаткиНоменкпатурыОстаткиИОбороты.Период КАК НачапоПериода, КОНЕЦПЕРИОДА(ОстаткиНоменкпатурыОстаткиИОбороты. Период, МЕСЯЦ) КАК КонецПериода, Остатки НоменкпатурыОстаткиИОбороты.Номенкпатура, ОстаткиНоменкпатурыОстаткиИОбороты.КопичествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменкпатурыОстаткиИОбороты.КопичествоКонечныйОстаток КАК КонечныйОстаток ИЗ РегистрНакопления.ОстаткиНоменкпатуры.ОстаткиИОбороты(,, Месяц,,) КАКОстаткиНоменклатурыОстаткиИОбороты</диегу> Теперь посмотрим, как изменился текст этого запроса в макете компо- новки данных (в нижнем окне консоли, на закладке Макет для табличного документа XML), листинг 16.74. Листинг 16.74. Запрос для набора данных «Остатки» в макете компоновки данных <циегу>ВЫБРАТЬ ОстаткиНоменкпатурыОстаткиИОбороты.Период КАК НачапоПериода, КОНЕЦПЕРИОДА(ОстаткиНоменкпатурыОстаткиИОбороты.Период, МЕСЯЦ) КАК КонецПериода, ОстаткиНоменкпатурыОстаткиИОбороты.Номенкпатура КАК Номенклатура, ОстаткиНоменкпатурыОстаткиИОбороты.КопичествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КопичествоКонечныйОстаток КАК КонечныйОстаток, ПРЕДСТАВЛЕНИЕССЫЛКИ(ОстаткиНоменклатурыОстаткиИОбороты. Номенклатура) КАК НоменклатураПредставление, ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура.Наименование КАК НоменклатураНаименование ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(&атр;П, &атр;П2, Месяц,,) КАК ОстаткиНоменкпатурыОстаткиИОбороты</диегу> Измененные фрагменты запроса выделены в листинге 16.74 жирным шрифтом. В результирующем запросе получается представление ссылки и наименования измерения Номенклатура, а также параметры Нача- лопериода и КонецПериода виртуальной таблицы ОстаткиНомен- клатуры.ОстаткиИОбороты заполняются значениями, введенными в настройках отчета на закладке Параметры (см. рис. 16.343). В макете компоновки данных параметры заполняются следующим образом (листинг 16.75). Листинг 16.75. Заполнение параметров в макате компоновки данных <parameterValue> <пате>КонецПериода</пате> <valuexsi:type="xs:dateTime">2012-01-31T00:00:00</value> </parameterValue> <parameterValue> <пате>КонецПериодаПродаж</пате> <valuexsi:type="xs:dateTime">0001-01-01T00:00:00</value> </parameterValue> <parameterValue> <пате>НачалоПериода</пате> <valuexsi:type="xs:dateTime">2011-12-01T00:00:00</value> </parameterValue> <parameterValue> <пате>НачалоПериодаПродаж</пате> <valuexsi:type="xs:dateTime">0001-01-01T00:00:00</value> </parameterValue> 23g
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 <parameterValue> <пате>П</пате> <valuexsi:type=\s:dateTime”>2011-12-01T00:00:00</value> </parameterValue> <parameteiValue> <пате>П2</пате> <valuexsi:type=''xs:dateTime''>2012-01-31T00:00:00</value> </parameterValue> Теперь проанализируем текст второго набора данных Продажи. В схеме компоновки данных он имеет следующий вид (листинг 16.76). Листинг 16.76. Запрос для набора данных «Продажи» в схема компоновки данных <циегу>ВЫБРАТЬ &атр;НачалоПериодаПродаж КАК НачалоПериода, &атр;КонецПериодаПродаж КАК КонецПериода, ПродажиОбороты.Номенкпатура, ПродажиОбороты.КопичествоОборот КАК Количество {ВЫБРАТЬ НачалоПериода, КонецПериода, Номенклатура.*, Количество} ИЗ РегистрНакоппения.Продажи.Обороты(&атр;НачалоПериодаПродаж, &атр;КонецПериодаПродаж,, {(Контрагент).*, (Номенклатура).*}) КАК ПродажиОбороты</диегу> Посмотрим, как изменился текст этого запроса в макете компоновки данных (листинг 16.77). Листинг 16.77. Запрос для набора данных «Продажи» в макете компоновки данных <циегу>ВЫБРАТЬ &атр;НачалоПериодаПродаж КАК НачалоПериода, &атр;КонецПериодаПродаж КАК КонецПериода, ПродажиОбороты.Номенкпатура КАК Номенклатура, ПродажиОбороты.КопичествоОборот КАК Количество ИЗ РегистрНакоппения.Продажи.Обороты(&атр;НачалоПериодаПродаж, &атр;КонецПериодаПродаж,,) КАК ПродажиО6ороты</циегу> Поскольку связь исходного набора данных Остатки с набором Продажи выполняется по полям НачалоПериода и Конецпериода, с использованием параметров связи НачалоПериодаПродаж/КонецПериодаПродаж, значения полей НачалоПериода и Конецпериода набора данных Остатки (в данном случае начало и конец месяца) будут использоваться в качестве значений параметров НачалоПериодаПродаж/КонецПериодаПродаж виртуальной таблицы Продажи.Обороты. При разработке отчета опытным путем мы выяснили, что установка свойства Автозаполнение для набора данных Продажи приводит к ошибке - данные в колонке Количество (Продано) увеличиваются пропорционально количеству периодов в отчете. Разберемся, почему это происходит. 23®
Сначала на закладке Макет для табличного документа XML сохраним правильный вариант макета компоновки данных, нажав кнопку Сохра- нить эталон (см. рис. 16.344). Затем в конструкторе схемы компоновки данных включим свойство Автозаполнение для набора данных Продажи (рис. 16.345) и установим следующий текст запроса (листинг 16.78). @ Конструктор схемы компоновки данных* Демоне... (ЮПредприягие) да 'й!| 'ail М М*М-ф» - □ X Наборы данных | Связинаборсвд... Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы Настрсйш Поля - Н аборы дан mt ЛП Остатки ' Поле 1 Путь ' Автозаголоеок ' Выражени... Проверка иерархии Выражения Набор данных упорядочи” Параметр Количество □ Количество = КонецПериода КонецПериода О Конец периода = Контрагент Контрагент О Контрагент = НачалоПериода НачапоПериода □ Началопериода = Номенклатура Номенклатура Ограничение поля Роль П... У... Г... У... Ограничение рек... □ □ □ □ Измерение □ □ □ □ □ □ □ □ □ □ Запрос: Е< Конструктор запроса.. ВЫБРАТЬ бНачалоПериолаПролаж КАК Началопериода, бКонецПериолаПролаж КАК КонецПериода, ПродажиОборота.Номенклатура, ПродажиОборота.КоличествоОборот КАК Количество ИЗ РегистрНакопления.Продажи.Оборота(£НачалоПериодаПродаж, бКонецПериодаПрода: I I» ^вгозаполнание В'У ОК Отмена Справка Рис. 16.345. Изменение запроса в конструкторе схемы компоновки данных Листинг 16.78. Запрос для набора данных «Продажи» в конструкторе схемы компоновки данных ВЫБРАТЬ &НачалоПериодаПродаж КАК НачапоПериода, &КонецПериодаПродаж КАК КонецПериода, ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество ИЗ РегистрНакопления.Продажи.Обороты(&НачапоПериодаПродаж, &КонецПериодаПродаж,,) КАК ПродажиОбороты Добавим в ресурсы схемы компоновки поле Количество, так как этот ресурс исчезнет при изменении запроса. Сформируем отчет. Найдем текст запроса для набора Продажи в сгенерированном макете компоновки данных (в нижнем окне консоли, на закладке Макет для табличного документа XML), листинг 16.79. Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 16.79. Запрос для набора данных «Продажи» в макете компоновки данных <диегу»ВЫБРАТЬ &атр;НачалоПериодаПродаж КАК НачалоПериода, &атр;КонецПериодаПродаж КАК КонецПериода, ПродажиОбороты.Номенкпатура КАК Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество ИЗ РегистрНакопления.Продажи.Обороты(&атр;П, &атр;П2,,) КАК ПродажиОбороты</диегу> Измененные фрагменты запроса по сравнению с листингом 16.77 выделены жирным шрифтом. Чтобы быстро найти отличия макета, сгене- рированного в результате изменений, нажмем кнопку Сравнить с эталоном (рис. 16.346). Р«элн«в между C:\WIN00'*,S\Teinp'3TanoHMetier»>rt'C\WIN00'*,S\1errp\Metier.>rt'Дем.. ПСПреагфмягме) < Q7? С? fa 98 99 100 101 102 103 104 10S 106 107 108 109 110 111 112 113 114 IIS 116 117 ИЗ “"♦I 119 120 121 122 123 124 125 126 127 128 «datapath»НачалоnepHoaa«7dataPath» < name» Начало Пе p иода</ шипе > «role» «dcect»i:dlmeBeionAttEibute>tEue«/dcect»i </ЕО1е> «/field» «field» «datapath» Номе шшатура«/datapath» <пате»Нонеиклатура</паие> <dcect»i:dimeneion»tEue</dcscoiB:dimenelo: «/role» «/field» <daca3ource>McTO4HKKflauHHXl</daca3ource> «query»ВЫБРАТЬ <атр;НачалоПермолаПролаж КАК НачалоПериода, Сап>р;КоиецПернодаПролон КАК Конецпериода, ПролахиОборота.Номенклатура КАК Номенклатура, ПродехиОборота.КолхчествоОборот КАК Количество РепистрНакоплекия.Продажи.Оборота(lamp;НачалоПериод. «/dataset» «dacaSetLink» <аоигсеБасаЗес>Остатки</аоигсеРасаЗес> <deetinationDetaSet»npoAaxK«/deetinatlonDetaSet: «зоигсеЕхргeaslon» Остатки.Номекклатура</зоигсеЕ: <destlnatlonExpreselon»Прол ажи.Ионекклатурас/йе; <pareBetecLiacAllooed>£alae</pareaetecLlat Alioth «/dataSetLlnk» «dacaSetLink» <эоигсеБасаЗес»Остаткх«/зоигсеРасаЗес» 98 99 100 101 102 103 104 IOS 106 107 108 109 110 113 ИЭ «datapath»НачалоnepHOAa</dataPath> < пате» НачалоПер иода</name > <ЕО1е> <dcect»i:dlmeBeionAttEibute>tEue</dcec «/field» «field» <datapath»Номекклатура«/datapath» <dcect»i:dlmeneion»CEue</dcecoDi:dlmene «/field» кДакннх1</decaSource> «query»ВЫБРАТЬ <ап>р;НачалоПериолаПролаж КАК НачалоПериода, Сап>р»КоиецПермодаПролш КАК Конецпериода, ПредахиОборота.Номенклатура КАК Номенклатура, ПродахиОборота.КоличествоОборот КАК Количество РепистрНакоплекия.Продажи. Оборота(сайр;П, camp;П2 «/dataset» 120 «dacaSetLink» 121 <sourcebataSet»OcTaTKM</aourceDataSet> 122 <deetinationDetaSet»npoAaxK«/deetinatlonDetaS 123 <зоигсеЕхргеза1оп»Остатки.Ноиекклатура</эоигс 124 <беэе1пае1оп£хрЕеэе1оп»Продажи.Нокеккла1ура</ 125 <pacameterLi3cAllooed»£alae</pacameterL13tAll 126 «/dataSetLlnk» 127 «dacaSetLink» 128 <эоигсеБасаЗес»Остаткх«/зоигсеРасаЗес» Рис. 16.346. Сравнение двух макетов компоновки данных Из текста запроса мы видим, что параметры НачалоПериодаПродаж/ КонецПериодаПродаж виртуальной таблицы Продажи.Обороты будут запол- няться не значениями полей НачалоПериода и Конецпериода набора данных Остатки, а значениями настроек отчетного периода НачалоПериода и КонецПериода. То есть в нашем случае (когда данные выбираются с периодичностью Месяц) период продаж не разбивается по месяцам, а включает сразу два месяца, из-за чего и получается дублирование данных в колонке Количество (Продано). Рассмотрим теперь другую важную особенность системы компоновки данных: система исключает из результирующего запроса поля, не участ- вующие в настройках отчета. Это также может приводить к ошибкам. Рассмотрим пример. Разработаем простой отчет по продажам и проана- лизируем текст запроса в макете компоновки данных в зависимости от изменения настроек отчета. Том 2
Нажмем кнопку Добавить в командной панели консоли системы компо- новки данных и добавим новый отчет. Откроем конструктор схемы компоновки данных и добавим набор данных - запрос. Заполним текст запроса для набора данных следующим образом (листинг 16.80). Листинг 16.60. Запрос для набора данных в конструкторе схемы компоновки данных ВЫБРАТЬ ПродажиОбороты.Номенкпатура, ПродажиОбороты.Контрагент, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость ИЗ РегистрНакопления.Продажи.Обороты() КАК ПродажиОбороты На закладке Вычисляемые поля добавим вычисляемое поле (стр. 283) Сумма и зададим выражение для его расчета как Количество * Стоимость (рис. 16.347). @ Конструктор схемы компоновкиданных-Демонстр... (ЮПредприятие) 'ш| ’зЛ М М+ М- •- - □ X Наборыданных Связи наборов дан.. | Вычисляемые поля | Ресурсы Параметры Макеты Вложенные схемы Настройки И й X I Путь к данным Выражение 'Заголовок | Ограничениедост...' Выражение П . У. Г. У. пРмставяе" Выражения Тип значения'Доступные Оформление тж»».. значения Парамяры "ЖКоличесгеоХтоимость^ Сумма □ □ □ □ ОК Отмена Справка Рис. 16.347. Вычисляемые поля в конструкторе схемы компоновки данных Выражение для расчета вычисляемого поля задано просто для примера и не несет никакой смысловой нагрузки. На закладке Ресурсы добавим поле Сумма в ресурсы отчета (стр. 290), рис. 16.348. Поле Выражшые Рассчитывать по... fa Сумма Сумма(Сумма| @ Конструктор схемы компоновкиданных*... (ЮПредприягие) н!| ail -ц,- — _ □ X Наборыданных Связи наборов... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные сх...Настройки ш iJD 1771 Доступные поля = Количество в Контрагент в Номенклатура = Стоимость шмввп ~ DK Отмена Справка Рис. 16.348. Ресурсы в конструкторе схемы компоновки данных На закладке Настройки добавим в настройки отчета группировку Детальные записи и в список выбранных полей - поля Контрагент, Номенклатура и Сумма (рис. 16.349).
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты \J Конструктор схемы компоновки д»ных-Демонстра... (ЮПредприягиа) 'Я.1 'м! М М* М- Ц; - □ X Наборыданных Сеней наборов дани.. Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы | Настройки |_ [Ь - -и- о £ ’ 2S 1/ <’ I л 05 си IЦЯ ОК Отмена Справка Рис. 16.349. Структура и выбранные поля отчета Нажмем ОК и сформируем отчет, нажав кнопку Сформировать (рис. 16.350). Итого Сумма________ I зооо.оой 2000,0000 3 000,0000 10 000,0000 1 10 000ДО 00 13 000,0000 44 000,0000 13500,0000 4000,0000 3 000,0000 2 000,0000 5000,0000 500,0000 113 000щю Сохранить эталон । Сравнить с эталоном Т абличный доку_. I Макет для табли... Результат для т... Исполняемые н... Рис. 16.350. Результат отчета в консоли системы компоновки данных Найдем текст запроса для набора данных в сгенерированном макете компо- новки данных (в нижнем окне консоли, на закладке Макет для табличного документа XML), листинг 16.81. Листинг 16.81. Запрос для набора данных в макете компоновки данных <диегу>ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.КопичествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагант)КАККонтрагентПредставпение, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты. Номенклатура) КАК НоменклатураПредставление ИЗ РегистрНакоппения.Продажи.Обороты(,,,) КАК ПродажиОбороты</диегу>
Поскольку свойство Автозаполнение включено, в описании полей набора данных для полей Контрагент и Номенклатура установлена роль - Изме- рение (листинг 16.82). Листинг 16.62. Роль поля «Номенклатура» в макете компоновки данных <field> <dataPath>HoMeHKnaiypa</dataPath> <пате>Номенкпатура</пате> <role> <dcscom:dimension>tnje</dcscom:dimension> </role> </field> Теперь в конструкторе схемы компоновки данных изменим настройки отчета - отключим использование поля Номенклатура (рис. 16.351). Параметры | Выбранные... | Отбор Сортировка Условное о...__________________________Пользоеэте... Другие наст... Доступные поля Поле 1 (И- X <в ф I = Количество = Контрагент = Номенклатура = Стоимость J □ СистемныеПоля О ПараметрыДаннык Выбраншелоля |7| в Контрагент ^1/ = Номенклатура 0 J Сумма Рис. 16.351. Изменение настроак отчета в конструкторе схемы компоновки данных Сформируем отчет и сравним его с правильным вариантом на рис. 16.350 (рис. 16.352). Контрагент ООО “Стандарт* ООО “Стиль* ООО‘Автоматика* ООО-Система* ООО‘Атлант* Итого Сумма__________ 16 000,0000 199 500,0000 98000,0000 10000,0000 36 000.0000 361 500.0000 Рис. 16.352. Результат отчета в консоли системы компоновки данных Мы видим, что суммы продаж, не учитывающие разрез по номенкла- туре, - неправильные. Почему так происходит? Найдем текст запроса для набора данных в макете компоновки данных (листинг 16.83). Листинг 16.63. Запрос для набора данных в макета компоновки данных <query>BblBPATb ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагент) КАК КонтрагентПредставление ИЗ РегистрНакопления.Продажи.Обороты(,,,) КАК ПродажиОбороты</диегу> Профессиональная разработка в системе «1С:Предприятие 8»
Мы видим, что в запросе нет поля Номенклатура, так как это поле не пока- зывается в отчете. Однако это поле является измерением оборотного регистра накопления Продажи, служащего источником данных для запроса. Поэтому при расчете любых вычисляемых полей отчета данные должны учитываться в разрезе номенклатуры. То есть поле Номенклатура должно обязательно присутствовать в тексте запроса, и у этого поля должна быть установлена роль - Измерение. Чтобы этого добиться, откроем конструктор схемы компоновки данных и на закладке Наборы данных установим свойство Обязательное в роли поля Номенклатура (рис. 16.353). Рис. 16.353. Установка признака «Обязательное» в роли поля «Номенклатура» Сформируем отчет. Теперь результат правильный, поскольку данные в нем разрезаются по номенклатуре (рис. 16.354). Контрагент ООО “Стандарт” ООО "Стандарт* ООО "Автоматика* ООО "Система* ООО'Автоматика* ООО "Автоматика” ООО "Стиль* ООО "Стиль* ООО "Стиль* ООО "Атлант* ООО "Атлант* ООО "Атлант* ООО "Стандарт” Итого Сумма_________ 3 000,0000 2000,0000 3000,0000 10000,0000 10000,0000 13000,0000 44 000,0000 13500,0000 4 000,0000 3000,0000 2000,0000 5000,0000 500.0000 i 113 000,00001 Сохранитьэталон । Сравнить с эталоном Табличныйдоку... I Макет для табли... Рис. 16.354. Результат отчета в консоли системы компоноаки данных Найдем описание роли поля Номенклатура в макете компоновки данных (листинг 16.84). Том 2
Листинг 16.64. Роль поля «Номенклатура» в макете компоновки данных <field> <dataPath>HoMeHKnaiypa</dataPath> <пате>Номенкпатура</пате> <role> <dcscom:dimension>tnje</dcscom:dimension> <dcscom:required>true</dcscom:required> </role> </field> В описании роли поля указаны свойства Измерение и Обязательное. Это значит, что поле Номенклатура обязательно будет присутствовать в списке полей запроса, независимо от настроек отчета (листинг 16.85). Листинг 16.85. Запрос для набора данных в макета компоновки данных <query>BblBPATb ПродажиОбороты.Номенклатура КАК Номенклатура, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимосгьОборот КАК Стоимость, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороть|.Контрагент) КАК КонтрагентПредставление ИЗ РегистрНакопления.Продажи.Обороты(,,,) КАК ПродажиОбороты</диегу> Обратите внимание, что хотя поля Количество и Стоимость не выводятся в отчете, они все равно присутствуют в запросе, так как участвуют в расчете поля Сумма. В заключение посмотрим, как будет влиять на текст результирующего запроса отбор, установленный в настройках отчета. Откроем конструктор схемы компоновки данных и установим отбор по номенклатуре - <Номенклатура> <В Группе> <Услуги> (рис. 16.355). Параметры Выбрангм п... Отбор Сортировка Условное оф... По«>зовател.. Лруиенаст.. Доступные поля = Ко/мчество * = Контрагент = = Спм-юсть = Сумма * О ПараметрыДантмг Левое значение Вид сравнения Правое значение Режи.. П.. - Отбор <|Я о Номенклатура 8 группе Услуги Быстр... g Рис. 16.355. Создание отбора в конструкторе схемы компоновки данных Сформируем отчет (рис. 16.356). Отбор: Номенклатура В группе ‘Услуги* Контрагент Номенклатуре Сумма ОООХтандарт* Ремонт ксмпютера 3 000,0000 ОООХтандарт* Сопутствую аре услум 2 000,0000 ООО‘Автоматика* Диагноспм комгмотера 3 000,0000 ООО •Атлант" Ремонт ксмпиотера 3 000,0000 ООО "Атлант" Сопутствующие услуги 2000,0000 ООО "Атлант" босстаноалегою данных 5000,0000 ООО "Стенают* Диагностик компьютеоа 000,0000 I Итого □ 1В500ДЮО Рис. 16.356. Результат отчета в консоли системы компоновки данных
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Посмотрим, как изменился текст запроса для набора данных в макете компоновки данных (листинг 16.86). Листинг 16.86. Запрос для набора данных в макете компоновки данных <диегу>ВЫБРАТЬ ПродажиОбороты.Номенкпатура КАК Номенклатура, ПродажиОбороты.Контрагент КАК Контрагент, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость, ПРЕДСТАВЛЕНИЕССЫЛКИ(ПродажиОбороты.Контрагант)КАККонтрагентПредстввпение ИЗ РегистрНакопления.Продажи.Обороты(,,, Номенклатура В ИЕРАРХИИ(&атр;П)) КАК ПродажиОбороты</диегу> </dataSet> <parameterValue> <лате>П</пате> «value xmlns:d3p1-"http://v8.1c.rti/8.1/data/enterprise/cunent-config" xsl:type='d3p1:CatalogRef.HoMeHKnaTypa"> 56167a13-f50b-11dc-b151-001617c01d7d</value> </parameterValue> Мы видим, что условие отбора добавлено в параметр Условие вирту- альной таблицы Продажи.Обороты, а параметр (&П) заполняется значением ссылки на элемент справочника. СПРАВОЧНИК РАЗРАБОТЧИКА В данном разделе подробно рассказывается об отдельных функциях системы компоновки данных. Раздел не содержит сквозных примеров, поэтому его можно использовать как справочник. Общие возможности Получение итогов по всем датам в выбранном периоде При разработке отчетов с использованием системы компоновки данных, имея детальные записи, мы можем надстраивать над ними итоговые записи, формируя их по какому-то признаку. Если детальные записи обладают периодичностью (например, имеют поле Дата), то мы можем формировать итоговые записи, суммируя значения детальных записей, например, за каждый день. При этом отчет будет выглядеть красиво только в том случае, если у нас есть детальные записи для каждого дня. В противном случае итоговые записи будут сформированы только для тех дней, для которых есть детальные записи (рис. 16.357). Обычно пользователи хотят видеть отчет, в котором итоговые записи присутствуют в отчете для всех дней, независимо от того, есть ли внутри детальные записи или нет (рис. 16.358).
® О W Отчет попрей.- (ЮПреапрмятие) Й 1Л \с5 151 'П1[ М М* М- - - □ X Отчет по продажам Вариант отчета [Основной| | Выбрать вариант... | | р> Сформировать | Настройте,- Все действия’ । (?) и ЕЕ I Параметры Период: 01.01 201 2-31.01 2012 I (0000000011 000 Автоматика" 13 000,001 20,001 20Д0 1—I /Январь. 2012 иш,и| Ш.М 2839 1 к. 12012012 13 000,00 100,00 2839 J 000000005) ООО "Атлант** IUB.HI 2B.HI 2830 1—1 /Январь. 2012 9 000,001 100,001 &о4 т 1 13012012 4 000,00 44,441 839 ) Ч. 15012012 5 000301 55,561 11,11 / ь 000000006) 000 Хтаадерт** 4Ш,М| 4MAI 1030 м /Январь. 2012 4Ш,Н| 4A0.0&I 4BJI1 1 Ч 14012012 4 500ДО | 100301 1030 > н OOOMUIM Митиль" /Январь. 2012 16 500,001 100,001 41,11* L к. 12012012 16000301 юодо 1 41.1L, ▼ 1 Рис. 16.357. Группировка по периоду без дополнения Рис. 16.358. Группировка по периоду с дополнением «Дань» в интервале 10.01.2012-20.01.2012 Профессиональная разработка в системе «1С:Предприятие 8»
Для решения этой задачи система компоновки данных позволяет указы- вать для группировок дополнение периодов с заданной периодичностью в указанном интервале. Для примера рассмотрим Отчет по продажам (стр. 181), который выводит информацию о продажах номенклатуры за указанный период. Например, необходимо получать данные о продажах по дням, вне зависимости от того, были ли движения за эти дни. Для отчета разработан вариант настроек Основной, содержащий группи- ровку по контрагентам с вложенными в нее группировками ПериодМесяц и ПериодДень, и вариант настроек ДинамикаПродаж, содержащий диаграмму с группировкой в сериях по полю Контрагент, а в точках - по полю ПериодДень (рис. 16.359). Вариант "Основной" отчета "Отчет по продажам" Добавить’ । у । х Ф Ф । EJB gS Структура отчета ® 0|ЩО •9 0“ Контрагент •S 0“ Период, месяц 0™ Период, день Вариант "Динамика продаж" отчета "Отчет по продажам1 Добавить’ I ill | х Ф ф IIJB 5S Структура отчета ® 0|ЩО •= 0lu Диаграмма •? Точки 0™ Период, день •: Серж 0он Контрагент Рис. 16.359. Структура отчета Результат отчета с группировкой по периоду без дополнения будет выгля- деть следующим образом (рис. 16.360, 16.361). @ С- W Отчет по прсда... (1С:Предприягие) iffd Li VJ |§] 'j!il '311 ” - □ X Отчет по продажам Вариант отчета: | Основной| | Выбрать вариант... i| | 1> Сформировать 11 ПЗ Настройка... Все действия ’ i (?) В Период Прошлый месяц Параметры Период: 01.012012-31.012012 | группировке 000000001) ООО “Автоматика' Январь. 2012______________ 12.01 ^012______________ 000000005) ООО "Атлант" Январь. 2012______________ 13312012________________ 16312012________________ 000000006) 000 Хтецдарт" Январь. 2012______________ 14.01.2012______________ 000000007) 000 Хтиль" Январь. 2012______________ 12.01.2012______________ 13 000,00 13 000,00 13 000до 9 000,00 9 000,00 4 000до 5 000ДО 4 000,00 4500,00 4 500Д0 18 000,00 18 500,00 18 500Д0 100,00 100 до 20,89 100,00 55,56 10,89 100,00 100 ДО 28,89 20,00 2839 20,00 20,00 839 16Д0 10,00 10.00 еоодм» 100 до Рис. 16.360. Группировка по периоду без дополнения Том 2
LG п pa вон ник] разработу и ка] @ W Отчет по продажам • Демонстрационная конфи... (1С:Предприягие) itnl tgj |q 1S1 Jin] 31I - □ X Отчет по продажам Вариант отчета: | Динамика продаж| |: Выбрать вариант... J| Рис. 16.361. Диаграмма с группировкой по периоду без дополнения Как ввдно, дни, за которые отсутствовали движения, не выводятся в отчет, что не позволяет оценить динамику продаж. Чтобы включить данные о продажах за любые периоды, воспользуемся дополнением периодов. Выберем вариант отчета Основной и выполним команду Все действия ► Изменить вариант... Затем выделим в структуре отчета группировку ПериодДень и на закладке Группируемые поля установим тип дополнения День (рис. 16.362). Нажмем кнопку Завершить редактирование, снимем признак использо- вания отчетного периода и выполним отчет. В нем выводятся данные о продажах с периодичностью в день, даже если за эти дни не было движений (рис. 16.363).
ГлаваИ 6лСложнй1ёТаналитинё'скиеТотлётй1 @ Вариант "Основной” отчета "Отчет по продажам*'-Демонстрационная конфигурация "Система компоновки дайн.. (ЮПредприятие) X Вариант "Основной" отчета "Отчет по продажам" В се действия* Структура отчета Q] Отчет т- 0™ Контрагент д™ Период, месяц 0™ 01 'йй 'ой Ijffl qS oi ой qS |ТГ1 Парам... Гп1 Польз... I |Щ Группи... I л! Поля |М Отбор |U>1 Сортир... Услов... lift Допол... Выбрать Все действия* Новое поле i Новоеаето поле I й i Ф Ф Все действия* Доступные поля Поле @ = Период, день Тип дополнения = Период,день = Период, месяц * J Количество J Стоимость без дополнения Год Пол<годие Кваргвя Месяц Декада Неделя иив Час Минута | Завершить редактирование | Отмена i Все действия * i Рис. 16.362. Установка дополнения группировки Рис. 16.363. Группировка по периоду с дополнением «День»
Однако, как мы видим, периоды дополняются только в интервале дат, за которые были движения. Чтобы изменить ситуацию, можно указать фиксированный интервал, в котором будут дополняться периоды. Для этого нужно ввести даты в колонки Начальная дата периода и Конечная дата периода (рис. 16.364). i*tl Пер.. ifl,1 Пол. 33 Г₽!Г • ,ig Поля -М Отбор и) Сорт.. afi Усл Дол.. Выбрать Вое действия- ^jjJHoeoenone Ноеоеаетопом X V О Все действия’ Тип дополнения Начальная дата лесмооа -> Период, деть 10.01.2012 0:0000 Конечтая дата периода Рис. 16.364. Установка интервала дополнения периодов При этом периоды будут дополняться не только в интервале дат, полу- ченном из набора данных, но и с начальной даты до конечной даты (рис. 16.365). '•Ф Z- U Отчетпопродажам-... (^Предприятие) ,jn| 1д х’ Й ЯП iiJ Отчет по продажам Вариант отчета: Основной р Сформировать Ио Настройка... [В : Д| Парим Параметры: Период: 01Д1 ЛИ 2 -31JJ1 ЛИ 2 Прошлый месяц Выбрать вариант . Все действий’ ф 13 000 ,80___________100,00 ____________28,89 13000,00___________100 Q0____________28Q9 OOOOOOI_______28О0|____________20,00 'ООООООГ_________100,ВО? ~ ~ ~ ~ 2pjf0~ 4 00000___________44,44 _________8,89 5000,00____________55,89____________11,11 4500,801 10,80 45O0Q0I 100,80 10,80 10,80 4 50000_________100 QO__________10Q0 Январь.2012______________ 10.01.2012_____________ 11.01.2012_____________ 12.01.2012_____________ 13.012012______________ 14.01.2012_____________ 15.012012______________ 16.012012______________ 17.012012______________ 18.012012______________ 19.012012______________ 2801.2012______________ (080000005) ООО "АНИИТ" ~Янва~рьЛ012_______________ 1001.2012______________ 1101.2012______________ 1201.2012______________ 1301.2012______________ 14.012012______________ 15.012012______________ 1601.2012______________ 17.012012______________ 1601.2012______________ 1901.2012______________ 28.012012______________ (080008000) 000 Хтащарт" Январь.2012______________ 1001.2012______________ 1101.2012______________ 1201.2012______________ 1301.2012______________ 14.012012______________ 15.012012______________ 1601.2012______________ 1701.2012______________ 1901.2012______________ 1901.2012______________ 28.012012 Рис. 16.365. Группировка «ПериодДень» с дополнением «День» в интервале 10.01.2012-20.01.2012 Профессиональная разработка в системе «1С:Предприятие 8»
В качестве начальных и конечных дат периода можно использовать не только даты, но и перечисление ТипДополненияПериодаКомпонов- киДанных (день, неделя, месяц, год и т.п.), а также Поле компоновки данных, например, поля параметров отчета. Для выбора типа следует очистить содержимое поля и воспользоваться кнопкой выбора типа. Подробнее об этом рассказывалось на стр. 188. Рассмотрим эти варианты на примере диаграммы этого отчета. Для этого выберем вариант отчета Динамика продаж и выполним команду Все действия к Изменить вариант... Установим для группировки диаграммы ПериодДень тип дополнения Неделя и выберем тип Поле компоновки данных (рис. 16.366). fffl Пара... Гп"1 Польз... | ffi Групп... | Поля Отбор Сорти... jiffl Услов... flfl Допол... Рис. 16.366. Выбор типа данных для указания интервала дополнения Если в качестве начальной и/или конечной дат периода используется поле компоновки данных, то дополнение будет осуществляться до даты, полученной из этого поля. Им может быть поле параметра или поля отчета - владельца (если дополнение происходит во вложенном отчете). Для примера воспользуемся для установки интервала дополнения пара- метрами - начало и конец периода (рис. 16.367). ДР Пара... [&} Польз... | fffl Трупа.. | Поля Отбор Сорти... jjffi Услов... Qfl Допол... Выбрать Вседействия-т (ф Новое поле i Новое авто поле i Q В се действия ▼ Доступные поля ' Поле Тип дополнения •>' = И1ЯЯМ9В1 Начальная дата периода Конечная дата периода = Перишьдень @ = Период,день Неделя = Период, месяц J Количество •:+ J Стоимость = ПараметрыНачало периода Рис. 16.367. Установка интервала дополнения периодов с помощью полей компоновки данных - параметров При этом результат будет дополняться в том периоде, который указан в параметрах данных отчета, то есть интервал дополнения периодов будет динамически меняться в соответствии с тем, какой период формирования отчета задаст пользователь (рис. 16.368). Том 2
LG п pa вон ник] разработу и ка] ® Vf Отчет по продажам • Демонстрационная конфи-,,, (ЮПрмприягие) ijnl tgj |<i u? 1S1 'ш! з‘11 - - □ X Отчет по продажам Вариант отчета | Динамика продаж| |; Выбрэть вариант... j| | t> Сформировать 11 Настройка... Все действия - i Рис. 16.366. Диаграмма по периоду с дополнением «Неделя» в интервале отчетного периода Если в качестве границы интервала используется значение, имеющее тип ТипДополненияПериодаКомпоновкиДанных, то дополнение будет осущест- вляться до ближайшей границы выбранного типа периода. Так, если в качестве начальной и конечной дат периода выбрать Месяц, то допол- нение будет осуществляться с начала месяца первой даты, присутствующей в группировке и до конца месяца последней даты, присутствующей в группировке. Изменим Основной вариант отчета. Установим для группировки ПериодДень дополнение День и в качестве границ интервала выберем значение Месяц, имеющее тип ТипДополненияПериодаКомпоновкиДанных (рис. 16.369, 16.370). Нажмем кнопку Завершить редактирование, установим произвольный отчетный период и выполним отчет. В результате дополнение произойдет по дням в пределах месяца, хотя отчетный период задан с 10.01.12 по 20.01.12 (рис. 16.371). SO
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 dtl п«р* iffi rpjFin.. _ jg Поля _ ;jtfl Отбор 111 Сорта. /*! Услое . nft Допол . Выбрать Вседействия- ^Наоеполе Новое вето поле Все действия' X V О Доступные поля = Период, день = Период, месяц Поле Нача<ьная дата периода 0 Период, день Тип дополнения Конечная дата периода СДенГ J Спм-юсть Выбор типе данных Дата Поле компоновки данных Рис. 16.369. Выбор типа данных для указания интервала дополнения Д Пара., [ft} Полая., | £Щ Групп... | Поля Отбор Qj] Сорта... gfi Услое. [Д Допол, Выбрать Все действий’ (^Ноеоеполе i Новое авто поле । X । Ф Q Вседействия- Дост«рме поля = Период. ден> = Период, месяц J Количество J Сгоииость Поле Типдополнения Начальная дата периода Конечная дата периода 0 = Период, день День Mecfli Рис. 16.370. Установка интервала дополнения периодов с помощью перечисления «ТипДополненияПериодаКомпоновкиДанных» Рис. 16.371. Группировка «ПериодДень» с дополнением «День» в интервале «Месяц»
Изменим вариант отчета Динамика продаж. Если выбрать в качестве границ значение Неделя, то периоды будут дополняться с начала недели и до конца недели (рис. 16.372). ДД Пара.. [ft1} Польз... | Гилл... | flg Поля Отбор Qfj] Сорги... Услов... ftg Допол... Выбрать Все действия» Новое поле | Новое авто поле । X I Q В се действия» Доступные поля $ = = Период, день = Период, месяц +‘ J Количество £ J Стоимость | Поле Тип дополнения I Начальнаядета периода Конечная дата периода ® = Периоддень День Рис. 16.372. Установка интервала дополнения периодов с помощью паречисления «ТипДополненияПериодаКомпоновкиДанных» Выполним отчет. Диаграмма будет выглядеть следующим образом (рис. 16.373). @ >3, Отчет го продажам Демонстрационная конФигу... (1С.Предприягие) taJ Ld u? 1S1 'ш| зГ1 - - □ X Отчет по продажам Вариант отчета: [Динамика продаж | [ Выбрать вариант... j| Рис. 16.373. Диаграмма по периоду с дополнением «День» в интервале «Неделя» Профессиональная разработка в системе «1С:Предприятие 8»
Существует следующая особенность для отчетов, в которых группи- ровка по периоду вложена в группировку по объемлющему периоду. Если для дочерней группировки установить в качестве начальной и конечной даты конкретные даты, то дополнение произойдет в рамках указанного периода, то есть в отчет могут попасть данные, которые вовсе не находятся в родительской группировке. Для того чтобы дополнение дочерней группировки происходило только в интервале родительской группировки, нужно указать в качестве начальной и конечной дат дополнения периода тип дополнения периода - период родительской группировки. Характеристики В платформе «1С:Предприятие» есть специальный объект - План видов характеристик. С помощью него можно создавать механизмы для того, чтобы пользователь имел возможность создавать и описывать произ- вольные характеристики для каких-либо объектов информационной базы. Например, для описания свойств номенклатуры пользователь может создать такие виды характеристик, как Цвет, Качество и т.п., и задать их значения. Система компоновки данных позволяет использовать эти характерис- тики при разработке отчетов. То есть пользователь может отобразить поля характеристик в отчете, установить по ним отбор, условное оформление и т.д. Однако применить характеристики можно только после запуска отчета из режима 1С:Предприятие. Это связано с тем, что сначала должен быть выполнен запрос, извлекающий характеристики из базы данных. Характеристики объектов конфигурации можно описывать в свойстве Характеристики этих объектов, а можно описывать в каждом конкретном отчете. Существуют различные варианты хранения дополнительных характеристик объектов конфигурации и их значений: когда в качестве источника характеристик указывается план видов характеристик, а значения характеристик находятся в регистре сведений. При этом один план видов характеристик хранит виды характеристик только для одного объекта конфигурации; когда план видов характеристик хранит виды характеристик для разных объектов конфигурации, а значения характеристик находятся так же, как и в предыдущем варианте, в регистре сведений; когда значения характеристик хранятся не в регистре сведений, а в справочнике, например, или в табличной части справочника; когда в качестве источника характеристик указывается не план видов характеристик, а табличная часть справочника, которая хранит ссылки на виды характеристик. ПОДРОБНЕЕ Том 1, глава 9, раздел «Хранение дополнительных характеристик». Том 2
G п pa вон ник] раз р а б.отл и ка Описание характеристик в отчете Рассмотрим вариант, когда характеристики объекта конфигурации описываются в запросе конкретного отчета (более подробно этот пример рассматривается в разделе «Примеры разработки отчетов» на стр. 177). Для визуального описания характеристик в системе компоновки данных используется конструктор запросов, закладка Харак- теристики (рис. 16.374). 11) Констрдктор заироса □ X Таблииыипаяя Грцпдфоека Условия Дополниге»ьно Ofeetmeitta/flce... Порядок Компснсекааат.. Характеристик Пакет запросе Источник jj & X Виды характеристик Иетсеек Значетыя характеристик _ _ _ значений _ . _ _ Поле клоча Повнлеми Полетта значения Поле объекта Поле вида Псе значения Пла^идовХарактерисгик.ВтьХарактеристик Таблица РегистрСведений.Допол»ыгельныеХарактеристи<м Ссы/ка Наплюем»» ТюЗначемм Объект ВиаХарактермстиш Значет*«Характерисп«и Запрос < Назад Далее > ОК | Отмена Справка Рис. 16.374. Описание характеристик в конструкторе запроса В описании характеристики указывается: тип, для которого определяются характеристики; описание видов характеристик; описание значений характеристик. Характеристики описываются для определенного типа. Например, можно описать характеристики для типа СправочникСсылка.Контрагенты или СправочникСсылка.Номенклатура. Описание видов характеристик Для того чтобы система компоновки данных выдала пользователю список полей-характеристик, необходимо описать, откуда получать виды харак- теристик. О каждой характеристике системе необходимо знать следующую информацию: из какой таблицы или запроса получать виды характеристик; Поле ключа - ключ характеристики. По данному ключу характерис- тика будет находиться в списке значений характеристик. Поле ключа может иметь любой тип, для которого может использоваться сравнение в языке запросов; Поле имени характеристики - имя, под которым пользователь вводил характеристику. Например, «масса», «длина», «рост» и т.п. Значение этого свойства будет использоваться в качестве имени поля, создавае- мого для характеристики;
I ЕлаваИ 6nG лояаТыеТанагтитйческйеТотяеты | Зап Поле типа значения характеристики - значения какого типа могут содержаться в характеристике. Данная информация используется в отборе для фильтрации по полю-характеристике. Может иметь тип ОписаниеТипов либо произвольное значение. Если тип значения характе- ристики не указан, то типом будет считаться тип Булево. Описание значений характеристик При выполнении отчета системе компоновки необходимо получать значения выбранных пользователем характеристик. Для получения характеристик системе необходима следующая информация: из какой таблицы или запроса получать значения характе- ристик. Поле объекта - объект, для которого требуется получить значение характеристики; Поле вида характеристики. В данном поле будет искаться значение ключа, полученного в списке видов характе- ристик; Поле значения характеристики. Из данного поля будет полу- чаться значение характеристики. Если поле значения не указано, то значение характеристики будет иметь значение Истина, если в таблице будет найдена запись для характе- ристики объекта, и Ложь в противном случае. В приведенном примере рассмотрен самый простой и распро- страненный случай, когда виды характеристик хранятся в плане видов характеристик, а значения характеристик - в регистре сведений. Характеристики описываются для типа Справочник.Контрагенты, список видов характеристик получа- ется из таблицы ПланВидовХарактеристик.ВидыХарактеристик, в качестве ключа характеристики используется поле Ссылка, в качестве имени характеристики используется поле Наименование, в качестве типа значения - поле ТипЗначения. Значения характеристик получаются из таблицы РегистрСведений.ДополнительныеХарактеристики. Объектом характеристики в данной таблице является поле Объект, видом характеристики - поле ВидХарактеристики, а значение находится в поле ЗначениеХарактеристики (рис. 16.375). В результате визуального описания характеристик в конструкторе запроса платформа добавит в запрос секцию описания характеристик, начина- ющуюся с ключевого слова ХАРАКТЕРИСТИКИ. В следующем запросе описываются характеристики для полей типа СправочникСсылка.Контр- агенты (листинг 16.87). 0Б •+ ttU Номенклэт Q I Конграгеш •* tt I Склад © Кош груктор эат Табл» (ыиполя ф С ) & X EI План еи> | к Осисви Подсист Функци Иерарх» Данные Нумера! Формы Команд) Макеты Ввод на Права Обмен л Прочее Рис. 16.375. <
<т Н Регистры сведений ура Планы видов характеристик * ВидыХарактёристик I 1— Измерения 1_» Обьек -> 1_» ВиоХа| актерифики J Ресурсы • J Знач а^ристи^и троса Г руппировка Условия Дополнительно Обьединения/Псе... Поря ок Компонс жаданн.. J Характеристики | Пакет запросов И гочник | С JOB Виды характеристик । Поле ключа Пояе имени Поле типа значения ПланВцдоеХаракгеристик.ВиШ9рСарактеристик Ссыгка Наименование ТипЗпачотыя , -----%------------------------------- Значения характеристик^ Поле значения Таблица РегистрСв дениАДополн^ельныеХарактери^ики __________Объект_______ВидХарактеристики ЗначешеХарактеристичи 1 Исто ник 2 энаш тий ’ _ . . _ i ъ f Поле объекта Полевщц jl ОК | | Отмена | | Справка | □ X Звязь объектов конфигурации и описания характеристик в конструкторе запроса Листинг 16.67. Текст запроса с использованием характеристик ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты {ХАРАКТЕРИСТИКИ ТИП(Справочник.Контраганты) ВИДЫХАРАКТЕРИСТИКПланВидовХарактеристик.ВидыХарактеристик ПОЛЕКЛЮЧА Ссыпка ПОЛЕИМЕНИ Наименование ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения ЗНАЧЕНИЯХАРАКТЕРИСТИКРегистрСведений.ДополнительныеХарактеристики ПОЛЕОБЪЕКТА Объект ПОЛЕВИДА ВидХарактеристики ПОЛЕЗНАЧЕНИЯ ЗначениеХаракгеристики) Профессиональная разработка в системе «1С:Предприятие 8»
В предложении ХАРАКТЕРИСТИКИ тип указывается в скобках после ключе- вого слова ТИП. Типы, входящие в составной тип, перечисляются через запятую. Виды характеристик описываются при помощи ключевых слов ВИДЫХАРАКТЕРИСТИК, ПОЛЕКЛЮЧА, ПОЛЕИМЕНИ, ПОЛЕТИПАЗНА- ЧЕНИЯ. После ключевого слова ВИДЫХАРАКТЕРИСТИК идет имя таблицы, из которой будут получаться виды характеристик, либо в скобках текст запроса, при помощи которого получаются виды характеристик. После ключевых слов ПОЛЕКЛЮЧА, ПОЛЕИМЕНИ, ПОЛЕТИПАЗНАЧЕНИЯ указы- ваются имена полей для получения ключа, имени и типа значения характеристики соответственно. Значения характеристик описываются при помощи ключевых слов ЗНАЧЕНИЯХАРАКТЕРИСТИК, ПОЛЕОБЪЕКТА, ПОЛЕВИДА, ПОЛЕЗНАЧЕНИЯ. После ключевого слова ЗНАЧЕНИЯХАРАКТЕРИСТИК указывается имя таблицы, из которой будут получаться значения характеристики, или, в скобках, текст запроса, при помощи которого будут получаться значения характеристики. После ключевого слова ПОЛЕОБЪЕКТА указывается имя поля, в котором содержится объект. После слова ПОЛЕВИДА указывается поле ключа характеристики, а после слова ПОЛЕЗНАЧЕНИЯ - имя поля, из которого будут получаться значения характеристики. В данном примере (см. рис. 16.375) виды характеристик можно напрямую получать из плана видов характеристик, а значения характеристик - из регистра сведений. Но возможны более сложные случаи, когда, например, значения характеристик могут храниться не в регистре сведений. Или в плане видов характеристик может храниться список характеристик не только для одного нужного нам типа данных, но и для других типов. В этом случае можно воспользоваться запросом, который получает нужные данные, но более простым и универсальным вариантом является описание характеристик в метаданных, которое будет рассмотрено ниже. В приведенном примере виды характеристик получаются при помощи запроса, в котором получаются только записи с неустановленной пометкой удаления. Указание полей происходит так же, как и в случае с таблицей, только используются не поля таблицы, а поля запроса (листинг 16.88). Листинг 16.88. Получение списка характеристик с помощью запроса ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.СтоимостьОборот ИЗ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты {ХАРАКТЕРИСТИКИ ТИП(Справочник. Контрагенты) ВИДЫХАРАКТЕРИСТИК (ВЫБРАТЬ ВидыХарактеристик.Ссылка, ВидыХарактеристик.Наименование, Том 2
G п pa вон ник] раз р а б.отл и ка ВидыХарактеристик.Т ипЗначения ИЗ ПпанВидовХарактеристик.ВидыХарактеристик КАК ВидыХарактеристик ГДЕ ВидыХарактеристик.ПометкаУдапения = ЛОЖЬ) ПОЛЕКЛЮЧА Ссылка ПОЛЕИМЕНИ Наименование ПОЛЕТИПАЗНАЧЕНИЯ ТипЗначения ЗНАЧЕНИЯХАРАКТЕРИСТИКРегистрСведений.ДополнительныеХарактеристики ПОЛЕОБЪЕКТА Объект ПОЛЕВИДА ВидХарактеристики ПОЛЕЗНАЧЕНИЯ ЗначениеХарактеристики) Для описания запроса при описании списка характеристик в конструк- торе запроса следует указать в качестве источника видов Запрос и, нажав кнопку выбора в поле Виды характеристик, создать запрос (рис. 16.376, 16.377). а □ X Таблицы... | Группиров... Условия Дополнит... Объедине... Порядок Итоги Построите... Пакет зап... Q « База данных Q? Константы (Ш Справочники Q Документы {.} Перечисления •A S ПланыВцдовХарактеристик ♦ •А Н РегистрыСведенЛ @ РегистрыНакопления © е I xS I Таблицы El LiiibiXapdKTepHCTui; - 3 ВидьКарактеристик = Ссылка в ВерсияДаюмс = ПомегкаУдаления = Прадопраделенньй в Код = Наименован* в = Представление ____________________________ Поля f 9 ВиоьКарактеристик.Ссылка ’ I = ВиоьКарактеристик.Наименоеание i = ВиоьКарактеристик. ТипЗначения | Запрос | | Далее > || ОК || Отмена | | Справка | Рис. 16.376. Создание полей запроса для получения видоа характеристик Таблицы... Группирсв... | Условия | Дополнит... Обьедине... Порядок Итоги Построите... Пакет зап... Поля - Ш ВидьХарактеристик в Ссьика = ВерсияДанных х Е> Номер П.. Условна IП ометкаУдаления I в Предопределенный в Код = Наименование = ТипЗначения = Представлен* | Запрос | | < Назад | | Далее > | | ОК | | Отмена | | Справка | Рис. 16.377. Создание условий запроса для получения видов характеристик Аналогичным образом можно указать запрос и в качестве источника значений характеристик. ы и □ X
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В результате закладка Характеристики в конструкторе запроса примет вид (рис. 16.378). Ш Капстрдкгор эаироса * Таблицы и поля Грулпфовка Условия Дополниге«но ОбМАжетя/Лсе... Порещок Компонсекаоагм.. Характеристики Пакет запросе Запрос Источник вил= Поле клоча Виоыхарактеристик Истолек Значения характеристик Лолеиметм Лоле типа значе зяачен^1 Поле объекта Лолевиаа Поле значения Т аблица РегистрСевАемаДополмте1ЫмХарактеристиш Объект ВиоХарактермсгиш Значенийар актера.. ВипьКарактесмспк.Ссы'м. ВиЫ<арактерисгмк.Намвноеам«. ВгаьХарактерисгмк. Т шЗнвчемм ИЗ ПланВидовХарактерисгик.Втьйарактеристик КАК ВиньХарактеристик ГДЕ ТипЗначения < Назад Далее > ОК | Отмена Справка Рис. 16.378. Описание характеристик в конструкторе запроса Итак, мы рассмотрели возможность описания характеристик в каждом конкретном отчете. Безусловно, этот вариант менее универсален, чем описание характеристик в метаданных, рассмотренное ниже. Но этот вариант может понадобиться для специфического применения характеристик в конкретном отчете. При этом если в запросе схемы компоновки данных указано описание характеристик для некоторого типа, то для полей запроса с таким типом используются эти характерис- тики, а характеристики, описанные в метаданных, не используются. Если для некоторого типа характеристики в запросе не указаны, то для этого типа используются характеристики, описанные в метаданных. Описание характеристик в метаданных Рассмотрим вариант, когда характеристики объекта конфигурации описы- ваются в свойстве объекта Характеристики (более подробно этот пример рассматривается в разделе «Примеры разработки отчетов» на стр. 184). Этот вариант является наиболее универсальным, поскольку если харак- теристики описаны в самом объекте конфигурации, то все отчеты и динамические списки, основанные на системе компоновки данных, могут использовать эти характеристики. Таким образом, описав один раз связь между объектом конфигурации и его характеристиками, разработ- чику больше не придется в каждом отчете, использующем характеристики объекта, указывать, где и каким образом хранятся его характеристики. Диалог для описания характеристик можно вызвать, нажав кнопку Характе- ристики на закладке Данные, в окне редактирования объекта конфигурации, например, справочника Контрагенты (рис. 16.379). Команда Характерис- тики также доступна в контекстном меню дерева объектов конфигурации и в палитре свойств этих объектов. В диалоге описания дополнительных характеристик объекта конфигу- рации нужно указать, где хранятся виды характеристик и значения этих характеристик.
ttt) Справочник Контрагенты - □ X Основные Подсистемы Функциональные опции Иерархия Владельцы | к Данные Нумерация Формы Команды Макеты Ввод на основании Права Обман данными Прочее | Действия -1 | <Наэод 11 Далее> | | Закрыть 11 Справка | Рис. 16.379. Вызов диалога описания характеристик справочника «Контрагенты» В этом примере мы покажем другой способ хранения характеристик контрагентов. Здесь в качестве источника характеристик используется план видов характеристик ВидыХарактеристик, а значения характеристик находятся в табличной части ДополнитепьнаяИнформация справочника Контрагенты. Данный способ хранения характеристик контрагентов описы- вается в свойстве Характеристики справочника Контрагенты (рис. 16.380). •- ИВ Справочники - Ш Дополнительные характеристики объекта метаданных ф [Й х Виды i эрактеристик Поле » точа Поле отбора видов = Реквизиты Значение отбора видов ==== •- Ш Табличные части - Efi ДополнигельнаяИнФормация ° ДополнфельноеСвойство Ссылка ДополнигельноеСвойство ЗначениеСвойства Ссылка | ОК || Отмена 11 Справка | Рис. 16.380. Описание дополнительных характеристик справочника «Контрагенты» Поле Ссылка плана видов характеристик ВидыХарактеристик используется в качестве поля ключа характеристики. Поля Поле отбора видов и Значение отбора видов используются в случае, когда источник видов характеристик хранит характеристики разных объектов конфигурации, для отделения Профессиональная разработка в системе «1С:Предприятие 8»
характеристик одного объекта конфигурации от другого. В данном случае они не нужны, так как план видов характеристик хранит характеристики только для контрагентов. В качестве поля объекта указывается поле Ссылка табличной части ДополнительнаяИнформация справочника Контрагенты; в качестве поля ввда - реквизит табличной части ДополнительноеСвойство (тип значения ПланВидовХарактеристикСсылка.ВидыХарактеристик), в качестве поля значения - реквизит табличной части ЗначениеСвойства (тип значения Характеристика.ВидыХарактеристик). Таким образом, табличная часть ДополнительнаяИнформация будет хранить значения характеристик номен- клатуры так же, как и регистр сведений. В общем случае характеристики объекта конфигурации могут нахо- диться в разных местах, по-разному храниться, и все это можно описать в диалоге описания характеристик объекта конфигурации, в одном месте, с помощью нескольких записей. Использование характеристик в режиме «ЮПредприятие» На основе видов характеристик система автоматически создаст для объекта Контрагент два дополнительных поля - Регион и Категория. Протестируем использование этих характеристик в режиме 1 С: Предприятие на примере отчетов Отчет по продажам и Продажи контрагентам. В режиме 1 С: Предприятие выберем Основной вариант отчета Отчет по продажам и выполним команду Все действия ► Изменить вариант... На закладке Поля характеристики отображаются в списке реквизитов поля Контрагент и ничем не отличаются от обычных реквизитов. Управлять их выводом можно на закладке Дополнительные/Другие настройки (стр. 316). Перенесем в список полей поле Контрагент.Регион (рис. 16.381). Iffi Пара.. гМ Польз... fffl Трупа.. I hl Поля j ГЬЙ Отбор nfrl Сорти.. jiffl Услов... П-fl Допол... Т вкущий эиемент имеет собственные настройки выбранных полей (для детальной настройки элемента) Выбрать Все действия ▼ Добавить новое поле i Сгруппировать поля i X Q i §2 Все действия ▼ Доступные поля - в Контрагент = Версиядаюых .+• И Дополнительная информ... С? ° Категория ль Код = Наименование = Пометкаудаления = Предопределенный .+• = Родитель Поле Выбранные поля 0 J Стоимость @ J Стоимость.^ в группировке 0 J СтамостьЛ общий ЕЕ = Контрагент.Регион Рис. 16.361. Список доступных полай в отчете с использованием характеристик контрагентов Теперь используем в отборе характеристику Категория. На закладке Отбор создадим новый элемент отбора по полю Контрагент.Категория со значе- нием Постоянный партнер (рис. 16.382). Том 2
Рис. 16.382. Использование характеристик в отборе Нажмем Завершить редактирование и сформируем отчет (рис. 16.383). Рис. 16.383. Результат отчета с использованием характеристик контрагентов В результате характеристика контрагента Регион теперь отражается рядом с его наименованием, и в отчете присутствуют данные только по тем контрагентам, для которых значение характеристики Кате- гория (в табличной части ДополнительнаяИнформация справочника Контрагенты) соответствует заданному отбору (рис. 16.384). 000*'Атланг'*(Конграгекты) (1С:Предтфиятие) 'tn г I □ X ООО "Атиент" (Контр... ООО "Атлант" (Контрагенты) Перейти Записать и закрыть ml Все действия’ Дополнительные характе... Кой: 1000000005 На1аиеноаамие:11аимв|И1!ЯИВ Роаиге«>: I Постает мы... Q (^Добавить X V О Все действий’ N Дололните<ькое еойство Значение свойства |__Q Регион Москва ^ 2 Категория Постояный партнер Рис. 16.384. Значения характеристик контрагентов в табличной части справочника «Контрагенты»
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Так происходит потому, что в свойстве Характеристики справочника Конт- рагенты описан именно такой способ хранения значений характеристик. Таким образом, мы протестировали использование характеристик конт- рагентов в отчете Отчет по продажам, для которого характеристики описывались не в самом отчете, а брались из описания характеристик в метаданных для справочника Контрагенты. Теперь откроем Основной вариант отчета Продажи контрагентам, в котором характеристики контрагентов описывались в запросе схемы компо- новки данных, и выполним команду Все действия к Изменить вариант... На закладке Поля мы также увидим две дополнительные характеристики контрагентов - Регион и Категория. Перенесем в список полей поле Конт- ра гент.Регион. Нажмем Завершить редактирование и сформируем отчет (рис. 16.385). •it) * и1 Продажи контрагентам-Демонстрационна.. (1С:Преоприятие) 1л х' 1р1 -ПИ VI - - □ X Продажи контрагентам Вариант отчета Основной Выбрать вариант р Сформировать Jo Настроем... Вседействия» Рис. 16.365. Результат отчета с использованием характеристик контрагентов Мы видим, что характеристика контрагента Регион теперь отражается рядом с его наименованием. Заметьте, что характеристика отражается не для всех контрагентов, а только для тех, у кого есть соответствующая запись в регистре сведений Дополнительные характеристики. Так проис- ходит потому, что в запросе (см. рис. 16.375) мы описали именно такой способ хранения значений характеристик (рис. 16.386). Дополчителэные характеристики ^Создать jj JC С^Найги.. Объект Виа характериетжи 3 Категория Вседействия» Значение характеристики t П осто«м*й партнер ООО "Автомапм" Регион Королев J ООО "Системе" Категория Зарубежный партнер О') ООО "Системе" Регион Москва 5 лс ООО ••Стил»” Категория Постом*й партнер ООО "Стил»” Регион Самсг-Петербург 3 Рис. 16.386. Значения характеристик контрагентов а регистре сведений «Дополнительные характеристики»
Использование категорий При помощи механизма характеристик системы компоновки данных можно описывать и категории-характеристики, не имеющие значений, а имеющие лишь признак наличия/отсутствия. Для примера добавим в план видов характеристик категорию Предоплата и выведем ее в отчете Цены комплектующих от поставщиков. Откроем схему компоновки данных отчета, выделим набор данных Постав- щики и в конструкторе запроса опишем характеристики (рис. 16.387). £0 Конструктор запроса * □ X Таб1Шыиполя Группировка Условия Дололнигегьно Обьетчения/Псе Порядок Компоновкапаж.. Характеристши Пакет запросов Виды характеристж Источник ПланВийоеХарактермстикВидь4«!арактерйсгик Ссы*а иммаюевше Поле ключа Полемиени Поле типа значения Источник Значения характеристик эмачемй Поле объекта Поле вида Поле значения Таблица РегистрСвеАбмАДопомлельныеХаракгеристиси Объект ВидХарактерисгиш < Назад Далее > | ОК | Отмена Справка Рис. 16.387. Описание характеристик в тексте запроса В результате будет создан следующий запрос (листинг 16.89). Листинг 16.69. Получение категорий контрагентов для набора данных «Поставщики» ВЫБРАТЬ ПриходнаяНакпадная.Ссылка, ПриходнаяНакладная.Номер, ПриходнаяНакпадная.Дата, ПриходнаяНакладная.Контрагент ИЗ Документ.ПриходнаяНакпадная КАК ПриходнаяНакладная {ХАРАКТЕРИСТИКИ ТИП(Справочник.Контраганты) ВИДЫХАРАКТЕРИСТИК ПланВидовХарактеристик.ВидыХарактеристик ПОЛЕКЛЮЧА Ссылка ПОЛЕИМЕНИ Наименование ЗНАЧЕНИЯХАРАКТЕРИСТИК РегистрСведений.ДополнительныеХарактеристики ПОЛЕОБЪЕКТА Объект ПОЛЕВИДА ВидХарактеристики) Как видно, в описании характеристик не указано поле ПОЛЕТИПАЗНА- ЧЕНИЯ, а в таком случае считается, что характеристика имеет логический тип. Кроме того, не указано поле ПОЛЕЗНАЧЕНИЯ, из которого будет полу- чаться значение характеристики. В таком случае считается, что значение характеристики - Истина, если характеристика для объекта присутствует в таблице значений характеристик, и Ложь в противном случае. Запустим «1С:Предприятие». В план видов характеристик Виды характе- ристик добавим категорию Предоплата (рис. 16.388). Профессиональная разработка в системе «1С:Предприятие 8»
Виды характеристик 'Создал^ [х] 1 О» Найти.. । Код Наименование “ 000000001 Категория - 000000002 Регион Все действия-* | (?) Т ип значомм ВИВПЗПЯ Значения характеристик @ Виды характеристик (создание) ‘ (ЮПредприятие) ' 'Ш| !Э11 □ X Виды характеристик (... П ерейти Дополнительные характе... Значения характеристик Видь» характеристик (создание) * | Записать и закрыть 1ijHl Все действия* i (?) Код: | | Наименование: |ШН!ЯММ | Тип значения: 13iючамя характеристик ...| Рис. 16.368. Создание новой характеристики в плана видов характеристик В регистр сведений Дополнительные характеристики добавим эту характе- ристику для контрагента ООО «Атлант» (рис. 16.389). Дополнительные характеристики (j^CoMarb XI QHaftrH.. 1 Ц Все действия* i (?) Объект Вид характеристики Значение характеристики л О ООО "Автоматика" Категория Постояшый партнер 1дЗ ООО ''Автоматика” Регион Королев 1 О ООО “Система" Категория Зарубежный партнер ® ООО "Система" Регион Москва J Предоплата >' О ООО "Стиль" Категория Постояшый партнер 1 ООО "Стиль" Регион Санкт-Петербург 1 Рис. 16.389. Значения характеристик в регистре сведений Откроем Основной вариант отчета Цены комплектующих от поставщиков и выполним команду Все действия к Изменить вариант... На закладке Поля, в списке реквизитов поля Контрагент появилась категория Предоплата. Перенесем ее в список полей отчета (рис. 16.390). I Поле Выбранные поля @ = Номенклатура @ о Контрагент ® в Дета ® = Номер ® = Цена ® . = ИИНВИ flfl Пара... Поль... gfl Грут... | Поля j flg Отбор Сорти... gfl Уела.. flg Допа.. Текущий элемент имеет собственные настройки выбранных полей (для двтвяьной настрсСки элемента) Выбрать Все действия* (у) Добооить новое поле i Сгруппировать поля I X i Q I Все действия* Доступные поля = Дата = Контрагент = Версияданных f ЙЗ Дополнительная инфор. = Категория = Код = Наименование = Пометка удаления ° Предопределенный Рис. 16.390. Окно настроек варианта отчета Том 2
LG п pa вон ник] разработу и ка] На закладке Дополнительные/Другие настройки зададим значение параметра Расположение реквизитов - Отдельно, чтобы категория контрагента выво- дилась в отдельной колонке, и Тип заголовка полей - Краткий (рис. 16.391). flfi Пара.. Поль... Грут... Поля Отбор fljf] Сорти.. gf| Уело... | lift Дето... I ТекущЛ элемент имеет собственные дополнительные насгройси В се действия » Г Параметр □ □ □ □ □ 3- Значение Основной Авто Вместе Макет оформления Расположение итогов Расположение полей группировок Расположение грчппирое<ж_____ Расположение реквизитов______ Расположение ресурсов Горизонтально Расположение общим итогов по горизон... Авто Расположение общим итогов по вертикали Авто Т ип заголовка полей________________Краткий______________ Гистограмма обьеьетая О - Типдиаграмьы 'Е Рис. 16.391. Настройка параметров вывода Нажмем Завершить редактирование и выполним отчет. Мы видим, что значение категории Предоплата интерпретируется как Да или Нет в зависимости от ее наличия в регистре сведений Дополнительные характе- ристики для конкретного контрагента (рис. 16.392). @ ' Цены комплектую... (ЮПредгриятив) ieI La ’ ъз @ 'iil м м+ м- / - □ х Цены комплектующих от поставщиков Вариант отчета: [Основной | | Выбрать вариант... | | > Сформировать 11 Настройка... Вседейстеия - i (?) Рис. 16.392. Результат отчета с использованием категории контрагента Теперь используем в отборе характеристику Предоплата. На закладке Отбор создадим новый элемент отбора по полю Предоплата со значением Нет (рис. 16.393). В результате в отчет выводятся только те контрагенты, у которых в регистре сведений Дополнительные характеристики отсутствуют записи с категорией Предоплата (рис. 16.394).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Пара... Поль... g| Грут... Поля | flfl Отбор | Сорги... ijffi Ысло... Qfl Доло... Т екущий элемент имеет собственный отбор (для Фильтрации записей, выводимых в элементе) Выбрать Вседействия^ ^Добавитьковьйэлемент । Сгруппировать условия i X i Все действия» Доступные поля = Дата = Контрагент = Версия данных + Ш Дополнительная инфор... = Категория = Код = Наименование = Пометка удаления в = Предопределенный Поле Вид сравнения Значение - Отбор @ = КонтрагентЛредоплата Равно Рис. 16.393. Настройка отбора с использованием катагории контрагента ® V/ Цены коьллекгую... (^Предприятие) Д |Д IS1 ]П| '311 М М* М- - □ X Цены комплектующих от поставщиков Вариант отчета: [Основной | I Выбрать вариант... | | |> Сформировать 11 ОЗ Настройка... Все действия i (?) Отбор: 1Контрагент,Предоплата Равно “Нет* I Номенклатура Контрагент Веб-камера_______ ООО "Стандарт* Микрофон ООО "Стандарт- Монитор LCD______ ООО "Стандарт* Дата 11.01.201214:20:00 11.01201214:20:00 11.01201211:10:00 Номер Цена Предоплата 000000005 000000005 000000004 1 000,00 Нет 700ДО нет 10 000Д0 Нет t т т Г Рис. 16.394. Результат отчета с использованием категории контрагента Иерархия Система компоновки данных позволяет выводить в отчет иерархические данные. Иерархия может строиться: для групп иерархического справочника (рис. 16.395): ® -з- w ' nig ££ L4 V5 Й «‘I 'эй * . □ х Продажи контрагентам Вариант отчета [Иерархия | |: Выбрать вариант... J | |> Сформировать 11 П5 Настройка.. Все действия ’ । (?) Контрагент Стоимость I Оборот__|________— б Покупатели___________________________________63 ОООДО Т ООО "Автоматика* ' 24 500,00 ООО "Система" 10 000,00 L ООО "Стиль"______________28 500,00 н Поставщики__________________13 500ДО Т ООО "Атлант*_______________9 000ДО [ ООО "Стандарт*_____________4 500ДО Итого 76 500.001 Рис. 16.395. Вывод группировки «Контрагент» с иерархией справочника «Контрагенты»
для произвольного иерархического набора данных (рис. 16.396): ® -3 U ' П Д Q |Д У$ |5| 1 !д| □ х Поступление товаров Вариант отчета: [Иерархия J | Выбрать вариант... | | 1> Сформировать 11 Настройка... В се действия ▼ । (?) [Приход 37,000 — 4,000 4,000 5,000 5,000 ' 8,000 ' 3,000 ' 5,000 ' 20,000 ' 10,000 ' 10,000 37,0001 Номенклатура Товары для сборки___ Мониторы__________ Монитор LCD_____ ОЗУ_______________ Память__________ Основные детали Жесткий диск Материнская плата Прочие детали_____ Веб-камера______ Микрофон________ Итого_______________ Рис. 16.396. Вывод группировки «Номенклатура» с собственной иерархией для детальных записей иерархического справочника (рис. 16.397): Рис. 16.397. Вывод группировки «Детальныа записи» иерархического справочника «Номенклатура» Профессиональная разработка в системе «1С:Предприятие 8»
Иерархические группировки Для примера рассмотрим отчет Продажи контрагентам, который выводит информацию об объемах продаж по контрагентам. Справочник Контр- агенты имеет следующую иерархическую структуру (рис. 16.398). Контрагенты ♦^Создать । |jj> [х] । QНайти.. । Все действия » | {?) Наименование а. Код а т LD Контрагенты в1 С” 000000002 в ООО "Автоматика" 000000001 = ООО "Система" 000000004 = ООО "Стиль" 000000007 •- LD Поставщики 000000003 = ООО "Атлант” 000000005 = ООО "Стандарт" 000000006 ▼ Рис. 16.398. Структура справочника «Контрагенты» Для начала посмотрим, как будет выглядеть отчет без иерархии. Откроем отчет в режиме 1С:Предприятие. Создадим новый вариант отчета Иерархия, содержащий группировку по полю Контрагент с типом иерархии Без иерархии и поле отчета СтоимостьОборот (рис. 16.399). ® Вариант "Иерархия" отчета‘Продажи контрагентам"-Демонстрационная конфигурация "Система... (^Предприятие) X Вариант "Иерархия" отчета "Продажи контрагентам" Добавить ’ I [J I й I О I j® Вседействия ’ Структура отчета ' П1 Ifllj 'Й1 ttS •т Ц) Отчет П§ П-ft Пар... [Й Пол... | fffl Труп... | Поля jg Отбор Сорт... <^| Усл... Qg Доп... | Завершить редактирование | Отмена । Вседействия ~ i (?) Рис. 16.399. Добавление группировки «Контрагент» без иарархии Выполним отчет. Отчет примет вид (рис. 16.400). Том 2
Существуют следующие типы иерархии для группировок отчета: Без иерархии — в группировке выводятся только неиерархические записи; Иерархия — в группировке выводятся как неиерархические, так и иерар- хические записи; Только иерархия — в группировке выводятся только иерархические (родительские) записи. Изменим тип иерархии. Изменим вариант отчета и на закладке Группиру- емые поля для группировки Контрагент укажем Тип группировки — Иерархия (рис. 16.401). ДЕ Пар... Пол... | ffi Груп... | Д§ Поля (jjjj Отбор fifr] Сорт... gfl Усл... flfl Доп... Выбрать Вседействия* Новое поле i Новое авто поле I I ф ф В се действия’1 Доступные поля Поле Тип группировки f а * J СтоимостьОборот ® = Контрагент Рис. 16.401. Установка типа иерархии группировки Выполним отчет. Теперь результат отчета будет дополнен иерархичес- кими (родительскими) записями для выводимых в отчет контрагентов (рис. 16.402). @ -д.' vr' пд о LA • vs a ' WI а) □ х Продажи контрагентам Вариант отчета: |Иераржя I Вь|брагь вариант... J | |> Сформировать || Настройка... Все действий’ i (?) Контрагент Стоимость I Оборот | i Покупатели 63 ОООДЮ ООО "Автоматике" ‘ 24 500,00* ООО "Система* 10 000,00 ООО "Стиль* 20 500,00 Поставщики 13 500.00 ООО "Атлант* 9 000,00 ООО "Стандарт" 4 500,00 Итого 76 500.001 Рис. 16.402. Результат отчвта
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты Изменим тип иерархии. Изменим вариант отчета и на закладке Группиру- емые поля для группировки Контрагент укажем Тип группировки - Только иерархия (рис. 16.403). ИД Пар... ifi} Пол... | Щ Грул... I Поля gj Отбор ДЙ Сорт... jjffi Уел.. цД Доп... Выбрать Вседейстеия» (5^ Новое поле i Новое aero поле 1 X i О Вседействия» Доступные поля J СтоимостьОборот Поле Тип группировки = Контрагент Только иерархия Рис. 16.403. Установка типа иерархии группировки Выполним отчет. В отчет будут выведены только группы контрагентов, то есть записи, имеющие иерархию (рис. 16.404). ® ' и ' П|й ta) LA ’ уз й ' Я □ X Продажи контрагентам Вариант отчета: | Иерархия | || Выбрать вариант.. | | 1> Сформировать 11 Воздействия » i Контрагент Стоимость I Оборот | Покупатеш 63 000,00 Поста» инки 13 500,00 Итого 76 5ВОЛО | — 1Л. Рис. 16.404. Результат отчета Отбор «В группе» Система компоновки данных позволяет отбирать записи, которые нахо- дятся в иерархии некоторого элемента. Для этого в системе предусмотрен вид сравнения В группе (во встроенном языке данный вид сравнения называется ВИерархии). При установке данного отбора в результат будут выводиться записи, имеющие значение, равное указанному, и все записи, располагающиеся ниже по иерархии. Изменим вариант отчета и на закладке Отбор установим отбор < Контр- агент:* <В группе:* -«Покупатели:* (рис. 16.405). Пар.. [ft| Пол... И Труп.. fig Поля I Й Отбор I ОЙ Сорт... Усл.. цД Дол... Т екущий элемент имеет собствен шй отбор (для Фильтрации записей, выводимых в элементе) Выбрать Вседействия» (^Добавигьновыйэлемент । Сгруппировать условия i i Все действия» Доступные поля •*. = Номенклатура = СтоимостьОборот О Параметры Поле •? Отбор @ = Контрагент Вид сравнения Значение Покупатели Равно Не райю В списке В группе из списка Не в списке Не в группе из сп... Не в группе Заполнено Не заполнено Рис. 16.405. Установка отбора
Установим для группировки Контрагент тип иерархии — Иерархия (см. рис. 16.401). Выполним отчет. В результат будут выводиться только записи в иерархии элемента Покупатели (рис. 16.406). ® ' w ' пй О L4 ’ W © ' ®l я! ’ - - □ х Продажи контрагентам Вариант отчет» | Иерархия| lL.Bbiljjparb вариант... j| | i> Сформировать 11 Настройка... Все действия » i (?) Отбор: Контрагент В группе Покупатели' Контрагент Стоимость I ____ Оборот Покупатели 63 000,00 1OQO "Автоматика"_________24 500,00 ООО-Система'________10 000,00 ООО "Стиль*_________28 500,00 Итого 63 000.00, Рис. 16.406. Результат отчета Описание иерархических наборов данных Для иерархических справочников система компоновки данных авто- матически создает специальные наборы данных, при помощи которых и достраивается иерархия. Однако встречаются ситуации, когда требу- ется построить иерархию самостоятельно. Для примера рассмотрим отчет Поступление товаров, который отражает поступление товаров по складам с иерархией номенклатуры, построенной не по группам справочника Номенклатура (полю Родитель), а по полю Мой родитель. Для хранения списка элементов собственной иерархии в справоч- нике Номенклатура создана группа Моя иерархия, на которую ссылаются элементы других групп. Например, в группе Моя иерархия создан элемент Мониторы, для которого поле Мой родитель задано как Товары для сборки. Этот элемент группы Моя иерархия является корневым. Затем в группе Комплектующие для элемента Монитор LCD поле Мой родитель задано как Мониторы. Таким образом, наша иерархия будет двухуровневой (рис. 16.407, 16.408). В схеме компоновки данных отчета Поступление товаров создан набор данных Приход, получающий данные о поступлении товаров при помощи запроса (листинг 16.90). Листинг 16.90. Текст запроса ВЫБРАТЬ ОстаткиНоменкпатурыОбороты.Скпад, ОстаткиНоменклатурыОбороты.Номенклатура, ОстаткиНоменклатурыОбороты.КоличествоПриход КАК Приход ИЗ РегистрНакопления.ОстаткиНоменкпатуры.Обороты КАК ОстаткиНоменкпатурыОбороты Профессиональная разработка в системе «1С:Предприятие 8»
Номенклатура (^Создать i G? Й i Q>Найти., i l Печать i Отчет Вседействия ’ । {?) Наименование □ l 3 Моя иерархия e ISSBffiGSSKi = ОЗУ = Основные детали = Прочие детали = Товары для сборки Код 00000001В 000000022 000000023 000000024 000000027 000000025 @ Мониторы (Номенклатура) (1С:Предприягие) IS1 ГП| 'зЛ □ X Мониторы (Номенкла... Перейти Цены Мониторы (Номенклатура) | Записать и закрыть |1^| Вседействия ’ | (?) Код: [000000022 | Наименование: [ВИМНИЦ j Родитель: [Моя иерархия Q| Видноменклзтурьс [Материалы ^ой родитель: [Товарыдлясборки Рис. 16.407. Элементы группы «Моя иерархия» Номенклатура (^Создать I IJ |дда & [х| i Q Найти... I С', I Печать I Отчет Все действия » | \1) Наименование □ L3 Комплектующие в Веб-камера = Жесткий диск 000000001 000000026 000000005 Матержская плата 000000003 000000028 SSSSI 000000012 000000004 ' □ X = Микрофон д Память_________________________________________________________ @ Монитор LCD (Номенклатура) (1СЛредприяп«) 151 ”1 '311 Монитор LCD (Номен... Перейти Цены Монитор LCD (Номенклатура) | Записать и закрыть 11^1 Все действия ” | (?) Код: 1000000012 | Наименование: [КИИЯМИП | Родитель: [Комплектующие Q| ВидНоменклатуры [Материалы ь..| ^1ой родитель: [Мониторы Рис. 16.408. Элементы группы «Комплектующие» Чтобы выполнить иерархическую группировку, процессору компоновки данных требуется информация об источнике данных для построения иерархии. Для этого в схеме компоновки данных создан набор данных Иерархия, содержащий информацию о текущем элементе справочника Номенклатура и его родителе (листинг 16.91). Том 2
G п pa вон ник] раз р а б.отл и ка Листинг 16.91. Текст запроса ВЫБРАТЬ Номенклатура.Ссылка КАК Номенклатура, Номенклатура.МойРодитель ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Ссылка В(&Ссылка) Для того чтобы этот набор данных получал по иерархии всех роди- телей, должна быть описана связь набора к самому себе. В конструкторе схемы компоновки данных это делается на закладке Связи наборов данных. В качестве выражения источника указывается поле МойРодитель, а в качестве выражения приемника - поле Номенклатура. Таким образом, из каждой записи набора данных будет получено значение поля МойРодитель и будет осуществлен поиск полученного значения в поле Номенклатура в этом же наборе данных, и система рекурсивно получит все записи по иерархии. Так как в запросе записи получаются только для номенклатуры, переданной в параметре Ссылка, то в параметре связи (поле Параметр) указывается, что следует использовать этот параметр, и так как параметр может принимать список значений, устанавливается соответствующий флажок в поле Список параметроа. В параметр Ссылка будет помещено значение связи источника. Также задается связь между наборами данных Приход и Иерархия по полю Номенклатура (рис. 16.409). Отчет Поступление?оваров: ОсновнаяСхемаКомпоновкиДанных _ □ X Наборыданных | Связи наборов дан... | Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы Настройки Ф Ь и Источник связи Приемник связи Выражение источник Выражение приемник Параметр Список параметров Условие св... Начальное... 0... П|38ВСма31 Иерархия /Номенклатура Номенклатура Ссылка @ @ Иерархия Иерархия уМойРодитель Номенклатура Ссылка 0 0 Рис. 16.409. Установка связей наборов данных для построения иерархии ВНИМАНИЕ! В иерархическом наборе данных поле, с которым осуществляется связь основного набора, должно называться так же, как и в основном наборе. Так, в приведенном выше примере в иерархическом наборе данных связуемое поле должно иметь имя Номенклатура. СОВЕТ Поскольку поля иерархического набора данных нужны только для построения иерархии, имеет смысл скрыть их от пользователя. Для этого следует отключить у этих полей доступность настройки. Делается это на закладке Наборы данных конструктора схемы компо- новки данных (рис. 16.410).
Й Отчет ПостцплениеТоваров: ОсновнаяСхемаКомпоновкнДанньш □ X Рис. 16.410. Установка доступности полвй На закладке Настройки создан вариант отчета Иерархия, содержащий группировку по полю Номенклатура с типом Иерархия, поле Приход и офор- мленный макетом оформления Радуга (рис. 16.411). Рис. 16.411. Настройка иерархической группировки Выполним вариант отчета Иерархия. Результат отчета с иерархической группировкой примет вид (рис. 16.412).
® -з u ' njrf Q |Д @ Ц ц| □ х Поступление товаров Вариант отчета: [Иерархия J | Выбрать вариант... | | |> Сформировать 11 OS Настройка... Все действий * i (?) I I Номенклатура Товары для сборки___ Мониторы__________ Монитор LCD_____ ОЗУ_______________ Память__________ Основные детали Жесткий диск Материнская плата Прочие детали_____ Веб-камера______ Микрофон________ Итого ' Приход 37,000 ' 4,000 4,000 ' 5,000 5,000 ' 8,000 3,000 5,000 20,000 10,000 10,000 37,000 Рис. 16.412. Результат отчета Набор данных для проверки иерархии В схеме компоновки данных можно также определить и набор данных, при помощи которого будет осуществляться проверка иерархии. Так, для отчета Поступление товаров можно определить набор данных, при помощи которого пользователь сможет использовать иерархические виды срав- нения с элементами построенной иерархии. Функционально это аналог отбора с видом сравнения <В группе> для обычного иерархического спра- вочника. В предыдущем примере мы вывели в отчет Поступление товаров иерар- хическую группировку Номенклатура. При этом иерархия строилась не по группам справочника Номенклатура (полю Родитель), а произ- вольным образом - по полю справочника Мой родитель. Запустим отчет в режиме 1С:Предприятие. Изменим вариант отчета Иерархия и на закладке Отбор установим отбор < Номенклатура > <В группе> <Комплектующие> (рис. 16.413). Пара... [flj Поль... Д Групп... Д Поля | flfl Отбор | Сорти... gfl| Уело... Текущий элемент имеет собственный отбор (для фильтрации записей, выводимых в элементе) ng Депо... Выбрать В се действия’1 (^Добавить новый элемент i Сгруппфовагь условия i | Все действия’ Доступные поля = Приход t- = Регистратор :+ = Склад t С: Параметры Поле Вид сравнения Значение •- Отбор @ = Номенклатура В группе ... Q Рис. 16.413. Установка отбора В результате мы получим тот же отчет, что и раньше (см. рис. 16.412). То есть мы использовали отбор с видом сравнения <В группе> по стан- дартной иерархии. Профессиональная разработка в системе «1С:Предприятие 8»
Допустим, мы хотим использовать в отборе иерархические виды сравнения с элементами нашей произвольной иерархии. Но в данном случае отбор с видом сравнения <В группе> произвольной иерархии, например, <номенклатура> <В группе> сОсновные детали> не даст никаких данных. Для решения данной задачи нужно определить в схеме компо- новки данных набор данных для проверки иерархии. Для этого в схеме компоновки данных отчета создадим набор данных ПроверкаИерархии (листинг 16.92). Листинг 16.92. Текст запроса ВЫБРАТЬ Номенклатура.Ссылка КАК ПроверкаИерархииНоменклатуры, Номенкпатура.МойРодитель КАК РодительИерархииНоменкпатуры ИЗ Справочник-Номенкпатура КАК Номенклатура ГДЕ Номенкпатура.МойРодитель В(&ПроверкаИерархииНоменклатуры) На закладке Связи наборов данных для набора данных ПроверкаИерархии определим связь самого к себе. В качестве выражения источника укажем поле ПроверкаИерархииНоменклатуры, а в качестве выражения прием- ника - поле РодительИерархииНоменкпатуры. При этом укажем параметр связи ПроверкаИерархииНоменклатуры с возможностью использования списка параметров (рис. 16.414). £1 Отчет Поступление!оеаров: ОсиевиеяСхемаКомпоновкиДанным _ □ X Наборы данных Связи наборов даннь « Вычисляемые поля Ресурсы Параметры Макеты Вложение схемы Настройки .0 X Источник связи Приемник связи Выражение источник Выражение приемке Параметр Спис Ус На.. 0 Приход Иерархия Номенклатура Номенклатура Ссылка ® ® Иерархия Иерархия MoPPcnxreib Номенклатура Ссылка ® ® (Проверкой ерархш ПроверкаИерархии ПроверкаИерармаМомемммтуры РойителИерармаМомемимтуры HSBI3SJ @ ®) Рис. 16.414. Установка связей наборов данных для проверки иерархии Теперь следует указать данный набор как набор данных проверки иерархии поля Номенклатура набора данных Приход. Это делается на закладке Наборы данных, в таблице полей набора данных (рис. 16.415). Запустим отчет в режиме 1С:Предприятие. Изменим вариант отчета Иерархия и на закладке Отбор установим отбор < Номен клатура> <В группе> сОсновные детали> (рис. 16.416). ПРИМЕЧАНИЕ Поскольку элемент справочника Основные детали не является группой, то, чтобы задать такое условие отбора, нужно сначала установить вид сравнения Равно, выбрать нужный элемент собственной иерархии из группы Моя иерархия, а затем изменить вид сравнения на В группе. Том 2
G п pa вон ник] раз р а б.отл и ка Т*1 Отчет Поступление! аваров: ОоновнаяСхемаКемпоновкиЛанных □ X Наборы данных | Связи наборов данных Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы Настройки Поля: т Наборыданных (Щ Ш Иерархия ПП ПроверкаИерармы Поле Путь Ограничение поля Роль Автоэаголовок 1П... У... Г... У... Ограничение реке... Выраж... Проверка иерархии: Выраж... Набор данных упоряд... ' _ Параметр ______________ _ П... У... Г... _У... в Номенклатура О О О О Измор.. О Номенклатура О О О О в Склад Склад □ □ □ □ Измер._ О Склад О О О О • Приход Приход □ □ □ □ □ Приход Т)роверкаИерар»« ЛроверкаИерархшН Запрос: Конструсгср запроса.. ВЫБРАТЬ Г” ОстаткмВомештатурыОборотас. Склад, Н ОстаткхНомештатурыОборотас. Номенклатура, ' ОстаткяНоменклатурыОборотм.КоличествоПриход КАК Приход, । ОстаткиНоменклатурыОборотм.Регистратор । ИЗ --------------------I------------------------------------------------------------- Аетоэаполнение @ Рис. 16.415. Установка набора данных и параметра для проверки иарархии Пара.. [fl Поль... g) Групп... fig Поля | Отбор | fifr] Сорти... gfi Цело... ftS Допа.. Текущий элемент имеет собственный отбор (для Фильтрации записей, выводимых в элементе) Выбрать В се действия» (^Добавить новый элемент i Сгруппировать условия I I Вседействия» Доступные поля = = Приход •* = Регистратор + = Склад * О Параметры Поле Вид сравнения Значение Отбор @ = Номенклатура Основные детали Рис. 16.416. Установка отбора Выполним отчет. В результат будут выводиться только записи в иерархии элемента Основные детали. При этом сохранится вся построенная нами иерархическая структура отчета (рис. 16.417). ® i ' w ' п... пелрй Q |Д ' w ' 'Д ill ’ м м* м- - □ х Поступление товаров Вариант отчета: |Иераржя| | Выбрать вариант... | | 1> Сформировать || Настройка... Все действия» I (?) I-------------------------------------- Отбор: Номенклатура В группе 'Основные детали" Номенклатура Товары для сборки___ Основные детали Жесткий диск Материнская плата Итого Приход 8,000 8,000 ЗДОР 5,000 8,000 Рис. 16.417. Результат отчвта 2SW
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 ВНИМАНИЕ! После указания набора для проверки иерархии отбор по стандартной иерархии с видом сравнения <В группе> работать не будет. Таким образом, мы рассмотрели пример построения собственной иерархии для любого, в том числе неиерархического, объекта. Иерархия детальных записей Система компоновки данных позволяет выводить в отчет иерархические детальные записи. Иерархия детальных записей нужна, чтобы вывести в отчет группировку Детальные записи как бы с типом Иерархия. Например, можно вывести в отчет иерархический справочник номенклатуры, используя только его детальные записи. При выводе в результат детальных записей система анализирует наличие у выводимого набора данных связи к самому себе. Если такая связь обна- ружена, система рекурсивно выполняет связь для получения вложенных записей. Для примера создадим схему компоновки данных ИерархияДетальныхЗа- писей отчета Список номенклатуры. Создадим набор данных Номенклатура при помощи запроса (листинг 16.93). Листинг 16.93. Текст запроса ВЫБРАТЬ Номенклатура.Ссылка, Номенклатура.Родитель, Номенклатура.Код, Номенклатура.Наименование, Номенклатура.ЭтоГруппа ИЗ Справочник.Номенклатура КАК Номенклатура ГДЕ Номенклатура.Родитель В(&Родители) При помощи данного запроса будут получаться записи с указанным роди- телем. Если параметр Родитель будет содержать пустую ссылку, то будут получены записи, у которых родителей нет, то есть корневые записи. Для обеспечения вывода иерархии на закладке Связи наборов данных конструктора схемы компоновки данных опишем связь набора данных Номенклатура к самому себе. Укажем в качестве выражения источ- ника поле Ссылка, а в качестве выражения приемника — поле Родитель. Таким образом, для каждой записи набора данных в наборе данных будут искаться записи, у которых поле Родитель имеет значение поля Ссылка родительской записи. Так как запрос получает данные с фильтрацией по родителю, укажем параметр связи Родители и, так как параметр может принимать список значений, обозначим это в связи, установив соот-
ветствующий флажок в поле Список параметров. В этот параметр будет помещено значение связи источника. Справочник Номенклатура имеет иерархию групп и элементов. При этом дочерние записи могут существовать только у групп. Поэтому для того, чтобы система не осуществляла поиск дочерних записей не у групповых записей, укажем в связи условие связи ЭтоГруппа. Далее нужно указать, с какого значения система должна начинать получать иерархические записи. Делается это при помощи свойства связи Начальное значение связи. Нам нужно, чтобы на первом уровне отчета выдавались записи, у которых родитель отсутствует. Поэтому в качестве начального значения связи укажем выражение Значение(Справочник.Номенкла- тура. ПустаяСсылка). Таким образом, при первом получении данных из набора данных система будет получать записи, у которых значение поля Родитель равно пустой ссылке, то есть корневые записи (рис. 16.418). Отчет СписсжНоменкявтуры: ИерархияДетальмыхЗвпнсей _ □ X Наборымннык Связи наборсе данных Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы Настройки -и X Источит связи Приемке связи Выражение источит Выражение приемнт Параметр Список Условие связи Начальное эиачвттв связи Об 'Номенклатуре Нометлатура Ссыли Родитель Рооитела @ ЭтоГруппа МНЖМИИ1ЯШИИШВ10 Рис. 16.418. Связь иерархического набора данных к самому себе На закладке Настройки добавим в структуру отчета группировку Детальные записи и перенесем в список выбранных полей поля Код и Наименование (рис. 16.419). Т*1 Отчет СписокНоменклетуры: ИерармияДетальныхЗапиовй _ □ X Рис. 16.419. Настройка структуры и полей отчата Установим схему ИерархияДетальныхЗаписей в качестве основной схемы компоновки данных для отчета Список номенклатуры (рис. 16.420). Профессиональная разработка в системе «1С:Предприятие 8»
|Е1 Отчет СписокНоменклэтуры | ► Основные Подсистемы Функциональные опции Данные Формы Команды Макеты Права Прочее Имя [СписокНоменклатуры| Синоним: [Список номенклатуры QI Комментарий: [] Основная схема компоновки данных: ... X Q| | Открыть схему компоновки данных | Выбор объекта: Макет Г57| ОсновнаяСхемаКомпоновкиДанных | ОК | ISSSBffiBBQBBSOBO | Отмена | | Действия - | | Далее> | | Закрьгть | | Справка | Рис. 16.420. Установка схемы компоновки данных для отчета Выполним отчет. В результат выводятся детальные записи с иерархией по полю Родитель (рис. 16.421). Рис. 16.421. Результат отчета Возможность вывода одного элемента в нескольких родительских записях При построении иерархии система компоновки данных позволяет выво- дить один элемент в нескольких родительских записях. Например, в конфигурации созданы два справочника: Филиалы и Сотруд- ники. В справочнике Сотрудники имеются записи: «Алексеева Дарья», «Соколов Андрей», «Ильин Сергей». В справочнике Филиалы имеются записи: «Основной» и «Дополнительный». Том 2
LG п pa вон ник] разработу и ка] В конфигурации создан регистр сведений МестаРаботы с измере- ниями Филиал типа СправочникСсылка.Филиалы и Сотрудник типа СправочникСсылка.Сотрудники. Регистр заполнен следующими записями (рис. 16.422). Места работы ^Создать । [ft । QНайти., i Q, Вседействия'* i (?) Филиал I Сотрудник Соколов Андрей О Основной Ильин Сергей о Дополнительный Алексеева Дарья Рис. 16.422. Регистр сведений «Маста работы» Создадим отчет Места работы. В схеме компоновки данных отчета создадим набор данных Филиалы, получающий список филиалов при помощи запроса (листинг 16.94). Листинг 16.94. Текст запроса ВЫБРАТЬ Филиалы.Ссылка как Филиал ИЗ Справочник.Филиалы как Филиалы Для построения иерархии создадим набор данных Иерархия (листинг 16.95). Листинг 16.95. Текст запроса ВЫБРАТЬ МестаРаботы.Фипиал, Места Работы.Сотрудник ИЗ РегистрСведений.МестаРаботы как МестаРаботы ГДЕ МестаРаботы.Филиал В(&Филиал) ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ Сотрудники.Ссылка, NULL ИЗ Справочник.Сотрудники КАК Сотрудники ГДЕ Сотрудники.Ссылка В(&Филиал) Первое объединение запроса выбирает сотрудников, работающих в филиалах. Вторая часть запроса выбирает сотрудников, так как иерархи- ческий набор должен содержать и сами иерархические записи.
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Опишем связи между наборами данных. В качестве источника связи укажем набор данных Филиалы, в качестве приемника — набор данных Иерархия. Выражение-источник — поле Филиал, выражение-приемник — поле Филиал. Параметром связи укажем поле Филиал и укажем, что возможен список параметров. Опишем иерархическую связь набора к самому себе. В качестве выражения источника укажем поле Сотрудник, а в качестве выражения приемника — Филиал. Параметром связи укажем поле Филиал и укажем возможность списка параметров (рис. 16.423). Т*1 Отчет МестаРаботы: ОсновнаяСхемаКомпоновкиДанных □ X Наборыданных | Свяэинабороед.. | Вычисляемые п... Ресурсы Параметры Макеты Вложенные схемы Настройки Приемник связи Выражение источник Выражение приемник Параметр Список параметров Условие связи Начальн... I 0... Иерархия Филиал Филиал Филиал 0 "] 0 Иераржя Сотрудкж Филиал Филиал @ 0 Рис. 16.423. Установка связей наборов данных для построения иерархии ВНИМАНИЕ! В иерархическом наборе данных поле, с которым осуществляется связь основного набора, должно называться так же, как и в основном наборе. Так, в приведенном выше примере, в иерархическом наборе данных связуемое поле должно иметь имя Филиал. На закладке Настройки в структуру отчета добавим группировку по полю Филиал с типом Иерархия (рис. 16.424). Й Отчет МестаРаботы: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.424. Настройка иарархической группировки Выполним отчет. В результате филиал Основной будет выведен для двух сотрудников (рис. 16.425).
Рис. 16.425. Результат отчета Расшифровка Система компоновки данных предоставляет возможность расшифровать информацию, содержащуюся в отчете. То есть выполнив отчет и выделив одну из его ячеек, пользователь может получить другой отчет, связанный со значением, находящимся в этой ячейке. Например, более подробный отчет, показывающий, из каких именно показателей получилась эта сумма в ячейке. Или пользователь может открыть и посмотреть тот документ, который указан в этой ячейке. Или отобрать, или отсортировать данные этого отчета по значению в этой ячейке и т. п. Например, получив отчет по продажам номенклатуры, можно двойным щелчком мыши на поле ресурса вызвать диалог выбора поля для расшиф- ровки (рис. 16.426). @ Продажи... (ЮПредприягие) |S) 1SI 311 М Mt М-- □ X Продажи номенклатуры Вариант отчета: [Основной| | Выбрать вариант... | | |> Сформировать 11 ПЗ Настройка... @ iTTl Началопериода 0 1ТП Коней периода 03 jffl Мелкий заказ Все действия » | (?) 01.122011 15.122011 Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 Контрагент I Номенклатура Период_____________________ ООО "А в тематика* Диатостика компьютера £ _____5 декабря 2011 г.____I 11 декабря2О11 г. Компьютер для дома 11 декабря 20177 Г ООО "Система" Компьютер для офиса___I 9 декабря 2011г, | ООО "Стиль" Монитор LCD___________| 6 декабря 2011 г. | Итого_____________________ Количество Стоимость 11 500,00 1 500,00 1 OOOJOi @ Выбор поля • Демонстрац... (1С.Предприягие) X Выбор поля Доступные поля = * J Количество +. J Стоимость | Оыбраггь | Отмена (?) Рис. 16.426. Диалог выбора поля для расшифровки Профессиональная разработка в системе «1С:Предприятие 8»
Далее выбрать поле, по которому нужно расшифровать данные. В резуль- тате будет получен отчет, содержащий более конкретную информацию по выделенной ячейке и расшифровывающий ее по выбранному полю. В данном случае Период (рис. 16.427). Продажи товаров и услуг Параметры: Начало периода: 01.122011 Конец периода: 1S.12.2011 Отбор: Контрагент Равно "ООО "Автоматика'"' И Номенклатура Равно "Диагностика компьютера* Период 1 Количество Стоимость______________ 5 декабря 2011 г. I 1| 1 000,001 11 декабря 2011 г. | 1| 500Др| Итого 2 1 500,00 Рис. 16.427. Результат отчета с расшифровкой Если дважды щелкнуть на поле не ресурса, то будет открыто значение поля (рис. 16.428). (1а) Продажи номенклатуры • Демонстр... (1С:Предприягие) iml Ijjji |Д ' 151 *311 М М+ М“ — — □ X Продажи номенклатуры Вариант отчета: | Основной_ | |> Сформировать 11 0$ Настройка... НачалоПериода @ IlJj Конец периода О | Мелкий заказ 01.12.2011 15.122011 J | Выбрать вариант... | Все действия* i (?) Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 Контрагент I Номенклатура Период______________________ ООО "Автоматика* 5 декабря 2011 г. 11 декабря 2011 t Кодетьютер для дом 11 декабря 2011 t ООО "Система* Кодетьютер дляофи 9 декабря 2011 г. Количество Стоимость 11 500,00 1 500ДО 1 000.00 @ Диагностика комъюгера (Но... (1С:Предпрмягие) ISl 'JS] 'зз! Диагностика... Диагностика компьютера (Номенклатура) ООО "Стиль” _ MomtopLCD______ 6 декабря 2011 г. Итого Перейти Цены | Записать и закрыть | |^| Вседействия* । (?) Код: |000000007 Наименование: | Целуй Родитель: Вид номенклатуры | Целуй Мой родитель: [__________ ... QI ... QI □ X Рис. 16.428. Открытие значения поля расшифроаки При нажатии правой кнопки мыши на поле отчета вызывается выпа- дающее меню расшифровки, которое состоит из возможных действий над расшифровкой: Расшифровать, Открыть, Отфильтровать, Упорядочить, Сгруппировать, Оформить (рис. 16.429). Том 2
LG п pa вон ник] разработу и ка1 Продажи номенклатуры Вариант отчете [Основной | | Выбрать вариант,, | | р» Сформировать । 03 Настройка.. @ iTtl Начало периода 0 |ТГ1 Конецпериода □ Й?| Мелкий заказ Все действий’ । (?) □1.12.2011 15.12.2011 Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конец периода: 15.12.2011 Контрагент Количество Стоимость t !т Номенклатура Период________________________________________________ ООО “Автоматика” _ _ _____ 11 500.00 Диамостиса компьютера_______________2____i 500,00 5 декабря 2011 г. __________________1 1 000.00 11 декабря 2011 г. 1 500,00 ____________1 10 000,00 Расшифровать... Открыть "Номенклатура = Компьютер для доме Отфильтровать Упорядочить Сгруппировать Оформить копировать Свойства Рис. 16.429. Вызов меню расшифровки Действие Расшифровать недоступно, если элемент расшифровки — Детальные записи, кроме случая, когда он содержит поля-ресурсы. Для реализации расшифровки отчетов, выполненных при помощи системы компоновки данных, в платформе реализован объект Обработ- каРасшифровкиКомпоновкиДанных. Он позволяет сформировать настройки компоновки данных, которые можно использовать для формирования отчета-расшифровки. При формировании табличного документа с помощью системы компо- новки данных в расшифровку ячейки помещаются специальные объекты типа ИдентификаторРасшифровки. При этом самих значений полей и полей группировок в табличном документе нет. Получить значения полей можно из объекта ДанныеРасшифровки, который был заполнен при выводе отчета. Для того чтобы при выводе отчета объект ДанныеРасшифровки был заполнен, следует его создать при компоновке макета и передать в процессор компоновки данных. Для этого при вызове метода Выполнить компоновщика макета следует передать переменную, в которую требуется поместить созданный объект. Для того чтобы данные расшифровки заполнились при формировании результата, необходимо передать объект ДанныеРасшифровки в метод Инициализировать процессора компоновки данных. Если отчет формируется при помощи стандартной команды отчета Сфор- мировать, то данные расшифровки помещаются в свойство расширения формы отчета ДанныеРасшифроаки.
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Однако в отчетах, где используется собственная процедура программной компоновки данных, нужно явно указывать объект Данные расшифровки для заполнения информации о расшифровке при формировании отчета (листинг 16.96). Листинг 16.96. Фрагмент процедуры программного формирования отчата КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифроаки); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКЬмпоновки, ВнешниеНаборыДанных, ДанныеРасшифроаки); Переопределение расшифровки для поля В некоторых ситуациях необходимо, чтобы при расшифровке, выполня- емой пользователем над одним полем, расшифровка выполнялась над другим полем. Рассмотрим эту возможность на примере отчета Сборка системных блоков (стр. 156). Допустим, необходимо, чтобы при расшиф- ровке по полю Номер открывалось значение документа-регистратора. Для того чтобы переопределить расшифровку для поля Номер, для этого поля необходимо создать макет (рис. 16.430). Рис. 16.430. Создание макета поля «Номер» В свойствах ячейки, выбранной для поля области, нужно указать запол- нение ячейки Параметр, имя параметра Номер и задать имя параметра расшифровки Расшифровка (рис. 16.431). В выражении параметра Расшифровка нужно задать выражение для поля Регистратор и указать основное действие расшифровки - Открыть значение (рис. 16.432).
Свойства: Ячейки И'й। х [Ячейки___________ ▼ Основные: Размещен иеТекста Имя Защита Гиперссылка РежимИэмеиенияРаэмераКолоики [Обы«ыьй ▼ Макет:______________________________ |Аето |R1C1 0 □ некие Параметр [Параметр | Номер______ ИспольэоеаниеРасшиФровки | Ячейка 'Значения: СолержигЗначение I ипЗначения 3 лемеигУ правления Формат ФорметРеаакгирования I Маска I ► Положение: ► Оформление: -О| ^3 QI Рис. 16.431. Свойства ячейки поля макета □ X Т5! Отчет СборкаСистемныкБ локов: ОсновнаяСхемаКомпоновкиДаннын Наборы дан... Связи набор... Вычисляем...Ресурсы Параметры | М ак ет ы | Вложенные... Настройки fi- х 3 5 X Нет Расшифровать Отфильтровать Упорздоштъ Сгруппировать © й> х 11 Отмена 11 Справка | Параметр расшифровки Имя поля Рис. 16.432. Свойства параметра расшифровки Выполним отчет Сборка системных блоков. При двойном щелчке мыши на детальных записях отчета в колонке Номер будет сразу же открыт документ-регистратор Сборка компьютера с соответствующим номером (рис. 16.433). При этом для всех полей отчета выполняются стандартные действия расшифровки. Двойным щелчком на поле ресурса вызывается диалог выбора поля для расшифровки, двойным щелчком на поле не ресурса открывается значение поля, а также при нажатии правой кнопки мыши вызывается выпадающее меню расшифровки, которое состоит из возможных действий над расшифровкой: Расшифровать, Открыть, Отфильтровать, Упорядочить, Сгруппировать, Оформить. Профессиональная разработка в системе «1С:Предприятие 8»
®ч ® •< Сборка системным блоке,. (ЮПредлриятие) ite^l СдД I Сборка системных блоков Вариант отчета: | Основной_ | о Сформировать 11 Оо Настройка.. iTrl Началопериода й) Конецпериода ОЙ Сорпфовка Системный блок Мастер Параметры: Начало периоде 01.122011 Конецпериода: 15.012012 ----1 Сборка системных блоков Сборка компьютера 000000001 or 0... (1СЛредприяп«) Iftl Сборка компьютера 000000001 от 06.12.2011 19:33 15.01.2( Дата. С Количество Стоимость Компьютер для офиса Компыотар для дома Ильин Сергей Компыотар игровой Соколов Аццрей Итоге ____________Дата 0 500,00 6 660,60 6 600,00 06.122011 9 000ДО 9 060,00____ 9000,00 11.122011 10 500ДО 10 660,00___________ 10 500,00 11.012012 28 000ДО Номер D00000001 Т Расшифровать Открыть "Регистратор = Сборка компьютера 000000001 Отфильтровать Упорядочить Сгруппфовагь Оформить । Копировать 3 Рис. 16.433. Результат отчета Программная обработка расшифровки Однако разработчик может реализовать и свой, нестандартный, вариант расшифровки. Рассмотрим этот вариант на примере отчета Сборка системных блоков. В форме отчета создан обработчик события Обработ- каДополнительнойРасшифровки для поля табличного документа Результат (рис. 16.434). В процедуре этого обработчика формируется контекстное меню расшиф- ровки отчета и определяется поведение отчета при возникновении события ОбработкаДополнительнойРасшифровки, когда пользователь нажатием правой кнопки мыши на ячейке результата отчета вызывает меню расшифровки (листинг 16.97). Том 2
G п pa вон ник] раз р а б.отл и ка I а) ’/ - □ х :40 Все действия ” । (?) Свойства: Поле 0 □ [Авто Доступность ТолькоПросмотр ПропускатьПриВводе АктивизироеатьПоУмолчаншэ @ ► Иснольоввание: ► Оформление: ► Расположение: ▼ События: ПриИзменении Выбор О бработкаРасшиФровки h3li (^бработкаДополнигельисйРасшиФровки РезультэтОбработкаДополтгельнойРасшифроеки ПриИзмеиенииСолержимогоОбласти ПриАктиеизацииОбласти НачалоПеретаскивания э> Д| Д- 1т ?1 ст 06.12.2011 19:33:40" Рис. 16.434. Обработчик события «ОбработкаДопопнительнойРасшифровки» для поля «Результат» Листинг 16.97. Процедура обработчика события «ОбработкаДополнительнойРасшифровки» для поля «Результат» &НаКпиенте Процедура РезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) Перем ВыбранноеДействие; Перем ПараметрыВыбранногоДействия; СтандартнаяОбработка = Ложь; ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКЬмпоновкиДанных(Отчет)); ДоступныеДействия = Новый Массив]); ДоступныеДействия Добавить] ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение); ДоступныеДействия Добавить] ДействиеОбработкиРасшифровкиКомпоновкиДанных.Отфильтровать); ДоступныеДействия Добавить] ДействиеОбработкиРасшифровкиКомпоновкиДанных.Рвсшифровать); ДополнительныеДействия = Новый СписокЗначений; ДополнительныеДействия ДобавитьС'Действие 1");
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 ДополнительныеДействияДобавить("Действие2"); ДополнительныеДействияДобавить("ДействиеЗ"); // Осуществим выбор действия расшифровки пользователем. ОбработкаРасшифровки.ВыбратьДействие(Расшифровка, ВыбранноеДействие, ПараметрыВыбранногоДействия, ДоступныеДействия, ДополнительныеДействия); Если ПараметрыВыбранногоДействия <> Неопределено Тогда Если ВыбранноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда ОткрытьЗначение(ПараметрыВыбранногоДействия); Иначе ПараметрыФормы = Новый Структура; ПараметрыФормы.ВставитьССформироватьПриОткрытии1', Истина); ПараметрыФормы.Вставить("Расшифровка", Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия)); ОткрытьФорму("Отчет.СборкаСистемныхБлоков.Форма”, ПараметрыФормы,, Истина); КонецЕсли; Иначе Сообщить(ВыбранноеДействие); КонецЕсли; КонецПроцедуры В процедуре обработчика отменяется стандартная обработка расшифровки. Затем создается обработчик расшифровки - объект ОбработкаРасшифров- киКомпоновкиДанных и инициализируется данными расшифровки отчета и источником доступных настроек для отчета. Затем задается список доступных действий расшифровки - Открыть- Значение, Отфильтровать, Расшифровать, а также задается список дополнительных действий расшифровки, например «Действие 1», «Дейс- твие 2», «Действие 3». После этого вызывается интерактивный выбор действия расшифровки методом ВыбратьДействие() объекта ОбработкаРасшифровкиКомпонов- киДанных. В метод передается идентификатор расшифровки, список доступных действий (ДоступныеДействия) и список дополнительных дейс- твий (ДополнительныеДейстаия) меню расшифровки. После выбора пользователем действия расшифровки значение выбран- ного действия возвращается во втором параметре ВыбранноеДействие. Если выбрано действие Открыть, то третий параметр ПараметрыВыбран- ногоДействия содержит значение, которое нужно открыть. Если выбрано действие Расшифровать, Отфильтровать, Упорядочить, Сгруппировать, Офор- мить, то параметр ПараметрыВыбранногоДействия содержит настройки, применяемые к отчету. Если выбрано дополнительное действие, то пара- метр не заполняется. В зависимости от выбранного действия либо открывается выбранное значение, либо формируется новая форма отчета с параметрами Сформи-
роватьПриОткрытии и Расшифровка. Параметр СформироватьПриОткрытии, установленный в значение Истина, обеспечивает формирование отчета сразу при открытии формы. В параметре Расшифровка описыва- ется расшифровка, которую нужно применить к открываемому отчету. Затем данные расшифровки, идентификатор расшифровки и новые настройки, применяемые к отчету, передаются в конструктор объекта ОписаниеОбработкиРасшифроакиКомпоновкиДанных. Выполним отчет. Нажав правую кнопку мыши на поле отчета, можно вызвать меню собственной расшифровки и выполнить перечисленные в нем действия расшифровки (рис. 16.435). Сборка системных блоков Вариант отчета: [Основной| | Выбрать вариант... | | 1> Сформировать 11 OjJ Настройка... Все действия ’ । <?) iTTl Началопериода 1ТП Конецпериода пИ Сортировка Сборка системных блоков Параметры Начало периода: 01.122011 Конецпериода: 15.012012 Системный блок Количество Стоимо Мастер Компьютер для ефиса Соколов Аццрвй Компьютер для доме | Действие 2 к Действие 3 I Открыть “Системный блок > Компьютер для дома" к Отфильтровать ________Дата___________Номер 508,00 8 508,08 8 500,00 [08.12.2011 000000001 ооодо 1808,08_________________________ 1000,00111.12.2011 000000002 500,00 1508,08_________________________ 1500,00 [11.01.2012 000000003 ювдо____________________________ Рис. 16.435. Результат отчета ВНИМАНИЕ! Переопределять действия по расшифровке отчета, вызываемой при нажатии правой кнопки мыши, нужно в обработчике события ОбработкадополнительнойРасшифровки. А в обработчике события Обра- боткаРасшифровки нужно переопределять действия, происходящие при двойном щелчке мыши на поле отчета. При необходимости расшифровку, выдаваемую методом ВыбратьДейс- твие() можно выполнить и самостоятельно. Например, поместим в форму отчета Сборка системных блоков поле флажка Форма расшифровки, связанное с одноименным реквизитом булевого типа. В зависимости от его значения при выборе определенного действия из меню расшифровки, связанного с изменением настроек отчета, будет либо открыта новая форма, содер- Профессиональная разработка в системе «1С:Предприятие 8»
жащая расшифровку отчета, либо сразу же применены новые настройки и скомпонован результат расшифровки в исходной форме отчета в проце- дуре ОтработатьРасшифровку(). Процедура обработчика события ОбработкаДополнительнойРасшифровки изменится следующим образом (листинг 16.98). Листинг 16.98. Фрагмент процедуры обработчика события «ОбработкаДополнительнойРасшифровки» для поля «Результат» Если ВыбранноеДействие = ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение Тогда ОткрытьЗначение(ПараметрыВыбранногоДействия); Иначе Если ФормаРасшифровки Тогда ПараметрыФормы = Новый Структура; ПараметрыФормы.Вставить("СформироватьПриОткрытии”, Истина); ПараметрыФормы.Вставить("Расшифровка”, Новый ОписаниеОбработкиРасшифровкиКомлоновкиДанных(ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия)); ОткрытьФорму("Отчет.СборкаСистемныхБлоков.Форма“, ПараметрыФормы,, Истина); Иначе ОгработатъРасшифровку(Новый ОписаниеОбработкиРасшифровкиКомпоновкиДанных( ДанныеРасшифровки, Расшифровка, ПараметрыВыбранногоДействия)); КонецЕсли; КонецЕсли; В процедуру ОтработатьРасшифровку() передается объект ОписаниеОбра- боткиРасшифровкиКомпоновкиДанных (листинг 16.99). Листинг 16.99. Процедура обработчика события «ОбработкаДополнительнойРасшифровки» для поля «Результат» &НаСервере Процедура ОтработатьРасшифровку(ОписаниеОбработкиРасшифровки) ДанныеРасшифровкиОбъекг = ПолучитьИзВременногоХранилища(ДанныеРасшифровки); ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКЬмпоновкиДанных(ДанныеРасшифровкиОбъекг, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Отчет)); РезультирующиеНастройки = ОбработкаРасшифровки. ПрименитьНастройки( ОписаниеОбработки Расшифровки. Идентификатор, ОписаниеОбработкиРасшифровки.Применяемые Настройки); Если ТипЗнч(РезультирующиеНастройки) = Тип("НастройкиК6мпоновкиДанных") Тогда Отчет.КомпоновщикНастроек.ЗафузитьНастройки(РезупьтирующиеНастройки); ИначеЕсли ТипЗнч(РезультирующиеНастройки) = Тип(”ПользовательскиеНастройкиКомпоновкиДанных") Тогда Отчет.КомпоновщикНастроек. ЗагрузитьПользовательскиеНастройки(РезультирующиеНастройки); КонецЕсли; СкомпоноватьРезультат(); КонецПроцедуры Том 2
LG п pa вон ник] разработу и ка] В процедуре создается обработчик расшифровки — объект ОбработкаРас- шифровкиКомпоновкиДанных и инициализируется данными расшифровки отчета и источником доступных настроек для отчета. Для применения настроек расшифровки используется метод этого объекта Приме- нитьНастройки(). Метод ПрименитьНастройки() может вернуть как полные настройки компоновки данных, так и пользовательские настройки компоновки данных. Пользовательские настройки расшифровки могут быть получены, если применяемые настройки можно полностью применить в пользовательских настройках. Затем полученные настройки расшифровки применяются к отчету методом компоновщика настроек ЗагрузитьНастройки(), и отчет формируется методом формы отчета СкомпоноватьРезультат(). Расчет итогов по полям остатка Полем остатка с точки зрения системы компоновки данных является то поле, в роли которого проставлен признак Остатки (рис. 16.436). Роль - КонечныйОстаток Роль---------------------------------- ОБезроли ОПериод: 1 С Дополнительный Q Обязательное | ОК || Отмена 11 Справка | Рис. 16.436. Роль поля-остатка Для корректного расчета итогов по полям источника данных данные должны удовлетворять следующему правилу: в данных должна соблю- даться уникальность полей-периодов и полей-измерений. Рассмотрим наиболее вероятные причины некорректного расчета итогов по полям остатка. Отсутствие в запросе родительских полей-периодов Допустим, в отчете требуется отобразить движение и остатки номенкла- туры с детализацией по регистратору за указанный отчетный период. Если набор данных для отчета получается при помощи следующего запроса (листинг 16.100), то будут получены неправильные остатки.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Листинг 16.100. Текст запроса ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты. Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоРасход КАК Расход, ОстаткиНоменклатурыОстаткиИОбороты.Регистратор ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(,, Авто,,) КАК Остатки НоменкпатурыОстаткиИОбороты Проблема в том, что в запросе при получении поля Регистратор обязательно должно быть получено и его родительское поле-период ПериодСекунда. Это относится ко всем полям-периодам — при получении поля-периода в запросе должно присутствовать его родительское поле-период. Для устранения проблемы нужно обеспечить, чтобы в запросе присутс- твовало поле ПериодСекунда (листинг 16.101). Листинг 16.101. Текст запроса ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклвтура, ОстаткиНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменклвтурыОствткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход КАК Расход, ОстаткиНоменклатурыОстаткиИОбороты.Регистратор, ОстаткиНоменклатурыОстаткиИОбороты.ПериодСекунда ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(,, Авто,,) КАК Остатки НоменкпатурыОстаткиИОбороты Если свойство Автозаполнение (стр. 278) в схеме компоновки данных установлено, платформа автоматически заполнит роли (стр. 287) полей- периодов в наборе данных (рис. 16.437). Поля-периоды для правильного расчета остатков должны иметь непре- рывную нумерацию, начиная с 1. При этом чем меньше номер периода, тем более точным должен быть период. Например, поле НомерСтроки является уточнением поля Регистратор, поэтому номер периода поля НомерСтроки должен быть меньше, чем номер периода поля Регистратор. Аналогично и номер периода поля ПериодДень должен быть меньше, чем номер поля ПериодГод. В нашем примере поле Регистратор (номер периода — 1) является уточне- нием поля ПериодСекунда (номер периода — 2). Если по какой-то причине роли полей-периодов не проставлены автоматически, необходимо сделать это вручную.
Роль • Регистратор 0Безроли □ Дополнительный^ 0.-Иэмерони Родитель: 0,-Счет- Вид: 0 - Остатки------ Имя: Тип: Бух тип: Поле счета: Ром» • ПермодСекдмаа X -Роль------------------------------------- ОБезроли ^|ffiepnQji| | 2 *| □ Дополнительный^ 0.- И змерение-------------------------. Родитель: ▼ О о р I - Остатки------------------------------- Нмя: Тип: ▼ Бух. тип: ▼ Поле счета: О Игнорировать значения NULL О Обязательное | ОК 11 Отмена 11 Справка | О Игнорировать значения NULL О Обязательное | ОК 11 Отмена 11 Справка | Рис. 16.437. Роли полей-пвриодов В результате в отчете будут получены правильные итоги остатков номен- клатуры за период с детализацией по регистратору. Отсутствие в запросе парного поля-остатка Другой вероятной причиной неправильного расчета остатков явля- ется отсутствие в запросе парного поля-остатка. Например, следующий запрос, в котором получается только конечный остаток номенклатуры, будет неправильным (листинг 16.102). Листинг 16.102. Текст запроса ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстатокКАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход КАК Расход, ОстаткиНоменклатурыОстаткиИОбороты.Регистратор, ОстаткиНоменклатурыОстаткиИОбороты.ПериодСекунда ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(,, Авто,,) КАК ОстаткиНоменклатурыОстаткиИОбороты Для устранения проблемы нужно обеспечить, чтобы в запросе присутство- вало парное поле-остаток, в данном случае КоличествоНачальныйОстагок (см. листинг 16.101). В этом случае при установленном свойстве Авто- заполнение (стр. 278) платформа автоматически заполнит роли (стр. 287) полей-остатков в наборе данных (рис. 16.438). Профессиональная разработка в системе «1С:Предприятие 8»
Рель - НачальныйОстаток X - Роль--------------------------------------- Обоз роли ОПериод: 1 • Дополнительный О. - Измерение---------------------------. Родитель: • О Г Счвт---------------------------------1 Вид: - Остатки----------------------------- I Имя [Груша | I Тип: [НачальныйОстаток Бух. тип: | Нет▼ [ Поле счета: | | ОИгнорировать значения NULL Q Обязательное | ОК 11 Отмена 11 Справка | Рис. 16.438. Роли полей-остатков Роль • КонечныйОстаток Парные поля-остатки должны иметь одинаковое имя группы полей- остатков. Не парные остатки должны иметь различные имена групп полей-остатков. Если по какой-то причине роли полей-остатков не проставлены автоматически, необходимо сделать это вручную. Отсутствие в запросе родительских полей-измерений Такая проблема может возникнуть, когда в запросе получили реквизит измерения, но не получили само измерение. Например, в запросе полу- чается реквизит ВидНоменклатуры измерения Номенклатура без получения самого родительского поля-измерения (листинг 16.103). В этой ситуации итоги по полям-остаткам могут быть рассчитаны неправильно. Листинг 16.103. Текст запроса ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, ОстаткиНоменклатурыОстаткиИОбороты.Скпад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход КАК Расход, ОстаткиНоменклатурыОстаткиИОбороты.Регистратор, ОстаткиНоменклатурыОстаткиИОбороты.ПериодСекунда ИЗ РегистрНакоппения.ОстаткиНоменклатуры.ОстаткиИОбороты(,, Авто,,) КАК Остатки НоменклатурыОстаткиИОбороты Для устранения проблемы нужно обеспечить, чтобы в запросе присутст- вовало родительское поле-измерение (листинг 16.104). Том 2
Gn равр^н и Нразработ^ и ка Листинг 16.104. Текст запроса ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры, ОстаткиНоменклатурыОстаткиИОбороты. Склад, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток КАК НачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстатокКАККонечныйОстаток, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоПриход КАК Приход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход КАК Расход, ОстаткиНоменклатурыОстаткиИОбороты.Регистратор, ОстаткиНоменкпатурыОстаткиИОбороты.ПериодСекунда ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(,, Авто,,) КАК ОстаткиНоменклатурыОстаткиИОбороты Неправильное заполнение роли полей в наборе данных Выше мы рассмотрели необходимое заполнение роли полей-периодов (см. рис. 16.437) и полей-остатков (см. рис. 16.438) для корректного расчета остатков. Также должны быть правильно указаны роли полей (стр. 287), являющихся измерениями и реквизитами измерений. Поля, являющиеся измерениями, в разрезе которых получаются остатки, должны быть отмечены как измерения. Поля, не отмеченные как изме- рения при расчете итогов по полям-остаткам, учитываться не будут, это может привести к получению неправильных остатков. И наоборот, поле, по сути не являющееся измерением, не должно быть отмечено как изме- рение. В противном случае остатки могут быть получены неправильно. Для корректного расчета остатков необходимо указать родительское поле в роли поля-реквизита. Так, в приведенном выше примере (см. листинг 16.104) нужно у поля ВидНоменклатуры указать роль Измерение и указать в качестве родительского поле Номенклатура (рис. 16.439). Роль - Неменклатура X - Роль------------------------------------------ ОБезроли ОПериоо: 1 - Дополнительный -Измерение —S I Родитель: |______________________________ О г Счет------------------------------------- Виа: 0 - Остатки---------------------------------- Имя: Тип: ▼ Бух. тип: ▼ Поле счета: О Игнорировать значения NULL О Обязательное | ОК 11 Отмена 11 Справка | Роль - ВидНоменклатуры - Роль------------------------------------------- ОБез роли ОПериод: 1 С Дополнительный /^.-Измерение — I Родитель: [ДИНМ^ДД ж| ОI- Счет-------------------------------------- Виа: 0 - Остатки----------------------------------- Имя: Тип: ▼ Бух. тип: ▼ Поле счета: О Игнорировать значения NULL О 0 бязетельное | ОК 11 Отмена 11 Справка | Рис. 16.439. Роли попей-измервний
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В результате будут получены правильные остатки по полю — реквизиту измерения. Необходимо учитывать, что система компоновки данных не позво- ляет использовать поля-реквизиты полей периода для группировки. Так, например, не позволяется группировать по реквизитам поля Регис- тратор регистров накопления и бухгалтерии. При необходимости вывода в результат остатков для некоторого реквизита регистратора следует в отчет выдавать группировку по полю Регистратор и выдавать в группи- ровке интересуемые реквизиты. Расчет итогов по полям бухгалтерских остатков выполняется анало- гично расчету итогов по обычным полям-остаткам. Кроме того, при расчете итогов по таким полям используется информация о поле-счете (рис. 16.440). Рис. 16.440. Роль поля бухгалтерского остатка Связи наборов данных При разработке отчетов часто требуется получить информацию из нескольких наборов данных. При этом между ними нужно установить связь. Пусть для анализа информации о движении номенклатуры в схеме компоновки данных создано два набора. 1. Набор данных Поступление, получающий данные о поступлении номенклатуры при помощи запроса (листинг 16.105). Листинг 16.105. Текст запроса ВЫБРАТЬ Приходная НакладнаяПереченьНоменклатуры.Номенклатура, ПриходнаяНакладнаяПереченьНоменклатуры.Количество КАК Поступило, ПриходнаяНакладнаяПереченьНоменклатуры.Сумма КАК СуммаПоступления ИЗ Документ.ПриходнаяНакладная.ПереченьНоменклатуры КАК ПриходнаяНакладнаяПереченьНоменклатуры
2. Набор данных Расход, получающий данные о расходе номенклатуры при помощи запроса (листинг 16.106). Листинг 16.106. Текст запроса ВЫБРАТЬ РасходнаяНакпаднаяПереченьНоменкпатуры.Номенкпатура, РасходнаяНакладнаяПереченьНоменклатуры.Количество КАК Продано, ПриходнаяНакладнаяПереченьНоменклатуры.Сумма КАК СуммаПродажи ИЗ Документ.РасходнаяНакладная.ПереченьНоменклатуры КАК РасходнаяНакладнаяПереченьНоменклатуры В схеме компоновки данных на закладке Связи наборов данных добавим связь между наборами данных и опишем ее. В качестве источника связи укажем набор данных Поступление, в качестве приемника — набор данных Расход. В качестве выражения источника укажем поле Номенклатура, в качестве выражения приемника — Номенклатура (рис. 16.441). Наборы данных | Связи наборов д... | Вычисляемые п... Ресурсы Параметры Макеты Вложенные схемы Настройки У Е> к Источник связи Приемник связи Выражение источник Выражение приемник Параметр Список пар.. Условие св... Начальное.. ' 0... 1ПЕЕЯ0В0Я1 Расход Номенклатура Номенклатура 0 Рис. 16.441. Описание связи наборов данных При описании связей между наборами данных существует ряд особенностей: набор данных, от которого идет связь, будет считаться родительским, а набор данных, к которому идет связь, будет считаться зависимым от него; в схеме компоновки данных нет описания типа связи. Все связи счита- ются Левыми внешними соединениями, то есть у родительского набора данных будут отражаться в отчете все записи, независимо от того, найдены ли соответствующие им данные в зависимом наборе данных или нет. Исключение составляет случай, когда на поле зависимого набора данных наложен глобальный (на уровне всего отчета) отбор. Тогда все связи наборов данных, генерируемые системой компоновки данных, будут иметь тип Внутренняя. Продемонстрируем на примере, как изменится результат отчета в зависи- мости от того, какой набор выбран родительским, а какой — зависимым. При описании связи наборов данных набор Поступление указан в качестве родительского набора. Поэтому в результате отражены все поступления номенклатуры, и только та номенклатура из набора Расход, которая есть в наборе Поступление (рис. 16.442). Профессиональная разработка в системе «1С:Предприятие 8»
Поступление номенклатуры Номенклатура Поступило Продано Сумма Сумма поступления продажи СВеб-кемера ЮДЮ здю 10 000ДО 4 500,00 > Жесткий диск Эдй 3W6.W Материнская плата 5.000 10 000.00 Микрофон ЮДЮ 2,000 7 000 ДО 2000Д^ VMoHMTopLCD 4 ДЮ 2 ДЮ 34 000 ДО 22000.0Q, ) Память L.UUU виииди Итого 37,000 7JX0 76 000,00 28 500,00 Рис. 16.442. Разультат отчета Теперь укажем набор данных Расход в качестве родительского набора (рис. 16.443). Наборыданных | Связи наборов А.. | Вычисляемые п... Ресурсы Параметры Макеты Вложенные схемы Настройки I Источник связи Приемник связи I Выражение источник Выражение приемник! Параметр Список пара.. Условие св... Начальное э... 0... Поступление | Номенклатура Номенклатура | .□ .0 Рис. 16.443. Описание связи наборов данных В результате отражены все записи о расходе номенклатуры и только та номенклатура из набора Поступление, которая есть в наборе Расход (рис. 16.444). Расход номенклатуры Номенклатура Поступило Продано Сумма Сумма Восстановление даншх Диагностике компьютера Копетьютер для дома Комтьютер для офиса Компьютер игровой ✓Иикрофон XMohmtopLCD Ремонт компьютера Сопутствую але услуги ЮДЮ здю ТЖ здю 1ДЮ 1,000 поступления продажи 10 000,00 Итого 1ДЮ 10,0001 2ДЮ 4.0001 2ДЮ 2,000 4ДЮ 4 500ДО 5 Ш ДО 2 000ДО 10000ДО 10000до 13 000.00 7 000,00 ~ 2 ОООДОЧ 34 000.00 22 000.ЕМУ ______________ 6 000 ДО 2 000 ДО 24,000 20,000 51 000 ДО 76 500,00 Рис. 16.444. Результат отчета Создадим отбор на уровне всего отчета на поле зависимого набора Поступ- ление (рис. 16.445). 1ТГ| Парам... rffi Пользе... щ] Группи... Поля I л>И Отбор I Сортир... Условн... пЯ Дополи.. Текущий элемент инеет собственный отбор (для Фильтрации записей, выводимых ©элементе) Выбрать Вседействия* Добавить ноеыйэлемант i Сгруппировать условия । । Qi Все действия’' Доступные поля +• = Номенклатура Поле Вид сравнения ? Отбор @ = Поступило Больше = Продано = Сумна поступления = Сумла продажи Рис. 16.445. Отбор отчета по полю зависимого набора данных Том 2
G п pa вон ник] раз р а б.отл и ка В результате в отчет попадут только связанные по полю Номенклатура записи из обоих наборов данных, то есть тип связи будет Внутренним соединением (рис. 16.446). Отбор: Поступило Больше "4" Расход номенклатуры Номенклатура Поступило Продано Сумма Сумма ________________________ поступления продажи Веб-камера | 10,000| 3,0001_10 000,00 4 500,00 Микрофон_____| 10,000| 2,000!__7 000,00 2 000,00 Итого______________20 ДОО 5,000 17 000,00 6 500,00 Рис. 16.446. Результат отчета С точки зрения эффективности исполнения отчета лучше получать в дочернем наборе сразу только те записи, которые удовлетворяют условию связи наборов данных. Для этого нужно указать в запросе дочер- него набора параметр связи и использовать его в схеме компоновки при описании связи. Иначе в дочернем наборе будет получено много лишних записей, которые затем будут откидываться как не удовлетворя- ющие условию связи (рис. 16.447). Т5] Отчвг СборкаСистемныхБлоков: Q сновнаяСхемаКомпоновкиДанных □ X Наборы данных | Салон наборе... | Вычисляемые... Ресурсы Параметры Макеты Вложенные ст.. Настройки Источник связи | Приемник связи Выражение источник Выражение приемник Параметр I Список... Условие... Началь... Обязаг... РетистрСБ | ДокчментСБ Регистратор Ссылка 0 Рис. 16.447. Описание связи наборов данных с использованием параметра связи ПОДРОБНЕЕ Конкретный пример описания такой связи можно посмотреть в разделе «Примеры разработки отчетов» на стр. 157. если набор данных зависит от некоторого набора и в связи указана возможность использования списка параметров, данные из зависи- мого набора данных будут получаться порциями по 1000 записей. Если использование списка параметров в связи не разрешено, записи будут получаться по одной; если родительский и зависимый наборы данных содержат поле с одинаковым именем, то данные поля будут извлекаться из родитель- ского набора. Несвязанные наборы данных не могут содержать поля с одинаковыми именами; данные зависимого набора не могут быть получены без получения данных из родительского набора, если у них нет общего родителя, в котором данное поле также присутствует; 2W
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 если ни одного поля зависимого набора данных не участвует в настройках системы компоновки данных, то этот набор не будет включен в макет компоновки данных; в одной группировке не могут быть использованы поля из не связанных друг с другом наборов данных. При этом наборы данных, имеющие общие родительские наборы данных, связанными не считаются. Исключение сделано для полей-итогов, которые могут быть использо- ваны в любой группировке; если в группировке используются данные из нескольких наборов данных, при исполнении компоновки осуществляется обход по послед- нему зависимому набору данных. Связь наборов данных по периодам В некоторых отчетах требуется получать данные из нескольких наборов, при этом связь между наборами данных требуется выполнять по периодам. Рассмотрим эту возможность на примере отчета ОстаткиИПродажиТо- варов (стр. 171). Допустим, требуется выдать в отчет данные по остаткам товаров на складах по месяцам и выдать объем продаж по каждому товару за каждый месяц. Для реализации такого отчета в схеме компоновки данных создано два набора данных: набор данных Остатки с остатками товаров по периодам, набор данных Продажи с продажами товаров за период. Для того чтобы получить остатки товаров по периодам, используется виртуальная таблица регистра накопления ОстаткиНоменклатуры.Остат- киИОбороты. Набор данных Остатки можно получить с помощью следую- щего запроса (листинг 16.107). Листинг 16.107. Текст запроса набора данных «Остатки» ВЫБРАТЬ ОстаткиНоменкпатурыОстаткиИОбороты.Период, ОстаткиНоменклатурыОстаткиИОбороты.Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток ИЗ РегистрНакоппения.ОстаткиНоменклатуры.ОстаткиИОбороты(,, Месяц,,) КАКОстаткиНоменкпатурыОстаткиИОбороты Продажи за период можно получить при помощи виртуальной таблицы регистра накопления Продажи.Обороты. Для получения набора данных Продажи можно использовать следующий запрос (листинг 16.108).
Листинг 16.108. Текст запроса набора данных «Продажи» ВЫБРАТЬ ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериодаПродаж, &КонецПериодаПродаж,,) КАК ПродажиОбороты Так как система компоновки данных позволяет выполнять связь между наборами данных только по их полям, необходимо обеспечить в обоих наборах данных поля начала и конца периода. Для этого тексты запросов для получения наборов данных изменены следующим образом (листинги 16.109, 16.110). Листинг 16.109. Текст запроса набора данных «Остатки» ВЫБРАТЬ ОстаткиНоменклатурыОстаткиИОбороты.Период КАК Началопериода, КОНЕЦПЕРИОДА(ОстаткиНоменклатурыОстаткиИОбороты.Период, МЕСЯЦ) КАК КонецПериода, ОстаткиНоменклатурыОстаткиИОбороты. Номенклатура, ОстаткиНоменклатурыОстаткиИОбороты.КЬличествоНачальныйОстаток КАК НачальныйОстаток ОстаткиНоменклатурыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КонечныйОстаток ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты(,, Месяц,,) КАК ОстаткиНоменклатурыОстаткиИОбороты Листинг 16.110. Такст запроса набора данных «Продажи» ВЫБРАТЬ &НачалоПериодаПродаж КАК НачалоПериода, &КонецПериодаПродаж КАК КонецПериода, ПродажиОбороты.Номенклатура, ПродажиОбороты.КоличествоОборот КАК Количество {ВЫБРАТЬ НачапоПериода, КонецПериода, Номенклатура.*, Количество) ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериодаПродаж, &КонецПериодаПродаж,, {(Контрагент).*, (Номенклатура).*}) КАК ПродажиОбороты В тексте данного запроса используется расширение языка запросов для системы компоновки данных — часть запроса, заключенная в фигурные скобки. В конструкции {ВЫБРАТЬ...} указывается список доступных полей набора данных, а в параметрах виртуальной таблицы {(Контрагент).*, (Номенклатура).*} указывается список полей, по которым на результат запроса можно наложить условие, то есть перечисляются поля, которые будут доступны в настройках отбора схемы компоновки данных. Теперь нужно обеспечить связь наборов данных Остатки и Продажи по номенклатуре и полям периодов. На закладке Связи наборов данных создаются три связи между наборами Остатки и Продажи. Профессиональная разработка в системе «1С:Предприятие 8»
Сначала наборы данных связываются по полю Номенклатура. Затем (во второй и третьей строке) для указания связи по полям-периодам в полях Выражение источник и Выражение приемник указывается поле НачалоПериода/КонецПериода. В поле Параметр из списка параметров выби- рается параметр НачалоПериодаПродаж/КонецПериодаПродаж зависимого набора данных, в котором будет храниться значение связи (рис. 16.448). Й Отчет ОстаткнИПродажиТоваров: ОсновнаяСхемаКомпоновкиДанных □ X Наборыданных | Связи наборов двн.. | Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы Настройки Ох Источник связи Приемник связи Выражение источник Выражение приемник Параметр Список п.. Условие.. Начальн... 0... Остатки Продажи Номенклатура Номенклатура о 0 Остатки Продажи НачалоПериода НачалоПериода НачалоПериодаПродаж □ 0 Остатки Продажи КонецПериода КонеиПериода !□ 0 Рис. 16.448. Описание связи наборов данных Из описания связей видно, что для записей набора данных Остатки будут получаться записи набора данных Продажи для нужного периода и нужных товаров. При этом значения полей Началопериода и КонецПериода набора данных Остатки будут использоваться в качестве значений параметров виртуальной таблицы Продажи.Обороты. В результате отчет, сформированный за период 01.12.2011—31.01.2012, будет иметь вид (рис. 16.449). Рис. 16.449. Результат отчета Том 2
LG п pa вон ник] разработу и ка] Расчет итогов Система компоновки данных позволяет выводить в отчет данные из нескольких наборов. При этом в некоторые группировки могут попа- дать записи некоторого набора данных по нескольку раз. Однако в случае использования связанных наборов данных при расчете итога каждая запись будет учтена только один раз. Если отчет получен с использова- нием связи двух таблиц в запросе, общий итог будет содержать суммы по всем строкам, что неверно. Для примера рассмотрим вывод отчета с использованием двух связанных наборов данных. Создадим набор данных, получающий остатки номенклатуры при помощи запроса (листинг 16.111). Листинг 16.111. Текст запроса ВЫБРАТЬ ОсгаткиНоменкпатурыОстатки.Номенкпатура, ОстаткиНоменкпатурыОстатки.Скпад, ОстаткиНоменклатурыОстатки.КоличествоОстаток РегистрНакопления.ОстаткиНоменкпатуры.Остатки КАК ОстаткиНоменклатурыОстатки Укажем ресурс отчета — КоличествоОстаток. Создадим в настройках отчета группировку Детальные записи и выберем поля: Номенклатура, Склад, Коли- чествоОстаток (рис. 16.450). Наборыда... Связи набо... Вычисляем.. Ресурсы Параметры Макеты Вложенше... | Настройки | Рис. 16.450. Настройки отчета В режиме 1С:Г1редприятие создадим в отчете отбор (рис. 16.451). Пара... Польз... Д Групп.. Д Поля | [М Отбор | цД Сорги... Услоа... Qg Допо.. ТекущАэлеменг имеет собственный отбор (для фильтраты записей, выводимым вэлементе| Выбрать Вседействия’ Добавигьноеьйзлеменг । Сгруппировать услсеия i X i О Вседействия’ Доступные поля Поле Вид сравнения Значение = Количество Остаток т- Отбор '+ = Склад £□ Параметры 0 = Номенклатура Равно о. Рис. 16.451. Настройка отбора
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Выполним отчет (рис. 16.452). Отбор: (Номенклатура Равно "Монитор LCD*) Номенклатура Склад Количество Остаток Монитор LCD 1 Розничный 10001 Монитор LCD (основной 10001 Итого 2,000 Рис. 16.452. Разультат отчета Создадим набор данных, получающий продажи номенклатуры при помощи запроса (листинг 16.112). Листинг 16.112. Текст запроса ВЫБРАТЬ ПродажиОбороты.Контрагент, ПродажиОбороты.Номенкпатура, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот ИЗ РегистрНакоппения.Продажи.Обороты КАК ПродажиОбороты Укажем ресурсы отчета — КоличествоОборот и СтоимостьОборот. Создадим в настройках отчета группировку Детальные записи и выберем поля: Номен- клатура, Контрагент, КоличествоОборот, СтоимостьОборот (рис. 16.453). Наборыда... Связи набо... Вычисляем... Ресурсы Параметры Макеты Вложенные... | Настройки | Рис. 16.453. Настройки отчета Выполним отчет с таким же (см. рис. 16.451) отбором (рис. 16.454). Отбор: Номенклатура Равно "Монитор LCD* Номенклатура Контрагент Количество Стоимость _______________________________Оборот_________Оборот Монитор LCD |ООО"СтWb" | 1,00 12000,00| Монитор LCD {ООО'Автоматиса* | 100 10 000001 Итого 2,00 22 000,00 РиС. 16.454. РВЗуЛЬТЭТ ОТЧвТЭ Свяжем два указанных выше набора данных по полю Номенклатура (рис. 16.455). 2У2
Наборы дани... | Связи набор... | Вычисляемы.. Ресурсы Параметры Й> й Макеты Вложенные с... Настройки Источник связи Приемник связи I Выражение источник Выражение приемник Параметр НвборДанньк1 Набор Данных? | Номенклатура Список па... Условие... Начально... □ Рис. 16.455. Связь наборов данных Укажем ресурсы отчета — КоличествоОстаток, КоличестаоОборот и Стои- мостьОборот. Создадим в настройках отчета группировку Детальные записи и выберем поля: Номенклатура, Контрагент, Склад, КоличествоОс- таток, КоличествоОборот, СтоимостьОборот (рис. 16.456). Наборыданных Связи наборов... Вычисляемые... Ресурсы Параметры Мекеты Вложенные схе... | Настройки | Рис. 16.456. Настройки отчета Выполним отчет с таким же (см. рис. 16.451) отбором (рис. 16.457). Отбор: Номенклатура Равно 'Монитор LCD" Номенклатура Контрагент Склад Количество Остаток Количество Оборот Стоимость Оборот Монитор LCD ООО "Стиль* Розничный 1,000 1 ДО 12000 до Монитор LCD ООО ‘Автоматика* Розничный 1,000 1,00 10000 до Монитор LCD ООО *Стиль* Основной 1,000 1 до 12000 ДО Монитор LCD ООО *Автоматика* Основной 1,000 1Д0 10000до Итого С 2ДОО 2 ДО 22 000 ДО. Рис. 16.457. Результат отчета Мы видим, что за счет соединения записи из обоих наборов данных выводятся в результат по нескольку раз. Однако общий итог по таблице рассчитан правильно за счет того, что в расчете итогов каждая запись участвует только один раз. Получим теперь такой же отчет с использованием связи двух таблиц в запросе (листинг 16.113). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 16.113. Текст запроса ВЫБРАТЬ ОстаткиНоменкпатурыОстатки.Номенкпатура, ОстаткиНоменкпатурыОстатки.Скпад, ОстаткиНоменклатурыОстатки.КоличествоОстаток, ПродажиОбороты.Контрагент, ПродажиОбороты.КоличествоОборот, ПродажиОбороты.СтоимостьОборот ИЗ РегистрНакоппения.ОстаткиНоменкпатуры.Остатки КАК ОстаткиНоменкпатурыОстатки ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты ПО ОстаткиНоменкпатурыОстатки.Номенкпатура = ПродажиОбороты.Номенклатура Создадим такие же ресурсы и настройки отчета, как и в предыдущем случае (см. рис. 16.456). Выполним отчет с таким же (см. рис. 16.451) отбором (рис. 16.458). Отбор: (Номенклатура Равно 'Монитор LCD") Номенклатура Контрагент Склад Количество Количество Стоимость MowrropLCD MowrropLCD MowrropLCD MowrropLCD Итого Остаток Оборот 1 доо 1,ооо’ 1ДЮ‘ 4,000 Оборот юооо до 12000ДО 10000до —13000ДО 44 000,оф Рис. 16.458. Результат отчета Мы видим, что итоговые значения содержат суммы по всем строкам. В данном случае - это неверный результат. Использование нескольких схем компоновки для одного отчета Каждый отчет может иметь несколько схем компоновки данных. Иногда бывает нужно выполнить один и тот же отчет, по-разному представив данные в нем, в зависимости от ситуации. Например, в одной схеме компоновки данные для отчета получаются при помощи запроса к инфор- мационной базе, а в другой — заполняются программно из таблицы значений. Затем нужная схема компоновки может быть программно или визуально установлена для отчета. Чтобы создать для отчета новую схему компоновки, нужно раскрыть его в дереве отчетов конфигурации, выделить ветвь Макеты и нажать кнопку Добавить в командной панели окна конфигурации (рис. 16.459). Либо можно открыть отчет двойным щелчком мыши и на закладке Макеты нажать кнопку Добааить в командной панели отчета (рис. 16.460). В открывшемся конструкторе макета нужно ввести имя схемы компо- новки данных, выбрать тип макета Схема компоновки данных и нажать Готово (рис. 16.461). Том 2
G п pa вон ник] раз р а б.отл и ка Конфтгурация X Действия _______________к •' jjl ___________ и СистемаКсмюновкиДанных + £• Обшив * 8? Константы * Щ Справочники t Z0 Документы ^1 Журналы документов +' [.) Перечисления т ft Отчеты *• |iu] ОстаткиНоменклатуры .+ ft ОтчетПоСистемнынблокам - ft СписокНоменклатуры в Реквизиты Ш Таблгеш части 0 Формы • - О Команды т ру] ооущ| ОсноенвяСхемаКомпоновкиДанных Иерар»мДега1ЪныхЗаписей + Ё ПродажиНоменклатуры • +' ft ОтчетПоПродажам т ft СборкаСистемыСлокое *' Ё ОкаэаниеУслуг + ft П вступление! оварса —• й , Рис 16 459 Создание новой схемы компоновки данных ft Отчет СписокНоменклатуры Основные Подсистемы Функциональные опции Дантые Формы Команды к Макеты Права Прочее | Действия -1 | <Наэад | | Далее) | | Закрыть 11 Справка | Рис. 16.460. Создание новой схемы компоновки данных Имя ИераршяДетальныкЗалисей j Синоним Иерархия детальных записей Q| Комментарий | - Выберите тип макета:------- О Табличтый док«риенг О Текстовый док^риенг О Двоичные данные QAciive docunent ОНТМ|_докдонт О Географическая схема ОГраФжеская схема (•^м^комп^^дант^Д О Макет оформления компоновки данных Загрузить из Файла | Гетоео | | Отмена | | Справка | Рис. 16.461. Создание новой схемы компоновки данных 2^®
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Чтобы при вызове из меню Отчеты отчет выполнялся в соответствии с новой схемой компоновки данных, нужно установить ее в качестве основной схемы для отчета на закладке Основные (рис. 16.462). Рис. 16.462. Установка основной схемы компоновки данных для отчета Теперь отчет Список номенклатуры будет выполняться из меню Отчеты в соответствии со схемой компоновки данных ИерархияДетальныхЗаписей (рис. 16.463). Рис. 16.463. Результат выполнания отчата из панели действий приложения 2У41
Однако этот же отчет программно выводится в табличный доку- мент из формы списка справочника Номенклатура по команде Печать. При его программной компоновке в функции ВывестиСписокНоменк- латуры() используется макет отчета — ОсновнаяСхемаКомпоновкиДанных (листинг 16.114). Листинг 16.114. Функция модуля формы «ВыввстиСписокНомвнклатуры ()» &НаСервереБезКонтекста Функция ВывестиСписокНоменклатуры() СхемаКомпоновкиДанных = Отчеты.СписокНоменклатуры. ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; КонецФункции Таким образом, при выполнении в этом случае отчет будет иметь другой вид (рис. 16.464). (омллектуюцие Материнская плата Память Жесткий диск Монитор LCD Веб-камера Микрофон Моя иерархия___________ Мониторы______________ ОЗУ___________________ Основные детали_______ Товары для сборки_____ Прочие детали_________ Зибранные компьютеры Кожьютер для офиса____ Кожьютер для дома_____ Кожьютерифовой________ /слуги Сборка комыотера Диагностика компьютера Ремонт компьютера Сопутствую аде услуги Восстановление даншх ml Sei 1л де Склад Основной Основной 2,000 2,000 Материалы Материалы Материалы Материалы Материалы Материалы Материалы Материалы Материалы Материалы Комплекты Комплекты Комплекты Услуги Услуги Услуги Услуги Услуги Розничный Розничный Розничный 2 ДОО 7,000 0,000 Рис. 16.464. Результат выполнения отчета из формы списка справочника «Номанклатура» Многоязычные отчеты Система компоновки данных под держивает работу в многоязычной среде. Дело в том, что с одной и той же информационной базой могут рабо- тать пользователи, родным языком для которых является не русский язык, а другой, например английский. В этом случае хотелось бы, чтобы пользователь видел отчет (вернее оформление этого отчета) на привычном ему языке. При этом мы не рассматриваем вопрос того, как хранить собственно данные на двух Профессиональная разработка в системе «1С:Предприятие 8»
языках (например, русское и английское название номенклатуры). Здесь мы рассматриваем задачу, как предоставить англоязычному поль- зователю, например, возможность видеть заголовок, шапку отчета на английском языке, пользоваться возможностями отборов, сортировки, настройки отчета также на родном языке. Для работы с разными языками в конфигурации можно определить несколько языков и затем каждому пользователю информационной базы в его настройках указать тот язык, который должна использовать система. При этом она автоматически сформирует пользователю все системные меню на его родном языке. Но о том, что касается конкретного приклад- ного решения (например, конкретного отчета), разработчик должен позаботиться самостоятельно, так как система заранее «не знает», что именно и как нужно представлять на другом языке. Для этого в системе компоновки данных есть возможность задавать названия полей, заголовков отчета, параметров, вычисляемых и пользо- вательских полей, представлений отбора и оформления, макетов полей и т. п. на нескольких языках. Для примера добавим в конфигурацию еще один язык. Раскроем ветвь Общие дерева объектов конфигурации. Выделим ветку Языки и нажмем кнопку Добавить в командной панели окна конфигурации (рис. 16.465). Конфигурация X Действия и- Б|! СисгемаКомпноекмДанных •- Общие Подсистемы +. [®] Общие модули Параметры сеанса •+ Y Роли Общие реквизиты Планы обмена Критерии отбора Й Подписки на события 0 Регламентные задания '+ “Е Функциональные опции (~* Параметры Функциональных опций 19 Хранилища настроек 4. Е Общие Формы О Общие команды UJ Г ругты команд . .. + И Общие макеты S Общие картинки •* 0 XDTO-пакеты 4 Web-сервисы WS-ссыжи О Элементы стиля Русский Английский •* За Константы * Рис. 16.465. Добавление языка Дадим ему имя Английский (рис. 16.466). Том 2
G п pa вон ник] раз р а б.отл и ка Свойства: Английский X *1№х '__________________________________________________ ▼ Основные: ________________________________________________________j Синоним | Английский_________________________________Q | Комментарий [I О>м языка |епр | Рис. 16.466. Установка свойств языка Кроме имени обязательно нужно задать и код языка (в данном случае eng). Именно по нему система будет определять принадлежность тех или иных интерфейсных надписей к конкретному языку. ВНИМАНИЕ! При смене кода языка все введенные названия полей, параметров, заго- ловков отчета и т. п. нужно будет продублировать, выполнив команду конфигуратора Правка - Редактирование текстов интерфейсов. Откроем отчет ОтчетПоПродажам. На закладке Основные мы увидим кнопку открытия со значком лупы, появившуюся справа у поля Синоним. В случае использования нескольких языков этот значок появляется у всех элементов отчета, для которых можно задать названия на нескольких языках. Нажав на значок лупы, зададим синоним отчета на английском языке - Sales report, который будет отображаться на панели действий приложения, в группе Отчеты (рис. 16.467). 151 Отчет ОтчетПоПродажам □ X Рис. 16.467. Установка синонима отчета на английском языка Откроем схему компоновки данных отчета. На закладке Наборы данных, в поле Заголовок вводятся имена полей, которые будут отражаться в шапке отчета и в окне настроек для пользователя. Установив флажок слева от заголовка поля, мы можем отредактировать заголовки полей в отчете.
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Выделив нужный заголовок двойным щелчком мыши и нажав на значок лупы, зададим заголовки полей на английском языке (рис. 16.468). Рис. 16.468. Установка заголовка поля на английском языке Аналогично можно задать англоязычные заголовки вычисляемых и пользовательских полей, заголовки выбранных полей и их групп, полей параметров (рис. 16.469, 16.470). Т5! Отчет ОтчетПоПродажам: ОсновнаяСхемаКомпоновкиДаннык □ X Наборыданных Связи наборов... Вычисляемое... Ресурсы | Параметры | Макеты Вложенные схе... Настройки Ф К £ О Имя Заголовок Тип Доступн... Д... Значение Выражение Парамет... । В... 10... 13.. । Исполь... Г НачалоПерисда Начало периода Дата О ^Период.... @ 0 О Авто КонецПеридда Конецпериода Дета_______________________D_______________ЬПериод...._________0 0 □ Авто________ Период ^^^СтанмртныйПериод [0 [Q |О |Авто Строки на равных языках X Русский I ОК | |ИМ!И1 | | Отмена | Английский [Period j IZ Рис. 16.469. Установка заголовка параметра на английском языке Также можно задать англоязычные представления для именованного отбора или условного оформления в колонке Представление (рис. 16.471). Также можно задать англоязычное представление варианта отчета и англо- язычный заголовок отчета или его отдельных элементов (рис. 16.472).
Т5! Отчет ОтчетПоСистемнымБлокам: ОсновнаяСхемаКомпоновкиДанных □ X Наборыданных Свлеи наборов... | Вычисляемые... | Ресурсы Параметры Макеты Вложенные схе... Настройки ф « Путь к Выражение ' Заголовок Ограиичениедост... Выражение Выражения ' Тип I Доступные Оформление данным _ .. _ .. представле... упорядочив... значения ! значения _ п... У... г... У... параметр... Прибыль СтоимостьРасход • lilSIHIMi □ о о о I СтоимостьПрикод Строки на разных языках X Русский I ОК | |ШДВШ] | Отмена | Английский | Profit j Рис. 16.470. Установка заголовка вычисляемого поля на английском языке Параметры Выбраниы... Отбор Сортировка | Условное... | Польэоват... Другие на... Рис. 16.471. Установка представления условного оформления на английском языке Й Отчет ОтчетПоПродажам: ОсноенааСхемаКомпоноекиДанных _ □ х"! Рис. 16.472. Установка представления варианта отчета и его заголовка на английском языке Если для отчета создан предопределенный макет, система компоновки данных позволяет задавать многоязычные заголовки макетов полей и группировок. Для примера откроем схему компоновки ПечатьСборки документа СборкаСистемныхБлоков. На закладке Макеты выделим ячейку, имеющую тип заполнения Текст или Шаблон, вызовем окно редакти- Профессиональная разработка в системе «1С:Предприятие 8»
рования ее свойств и, нажав кнопку открытия со значком лупы, введем заголовок на английском языке (рис. 16.473). Свойства: Ячейки ;i ч х * | Ячейки ▼ Основные: Имя Защит! Гиперс Режим ▼ Макет За поль Парам И спот Русси* I QK | Номенклатура | Отмена | АтгпАский Nomenclature СодержитЗначение О ТипЗначемия ЗлемекгУправлемия Формат |__________________________________________... Q| ФорматРеоактироеания | Q| Маска | 1 ▼ Положение: ГоризонгальноеПоложение | Центр ▼ | П-В----------»------1—1___________________________________________ Рис. 16.473. Установка заголовка макета ячейки на английском языке Теперь запустим «1С:Предприятие» командной строкой "C:\Program Fi!es\1Cv82\8.2.15.310\bin\1cv8.exe" /L еп для англоязычного интерфейса от имени пользователя, для которого установлен английский язык. Чтобы установить для пользователя английский язык, выполним в меню конфи- гуратора пункт Администрирование ► Пользователи, выберем в списке пользователя и в открывшемся окне, на закладке Прочие укажем для него свойство Язык (рис. 16.474). Рис. 16.474. Установка английского языка для пользователя Выполним Отчет по продажам, выделив в списке отчетов его синоним на английском языке (Sales report), введенный нами ранее. Укажем произвольный отчетный период 01.12.2011—31.12.2011 и сфор- мируем отчет кнопкой Create. В результате заголовки полей отчета, параметров и системные поля будут выведены в англоязычном варианте (рис. 16.475). Том 2
LG п pa вон ник] разработу и ка] Рис. 16.475. Результат отчета в англоязычной среде Выберем вариант отчета, представляющий динамику продаж в виде диаграммы. Для этого нажмем кнопку Select variant... и выберем вариант Dynamics of sales (рис. 16.476). Рис. 16.476. Вариант отчета «Динамика продаж» в англоязычной среде
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Вызовем печать документа Сборка компьютера, для которого ранее мы создали предопределенный макет и задали заголовки полей табличной части на английском языке (рис. 16.477). 1 fl Nomenclature Amount Price Total 1 (Жесткий диск | 1| 4 000 I 4 000 2 Материнская плата 1 3 000 I 3 000 з|память I l| 2 000 | 2 000 4 (сборка компьютера I l| 1 500| 1 500 10 500 Рис. 16.477. Печать документа, использующего предопределенный макет в англоязычной среда Поля Автоматическое заполнение полей В конструкторе схемы компоновки данных на закладке Наборы данных находится флажок Автозаполнение, который позволяет управлять свойс- твом набора данных АвтоЗаполнениеДоступныхПолей (рис. 16.478). Й Отчет ОтчетПоПродажам: ОоновнаяСяемаКемпеновкиДаиньш □ X Рис. 16.478. Автоматическое заполнение полей набора данных При создании набора данных типа Запрос данный флажок установлен по умолчанию. Свойство АатоЗаполнениеДоступныхПолей указывает, что система должна самостоятельно сформировать состав полей, доступных
для схемы компоновки данных, на основании текста запроса, содержаще- гося в наборе данных. Доступные поля — это те поля отчета, которыми оперирует схема компо- новки. Они могут быть использованы в настройках отчета (сортировке, отборе и др.), участвовать в группировках отчета, формировании вычисляемых полей и пр. Затем можно поставить флажок ограничения доступности у поля на его участие в отображаемых полях отчета (колонка П... — недоступно для выбора), создание условий (У... — недоступно как условие), группировке (Г... — недоступно для группировки), сортировке (У... — недоступно для упорядочивания). И тогда данное поле не будет участвовать в этих настройках (см. рис. 16.478). При автоматическом заполнении полей наборов данных действуют следу- ющие правила. 1. Все поля списка выборки запроса и их дочерние поля становятся доступными для настроек отчета: отбора, сортировки, выбора, груп- пировки и т.п. Заметим, что доступность поля будет определяться по его типу. Например, поле неограниченной длины не может быть использовано в качестве поля группировки. 2. Поля виртуальных таблиц, на которые можно наложить условия в параметрах этих таблиц, становятся доступными для отбора. 3. Параметры виртуальных таблиц становятся доступными парамет- рами. Также становятся доступными все параметры, явно указанные в запросе. Для примера рассмотрим отчет Отчет по продажам. Набор данных для него получается с помощью следующего запроса (листинг 16.115). Листинг 16.115. Такст запроса ВЫБРАТЬ ПродажиОбороты.ПериодДень, ПродажиОбороты.ПериодМесяц, ПродажиОбороты.Контрагент, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость ИЗ РегистрНакопления.Продажи.Обороты(,, Авто,) КАК ПродажиОбороты В соответствии с первым правилом поля Контрагент, ПериодДень, Пери- одМесяц, Стоимость, Количестао будут доступны для отбора, сортировки, группировки, выбора (см. рис. 16.478). Мы видим, что платформа автоматически заполнила колонки Поле, Путь и Заголовок полей текущего набора данных исходя из псевдонимов полей запроса: в колонке Поле отображается нередактируемое значение имени поля, которое платформа автоматически формирует из текста запроса. Это внутреннее имя поля, использующееся только в тексте запроса; Профессиональная разработка в системе «1С:Предприятие 8»
в колонке Путь содержится строка, содержащая путь к данным, по которому к нему можно обратиться в других закладках конструк- тора схемы компоновки данных. Оно может быть отредактировано. Имена полей, описанные в этой колонке, появляются для разработчика на закладке выбора полей в отчете, описания вычисляемых полей, полей группировки и др., поэтому разработчик может настроить их более понятными для себя; Заголовок содержит название поля, под которым поле будет фигуриро- вать в настройках отчета в режиме 1С:Предприятие и в шапке отчета. При этом свойства Поле и Путь доступных полей схемы компоновки данных генерируются на языке, соответствующем варианту встроенного языка конфигурации. Например, если установить в свойствах конфи- гурации свойство Вариант встроенного языка в значение Английский, то доступные поля набора данных примут следующий вид (рис. 16.479). Свойства SI х ▼ Основные: X Синоним [Демонстрационная конфигурация “Система компоновки данны Q| Комментарий [ | Основной режим запуска ^Гариакт встроенногоязь» Основная роль Модуль управляемого приложения \ Открыть Модуль сеанса t Открыть Модуль внешнего соединания Открыть Дополнительные словари полнотекстового поиск) [Управляемое приложение (АклийсиЛ э> = MonthPeriod = КоличесгеоТш... = Контрагент Путь Автоэаголовок DayPeriod О Период.день MonthPeriod О Периса, месяц КоличесгеоТиптоуег Q Количество Оборот Контрагент □ Контрагент Ограничение поля 1 Роль 1 Выражени... Проверка нарар» 1 П... У... Г... У... Выражения 1 Набор данных _ упорядочи... _ Ограничение рек... Параметр П... У... Г " 9 "_______________________________________ ’ О’ □” Период. 1. Дол □ □ □ □ Период. 2. Доп □ □ □ □ □ □ □ □ Измерение □ □ □ □ Рис. 16.479. Автоматическое заполнение попей набора данных Для свойства Заголовок можно задать представление, соответству- ющее языкам, определенным в конфигурации. Для этого нужно установить флажок слева от заголовка поля и нажать кнопку открытия в данном поле. В соответствии со вторым правилом поле Номенклатура хотя явно не присутствует в запросе, будет доступно для отбора, так как на него можно наложить отбор в параметрах виртуальной таблицы (рис. 16.480). В соответствии с третьим правилом параметры Началопериода IB Констр! Таблицы g ft Баэадан! 4 Щ С Пара* Начале дСонецГ Перна Услова [ Запрос и КонецПериода хотя они явно не указаны в запросе, попадут Рис-1С Том 2
G п pa вон ник] раз р а б.отл и ка в доступные параметры схемы компоновки данных, так как их можно указывать в виртуальной таблице (рис. 16.481). Параметры Выбранны... | Отбор | Сортировка Условное... Польэо&а... Доступные поля = Количество .+ = Контрагент в = ПериодДень = ПериодМесяц = Стоимость +' Сэ ПарамвтрыДанных Представление Рис. 16.480. Доступные поля для отбора в схвмв компоновки данных Й Отлет ОтчетПоПродажам: ОсноенаяСяемаКемпеновкнДвяньи_____________________________________________________ □ X Наборыданных Связи наборов... Вычисляемые...Ресурсы | Параметры | Макеты Вложенные схе... Настройки Ijj .. V О’ S Заголовок Тип Доступны... Д... Значение Выражение Параметр.. В... О... 3... Испольэ... Па 1ериэда\ Началопериода M6HGSmS । । (Период.... 171 171 I I Авто ериода х Конецпериода Дета О (Период.... 0 0 О Авто Рис. 16.481. Доступные параметры в схаме компоновки данных При этом имена доступных параметров схемы компоновки данных генерируются на языке, соответствующем варианту встроенного языка конфигурации. Проиллюстрируем эти два правила на примере. В конструкторе запроса схемы компоновки данных Отчета по продажам вызовем диалог пара- метров виртуальной таблицы. В этом диалоге мы увидим параметры Началопериода и КонецПериода, которые становятся доступны при авто- заполнении. Вызовем диалог для создания условия виртуальной таблицы. jKTop запроса и поля | Группировка Условия Дополнительно Объединения/Псе... Порядок Компоновка дани.. Характеристики Пакет запросов & & X Поля | Таблицы чых праеочнмки етры виртуальной таблицы 1ИЧНОСТЬ родажиО бороты | | ПродажиОбороты ПериодДень | ПродажиОборотыЛериодМесяц ПродажиОбороты. Контрагент ПродажиОборотыКоличествоОборот ПрсдажиОборогыСтоимостьО борот ОК | | Отмена | | Справка | Произвольное выражение ОК 11 Отмена 11 Справка | э | >.482. Поля и параметры виртуальной таблицы в конструкторе запроса
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В этом диалоге мы увидим поля Контрагент и Номенклатура, которые становятся доступны для отбора при автозаполнении. То есть если бы поле Контрагент не было указано в выбранных полях запроса и не попало бы в список доступных полей в соответствии с первым правилом автоза- полнения, то оно стало бы доступно для отбора в соответствии со вторым правилом (рис. 16.482). Если в запросе в виртуальной таблице указаны имена параметров, то доступны будут параметры именно с указанными именами (листинг 16.116). Листинг 16.116. Текст запроса ВЫБРАТЬ ПродажиОбороты.ПериодДень, ПродажиОбороты.ПериодМесяц, ПродажиОбороты.Контрагент, ПродажиОбороты.КопичествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость ИЗ РегистрНакопления.Продажи.Обороты({&Начало), {&Конец}, Авто,) КАК ПродажиОбороты При автозаполнении полей на основе приведенного выше запроса доступными будут параметры Начало и Конец вместо НачапоПериода и Конецпериода (рис. 16.483). Наборыданных Связи наборов... Вычисляема... Ресурсы | Параметры | Макиты Вложенныесхе... Настройки <•••> и- О | Имя I Заголовок Тип Доступные... Д... Значение Выражение Параметр.. В.. ' 0... 3.. Испольэо... Пара Конец Z3 □ 0 □ □ Авто Укачало J Начало Дата □ 0 □ □ I Авто I- Рис. 16.463. Доступные параметры в схвмв компоновки данных Если в запросе указано и выражение параметра (&Начало), и пара- метр компоновки данных ({&НачалоПериода}), то значение параметра компоновки данных используется, если значение данного параметра установлено в настройках компоновки. В противном случае в качестве значения параметра используется результат выражения, указанного в параметре виртуальной таблицы (листинг 16.117). Листинг 16.117. Текст запроса ВЫБРАТЬ ПродажиОбороты.ПериодДень, ПродажиОбороты.ПериодМесяц, ПродажиОбороты.Контрагент, ПродажиОбороты.КоличествоОборот КАК Количество, ПродажиОбороты.СтоимостьОборот КАК Стоимость ИЗ РегистрНакопления.Продажи.Обороты(&Начало {&НачалоПериода}, {&КонецПериода}, Авто,) КАК ПродажиОбороты
В этом примере, если в настройках установлено значение параметра НачапоПериода, будет использоваться его значение. В противном случае в сгенерированном тексте запроса останется исходное выражение, т.е. &Начало, и в качестве значения параметра виртуальной таблицы будет использоваться значение этого параметра (рис. 16.484). Наборы данный Связи наборов Вычисляемые... Ресурсы | Параметры | Макеты Вложенные сна... Настройки ® В ., V О Имя > I Заголовок Тип Доступ... Д.. Значение Выраже... Параме... В... 0... 3... Испол... КонецПериода НачапоПериода Начало X Конец периода (начало периода /Начало ТУЕВншЕммЕя Дата Дата □ □□ 0 0 0 0 0 0 О Авто □ Авто □ Авто ! ► Рис. 16.484. Доступные параметры в схаме компоновки данных Все параметры, явно указанные в запросе, также становятся доступными (листинг 16.118). Листинг 16.116. Такст запроса ВЫБРАТЬ СобранныеСБ.СБ КАК СистемныйБлок, СобранныеСБ.Количество, СобранныеСБ.Стоимость, СобранныеСБ.Мастер, СобранныеСБ.Регистратор ИЗ РегистрНакопления.СобранныеСБ КАК СобранныеСБ ГДЕ СобранныеСБ.ВидДвижения = &ВидДвижения И СобранныеСБ.Период >= &НачапоПериода И СобранныеСБ.Период <= &КонецПериода На основе приведенного выше запроса доступными будут параметры НачапоПериода, Конецпериода и ВидДвижения (рис. 16.485). Наборы данных Связи наборов. Вычисляемые... Ресурсы | Параметры | Макеты Вложенные схе... Настройки ... XT О Имя I Заголовок Тип Доступ... Д.. Значение Выраже... Параме... В... 0... 3... Испол.. ВидДвижения | Виддвижения ’ Щ □ Приход 0 0 □ Авто КонецПериода Конецпериода (Дата □ 0 0 □ Авто НачапоПериода Начало периодау 'Дета □ 0 0 □ Авто ± Рис. 16.485. Доступные параметры в схаме компоновки данных Профессиональная разработка в системе «1С:Предприятие 8»
Использование автополей При разработке отчетов система компоновки данных генерирует Автополе для списка выбранных полей и списка сортировки группировок. При формировании отчета Автополе будет преобразовано в набор полей группировки. Формирование набора автополей группировки происходит следующим образом. Берутся используемые выбранные поля со следующими усло- виями: доступны для использования в полях группировки, не являются реквизитами других выбранных полей, не являются реквизитами существующих полей группировки. Если поле уже включено в набор автополя группировки, повторно оно не добавляется. Автополе можно использовать как есть, а можно раскрыть, чтобы посмот- реть, какие поля система туда включила, и при желании их изменить. Чтобы раскрыть список Автополя, нужно выделить его, вызвать его контекстное меню и выбрать пункт Развернуть. Для примера рассмотрим отчет Остатки номенклатуры. В схеме компо- новки данных отчета выделим настройки варианта Оформление, перейдем в режим настроек группировки Детальные записи и развернем список Автополя, выполнив пункт контекстного меню Развернуть (рис. 16.486). Поля группир... | Выбранные па.. | Отбор Сортировка Условное офо... Другие настр... Поле Доступные поля +. = Склад t J Ко1мчествоКонечныйОсгагок .+' J Кол4чествоНачальныйОстеток .+. J Ко/мчествоПриход +' J Кол4чествоРвоход Cd СмстемнывПоля f С: ПараметрыДакьк Новое поле Новая группа Новое авто поле , Изменить [Рэ Скопировать Удалить Переместить вверх Переместить вниз К Свойства элемента пользовательских н< Установить заголовок. Сгруппировать поля Разгруппировать Развернуть Рис. 16.486. Раскрытие списка полей автополя Мы видим здесь поля, выбранные для отображения в отчете (рис. 16.487). Том 2
LG п pa вон ник] разработу и ка] Выделим настройки варианта Основной, перейдем в режим настроек группировки Номенклатура таблицы отчета и развернем список Автополя. В Автополе группировки помещается само поле группировки Номен- клатура, плюс выбранные поля отчета. Поэтому поле группировки не обязательно помещать в список выбранных полей, но если оно там есть, то при формировании отчета оно не дублируется (рис. 16.488). Т5! Отчет ОстаткиНоменклагуры: ОсновнаяСхемаКомпоновкиДанных _ П X Рис. 16.487. Список полай, содержащихся в автополе для детальных записей Т*1 Отчет ОстаткиНоменклатуры: ОсновнаяСявмаКомпоновкиДанных _ □ X Рис. 16.488. Список полай, содержащихся в автополе для группировки таблицы
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Откроем схему компоновки данных отчета Остатки номенклатуры по периодам. Выделим настройки варианта Движение номенклатуры, перейдем в режим настроек диаграммы отчета и развернем список Автополя. Мы видим, что в нем содержится список ресурсов отчета (рис. 16.489). Т^1 Отчет ОстаткиНоменклатурыПоПериодам: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.489. Список полей, содержащихся в автополв для диаграммы Перейдем в режим настроек группировки Склад диаграммы отчета и развернем список Автополя. Здесь присутствует только само поле груп- пировки (рис. 16.490). Т^1 Отчет ОстаткмНоменклатурыПоПермодам: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.490. Список полей, содержащихся в автополв для группировки диаграммы
Рассмотрим использование автополей при сортировке записей груп- пировки отчета. Записи в группировке по умолчанию сортируются по возрастанию значений поля группировки. Выделим настройки вари- анта Основной, перейдем в режим настроек группировки Номенклатура на закладку Сортировка и развернем список Автополя (рис. 16.491). Й Отчет ОстаткиНеменклатурыПоПериодам: ОсновнаяСяемаКомпоновкнДанныя _ □ X Рис. 16.491. Список полай, содержащихся в автополе для группировки таблицы Переопределение представления полей В системе компоновки данных реализована возможность получения представления полей набора данных из синонимов полей запроса. Если синоним для поля не указан, то используется путь к данным поля. Но, кроме того, система компоновки данных предоставляет возможность переопределения представления для полей набора данных. Для переопределения представления поля в конструкторе схемы компо- новки данных на закладке Наборы данных следует ввести соответствующее выражение в колонку Представление для поля набора данных или вычис- ляемого поля (рис. 16.492). । Попе 1 Путь Ограничение поля Роль Выражение представления Заголовок По... Ус... Гр... Уп... Выражения упорядочивания Ограничение рекеиз... Па.. Ус... Гр... Уа.. = О О О О ПвриОД, 1, 0 Период, день = ПериодМесяц ПериодМесяц О О О О Период, 2. 0 Период, месяц Д00 = Контрагент Контрагент О О О О Измерение 0 Контрагент □ □ □ □ = Номенклатура Номенклатура О Рис. 16.492. Выражение представления для поля «Контрагент» Профессиональная разработка в системе «1С:Предприятие 8»
Если выражение представления установлено, то в результат отчета будет выводиться не основное представление поля, а результат этого выра- жения. Для примера рассмотрим отчет Отчет по продажам. В схеме компоновки данных отчета для поля Контрагент в колонке Выражение представления указано следующее выражение (листинг 16.119). Листинг 16.119. Выражение для представления в отчете поля «Контрагент» "(”+Контрагент.КЬд+”)"+Контрагент.Наименование В результате выполнения отчета код контрагента будет отражаться в скобках слева от его наименования (рис. 16.493). Рис. 16.493. Результат отчета В выражении для представления можно также использовать функции из общих модулей. Чтобы функцию можно было использовать в схеме компоновки данных, необходимо чтобы в ее описании присутствовало ключевое слово Экспорт. Например, в общем модуле ФункцииДляОтчетов есть функция ПредставлениеРегистратора(Номер, Дата), листинг 16.120. Листинг 16.120. Функция общего модуля Функция ПредставлениеРегистратора(Номер, Дата) Экспорт Возврат ” №" + СТРОКА(Номер) +" от" + ФОРМАТ(Дата, "ДФ=сй.ММ.уууу"); КонецФункции Тогда в выражении представления для поля можно воспользоваться следу- ющим выражением (листинг 16.121). Том 2
G п pa вон ник] раз р а б.отл и ка Листинг 16.121. Выражение для представления поля с использованием функции общего модуля | ФункцииДляОгчетов.ПредстаалениеРегистратора(Регистратор.Номер, Регистратор.Дата) Если модуль — глобальный, то имя модуля (ФункцииДляОтчетов) перед именем функции можно не указывать. В результате выполнения отчета поле регистратора будет отражено в следующем виде (рис. 16.494). Склад________ Номенклатура Регистратор Основной Приход 13.000 Товары для сборки______________ ОЗУ__________________________ Память_____________________ № 000000002 от 05.12.2011 Основные детали_____________ _______Жесткий диск_____________ __________№000000001 от 05.122011 _______Материнская плата________ __________№ 000000002 от 05.122011 Розничный_______________________ Товеры для сборки_____________ Мониторы____________________ _______Монитор LCD______________ __________№ 000000003 от 06.12 2011 ИЮГО 13,000 5.000 5,000 5 ДОО 8,000 3.000 3.000 5,000 5,000 2,000 2.000 2,000 2.000 2X300 15.000 Рис. 16.494. Результат отчета Необходимо учитывать, что если компоновка данных выполняется при помощи стандартных средств объекта Отчет, то использование внешних функций разрешено. Если же компоновка данных осуществляется при помощи объектов системы компоновки данных, то для того чтобы разре- шить использование внешних функций, необходимо в качестве значения параметра ВозможностьИспользованияВнешнихФункций метода Инициа- лизировать]) объекта ПроцессорКомпоновкиДанных передать значение Истина. В противном случае использовать внешние функции будет невоз- можно (листинг 16.122). Листинг 16.122. Пример инициализации процессора компоновки данных ПроцессорКомпоновки = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновки.Инициализировать(МакетКомпоновкиДанных,, ДанныеРасшифровки, Истина); Вычисляемые поля При разработке отчетов не всегда хватает полей, определенных в наборе данных. Довольно часто бывает нужно отразить какие-то другие поля, которые рассчитываются на основе имеющихся по определенному алго- ритму. Например, требуется рассчитать выручку как разницу между доходами и расходами и т. п. Для этого в системе компоновки данных есть возможность определения вычисляемого поля. Вычисляемые поля представляют собой допол- нительные поля схемы компоновки данных, значения которых будут вычисляться по некоторой формуле. В настройках компоновки данных 2®®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 вычисляемое поле будет фигурировать под именем, указанным в пути к данным этого поля. Пользователь сможет работать с вычисляемым полем точно так же, как и с полем набора данных. Для того чтобы система смогла получить значение вычисляемого поля, необходимо указать выражение вычисляемого поля. Оно описывается на языке выражений компоновки данных. В выражениях вычисляемого поля есть ограничение: в нем нельзя использовать вычисляемые поля. В остальном ограничений нет: можно использовать все синтаксические конструкции языка выражений, можно использовать поля наборов данных, а также функции общих модулей конфигурации, описанные с ключевым словом Экспорт. Для вычисляемого поля можно определить заголовок, ограничение доступности, выражение представления, выражения упорядочивания, тип значения, доступные значения и оформление так же, как для полей наборов данных. Кроме того, вычисляемое поле может быть определено как ресурс. Для этого необходимо добавить данное поле в список ресурсов и указать выражение, по которому будет вычисляться итог. Для примера рассмотрим отчет Отчет по системным блокам. В схеме компоновки данных отчета на закладке Вычисляемые поля находится вычисляемое поле Прибыль. Выражение для его расчета указано в колонке Выражение (листинг 16.123). Листинг 16.123. Выражение для расчета вычисляемого поля «Прибыль» СтоимостьРасход - СтоимостьПриход| Заголовок вычисляемого поля, который будет отображаться в шапке отчета, задается по умолчанию, но можно его изменить или задать его в случае использования в конфигурации нескольких языков (рис. 16.495). Отчет ОтчетЛоСистемнымБлокам: ОсноенаяСхемаКомпоновкиЛанных _ П X Наборыданных Связи наборов... | Вычисляемые... | Ресурсы Параметры Макеты Вложенные схе... Настройки X Путь к Выражение Заголовок Ограничениедост... Выражение Выражения Тип значения Доступные Оформление данным „ ,, „ ,, представ ле... упорядочив... значения _ П... У... Г... У... к Параметры... Прибыль /игои«юстьРасход\ WMWMWFQJDODD \Огои«юстьПрих(и/ Рис. 16.495. Описание вычисляемого поля Вычисляемое поле можно добавить в ресурсы отчета, чтобы вычислять по нему групповые и общие итоги (рис. 16.496). 2®^
Т*1 Отчет ОтчетПоСистемнымБлокам: ОсноенаяСхемаКемпоновкиДанных □ X Наборыданных Связи наборов,,. Вычисляемые,,, | Ресурсы | Параметры Макеты Вложенные схе... Настройки Доступные поля = КоличествоПриход = КоличествоРасход = КонечныйОстагок в НачальныйОстаток ED9KSS5 в СистемныйБлок в Склад в СтоимостьПриход = СгоимостьРасход о |>>.| iTi |77| Поле Выражение Рассчитывать по... = КонечныйОстагок Сумма(КонечныйОстагок) = НачальныйОстагок Сумма(НачальныйОстагок) = КоличествоПриход Сумма(КоличествоПриход) = КоличествоРасход Сумма(КоличествоРасхад) = СтоимостьПриход Сумма(СгоимостьПриход) = СтоимостьРасход Сумма(СтоимостьР асход) 1 Сумма(Прибыль) Рис. 16.496. Добавление вычисляемого поля в ресурсы отчета В результате выполнения отчета в поле Прибыль будет отражаться прибыль от продажи собранных системных блоков, то есть разница между его продажной стоимостью и стоимостью комплектующих и услуг, израсхо- дованных на сборку компьютера (рис. 16.497). Продажа системных блоков Параметры Начало периода: 01.122011 Конец периода: 31.12.2011 Склад Количестве Количество Конечный Стоиместь Стоимость Прибыль Не Системный блок л/п Приход Расход остаток Приход Ресход обций Основной 2 2 17 500,00 1 Комъютер для дома 11 1 I 9 000,00 2 Копгаотер для офиса l| 1 | В 500 ДО 20 000,0В 2 500,00 100,00 ЮОООДО 1 000,00 * 40 до 10 000,00 1 500,00 60,00 Итоге 2 2 17 500Д)0 20 000,00 2 500,00 100,00 Рис. 16.497. Результат отчета Однако не всегда простым суммированием можно получить правильные итоги по вычисляемому полю. В таких случаях требуется задать собс- твенное выражение для расчета ресурса. Как, например, в схеме компоновки данных АнализЦенКомплектующих для поля Выручка (рис. 16.498). й Документ СборкаКомпьютера: АналиэЦенКомплвктующих П X Наборыданных Связи наборов... Вычисляемые... | Ресурсы | Параметры Макеты Вложенные схе... Настройки Доступные поля fijQsiaaa ~ в Номенклатура = Поступило 19 Собрано = ЦенаПриход в ЦенаСборки Поле I > I в ЦенаПриход | » | = ЦенаСборки = Собрано = Поступило Выражение СреднееЩенаПриход) СраднееЩенаСборки) Рассчитывать по... Сумма(Собрано) Сумма(П вступило) Рис. 16.498. Расчвт итога для вычисляемого поля Суммарная выручка будет получена как произведение количества ушедших в сборку комплектующих на разницу средних цен сборки и поступления по каждому из них. В этом случае нужно задать следу- ющее выражение для расчета ресурса Выручка (листинг 16.124). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 16.124. Выражение для расчета ресурса «Выручка» Сумма(Собрано) * (СреднееЩенаСборки) - Среднее(ЦенаПриход)) В выражении вычисляемого поля можно также использовать функции из общих модулей. Чтобы функцию можно было использовать в схеме компоновки данных, необходимо чтобы в ее описании присутствовало ключевое слово Экспорт. Например, в общем модуле ФункцииДляОтчетов есть функция ВВерхнийРегистр(Строка), листинг 16.125. Листинг 16.125. Функция общего модуля Функция ВВерхнийРегистр(Строка) Экспорт Возврат ВРег(Строка); КонецФункции Тогда в выражении вычисляемого поля можно воспользоваться следу- ющим выражением (листинг 16.126). Листинг 16.126. Выражение вычисляемого поля с использованием функции общего модуля ФункцииДляОтчетов.ВВерхнийРегистр(Наименование) | В результате описание вычисляемого поля в схеме компоновки данных примет вид (рис. 16.499). Й Отчет ОказаниеУслуг; ОсновнаяСяемаКомпоновкнЛанных П X Наборыданных Связи наборов... | Оычисляемыв... | Ресурсы Параметры Макеты Вложенные схе. Настройки & X Рис. 16.499. Выражение для расчета вычисляемого поля В результате выполнения отчета Оказание услуг название услуг будет выве- дено в следующем виде (рис. 16.500). Список услуг Код Наименование' 000000014 РЕМОНТ КОМПЬЮТСА 000000016 000000015 000000007 000000006 ВОССТАНОВЛаНИЕ ДАННЫХ СОПУТСТВУЮЩИЕ УСЛУГИ ДИАГНОСТИКА КОМПЬЮТЕРА СБОРКА КОМПЬЮТЕРА Рис. 16.500. Результат отчета Том 2
LG п pa вон ник] разработу и ка] Пользовательские поля Система компоновки данных позволяет определять в отчете Пользова- тельские поля, используя либо собственные выражения, либо наборы вариантов с условиями их выбора. Пользовательские поля явля- ются аналогом вычисляемых полей, но в упрощенном варианте. Они могут задаваться как в конфигураторе, так и в режиме 1С:Пред- приятие, но в выражениях пользовательских полей нельзя использовать функции общих модулей. Поэтому пользовательские поля предназначены скорее для пользователя, чем для разработчика. Для примера рассмотрим отчет Оказание услуг. Откроем закладку Настройки схемы компоновки данных отчета. На закладке Пользовательские поля находятся два пользовательских поля. Рассмотрим пользовательское поле- выбор В составе сборки. Чтобы его создать, нужно нажать кнопку Добавить справа от списка пользовательских полей и выбрать команду Новое поле выбор... Затем нужно задать заголовок поля и создать условия отбора для различных вариантов его представления (рис. 16.501). Пользовательское поле выбор Заголовок: Варианты: ъг О________________________________ Отбор Значение Представление 1 да | ОК || Отмена 11 Справка | Рис. 16.501. Описание пользовательского поля выбора Рассмотрим пользовательское поле-выражение Популярная услуга. Чтобы его создать, нужно нажать кнопку Добавить справа от списка пользовательских полей и выбрать команду Новое поле выражение... Затем нужно задать заголовок поля и выражение на языке выражений компоновки данных для отображения детальных и итоговых записей (листинг 16.127). Листинг 16.127. Выражение детальных записей для пользовательского поля-выражения «Популярная услуга» Выбор Когда Наименование = "Ремонт компьютера" Или Код = "000000007” Тогда "да" Иначе "нет” Конец В данном примере поле Выражение итоговых записей не заполнено, так как в отчет выводятся только детальные записи.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В результате окно пользовательского поля-выражения примет вид (рис. 16.502). Пользовательское поле выражение X Рис. 16.502. Описание пользовательского поля-выражвния Включим использование пользовательских полей Популярная услуга и В составе сборки в список выбранных полей отчета, отключим исполь- зование вложенного отчета ПродажиНоменклатуры и выполним отчет (рис. 16.503). ® i ' 0- ПСЛреоп. М М* М- / - □ X Оказание услуг Вариант отчета: [Основной| | Выбрать вариенг... | | о Сформировать 11 On Настройка... Вседействия •» | (.?) Список услуг ТШЗШИПТ 000000014 Ремонт компьютера 000000016 Восстановление данных 000000015 Сопутстеуюеиеуслу|И 000000007 Диа1ностика компьютера 000000006 Сборка компьютера Рис. 16.503. Результат отчета и Мы видим, что пользовательские поля в отчете отражаются в соответс- твии с условиями их представления. При использовании пользовательских полей из встроенного языка необ- ходимо учитывать, что заполнение свойства Путь к данным для нового пользовательского поля в системе компоновки данных выполняется в соответствии с установленным в конфигурации вариантом встроенного языка. В английском варианте встроенного языка путь к данным выглядит как UserFields.Fie!d<N>, в русском — как ПользовательскиеПоля.Поле<М>, где <N> — уникальный номер поля.
Использование полей-характеристик Пользовательские поля можно также использовать в режиме 1С:Г1редприятие, чтобы вывести в отчете итог по полю-характеристике. Для этого не подходят вычисляемые поля, так как, пока не выполнен запрос для формирования отчета, разработчик не может использо- вать в схеме компоновки данных поля характеристик. Пользователь же в режиме 1С:Предприятие, получив отчет с полями характеристик, может создать собственное пользовательское поле, отражающее итог по полю- характеристике, и вывести его. Например, для справочника Товары определена характеристика Масса. В отчете Остатки товаров для каждого товара выводится его остаток (поле КоличествоОстаток) и масса (поле характеристики Товар.Масса). Добавим в вариант отчета пользовательское поле Масса остатка, в котором вычислим количество остатка, умноженное на массу товара. Для этого откроем форму варианта при помощи команды Все действия к Изменить вариант..., переключимся на закладку Пользовательские поля, добавим новое поле-выражение и введем имя поля и выражения, по которым будет вычисляться это поле. При этом в поле ввода Выражение детальных записей укажем выра- жение, результат вычисления которого будет выводиться в детальных записях отчета (если они выводятся в отчет), а в поле ввода Выражение итоговых записей укажем выражение, результат вычисления которого будет выводиться в итоговых записях по группировкам и в общем итоге (рис. 16.504). ® Редактарованиепользовэтеллког... (ЮПредприятме) X Редактирование пользовательского... Заголовок: [Масса остатка J Выражение детальных записей: [Количество Остаток) * [Т овар-Масса) Выражение итоговых записей СуммеЦКоличество Остаток) * [Т овар-МассаВ | ОК | Отмена (?) Рис. 16.504. Добавление пользовательского поля выражения В нашем случае в детальных записях мы будем использовать количество, умноженное на массу, а в итоговых записях — сумму от количества, умно- женного на массу (листинги 16.128, 16.129). Листинг 16.128. Выражение детальных записей | [КоличествоОстаток] * [Товар.Масса] Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 16.129. Выражение итоговых записей Сумма([КоличествоОстаток] * [Товар.Масса]) | После добавления пользовательского поля в отчет получим следующий результат (рис. 16.505). lei ▼ Остатки товаров-Демонстрационная конфигурация‘Чар .. [1С:Преаприятие| щ] |<i х !Й1 ZI л! М М+ М- - - □ X Остатки товаров Вариант отчета: Остатки товаров с харакгеристикаьм Выбрагьеарианг... р Сформировать ь'о Настройка.. Все действия* ф Г;§ Выбранные поля Товар, Когмчество Остаток, Товар-Масса, Масса остатку... х| Товар Товар.Масса Количество Остаток Босоножки 500____11Д0 Ботики 1 200 5Д0 Валент 700 22Д0 ГЪыетки 300 4Д0 Сапом 21ОВ 15Д0 Сланф! 200 1Д0 Тапочки 300 12Д0 Туфли 460 ЭДО Итого 73 ДО Масса остатка Б 500 6000 15400 1 200 31 500 200 3 000 1 380 64 780 Рис. 16.505. Результат отчета Роли полей В системе компоновки данных можно задать роль для каждого поля набора данных. Роль поля указывает, каким образом следует интерпретировать поле при компоновке отчета. Некоторые свойства роли платформа задает автоматически. Для их редактирования в конструкторе схемы компоновки данных на закладке Наборы данных следует нажать кнопку выбора в поле Роль нужного поля набора данных (рис. 16.506). Рис. 16.506. Редактирование роли поля Том 2
.С п ра вон ник] разработу и ка1 Роль поля содержит следующие свойства: Без роли — роль у поля отсутствует; Период — число, содержащее номер периода в случае, если поле является полем-периодом. Значение 0 означает, что данное поле пери- одом не является. Самый младший период должен иметь номер 1. Его родительский период — 2 и т.д. Например, для запроса, полу- чающего данные из виртуальной таблицы Остатки и обороты, поле Период должно иметь номер периода — 3, поле Регистратор — 2, поле НомерСтроки — 1. На основании данной информации платформа будет рассчитывать итоги по полям остатка; Дополнительный — признак того, что данное поле-период не является обязательным. Установка данного признака говорит о том, что поле не обязательно должно использоваться в компоновке в том случае, когда в отчете использованы его дочерние периоды. В противном случае использование дочернего поля-периода говорит о необходи- мости использования в группировке и данного поля; Измерение — признак того, что поле является измерением. Информация о том, что поле является измерением, используется при расчете итогов по полям остатка; Родитель — в данном поле можно указать родительское измерение. Например, это необходимо сделать для корректного расчета остатков по реквизитам измерения; Счет - признак того, что поле является полем счета. Данная инфор- мация используется при расчете итогов по полям бухгалтерских остатков; Вид — строка, содержащая выражение, при помощи которого будет получаться вид счета. Результатом выражения должно быть значение перечисления ВидСчета (Активный, Пассивный, Активно/Пассивный) либо число. Значение числа 0 соответствует активному счету, 1 — пассив- ному, 2 — активно-пассивному. Выражение записывается на языке выражений системы компоновки данных. Данная информация исполь- зуется при расчете по полям бухгалтерских остатков; Остатки - признак того, что поле является полем остатка; Имя — строка, содержащая имя группы полей остатка. Например, «Сумма», «Количество». Парные поля остатка должны иметь одина- ковое имя группы полей остатка. Не парные остатки должны иметь различные имена групп полей остатка; Тип - тип остатка (НачальныйОстаток, КонечныйОстаток, Нет (поле не является остатком)); Бух. тип — тип бухгалтерского остатка (Дебет, Кредит, Нет (поле не является бухгалтерским остатком)); Поле счета — имя поля-счета, для которого рассчитываются остатки;
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Итерировать значения NULL — признак того, что в результат не нужно включать групповые записи по данному полю, если поле содержит значение NULL; Обязательное — указывает необходимость обязательного добавления данного поля в набор данных макета компоновки данных, если в настройках используется хотя бы одно поле из набора данных. Необходимо помнить, что система компоновки данных исключает из результирующего запроса поля, не участвующие в настройках отчета. В некоторых случаях это может приводить к ошибкам. ПОДРОБНЕЕ Пример использования обязательных полей в отчете рассматривается на стр. 237. При включенном свойстве Автозаполнение (стр. 278) платформа, как правило, самостоятельно заполняет роли полей на основании информации из запроса. Для полей, являющихся измерениями регистров, платформа заполняет свойство роли полей Измерение. А также у полей-периодов платформа заполняет свойство роли Период и Дополнительный. Иногда разработчику требуется самому установить нужные роли, например, в случае получения данных из объектов встроенного языка. Также для получения правильных остатков важно проверить и при необходимости откорректировать роли полей-остатка, полей-периодов, полей-измерений и полей-реквизитов измерений. ПОДРОБНЕЕ Пример использования роли полей для получения остатков рассматри- вается на стр. 265. Поля-реквизиты Иногда исходные данные для отчета получаются плоским списком, однако некоторые поля по сути являются реквизитами других полей. В таком случае необходимо доработать набор данных так, чтобы система компоновки воспринимала некоторое поле как реквизит другого поля. Рассмотрим пример. Допустим, есть набор данных - объект, в котором имеются поля Контр- агент, Телефон, Адрес, ОбъемПродаж (рис. 16.507). Доступные поля для такого отчета будут выглядеть как обычные поля набора данных (рис. 16.508). 30
Т*1 Отчет СписокКонтрагентов: ОсновнаяСхемаКомпеновкиДанных - □ Наборы да... | Связи наб... Вычисляв...Ресурсы Параметры Макеты Вложенны... Настройки tn- а__________ т Наборы даннык Поля: 1 Поле |Перис1дСеклнда| Путь Заголовок = Телефон = Адрес = ОбъемПродаж Контрагент Контрагент Телефон Телефон Адрес Адрес ОбъемПродаж Объем продаж Ограничение поля Роль П... У... Г... У... Ограничение рек... П... У... Г... о □ □ □ □ о □ О □ □ □ □ о □ о □ □ □ □ о □ У... □ о □ □ □ □ о □ [Ь L* fa % ' Выражение п... Выражения упорядочивай... Имя объекта, содержащего данные: | Контрагенты Рис. 16.507. Описание попей набора данных Выбранны... | Отбор Сортировка Условное о... Польэовет... Другие нас... Доступные поля = Контрагент = ОбъемПродаж = Телефон Сэ СистемныеПоля Поле Рис. 16.508. Доступныа поля отчета Допустим, нужно, чтобы поля Телефон и Адрес система компоновки данных считала реквизитами поля Контрагент. Для этого в описании полей набора данных для поля Телефон укажем в качестве пути к данным путь Контрагент.Телефон, а для поля Адрес — Контрагент.Адрес (рис. 16.509). Отчет СписокКонтрагентов: ОсновнаяСхемаКомпеновкиДанных О X Рис. 16.509. Описаниа полей набора данных Профессиональная разработка в системе «1С:Предприятие 8»
В этом случае поля Телефон и Адрес система компоновки данных будет считать реквизитами поля Контрагент. При этом в доступных полях эти поля будут отображаться как реквизиты поля Контрагент (рис. 16.510). Выбранны... | Отбор Сортировка Условное о... Пользоват... Другие нас... Доступные поля » ffiBBESEBS = Адрес = Телефон в ОбъемПродаж □ СнстемныеПоля Поле Рис. 16.510. Доступные поля отчета При этом поля Телефон и Адрес будут не только отображаться как рекви- зиты, но и везде считаться реквизитами. Например, их можно будет выдавать в группировке по полю Контрагент, а управлять их выводом можно на закладке Другие настройки (стр. 316). Функциональные опции и права на просмотр поля в отчете Если у пользователя нет права на интерактивный просмотр некото- рого поля или данное поле связано с выключенными функциональными опциями, то это поле становится недоступным для настройки пользова- телем. То есть оно не будет отображаться в списке доступных полей. ПОДРОБНЕЕ Пример использования функциональных опций в отчете рассматрива- ется на стр. 174. При получении настроек отчета по умолчанию система компоновки данных автоматически выполняет следующие действия с настройками: если поле, на просмотр которого у пользователя нет права, или поле, которое связано с выключенной функциональной опцией, используется в пользовательском поле, то такое пользовательское поле удаляется и по нему не устанавливается отбор; из выбранных полей удаляются все поля, на просмотр которых у пользователя нет права и которые связаны с выключенными функци- ональными опциями; поле системы компоновки данных считается недоступным, если все поля, используемые в выражении этого поля, связаны с выключенными функциональными опциями или недоступными на просмотр полями; из полей группировки удаляются все поля, на просмотр которых у пользователя нет права и которые связаны с выключенными функ- циональными опциями. Если после удаления поля группировки Том 2
LG п pa вон ник] разработу и ка] у группировки не остается ни одного поля группировки с установ- ленным признаком использования, то удаляется вся группировка, а ее содержимое (если, например, группировка включает таблицу) помещается на место группировки; если после удаления из таблицы группировки-строки или группиров- ки-колонки таблица остается без группировок, то таблица удаляется; если после удаления из диаграммы группировки-серии или груп- пировки-точки диаграмма остается без группировок, то диаграмма удаляется; из упорядочивания удаляются все поля, на просмотр которых у пользователя нет права и которые связаны с выключенными функци- ональными опциями; из оформляемых полей элемента условного оформления удаляются поля, на просмотр которых у пользователя нет права и которые связаны с выключенными функциональными опциями. Если после удаления оформляемого поля из элемента условного оформления в элементе не остается ни одного оформляемого поля с включенным признаком использования, то такой элемент условного оформления также удаляется; если в отборе элемента условного оформления использовалось поле, на просмотр которого у пользователя нет права или которое связано с выключенными функциональными опциями, то такой элемент условного оформления удаляется. Если поле ранее было доступно и пользователь каким-либо образом сохранил настройку, а в дальнейшем (когда поле стало для него недо- ступно) загрузит настройку, поля не будут автоматически удаляться из настройки. Это сделано для того, чтобы пользователь имел возмож- ность заменить недоступные поля другими полями или самостоятельно удалил их использование из настроек. Если при выполнении метода Выполнить]) объекта КомпоновщикМаке- та Компоновки параметр ПроверятьДоступностьПолей установлен в значение Истина, то будет осуществляться проверка доступности полей для текущего пользователя и проверка наличия поля во включенной функциональной опции. При использовании в настройках недоступного поля будет выдаваться исключение. Если значение параметра — Ложь, то проверка осуществляться не будет. ПРИМЕЧАНИЕ В случае выполнения отчета из автоматически сгенерированной формы проверка доступности полей для текущего пользователя и проверка наличия поля во включенной функциональной опции осуществляются автоматически.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Ресурсы Под полями-ресурсами в системе компоновки данных подразумева- ются поля, значения которых рассчитываются на основании детальных записей, входящих в группировку. По сути ресурсы являются групповыми или общими итогами отчета. В приведенном примере в отчет выводятся ресурсы Количество и Стоимость (рис. 16.511). Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 Контрагент Номенклатура Период лСоличестео Стоимость'1' ООО^Автоматика^ Диагностика компьютера 115DOJOO 2 ’ 1 500 ДО 5 декабря 2011 г. 1| 1 000 ДО 11 декабря 2011 г. l| 500 ДО Компьютер для дома 1 10 000 до 11 декабря 2011 г. 1| 10 000 до ООО'Система" 10000 до Компьютер для офиса 1 10 000 до 9 декабря 2011 г. 1| 10 000 до ООО "Стиль* Монитор LCD 10000 до 1 10 000 до 6 декабря 2011 г. 1! ю ооо до Итого у Э1 500ДУ Рис. 16.511. Вывод ресурсов отчета Во встроенном языке поля-ресурсы схемы компоновки данных пред- ставляются свойством ПоляИтога объекта СхемаКомпоновкиДанных. В конструкторе схемы компоновки данных добавление поля в список полей-ресурсов осуществляется на закладке Ресурсы. Для каждого поля-ресурса указывается: Выражение — формула, по которой будет рассчитано значение ресурса. Например, выражение Сумма(Стоимость) обозначает, что для вычис- ления значения поля будет использоваться агрегатная функция Сумма, применяемая для поля Стоимость. Для выбора доступны и другие распространенные функции агрегирования, а также собственные функции на языке выражений системы компоновки данных; Рассчитывать по... — перечисление группировок, для которых будет рассчитываться данный ресурс. Если свойство не заполнено, выра- жение ресурса будет использоваться для всех группировок отчета. Если же в данном свойстве указано некоторое поле группировки, то ресурс считается доступным только в данной группировке, для остальных же группировок данный ресурс выводиться не будет (рис. 16.512). Например, в приведенном выше примере ресурс Количество отчета Продажи номенклатуры будет рассчитываться только для группировки Номенклатура и ее иерархических группировок, а также вложенных в нее группировок, для которых не задано собственное выражение данного ресурса. Для других группировок он выводиться не будет. Это свойство требуется устанавливать в случаях, когда итоги по разным группировкам или общие итоги не имеют смысла (рис. 16.513).
Т5! Отчет ПродажиНоменклатуры: ОсноенаяСхемаКомпоновкиДанных _ □ X Рис. 16.512. Ресурсы отчета Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 Контрагент Количество Стоимость Номенклатура Период бдд "Автомат^ | /Диагностика комгъютера 2S 5 декабря 2011 г. li 11 декабря 2011 г. lj S. ддж 1 а6ря2011г- ' Y пла* I ер для офиса 1^4 бря2О11 г. 1L/ > г LCD ГЧ 11 500,00 1 500Д0 1 000 ДО 500ДО 10 000 ДО 10 000 ДО 10 000 до 10 000 до 10 000 до 10 000 до 10 000 до 10 000 до 31 500,00 Рис. 16.513. Результат отчета В результате мы видим, что ресурс Количество рассчитывается только по номенклатуре и не выводится для группировки Контрагент и в общих итогах. Дело в том, что контрагенту могут быть проданы разные виды номенклатуры, и не имеет смысла складывать количество услуг с коли- чеством комплектующих. Изменим вариант отчета - укажем для группировки Номенклатура тип группировки Иерархия. В результате в отчете будут выведены иерар- хические записи номенклатуры и для них будут посчитаны итоги по полю Количество, так как в колонке Рассчитывать по... для этого ресурса (см. рис. 16.512) были указаны группировки Номенклатура и Номенклату- раИерархия (рис. 16.514). Однако если в отборе отчета будет установлен отбор на поле Номенклатура с типом сравнения Равно, то значение ресурса будет выводиться во все группировки отчета, независимо от группировок, указанных для ресурса в колонке Рассчитывать по... (рис. 16.515). Профессиональная разработка в системе «1С:Предприятие 8»
Продажи товаров и услуг Параметры: Начало периода; 01.12.2011 Конец периода: 15.12.2011 контрагент Номенклатура Период_________ ООО "Автоматжа" Количество Стоимость Котигьютер для дома 11 декабря 2011 г. Услуги ~~ ^"^^иамостокакомлыотфГ 5 декабря 2011 г. 11 декабря 2011 г. ООО "Система** C-CoSpoi । ые компьютеры Коютьютер для офиса 9 декабря 2011 г. QgPtTW Скомплектую кие 6 декабря 2011 г. Итого 11 500 до юооодо юооо юооодо] 1 500 ДО 1 500 до! 1 ооодо 500 ДО | 10000 до 10000 до 10000 до] 10000 до| 10000 до 10000 до юооо до! 10000 до| 31 500,00 Продажи товаров и услуг Отбор: Номенклатура Равно "Диагностика компьютера* Контрагент Номенклатура Период gOO "Автоматика" ДиаоюспяайгойгаютёрГ 5 декабря 2011 г. __ 11 декабря 2011 г. ООО "Стандарт1^- Т^ЯПнбЕТи&ГкЗЯЕвТ^Р .14 января 2m 2 г Итого Количество Стоимость 1 500 до 1 500ДО’ 1 ооодо! 500 ДО I 500 ДО 500до' 500до| 2 ОООДО 3? Рис. 16.514. Разул ьтат отчвта Рис. 16.515. Результат отчета Кроме полей группировок в свойстве Рассчитывать по... можно указывать специальную группировку ОбщийИтог. В таком случае выражение будет использоваться для вывода общего итога (см. рис. 16.516). Каждое поле может присутствовать в списке ресурсов несколько раз, для различных полей группировок. Например, можно указать разные формулы расчета ресурса Стоимость для группировок по полю Номенклатура и Контрагент. Это требуется в случаях, когда итог подсчитывается по-разному для разных группировок (см. рис. 16.516). Однако указание различных выражений одного поля-ресурса для одной и той же группи- ровки недопустимо. В приведенном примере задано, что ресурс Количество будет рассчиты- ваться только для специальной группировки Общий итог. Для ресурса Стоимость установлены различные выражения расчета: для группировки Контрагент, КонтрагентИерархия как Максимум(Стоимость) и группировок Номенклатура и Общий итог как Сумма(Стоимость), рис. 16.516. В результате общее количество продаж выводится только в итоге отчета, а стоимость продаж для контрагентов рассчитывается как максимальная сумма продаж этому контрагенту. Стоимость продаж по номенклатуре и в общем итоге рассчитывается как суммарная стоимость всех продаж по данной номенклатуре или по всем записям отчета (рис. 16.517). Разработчик может также задать собственные более сложные выражения для расчета ресурсов на языке выражений системы компоновки данных, как это сделано, например, в отчете Расчет показателей продаж (стр. 219), рис. 16.518. Том 2
LG п pa вон ник] раз работу и ка] Отчет ПродажыНоменклатуры: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.516. Установка различных выражений для расчета ресурса Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конец периода: 15.12.2011 Контрагент Количество Стоимость Номенклатура Период ООО Диагностика компьютера ____________ 1 500,00 5 декабря 2011 г. I I 1 000Др| 11 декабря 2011 г. | | 500Др| Коетъютер для дома_________________ 10 000 ДО 11..К.К.2011 г. I I юооодо! (&О "Система" ЮРООДО Когигьютер для офиса ______________ 10 000 ДО амидманг. i I юймо| ®О "Стиль" ЮОООДР Монитор LCD________________________ 10 000 ДО 6 декабря 2011 г. I I 10000j»| Итого s 315оо.осР рис. 16.517. Результат отчата Т^1 Отчет РасчетПокаваггелейПродаж: ОсновнаяСхемаКомпоновкиДанных Наборыданных Селей наборов д... Вычисляемые по... | Ресурсы | Параметры Макеты Вложенные cxehfci Настройки Доступные поля шДЖыиимв = Количество = Контрагент Fw МвксимальнаяСуммаПродажТовара = Номенклатура Fw ОбъемПродаж = Период FW ПроценгПродажОтИсслеодемогоТо... Fh ПроценгПродажПоКонграгенту FH СписокКонграгентов = Стоимость Fh СгоимосгьПродажСНакоплением Поле в Стоимость Fw ПроцентПродажПоКонграг... Fw МаксимальнаяСуммаПрод.. Fw ПроцентПродажОтИсследу... Fw СписокКонграгентов Fw СгоммостьПродажСНакоп... ?(-) ОбъемПродаж Выражение ^5умма(Стоимость) Сумма(СгоимостьГ100 / ВычислпъВьфажениеГ1Сумма(Сгоимость... "Контрагент") МвксимукфычислигьВыражениеСГруппи.. "Номенклатура")) Сумма(Сгоимость) *100/ ВычислитъВыражениеГ'Сумма(Выбор Когда Номенклатура = ШсследуемыйТоеар Тогда Стоимость Конец)", ,"0бщийИтог") Массив(Резличные Контрагент) ВычислитъВыражениеГ'С!д>мв(Стоимость... .. "Первая", "Текущая'! Выбор Когда Сдо4а(Сгоимость) <=3000 Тогда "Машй" Иначе Выбор Когда Сумма(Сгоимость) >-10000 Тогда "Большой" Иначе "Средний" Конец Конец ункцимДляОтчегоеЛВСКлассиФикация^/ Рассчитывать по... Номенклатура Рис. 16.518. Ресурсы отчета
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты Например, в общем модуле ФункцииДляОтчетов есть функция АВСКлас- сификация(Данные), позволяющая классифицировать контрагентов в зависимости от объема продаж. Тогда в выражении для расчета ресурса можно воспользоваться следующим выражением (листинг 16.130). Листинг 16.130. Выражение для расчета ресурса «АВСКлассификация» ФункцииДляОтчетов. АВСКлассификация(ГрупповаяОбработка("Сумма(Стоимость)")) Кроме того, в данном отчете в выражениях для расчета ресурсов использу- ются функции, вычисляющие выражения для родительских группировок, для вложенных группировок; ресурсы рассчитываются для определенного значения измерения, по заданному интервалу и т. д. ПОДРОБНЕЕ Об использовании языка выражений системы компоновки данных можно прочитать в книге «1С:Предприятие 8.2. Руководство разработ- чика», глава 10. Для каждого числового поля-ресурса системы компоновки данных плат- форма автоматически рассчитывает подчиненные поля: ПроцентВИерархии, ПроцентВГруппе, ПроцентОбщий и др. Эти поля можно использовать в отчете наряду с другими доступными полями набора данных (рис. 16.519). Параметры I Оыбранны... I Отбор Сортировка Условное... Пользовэт... Другие нас... Доступные поля | Поле ™ Контрагент = ПериооДвнь = ПериооМесяц J Котычество J Стоимость <1 ПроцентВИерархии J ПроцентВИерерхииВКолонкеИлиТочке J ПроцентВИерархииВСтрокеИлиСерии | П рсидинтВ Г pijnne [ J ПроцентВГруппеВКолонкеИлиТочке J ПроцентВГрутеВСгрокеИлиСерии J ПроцентВКолонкеИлиТочке <1 ПроцентВСтрокеИлиСерим J ПроцентОбщий ь^^ТйстёмныёНолтГ^^^^^^^^^^™"^ - Выбранные поля 0 J Стоимость 171 J @ J Стоимость-ПроцентОбщий +' О ПараметрыДаншх Рис. 16.519. Поля отчвта Так, в отчете Отчет по продажам наряду с полем Стоимость выводятся поля ПроцентВГруппе, ПроцентОбщий, отражающие для каждой группировки процент от общей стоимости продаж и процент от стоимости продаж в группе (рис. 16.520).
Отчет по продажам Вариант отчета: | Основной| | Выбрать вариант... | | 1> Сформировать 11 Настройка... Все действия » I (?) @ |ц) Период Прошлый кварт вя Параметры Период.01.102011 -31.12.2011 Рис. 16.520. Результат отчета Параметры Пользователя, как правило, интересуют данные о хозяйственной деятель- ности за определенный период. Поэтому практически в любом отчете используются параметры, задающие начало и конец отчетного периода. Во встроенном языке параметры данных описываются в свойстве Пара- метрыСхемыКомпоновкиДанных, которое содержит коллекцию значений, состоящую из элементов ПараметрСхемыКомпоновкиДанных. Программно установить значение параметра можно при помощи метода УстановитьЗна- чениеПараметра(), который устанавливает значение параметра компоновки данных и включает свойство Использование (листинг 16.131). Листинг 16.131. Установка значения параметра «Началопериода» | Настройки.ПараметрыДанных.УстановитьЗначениеПараметра(”НачалоПериода", '20111201'); В схеме компоновки данных параметры отчета задаются на закладке Пара- метры. При использовании свойства Автозаполнение (стр. 278) параметры виртуальных таблиц и параметры, указанные в запросе, автоматически добавляются в список параметров отчета. При этом имена доступных параметров схемы компоновки данных генерируются на языке, соответс- твующем варианту встроенного языка конфигурации. Редактирование параметров включает в себя: редактирование имени параметра, редактирование заголовка, редактирование доступных типов и значений параметра, определение значения и доступности списка значений параметра, определение выражения, Профессиональная разработка в системе «1С:Предприятие 8»
определение параметра в качестве доступного поля настройки компо- новки данных, ограничение доступности, определение обязательности заполнения параметра, признак использования параметра, задание параметров редактирования. Рассмотрим некоторые особенности использования свойств параметров. Использование дат Для примера рассмотрим отчет Отчет по системным блокам. Мы видим, что на основании запроса платформа по умолчанию добавила два пара- метра — НачапоПериода и КонецПериода и в колонке Тип задала для них значения Дата (рис. 16.521). Т^1 Отчет ОтчетЛоСистемнымБлокам: ОсновнвяСхемаКомпенавкиДанных _ П X Наборы данных Связи наборов данных Вычисляемые поля Ресурсы | Параметры | Макеты Вложенью схемы Настройки . v -Q Имя Заголовок Тип Аост... Д... Значение Выражение Пар.. В... 0... 3.. Использование Парамет... НачалоПериооа Началопериода Дата □ /Й □ □ Авто КонеиПериода Коней периода Дата О ^онецПериода(ЬКонеиПериода,,,Де»ь,р уй О О Авто Рис. 16.521. Параметры компоновки данных Заметим, что если в отчет передается параметр, содержащий значение типа Дата, то дата всегда содержит и время с точностью до секунды. Однако пользователя, как правило, не интересуют данные в отчете с такой точностью. Чтобы пользователь имел возможность ввести даты начала и окончания отчетного периода без времени, в колонке Тип нужно нажать кнопку выбора и в нижней части окна редактирования типа данных уста- новить Состав даты в значение Дата для обоих параметров (рис. 16.522). Редактирование типа данных X ОСоставнгё тип данных ОЮ» Число Г” □Ч Строка : @1д] ' OQ1 Булево j QO ХранллнцеЗначения □ ID УнмкальныйИденгиФмкагор :+ О SO СправочникСсылка • + ДокументСсылка Од) ПеречмсленмеСсылка • +• QS3 ПланВиооеХарактериспкСсылка ПланСчетовСсылка * Достав даты I Дата ; j ОК 11 Отмена | _ -----------------Рис. 16.522. Редактирование состава даты Но в таком случае, если пользователь задаст даты периода как 01.12.2011 и 11.12.2011, итоги регистра будут рассчитаны с начала дня 01.12.2011 Том 2
G п pa вон ник] раз р а б.отл и ка 00:00:00 по начало дня 11.12.2011 00:00:00. То есть данные за 11-е число, отличные от начала дня, в отчет не попадут. Чтобы этот день включить, нужно внести в поле Выражение для параметра КонецПериода следующий текст (листинг 16.132). Листинг 16.132. Выражение для расчета параметра «КонацПериода» | КонецПериода(&КонецПериода, "День") Это выражение, сформулированное на языке выражений системы компо- новки данных, содержит функцию КонецПериода(), возвращающую дату, соответствующую концу какого-либо периода, например дня. Использование стандартных периодов Система компоновки данных позволяет использовать стандартные периоды для указания периода отчета. Для примера рассмотрим отчет Отчет по продажам. На закладке Пара- метры находится параметр с именем Период типа СтандартныйПериод, а для параметров Началопериода и КонецПериода задано Выражение для расчета и запрещено их редактирование пользователем (листинг 16.133). Листинг 16.133. Выражение для расчета параметров «НачалоПвриода» и «КонацПериода» &Период.ДатаНачала &Период.ДатаОкончания Даты начала и конца стандартного периода также содержат и время. Однако здесь, в отличие от параметров Началопериода и КонецПериода, начальная дата имеет время 00:00:00, а конечная дата — 23:59:59. Таким образом, последний день включается в отчет, и не нужно использовать функцию КонецПериода(). В результате параметры компоновки данных примут вид (рис. 16.523). Рис. 16.523. Определение параметров отчета При запуске отчета в режиме 1С:Предприятие пользователь будет редакти- ровать стандартный период непосредственно в отчетной форме, так как параметр Период включен в состав быстрых пользовательских настроек.
I ЕлаваИ 6nG лояаТыеТанагтитйческйеТотяеты При выборе стандартного периода ему предоставляется большой выбор значений: Этот месяц, Следующий месяц, Прошлый месяц, Эта неделя, Следующая неделя, Прошлая неделя и пр. (рис. 16.524). Рис. 16.524. Выбор стандартного периода Заметим, что реальные значения дат стандартного периода определяются во время исполнения отчета. Поэтому период отчета будет автоматически меняться в зависимости от фактической даты запуска отчета. Пользоваться стандартным периодом отчета удобно, когда пользователь регулярно выполняет отчет за определенный интервал времени, например, текущий месяц. Тогда можно заранее установить в стандартных настройках нужный период, и пользователю не придется задавать его перед форми- рованием отчета. Для повышения удобства работы пользователя имеется возмож- ность скрывать параметры отчета от пользователя, используя свойства (см. рис. 16.521, 16.523): ВключатьВДоступныеПоля - если флажок установлен, то параметры будут включены в список доступных полей и видны в настройках пользователя; ОграничениеДоступности - если флажок установлен, то параметры не будут видны в настройках пользователя на закладке Параметры. Если параметр, указанный в запросе, доступен в настройках пользователя, то есть у него снят флажок ОграничениеДоступности, то пользователь может указать значение параметра перед формированием запроса. В противном случае система компоновки данных сгенерирует результирующий запрос к информационной базе без учета данного параметра. Если отчетный период для пользователя не важен, то он может снять признак использования параметров (флажок слева от параметра).
В этом случае отчет будет формироваться по всем записям выборки запроса для получения набора данных. При включенном признаке использования параметров также можно не задавать их значения. В этом случае поведение системы будет зави- сеть от значения свойства Запрещать незаполненные значения. В случае установки этого флажка, при использовании параметров в отчете система проверяет обязательное заполнение параметра. Если значение параметра не указано, то будет выдана ошибка. Если флажок Запрещать незаполненные значения не установлен (см. рис. 16.521), отчет будет формироваться без ошибки. Если же, наоборот, отчетный период нужно вводить всегда, то у пара- метров в поле Использование можно задать Всегда (рис. 16.525). Й Отчет ОтчетЛоСистемнымБлокам: ОсноенаяСхемаКомпоновкмДанных □ X Наборыданных Связинабрровда... Вычисляема поля Ресурсы | Параметры | Макеты Вложенные схемы Настройки [Ь - £ о Имя Заголовок ! Тип Доступные... Д.. Значение Выражение Пара... В... 0... 3... Испояьз... НачалоПериода Начало периода Дата_________________Q_____________________________________________________0_ Q/ZJ Всегда . КонеиПериода Конец периода | Дата □ КонецПериода(ЬКокецПерис|да."День") @ □\|дД Всегда ' п Рис. 16.525. Параметры отчета В этом случае флажок использования параметра в пользовательских настройках отсутствует, т.е. параметр используется всегда. Если допол- нительно к этому установить также флажок Запрещать незаполненные значения (см. рис. 16.525), то при формировании отчета с пустым значе- нием параметра будет получена ошибка. Макеты Понятие «макеты» очень часто встречается в системе компоновки данных. Существует макет как элемент системы компоновки, существуют предопределенные макеты, существуют макеты оформления... По умолчанию внешний вид отчета формируется системой автомати- чески. Внешне отчет состоит из набора стандартных областей, которые система сама располагает в зависимости от вида отчета. Но разработчик может задать собственное расположение и оформление различных областей. Это и есть предопределенные макеты. Система самостоятельно оформляет стандартные области отчета. Но разработчик может задать собственные правила, по которым будут оформляться эти стандартные области. Для этого ему потребуется создать свой макет оформления. Таким образом, задать свой вариант оформления можно в обоих случаях. Но в предопределенных макетах можно также изменить расположение полей отчета, задать их размеры, изменить порядок Профессиональная разработка в системе «1С:Предприятие 8»
следования, тип заполнения, используя шаблон ячейки, в которой расположено поле, задать события для ячейки и т.п. Но в отличие от макетов оформления, предопределенные макеты привязаны к одному отчету, его конкретным полям и структуре. Предопределенные макеты Предопределенные макеты могут создаваться при помощи конструктора схемы компоновки данных. Для этого предназначена закладка Макеты. Макет представлен в виде обычного табличного документа, областям которого можно задать нужное оформление. Для примера создадим схему компоновки данных Предопределен- ныйМакет отчета Остатки номенклатуры. Данные для отчета будем получать при помощи запроса (листинг 16.134). Листинг 16.134. Текст запроса ВЫБРАТЬ ОстаткиНоменкпатурыОстаткиИОбороты.Номенкпатура, ОстатаНоменклатурыОстаткиИОбороты.Склад, ОстаткиНоменкпатурыОстаткиИОбороты.КоличествоНачальныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты. КоличествоКонечныйОстаток, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоПриход, ОстаткиНоменклатурыОстаткиИОбороты.КоличествоРасход ИЗ РегистрНакопления.ОстаткиНоменклатуры.ОстаткиИОбороты КАК Остатки НоменкпатурыОстаткиИОбороты В ресурсы отчета добавим поля КоличествоНачальныйОстаток, Количес- твоПриход, КоличествоРасход и КоличествоКонечныйОстаток. На закладке Настройки добавим в структуру отчета группировку Склад с вложенной в нее группировкой Номенклатура и перенесем в список выбранных полей поля ресурсов (рис. 16.526). Т^1 Отчет ОстагкиНоменклатуры: ПредопределениыйМокет □ X Наборыданных Связи наборов д... Вычисляемые по... Ресурсы Параметры Макеты Вложенные схемы | Настройки |_ .4 U С 0“ Склад 0ой Номенклатура Параметры | Выбраним... | Отбор Сортировка Условное... Пользоват... Другие на... Доступные поля + = Номенклатура * = Склад Количествен ачальныйО ста КоличествоПриход КоличествоРасход СисгемыеПоля ПараметрыДанньм Поле 0 ® 0 Выбранные поля J КоличествоНачальныйОстаток <1 КоличествоПриход J КоличествоРасход__________ о Рис. 16.526. Настройка структуры и полей отчета Том 2
G п pa вон ник] раз р а б.отл и ка Для создания предопределенного макета сначала мы должны уста- новить имена группировок, чтобы мы могли самостоятельно указать, в какую именно область нашего макета будет выводиться эта группи- ровка. На закладке Настройки выделим нужную группировку и вызовем ее контекстное меню. Выберем в нем пункт Установить имя и зададим имена группировок (рис. 16.527). Т*1 Отчет ОстаткиНоменклатуры: ПредолределвнныйМакет Наборыданных Связи наборов д... Вычисляемые по... Ресурсы Параметры Макеты Вложенные схемы | Настройки [ Имя варианта Предстаеле... Q] Отчет Основной Настройки | Отчет | Номенклс Параметры | Выбраним.. Доступные поля ••+ = Номенклатура * = Склад_______________ ••+ J '* J Количествоначальны ••+ <1 КоличествоПриход '* J КоличествоРасход ••+ Сэ СистемныеПоля '*' Сэ ПараметрыДанных Новая группировка... Новаятабл-ща Новая диаграмма Новый вложенный отчет. Скопировать Изменить Удалить Конструктор настроек... Переместить вверх Переместить вниз Сгруппировать... Разгруппировать Установить имя... Включить все ДР Выключить все Ins F9 F2 Del CU+Shift+Up Ctil+Shift+Down Другие на... Рис. 16.527. Установка имени группировки Перейдем на закладку Макеты и нажмем кнопку Добавить макет. Сущест- вуют следующие типы предопределенных макетов (рис. 16.528): макет поля, макет группировки, макет заголовка группировки, макет ресурсов. Рис. 16.528. Добаалвние макета
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты Макет поля Данный макет предназначен для оформления определенных выводимых полей (рис. 16.529). Склад Номенклатура Основной___________ Жесткий диск ~ Материнская плата Память Розничный Количество Начальный остаток Веб-камера Микрофон Монитор LCD Итого Количество Количество Количество Приход Расход Конечный остаток 13,000 9,000__4,000 3,0001 3,000! 5,0001 ЗДЮ 2,000 5,000| 3,000| 2,000 24,000 7,000 17,000 10,000] ЗД001 7,000 ________ЮДЮ____________2,0001____________8,000 4ДЮ|___________________2,0001____________2,000 37 £00 16 £00 21 £00 Рис. 16.529. Макет поля «Склад» При создании данного макета необходимо указать поле, для которого созда- ется предопределенный макет. Создадим макет для поля Склад. Зададим ячейку Склад с заполнением Параметр. Зададим оформление ячейки — размер и начертание шрифта. Определим границы диапазона области. Для этого вызовем окно настройки диапазона границ и, не закрывая это окно, выделим мышью в правом окне нужную область. Сохраним диапазон, нажав в его окне кнопку выбора. После этого в левом нижнем окне появится список параметров, определенных для макета (рис. 16.530). ПОДРОБНЕЕ Более подробно этот процесс рассмотрен в разделе «Примеры разра- ботки отчетов» на стр. 210. Рис. 16.530. Создание макета поля «Склад» Установим схему ПредопределенныйМакет в качестве основной схемы компоновки данных для отчета Остатки номенклатуры.
Выполним отчет. Значения поля Склад выводятся с заданным оформле- нием (рис. 16.531). Остатки номенклатц... (ЮПрецприятме) iffrf LA V5 Й 'Ш1 'эй М М+ М- - □ X Остатки номенклатуры Вариант отчета: [Основной | 1> Сформировать 11 0^ Настройка... | | Выбрать вариант... | Вседействия * i (?) Склад Номенклатура А РсяовжмГ Количество Начальный остаток Количество Количество Количество Приход Расход Конечный остаток Жесткий диск Материнская плата Память А Розничный Ваб-камера Микрофон Монитор LCD Итого 13,000 ЗДОО 5,000 5 ДОО 24 ДОО ЮДОО ЮДОО 4,000 37 ДОО 9,000 3,0001 здю з,ооо| 7,000 3,0001 2 Д00 2Д00| 16,000 4 ДОО 2 ДОО 2Д00| 17Д00 7Д00| 8 ДОО 2Д00| 21 ДОО. Рис. 16.531. Результат отчета Макет группировки Данный макет предназначен для оформления значений группировки (рис. 16.532). Склад Номенклатура Основной__________ Жесткий диск Материнская плата Память__________ Розничный Веб-камера Микрофон__________ Монитор LCD Итого Количество Начальный остаток Количество Количество Количество Приход Расход Конечный остаток 13Д00 9,000 4 ДОО здоо 5 ДОО 5 ДОО 24 ДОО ЮДОО юдоо 4 ДОО wrr здоо эдоо здоо 7 ДОО эдоо 2 ДОО 2 ДОО ЮТСГ 2,000 2 ДОО 17Д00 7,000 8 ДОО 2 ДОО в Рис. 16.532. Маквт группировки «Номенклатура» Склад Количество Основной 4 ДОО Итого 4ДОО Комплектую «не 4,000 Матерюккаяплата 2,000 2,000 Матергоккаяплата ЗДОО Память 2,000 Память 2,000 Комплектую ине 4,000 Итого 4,000 Рис. 16.533. Типы макетов Профессиональная разработка в системе «1С:Предприятие 8»
При создании данного макета необходимо указать либо имя группировки, либо поля группировки, для которой создается макет. Также необходимо указать тип макета. Существуют следующие типы предопределенных макетов (рис. 16.533): Заголовок — данный макет предназначен для оформления заголовка группировки. Заголовок группировки выводится в начале группировки. Если группировка содержит вложенные группировки, то заголовок группировки выводится перед записями вложенной группировки; Подвал — данный макет предназначен для оформления подвала груп- пировки. Подвал группировки выводится в конце группировки. Если группировка содержит вложенные группировки, то подвал груп- пировки выводится после записей вложенной группировки. Если данный макет не задан, то используется макет заголовка; Заголовок иерархии — данный макет предназначен для оформления заголовка иерархической группировки. Данный заголовок выводится в начале иерархической группировки. Если данный макет не задан, то используется макет заголовка иерархии; Подвал иерархии—данный макет предназначен для оформления подвала иерархической группировки. Данный подвал выводится в конце иерар- хической группировки. Если данный макет не задан, то используется макет заголовка иерархии; Общий итог заголовок — данный макет предназначен для оформления области отчета, отображающей общий итог по группировке, и выво- дится в начале группировки; Общий итог подвал - данный макет предназначен для оформ- ления области отчета, отображающей общий итог по группировке, и выводится в конце группировки. Если данный макет не задан, то используется макет общего итога заголовка. Создадим макет группировки с именем Номенклатура. В открывшемся диалоге выберем имя группировки Номенклатура и тип макета Заголовок. Зададим элементы оформления ячеек значений группировки — шрифт и цвет текста. У всех ячеек в строке Заполнение укажем Параметр, а в строке Параметр — имя конкретного поля, отображающегося в ячейке. Определим границы диапазона области значений группировки. Платформа сформирует список параметров для этой области и заполнит значениями по умолчанию (рис. 16.534). ВНИМАНИЕ! Список параметров, заданных для макета, появится в окне Пара- метры макета только после определения границ диапазона области. При переопределении диапазона список параметров формируется заново, и выражения параметров заменяются значениями по умол- чанию. Том 2
G п pa вон ник] раз р а б.отл и ка J^l Отчет ОстаткиНоменклэтуры: ПредопределенныйМакет Наборыданных Связи иеборов данных Вычисляемые поля Ресурсы Параметры | Макеты | Вложенные схемы Настройки - □ X Рис. 16.534. Создание макета группировки «Номанклатура» Выполним отчет. Значения группировки Номенклатура выводятся с заданным оформлением (рис. 16.535). @ Остатки номенклатуры... (ЮПрецгумвпие) ijril [Д 1x5 Й ЛИ '311 М М+ М- - - □ X Остатки номенклатуры Вариант отчета: | Основной| | Выбрать вариант... | Рис. 16.535. Результат отчета
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Макет заголовка группировки Данный макет предназначен для оформления заголовков группировок (рис. 16.536). Склад Номенклатура Основной ~ Жесткий диск Материнская плата Память__________ Розничный__________ Веб-камера______ Микрофон________ Монитор LCD_____ Итого Количество" Начальный остаток Количество Количество Количество Приход Расход Конечный остаток_________ 9.000___________4,000 3,0001 ’ 3,000 3,000 7,000 3,000 2,000 2,000 16,000 13,000 3,000 5,000 5,000 24,000 10,000 10,000 4,000 37,000 2,000 2,000 17,000 7,000 8,000 2,000 21,000 Рис. 16.536. Макет заголовка группировки «Склад» Заголовком группировки называется область отчета, содержащая имена выводимых в отчете полей. При создании данного макета необходимо указать либо имя группировки, либо поля группировки, для которой созда- ется макет. Также необходимо указать тип макета. Типы макетов такие же, как и для макета группировки. Существует следующее правило вывода макетов заголовка группировки: макет заголовка группировки действует на указанную группировку и на все ее вложенные группировки до момента обнаружения другого макета заголовка группировки. При обнаружении другого макета заголовка группировки начинает использоваться обнару- женный макет заголовка группировки. Тем самым существует возможность создания различных макетов заголовка для различных группировок. Для примера рассмотрим отчет с группировкой Склад и вложенной в нее группировкой Номенклатура. Создадим макет заголовка группировки Склад. В открывшемся диалоге выберем поле группировки Склад и тип макета Заголовок. Этот макет также действует на вложенную в нее группировку Номенклатура. Зададим элементы оформления ячеек заголовка группировки. У всех ячеек в строке Текст укажем произвольный текст шапки, а в строке Заполнение - Текст. Определим границы диапазона области заголовка группировки (рис. 16.537). Выполним отчет. Заголовок (шапка) группировки Склад и Номенклатура выводится с заданным оформлением (рис. 16.538). Создадим отдельный макет для заголовка группировки Номенклатура и выполним отчет. Теперь для каждой группировки выводится свой заго- ловок (рис. 16.539).
J^I Отчет ОстаткиНоменклатуры: ПредопределенныйМакет Q X Наборыданных Связи наборов данных Вычисляемые поля Ресурсы Параметры | Макеты | Вложенные схемы Настройки Рис. 16.537. Создание макета заголовка группировки «Склад» Рис. 16.538. Результат отчета @ Остяки иомвикляуры - Демоисг... ПСПрккприятке) Eaj 1д ’оЗ IS] SI ail М М+ М- . □ X Остатки номенклатуры Вариант отчета: | Основной_ | |> Сформировать 11 ПЗ Настройка... I | Выбратьварианг... | ад Все действия» । Начальный остаток Приход Расход Конечный остаток j Основной________ Номенклатура Жесткий Материнская плата Память 13Д00 9,000 4,000 Начальный остаток Приход Расход Конечный оопатох^ |-| Розничный 'Ёоывнклатура Веб-камера Микрофон Монитор LCD Итого Начальный остаток Приход Расход ___________________________10_______ 10 5 3 2 5 3] 2 24,000 7ДЮ 17,000 Конечный остаток ^ 2 ______________2 37 Q00 16,000 _____2 21 000 Рис. 16.539. Результат отчета Профессиональная разработка в системе «1С:Предприятие 8»
Создадим макет группировки Склад для вывода итогов по группировке (рис. 16.540). Склад Номенклатура Основной___________ Жесткий диск Материнская плата Память___________ Розничный Веб-камера Микрофон Монитор LCD Итого Количество Начальный остаток Количество Приход Количество Расход 13)300 3)300 5)300 5)300 24)300 10J300I 10,0001 4,000 i______________ 37,000 16,000 9)300 3)300 3)300 3)300 7,000 эроо 2)300 2,000 Количество Конечный остаток 4,000 2,000 2,000 17)300 7,000 8)300 2,000 21,000 Рис. 16.540. Макет общего итога заголовка В открывшемся диалоге выберем имя группировки Склад и тип макета Общий итог заголовок. Зададим элементы оформления ячеек итоговой строки группировки — шрифт и цвет текста. Зададим ячейку Итого с заполнением Текст. У всех остальных ячеек в строке Заполнение укажем Параметр, а в строке Параметр — имя конкретного поля, отображающегося в ячейке. Определим границы диапазона области значений группировки. Платформа сформирует список параметров для этой области и заполнит значениями по умолчанию (рис. 16.541). □ х Й Отчет ОстаткиНоменклатуры: ПредолределенныйМакет_____________________________________________________ Наборыданных Свгви наборов данных Вычисляемые поля Ресурсы Параметры | Макеты | Вложенные схемы Настройки Рис. 16.541. Создание макета группировки «Склед» для вывода общих итогов Выполним отчет. Общие итоги (итоги по группировке Склад) выводятся с заданным оформлением (рис. 16.542). Том 2
LG п pa вон ник] разработу и ка1 ® чЗу 'ы' Остатки номенклатуры. Демонст... (ЮПредприягие) i«=d |Д 151 ‘Ш| ’ail М М* М- - - □ X Остатки номенклатуры Вариант отчета: [Основной | | Выбрать вариант... | | |> Сформировать |i OS Настройка... Все действия* । (?) Склад Начальный остаток Приход Расход Конечный остаток 1=1 Основной 13.000 ЭДОО 4Д00' Номенклатура_________НачальныйОстаток Приход Расход КонечныйОстаток Жесткий диск____________________________________3_______3^___________________ Материнская плата 5 3 2 Память 5 3 2 1=| Розничный 24 ДОО 7,000 17,000 Номенклатура Начальный остаток Приход Расход Конечный остаток Веб-камера I I 10 31 7| Микрофон_________________________________I______10______2]___________________9 Монитор LCD I I 4 2] 2] ?fmo8o 37 16 2ij> Рис. 16.542. Результат отчета Макет ресурсов Данный макет предназначен для оформления ресурсов таблицы. Ресур- сами таблицы называется область отчета, содержащая значения полей ресурсов группировок или детальных записей. Для каждого макета ресурсов необходимо указать, для какой группировки строки и колонки таблицы он создается. Таким образом, макет ресурсов создается как бы на пересечении соответствующей строки и колонки таблицы. Для примера рассмотрим отчет с таблицей, в которой колонками являются Склады, а строками - Номенклатура (рис. 16.543). Номенклатура Основной Приход Расход Розничный Конечный Приход Расх остаток Итого д Конечный Приход остаток Расход Конечный остаток Веб-камера I 10,000 000 7 ДОО юдоо эдоо 7 ДОО Жесткий диск ЭДОО 3.000 I здоо эдоо Матержская плата Микрофон 5Д00 ЭДОО 2ЛЩ1 1 10,000 3 5,000 ООО' вдоо' юдоо эдоо 2,000 2,000 вдоо Мстит op LCD Память Итого 5,000 3,000 13,000 9Ш) И 4,000 2.000I 4XJ00I 24,000 2,000 2.000I 4 ДОО 5 000 7ДО0 17,000 37,000 2 ДОО здоо 16 доо 2 ДОО 2 ДОО 21 ДОО Рис. 16.543. Ресурсы отчета При создании макета ресурсов необходимо указать либо имя группировки, либо поля группировки, для которой создается макет. Также необходимо указать тип макета. Типы макетов такие же, как и для макета группи- ровки. Для демонстрации макета ресурсов создадим схему компоновки данных Г1редопределенныйМакет1 отчета ОстаткиНоменклатуры путем копирования макета ОсновнаяСхемаКомпоновкиДанных. В настройках отчета удалим вариант отчета Оформление и снимем признак использования у поля КоличествоНачальныйОстаток.
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты На закладке Макеты создадим макет ресурсов для вывода значений на пересечении строк и колонок таблицы. В открывшемся диалоге выберем для первой группировки поле Склад и тип макета Заголовок и для второй группировки — поле Номенклатура и тип макета Заголовок. Зададим элементы оформления ячеек ресурсов таблицы — шрифт и цвет текста. У всех ячеек в строке Заполнение укажем Параметр, а в строке Пара- метр — имя конкретного поля, отображающегося в ячейке. Ячейки будет только три, так как поле НачальныйОстаток не выводится в таблице. Опре- делим границы диапазона области значений группировки. Платформа сформирует список параметров для этой области и заполнит значениями по умолчанию (рис. 16.544). Т5! Отчет ОстаткиНоменклатуры: ПредопределенныйМакет! _ □ х1 Наборыданных Связи наборов... Вычисляемые...Ресурсы Параметры | Макеты | Вложенные схе... Настройки fi’ И Макет R1C1:R1C3 Область Параметры макета: Имя параметра Выражение 5 <Копичес, <Копичес, <Копичес пвоКонечныйОстатоИ> = КоличествоРасх... КоличествоРасход = КоличествоКоне... Количествоконечны... Рис. 16.544. Создание макета ресурсов таблицы Аналогично создадим макет ресурсов для вывода общих итогов по горизон- тали таблицы. В открывшемся диалоге выберем для первой группировки поле Склад и тип макета Общий итог заголовок и для второй группировки — поле Номенклатура и тип макета Общий итог заголовок. Зададим элементы оформления ячеек ресурсов (рис. 16.545). Установим схему ПредопределенныйМакет1 в качестве основной схемы компоновки данных для отчета Остатки номенклатуры и выполним отчет. Ресурсы таблицы выводятся с заданным оформлением (рис. 16.546). Чтобы стандартные макеты оформления не влияли на макет нашего доку- мента, в режиме настроек отчета на закладке Другие настройки можно установить макет оформления Без оформления. @©@
Отчет ОстаткиНоменклатуры: ПрепопределенныйМакет! □ X Наборы данных Связи наборов... Вычисляемые... Ресурсы Параметры | Макеты | Вложенные схе... Настройки Рис. 16.545. Создание макета ресурсов таблицы @ v Остатки номенклатуры • Демонстрационная конфигу... (1С:Предгриятив) iffil Ев? |Д V5 Й ЦП] ail м м* м- - - □ х | Остатки номенклатуры Вариант отчета: [Основной | | Выбрать вариант~ ] | |> Сформировать 11 Настройка.- Все действия i (?) Номенклатура Основной Розничный Итого Приход Расход Конечный Приход Расход Конечный Приход Расход Конечный остаток остаток остаток Жесткий диск Материнская плата /г 3 1 б' 3 3 2 здю 5,000 здю здю' 2 ДЮ Микрофон | 10 2 д ЮДЮ 2,000 В ДЮ Монитор LCD 4 2 2 4 ДЮ 2 ДЮ 2 ДЮ Память к 5 3 2 у 5 ДЮ ЗДЮ 2 ДЮ Итого 13JDOO иди 4.UUU 37 16 2<> Рис. 16.546. Результат отчета Макеты оформления Макеты оформления компоновки данных предназначены для оформления отчетов. При помощи макетов оформления можно указывать различным областям отчета определенные цвета фона, текста, шрифты и т.д. Система компоновки данных позволяет задавать различные макеты офор- мления как для всего отчета в целом, так и для его отдельных группировок. Для этого в режиме настроек конструктора схемы компоновки данных на закладке Другие настройки нужно перейти в режим настроек нужной группировки или глобального отчета и установить для них значение пара- Профессиональная разработка в системе «1С:Предприятие 8»
метра Макет оформления. Или же можно установить макет оформления отчета и отдельных группировок в режиме 1С:Г1редприятие по команде Все действия ► Изменить вариант... на закладке Дополнительные настройки. В приведенном примере в режиме изменения варианта отчета Продажи номенклатуры для группировки Контрагент параметр Макет оформления установлен в значение Море (рис. 16.547). Рис. 16.547. Настройка макета оформления отдельной группировки Аналогично для группировки Номенклатура задан макет оформления Зеленый, для группировки Период задан макет оформления Арктика, а для всего отчета — Яркий. В результате каждая группировка оформлена своим стилем, а оформление всего отчета отражено лишь в заголовке, отборе и параметрах, если они есть (рис. 16.548). Продажи товаров и услуг Параметры: Началопериода: 01.122011 Конецпериода: 15.122011 НМИг8** 11 ООО "Автоматика" | Диагностика компьютера I 2 11500,00 1500,00 5декабря2011 г. 1 1 000,00 11 декабря 2011 г. 1 500,00 Компьютер для дома 1 10 000,00 11 декабря 2011 г. 1 10000,00 >00 "Система" | I 10 000,00 Компьютер для офиса 1 10 000,00 9дехабря2011 г. 1 10000,00 >00 "Стиль" | I 10 000,00 Монитор LCD 1 10 000,00 6 декабря 2011 г. 1 10000,00 Рис. 16.548. Результат отчвта Том 2
LG п pa вон ник] разработу и ка] Существуют следующие стандартные макеты оформления: Без оформления, Основной — макет оформления по умолчанию, Яркий, Море, Арктика, Зеленый, Античный. Однако можно создать собственный макет оформления и затем использо- вать его в оформлении различных отчетов. Создание собственного макета оформления Собственный макет оформления можно создать, используя конструктор макетов. Для этого необходимо добавить новый макет в папку Общие макеты, находящуюся в папке Общие дерева объектов конфигурации. В открывшемся конструкторе макетов необходимо установить тип макета Макет оформления компоновки данных (рис. 16.549). Конструктор макета X Имя: |ИДД| Синении | Радуга Q| Комментарий |I - Выберите тип макета:--------------- (.) Т абличный документ О Т екстовый документ Q Двоичные данные QActive document QHTML документ Q Географическая схема (_)Гра фиче сквя схема О Схема компоновки данных фМакет оформления компоновки данных Загрузить из Файла | Готово : | Отмена | | Справка | Рис. 16.549. Создание нового макета оформления Редактор макетов оформления позволяет редактировать цвета фона, текста и границы, шрифты, отступы и т.д. областей макета оформления (рис. 16.550). Выделив в верхнем левом окне нужную область макета, можно изме- нить элементы ее оформления в нижнем левом окне и сразу увидеть результат оформления этой области в правом окне редактора макета. При этом названия областей, содержащих оформление, выделяются жирным шрифтом. ©©и
Глава116лСложнй1еТаналитинеские1от,чет£| fv Конфигурация Сметен сиДанных: Радуга Области <5^ I v Пример: Параметр Значение @ Цвет фона П255,255,153 0 Цветтекста И 0,128,0 0 Цвет границы И 0,128,0 0 •*' Стиль границы Сплошная О Шрифт Шрифтдиалоговимемо О Отступ О Аетоотступ О Горизонтальное поло... Прижать влево О Вертикальное полом... Прижать вверх О Размещение Забивать Пример отчета Параметры: Параметр: 01.01.2006 0:00:00 Отбор: Группироека1 Содержит "Группировка" Пример таблицы Группировка1 Группи ровка1 Иерарх ИЯ Группи ровка1 .1 Группи ровка2 Иерарх ИЯ Группи ровка2 .1 Группировка2 Ресурс Ресурс Ресурс Ресурс Группировка! Иерархия 10 10 6 6 Группировке! -1 10 10 6 6 Группировка2Иерархия 10 10 6 6 Группировка2• 1 6 6 6 6 Группировка2 -1 Группировка2 • 2 4 4 Группировка2- 2 Группировка2Иерархия Группировке! -1 Группировка! - 2 Группировка2Иерархия Группировка2-1 Группировка2• 1 Группировка2Иерерхия Группировка! • 2 Группировка! Иерархия Итого 10 10 d 6 т ' 1 * □ X Рис. 16.550. Редактирование макета оформления При выделении в списке областей макета нужной позиции двойным щелчком мыши одновременно выделяется соответствующая ей область результата оформления, при условии что для этой области задано специ- фическое оформление. И наоборот. Для каждой области макета существует возможность создать несколько уровней оформления. Это можно сделать, выделив нужную область и нажав кнопку Добавить над списком областей. В нижнем левом углу редактора есть возможность сохранить и загрузить макет в XML-формате. Кроме того, можно в любой момент очистить макет или загрузить предопределенный Стандартный макет. Это может понадо- биться, чтобы не разрабатывать свой макет оформления с нуля или чтобы получить недостающий опыт в оформлении макетов. При этом можно взять за основу какой-либо стандартный макет оформления и изменить только необходимые области. Поясним назначение областей макета оформления. Структуру отчета можно представить в следующем виде: Заголовок - область отчета, содержащая заголовок отчета; Информация - область отчета, содержащая текст установленных в отчете отборов, а также параметры данных отчета; Элементы отчета - содержат группировки, таблицы, диаграммы или вложенные отчеты. Таких элементов может быть несколько, например: Элемент отчета 1, Элемент отчета 2 ... Элемент отчета N. Группировку отчета можно представить в виде областей: Заголовок - область группировки, содержащая заголовок группировки верхнего уровня;
Информация - область группировки, содержащая текст установленных для группировки верхнего уровня отборов; Заголовок таблицы - область группировки, содержащая имена выво- димых полей; Заголовки группировок - области, содержащие значения выводимых полей группировки. Данные выводятся в начале группировки. Таких элементов может быть несколько: Заголовок группировки уровень 1, Заголовок группировки уровень 2 ... Заголовок группировки уровень N; Детальные записи - область, содержащая значения выводимых полей детальных записей; Подвалы группировки - области, содержащие значения выводимых полей группировки. Данные выводятся в конце группировки. Таких элементов может быть несколько: Подвал группировки уровень 1,°Подвал группировки уровень 2 ... Подвал группировки уровень N; Общие итоги по вертикали - область, содержащая итоги по группировке. Когда в настройках параметров вывода группировки задается тип макета Вертикально, группировка выводится в виде списка. Группировку отчета, представленную в виде списка, можно представить в виде областей: Заголовок - область группировки, содержащая заголовок группи- ровки; Информация — область группировки, содержащая текст установленных для группировки отборов; Заголовки группировки списка - области, содержащие значения выво- димых полей группировки. Данные выводятся в начале группировки. Таких элементов может быть несколько: Заголовок группировки списка уровень 1, Заголовок группировки списка уровень 2 ... Заголовок груп- пировки списка уровень N; Детальные записи списка - область, содержащая значения выводимых полей детальных записей; Подвалы группировки списка - области, содержащие значения выво- димых полей группировки. Данные выводятся в конце группировки. Таких элементов может быть несколько: Подвал группировки списка уровень 2, Подвал группировки списка уровень 1 ... Подвал группи- ровки списка уровень N; Общие итоги по вертикали списка - область, содержащая итоги по груп- пировке. Таблицу отчета можно представить в виде областей: Заголовок - область таблицы, содержащая заголовок таблицы; Информация - область таблицы, содержащая текст установленных для таблицы отборов; Заголовок таблицы - область таблицы, содержащая имена выводимых в строках таблицы полей; Профессиональная разработка в системе «1С:Предприятие 8»
Заголовки группировки - области таблицы, содержащие выводимые в строках таблицы поля. Данные выводятся в начале группировки. Таких элементов может быть несколько: Заголовок группировки уровень 1, Заголовок группировки уровень 2 ... Заголовок группировки уровень N; Подвалы группировки списка - области таблицы, содержащие выводимые в строках таблицы поля. Данные выводятся в конце группировки. Таких элементов может быть несколько: Подвал группировки списка уровень 2, Подвал группировки списка уровень 1 ... Подвал группи- ровки уровень N; Общие итоги по вертикали - область, содержащая итоги по колонкам таблицы; Заголовки и подвалы группировки колонки - области таблицы, содер- жащие выводимые в колонках таблицы поля; Ресурсы заголовка группировки, ресурсы подвала группировки, ресурсы детальных записей - области таблицы, содержащие выводимые в ячейках таблицы поля ресурсов. Для иерархических группировок используются соответственно ресурсы заголовка и ресурсы подвала иерархической группировки. Отметим, что в качестве заголовков и подвалов группировки могут быть использованы заголовки и подвалы иерархической группировки. Перед заголовками группировок могут находиться области заголовка и информации вложенной группировки. При отсутствии области подвала группировки выводится область ее заголовка. При отсутствии заголовка или подвала иерархической группировки выводятся соответствующие области неиерархической группировки. ПОДРОБНЕЕ Более подробно процесс создания собственного макета оформления описан в разделе «Примеры разработки отчетов» на стр. 207. Настройки отчета При заполнении системой настроек компоновки данных (при интерак- тивном редактировании, обработке расшифровки и т. п.) все свойства типа ПолеКомпоновкиДанных заполняются путем к данным на языке, указанном в свойстве конфигурации Вариант встроенного языка. Конструктор настроек Конструктор настроек облегчает процесс создания простых стандартных настроек, определяющих, как будет выводиться информация в отчет. Конструктор не предназначен для того, чтобы создавать любые настройки отчета. Он позволяет сделать только несколько наиболее типичных сценариев. Это инструмент, предназначенный в первую очередь для пользователя. А также им может пользоваться и разработчик, если нужно Том 2
G п pa вон ник] раз р а б.отл и ка быстро настроить отчет без хитростей или просто посмотреть данные, выдаваемые отчетом. ПОДРОБНЕЕ Работа с конструктором настроек на конкретных примерах подробно рассмотрена в разделе «Примеры разработки отчетов» (стр. 146). Конструктор настроек вызывается на закладке Настройки схемы компо- новки данных нажатием кнопки Открыть конструктор настроек 4, расположенной на командной панели в окне настроек. Работа с конструктором представляет простой пошаговый процесс. Сначала определяется тип отчета (рис. 16.551). Отчет ОстаткиНоменклатуры. ОсновнаяСхемаКомпоновкиДанных1 Наборы данных Связи наборов,,, Вычисляемые.,, Ресурсы Параметры Макеты Вложенные схе.,, | Настройки Имя вариа... Представл... Основной Оформление Оформление Тип отчета: О Список. Данные по всем измерениям отчета выводятся списком Настройки: | Отчет | Отчет Параметры | Выбранны... С О Отображать недоступные параме Параметр □ Конец периода ^ЛТаблйщГДанныё^ •'горизонтали, так и по вертикали ] О Диаграмма Данные выводятся в вида диаграммы. | Далее > 11 ОК 11 Отмена 11 Справка | Рис. 16.551. Конструктор настроек. Шаг 1 Список - соответствует элементу структуры отчета Группировка, где информация выводится по строкам; Таблица - данные выводятся в виде таблицы, сгруппированные по строкам и колонкам; Диаграмма - данные выводятся в виде диаграммы. На следующем шаге определяются поля, выводящиеся в отчет. Второй шаг одинаков для всех типов отчета. На следующем шаге осуществляется выбор в зависимости от типа отчета.
I ЕлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Если выбран тип отчета Список, определяются поля для группировки записей в списке (рис. 16.552). S Конструктор настроек компоновки дияных IHmhhuhtv Выберите поля по которым будет производиться групгшроека данных. Поля группировок отображаются в отчете. Доступные поля •*' ® •* ® Номенклатура = Период + <1 Количество | < Назад | [ Дуее > i|1 ОК 11 Отмена 11 Справка | Рис. 16.552. Конструктор настроек. Шаг 3 Если выбран тип отчета Таблица, определяются поля для группировки строк и колонок таблицы (рис. 16.553). Конструктор настроек компоновки данным Выберите поля по которым будет производиться группировка таблиц, строк и колонок отчета Поля группировок отображаются в отчете. Доступные поля * = Склад f J КоличествоКонечныйОстеток ♦ J КолмествоНачагъшйОотеток * <1 КоличествоПриход * J КоличествоРасход Строки | < Назад 1Далее > 11 ОК 11 Отмена 11 Справка | Рис. 16.553. Конструктор настроек. Шаг 3 Если выбран тип отчета Диаграмма, определяются поля для группировки серий и точек диаграммы (рис. 16.554). Четвертый шаг одинаков для всех типов отчета. Здесь определяются поля для сортировки записей в отчете. Если выбран тип отчета Диаграмма, на пятом шаге определяется тип диаграммы.
S, Конструктор настроек компоновки данным Выберите поля по который будет производиться группировка диаграмм, серий и точек диаграммы Поля групгшровок отображаются в отчете. | < Назад 11[ Далее > 11 ОК 11 Отмена 11 Справка | Рис. 16.554. Конструктор настроек. Шаг 3 Варианты отчета У одного и того же отчета может существовать несколько вариантов, пред- ставляющих одни и те же данные в различном виде. Например, для отчета Динамика продаж одним вариантом отчета может служить диаграмма, пока- зывающая продажи товаров по периодам, а другим - табличный отчет, показывающий продажи товаров в разрезе покупателей. При этом каждый вариант отчета обладает своим набором пользовательских настроек. Выбирая различные варианты отчета, пользователь может легко проана- лизировать данные. Для этого следует нажать кнопку Выбрать вариант... в окне отчета и указать нужный вариант (рис. 16.555). @ ^7 Остатки номенклатуры-Деме... (1С:Предприягие) |4 'uj |S] 1Ё1 'sil - - □ X Остатки номенклатуры Вариант отчета: | Основной| ^Выбрать вариант, | 1> Сформировать 11 QgJ Настройка... Номенклатура Вебчсемера______ Жесткий диск Материнская плата Микрофон________ Монитор LCD_____ Память__________ Итого Основной Розничный |_ Начальный Приход Расход Конечный Начальный ПрИход Расход Кок остаток ** @ Выбор варианта отчета • Демонстр... (ЮПредодиятив) X ЭХ 51 Выбор варианта отчета 13,0 | Выбрать | Отмана {?) Рис. 16.555. Выбор варианта отчета Профессиональная разработка в системе «1С:Предприятие 8»
Варианты отчета изначально создаются разработчиком в схеме компо- новки данных (стр. 136), исходя из реальных потребностей пользователя (рис. 16.556). □ х Й Отчет ОстаткиНоменклатуры: ОоновнаяСхемаКомпоновкиДанных Наборыданн,. Связинабор.,. Вычисляемы,., Ресурсы Параметры Макеты Вложенные с.,, | Настройки |_ [ft X и О Имявариа... Представл... < | Основной 3 Оформление Оформление Q] ••т Таблица - Строки 0™ Номенклатура - Колонки Склад - □ X Й Отчет ОстаткиНомонклатуры: ОсновнаяСхомаКомпоновкиДанных Наборыданн,,, Связинабор.,, Вычисляемы.,, Ресурсы Параметры Макеты Вложенныес,,, | Настройки |_ \ <г О । Ц Q2 - Di 0™ Склад 0™ Номенклатура 0™ < Детальные записи) й ОЙ йЗ оЯ Имя вариа... Представл... Основной Основной Склад Количество КонечныйОст КоличествоНачальньйО< КоличествоПриход КоличествоРасход Системные!") оля Параметры Данных Парамет... | Выбрат„ | Отбор Сортиров... Вспоено,,,Польвов.,, Другиен,. Доступные поля Пеле 0 0 0 0 0 0 = Номенклатура = Склад <1 КоличествоНачальныйОстаток < 1 КоличествоПриход < 1 КоличествоРасход < 1 КоличествоКонечныйОстаток Рис. 16.556. Создание вариантов отчета в схеме компоновки данных В приведенном примере (см. рис. 16.556) для отчета Остатки номенкла- туры в схеме компоновки данных созданы два варианта: Основной (этот вариант стандартно создается платформой для любых отчетов) и вариант Оформление. При этом каждому варианту соответствуют свои стандар- тные настройки - структура отчета, отбор, сортировка и т. п. Оба варианта будут доступны для выбора в режиме 1 С: Предприятие (см. рис. 16.555) всем пользователям прикладного решения. Но достаточно опытный пользователь может изменить какой-либо вариант отчета или создать свой собственный и сохранить его для даль- нейшего использования. При этом если в конфигурации предусмотрен специальный механизм обмена настройками, им смогут пользоваться все пользователи прикладного решения. Об этом будет рассказано ниже (стр. 309). Чтобы изменить вариант отчета в режиме 1 (^Предприятие, нужно выпол- нить команду Все действия ► Изменить вариант... При этом пользователю открывается окно настроек отчета, очень похожее на закладку Настройки в схеме компоновки данных (рис. 16.557). После выполнения изменений нужно нажать кнопку Завершить редактирование. Том 2
G п pa вон ник] раз р а б.отл и ка •ё) Вариант "Оформление" отчета "Оотатки номенклатуры"-Демонстрационная конфигурация "Систе... (ЮПрадлриятме) X Вариант "Оформление” отчета "Остатки номенклатуры" Добавить * । [tf । X I & О । Все действия'^ Структура отчета flf |5J Ijj® ' Qg T Q) Отчет fig lift @™ Склад 0™ Номенклатура |?Й 0™ f|g nln flffl ng Пар... |ftj Поль.., flfl Труп.,, Qg Поля fig Отбор | fllH Сорт... | gfi Цел... Qg Дол.,, @ Tекущий элемент имеет собственную сортировку (для упорядочивения записей, выводимых в элементе) Выбрать Все действия» ф) Добавить новый элемент порядка । Все действия» Доступные поля * в + в Склад ♦' J Конечный остаток '+ <1 Начальный остаток * <1 Приход + <1 Расход Поле Направление сортировки [7^ <АВТО> 0 <1 Конечный остаток По убыванию Завершить редактирование Отмана I В се действия » । <£) Рис. 16.557. Изменение варианта отчета в режиме «1С:Предприятие» Однако следует иметь в виду, что окно полных настроек отчета, вызы- ваемое по команде Все действия ► Изменить вариант..., предназначено лишь для опытного пользователя. Для большинства же пользователей следует помещать необходимые им настройки в состав пользователь- ских настроек (стр. 307), которые будут доступны в отдельном окне по команде Настройка. При этом наиболее часто используемые настройки должны быть быстрыми, то есть располагаться непосредственно в отчетной форме. Если вариант отчета был изменен, то при выборе другого варианта или при закрытии отчета пользователь может сохранить сделанные изменения, ответив утвердительно на соответствующий вопрос «1С:Предприятия» (рис. 16.558). 1С:Предприятие X Вариант отчета был изменен. Сохранить иемеиенный вариант? Да ,| | Нет || Отмена | Рис. 16.558. Запрос приложения о сохранении варианта отчета Если редактировался вариант отчета, созданный разработчиком в схеме компоновки данных, то пользователю будет предложено сохра- нить эти изменения в собственном варианте отчета, как если бы он нажал Все действия ► Сохранить вариант... (рис. 16.559). Если же редак- тировался другой вариант отчета, сделанные изменения сохранятся именно в том варианте отчета, который он изменял.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 («&) Сс»фанен« варианта отчета • Демонстрационная конф... (ЮПреилриягие) X Сохранение варианта отчета Ранее сохраненные варианты: Имя сохраняемого варианта flpfeew nponaaQ | | Сохранить | Отмена (?) Рис. 16.559. Сохранение варианта отчета СОВЕТ Советуем сохранять свои изменения в собственном варианте отчета, а стандартный вариант оставлять без изменений как образец. Тогда в случае ошибки всегда можно будет вернуться к правильному первоначальному варианту отчета. Следует понимать, что если в конфигурации не разработан специальный механизм обмена настройками, то вариант отчета, сохраненный в режиме 1С:Предприятие, будет доступен только конкретному пользователю, создавшему этот вариант, в то время как варианты отчета, созданные разработчиком в схеме компоновки данных, будут доступны для всех пользователей прикладного решения. При этом для каждого варианта отчета может быть несколько вариантов пользовательских настроек, сохраненных пользователем при помощи команды Все действия ► Сохранить настройку... Однако такие вари- анты настроек будут доступны лишь тому пользователю, который их сохранил. Сохранение и загрузка настроек отчета В схеме компоновки данных есть возможность сохранить настройки отчета в XML-файл. Для этого нужно нажать кнопку Сохранить настройки в файл ^расположенную в командной панели конструктора схемы компо- новки данных на закладке Настройки, и ввести имя файла для сохранения настроек (рис. 16.560). Далее можно удалить все сделанные настройки кнопкой — Заменить настройки стандартной настройкой, расположенной здесь же, и на запрос конфигуратора о подтверждении потери текущих настроек ответить утвердительно. Затем можно восстановить сохраненные ранее настройки из XML-файла. Для этого нужно нажать кнопку Загрузить настройки из файла Ц?, распо- ложенную здесь же, и ввести имя файла для восстановления настроек (рис. 16.561).
- □ X Й Отчет ПродажиНомонклетуры: ОсновнаяСхомаКомпоновкиДанных Наборыдажых Связи наборов,., Вычисляемые,- Ресурсы Параметры Макеты Вложенные схе.,. | Настройки [ Z. -LT О Имя варив.. Представл.. Основной ОСНОЕНОЙ^И QTfflBI г 0™ Контрагент г 0™ Номенклатура Период , £ Q?(S)|J8 ®8 01 ® sffl 02 |сохра> |ить 11астройки в файл -3J-X1 База Палка; О Конецпериода Параметры | Выбр. О Отображать недосту Параметр £)lCv8FTxt ^ICvSLog iff анализ_поступления_продаж iff настройки.анализЦен.СБ ffнастройки остатки.номенкпатуры вЕвтпилпгапвн ГДЯ остапФ1_г1родажи_тоеаров iff предопределеньй_маквт iff примермакета iff осема_анализЦен_СБ iff схема_макетСБ iff осема_окаэание_услуг iff схема.остатюмэменклатуры iff схема.осгатки-юменклатуры.макет Iff осема_роступлен«_тоеаров Iff осема_продажи Iff схема.продажи.контрагентам [ff схема.продажиноменклатуры Iff осема_СБ Iff схема.СБ.мастера скема_состаеСБ Iff схема.список.номенклатуры Iff схема.цены.комплектующих Имя Файла Тип файла; 1настройки.продажиноменклатуры | Сохранить"] | Документ XMLC-xml) Рис. 16.560. Сохранение настроек в XML-файл Й Отчет ПродажиНоменклатуры: ОснеэнаяСхемаКомпоновкиДа! Наборыданньи Связинаборов.,. Вычисляемые... Ресурсы Параметры Макеты Вложенные схе... | Настройки |_ с- I Л Имя вариа... Представл... Основной 1- г- I — Di |ДД| •?: Контрагент •- |7)ао Номенклатура 0™ Период ДИ Sffl пЯ p.il ру !Zilh I 1с-|(:1роЙКИ И ) (ll.'il/IJI.'i Палка: База Параметр О Отображать недост О Конецпериода QlCvSFTxt £)lCv8Log ffl iff анализ .поступления .продаж iff настройки.анализЦен.СБ ffj настр ойо^.остатки.номенкла туры вввакшотвиЕва iff остатм<1_гродажи_тоеарсе iff предопределеный.макет iff примермакета iff скема.анализЦен.СБ 1^скема_макетСБ iff схема_окавание_услуг iff схема.остаткмноменклатуры iff схема.остатюмэменклатуры.маквт Iff скема.поступление.товаров |ff] схема .продажи Iff схема.продажи.контрагентам Iff схема.продажи .номенклатуры [ffcxeMa.CB Iff схема.СБ.мастера Iff скема.составСБ Iff схема_список_номенклатуры Iff схема□дены.комплекгующих Имя Файла; 1настройки.продажи_номежлатуры | Открыть" Тип Файлов: 1ДокименгХМ1Г.хтП Отмена Рис. 16.561. Восстановление настроек из XML-файла Настройки можно также сохранять/восстанавливать и средствами встроенного языка. Профессиональная разработка в системе «1С:Предприятие 8»
Пользовательские настройки Среди всего многообразия настроек отчета разработчик в схеме компо- новки данных (или квалифицированный пользователь при изменении варианта отчета в режиме 1С:Предприятие) может предоставить поль- зователю возможность самостоятельно задавать и использовать часть настроек отчета. Например, это может быть настройка отчетного периода, настройка отбора, настройка сортировки записей отчета и т.п. Такие настройки называются пользовательскими (стр. 164). Они будут доступны пользователю в отдельном окне при нажатии кнопки Настройка или по команде Все действия ► Настройка... Среди этих пользовательских настроек существуют такие настройки, которые нужны пользователю постоянно, чуть ли не при каждом запуске отчета, поэтому они должны быть всегда на виду. Например, это отчетный период или код бухгалтерского счета. Такие настройки назы- ваются быстрыми пользовательскими настройками (стр. 143). Они будут доступны пользователю непосредственно в отчетной форме. Чтобы сделать настройку пользовательской, в схеме компоновки данных на закладке Настройки нужно выделить настройку, нажать кнопку Свойства элемента пользовательских настроек, расположенную в правом нижнем углу окна настроек, и установить флажок Включать в пользователь- ские настройки (рис. 16.562). Чтобы при этом пользовательскую настройку сделать быстрой, нужно установить режим редактирования в значение Быстрый доступ. £] Отчет ОтчетПоСистемнымБлокам: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.562. Установка свойств пользовательской настройки Том 2
LG п pa вон ник] разработу и ка] В рассмотренном примере (см. рис. 16.562) параметры отчета Начало периода и Конец периода включены в состав быстрых пользовательских настроек. В результате они будут доступны для редактирования непосредс- твенно в отчетной форме (1), а также в отдельном окне пользовательских настроек (2), вызываемом при нажатии кнопки Настройка (рис. 16.563). Рис. 16.563. Быстрые (1) и обычные (2) пользовательские настройки Для неопытных пользователей обычно вполне достаточно и удобно, когда настройки заданы жестко и при этом пользователь может лишь включить/ выключить признак их использования или, например, выбрать для отбора отчета конкретный вид номенклатуры. Но для опытных пользователей можно предоставить свободу в использовании настроек, то есть возмож- ность, например, самостоятельно создавать настройки отчета: отбор, порядок, условное оформление и пр., аналогично изменению полных настроек в схеме компоновки данных. Для этого на закладке Настройки схемы компоновки данных нужно выде- лить элемент структуры отчета и нажать кнопку Свойства элемента пользовательских настроек, расположенную вверху, в командной панели окна настроек (рис. 16.564). В появившемся окне можно отредактировать состав пользовательских настроек элементов отчета. В приведенном примере (см. рис. 16.564) настройки отбора и условного оформления включены в состав пользовательских настроек, которые будут доступны пользователю в отдельном окне, вызываемом кнопкой Настройка. Пользовательские настройки могут быть переведены в разряд быстрых и наоборот. Это может сделать разработчик в схеме компоновки данных путем установки свойств настройки в значение Быстрый доступ или Обычный доступ. В режиме 1С:Предприятие пользователь также, не изменяя вариант отчета, может изменить состав настроек, выполнив команду Все действия ► Изменить состав настроек... (рис. 16.565).
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Рис. 16.564. Состав настроек отчета Рис. 16.565. Окно пользовательских настроек отчета в режиме «1С:Предприятие» В открывшемся окне Состав настроек пользователь может указать, какие настройки будут редактироваться в форме отчета (правый список), то есть будут быстрыми, а какие будут доступны по команде Настройка (левый список). Кнопками Добавить, Удалить или двойным щелчком мыши можно перенести настройки из левого списка в правый и наоборот (рис. 16.566). Рис. 16.566. Редактирование состава настроек
Или же можно редактировать состав настроек в окне Настройки отчета, выполнив команду Все действия ► Изменить форму... и включив признак отображения у колонки формы Редактирование в форме отчета (рис. 16.567). @ Настройки отчета'Прстажиноменклетуры'1- Демонстрационная конфигурация''Система компоновки данных'' (1С:Прешт>иятие) X Настройки отчета "Продажи номенклатуры" Настройка 0 litl Начало периста 01.12.2011 0 iTTl Конец периста 15.12.2011 О |М Номенклатура В ид н... Равно ® Отбор □ afl Мелкий заказ ___ йТ| Условное оформление О О |М Номенклатура Равно Диагностика комгъютера Q Редактирование в Форма отчета 0 0 □ □ | Завершить редактирование | Отмена । Все действия । \?) Рис. 16.567. Редактирование состава настроек В повседневной работе пользователю часто приходится выполнять опре- деленный отчет с определенными настройками. Если пользователя удовлетворяет вариант отчета, полученный с помощью сделанных им настроек, и если таким отчетом он планирует пользоваться регулярно, то, вполне вероятно, он захочет его сохранить на будущее. Для этого в окне отчета нужно нажать кнопку Все действия и выбрать пункт Сохра- нить настройку... (рис. 16.568). (№) Сохранение настроек стчета- Демонстрационная конф... (ЮПредгриятив) X Сохранение настроек отчета Ранее сохраножь» настройки: Имя софаняемой настройки: ^Оформлением | | Сохранить Отмана (?) Рис. 16.568. Сохранение пользовательской настройки В дальнейшем пользователь может экспериментировать с составом и значениями настроек отчета. При закрытии окна отчета настройки, сделанные пользователем, запоминаются и становятся настройками по умолчанию для текущего пользователя. Если пользователь хочет выполнить отчет с другой, ранее им сохраненной настройкой, в окне отчета нужно нажать кнопку Все действия и выбрать пункт Выбрать настройку (рис. 16.569). Профессиональная разработка в системе «1С:Предприятие 8»
(«&) Выбор настроек отчета • Демонстр... (ЮПредгриятив) X Выбор настроек отчета Выбрать Отмана ф Рис. 16.569. Восстановление пользовательской настройки ВНИМАНИЕ! Сохранение и последующая загрузка пользовательских настроек очень удобны для пользователя, чтобы ему не приходилось каждый раз редактировать настройки вручную. Однако пользователь может выби- рать только те настройки, которые он сам сохранил. Настройки, сделанные в режиме 1С:Предприятие, естественно перекрывают стандартные настройки, сделанные разработчиком в схеме компоновки данных. И если пользователь настолько все пере- строил в отчете так, что его не узнать, то всегда можно вернуться к стандартным настройкам по команде Все действия ► Установить стан- дартные настройки. Хранилище вариантов и хранилище пользовательских настроек Подобно другим настройкам пользователей настройки вариантов отчетов и пользовательские настройки отчетов стандартно хранятся в системных таблицах информационной базы, и разработчик может иметь к ним доступ с помощью встроенного языка. Заметим, что в стандартном хранилище сохраняются только варианты отчетов и пользовательских настроек, созданные в режиме ^Пред- приятие. Варианты отчета, созданные в конфигураторе, сохраняются в самой схеме компоновки данных и являются частью конфигурации. Кроме того, разработчик может переопределить стандартное храни- лище этих настроек в конфигурации как на уровне всей конфигурации, т. е. сразу для всех отчетов, так и на уровне отдельного отчета. В первом случае используются свойства конфигурации Хранилище вариантов отчетов и Хранилище пользовательских настроек отчетов (рис. 16.570). Во втором случае используются свойства конкретного отчета Хранилище вариантов и Хранилище настроек (рис. 16.571). Том 2
G п pa вон ник] раз р а б.отл и ка Свойства X ;i [Я]'й1 х у_________________________________________________________ ▼ Основные: __________________________________________________________________I1 Синоним | Демонстрационная конфигурация “Система компоновкиданных" 0.11 Комментарий | |, Основной режим запуска |Цправляемое приложение ▼!; Вариант встроенного яэька |Русский_________________▼!' Основнаярол» |... х|| Модуль управляемого приложения Открыть | Модул» сеанса Открыть Модул» внеитего сооджетя Открыть Долотигел»ныесловариполютексгового поиска I... х| Хранилище общих настроек__________________I________________________... х| /Яранияище пользовательских настроек \<ранияище вариантов отчетов______________[ХранилищеВариантоеОтчетов ... xj Хранилище настроек данных Форм I... х| ▼ Представление: Командный интерфейс Открыть Рабочая область рабочего стола Открыть Командный интерфейс рабочего стола Открыть Основной язык |Русский Рис. 16.570. Свойства конфигурации для хранения настроек отчетов Рис. 16.571. Свойства отчета для хранения настроек Таким образом, при сохранении вариантов отчетов и пользовательских настроек отчета платформа использует следующий алгоритм действий: 1. Сначала просматриваются свойства конкретного отчета. Если в них хранилище настроек переопределено, то варианты и настройки отчета сохраняются в это хранилище. 2. Если в свойствах отчета ничего не указано, то платформа просматри- вает соответствующие свойства конфигурации. Если в них хранилище настроек переопределено, то варианты и настройки отчета сохраня- ются в это хранилище.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 3. Если в свойствах конфигурации тоже ничего не указано, то платформа сохраняет настройки в стандартное хранилище (в системные таблицы информационной базы). Предполагается, что в простых конфигурациях (как и в демонстрационной конфигурации, прилагающейся к книге) будет использоваться стандар- тный механизм хранения настроек в стандартном хранилище, который не требует дополнительного кодирования. В сложных конфигурациях (например, когда требуется обмен настрой- ками в распределенной информационной базе, когда нужна особенная структура хранения настроек и т. п.) разработчик может создавать собс- твенные хранилища настроек и самостоятельно управлять их работой. Копирование настроек отчетов между пользователями Несмотря на то, что стандартный механизм хранения настроек в большинстве случаев вполне устраивает, хотелось бы доработать конфигурацию так, чтобы все пользователи прикладного решения могли пользоваться вариантами отчетов и пользовательскими настрой- ками, созданными в режиме 1 (^Предприятие. Предположим, что пользователь, обладающий административными правами, является достаточно квалифицированным и может создавать различные варианты и настройки отчетов. Предоставим ему возможность копировать эти настройки другим рядовым пользователям. Создадим общую команду КопироватьНастройкиОтчетов и укажем группу Сервис в панели действий приложения, в которой она будет отображаться (рис. 16.572). Свойства: КопироватьНастройкиОтчетов X 21 [%]> х *_______________________________ ▼Основные: Имя [КопироватьНастройкиОтчетов_______J Синоним [Копировать настройки отчетов_____QI Комментарий)J Тип параметра команды ▼ х Режим использования параметра Одиночный v Изменяет данные Модуль команды Открыть ▼ Представление: Отображение [Авто ▼ | Подсказка [ Q | ____________________________________________________г Сочетание клавиш [ х| Картинка [ х] ▼Справочной информация: Включать в содержание справки Q Справочная информация Открыть Рис. 16.572. Свойства команды для копирования настроек
В диалоге Командный интерфейс рабочего стола предоставим доступ к этой команде только пользователю с ролью Администратор (рис. 16.573). Командный интерфейс рабочего стола т_г О । • / । Отбор по ролям: | <Не установлен»▼ ...| Команда Видимость |П*1 Места работы |П*1 Оказание услуг |Д] Остатки и продажи товаров |П*1 ОстаткиНоменклатуры liiil Остатки номенклатуры по периодам |П*1 Отчет по продажам |Щ] Отчет по системным блокам |П*1 Поступлениетоваров |Щ] Продажи контрагентам |Д] Продажи номенклатуры |П*1 Работа мастеров liiil Расчет показателей продаж |П*1 Сборка системных блоков |Щ] Сгмсок номенклатуры |П*1 Цены комплектующих от поставщиков Консоль системы компоновки данных Оз Организаций Q? Покаэыветьданные о продажах | ОК | | Отмана | | Справка | Рис. 16.573. Видимость команды по ролям В модуле команды напишем следующий код (листинг 16.135). Листинг 16.135. Обработчик команды для копирования настроек &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) СкопироватьНастройкиОтчетов(); КонецПроцедуры Процедура СкопироватъНастройкиОтчетов() СписокПользователей = ПопьзователиИнформационнойБазы.ПолучитъПопьзователей(); СписокОтчетов = Метеданные.Отчеты; Для Каждого Пользователь Из СписокПользователей Цикл ТекущийПольэователь = Пользователь.Имя; Если ТекущийПольэователь <> ИмяПользователя() Тогда Сообщить(”Копирование настроек для пользователя: ” + ТекущийПольэователь); Для Каждого Отчет Из СписокОтчетов Цикл ИмяОтчета = "Отчет." + Отчет.Имя; СписокВариантовОтчета = ХранилищеВариантовОтчетов. ПолучитьСписок(ИмяОтчета); Для Каждого Вариант Из СписокВариантовОтчета Цикл КлючВарианта = Вариант.Значение; Сообщить("Вариант отчета ” + ИмяОтчета ++ Вариант.Представление); Профессиональная разработка в системе «1С:Предприятие 8»
ОписаниеВарианта = ХранилищеВариантовОтчетов. ПолучитьОписание(ИмяОтчета, КлючВарианта); //Сообщить(ОписаниеВарианта.Представление); ВариантОтчета = ХранилищеВариантовОтчетов. Загрузить(ИмяОтчета, КлючВарианта); ХранилищеВариантовОтчетов.Сохранить(ИмяОтчета, КлючВарианта, ВариантОтчета, ОписаниеВарианта, ТекущийПользователь); КлючВариантаОтчета = ИмяОтчета +7"+ КлючВарианта; СписокНастроекВарианта = ХранилищеПользовательскихНастроекОтчетов. ПолучитьСписок( КлючВариантаОтчета); Для Каждого Настройка Из СписокНастроекВарианта Цикл КлючНастройкиВарианта = Настройка.Значение; Сообщить("Пользовательская настройка отчета" + ИмяОтчета + " + Настройка.Представление); ОписаниеНастройкиВарианта = ХранилищеПользовательскихНастроекОтчетов. ПолучитьОписание(КлючВариантаОтчета, КлючНвстройки Варианта); //Сообщитъ(ОписаниеНастройкиВарианта.Представление); НастройкаВариантаОтчета = ХранилищеПользоватвльскихНвстроекОтчетов. Загрузитъ( КлючВариантаОтчета, КлючНастройкиВарианта); ХранилищеПользовательскихНастроекОтчетов. Сохранитъ( КлючВариантаОтчета, КлючНастройкиВарианта, НастройкаВариантаОтчета, ОписаниеНастройкиВарианта, ТекущийПользователь); КонецЦикла; КонецЦикла; КонецЦикла; КонецЕсли; КонецЦикла; КонецПроцедуры В процедуре СкопироватьНастройкиОтчетов() сначала определяется список пользователей информационной базы и список отчетов в коллекции метаданных. Затем для каждого пользователя, кроме текущего (т. е. адми- нистратора), обходится список отчетов. В цикле для каждого отчета получается список вариантов отчета, сохраненных в стандартном хранилище (ХранилищеВариантовОтчетов.По- лучитьСписокО). Доступ к менеджеру стандартного хранилища настроек получается при помощи метода глобального контекста ХранилищеВариан- товОтчетов или хранилищеПользовательскихНастроекОтчетов. Том 2
LG п pa вон ник] разработу и ка] Затем для каждого варианта отчета, используя методы менеджера стандар- тного хранилища настроек ПолучитьОписание(), Загрузить]), Сохранить]), получаются описание варианта, собственно сам вариант отчета, и полу- ченные данные сохраняются для каждого пользователя. Далее для каждого варианта отчета получается список пользовательских настроек варианта отчета (ХранилищеПользовательскихНастроекОтче- тов.ПолучитьСписок])). Затем для каждой пользовательской настройки варианта отчета, используя методы менеджера стандартного хранилища настроек ПолучитьОпи- сание]), Загрузить]), Сохранить]), получаются описание пользовательской настройки, собственно сама пользовательская настройка, и полученные данные сохраняются для каждого пользователя. В качестве ключа объекта для вариантов отчета используется полное имя отчета, например, строка Отчет.ОстаткиНоменклатуры. В качестве ключа объекта для пользовательских настроек вариантов отчета используется полное имя отчета плюс через флеш (/) ключ варианта отчета. В результате выполнения команды Копировать настройки отчетов, иници- ируемой администратором, все варианты отчетов и пользовательские настройки, созданные им в режиме 1 (^Предприятие, будут скопированы другим пользователям прикладного решения. Фиксированные настройки В некоторых случаях существует потребность в настройках, которые не будут зависеть от текущего варианта отчета и от текущих настроек отчета. Например, бывает нужно, чтобы при открытии отчета с указанным отбором, условным оформлением и т.д. указанный отбор, условное оформление и т.д. не применялись непосредственно к пользовательским настройкам, так как в этом случае они будут сохраняться вместе с ними и затираться при выборе другого варианта отчета или пользовательской настройки. Иногда при анализе отчета может возникнуть потребность изменять вариант отчета, сохраняя при этом некоторые настройки неиз- менными. Например, нужно проанализировать различные варианты отчета для одного и того же контрагента. Для решения подобных задач существуют фиксированные настройки, к которым можно получить доступ из встроенного языка, используя свойство ФиксированныеНастройки и метод ЗагрузитьФиксирован- ныеНастройки]), аналогичный методу ЗагрузитьНастройки]) объекта КомпоновщикНастроек. ЭИ
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 При исполнении отчета, а также при получении настроек с помощью метода встроенного языка ПолучитьНастройки() происходит следующее: пользовательские настройки применяются к основным настройкам (в возвращаемой копии настроек); отбор из фиксированных настроек добавляется к отбору основных настроек; условное оформление из фиксированных настроек добавляется к условному оформлению основных настроек; параметры данных, установленные в фиксированных настройках, устанавливаются в основных настройках. При наличии пересечения отбора и параметров фиксированных настроек с отбором и параметрами пользовательских настроек варианта отчета, при исполнении отчета и получении настроек при помощи метода Полу- читьнастройки() выдается ошибка. При наличии у отчета фиксированных настроек любая расшифровка выполняется в новом окне. При наличии фиксированных настроек в реквизит представления вари- анта добавляется строка «(Установлен дополнительный отбор)». Упорядочивание Так как в отчет может выводиться множество группировок и таблиц, упорядочивание в системе компоновки данных желательно выполнять средствами самой системы компоновки данных, а не средствами языка запросов. В запросе также можно упорядочить записи в отчете, но, во-первых, система компоновки предоставляет для этого больше возмож- ностей, которые будут рассмотрены ниже, а во-вторых, упорядочивание в запросе делает отчет менее гибким с точки зрения его дальнейшей настройки пользователем. Упорядочивание группировок По умолчанию каждая группировка будет упорядочена по полям груп- пировки. Например, в отчете есть группировка по полю Номенклатура и не указан порядок. В таком случае упорядочивание группировки будет осуществляться по полю Номенклатура (рис. 16.574). Рассмотрим другой пример. В отчете есть группировка по полю Номенк- латура и в глобальном упорядочивании, то есть настройках отчета в целом указано поле Номенклатура.Код (рис. 16.575). Ж
Продажи товаров и услуг Параметры: Начало периода: O1.D1.2012 Конец периода: 31.01.2012 Контрагент Номенклатура, Код Период________________________ ООО "Автоматика" Компьютер игровой, 000000013 12 января 2012 г._________ ООО "Атлант" /Восстановление денных, 000000016 15 января 2012 г._________ Ремонт компьютера, 000000014 13 января 2012 г._________ Сопутствующее услуги, 000000015 у 13 января 2012 г. дод"Стенд5Р^^^^^^^^^^“ количество Стоимость 13 000,00 1 13 000,00 1| 13ооодо 9 000,00 1 ' 5 000,00 1| 5 ОООДО 1 3 000,00 1| 3ооодо 2 1 000,00 2| 10ООДО 4 500,00 Диагностика компьютера, 000000007 14 января 2012 г. Ремонт компьютера, 000000014 14 января 2012 г. Солутствуювее услуги, 000000015 14 января 2012 г. ООО "Стиль" Веб-камера, 000000026 12 января 2012 г. Микрофон, 000000028 12 января 2012 г. Монитор LCD, 000000012 12 января 2012 г. Итого 1 500,00 1 ] 500,00 1 3 000,00 1 ] 3 000,00 2 1 000,00 2] 1 000,00 18 500,00 3 4 500,00 3] 4 500,00 2 2 000,00 2] 2 000,00 1 12 000,00 l] 12 000,00 45 000,00 Рис. 16.574. Результат отчета (г&) Вариант "СпмсокПродаж" отчета "Продажи номенклатуры" - Демонстрационная конфигурация "Система компон... (1С:Предприягие) X Вариант "СписокПродаж" отчета "Продажи номенклатуры" Добавить *i jji X | ф Q । IjSf Вседействия* Структура отчёта gfi ПЙ * Q) Й пй й aS |7)еш Контрагент т. номенклатура 0™ Период Парам... [ffij Псяьз... Групли... Д Поля Отбор | filfl Сортир... | Целое... Допол... Текущий э леменг имеет собственную сортировку (для упорядочивания записей, выводимых в элементе) Выбрать Вседействия* ^Добааигьновыйзлеменгпорядка । Вседействия* Доступные поля Поле Направление сортировки 1«/1 = Номенклатура.Код По возрастание т = Контрагент -. = Номенклатура = Версияданнык '+' = Вид номенклатуры в щ t = Мой родитель = Наименование = Пометка удаления = Пп.ппнп.папч.пЮ | Завершить редактирование | Отмена । Вседействия* । ф Рис. 16.575. Настройка сортировки отчета в целом В таком случае упорядочивание группировки будет осуществляться по полю Номенклатура.Код, после чего - по полю Номенклатура (рис. 16.576). Профессиональная разработка в системе «1С:Предприятие 8»
Продажи товаров и услуг Параметры: Начало периода: D1.01.2012 Конец периода: 31.01.2012 Контрагент Номенклатура, Код Период______________________ ООО "Автоматика* Компьютер и(ровой, 000000013 12 лнваря2012 г. Количество Стоимость 13 января 2012 г.___________ Солутствуюаре услуги, 000000015 13 января 2012 г. Восстаноелепе данных, 000000016 ООО "Стандарт* Диапюстика компьютера, 000000007 14 января 2012 г. Ремонт компьютера, 000000014 14 января 2012 г._______________ Сопутствую аде услум, 000000015 14 января 2012 г._______________ ООО "Стиль* Монитор LCD, 000000012 12 января 2012 г. Веб-камера, 000000026____________ 12 января 2012 г. Микрофон, 000000028 12 января 2012 г. Итого 13000,00 13000,00 13000,00 9000,00 3000,00 3000,00 1000,00 1000,00 5000,00 5000,00 4 500,00 soojoo 500,00 3000,00' 3000,00 1 000,00 1 000,00 16500,00 12000,00 12000,00 4 500,00 4 500,00 2000,00 2000,00 45 000,00 Рис. 16.576. Результат отчета 2 2 3 3 Упорядочивание полей Для упорядочивания ссылочных полей система компоновки получает поля, по которым следует упорядочивать таблицу, на которую осущест- вляется ссылка, и использует вместо упорядочивания по самому полю упорядочивание по полученным полям. Например, отчет нужно упорядочить по полю Номенклатура, являющемуся ссылкой на справочник Номенклатура, который, в свою очередь, явля- ется иерархическим справочником с основным представлением в виде наименования. В таком случае система компоновки будет получать поля ЭтоГруппа, Наименование, Ссылка для значения ссылки и упорядочивать по этим полям. При этом поле Ссылка уже будет сравниваться в соответс- твии с правилами сравнения ссылок. Система компоновки данных предоставляет возможность указывать выражение упорядочивания для полей набора данных. Для этого в конс- трукторе схемы компоновки данных на закладке Наборы данных следует ввести соответствующее выражение в колонку Выражение упорядочивания для поля набора данных (рис. 16.577). Поле 1 Путь Аэтоэаголовок = Код = Наименование Код О Код Наименование О Наименование = Ссылка Ссылка О Ссылка Ограничение поля Роль ' Выражение представления 1 П... U... Г... У... 1 Выражения упорядочивания Ограничение рек... Рис. 16.577. Выражение упорядочивания для поля «Наименование» Том 2
LG п pa вон ник] разработу и ка] Если в схеме компоновки для поля указаны выражения упорядочивания, то для упорядочивания по этому полю будут использоваться результаты указанных выражений. Для примера рассмотрим отчет СписокУслуг. На закладке Сортировка указано, что данные в отчете будут упорядочиваться по полю Наимено- вание. Но вместо стандартного представления для этого поля на закладке Наборы данных задано собственное выражение, по которому и будет проводиться упорядочивание записей в отчете. Нажав кнопку выбора для поля Наименование в колонке Выражение упорядочивания, можно вызвать диалог его свойств, который содержит: Выражение - текст выражения на языке выражений системы компо- новки данных; Тип упорядочивания - по убыванию или по возрастанию; Необходимость упорядочивания - флажок для определения упорядочи- вания ссылочных полей. Если данный флажок установлен в значение истина, то для упорядочивания ссылочных полей, полученных в результате вычисления выражения, будут использоваться поля, по которым следует упорядочивать таблицу, на которую осущест- вляется ссылка. В противном случае ссылки будут упорядочиваться в соответствии с правилами сравнения ссылочных значений компо- новки данных, описанных в документации. Диалог выражений для упорядочивания поля Наименование содержит две записи. Чтобы создать выражение, нужно нажать кнопку Добавить и ввести в колонку Выражение следующий текст (листинг 16.136). Листинг 16.136. Выражение для упорядочивания поля «Наименование» | Выбор Когда Наименование = "Ремонт компьютера" Тогда 1 Иначе 2 Конец Для данного выражения указан Тип упорядочивания - по возрастанию. Для второго выражения в колонке Выражение выбрано поле Код и указан Тип упорядочивания - по убыванию. Таким образом, установлено, что первой в списке услуг должна располагаться услуга с наименованием Ремонт компьютера, а остальные записи в отчете должны располагаться по мере убывания кода услуги. В результате окно диалога имеет вид (рис. 16.578): Выражения упорядочивания X X О Выражение Тип упорядочивания Н... А Выбор Когда Наименование-"Ремонт компьютера" Тогда 1 И... по возрастанию Q I Код □ I ___________________________________________________________________________Е | DK || Отмана 11 Справка | Рис. 16.578. Установка выражения упорядочивания ®И®
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В результате выполнения отчета записи будут упорядочены в соот- ветствии с описанными выше условиями (рис. 16.579). Список услуг 1000000014 1000000016 [000000015 [000000007 (000000006 . >емснт ком|ыотеоа____ Восстановление данных Сопутствую вне услуги Диагностика компьютера Сборка вомпыотера Рис. 16.579. Результат отчета Отбор По тем же причинам, что и упорядочивание (стр. 312), отбор в системе компоновки данных желательно выполнять средствами самой системы компоновки данных, а не средствами языка запросов. В настройках компоновки данных возможно указание главного отбора и отбора группировок. Главный отбор устанавливается для всего отчета в целом. Отбор группировок устанавливается у конкретной группировки. Главный отбор отчета Главный отбор используется для фильтрации записей, выводимых в отчет. В приведенном примере в настройках отчета Продажи номенкла- туры установлен отбор по виду номенклатуры (рис. 16.580). lit) Парам,,, Гт Польз,,, Группи... Поля | Отбор | пИ Сортир,,, Услов,,, П-ff Допол.,, Текущий элемент имеет собственный отбор (для фильтрации записей, выводимых в элементе) Выбрать Все действия » ^Добавить новый элемент i Сгруппировать условия । х I Ф Q i Все действия ▼ Доступные поля Поле Вид сравнения Значение в •+ в Контрагент '* в Номенклатура = Период = Стоимость о Параметры 0 • ? Отбор в Номенклагура.Вид номенклатуры Равно Рис. 16.580. Отбор отчета в целом В результате в отчет выводятся только продажи услуг (рис. 16.581).
Продажи товаров и услуг ^тбор: Номенклатура.Вид номенклатуры Равно "Услуги^ Контрагент Номенклатура Период__________________ ООО "Автоматика" Диагностика компьютера S декабря 2011 г. 11 декабря2011 г. ооо "Атлант* Восстановление данных 15 января 2012 г. Ремонт компьютера 13 января 2012 г. Сопутствующие услуги 13 января 2012 г. ООО "Стандарт" Диагностика компьютера 14 января 2012 г. Ремонт компьютера 14 января 2012 г. Сопутствующие услуги 14 января 2012 г. Итого Количество Стоимость 1 500,00 2 1 500,00 1| 1 ooo.ooi Т| SOO.OO] 9 000 ДО 1 5 000,00 Tj 5 000,001 1 3000,00 Т| 3 000,001 2 1 000,00 2| 1 000Д01 4 500ДО 1’ 500,00' 1| 500Д01 1 3 000,00 1| зооодо] 2 1 000,00 2| 1 ооодо] 15 000 ДО Рис. 16.581. Результат отчета Особенности использования отбора при работе с несколькими наборами данных Заметим, что если в главном отборе накладывается условие на поле некоторого дочернего набора данных, то в сгенерированном макете компоновки данных дочерний набор данных будет связан с родительским набором данных с типом связи Внутренняя. Родительские наборы данных набора данных, к которому применяется условие, также будут связаны со своими родительскими наборами данных с типом связи Внутренняя. Данный тип связи означает, что запись родительского набора данных будет выводиться в результат отчета только в случае, если в дочернем наборе данных будут найдены связанные записи. Отбор группировок Отбор группировок используется для фильтрации записей, выводимых в группировке. При этом отбор распространяется на саму группировку, на вложенные группировки и не влияет на другие группировки, имеющиеся в отчете. В приведенном примере в отчет выводится группировка Склад с вложенной группировкой по полю Номенклатура в ее строках и группировка Детальные записи. Отбор установлен в режиме настроек группировки Номенклатура и будет применяться только к ней (рис. 16.582). В результате в верхней группировке отчета отсутствуют записи с конечным остатком меньше или равным единице, которые мы видим в группировке Детальные записи (рис. 16.583). Профессиональная разработка в системе «1С:Предприятие 8»
?1 Отчет ОстеткиНоменклетуры: ОсновнаяСхемаКомпоновкиДаннык □ X Наборыданнык Связи наборов даннык Вычисляемые поля Ресурсы Параметры Макеты Вложенные схемы | Настройки | Рис. 16.582. Отбор группировки «Номенклатура» ® '<S W Остаткиномен.. (1С:Предприягие) iH |4 •yj Itfl '=iil ’ail M M+ М- ~ - П X Остатки номенклатуры Вариант отчета: [Оформление | |> Сформировать 11 03 Настройка... J | Выбратьеарианг... | Вседействия-’ | (?) ____I Остатки номенклатуры Список номенклатуры на складах Номенклатура' JC клад |||рт.Ц IdiUUЦЫ!№1 Мкрофон_____________Розничный Ьб-квмара Розничный Монитор LCD__________Розничный Материнская плата Основной Кесткий диск Основной 10,000 10,000 4,000 5/300 3/300 2,000 ЗДЮ 2,000 ЗДЮ Ж <3Й000В1 8,ООС| 7,ООС| 2,ООС| 2,000| Рис. 16.583. Результат отчета Тип применения отбора группировок В отборах, применяемых к группировкам, возможно указывать тип приме- нения условия для выводимых записей. Возможны три варианта типа применения: Без иерархии - условие применяется только к неиерархическим записям. При этом иерархические записи не фильтруются. В отчет выдаются только те иерархические записи, в которых присутствуют Том 2
LG п pa вон ник] разработу и ка] неиерархические записи, удовлетворяющие условию. Итог по ресурсам в иерархических записях и общий итог по группировке учитывают условие; Иерархия - условие применяется как к неиерархическим, так и к иерархическим записям. Итог по ресурсам в иерархических записях и общий итог по группировке отбор не учитывает; Только иерархия - условие применяется только к иерархическим записям. Итог по ресурсам в иерархических записях и общий итог по группировке отбор не учитывает. ПОДРОБНЕЕ Более подробно этот вопрос рассмотрен в разделе о выводе уровней иерархии в группировке (стр. 320). Особенности отбора по полям-ресурсам При использовании отбора на поля-ресурсы следует учитывать, что если отбор на поле-ресурс был добавлен в главный отбор отчета, то этот отбор будет помещен в текст запроса, то есть фильтроваться будут именно детальные записи, которые получаются из запроса, а не итоги ресурса для группировок. Таким образом, если в отчете требуется получить только записи группи- ровки, в которых значение ресурса удовлетворяет некоторому условию, то следует добавлять отбор в группировку, а не в главный отбор. Рассмотрим эту особенность на примере отчета Продажи номенклатуры. Установим отбор для отчета в целом, чтобы значения ресурса Стоимость были больше 3000 (рис. 16.584). Рис. 16.584. Отбор отчета в целом 3US
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В результате фильтруются детальные записи, и в отчет выводятся только продажи со стоимостью больше 3000 (рис. 16.585). Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 Отбор: Стоимость Больше *3 000* Контрагент Номенклатура Период ООО "Автоматнса" Компьютер для дома 11 декабря2011 г. ООО "Система" Компьютер для офиса 9 декабря 2011 г. ООО "Стиль" Монитор LCD 6 декабря 2011 г. Итого Количество Стоимость юооо да 1 10 000,00 ] 1 10 000,00 юооода 1 юооода ] 1 юооода юооода 1 юооода I 1] юооода 30 000,СО Рис. 16.565. Результат отчета Создадим то же условие отбора для группировки Контрагент (рис. 16.586). Рис. 16.586. Отбор группировки «Контрагент» В результате в отчет попадут продажи, стоимость которых меньше 3000, но суммарная стоимость по контрагенту для которых удовлетворяет задан- ному условию (рис. 16.587).
Продажи товаров и услуг Параметры: Начало периода: 01.12.2011 Конец периода: 15.12.2011 Отбор: Стоимость Больше *3 000" контрагент количество Стоимость Номенклатура Период бЭО 'Автоматика* Диагностика компьютера 5 декабря 2011 г. 11 декабря 2011 г. 11 бооххВ 2| -1ВД6 1000,00 Т| 500,00 Компьютер для дома______ 11 декабря 20l77 f ООО "Системе* Компьютер для офисе 9 декабря 2011 г. [ ООО "Стиль* Монитор LCD 6 декабря 2011 г. | Итого 1 10 000,00 7] 10000до) 10000ДО 1 10000,00' 1] 10 000 до) 10000до 1 10 000,00 l| юооодо| 31 500,00. Рис. 16.567. Результат отчета Расположение реквизитов Реквизитами поля в системе компоновки данных называются все его подчи- ненные поля, доступные через точку. Например, для поля Номенклатура реквизитом является поле Номенклатура.Код. Дополнительные характерис- тики объектов, например Регион, Категория, также являются реквизитами поля Контрагент с точки зрения системы компоновки данных. Управлять расположением реквизитов можно в конфигураторе, в режиме настроек конструктора схемы компоновки данных на закладке Другие настройки или в режиме 1С:Предприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Дополнительные настройки. Для этого нужно установить значение параметра Расположение реквизитов (рис. 16.588). Параметры Выбрани... Отбор Сортировка Условное... Польэова... I Другие н.. Параметр О Макет оформления О Расположение итогов □ Расположение полей группировок ОР«положениег2}|гщющ^^^^^^^^— ^3 Расположение реквизитов |_) Расположение ресурсов □ Расположение общих итогов по горизонтали О Расположение общих итогов по вертикали D Тип заголовка полей________ Рис. 16.588. Настройка расположения реквизитов Существуют следующие варианты расположения реквизитов: Вместе - реквизиты располагаются вместе в одной колонке и разде- ляются запятой. В приведенном примере создано две колонки, отображающие реквизиты контрагента и номенклатуры соответс- твенно (рис. 16.589). Профессиональная разработка в системе «1С:Предприятие 8»
Контрагент Ход. Регион 'Х Номенклатура Ход. Вид номенклатур^ Количество Стоимость ООО "Автоматика” 000000001, 13 000,00 Компьютер игровой 000000013, Комплекты 1 13 000,00 ООО "Атлант" 000000005, Москва 9 000,00 Восстановление данных 000000016, Услуги 1 5 000,00 Ремонт компьютера 000000014, Услуги 1 3 000,00 Сопутствую аме услуги 000000015, Услуги 2 1 000,00 ООО "Стандарт" 000000006, Королев 4 500,00 Диагностик» компьютера 000000007, Услуги 500,00 Ремонт компьютера 000000014, Услуги 1 3 000,00 ОООХтйль"" 000000007 Сопутствуюa/te услуги _ _ Веб-камера 000000015,_Услуги_ 000000026, материалы _2] 1000,00 18500,00 3| 4 500,00' Микрофон 000000028, материалы 2 2 000,00 Итого Монитор LCD Ц0000012, материалы 1 12 000,00 45 000,00 Рис. 16.569. Вывод полей реквизитов - «Вместе» Отдельно - для каждого реквизита создается отдельная колонка. В приведенном примере для каждого реквизита контрагента и номенклатуры создано по отдельной колонке, причем при выводе группировок Отдельно колонки реквизитов контрагента располагаются после колонки Контрагент, а колонки реквизитов номенклатуры отобра- жаются после колонки Номенклатура (рис. 16.590). Контрагент Код Регион Номенклатура Код Вид номенклатуры Количество Стоимость ООО "Автоматика* 000000001 13 000,00 (омпыотер игровой 000000013 Комплекты 1| 13000,00 ООО "Атлант" 000000005 Москве 9 000,00 Эосстановлевме даншх 000000016 Услуги 11 5 000,00 ООО "Стандарт" ООО "Стиль" 000000006 000000007 Королев ’емонт компьютера Зопутствуюнхе услуги Диагностжа компьютера >емонт компьютера Сопутствующие услуги Эеб-камера Имкрофон Монитор LCD 000000014 000000015 000000007 000000014 000000015 000000026 000000028 Услуги Услуги Услуги Услуги Услуги Материалы Материалы 1 3 000,00 2| 1 000,00' 4 500,00' 1] 500,00' 1 3 000,00' 2| 1 000,00' 18 500,00' 3| 4 500,00' 2 2 000,00 1 12 000,00' Итого 45 (ИОД) Рис. 16.590. Вывод попей реквизитов - «Отдельно» Вместе с владельцем - реквизиты располагаются в колонке, отобра- жающей владельца. Данное расположение реквизитов используется по умолчанию. В приведенном примере реквизиты контрагента распо- ложены в колонке Контрагент, а реквизиты номенклатуры - в колонке Номенклатура (рис. 16.591). Контрагент, Код, Регион "\4Томенклатура, Код, Вид номенклатуры Количество Стоимость ООО "Автоматжа", 000000001, ЗОО "Атлант", 000000005, Москве Компьютер игровой, 000000013, Комплекты Восстановление детых, 000000016, Услуги 13000,00 1| 13000,00 9 000,00 1| 5000,00 Ремонт компьютера, 000000014, Услуги 1 3000,00 DOO "Стандарт", 000000006, Королев Сопутствующие услуги, 000000015, Услуги 2 1 000,00 4 500,00 Диагностике компьютера, 000000007, Услуги 1 500ДО Ремонт компьютера, 000000014, Услуги 1 3000ДО Сопутствующие услуги, 000000015, Услуги 2 1 000,00 ЗОО "Стиль", 000000007, 18500ДО Веб-камера, 000000028, Материалы 3 4 500,00 Микрофон, 000000028, Материалы i 2 2000ДО VpHHTop LCD, 000000012, Материалы I 1 12000ДО Итого 45 000,00 Рис. 16.591. Вывод полей реквизитов - «Вместе с владельцем» Том 2
LG п pa вон ник] разработу и ка] В специальной позиции - реквизиты располагаются в специальной колонке, расположенной правее всех остальных колонок. В приве- денном примере реквизиты контрагента и номенклатуры расположены в одной колонке и разделены запятой (рис. 16.592). Контрагент Номенклатура /Код. Регион ООО "Автоматика"________________________ | Компьютер игровой ООО "Атлант* |Восстановление денных | Ремонт компьютера {Сопутствую^* услуги ООО "Стандарт* |Диа гностжа компьютера Ремонт компьютера Сопутствую vie услуги ООО "Стиль" I Веб-камера Мжрофон Монитор LCD Итого Код, Вид номенклатуры ОООООООО1,______________ 1000000013, Комплекты ~ 000000005, Москва________ 1000000018, Услуги ~ 000000014, Услуги {000000015, Услуги 000000006, Королев 1000000007, Услуги 1000000014, Услуги {000000015, Услуги 000000007, {000000026, Материалы 000000026, Материалы >000000012, Материалы J Количество Стоимость 13 000,00 13 000,00 9 000,00 5 000,00 3 000,00 1 000,00 4 500,00 500,00 3 000,00 1 000,00 16 500,00 4 500,00 2 000,00 12 000,00 45 000,СО Рис. 16.592. Вывод полей реквизитов - «В специельной позиции» Настройка группировок Управлять настройкой группировок можно в конфигураторе, в режиме настроек конструктора схемы компоновки данных на закладке Другие настройки или в режиме 1С:Предприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Дополнительные настройки. Расположение полей группировок Для управления расположением полей группировок нужно установить значение параметра Расположение полей группировок (рис. 16.593). Параметры Выбрани... Отбор Сортировка Условное... Польэова... I Другие н.. Рис. 16.593. Настройка расположения попей группировок
Глава116пСложнй1еТаналитическиеТоъчет^1 Существуют следующие варианты расположения полей группировок: Вместе - поля группировки располагаются друг под другом. Данное расположение группировок используется по умолчанию (рис. 16.594). Контрагент Номенклатура Диагностике компьютера Компьютер для дома ЮО “Система*___________ Компьютер для офиса ЮО “Стиль*_____________ I ХМонитор LCD [Итого Количество Стоимость 11 500,00 2 1 SOO.OOi 1 юооо.оо] 10000,00 1 1 о ооодо] 10000,00 1 10 000,001 31 500,00 Рис. 16.594. Вывод полей группировок - «Вместе» Отдельно - каждая группировка располагается в отдельной области отчета слева направо. Выводимые поля группировки также выво- дятся во вложенных группировках. В приведенном примере поля группировки по контрагенту расположены в крайней левой колонке, а поля группировки по номенклатуре - справа от колонки контрагента, при этом для группировки по номенклатуре выводятся поля группи- ровки по контрагенту (рис. 16.595). Рис. 16.595. Вывод попей группировок - «Отдельно» Отдельно и только в итогах - каждая группировка располагается в отдельной области отчета слева направо. Выводимые поля выводятся только в данной группировке. В приведенном примере поля группи- ровки по контрагенту расположены в крайней левой колонке, а поля группировки по номенклатуре - справа от колонки контрагента, при этом для группировки по номенклатуре не выводятся поля группи- ровки по контрагенту (рис. 16.596). [Контрагент Номенклатура Количество |00О “Автоматика* Диагностика компьютера I компьютер ала дома I | ООО “Система* Компьютер для офиса | | ООО “Стиль" Монитор LCD | | Итого Стоимость 11 500,00 1 500,сю| юооо]оо| 10000,00 юооо.оо] 10000,00 10000,00] 31 500,00 Рис. 16.596. Вывод попей группировок - «Отдельно и только в итогех» Если параметр Расположение полей группировок настройки системы компо- новки данных установлен в значение Отдельно и только в итогах, то при создании макета группировок объединение ячеек макета группировки выполняется только в пределах колонок соответствующей группировки.
Заголовки группировок Для каждой группировки можно указать собственный заголовок, который будет выводиться перед выводом ее значений. Для этого нужно перейти в режим настроек отдельной группировки и на закладке Другие настройки/ Дополнительные настройки ввести нужный текст в строку Заголовок. В приведенном примере для группировок Контрагент и Номенклатура указаны собственные заголовки (рис. 16.597, 16.598). Рис. 16.597. Настройка заголовка группировки «Контрагент» Рис. 16.598. Настройка заголовка группировки «Номенклатура» Профессиональная разработка в системе «1С:Предприятие 8»
В результате перед каждой группировкой выводится ее заголовок. Если задан общий заголовок отчета, то он выводится вверху над заго- ловком родительской группировки (рис. 16.599). (Продажи контрагентам) Контрагент Количество Стоимость Номенклатура___________________________ ООО ‘Автоматжа* 11 500,00 Продажи номенклатуры^ Диаоюстжа компьютера I 2 1 500ДО Компьютер для дома | 1 10 000,00 ООО "Система* _____10 000,00 Продажи номенклатуры Э_________________ Компьютер для офиса | 1 10 000,00 ООО “Стиль* ________10 000,00 Продажи номенклатуры^__________________ МоииторГСО | 1 10000,00 итого 31 500да рис. 16.599. Вывод заголовков группировок Ограничение количества записей и процента выводимых записей в группировке В режиме настройки отдельной группировки на закладке Другие настройки/ Дополнительные настройки можно задать ограничение количества выво- димых записей для группировки и вывод определенного процента от количества записей в группировке. Это нужно, например, для вывода определенного количества самых дешевых товаров и т. п. При этом если заданы оба этих параметра, то в отчет выводится наименьшее количество записей, рассчитанное по каждому из ограничений (рис. 16.600). Рис. 16.600. Настройка ограничания количества выводимых записей в группировке Том 2
,C п pa вон ник] раз работу и ка1 Вывод системных полей и % в группировке В режиме настройки отдельной группировки, а также на уровне глобаль- ного отчета можно добавить в отчет поля, сгенерированные платформой. Для вывода системных полей, таких как № п/п, уровень и т. п., на закладке Выбранные поля в списке доступных полей нужно раскрыть группу Системные поля и перетащить в список полей нужные поля. Чтобы доба- вить в отчет поля, автоматически рассчитанные платформой для числовых полей-ресурсов, например Процент общий или Процент в группе, нужно раскрыть поле ресурса в списке доступных полей и перетащить в список полей нужные поля (рис. 16.601). Й Отчет ОтчетПоСистомнымБлокам: ОсновнаяСхамаКомпоновкиДанных Рис. 16.601. Добавление в отчет системных полей и % в группировке В результате мы получим (рис. 16.602): Склад Ms Системный блок п/п____________________ Основной Компьютер для дома _______Компьютер для офиса Итого Количество Количество Конечный Стоимость Стоимость Прибыль .% Прихад Расхад остаток Приход Расход обций 17 500,00 20 000,0В 2 500,00 /*Х 0000,00’ 10000,00' 1000,00’ ( 40,001 6500,00 1 0 000,00' 1 500,00 I 6O.QoJ 17 500,00 20 BOO ,0В 2 500,00 Рис. 16.602. Результат отчета Заметим, что в первой колонке выводятся номера по порядку «насквозь». Для вывода номера по порядку в каждой группировке нужно выбрать из списка системных полей поле Номер по порядку в группе. В последней колонке выводится процент, который составляет прибыль в данной строке от общего итога. Для вывода процента прибыли от текущей группировки нужно использовать поле Процент в группе.
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Расположение полей в макетах группировок В режиме настройки отдельной группировки на закладке Другие настройки/ Дополнительные настройки можно задать Тип макета полей группировки. Данное свойство имеет смысл только для группировок отчета и не исполь- зуется в группировках таблицы или диаграммы (рис. 16.603). Рис. 16.603. Настройка типа макета отдельной группировки Существуют следующие типы макетов: Горизонтально - поля располагаются слева направо, поля ресурсов располагаются правее всех остальных полей. Это стандартное распо- ложение полей в группировке (см. рис. 16.604); Вертикально - поля располагаются сверху вниз в две колонки. В левой колонке располагаются имена выводимых полей, а в правой - значения. Поля ресурсов располагаются ниже всех остальных полей (см. рис. 16.604); Авто - расположение будет определяться автоматически. В приведенном примере для группировки Контрагент задан Тип макета - Вертикально, а для группировки Номенклатура - Горизонтально (рис. 16.604).
(Контрагент, Код I Количество ^Стоимость Нонениппура ООО Автоматика", 000000001 11 500.00 Количество Стоимость I г 1!оодат, 1 надо Втрагенг, Код ичество имость ООО "Система*. 0000D80Q4 10 000,00 ООО "Стиль*. 000000007 10 000.00 31 500.00 Тип наката- Вертикально Тип маната» Горизонтально Номенклатура Количество Стоимость | Коаыотер дл* Инса 1 1050000 /контрагент. Код Количество ^Стоимость Номенклатура Количество Стоимость | МмтрЮ > >0500,00 /Итого Количество «Стоимость Рис. 16.604. Результат отчета с разными макетами группировок Возможность отбора уровней иерархии в группировке Система компоновки данных позволяет выводить в отчет записи заданного уровня иерархии в группировке. Для этого в режиме настройки отдельной группировки нужно задать отбор на уровень иерархии и указать в свойстве Применение, к каким записям будет применяться отбор. Возможны три варианта типа применения: Без иерархии - условие применяется только к неиерархическим записям. При этом иерархические записи не фильтруются. В отчет выдаются только те иерархические записи, в которых присутствуют неиерархические записи, удовлетворяющие условию; Иерархия - условие применяется как к неиерархическим, так и к иерар- хическим записям; Только иерархия - условие применяется только к иерархическим записям. Для примера рассмотрим отчет, в котором выводится список номенкла- туры вместе с уровнями иерархии (Уровень и Уровень в группе), которые в данном отчете идентичны (рис. 16.605). Мы видим, что группа товаров Электротовары имеет первый уровень иерархии, а записи в ней - второй уровень. Эта группа содержит вложенные группы Пылесосы, Телевизоры, Чайники второго уровня, записи в которых имеют третий уровень. Изменим вариант отчета. В режиме настроек группировки Товар(Иерархия) создадим отбор на системное поле Уровень. Зададим Вид сравнения - Равно, Правое значение - 1, Применение - Только иерархия (рис. 16.606). Профессиональная разработка в системе «1С:Предприятие 8»
Товар Уровень Уровень Итого в группе Количество Обувь Босоножки Ботинки_________ Валенки______ Кроссовки Пинетки______ Сапом________ Слан»!_______ Тапочки______ Туфли Продукты________ Motypr_______ Колбаса______ масло________ молоко_______ Ряженка______ Сметана______ Торт_________ Хлеб_________ Услуги_________ Доставка Элетротоееры Пылесосы VeKo876N Вихрь______ Тайфун-12 Телевизоры Sony К3456Р Чайники______ ВоссЫ 234 Bosch'! 5 VeKo67NE [у VekoNTO2 [Итого 2 1 2 зг э 2 2 Остаток 71 ДО 11Д0 5,00 22 ДО -2,00 4 ДО 15,00 1Д0 12,00 ЗДО 854ДО 430,00 120 ДО 11ЭД0 579,00 305ДО -918,00 205ДО 20 ДО 2 ДО 2Д0| 171 ДО 16Д0 16,00 1,00 1,00 100 до 100Д0| 55 ДО 7 ДО 3,00 52 ДО 1,00 1 09В,СО Рис. 16.605. Результат отчета с разными уровнями иерархии Рис. 16.606. Создание отбора в группировке по уровню иерархии В результате в отчет в группе Электротовары выводятся записи только первого уровня, причем это условие будет применяться только к записям, имеющим иерархию (являющимся родительскими), рис. 16.607. Том 2
LG п pa вон ник] разработу и ка] Товар Уровень Уровень в группе Отбор: Уровень Равно "Г Итого Количество Остаток Обувь____________________1_ Босоножки_____________2 Ботинки_______________2 Валенки_______________2 Кроссовки_____________2 Пинетки_______________2 Сапоги________________2 Сланцы________________2 Тапочки_______________2 Туфли_________________2 Продукты 1 Колбаса Масло Молоко Ряженка Сметена Торт Хлеб Услум §летротоварь7 Итого Д__________71,00 _2_________11.00 _2__________5JX) _2_________22,00 _2_________:2!00 _2__________4JX) _2_________15,00 _2___________100 _2_________12,00 _2__________3JX) Д_________654,00 2___________2__________430ДО 2___________2_________120,00 2___________2_________113,00 2___________2_________579,00 2___________2__________305ДО 2___________2________-916,00 2 2 205,00 2 2 20,00 < 1 2.00 2 . 2 2.00] 1 fl) 171 ДО 1 096,00 Рис. 16.607. Результат отчета Изменим условие отбора, чтобы уровень был меньше трех и это условие применялось только к иерархическим записям. В результате мы увидим исходную таблицу, как будто никакого отбора не было (см. рис. 16.605), т. к. в ней изначально нет иерархических записей больше второго уровня (рис. 16.608). Пара... iff] Польз... fig Групп... f]g Поля | [М Отбор | flfj] Сорти... Цепов... Допол... @ Текущий элемент имеет собствожый отбор (для Фильтрации записей, выводимых в элементе) Выбрать В се действия- ^Добавитьисеыйэпеменг । Сгруппировать условия i I ф Вседействия- Доступные поля Поле Вид сравнения Значение Применение f = т Отбор '+ = Товар т J Когмчество Остаток +' □ Системные поля £ сэ Параметры 0 = Уровень Меньше 3 ... Рис. 16.608. Создание отбора в группировке по уровню иерархии Теперь изменим условие отбора, чтобы уровень был меньше трех и это условие применялось к иерархии вообще (Применение - После группировки или для иерархии), рис. 16.609. Пара... iff] Польз... fig Групп... Qg Поля | гМ Отбор | Сорги... Цепов... Qff Допол... 0 Текущий элемент имеет собственный отбор (для Фильтрации записей, выводимых в элементе) Выбрать В оэ действия’ <££) Добавить новыйэлеменг । Сгруппировать условия i X I Ф В се действия- Доступные поля * = Товар 0 Поле - Отбор в Уровень Вид сравнения Меньше Значение Применение 3 ... * J * О t сэ Количество Остаток Системные поля Параметры Рис. 16.609. Создание отбора в группировке по уровню иерархии
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 В результате в отчете мы не увидим записей третьего уровня из группы Электротовары (рис. 16.610). Товар Уровень Уровень в группе Отбор: Уровень Меньше *3*_________ Обувь i 1 Босоножки_____________2_________2 Ботинки_______________2_________2 Валенки 2 2 Кроссовки 2 2 Пинетки 2 2 Сапом 2 2 Сланцы 2. 2 Тапочки 2 2 Туфли 2 2 Продукты 1 1 Йогурт 2 2 Колбаса 2 2 Итого Количество Остаток Масло______ Молоко Ряженка Сметена Торт_______ Хлеб Услум________ Доставка Элетротоверы >пылесось^ ( Телевизоры ХЦайники Итого 71 ДО 11,00 5 ДО 22,00 -2,00 4 ДО 15,00 1Д0 12,00 ЗДО 854ДО 430ДО 120 ДО 2__________2|________113,00 2__________2_________57В,00 2__________2__________305ДО 2__________2________-918,00 2__________2_________205,00 2__________2__________20,00 J___________£___________2Д0 2__________2 2,СЮ] 1 1 171 ДО i 1бдо 2 2 ) 100,00 2 2.S 55,00 1 09ВДО Рис. 16.610. Результат отчета Теперь зададим условие, чтобы уровень был равен единице и это условие применялось к иерархии вообще (рис. 16.611). ЙЙ Пара... Польз.. gfl Грцпп... ц! Поля | гМ Отбор | Сорти... gfi Ослов... Qg Допол . 0 Текущий элемент имеет собственный отбор (для фильтрации записей, еывопихък вэлеменге) Выбрать Вседейстеия-' Добавить новый э леменг । Сгруппировать условия i X i ф Все действия Доступные поля Поле Виа сравнения Значение Применение • :* = QgRj • :*' в Товар • :* J Количество Остаток О Системше поля * □ Параметры - Отбор 0 = Уровень Равно После группировки... Рис. 16.611. Создание отбора в группировке по уровню иерархии В результате мы увидим в отчете только иерархические записи первого уровня (рис. 16.612). Товар Уровень Уровень в группе Отбор: Уровень Равно "Г Обувь 1 Продукты 1 Услум 1 Элетротоверы 1 I Итого Итого Количество Остаток 71,00 854ДО 2 ДО 171 ДО 1 о9в,оо Рис. 16.612. Результат отчета
Г руппировкипериоды Часто в отчетах требуется вывести данные за период с промежуточными итогами по дням, месяцам, полугодиям и т. п. Для этого нужно сгруппиро- вать данные по этим периодам. При разработке отчета в схеме компоновки данных нужно добавить в набор доступных полей поля-периоды и создать группировки по этим полям в настройках отчета. Затем вывести в отчет поля ресурсов отчета, чтобы для каждой группировки были посчитаны промежуточные итоги. Для примера рассмотрим Отчет по продажам. Данные в нем сгруппиро- ваны по периодам Месяц и День. Чтобы добавить поля-периоды в набор данных, нужно задать пери- одичность виртуальной таблицы, из которой извлекаются данные. В данном случае это таблица Продажи.Обороты. Откроем конструктор запроса и вызовем диалог параметров виртуальной таблицы. Для этого в списке таблицы нужно нажать кнопку Параметры виртуальной таблицы (рис. 16.613). Рис. 16.613. Выбор периодичности виртуальной таблицы В открывшемся диалоге можно выбрать различные значения параметра Периодичность. В зависимости от выбранной периодичности виртуальной таблицы становятся доступными различные поля-периоды. В данном отчете выбрана периодичность Авто. Это наиболее универсальный вариант. Раскрыв список полей таблицы, мы можем перенести в список полей запроса следующие поля (рис. 16.614). Профессиональная разработка в системе «1С:Предприятие 8»
Таблицы в fflBSUMMI X в НомерСтроки "X •+ в Регистратор = ПериодСекунда в ПериодМинуга = ПериодЧвс в ПериодДень в ПериодНеделя в ПериадДекада = ПериодМесяц в ПериадКеартал в ПериадПолугадие у д ПериадГсц у •*Г^?омёнклагура •+' L Контрагент <1 КоличествоОборот <1 СтоимостьОборот Рис. 16.614. Доступные поля-периоды виртуальной таблицы с периодичностью «Авто» В отчете выбраны поля-периоды ПериодДень и ПериодМесяц. При вклю- ченном свойстве Автозаполнение (стр. 278) платформа заполнит в роли полей свойство Период. На основании этой информации будут рассчиты- ваться итоги по этим полям. Затем в структуру отчета добавляются группировки по полям-пери- одам. В группировку Контрагент добавляется группировка по полю ПериодМесяц, и в нее вкладывается группировка ПериодДень. Группировка ПериодДень также добавляется в точки диаграммы, но ее для наглядности лучше отключить. В отчет выводится ресурс Стоимость для вывода итога по группировкам (рис. 16.615). Отчет ОтчетПоПродажам: ОсновнавСхомаКомпоновкиДанных _ □ X Рис. 16.615. Добавление группировок периодов в структуру отчета В результате данные в отчете сгруппированы по дням и месяцам, и по каждому периоду выводится промежуточный итог (рис. 16.616). Том 2
Рис. 16.616. Результат отчета Заметим, что в отчетах можно выводить группировки-периоды, не получая при этом данных из родительских группировок. Например, группи- ровку Регистратор можно использовать без ее родительской группировки Секунда, так как система компоновки данных сама подставит при компо- новке нужные родительские поля-периоды, а внешне в отчете это никак не отразится. Исключение составляют отчеты, в которых получаются остатки по периодам. В этих случаях для подсчета правильных остатков при получении поля-периода в запросе должно присутствовать его роди- тельское поле-период. Группировки по ресурсам Система компоновки данных позволяет не только выводить поля ресурсов в ячейках отчета, но и группировать по ним данные. В приведенном примере в выбранных полях отчета указаны ресурсы Количество и Стои- мость, при этом данные в строках таблицы сгруппированы по ресурсу Количество и полю СБ (рис. 16.617). Рис. 16.617. Отчет с группировкой по полю-ресурсу
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты Можно также указать выражение для расчета ресурса на языке выражений системы компоновки данных и затем сгруппировать по этому ресурсу данные в отчете. Например, в отчете Расчет показателей продаж (стр. 219) определен ресурс на основе вычисляемого поля ОбъемПродаж. Значение ресурса рассчитывается следующим образом (листинг 16.137). Листинг 16.137. Выражение для расчета ресурса на основе вычисляемого поля «ОбъемПродаж» Выбор Когда Сумма(Стоимость) <= 3000 Тогда "Малый" Иначе Выбор Когда Сумма(Стоимость) >= 10000 Тогда "Большой" Иначе "Средний” Конец Конец Вариант отчета ОбъемПродаж имеет следующую структуру. Отчет содержит составную группировку по полям ОбъемПродаж и Номенкла- тура с вложенной группировкой Номенклатура. В выбранных полях отчета указаны поля Стоимость и ОбъемПродаж (рис. 16.618). Т»1 Отчет РасчетПоказетелейПродаж: ОсновнаяСхемаКомпоновкиДанных _ □ X Рис. 16.616. Структура отчета В результате выполнения отчета в колонке Объем продаж выво- дится значение выражения, заданного для ресурса в листинге 16.137. Кроме того, записи отчета группируются по значению ресурса Объем продаж - сначала выводятся записи с большим (Сумма(Стоимость) >= 10000)обьемомпродаж,затемзаписисмалым(Сумма(Стоимость) <= 3000) объемом продаж и затем записи со средним (3000 < Сумма(Стоимость) < 10000) объемом продаж (рис. 16.619).
@ Р... (1С:П.|Й1 L4 1^1 S з'11 М М* М- - - □ X Расчет показателей продаж Варианготчета: [Объем продаж | | Выбрать вариант... | | р» Сформировать |i [JS Настройка... Вов действия* i ф Объем продаж Номенклатура___________ Вольвой________________ Компьютер для дома Компьютер для офиса Компьютер ифовой Монитор LCD__________ Малый__________________ Диагностика компьютера Микрофон_____________ Солутстеуюме услуги Средний________________ Веб-камера___________ Восстановление данных Ремонт компьютера Итого (Стоимость Объем продаж 55 000JXI Вольвой 10000,00 10000,00 13000,00 22000,00 Вольвой Вольвой Вольвой Вольвой 6000,00 Средний 2 000,001Малый 2000,00 Малый 2000,00|Малый 15 500JXI Вольвой 4 500,00 [Средний I 5000,00 [Средний 6 000 ДО (средний | 76 500,00 Большой Рис. 16.619. Результат отчета Особенности группировки детальных записей Напомним, что если у группировки настроек отчета отсутствуют поля группировки, то такая группировка называется Детальные записи. Для создания такой группировки достаточно при добавлении группи- ровки в диалоге выбора поля группировки нажать кнопку ОК, не выбирая поле (рис. 16.620). •т. Q) Отчет QQS99SS39K3SI Поля группировки X 6’ X -и- О Поле Тип группировки 0 Беа | ОК || Отмана || Справка | Рис. 16.620. Группировка отчета «Детальные записи» Если выбранные поля детальных записей содержат поля - не ресурсы, то такая группировка будет выводиться в виде простого линейного отчета. Например, если выбранные поля детальных записей содержат поля Номен- клатура, Склад, то в отчет будут выводиться строки с полями Номенклатура и Склад. Если выбранные поля детальных записей содержат поля-ресурсы, например поле Остаток, то по группировке для этих полей будут выда- ваться итоговые данные. Однако если данные получаются при помощи запроса, в котором исполь- зуется виртуальная таблица, то результирующий состав строк набора данных будет зависеть от использованных в запросе полей, так как вирту- альная таблица автоматически группирует данные по использованным измерениям. Например, при получении остатков из виртуальной таблицы Профессиональная разработка в системе «1С:Предприятие 8»
Остатки регистра накопления с двумя измерениями Номенклатура и Склад состав строк будет зависеть от используемых в отчете полей. Так, если в детальных записях выводятся поля Номенклатура и Остаток и в настройках отчета не задействованы другие поля-измерения, то детальные записи будут содержать данные по остаткам номенклатуры (рис. 16.621). Номенклатура Количество _______________Остаток Монитор LCD____2,000 Материнская плата_2,000 Память 2,000 Веб-камера 7,000 Микрофон 0,000 итого 21 да Рис. 16.621. Результат отчета Если же где-либо в настройках задействовано другое измерение, например Склад, или же в роли этого поля установлено свойство Обязательное, то детальные записи будут выводиться с учетом склада. Таким образом, детальные записи могут содержать данные по номенклатуре на различных складах (рис. 16.622). Номенклатура Количество _______________Остаток Монитор LCD 1,000 Монитор LCD 1Д00 Веб-камера 3,000 Микрофон 5,000 Веб-камера 4,000 Микрофон 3,000 Материнская плата 2,000 Память 2,000 итого 21 да Рис. 16.622. Результат отчета Поэтому для того, чтобы получить в группировке значения ресурсов для конкретных измерений, следует явно указывать, по каким полям нужно группировать данные в группировке. В данном примере следует группировать записи по полю Номенклатура. Если в выбранных полях детальных записей используются поля - не ресурсы из нескольких наборов данных, то в результат будут выдаваться данные для последнего в цепочке связей набора данных, задействован- ного в группировке. Например, в схеме компоновки данных имеются наборы данных Продажи и Остатки, при этом указано, что набор данных Продажи является родительским по отношению к набору данных Остатки. Если в группировке будут использоваться только поля набора данных Продажи, то детальные записи будут получаться для этого набора данных. Если же в группировке задействованы поля набора данных Остатки, то будут выдаваться записи набора данных Остатки, связанные с запи- сями набора данных Продажи. Использование в детальных записях полей из нескольких не связанных другом с другом наборов данных не допускается. Если выбранные поля детальных записей содержат только поля-ресурсы, то такая группировка будет рассматриваться как общий итог, т. е. содер- жать только одну запись, в которой будет выдаваться итог по выбранным Том 2
LG п pa вон ник] разработу и ка] ресурсам. Такую возможность можно использовать для того, чтобы выдать общий итог вне некоторой группировки (рис. 16.623). [Количество Остаток идо Рис. 16.623. Результат отчета Если выбранные поля детальных записей не содержат ни одного поля, то группировка в отчет не выводится. Такую группировку можно исполь- зовать для визуальной организации структуры настроек. Несмотря на то, что сама группировка в отчет не выводится, ее отбор будет применяться. При этом все вложенные в такую группировку элементы структуры будут содержать только данные с примененным отбором. Данную возможность можно использовать для того, чтобы вывести несколько элементов структуры с одним отбором в ситуации, когда применять отбор в главном отборе нежелательно. Управление выводом ресурсов в итогах таблицы Иногда возникает потребность вывести в итоге по строкам/колонкам таблицы только некоторые ресурсы. Например, требуется вывести в колонках таблицы контрагентов с указанием суммы оборота и количества продаж номенклатуры, а в строках таблицы нужно вывести номенклатуру с итогами только по сумме оборота. Если просто добавить в настройки таблицу с группировками в строках по полю Номенклатура, а в колонках - по полю Контрагент и указать, что нужно выводить в отчет ресурсы Стоимость и Количество, то результат будет следующим (рис. 16.624): Номенклатура ООО "Автоматика* ООО 'Система* ООО "Стиль* Итого Количество Стоимость Количество Стоимость Количество Стоимость Количество Стоимость Диагностика компьютера Компьютер для дома Компьютер для офиса Монитор LCD Итого 2,00 1 500,00 1,00 10000,00 ЗДО 11 500,00 Ц00 1 0 000,00 1ДО 10 ОООДО 10000,00 1ДО 10 ОООДО Рис. 16.624. Результат отчета Для того чтобы итог по строке содержал только определенный ресурс, можно воспользоваться детальными записями, в которых выводятся только ресурсы. Для этого добавим в колонки таблицы группировку без полей группировки (рис. 16.625). т Ц) Отчет т @0И Таблица т- Строки 0™ Номенклатура Колонки 0™ Контрагент 0™ Рис. 16.625. Структура отчета
I ГлаваИ 6nG лояачыеТанагтитйческйеТотяеты В результате в правой части таблицы появится еще один итог по строке, в котором выводятся все ресурсы (рис. 16.626). Номенклатуре Дмтостже комгыотера Комъютер для дома Комъютер для офиса Монитор LCD Итого ООО "Автоматике" ООО "Системе" ООО "Стиль" Итого Количество Стоимость Количество Стоимость Количество Стоимость Количество 2ДО 1 500ДО 2ДО ' 1Д0 10 500ДО 1ДО 1ДО 10 000 ДО 1ДО 1.00 ЮОООДО 1ДО 3)10 11500.00 1ДО 10000,00 1ДО 10000,00 5ДО Стоимость Количество Стоимость 1500ДО 2ДО 1 500ДО ЮОООДО 1ДО ЮОООДО ЮОООДО 1ДО юооодо ЮОООДО 1ДО юооодо 31 500ДО 5 ДО 31 500.00 Рис. 16.626. Результат отчета Нам требуется, чтобы в итоге по строке выводилось только поле Стоимость, поэтому перейдем в режим настройки группировки Детальные записи и на закладке Выбранные поля добавим поле Стоимость и удалим или уберем признак использования у автополя, которое содержит все ресурсы отчета (рис. 16.627). Наборыданных Связи набора.. Вычисляемые... Ресурсы Параметры Макеты Вложенные сх... | Настройки | Рис. 16.627. Выбранные поля детальных записей В результате отчет примет следующий вид (рис. 16.628): Номенклатура ООО "Автоматика* ООО "Система* ООО'Стиль* Итоге Количество Стоимость Количество Стоимость Количество Стоимость Количество Стоимость Стоимость юооодо 1,00 ЮОООДО 1,00 Г ЮОООДО 1,00 ЮОООДО _2,00 1ДО 1ДО 1ДО[ 5 ДО 1 500 ДО ЮОООДО ЮОООДО ЮОООДО 31 500ДО 1 500 ДО ЮОООДО ЮОООДО ЮОООДО 31 500ДО Рис. 16.626. Результат отчета В заключение для того, чтобы итог по строке не выдавался два раза, уберем вывод общего итога для группировки Контрагент. Для этого установим параметр вывода Расположение общих итогов в значение Нет (рис. 16.629). Э2<°)
Наборы данных Связи наборе... Вычисляемые... Ресурсы Параметры Макеты Вложенше ск„ | Настройки | Рис. 16.629. Вывод общих итогов для группировки в колонках таблицы В результате отчет примет требуемый вид (рис. 16.630). Номенклатура Диагностика компьютера Компьютер для дома Компьютер для офиса Монитор LCD Итого ООО ’Автоматика" ООО ‘Система’ Количество Стоимость Количество Стоимость ООО ’Стиль’ Количество Стоимость 2 ДО 1 до 1 500,00 юооо до 1JOO 10 000до ЗДО 11 500,00 1 ДО 10 ОООДО 1 до| ю ооодо 1ДО 10 ОООДО Стоимость 1 500,00 10 000,00 10 000,00 10 000,00 31 500ДО Рис. 16.630. Результат отчета Вывод дополнительной информации в отчете Система компоновки данных позволяет выводить дополнительную инфор- мацию в отчет после всех полей. Для этого используется группировка Детальные записи, для которой параметр Вариант использования группировки установлен в значение Дополнительная информация. В качестве дополни- тельной информации можно использовать все поля, доступные в данной группировке. Для примера создадим вариант Дополнительная информация отчета Отчет по продажам, в котором данные о продажах выводятся в таблицу, в строках которой данные группируются по контрагентам, а в колонках - по пери- одам продаж. Допустим, требуется вывести в строках таблицы после всех полей некоторую дополнительную информацию о контрагентах, например, их характеристики. Для этого добавим в колонки таблицы группировку без полей груп- пировки, перейдем в режим настроек группировки Детальные записи и установим параметр Вариант использования группировки в значение Дополнительная информация (рис. 16.631). Профессиональная разработка в системе «1С:Предприятие 8»
Й Отчет ОтчетПоПродажам: ОсновнаяСхемаКомпоновкиДаниых _ □ X Рис. 16.631. Структура отчета Сформируем отчет. В режиме изменения варианта отчета Дополнительная информация для группировки Дополнительная информация на закладке Поля перенесем характеристики контрагентов Категория и Регион (рис. 16.632). Рис. 16.632. Изменениа варианта отчета В результате отчет примет следующий вид (рис. 16.633). Том 2
G п pa вон ник] раз р а б.отл и ка 1 Контрагент Декабрь,2011 Январь.2012 Итого Контрагоиг.Котегория Конгрегонт.Региои (000000001) ООО "Автоматика" Количество ЭД) Стоимость 11 500Д) Количество 1Д) Стоимость 1эооод) Количество 4Д) Стоимость 24 500Д) (000000005) ООО‘Атлант" 4Д) 9 000Д) 4Д) 9001Д) ПхтомныЙ партнер Москва (000000004) ООО "Система" 1Д) 10 000Д) 1Д) 10009Д) (000000006) ООО‘Стандарт' 4Д) 4500Д) 4Д) 4500Д) Зарубежный партнер Королев (000000007) ООО “Стиль* 1Д) 10000Д) 6Д) 16 500Д) 7Д) 28 500Д) Итого 5 ДО 31 500,00 15.00 45 000 ДО 20 ДО 76 500ДО Рис. 16.633. Результат отчета Настройка полей группировки в пользовательских настройках При разработке отчета можно сделать отчет максимально универсальным, чтобы позволить пользователю в режиме 1С:Предприятие, не обращаясь к полным настройкам отчета (не выполняя Все действияп Изменить вариант...), самостоятельно настраивать, каким образом группировать данные в отчете. Необходимость настройки группировки пользователем в отчете можно указать как в отчете в целом, так и у группировки (как в простой группи- ровке, так и в группировке таблицы и диаграммы). Для этого в конструкторе схемы компоновки данных на закладке Настройки или в режиме изменения варианта отчета необходимо выделить нужный элемент структуры отчета и нажать кнопку Свойства элемента пользо- вательских настроек, расположенную вверху, в командной панели окна настроек (рис. 16.634). В появившемся окне нужно включить в состав пользовательских настроек элемент Группировки. В режиме 1С:Предприятие создадим вариант отчета Настройка группировок для отчета Продажи номенклатуры. Отчет имеет структуру, показанную на рисунке 16.634. Предоставим пользователю возможность группировать данные на уровне отчета в целом. @ Вариант "Настройка группировок" отчета "Продажи номенклатуры" Демонстрационная конФигураии... (ЮПредприятие) X Вариант "Настройка группировок" отчета "Продажи номенклатуры" Добавить ’ । ftl I X । О' О Струтура отчета 0™ Контрагент 3™ Номенклатура Все действия ’ Q8 Й СЙ jfl US 08 lift @ Состав пользовательских настроек отчета-Демонстрационная конФнгураци... П^Предприятие) X Цр Пара.. Текущийэле» Выбрать Доступные геми Номенк Период Колжет Сгоимо Систмеые поля Параметр» Состав пользовательских настроек отчета Представлетые: Режим редактирования J | Быстрый доступ___________ "| [Обычный J [Быстрыйдоступ_____________ j [Обычный | [Быстрыйдоступ । ОК | Отмена ф О Выбранные поля □ Отбор □ Порядок □ Условное овормление О^Грулпфови^^^^^ О | Завершить редактирование | Отмена i Все действия’ i v?) Рис. 16.634. Изменение варианта отчета
I ГлаваИ 6nG лояаТыеТанагтйтйческйеТотяеты Перед формированием отчета пользователь может поменять местами поля группировок, изменить или добавить новое поле группировки (рис. 16.635). @ Продажи номенклатуры-Демонстрационная конфиг... (1С:Преоприягие) jgj| ijg? Lq Itti 'ш! ail M M+ M- ~ - □ X Продажи номенклатуры Вариант отчета | Настройка груетировок| I Выбреть вариант... | | р» Сформировать 11 03 Настройка... Вседействия ’ । (?) Рис. 16.635. Редактирование группировок отчета В результате будет получен другой отчет, основанный на тех же данных, но представляющий данные по-иному (рис. 16.636). @ ▼; \j П... (1С:Предприя|й| Li V5 151 'ш! ail М М+ М- - - □ X Продажи номенклатуры Вариант отчета [Настройка группировок| | Выбрать вариант... I | Сформировать 11 ИЗ Настройка... Вседействия । (?) (’ нА ^/ттировк^^^^^ диагностика компьютера hi ООО "Автоматике" Т 5 декабря 2011 г. [_ 11 декабря2011 г. Компьютер для дома hi ООО "Автоматика" "[ 11 декабря2011 г. Компьютер для офиса hi ООО "Система"________ "[ 9 декабря 2011 г. Монитор LCD hi ООО "Стиль"_____________ "[ 6 декабря 2011 г. Итого Параметры: Начало периода: 01.12.2011 Конец периода: 15.12.2011 номенклатура "\ Количество Стоимость Контрагент ] Лериод J___________________________ 2 1 500,00 2 1 500,00 ll 1 000,00 7] 500,00 1 10 ооодо 1 10 ооодо 1, 10 ооодо 1 10 ооодо 1 10 ооодо 1| ю ооодо 1 10 ооодо 1 10 ооодо 1| ю ооодо 31 503,СО Рис. 16.636. Изменение варианта отчета
Для того чтобы предоставить пользователю возможность представлять данные в отчете в виде таблицы со свободной структурой, как это сделано, например, в отчете Работа мастеров (стр. 168), нужно выделить элемент структуры отчета Таблица и, нажав кнопку Свойства элемента пользова- тельских настроек, включить в состав пользовательских настроек элементы Группировки строк и Группировки колонок (рис. 16.637). Вариант "Основной" отчета "Работа мастеров" Добавить - | [tj । । О Структура отчета •т Строки Мастер Колонки @== СБ @ Состав пользовательских настроек таблицы-Демонстрационная конфигура... (^Предприятие) X Состав пользовательских настроек таблицы Представление: Режим редактирования: J [Быстрыйдоступ ▼ ! J |Быстрыйдоступ^1 J |Быстрыйдоступ^1 | [Быстрыйдоступ ^1 | [Быстрыйдоступ | ОК | Отмена (?) О Таблица 0 Выбранные поля О Условное оформление 40 Г руппировки строк ^0 Г руппировки колонок Рис. 16.637. Изменение варианта отчета В результате пользователь перед формированием отчета может задавать группировку строк и колонок в таблице в соответствии со своими пред- почтениями (рис. 16.638). @ V ' Работа мастеров • Демонстрацион... (1С Предприятие) V5 Й ПЦ 'ail М М* М- - - □ X Работа мастеров Вариант отчета: [Основной | | Выбрать вариант,,, | | р» Сформировать 11 Настройка... Па Выбрм«1ыеполя ffl Строки Й Колонки Мастер Все действия’11 (?) -и Мастер 9 000,1X1 6 500,00 6 500,00 Ильин Сергей Соколов Андрей Итого Компьютер для дома Компьютер для офиса Компьютер игровой Итого Стоимость_____________Стоимость_____________Стоимость____________Стоимость _______________В 000,00 9000,00 10500,00 1 9000,00 10 500,00 28 000,СО Рис. 16.638. Результат отчета в виде таблицы со свободной структурой Можно также задать возможность пользовательской настройки для вложенных группировок (рис. 16.639). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 16.639. Изменение варианта отчета В приведенном выше примере пользователь может настраивать состав вложенных группировок для родительской группировки всего отчета Контрагент (рис. 16.640). @ ' w ’ п... („й - □ X Продажи номенклатуры Вариант отчета: |Настройка группировок | | Выбрать вариант.,, | | р» Сформировать 11 ЙЗ Настройка.. Все действия ’ i (?) Параметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 нтрагент иод ТСвтоматиКР Количество Стоимость т т S декабря 2011 г. 11 декабря 2011 г. ООО “Система" 9 декабря 2011 г. ООО “Стиль"________ 6 декабря 2011 г, Итого 11 500,00 I 1 000,001 I Ю5оо.оо| 10 000,00 ] юооо.оо| 10 000,00 | 10 000,00] 31 500,00 Рис. 16.640. Результат отчета При указании необходимости пользовательской настройки группи- ровки группироваться будут все вложенные элементы, начиная от места, где указана необходимость группировки, вплоть до места, где встретится элемент структуры, отличный от группировки, или до места, в котором на одном уровне будут расположены несколько элементов структуры. Том 2
G п pa вон ник] раз р а б.отл и ка Расположение ресурсов Система компоновки данных позволяет настраивать отображение полей ресурсов в отчете. Управлять расположением ресурсов можно в конфи- гураторе, в режиме настроек конструктора схемы компоновки данных на закладке Другие настройки или в режиме 1 (^Предприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Дополни- тельные настройки. Для этого нужно установить значение параметра Расположение ресурсов (рис. 16.641). Параметры Выбрани,,, Отбор Сортировка Условное... Польэова... I Другие н.. Параметр 0 Макет оформления Q Расположение итогов О Расположение полей группировок О Расположение грутровок Расположение ресурсов________________ О Расположение общих итогов по горизонтали О Расположение общих итогов по вертикали Q Тип заголовка полей Щ Гистограмма объемная Рис. 16.641. Настройка расположения полей расурсов В приведенном примере в отчет выводятся поля ресурсов Количество и Стоимость. Существуют следующие варианты расположения ресурсов: Горизонтально - поля ресурсов располагаются горизонтально слева направо. Каждый ресурс отображается в отдельной колонке. Данное расположение ресурсов используется по умолчанию (рис. 16.642); Номенклатура Период Количество Стоимость^ Диагностика компьютера 2 1500,00 5 декабря 2011 г. 1| 1000,00 11 декабря 2011 г. 1| 500,00 Компьютер для дома 1 10 000,00 11 декабря 2011 г. 1| 10 000,00 Компьютер для офисе 1 10 000,00 9 декабря 2011 г. 1| 10 000,00 Монитор LCD 1 10 000,00 6 декабря 2011 г. 1| 10 000,00 Итого X 31 500 ли Рис. 16.642. Вывод полей ресурсов - «Горизонтально» Вертикально - поля ресурсов располагаются вертикально друг под другом. Все ресурсы отображаются в одной колонке. Также созда- ется специальная колонка, отображающая имена полей ресурсов (рис. 16.643).
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Номенклатура Период______ Диагностика компьютера 0 н к 1 500,00 5декабря2О11 г. (оличество 1 Стоимость 1 ОООДО 11 декабря 2011 г. (оличество 1 Стоимость 500,00 Компьютер для дома (оличество Стоимость 1 10 ОООДО 11 декабря 2011 г. количество Стоимость 10 ОООДО Компьютер для офиса количество Зтоммость 1 10 ОООДО 9декабря2011 г. (оличество Стоимость 1 10 ооодо Монитор LCD (оличество Стоимость 1 10 ооодо 6декабря2011 г. (оличество Стоимость 1 10 ооодо Итого Количество КГРимость 31 500.Ои Рис. 16.643. Вывод полей ресурсов - «Вертикально» Также есть возможность управлять порядком расположения полей ресурсов в отчете - можно располагать ресурсы либо после всех полей группировки, либо в порядке расположения в отчете. Стандартной пози- цией ресурсов является расположение После всех полей. В приведенном примере параметр Авто позиция ресурсов установлен в значение Не использовать (рис. 16.644). Параме... [j^ Польза.. fffl Группир... Поля Отбор [jg Сортир... gfi Цсловн... | Дополи.. I Текущий элемент имеет собственные дополнительные настройки Вседействия Параметр Значение □ □ □ □ □ 0 □ Стиль линии Нет линии Размещение легенды Нет Полосы измерительной диаграммы Нет полос Расположение ресурсов в диаграмме Аето Выводить заголовок Авто Заголовок Сборка системных блоков Выводить параметры Аето ы______Выводить отбор________________________ < 1у1 Аето позиция ресурсов зеле всех полей Рис. 16.644. Настройка автопозиции ресурсов При этом данные в отчете Сборка системных блоков сгруппированы по полям Системный блок и Мастер. В детальных записях отчета поля выводятся в следующем порядке: Количество, Стоимость, Дата, Номер (рис. 16.645). В результате при значении параметра Авто позиция ресурсов - Не использо- вать поля ресурсов (Количество, Стоимость) будут располагаться в порядке расположения в отчете - сначала поля группировок, потом в том порядке, в котором они расположены на закладке Выбранные поля настроек отчета. При этом поля ресурсов всегда будут располагаться горизонтально, неза- висимо от значения параметра Расположение ресурсов (рис. 16.646).
Рис. 16.645. Настройка порядка попей в отчете Сборка системных блоков Параметры Начало периода: 01.122011 Конец периода: 15 J312012 Системный блок Количество Стоимость Мастер _______________________________________________Дата______Номер Компьютер для дома 1 9 ВВВДВ Ильин Сергей 1 9 ОООДО ___________________________|__________1________9 000,0011,1222011 000000002 Компьютер для офиса 1 В 5ВВДВ Соколов Андрей 1 8 ОООДО | 1 8 500,00 06.12^011 000000001 Компьютер игровой 1 1В 50ВДВ Соколов Андрей________________________1________10 000,80__________________ _____________ | 1 10 500,00112012 000000003 Итого 3 2В ВВВДВ Рис. 16.646. Результат отчета Если установить параметр Авто позиция ресурсов в значение После всех полей, то ресурсы будут выводиться в стандартной позиции (рис. 16.647). Сборка системных блоков Параметры Началопериода: 01.122011 Конец периода: 15Л1 2012 Системный блек Количество Стоимость Мастер Дата___________Номер __________________________ Компьютер для дома 1 9ВООДВ Ильин Сергей 1 9080,80 11.122011 000000002 1 0000,00 Компьютер для офиса 1 В 500,0В Соколов Андрей 1 1680,80 06.122011 000000001 1 8 600,00 Компьютер ифовой 1 1В 500,0В Соколов Андрей 1 18 580,80 11.012012 000000003 1 10 500,00 Итого 3 28ВООДВ Рис. 16.647. Стандартная позиция ресурсов в отчете Профессиональная разработка в системе «1С:Предприятие 8»
Расположение группы выбранных полей Система компоновки данных предоставляет возможность изменять расположение групп выбранных полей. Управлять расположением группы выбранных полей можно в конфигураторе, в режиме настроек конструктора схемы компоновки данных на закладке Выбранные поля или в режиме 1 (^Предприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Поля. Если на данной закладке в поле, отображающем выбранные поля, сделать активной какую-либо группу, то справа от нее появится колонка Распо- ложение, позволяющая управлять расположением выбранных полей в группе. В приведенном примере создана группа полей Реквизиты и в нее добавлены поля Номенклатура.Код и Номенклатура.ВидНоменкла- туры (рис. 16.648). litl Парам... Гт Пользе... Группи... I Поля I гМ Отбор flffl Сортир... jtffl Условн... ftfl Допел.. Текущий элемент имеет собственные настройки выбранных полей (для детальной настройки элемента) Выбрать Все действий » Добавить новое поле i Сгруппировать поля i X I Ф Q i Все действий' Доступные поля - = Номенклатура = Версия данных в Код '+' а Мой родитель = Наименование = Пометка удаления = Предопределенный “ Родитель = Этогр/1па * д Регистратор___________ Рис. 16.646. Настройка расположения группы выбранных попей Существуют следующие варианты расположения выбранных полей в группе: Авто - расположение полей определяется автоматически. Для груп- пировок и строк таблицы поля располагаются горизонтально, а для колонок таблицы - вертикально (рис. 16.649); Номенклатура Товары для сборки____ Мониторы___________ Монитор LCD_____ ОЗУ________________ Память__________ Основные детали Жесткий диск Материнская плата Прочие детали______ Веб-камера______ Микрофон________ Итого реквизиты Номенклатура.Код Номенклатура.Вид номенклатуры 000000025 000000022 000000012 000000023 000000004 000000024 000000005 000000003 000000027 000000026 Ьоооодоза- Материалы Материалы Материалы Материалы Материалы Материалы Материалы Материалы Материалы Материалы. Приход 37,000 4,000 4,000 5,000 5,000 8,000 3,000 5,000 20,000 10,000 10,000 37.000 Рис. 16.649. Вывод группы выбранных полей - «Авто», «Горизонтально», «В отдельной колонке» Том 2
LG п pa вон ник] разработу и ка] Горизонтально - поля располагаются горизонтально слева направо. Для каждого поля отводится отдельная колонка (см. рис. 16.649); Вертикально - поля располагаются вертикально сверху вниз. Для каждого поля отводится отдельная строка (рис. 16.650); Рис. 16.650. Вывод группы выбранных попей - «Вертикально» В отдельной колонке - поля располагаются горизонтально слева направо. Для каждого поля отводится отдельная колонка, при этом все колонки группы располагаются правее всех остальных колонок (кроме ресурсов, если ресурсы располагаются стандартно - после всех полей), см. рис. 16.649; Вместе - поля располагаются вместе в одной колонке и разделяются запятой (рис. 16.651). Номенклатура Товары для сборки____ Мониторы___________ Монитор LCD_____ ОЗУ________________ Память__________ Основные детали Жесткий диск Материнская плата Прочие детали______ Веб-камера______ Микрофон________ Итого Реквизиты Яоменклатура.Код, Номенклатура.Вид номенклатуры 000000025._________ 000000022. Материалы 000000012. Материалы 000000023, Материалы 000000004, Материалы 000000024, Материалы 000000005, Материалы 000000003, Материалы 000000027, Материалы 000000026, Материалы 600000028. Материалы Приход 37,000 4,000 4,000 5,000 5,000 8,000 3,000 6,000 20,000 10,000 10,000 37.000 Рис. 16.651. Вывод группы выбранных попей - «Вместе»
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Заголовки выбранных полей Система компоновки данных предоставляет возможность изменять заго- ловки выбранных полей. Управлять заголовками выбранных полей можно в конфигураторе, в режиме настроек конструктора схемы компо- новки данных на закладке Выбранные поля или в режиме 1 (^Предприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Поля. Для этого нужно выделить в списке выбранных полей нужный заголовок и вызвать его контекстное меню правой кнопкой мыши. Затем выбрать пункт Установить заголовок... и ввести новое название заголовка. Нажав кнопку открытия со значком лупы, можно задать альтернативный вариант заголовка в случае использования в конфигурации нескольких языков (рис. 16.652). Параметры I Выбрат... I Отбор Сортировка Условное... Пользой... Другие м... Рис. 16.652. Настройка заголовков выбранных полей Таким образом, для одной и той же схемы компоновки данных разные настройки могут задавать разные заголовки полей. Расположение общих итогов Система компоновки данных позволяет настраивать отображение общих итогов в отчете. Управлять расположением общих итогов можно в конфи- гураторе, в режиме настроек конструктора схемы компоновки данных на закладке Другие настройки или в режиме ЮЛредприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Дополни- тельные настройки. Для этого нужно установить значение параметров Расположение общих итогов по горизонтали и Расположение общих итогов по вертикали (рис. 16.653).
Параметры Выбрани,.. Отбор Сортировка Условное... Пользой... | Другие н... | Рис. 16.653. Настройка расположения общих итогов Параметр Расположение общих итогов по горизонтали имеет смысл только для таблиц, а параметр Расположение общих итогов по вертикали - для груп- пировок и таблиц. Существуют следующие варианты расположения общих итогов: Нет - не отображать итоги. Для группировок не отображаются только итоги по вертикали, а для таблиц - итоги по вертикали и по горизон- тали. В приведенном примере параметр Расположение общих итогов по вертикали для группировки установлен в значение Нет (рис. 16.654). Номенклатура Склад Приход Расход Конечный остаток Микрофон Розничный 10Д00 2,000 8,000 Веб-камера Розничный 10,000 3,000 7Д00 Монитор LCD Розничный 4,000 2,000 2,000 Материнская плата Основной 5,000 3,000 2,000 Память Основной 5,000 3,000 2,000 Жесткий диск Основной 3,000 3,000 Рис. 16.654. Вывод общих итогов по вертикали - «Нет» В приведенном примере параметры Расположение общих итогов по верти- кали и Расположение общих итогов по горизонтали для таблицы установлены в значение Нет (рис. 16.655). Номенклатура Основной Розничный Приход Расход Конечный Приход Расход Конечный остаток остаток Веб-камера_______ Жесткий диск Материнская плата Микрофон_________ Монитор LCD Память 3,000 ЗДОР 5,000 ЗДОР 10,000 ЭДОО 7,000 5,000 ЗДОР 2,000 10,0001 2,000~ ____________4.000 2Д00 2,000 I 8,000 2ДОО Рис. 16.655. Вывод общих итогов по вертикали и горизонтали - «Нет» Начало - отображать итоги в начале. Для группировок и строк таблицы общие итоги отображаются перед строками группировки, а для колонок таблицы - перед колонками группировки. В приве- денном примере параметр Расположение общих итогов по вертикали для группировки установлен в значение Начало (рис. 16.656). Профессиональная разработка в системе «1С:Предприятие 8»
Номенклатура Склад Приход Расход Конечный остаток фтога 37,1X0 16ДМ 21JMXP Микрофон Розничный юдоо 2,000 вдоо Веб-камера Розничный ЮДОО ЗДОО 7 ДОО Монитор LCD Розничный 4 ДОО 2,000 2 ДОО Материнская плата Основной 5,000 ЗДОО 2 ДОО Память Основной 5,000 ЗДОО 2 ДОО Жесткий диск Основной ЭДОО ЗДОО Рис. 16.656. Вывод общих итогов по вертикали - «Начало» В приведенном примере параметры Расположение общих итогов по верти- кали и Расположение общих итогов по горизонтали для таблицы установлены в значение Начало (рис. 16.657). Номенклатура Hforo Приход Расход Конечный остаток Основной Приход Расход Конечный остаток Розничный Приход Расход Конечный остаток Сто го 37 ДОО ЮДОО 21 ДОО ЮДОО ЭДОО 4 ДОО 24 ДОО 7Д00 17Д0© Веб-камера юдоо здоо 7,000 10,000 ЗДОО <Д00 Жесткий диск здоо здоо здоо здоо Материнская плата 5,000 здоо 2,000 5,000 ЗДОО 2,000 Микрофон юдоо 2,000 В,ООО 10,000 2,000 ВДОО Монитор LCD 4,000 2,000 2,000 4,000 2,000 2 ДОО Память V 5 ДОО здоо 2.00/ 5,000 ЗДОО 2,000 Рис. 16.657. Вывод общих итогов по вертикали и горизонтали - «Начало» Конец - отображать итоги в конце. Для группировок и строк таблицы общие итоги отображаются после строк группировки, а для колонок таблицы - после колонок группировки. В приведенном примере параметр Расположение общих итогов по вертикали для группировки установлен в значение Конец (рис. 16.658). 'Номенклатура Склад Приход Расход Конечный остаток Микрофон Розничный ЮДОО 2,000 вдоо Веб-камера Розничный ЮДОО ЗДОО 7 ДОО Монитор LCD Розничный 4 ДОО 2,000 2 ДОО Материнская плата Основной 5,000 ЗДОО 2 ДОО Память Основной 5,000 ЗДОО 2 ДОО Жесткий диск Основной э.ооо 3.000 0ого 37,000 16.000 21ДЙВ Рис. 16.658. Вывод общих итогов по вертикали - «Конец» В приведенном примере параметры Расположение общих итогов по верти- кали и Расположение общих итогов по горизонтали для таблицы установлены в значение Конец (рис. 16.659); Номенклатура Веб-камера_______ Жесткий диск Материнская плата Микрофон_________ Монитор LCD______ Память ^того Основной Розничный Приход Расход Конечный Приход Расход Конечный _________________остаток____________________остаток здоо здоо 5 ДОО ЭДОО ЭДОО 2,000 юдоо 7,000 _________2&S&. ЮДОО ЭДОО ЮДОО 4,000 2,000 2,000 8 ДОО 2,000 ___________________ 4 ДОО 24,000 7Д00 Приход Расход Конечный остаток эдоо эдоо эдоо 2 ДОО 2 ДОО 17,000 юдоо эдоо 5 ДОО юдоо 4 ДОО________ 5-000 ЭДЮ! <37,1X0 16,000 7 ДОО 2,000 ВДОО 2 ДОО ~м 21,ооду Рис. 16.659. Вывод общих итогов по вертикали и горизонтали - «Конец» Том 2
G п pa вон ник] раз р а б.отл и ка Начало и конец - отображать итоги в начале и конце. Для группировок и строк таблицы общие итоги отображаются перед и после строк группировки, а для колонок таблицы - перед и после колонок группи- ровки. В приведенном примере параметр Расположение общих итогов по вертикали для группировки установлен в значение Начало и конец (рис. 16.660). Номенклатура Склад Приход Расход Конечный ffioro Микрофон Веб-камера_______ Монитор LCD Материнская плата Память___________ Жесткий диск ^Ттого Розничный* Розничный Розничный Основной Основной Основной остаток Э7ДЮ16ДО021Ш5> 4 О,МО 5JM0i W 10,000 3,000 7Д00 4,000 2,000 5,000 3,000 5,000 3,000 2,000 2,000 2,000 3,000 3,000 37,000 16.000 2ljtiD> Рис. 16.660. Вывод общих итогов по вертикали - «Начало и конец» В приведенном примере параметры Расположение общих итогов по верти- кали и Расположение общих итогов по горизонтали для таблицы установлены в значение Начало и конец (рис. 16.661); Рис. 16.661. Вывод общих итогов по вертикали и горизонтали - «Начало и конец» Авто - расположение общих итогов определяется автоматически. Для группировок верхнего уровня общие итоги отображаются в конце, для остальных группировок общие итоги не отображаются. Заметим, что параметры Расположение общих итогов по горизонтали и Распо- ложение общих итогов по вертикали можно использовать и для вложенных группировок. Для этого нужно задать эти же параметры в режиме настройки отдельной группировки. Например, в приведенном примере для группировки Склад общие итоги отображаются в конце, а для группи- ровки Номенклатура - в начале (рис. 16.662). Склад Начальный Приход Расход Конечный Рис. 16.662. Вывод общих итогов по вертикали для отдельных группировок 333
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Также заметим, что отбор, применяемый в группировке, влияет на отобра- жение общего итога по данной группировке. Например, в указанном ниже отчете для группировки Номенклатура установлен отбор. В приведенном примере в общем итоге по группировке Номенклатура указаны приход, расход и остаток с учетом отбора, тогда как для вышестоящей группи- ровки Склад указываются приход, расход и остаток без учета отбора (рис. 16.663). Склад Начальный Приход Расход Конечный Номенклатура остаток_______________________остаток Основной 13,000 9,000 «,ооф [Отбор: Конечный остаток ьольше v 1 итого 1 |&з!етчный 24,000 7 ДМ 17,М<Е) 1 Отбор: Конечный остаток ьольше V I Итого 20.000 5 ЛОО iS.dddl 1 Веб-камера I 10,000 з.ооо; 7,000 1 Микрофон I 10.000 2.000; 6.000 Gtroro 37 ДЮ 16.000 21.00© Рис. 16.663. Вывод общих итогов с учетом отбора по отдельной группировке Отображение заголовков, параметров данных и отборов Система компоновки данных позволяет настраивать отображение заголовков, параметров данных и отборов. Управлять отображением заго- ловков, параметров данных и отборов можно в конфигураторе, в режиме настроек конструктора схемы компоновки данных на закладке Другие настройки или в режиме 1С:Предприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Дополнительные настройки. Для этого нужно установить значение параметров Заголовок, Выводить заголовок, Выводить параметры и Выводить отбор (рис. 16.664). |ц| Парь... [flj Поль... Щ Грут... Д Поля jig Отбор [jfa Сорт... gfi Цело... | flff Допо... I Т вкущий элемент имеет собственные дополнительные настройки ЗЙ Все действия’1 Параметр Значение i О Размещение легенды Нет О Полосы измерительной диаграммы Нет полос □ Расположение ресурсов в диаграмме Авто С Выводить заголовок Дето 0 Заголовок Продажитоваровиуслуг — 0 Выводить параметры Выводить 0 ВЫВОДИТЬ отбор М||еИИИдИцЯ|ВдДДДДДДДДДДДДДДД»ДДДДДДДДД^ЙЖ - Рис. 16.664. Настройка отображения заголовков, параметров данных, отборов Заголовком в системе компоновки данных является текст, выводимый в начале отчета или группировки. Заголовок может задаваться для отчета в целом, таблицы, диаграммы, а также для отдельных группировок.
Для управления отображением заголовков используются следующие пара- метры: Выводить заголовок - управление отображением заголовка. Сущест- вуют следующие варианты отображения заголовка: □ Авто - отображение заголовка определяется автоматически. Если в заголовке указан текст, то заголовок отображается, иначе - нет; □ Не выводить - заголовок не отображается; □ Выводить - заголовок отображается всегда. В строке Заголовок задается текст заголовка. Чтобы не выводить заго- ловок, можно просто снять флажок его использования в этой строке. В приведенном примере параметр Выводить заголовок установлен в значение Выводить, при этом выводится общий заголовок отчета (рис. 16.665). ® С/ V? ' п- (1СЛ Itnl |4 I5l HU 311 Продажи номенклатуры Вариант отчета: [Основной | р» Сформировать || Настройка... itti Началопериода itti Конецпериода ^^кцйэака^" J | Выбрать вариант... | Все действий-' । 01.12.2011 15.12.2011 (Продажи товаров и услуг]) 1араметры: Начало периода: 01.12.2011 Конецпериода: 15.12.2011 I Контрагент Номенклатура Период_________________ ООО "Автоматиса” Диамостика вомпыотера 5 декабря 2011 г, 11 декабря 2011 г. Компьютер для дома 11 декабря 2011 г. ООО "Система" Компьютер для офиса 9 декабря 2011 г, ООО "Стиль" Монитор LCD__________ 6 декабря 2011 г. Итого Количество Стоимость 11 500,00 2 1 500,00 11 1 ооодо] 1 j бООДр] 1 10 000,00 1| ю ооодо] 10000до 1 10 000,00 Т] 10000до| 10000до 1 10 000,00 1| ю ооодо] 31 500,00 Рис. 16.665. Вывод общего заголовка и параметров отчета Параметры данных отображаются только в начале отчета. Для управления отображением значений параметров данных используется параметр Выво- дить параметры. Авто - отображение параметров данных определяется автомати- чески. Если параметры данных указаны, то отображается текст вида Параметры: <параметр1>: <значение1> (см. рис. 16.665), иначе пара- метры не отображаются; Не выводить - параметры не отображаются; Профессиональная разработка в системе «1С:Предприятие 8»
Выводить - параметры отображаются всегда. Если параметры не указаны, то отображается только текст вида Параметры:. В приведенном примере параметр Выводить параметры установлен в значение Выводить, при этом параметры в отчете не используются (рис. 16.666). © з, \J п... (1С:П iml ЕвЗ L4 V5 Й 'ill Продажи номенклатуры Варианготчета: [Основной| | Выбрать вариант... | | р» Сформировать 11 Настройка... Все действия^ । (?) 01.122011 15.122011 Продажи товаров и услуг "[ (ТЪрамвтры:^ Контрагент Номенклатура Период_________________ ООО "Автоматика" Диагностика компьютера 5 декабря 2011 г. 11 декабря2011 г, Компьютер для дома 11 декабря2011 г, Компьютер игровой 12 января 2012 г. ООО^Атлмгг" ____________ Восстановление данных Количество Стоимость 15 января 2012 г. Ремонт компьютера 13 января 2012 г. Сопутствую вне услуги 13 января 2012 г. ООО "Система" __ 24 500,00 1 soo'joo" 1 ooo.ool 500,od] 10000,00 10 000,00] 13 000,00 13 000,00] _ 9000,00 Г” ‘sdbojx)' 5 000,00 3 000ДО 3 000,00| 1 000,00 1 ooo.od] 10 000,00 I т I I I 2 2 2 Рис. 16.666. Вывод параметров отчета Отбор может отображаться как для отчета, таблицы или диаграммы, так и для отдельных группировок. Для управления отображением отбора используется параметр Выводить отбор. Авто - отображение отбора определяется автоматически. Если отбор установлен, то отображается текст вида Отбор: <текст отбора>, иначе отбор не отображается; Не выводить - отбор не отображается; Выводить - отбор отображается всегда. Если отбор не установлен, то отображается только текст вида Отбор:. В приведенном примере параметр Выводить отбор установлен в значение Выводить, при этом отбор задан только для группировки таблицы Номенк- латура. Параметр Выводить заголовок установлен в значение Авто, при этом для таблицы и группировки заданы различные заголовки (рис. 16.667). Том 2
G п pa вон ник] раз р а б.отл и ка @ ▼, V ' Остатки номе... (1С:Предлриятие) igjj L4 iiij М М* М- - - □ X Остатки номенклатуры Вариант отчета [Оформление | р» Сформировать 11 Настройка... J | Выбрать вариант,.. | Все действия^ । (?) Остатки номенклатуры | У (Отбор Список номенклатуры на складах | ||рт,ц Ы-ШЦ Номенклатура' ^Склад! Микрофон Веб-камера Монитор LCD______ Материнская плата Память___________ Жесткий диск Розничный Розничный Розничный Основной Основной Основной 10,000 10,000 4,000 5,000 5,000 3,000 2,000 3,000 2,000 3,000 3,000 3,000 пятпта— 8,000 7,000 ________2,000 ________2,000 2,000 Рис. 16.667. Вывод отбора для отчета в целом и отдельной группировки отчета Настройки диаграмм Система компоновки данных предоставляет возможности для настройки различных свойств отображаемых в отчете диаграмм. Управлять настройкой диаграмм можно в конфигураторе, в режиме настроек конструктора схемы компоновки данных на закладке Другие настройки или в режиме 1С:Предприятие при изменении варианта отчета (Все действия ► Изменить вариант) на закладке Дополнительные настройки. Логически Диаграмма является совокупностью Точек, Серий и значений серий в точке. В качестве значений выступает один из ресурсов отчета, в качестве точек - объекты, для которых мы получаем значения харак- теристик, в качестве серий - характеристики, значения которых нас интересуют. Прежде всего, исходя из эффективности графического представления результатов отчета, выбирается тип диаграммы: график, гистограмма, измерительная, круговая и т.д. Например, для демонстрации изменения каких-либо значений характеристик во времени лучше всего выбрать тип диаграммы График, где точками будут моменты времени, а сериями - харак- теристики, например продажи товаров. Для демонстрации доли объема продаж каждого контрагента подходит Круговая диаграмма и т.д. Далее можно настроить ряд свойств диаграммы, таких как расположение легенды, состав подписей, расположение ресурсов в диаграмме и др. 33S
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты Так, например, для отчета Продажи контрагентам в настройках диаграммы задан тип диаграммы - Круговая объемная, параметр Состав подписей установлен в значение Серия + процент, а параметр Размещение легенды - в значение Верх (рис. 16.668). ДД Парам... Пользо... Группи... Qg Поля pjj Отбор П1П Сортир... Цсловн... | пЯ Допел.. I Текущий элемент имеет собственные дополнительные настройки 1|0 Вседействия* Рис. 16.666. Настройка вывода состава подписей, легенды и типа диаграммы В результате диаграмма будет выведена в следующем виде (рис. 16.669). © \J Продажи контрагентам • Демонстрационн... (ЮПредгриятие) iftI I q V5 15] 'И!| '311 М М* М” * - □ X Продажи контрагентам Вариант отчета: |Основной I I Выбрать вариант... | Рис. 16.669. Результат отчета В диаграмму можно выводить сразу несколько ресурсов. Управлять их расположением в точках или сериях диаграммы можно с помощью
параметра Расположение ресурсов в диаграмме. Например, в варианте Движение номенклатуры для отчета Остатки номенклатуры по периодам в отчет выводится гистограмма, в точках которой данные сгруппиро- ваны по номенклатуре, а в сериях - по складам. Ресурсы Приход и Расход выводятся в сериях диаграммы (это стандартный вариант расположения ресурсов в диаграмме), рис. 16.670. Рис. 16.670. Диаграмма отчата В результате мы видим не две серии - по числу складов, а четыре - на каждый склад по два ресурса. Если же установить параметр Расположение ресурсов в диаграмме в значение Точки, то ресурсы в диаграмме будут располагаться в точках, и, поскольку точек получается много (на каждую номенклатуру по два ресурса), текст в точках диаграммы автоматически располагается верти- кально (стандартно текст располагается горизонтально), рис. 16.671. Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 16.671. Диаграмма отчета Но можно и принудительно расположить текст в точках диаграммы вертикально. Для этого используется условное оформление диаграммы, рассмотренное в следующем разделе. Условное оформление Для более наглядного представления данных в отчете система компо- новки данных позволяет задавать условное оформление областей отчета. При помощи условного оформления можно изменить цвет текста или фона, шрифт, горизонтальное или вертикальное положение и т.п. как отчета в целом, так и его отдельных областей. Условное оформление приме- няется к отчету при определенных условиях. Например, когда остаток товара равен нулю, соответствующие строки номенклатуры выводятся красным цветом. Для управления условным оформлением используются настройки компо- новки данных. В конструкторе схемы компоновки данных или в режиме изменения варианта отчета нужно перейти в режим настройки отчета в целом или его отдельной группировки и открыть закладку Условное офор- мление. Том 2
LG п pa вон ник] разработу и ка] Элементы условного оформления могут быть следующих типов: Главное - применяется ко всему отчету. Такое условное оформление распространяется как на специальные области отчета (например, текст отбора или заголовка отчета), так и на все вложенные элементы отчета (таблицы, диаграммы и группировки); Условное оформление таблицы или диаграммы - применяется к таблице или диаграмме соответственно. Такое условное оформление распро- страняется как на области таблицы, так и на все группировки строк и колонок таблицы; Условное оформление группировки - применяется к отдельно взятой группировке, то есть условное оформление родительской группировки не распространяется на дочернюю. В соответствии с типом оформления нужно перейти в режим настроек группировки, таблицы, диаграммы или отчета в целом. Для применения условного оформления необходимо определить следу- ющие его элементы: Оформление - описание применяемого оформления. Описанием офор- мления является перечень свойств оформления (таких как цвет, шрифт, стиль границы и т. д.), которые применяются к указанной области; Условие - условие, в соответствии с которым применяется условное оформление. Если условие не указано, то условное оформление приме- няется к указанным областям без условий; Оформляемые поля - область отчета, к которой применяется условное оформление. В качестве области указываются имена полей, для которых будет применяться условное оформление. Если область не указана, то условное оформление применяется ко всему отчету, таблице или группировке; Представление - необязательный элемент для представления условного оформления пользователю. Если Представление задано, то оно исполь- зуется для представления настроек условного оформления в отчетной форме, что, безусловно, более понятно и доступно для пользователя. Порядок обработки элементов условного оформления следующий: сначала обрабатывается условное оформление группировок, затем обрабатывается условное оформление таблиц или диаграмм и в конце обрабатывается условное оформление всего отчета. Для примера рассмотрим условное оформление диаграммы варианта Движение номенклатуры для отчета Остатки номенклатуры по периодам. Поскольку вариант отчета содержит только диаграмму, то условное офор- мление задается на уровне всего отчета. Использование условного оформления в диаграммах имеет свои особен- ности. Так, в параметре Оформление элемента условного оформления
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты используются только свойства Цвет в диаграмме и Ориентация текста. Также стоит отметить, что условное оформление применяется только к точкам и сериям диаграммы и не применяется к значениям. На закладке Условное оформление схемы компоновки данных вари- анта отчета задано два элемента условного оформления диаграммы. В первом элементе установлена вертикальная ориентация текста для точек диаграммы (поле Номенклатура). Условие оформления для этой настройки отсутствует, представление настройки - Вертикально (рис. 16.672). Параметры Выбранны... Отбор Сортировка | Условное... I Пользова... Другие на... Оформление Условие Оформляемые поля Представление 0 г. х Номенклатура Вертикально Редактирова не параметров | ОК || Отмена 11 Справка | Рис. 16.672. Настройка условного оформления диаграммы Во втором элементе условного оформления установлен фиолетовый цвет для точек диаграммы (поле Номенклатура), в которых значение поля Приход больше В. Представление этой настройки - Большая закупка (рис. 16.673). Параметры Выбранны... Отбор Сортировка | Условное... | Пользова... Другие на... Рис. 16.673. Настройка условного оформления диаграммы Обе эти настройки включены в состав быстрых пользовательских настроек. В результате отчет выводится с заданным условным оформлением - текст в точках диаграммы (наименования номенклатуры) располагается вертикально, столбцы номенклатуры с большим приходом выделяются цветом (рис. 16.674).
Рис. 16.674. Результат отчета Если мы отключим настройки Вертикально и Большая закупка, то получим результат, показанный на рис. 16.670. Работа с системой компоновки средствами встроенного языка Заметим, что все разнообразные интерактивные возможности платформы по работе с системой компоновки данных можно описать средствами встроенного языка. Каждый этап компоновки данных может быть реали- зован программным образом. Это весьма трудоемкое занятие, и делать это целиком вряд ли понадобится, но иногда бывает необходимо заполнить наборы данных, сформировать и вывести отчет, изменить его настройки и т.п. с помощью встроенного языка. В этом разделе мы познакомимся с основами работы с системой компоновки средствами встроенного языка. Установка схемы компоновки данных Система компоновки данных позволяет создать для отчета несколько схем компоновки данных. Средствами встроенного языка нужную схему компоновки можно получить по имени и программно выполнить отчет на ее основе (листинг 16.138). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 16.136. Программное получение схемы компоновки СхемаКомпоновкиДанных = Отчеты.СписокНоменклатуры. ПолучитъМакет("ОсновнаяСхемаКомпоновкиДанных"); Средствами встроенного языка можно создать и описать саму схему компоновки данных. ПОДРОБНЕЕ Этот процесс рассматривается на стр. 231. В приведенном ниже примере создается схема компоновки данных, в нее добавляется локальный источник данных информационной базы. Затем создается НаборДанныхЗапрос с именем НаборДанных1 и опреде- ляется текст запроса, получающего цены номенклатуры из виртуальной таблицы РегистрСведений.Цены.СрезПоследних (листинг 16.139). Листинг 16.139. Процедура программной установки схемы компоновки СКД = Новый СхемаКомпоновкиДанных; ИД = СКД.ИсточникиДанных.Добавить(); ИД.Имя = "ИсточникДанных"; ИД.ТипИсточникаДанных = "Local"; НаборДанных = СКД.НаборыДанных.Добавитъ(Тип(”НаборДанныхЗапросСхемыКомпоновкиДанных")); НаборДанных.Имя = "НаборДанныхГ; НаборДанных.Запрос = "ВЫБРАТЬ ЦеныСрезПоследних.Период,"+ "ЦеныСрезПоследних.Номенклатура, ЦеныСрезПоследних.Цена"+ "ИЗ РегистрСведений.Цены.СрезПоследних КАК ЦеныСрезПоследних"; НаборДанных.ИсточникДанных = "ИсточникДанных"; Затем в набор данных добавляются поля Номенклатура, Период и Цена и задается его формат без вывода дробной части. Далее в набор данных добавляется поле ресурсов Цена и задается выражение для его расчета (листинг 16.140). Листинг 16.140. Процедура программной установки схемы компоновки Попе1 = НаборДанных.Поля.Добавить(Тип("ПопеНабораДанныхСхемыКомпоновкиДанных")); Поле1.Поле = "Номенклатура”; Попе1.ПутьКДанным = "Номенклатура”; Попе1 .Заголовок = "Номенклатура"; Поле2 = НаборДанных.Поля.Добавить(Тип(”ПолеНабораДанныхСхемыКомпоновкиДанных")); Поле2.Поле = "Период"; Попе2.ПутьКДанным = "Период"; Поле2.3аголовок = "Период"; ПолеЗ = НаборДанных.Попя.Добавить(Тип(”ПопеНабораДанныхСхемыКомпоновкиДанных")); ПопеЗ.Поле = "Цена"; ПолеЗ.ПутьКДанным = "Цена”; ПопеЗ.Загоповок = "Цена"; ПолеЗ.Оформление.УстановитьЗначениеПараметра("Формат", "ЧЦ=6; ЧДЦ=О"); ПолеРесурса = СКД.ПоляИтога.Добавить(); ПолеРесурса.ПутьКДанным = "Цена"; ПопеРесурса.Выражение = "Сумма(Цена)"; Том 2
LG п pa вон ник] разработу и ка] В набор данных также можно добавить вычисляемые поля, параметры ит.д. ПОДРОБНЕЕ Дополнительную информацию об этих объектах системы компо- новки данных можно увидеть в разделе синтакс-помощника: Общие объекты — Система компоновки данных — Схема компоновки данных... Редактирование стандартных настроек Стандартные настройки - это настройки, которые делает разработчик в схеме компоновки данных. Средствами встроенного языка можно полу- чить и изменить стандартные настройки схемы компоновки данных. ПОДРОБНЕЕ Этот процесс рассматривается на стр. 230. В приведенном ниже примере создается группировка по полю Номенк- латура и вложенная в нее группировка по полю Период. Затем создается автополе для списка полей и упорядочивания этих группировок. Затем в общий список выбранных полей добавляется поле ресурса Цена. В заклю- чение задается заголовок и макет оформления отчета (листинг 16.141). Листинг 16.141. Процедура программной установки настроек Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; ГруппировкаНоменклатура = Настройки.Структура.Добавить(Тип(ТруппировкаКомпоновкиДанных")); ГруппировкаНоменклатура.Использование = Истина; ГруппировкаПериод = ГруппировкаНоменклатура.Структура. Добавить(Тип(ТруппировкаКомпоновкиДанных")); ГруппировкаПериод. Использование = Истина; ПопеНоменкпатура = ГруппировкаНоменклатура.ПоляГруппировки.Элементы. Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПопеНоменклатура.Использование = Истина; ПопеНоменклатура.Поле = Новый ПолеКомпоновкиДанных("Номенклатура"); ПолеПериод = ГруппировкаПериод. ПоляГруппировки. Элементы. Добавить(Тип("ПолеГруппировкиКомпоновкиДанных")); ПолеПериод.Использование = Истина; ПопеПериод.Поле = Новый ПолеКомпоновкиДанных("Период"); ВыбранныеПоляДляНоменклатуры = Г руппировкаНоменклатура.Выбор.Элементы. Добавить(Тип("АвтоВыбранноеПопеКомпоновкиДанных")); ВыбранныеПоляДляНоменклатуры.Использование = Истина; ПорядокДляНоменклатуры = ГруппировкаНоменклатура.Порядок.Элементы. Добавить(Тип("АвтоЭпементПорядкаКомпоновкиДанных")); ПорядокДляНоменклатуры.Использование = Истина;
I ГлаваИ 6nG лояаТыеТанагтитйческйеТотяеты ВыбранныеПоляДляПериода = ГруппировкаПериод.Выбор.Элементы. Добавить(Тип("АвтоВыбранноеПопеКомпоновкмДанных”)); ВыбранныеПоляДляПериода.Использование = Истина; ПорядокДляПериода = ГруппировкаПериод.Порядок.Элементы. Добавитъ(Тип("АвтоЭлементПорядкаКомпоновкиДанных")); ПорядокДляПериода.Использование = Истина; ВыбранныеПоля = Настройки.Выбор.Элементы.Добавить(Тип(''ВыбранноеПолеКомпоновкиДанных")); ВыбранныеПоля.Испопьзование = Истина; ВыбранныеПоля.Загоповок = "Цена”; ВыбранныеПоля.Поле = Новый ПопеКомпоновкиДанных("Цена"); Настройки. ПараметрыВывода.УстановитьЗначениеПараметра("Заголовок", "Цены комплектующих"); Настройки. ПараметрыВывода.УстановитьЗначениеПараметра("МакетОформления", "Зеленый"); Код, представленный в листингах 16.139, 16.140, 16.141, 16.147, реализован в обработке Работа с СКД. В обработке при нажатии кнопки Сформировать отчет полностью программным образом формируется отчет о последних ценах комплектующих из регистра сведений Цены (рис. 16.675). Работа с СКД ^Сформировать отчет В се действия^ । (?) Цены комплектующих Номенклатура ____Период______________ hi Веб-камера___________ [ 11ХН201214:20:00 hi Жесткий диск "[ 05.122011122239 Я Материнская плата { 05.122011135317 hi Микрофон_____________ [ 1101201214:20:00 hi Монитор LCD__________ [ 1101201211:10:00 hi Память { 05.122011135317 Итого Цена 100В 1 000 эоов 3000 2 00В 2000' 70В 700 1В00В 10000 128В 1 200' 17 аов| Рис. 16.675. Обработка «Работа с СКД» I Работа с параметрами схемы компоновки Часто бывает нужно задать значения параметров схемы компоновки данных по умолчанию перед формированием отчета. Для этого необходимо использовать обработчик события формы отчета ПередЗагрузкойВариан- таНаСервере, чтобы в нем изменить параметры настроек перед их загрузкой в компоновщик (листинг 16.142).
Листинг 16.142. Обработчик события «ПередЗагрузкойВариантаНаСервере» &НаСервере Процедура ПередЗагрузкойВариантаНаСервере(Настройки) Настройки.ПараметрыВывода.УстановитъЗначениеПараметра("Заголовок", "Продажа системных блоков"); Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачвлоПериода", '2011120Г); Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", '20111231'); КонецПроцедуры В параметре Настройки в обработчик передаются настройки варианта отчета, имеющие тип НастройкиКомпоновкиДанных. В данном обработ- чике методом УстановитьЗначениеПараметра() изменен заголовок отчета, а также установлены значения параметров начала и конца отчетного периода. Однако если настройки являются пользовательскими (например, это параметры отчетного периода) и пользователь хоть раз задавал их значения в форме отчета, то нужно использовать обработчик события ПередЗагрузкойПользовательскихНастроекНаСервере, который вызы- вается после загрузки настроек варианта отчета. При этом восста- навливаются пользовательские настройки, сделанные пользователем при последнем формировании отчета и автоматически сохраненные платформой. Пользовательские настройки накладываются на настройки варианта и загружаются в компоновщик настроек (листинг 16.143). Листинг 16.143. Обработчик события «ПередЗагрузкойПользовательскихНастроекНаСарваре» &НаСервере Процедура ПередЗагрузкойПользовательскихНастроекНаСервере(Настройки) Настройки.3лементы[0].3начение = '20111201'; Настройки.Элементы[0].Использование = Истина; Настройки.Элементы[1].Значение = '20111231'; Настройки.Элементы[1].Использование = Истина; КонецПроцедуры В параметре Настройки в обработчик передаются настройки варианта отчета, имеющие тип ПользовательскиеНастройкиКомпоновкиДанных. Так как параметра всего два, то можно обращаться к ним по индексу (О, 1) в коллекции элементов пользовательских настроек. Мы устанавли- ваем значения параметров начала и конца отчетного периода и задаем для них признак использования. Эти настройки загружаются в компо- новщик настроек, и отчет формируется с заданными параметрами. ПОДРОБНЕЕ Пример программной инициализации параметров отчета рассмотрен в разделе «Примеры разработки отчетов» на стр. 160. Профессиональная разработка в системе «1С:Предприятие 8»
Заметим, что названия некоторых параметров вывода не совпадают с названиями в окне настроек схемы компоновки данных. ПОДРОБНЕЕ Список имен параметров для программного использования можно увидеть в разделе синтакс-помощника: Общие объекты — Система компоновки данных — Настройки компоновки данных — ЗначенияПарамет- ровВыводаКомпоновкиДанных. Редактирование настроек схемы компоновки Стандартные настройки схемы компоновки могут изменяться пользова- телем в режиме 1С:Предприятие. При создании формы отчета последние пользовательские настройки загружаются в компоновщик настроек отчета. Средствами встроенного языка, используя свойства основ- ного реквизита отчетной формы (Отчет.КомпоновщикНастроек), можно получить и изменить эти настройки. В приведенном примере созда- ется отбор по номенклатуре из группы Комплектующие и включается вывод информации об отборе, затем измененные настройки загружаются в компоновщик настроек отчета, и формируется отчет (листинг 16.144). Листинг 16.144. Процедура программной установки настроек Настройки = Отчет.КомпоновщикНастроек.Настройки; ЭпементОтбора = Настрой ки.Отбор.Элементы .Добавитъ(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлеменгОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Номенклатура"); ЭпементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВИерархии; ЭлементОтбора.ПравоеЗначение = Справочники.Номенклатура.Найти ПоНаименованию("Комппектующие"); Настройки.ПараметрыВывода.УстановитьЗначениеПараметра("ВыводитьОтбор", ТипВыводаТекстаКомпоновкиДанных.Выводить); Отчет.КомпоновщикНастроек.ЗагрузитьНастройки(Настройки); СкомпоноватьРезультат(); Редактирование настроек не основной схемы компоновки Иногда требуется обеспечить редактирование настроек компоновки данных не для основной схемы компоновки данных отчета либо вообще не в отчете. Для обеспечения редактирования настроек произвольной схемы компоновки данных нужно инициализировать компоновщик настроек источником доступных настроек. После инициализации компо- новщика настроек он будет оперировать доступными полями схемы, источник которой ему установлен. Для этого нужно создать источник доступных настроек для адреса схемы компоновки данных. В качестве адреса схемы компоновки данных может выступать адрес во временном хранилище, в которое поместили Том 2
LG п pa вон ник] раз работу и ка] схему компоновки данных, или адрес значения в записи базы данных (листинги 16.145, 16.146). Листинг 16.145. Инициализация компоновщика настроек источником доступных настроек АдресСхемы = ПоместитъВоВременноеХранилище(Схема, УникальныйИдентификатор); КомпоновщикНастроек.Иницивлизировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); В данном примере во временное хранилище помещается схема компо- новки данных, находящаяся в переменной Схема. Листинг 16.146. Инициализация компоновщика настроек источником доступных настроек АдресСхемы = ПолучитьНавигационнуюСсылку(Ссылка, "СхемаКомпоновкиДанных"); КомпоновщикНастроек.Иницивлизировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(АдресСхемы)); В данном примере схема будет получаться из базы данных, из реквизита с именем СхемаКомпоновкиДанных объекта со ссылкой Ссылка. Вывод отчета После того как установлена схема компоновки данных и ее настройки, можно программно сформировать и вывести отчет (листинг 16.147). Листинг 16.147. Программное формирование отчета Процедура СформироватъОтчет() Экспорт СхемаКомпоновкиДанных г УстановитьСхему(); Настройки = УстановитьНастройки(СхемаКомпоновкиДанных); // В этот объект помещается информация о расшифровке данных. ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных; // Формирование макета компоновки данных с помощью компоновщика макета. КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; // В макет компоновки передаются СхемаКомпоновкиДанных, ее настройки и II ДанныеРасшифровки для заполнения информации о расшифровке. МакетКомпоновки = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки, ДанныеРасшифровки); // Выполнение компоновки данных с помощью процессора компоновки. ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновки, .ДанныеРасшифровки); // Очистка попя табличного документа - Результат. Результат.Очистить(); // Вывод результатов компоновки в табличный документ. ПроцессорВыврда=Новый ПроцессорВыврдаРезультатаКомпоновкиДанныхВТабличныйДокумент; ПроцессорВывода.УстановитъДокумент(Результат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); КонецПроцедуры
Глава116лЬлЬжнй1еТаналитинескиеТотлетй1 Данная процедура реализована в обработке Работа с СКД. В функциях УстановитьСхемуО, УстановитьНастройки() программно описывается схема компоновки данных и задаются стандартные настройки. В резуль- тате в обработке Работа с СКД при нажатии кнопки Сформировать отчет полностью программным образом получается отчет о последних ценах комплектующих из регистра сведений Цены (см. рис. 16.675). Система компоновки данных позволяет выводить результат компоновки данных в результирующий документ. Для этого у процессора вывода реализован метод Вывести(), в качестве параметра которому передается процессор компоновки данных. В приведенном выше примере результат выводится в элемент формы - поле табличного документа. В следующем примере результат компоновки выводится не в отчетную форму, а в новый табличный документ (листинг 16.148). Листинг 16.148. Вывод отчета в табличный документ ДокументРезультат = Новый ТабличныйДокумент; ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВТабпичныйДокумент; ПроцессорВывода.УстановитьДокумент(ДокументРезупьтат); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); Процессор компоновки данных выполняет автоматическую фиксацию заголовка таблицы, если в отчет выводится одна таблица или одна груп- пировка (возможно, с вложенными группировками). Вывод в дерево значений, таблицу значений для дальнейшей программной обработки Результат компоновки можно использовать для дальнейшей програм- мной обработки и выводить таблицу значений или дерево значений. Для этого предназначен объект ПроцессорВыводаРезультатаКомпонов- киДанныхВКоллекциюЗначений. Метод УстановитьОбъект() является аналогом метода УстановитьДокумент(). Если метод УстановитьОбъект() не был вызван, результат будет выведен в таблицу значений.
Элементы результата компоновки могут быть получены при помощи процессора компоновки данных либо сформированы любыми другими средствами. В приведенном примере результат компоновки данных выводится в дерево значений - переменную ДеревоРезультата (листинг 16.149). Листинг 16.149. Вывод отчета в дерево значений КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки,,, Тип(ТенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений'')); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициапизировать(МакетКомпоновкиДанных); ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоппекциюЗначений; ПроцессорВывода.УстановитьОбъект(ДеревоРезультата); ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); При выводе результата компоновки в таблицу или дерево значений сущес- твуют следующие ограничения: в настройках должны присутствовать только группировки и детальные записи. Использование таблиц, диаграмм и вложенных отчетов не допускается; все папки, указанные в выбранных полях, игнорируются; не используется условное оформление, а также оформление для поля, указанное в схеме компоновки данных; из параметров вывода используются только следующие: □ расположение общих итогов по вертикали; □ тип заголовка полей; □ количество записей; □ процент записей; предопределенные макеты не используются. Профессиональная разработка в системе «1С:Предприятие 8»
Глава 17. Средства графического представления данных ГЕОГРАФИЧЕСКИЕ СХЕМЫ В этой главе речь пойдет об использовании географических схем при разработке прикладных решений в системе «1 С:Предприятие». Географические схемы в основном используются для представления итоговых данных в разрезе их географического положения. Они позво- ляют создавать отчеты, иллюстрирующие, например, объемы продаж тех или иных товаров в различных регионах страны (рис. 17.1). Рис. 17.1. Отчет, основанный на географической схеме Также географическая схема может быть использована просто для отоб- ражения тех или иных географических данных, например, схемы проезда к офису или маршрута движения транспортного средства. Том 2
Основные понятия Географическая схема представляет собой совокупность географи- ческих объектов, описывающую заданный регион земной поверхности. По сути это документ, в котором хранится топологическая информация о различных географических объектах. Как правило, географические схемы состоят из нескольких слоев, содер- жащих различные топографические объекты: регионы, области, реки, города, дороги и т. д. Каждый слой содержит объекты, сгруппированные по одному типу и, возможно, еще по некоторому признаку. Например, слой Города может содержать города с населением до 100 тыс. человек, а слой Столицы - столицы государств. Слой географической схемы предназначен для логической группировки топологических объектов. Слой хранит объекты, которые в него входят, и данные этих объектов, а также позволяет манипулировать этими данными. Объект слоя - элементарный объект, описывающий топологические данные конкретного географического объекта. Например, объект может описывать контуры области. Объекты делятся на следующие классы: Точечный объект - предназначен для отображения на схеме объектов, которые могут быть отображены точкой. Такими объектами могут быть города, деревья и т. п. Каждый точечный объект идентифициру- ется географическими координатами - широтой и долготой, которые доступны через свойство Координаты. Кроме того, можно задать цвет отображения объекта, тип отображения (символом текста, маркером, картинкой), собственно символ, его шрифт, маркер отображения и картинку. Для картинки также можно задать положение опорной точки отрисовки; Многоточечный объект - предназначен для отображения на схеме групп объектов, которые могут быть отображены совокупностью точек. Такими объектами могут выступать деревья и т.п. Многото- чечный объект полностью соответствует точечному, за исключением того, что вместо координат объект имеет коллекцию с такими коорди- натами;
инескогбТпредставленияУданных' Полилинейный объект - предназначен для отображения на геогра- фической схеме объектов, которые могут быть представлены линиями. Такими объектами, например, могут быть дороги или реки. Каждый полилинейный объект содержит коллекцию Сегменты, через которую можно получить доступ к сегментам линии. Каждый сегмент представляет собой коллекцию географических коор- динат. Полилинейный объект рисуется заданным стилем линии и указанным цветом; Полигональный объект - предназначен для отображения на карте объектов-площадей: полей, районов, областей и т.д. Полигональный объект состоит из контуров, совокупности точек, образующих замкнутую линию. Полигональный объект закрашивается указанным цветом и обводится указанным цветом границы. Слои содержат серии данных - произвольные данные, сгруппированные по некоторому признаку. Примером такой серии могут быть продажи по регионам за год. Значение серии данных - конкретное значение серии данных, ассоции- рованное с конкретным объектом. Например, существует серия данных «Продажи по регионам за год». Тогда значение продаж по отдельному городу будет являться значением серии данных. Легенда географической схемы предназначена для настройки шкалы значений диаграмм, отображаемых на географической схеме. Например, города численностью до 100000 человек могут отображаться одним значком, допустим, кнопкой. Макет географической схемы может быть сохранен в файл *.део или получен из этого файла. Для добавления слоев географической схемы используются шейп-файлы. Шейп-файл (Shapefile) - это файл с топологическими данными, создава- емый с помощью программ семейства ESRI ArcGIS (подробнее об этих программах - на сайте http://www.esri.com/software/arcgis/index.html). Этот файл может содержать связанные с топологическими объектами данные. Каждый файл содержит один слой. Географическая схема позво- ляет считывать такие файлы в качестве слоя. Основы работы с географическими схемами Для того чтобы использовать географические схемы в своем прикладном решении, необходимо подготовить топологические данные, на основе которых будут отображаться диаграммы. Можно пойти двумя путями: использовать схему, поставляемую с «1С:Предприятием», или создать свою собственную схему.
ПОДРОБНЕЕ На сайте ИТС (http://its.lc.rU/db/metod81#content:2565:l в разделе Методические рекомендации по конфигурированию - Географическая схема - Географические схемы) можно скачать географические схемы мира и России. Демонстрационная схема, поставляемая с «1С:Предприятием», пред- ставляет собой схему России, содержащую данные о регионах и городах России, а также информацию о реках, озерах и дорогах. Эту схему также можно найти на диске, прилагаемом к книге, в каталоге Files. Схема содержит: для регионов (слой Регионы): □ название региона (Название); □ название экономического региона, в который входит регион (Эконо- мический_Регион); □ площадь региона (Площадь); □ название столицы (Столица); □ код региона по классификатору МНС России (Код_Региона); для городов (слой Города): □ название города (Название); □ статус города (город, населенный пункт и т. д.) - Статус; □ регион, в котором находится город (Регион); □ население (по данным на 1995 г.) - Население_95_Год; □ является ли город столицей региона (Столица); □ код региона, в котором находится город по классификатору МНС России (Код_Региона); □ код города по классификатору МНС России (Код_Города). Если требуется создать схему с оригинальными данными, то для этого понадобятся шейп-файлы, которые содержат нужную топологическую информацию (например, подробную схему Ленинградской области) и, возможно, связанную с топологическими объектами информацию. Для того чтобы создать новую схему, необходимо выбрать пункт Новый в меню Файл конфигуратора «1С:Предприятия» и в появившемся окне указать тип документа Географическая схема (рис. 17.2). Выбор вида документа ГI Текстовый документ S Картинка Табличный документ Внешняя обработка .Q Внешний отчет HTML документ О Графическая схема I ОК | | Отмена | Рис. 17.2. Создание новой географической схемы Профессиональная разработка в системе «1С:Предприятие 8»
«1С:Предприятие» создаст новый документ географической схемы. Чтобы добавить новые слои в схему, необходимо открыть диалог Настройка слоев. Открыть его можно либо из контекстного меню схемы, либо из палитры свойств. Затем в открывшемся диалоге нужно выполнить команду Добавить в панели инструментов списка слоев и выбрать необходимый шейп-файл (рис. 17.3). Настройка слоов X -и- Имя Текст Организация источника... В.. Р.. Началомвошгабногоди... Конец масшгабногоаиа... Серии дан№к | Объекты_______________________________________________________________________________________________________________ I Ъ Н____________________________________________________________________________________________________________________ Имя Текст Имя групт.. Значение । Базовый ц... I Типотобра... I Отображаг... Формат от... Цвет текста Шрифт тем" | Закрьгть 11 Справка | Рис. 17.3. Диалог настройки слоев После выбора шейп-файла откроется диалог, в котором можно указать, какие связанные данные необходимо импортировать вместе с топологи- ческими объектами (рис. 17.4). Параметры импорта слоя X Импортировать пса именем: |ИМПММ1 | Укажите серии данных, которые необходимо импортировать, f flf Имя в Файле OBJECTID APT.NAME ADDRE55 BLD.NO NOTES UNIT-NO Тип значения Числовое Текстовое Текстовое Текстовое Текстовое Текстовое Имюртиро... 0 0 0 0 0 0 Имя в слое OBJECTID APT-NAME ADDRE55 BLD.NO NOTES UNIT.NO Типотобра... He отоб... He отоб... He отоб... He отоб... He отоб... He отоб... О Заполнить свойство "Значение" объектов слоя Использоватьдляэтого серию: OBJECTID Импортировать j | Це импортировать 11 Отмена ] | Справка | Рис. 17.4. Диалог импорта слоя из шейп-файла В диалоге можно указать, под каким именем необходимо импортировать файл в схему, какие серии и под каким именем необходимо импортировать в слой, а также как серии будут отображаться. Кроме этого, диалог позво- ляет записать значения выбранной серии в свойство Значение связанных топологических объектов. Это может помочь в идентификации объекта. Например, в поставляемой демонстрационной схеме в свойство Значение записан код классификатора ИМНС, что позволяет связывать клиентов с географическим положением по их адресу. Том 2
ГеографинескиеТсхем^! После импорта можно произвести дополнительную настройку схемы, пользуясь диалогом настройки слоев (рис. 17.5). Настройка слоев Ф & X -и- О Организаций ист... । В.. I P.J Начало масштаб... Коней масштабно... В строках |0|0|' Э9 999 999.........................99999 999 В строках 3 0 -99999999 99999999 Серии дан№к | Объекты а X > Ъ <ь Имя Текст I Имя труп.., I Значение Назеани... | | ЗК0Н0МИЧЕСКИЙ_РЕГИ0Н Экономи... ПЛОЩАДЬ Площадь... СТОЛИЦА Столица... КОД_РЕГИОНА Кодреги... | Закрыть 11 Справка | Рис. 17.5. Диалог настройки слоев Чтобы отредактировать данные, связанные с объектом, нужно дважды щелкнуть на необходимом объекте на географической схеме (рис. 17.6). Свойства объекта X Основные | Данные | Оформление г? Серия Типотриссеки I Значение НАЗВАНИЕ Не отображать Псковская обл ЭКОНОМИЧЕСКИЙ.. Не отображать Северо-Запаспъй ПЛОЩАДЬ Не отображать 55,3 СТОЛИЦА Не отображать Псков КОД.РЕГИОНА Не отображать Б ООО 000 000 000 0... I OK 11 Отмена 11 Справка I _ w _ ------ -------- ------- Рис. 17.6. Диалог свойств объекта Диалог свойств объекта позволяет быстро отредактировать данные, связанные с конкретным объектом, изменить свойства его оформления, видимость и необходимость отображения связанных с объектом данных. Работа с объектами географической схемы из встроенного языка Для работы с географическими схемами предназначен объект встроен- ного языка ГеографическаяСхема. Географическая схема содержит слои (совокупность географических объектов, сгруппированных по некоторому признаку, - регионы, города и т.п.), доступ к которым осуществляется через коллекцию Слои.
инескогбТпредставленияУданных' Для каждого слоя можно настроить текст (свойство Текст), видимость (свойство Видимость) и возможность интерактивного выбора (свойство РазрешитьВыбор) объекта слоя на географической схеме. Также для слоя можно задать свойства НачалоМасштабногоДиапазона и КонецМасштаб- ногоДиапазона. Если установленный масштаб карты не попадает в вилку этих значений, то слой не отображается. Все топологические объекты, хранящиеся в слое, доступны через коллекцию Объекты. Через свойство ТипЭлементов можно получить тип объектов, которые могут храниться в слое. Этот тип устанавливается автоматически, если слой импортируется из шейп-файла, или задается пользователем, если слой создается с помощью средств встроенного языка. Слой позволяет манипулировать данными объектов с помощью методов УстановитьЗначение и ПолучитьЗначение. С помощью метода НайтиОбъект можно найти объект в слое по комбинации серии и ее значения для этого объекта. С помощью метода НайтиПоЗначению можно найти объект в слое по значению свойства Значение объекта слоя. Для каждого объекта слоя можно настроить его видимость и необхо- димость отрисовки связанных с ним данных. Для этого предназначены свойства объектов Видимость и ОтображатьДанные. Слои содержат серии данных, предназначенные для группировки данных, ассоциированных с объектами, и настройки параметров отображения этих объектов. Серии данных, ассоциированные со слоем, доступны через коллекцию Серии. Для более легкой идентификации серия имеет свойство Значение. С помощью серии данных можно задать тип отображения данных (свойство ТипОтображения) на географической схеме. Также можно настроить текст, описывающий серию данных, формат отображения значения текстом, шрифт, ориентацию текста, цвет текста и цвет фигуры. Значения серии могут не отображаться совсем или отображаться: в виде простого текста, гистограммы, кругов различного диаметра (рис. 17.7), кругов, различного цвета, кругов, различного оттенка цвета, в виде круговой диаграммы, круговой диаграммы разного размера, картинки. Легенда географической схемы предоставляет возможность просмотреть список элементов легенды, а также изменить порядок их отображения или удалить ненужные.
Продажи по регионам (За все время) О 22060.65 • 3093.00 Рис. 17.7. Отчет, основанный на географической схеме Новые элементы легенды добавляются через диалог Настройка элементов легенды путем указания необходимых объектов или серий данных, а также программно через свойство ОбластьЛегенды объекта Географи- ческаяСхема. Примеры работы с географической схемой Ниже будет рассмотрено несколько простых примеров, иллюстрирующих основные возможности работы с географической схемой из встроенного языка: как отобразить схему в форме; как отобразить на схеме объект, выбранный пользователем; как отобразить на схеме данные отчета. ПОДРОБНЕЕ Познакомиться с этими примерами работы с географической схемой можно в демонстрационной конфигурации «Средства графического представления данных» (обработка Работа с Географической схемой, отчет Продажи по Регионам), прилагающейся к книге на компакт-диске. Отображение географической схемы в форме Для отображения географической схемы в форме необходимо создать реквизит типа ГеографическаяСхема (например, ГеоСхема) и связать его с полем формы вида Поле географической схемы. Затем методом Прочитать() заполнить реквизит данными географической схемы из файла (листинг 17.1). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 17.1. Отображение файла географической схемы ГеоСхема.Прочитать("С:/ГеофафическаяСхемаРоссии.део"); | Можно также вывести в схему данные из макета географической схемы. Например, можно создать общий макет типа Географическая схема и загру- зить в него данные из файла, например, данные географической схемы России, поставляемые «1С:Предприятием» (рис. 17.8). Конструктор макета X Имя: | ГвограФическаяСхемаРоссни | Синоним: | Географическая схема россш I Комментарий | ] - Выберите тип макета:-------------------------------------------- О Т абличный документ О Т екстовый документ О Двоичные данные О Active document О HTML документ ® Географическая схема О Графическая схема О Схема компоновки данных О Макет оформления компоновки данных Загрузить из Файла: |САГвографическаяСхемаРоссии.део „J | Готово | | Отмена | | Справка | _ _ Рис. 17.8. Макет географической схемы Затем в форме обработки выполнить метод Вывести() географической схемы (листинг 17.2). Листинг 17.2. Отображение макета географической схемы ГеоСхема.Вывести(ПопучитъОбщийМакет("ГеографическаяСхемаРоссии")); | Методом Записать() можно сохранить данные географической схемы в файл. Методом ПолучитьКартинкуО можно получить изображение географической схемы в форматах *.bmp, *.рпд. ПОДРОБНЕЕ Синтакс-помопщик: Общие объекты — Географическая схема. Выбор города на географической схеме Для примера рассмотрим решение следующей задачи. Пусть необхо- димо вывести в форму географическую схему России в разрезе регионов и городов с показом местоположения и наименования столиц регионов. А также требуется предоставить пользователю возможность выбрать из списка некоторый город и затем отобразить этот город на карте России. Том 2
(ТеографййёскйеТсхемы Для решения этой задачи создадим обработку Работа с географи- ческой схемой, форму этой обработки и реквизит формы ГеоСхема типа ГеографическаяСхема. Перетащим реквизит в дерево элементов формы и получим поле формы вида Поле географической схемы, связанное с этим реквизитом. Это поле будет отображать географическую схему в форме обработки. Также создадим реквизит СписокГородов типа СписокЗначений, который будет содержать список городов географической схемы. Создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 17.3). Листинг 17.3. Обработчик события «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) ГеоСхема.Вывести(ПолучитьОбщийМакет(“ГеографическаяСхемаРоссии")); ЗаполнитьСписокГородов(); СписокГородов.СортироватьПоПредставлению(); КонецПроцедуры В обработчике данные из общего макета, содержащего географическую схему России, выводятся в форму. Затем в процедуре ЗаполнитьСпи- сокгородов() заполняется список городов географической схемы и отображаются столицы регионов России (листинг 17.4). После этого данные списка значений СписокГородов сортируются по представлению. Листинг 17.4. Процедура «ЗаполнитьСписокГородов()» &НаСервере Процедура ЗаполнитъСписокГородов() // Запретить перерисовку схемы на время обновления. ГеоСхема.Обновление = Ложь; // Отобразить слой Регионы. ГеоСхема.Слои.Регионы.Видимость = Истина; II Задать тип отображения названий городов. СлойГорода = ГеоСхема.Слои.Города; СлойГорода.Серии.Название.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.Текст; СлойГорода.Видимость = Истина; // Отобразить слой Города. // Сформировать список городов и скрыть все города, кроме столиц. Для Счетчик = 0 По СлойГорода.Обьекты.Количество() -1 Цикл Город = СлойГорода.Объекты.Получить(Счетчик); НазваниеГорода = СпойГорода.ПолучитъЗначение(Город, СпойГорода.Серии. Название); НазваниеРегиона = СлойГорода.ПолучитьЗначение(Город, СлойГорода.Серии.Регион); НазваниеСтолицы = СлойГорода.ПолучитьЗначение(Город, СлойГорода.Серии.Столица); Если НазваниеСтопицы.Значение = Тогда Город.Видимость = Ложь;
и.ческого1представления!даннЁ1Х' Иначе Город.Видимость = Истина; КонецЕсли; СписокГородов.Добавить(Счетчик, НазваниеГорода. Значение + " (" + НазваниеРегиона.Значение +")"); КонецЦикла; ГеоСхема.Обновпение = Истина; II Обновить схему. КонецПроцедуры В процедуре запрещается обновление схемы до конца процедуры, затем устанавливается видимость слоев Регионы и Города, а также задается тип отображения названий городов в виде обычного текста. После этого осуществляется обход всех объектов слоя Города и форми- руется список городов, который сохраняется в списке значений СписокГородов. В цикле обхода получаются значения серии данных Наименование, Регион и Столица для каждого города. Значения первых двух серий используются для представления списка значений городов. А значения серии Столица используются для определения, является ли город столицей, и в зависимости от этого устанавливается его видимость на географической схеме. В заключение включается обновление схемы. В резуль- тате в форму обработки выводится географическая схема России в разрезе регионов и городов с указанием столиц регионов. Теперь реализуем вторую часть задачи: предоставим поль- зователю возможность выбрать из списка некоторый город и затем отобразить этот город на карте России. Для этого создадим команду формы ОтобразитьГород и перетащим ее в дерево элементов формы. В обработчике этой команды напишем следующий код (листинг 17.5). Листинг 17.5. Обработчик команды «ОтобразитьГород» &НаКлиенте Процедура ОгобразитьГород(Команда) ВыбранныйГород = СписокГородов.ВыбратьЭлемент(); Если ВыбранныйГород <> Неопределено Тогда ОтобразитьГородНаСхеме(ВыбранныйГород.Значение); КонецЕсли; КонецПроцедуры В данном обработчике список городов открывается для выбора пользователю. Затем в процедуре ОтобразитьГо- роднаСхеме() выбранный город находится в коллекции @ ' Равогасгео Работа с геограс | Отобразить Файл геограс Рис. 17.9. Отобрг
объектов слоя Города и отображается на географической схеме (листинг 17.6). Листинг 17.6. Обработчик команды «ОтобразитьГородНаСхеме» &НаСервере Процедура ОтобразитъГородНаСхеме(ВыбранныйГород) Слой Города = ГеоСхема. Слои. Города; СлойГорода.Серии.Название.Т ипОтображения = Т ипОтображенияСерииСлояГеографическойСхемы .Текст; Город Схемы = СлойГорода.Объекты.Получить(ВыбранныйГород); ГородСхемы.ТипОтрисовки = ТипОгображенияТочечногоОбъекгаГеографическойСхемы. Маркер; ГородСхемы. Маркер = ТипМаркераГеографическойСхемы.МапенькийКруг; ГородСхемы.Цвет = УУеЬЦвета.Синий; ГородСхемы.Видимость = Истина; // отобразить выбранный город КонецПроцедуры При выводе города задаются различные свойства отображения точечного объекта (Тип отрисовки, Маркер, Цвет), отличающие его от вывода горо- дов-столиц регионов на географической схеме (рис. 17.9). Графической схемой - Конфигурация (ЮПредприягие) □ х Ьической схемой Все действия'^ । (?) йической схемы | | Отобравить макет географической схемы | | Отобразить город на схеме v ^£(шинка Вкупжр1 Выберите значение " 'Кызыл Алтай (Канты-Мансийский АО) Алексаноровск-Сахагынсккй (Сах... Александровский Завод (Читинск... Александровское (Томская обл) Алексеевка (Белгородская обл) Алексеевка (Самарская обл) Алексеевка (Саратовская обл) Алексеева*. (Иркутская обл) Алексш (1 угьская обл) Алеховщина (Ленинградская обл) Алзамай (Иркутская обл) Алискерово (Чукотский АО) ОК — |Отмена| зжение выбранного города на географической схеме России Профессиональная разработка в системе «1С:Предприятие 8»
Отчет «Продажи по регионам» Рассмотрим использование географической схемы для анализа продаж по регионам России. Для получения такого отчета необходимо знать территориальное расположение контрагентов. В демонстрационной конфигурации «Средства графического представ- ления данных», прилагающейся к книге на компакт-диске, содержатся: справочники номенклатуры, контрагентов и расходные накладные, содержащие контрагента и список номенклатуры. При проведении этих документов формируются движения в оборотном регистре накоп- ления, отражающем данные о продажах в разрезе контрагентов и номенклатуры. Для каждого контрагента в справочнике Контрагенты хранится код региона (реквизит КодРегиона) и код города (реквизит Код Города) по клас- сификатору ФНС, в которых он зарегистрирован. На основе этих данных формируется отчет Продажи по регионам, пост- роенный с помощью географической схемы. Разберем этот пример подробно. Для реализации задуманного создадим отчет ПродажиПоРегионам и его основную форму. Создадим реквизит формы ГеоСхема типа Географичес- каяСхема и реквизит РезультатОтчета типа ТабличныйДокумент, которые будут содержать результат отчета в виде географической схемы и в виде табличного документа. Разместим эти реквизиты в форме. Также для формирования отчета нам понадобится список значений ТаблицаГрупп, содержащий значения типа СправочникСсылка.Номенклатура и логи- ческий реквизит ВыводитьГруппировкуГородов. Создадим обработчик события формы ПриСозданииНаСервере и заполним его следующим образом (листинг 17.7). Листинг 17.7. Обработчик события «ПриСозданииНаСервере» &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) II Получим таблицу верхних групп в справочнике номенклатуры. Запрос = Новый Запрос(); Запрос.УстановитьПараметрС'Родитепь", Справочники.Номенклатура.ПустаяСсылка()); Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Ссылка КАК Номенклатура, | Номенклатура.Ссылка.Код КАК Код |ИЗ | Справочник.Номенклатура КАК Номенклатура ГДЕ | Номенклатура.ЭтоГруппа = Истина | И Номенклатура.Родитель = &Родитель”; II Выполним запрос и получим выборку. Результат = Запрос.Выпопнитъ().Выбратъ(); Том 2
(ТеографййёскйеТсхемы // Заполним таблицу для хранения таблицы группировок. Пока Результат.Следующий() Цикл ИмяГруппировки = "Колонка/ + СокрЛП(Результат.Код); ТаблицаГрупп.Добавить(Результат.Номенклатура, ИмяГруппировки); КонецЦикла; КонецПроцедуры В данном обработчике запросом получается выборка верхних групп в справочнике номенклатуры и в результате обхода этой выборки запол- няется список значений ТаблицаГрупп, хранящий таблицу группировок для формирования отчета. Формирование отчета начинается при нажатии кнопки Сформировать. В обработчике соответствующей команды напишем следующий код (листинг 17.8). Листинг 17.6. Обработчик команды «Сформировать» &НаКлиенте Процедура Сформировать(Команда) СформироватъОтчет(); КонецПроцедуры По команде Сформировать вызывается серверная процедура Сформиро- ватьОтчет(), листинг 17.9, в которой формируется структура и внешний вид географической схемы (листинг 17.10), получается макет отчета в виде табличного документа, и затем схема и макет результата отчета заполняются данными о продажах (листинг 17.11). Листинг 17.9. Процедура «СформироватьОтчет()» &НаСервере Процедура СформироватъОтчет() СформироватъСхемуО; // Подготовим табличный документ, в котором будет храниться результат отчета. РезультатОтчета.Очистить(); // Получим макет отчета. Макет = Отчеты.ПродажиПоРегионам.ПолучитьМакет(”Макет"); // Получим область шапки данных из макета. Область = Макет.ПолучитьОбласть(”ШапкаТаблицы"); // Выведем полученную область в отчет. РезультатОтчета.Вывести(Область); // Начнем автофуппировку строк. РезультатОтчета.НачатьАвтофуппировкуСтрок(); ЗаполнитьОтчетДанными(Макет); // Закончим автофуппировку строк. РезультатОтчета.ЗакончитьАвтофуппировкуСфок(); ГеоСхема. Обновление = Истина; КонецПроцедуры
инескогбТпредставленияУданных' Листинг 17.10. Процедура «СформироватьСхемуО» &НаСервере Процедура СформироватьСхемуО ГеоСхема.ОчиститьО; ГеоСхема.Обновление = Ложь; // Запретить обновление схемы. ГеоСхема.Вывести(ПолучитъОбщийМакет("ГеографическаяСхемаРоссии")); II Скажем, что нам нужна легенда и заголовок. ГеоСхема.ОтображатьЛегенду = Истина; ГеоСхема.ОтображатьЗаголовок = Истина; II Установим параметры заголовка. ГеоСхема.ОбластьЗаголовка.Рамка = Новый Рамка(ТипРамкиЭлементаУправления.БезРамки.О); ГеоСхема.ОбластьЗаголовка.Текст = "Продажи по регионам (За все время)"; // Скроем видимость всех данных для регионов. ГеоСхема.УстановитъСвойствоОбъектов(ГеоСхема.Слои.Регионы.Обьекты, "ОтображатьДанные”, Ложь); II Установим видимость наименования. СерияНаименованиеРегионов = ГеоСхема.Спои.Регионы.Серии.Найти("НАЗВАНИЕ"); СерияНаименованиеРегионов.ТипОтображения = ТипОтображенияСерииСпояГеографическойСхемы.Текст; Индекс = 1; Для Каждого Элемент Из ТаблицаГрупп Цикл II Создадим в слое географической схемы серию для отображения данных. Серия = ГеоСхема.Спои. Регионы.Серии Добавитъ("Группа_" + СокрЛП(Элемент.Значение.Код)); Серия.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.РазмерФигуры; Серия.РежимОтображенияЗначений = РежимОтображенияЗначенийСерии.ОтображатъКакЗначение; Серия.Значение = Эпемент.Значение; Серия.Текст = "Продажи по группе""" + Элемент.Значение.Наименование +""""; Серия. ИмяГруппыСерий = "Продажи"; Серия.Формат = "ЧДЦ=2"; II Добавим в легенду. ЭпементЛегенды = ГеоСхема.ОбластьЛегенды. Элементы Добавить(); ЭлементЛегенды.Серия = Серия; ЭпементЛегенды.ТекстПодписи = Элемент.Значение.Наименование; ЭлементЛегенды.ОтображатьШкалу = ТипОтображенияШкалыЭлементаЛегендыГеографическойСхемы. НеОтображать; Индекс = Индекс +1; КонецЦикла; Если ВыводитьГруппировкуГородов Тогда II Скроем видимость всех городов. ГвоСхема.УстановитьСвойсгвоОбъектов(ГеоСхема.Слои.Города.Объвкты, "Видимость", Ложь); II Скроем видимость всех данных для городов.
ГеоСхема.УстановитьСвойствоОбъектов(ГеоСхема.Слои.Города.Объекты, "ОтображатьДанные", Ложь); // Установим видимость наименования. СерияНаименованиеГородов = ГеоСхема.Слои.Города.Серии.Най™("НАЗВАНИЕ"); СерияНаименованиеГородов.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.Текст; Индекс = 1; Для Каждого Элемент Из ТаблицаГрупп Цикл // Создадим в слое географической схемы серию для отображения данных. Серия = ГеоСхема.Слои.Города.Серии.Добавить(Труппа_” + СокрЛП(Элемент.Значение.Код)); Серия.ТипОтображения = ТипОтображенияСерииСлояГеографическойСхемы.РазмерФигуры; Серия.РежимОтображенияЗначений = РежимОтображенияЗначенийСерии.ОтображатьКакЗначение; Серия.Значение = Элемент.Значение; Серия.Текст = "Продажи по группе+ Элемент.Значение.Наименование + Серия. ИмяГруппыСерий = "Продажи”; Серия.Формат = "ЧДЦ=2”; // Добавим в легенду. ЭлементЛегенды = ГеоСхема.ОбластьЛегенды.Элементы.Добавить(); ЭлементЛегенды.Серия = Серия; ЭлементЛегенды.ТекстПодписи = Элемент.Значение.Наименование; Индекс = Индекс+ 1; КонецЦикла; КонецЕсли; II Найдем на схеме столицы регионов. Структура = Новый Структура(); Структура.Вставитъ(ГеоСхема.Слои.Города.Серии.Столица.Имя, Истина); Столицы = ГеоСхема.Слои.Города.ВыбратьОбъекты(Структура); ГеоСхема.УстановитьСвойствоОбъектов(Столицы, "Видимость”, Истина); ГеоСхема.УстановитьСвойствоОбъектов(Столицы, "ОтображатьДанные", Ложь); КонецПроцедуры Прокомментируем основное содержание процедуры. Сначала в схему выводятся данные из общего макета, содержащего географическую схему России, устанавливается видимость ее заголовка и легенды, и выводится заголовок географической схемы. Затем для объектов слоя Регионы скрывается видимость всех данных и устанавливается видимость для серии данных Название, а также зада- ется тип отображения названий регионов в виде обычного текста. Затем для каждой группы товаров номенклатуры верхнего уровня в слой Регионы добавляется серия данных, и устанавливаются различные свойства этой серии: Текст, Значение, ТипОтображения и т.п. А также серия добавляется в легенду, и устанавливаются свойства соот- ветствующего элемента легенды. Профессиональная разработка в системе «1С:Предприятие 8»
Если флажок ВыводитьГруппировкуГородов установлен, те же действия выполняются и для объектов слоя Города. В заключение в слое городов находятся столицы регионов, и устанав- ливается их видимость на географической схеме. Таким образом, схема подготовлена к заполнению данными отчета. Листинг 17.11. Процедура «ЗаполнитьОтчетДанными()» &НаСервере Процедура ЗаполнитьОтчетДанными(Макет) // Подготовим запрос для вытаскивания данных о продажах. Запрос = Новый Запрос(); // Сформируем текст запроса. Индекс = 1; Для Каждого Элемент Из ТаблицаГрупп Цикл Запрос.Текст = Запрос.Текст + ДобавитьТекстЗапроса(Индекс, Элемент.Значение); Запрос.УстановитьПараметр("Родитель" + Индекс, Элемент.Значение); Если Индекс <> ТаблицаГрупп.Количество() Тогда Запрос.Текст = Запрос.Текст + ” ОБЪЕДИНИТЬ КонецЕсли; Индекс = Индекс +1; КонецЦикла; II Добавим в текст запроса необходимость итогов. Запрос.Текст = Запрос.Текст + ИТОГИ СУММА(СуммаОборот), СУММА(КоличествоОборот) ПО ОБЩИЕ,” + Символы.ПС; Запрос.Текст = Запрос.Текст +" Запрос.Текст = Запрос.Текст + ” Запрос.Текст = Запрос.Текст +" КодРегиона," + Символы.ПС; КодГорода," + Символы.ПС; Контрагент"; II Выполним запрос и получим выборку. Выборка = Запрос.Выполнить().Выбрать(); // Обойдем все записи в выборке. Пока Выборка.Следующий() Цикл // Очистим текущую область. Область = Неопределено; Если Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ОбщийИтог Тогда // Получим область данных из макета. Область = Макет.ПолучитьОбласть(”СтрокаОбщийИтоГ'); // Заполним эту область данными. Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот; Том 2
17еографинескиё1схем£| // Выведем эту область в отчет. РезультатОтчета.Вывести(Область, 1); ИначеЕсли Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоИерархии Тогда // Получим область данных из макета. Область = Макет.ПолучитъОбластъ("СтрокаИтогПоИерархии"); // Заполним эту область данными. Область.Параметры.Контрагент = Выборка.Контрагент; Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка. КоличествоОборот; // Выведем эту область в отчет. РезультатОтчета.Вывести(Область, 4); ИначеЕсли Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ИтогПоГруппировке Тогда Если Выборка.Группировка() = "КодРегиона" Тогда // Получим область данных из макета. Область = Макет.ПолучитьОбласть(”СтрокаИтогПоГруппировке" + Выборка.Группировка()); // Заполним эту область данными. Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Областъ.Параметры.КоличествоОборота = Выборка.КоличествоОборот; // Попробуем найти объект с таким кодом. Регион = ГеоСхема.Слои. Регионы. НайтиПоЗначению(Выборка. КодРегиона); // Если смогли найти объект с таким кодом. Если Не Регион = Неопределено Тогда // Получим название региона из серии Название. Название = ГеоСхема.Слои. Регионы. ПолучитьЗначение(Регион, ГеоСхема.Слои.Регионы.Серии.Название).Значение; // Выведем значение в табличный документ. Область.Параметры.Регион = Название; // Выведем эту область в отчет. РезультатОтчета.Вывести(Область, 2); II Выделим регион на схеме. Регион.Цвет = УУеЬЦвета.СветлоЗолотистый; Регион.ОтображатьДанные = Истина; Иначе // Не смогли найти на схеме регион. Сообщить("Регион""" + Выборка.КодРегиона +отсутствует на схеме.", СтатусСообщения.Внимание); КонецЕсли; ИначеЕсли Выборка.Группировка() = "Код Города" Тогда II Получим область данных из макета. Область = Макет.ПолучитьОбласть(”СтрокаИтогПоГруппировке" + Выборка.Группировка()); II Выведем значение в табличный документ. Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот;
ического]прёдставлёния>данн^1Х' // Попробуем найти объект с таким кодом в схеме. Город = ГеоСхема.Слои. Города. НайтиПоЗначению(Выборка.КодГорода); // Получим название города из серии Название. Название = ГеоСхема.Слои.Города.ПолучитьЗначение(Город, ГеоСхема.Слои.Города.Серии. Название). Значение; // Выведем значение в табличный документ. Область.Параметры.Город = Название; // Выведем эту область в отчет. РезультатОтчета.Вывести(Область, 3); Если ВыводитьГруппировкуГородов Тогда // Если смогли найти объект с таким кодом. Если Не Город = Неопределено Тогда // Выделим город на схеме графически. Город.Видимостъ = Истина; Город.ОтображатьДанные = Истина; Город.ТипОтрисовки = ТипОтображения ТочечногоОбъектаГеографическойСхемы.Маркер; Город. Маркер = ТипМаркераГеографическойСхемы.Нет; Иначе // Не смогли найти на схеме город. Сообщить(Тород+ Выборка.КодГорода + отсутствует на схеме.", СтатусСообщения.Внимание); КонецЕсли; КонецЕсли; КонецЕсли; ИначеЕсли Выборка.ТипЗаписи() = ТипЗаписиЗапроса.ДетальнаяЗапись Тогда Регион = Г еоСхема.Слои. Регионы. НайтиПоЗначению(Выборка.КЬдРегиона); // Если смогли найти объект с таким кодом. Если Не Регион = Неопределено Тогда Регион.Видимость = Истина; Регион.ОтображатьДанные = Истина; Регион.Расшифровка = Новый Струкгура("КодТопологии, Номенклатура", Выборка.КодРегиона, Справочники. Номенклатура. ПустаяСсылкаО); Серия = ГеоСхема.Слои.Регионы.Серии.Найти(Выборка.Родитель); ЗначениеСерии = ГеоСхема.Слои.Регионы. ПолучитьЗначение(Регион, Серия); Если ЗначениеСерии = Неопределено Тогда // Установим значение серии. ГеоСхема.Слои.Регионы.УстановитьЗначение(Регион, Серия, Выборка.СуммаОборот,, Новый Струкгура( "КодТопологии, Номенклатура", Выборка.КодРегиона, Серия.Значение)); Иначе // Установим значение серии. ГеоСхема.Слои.Решоны.УстановитьЗначение(Решон, Серия, Выборка.СуммаОборот + ЗначениеСерии.Значение, ЗначениеСерии.Подсказка, ЗначениеСерии.Расшифровка); КонецЕсли;
Иначе // Не смогли найти на схеме регион. Сообщить("Решон+ Выборка.КодРегиона +отсутствует на схеме.", СтатусСообщения.Внимание); КонецЕсли; Если ВыводитьГруппировкуГородов Тогда Город = ГеоСхема.Слои.Города.НайтиПоЗначению(Выборка.КодГорода); // Если смогли найти объект с таким кодом. Если Не Город = Неопределено Тогда Город.Видимость = Истина; Город.ОтображатьДанные = Истина; Город.Расшифровка = Новый Структура("КодТополоши, Номенклатура", Выборка.КодГорода, Справочники.Номенклатура.ПустаяСсылкаО); Серия = ГеоСхема. Слои. Города. Серии. Найти(Выборка. Родитель); ЗначениеСерии = ГеоСхема.Слои. Города. ПолучитьЗначение(Город, Серия); Если ЗначениеСерии = Неопределено Тогда // Установим значение серии. ГеоСхема.Слои.Города.УстановитьЗначение(Город, Серия, Выборка.СуммаОборот,, Новый Структура( "КодТополоши, Номенклатура", Выборка.КодГорода, Серия.Значение)); Иначе // Установим значение серии. ГеоСхема.Слои.Города.УстановитьЗначение(Город, Серия, Выборка.СуммаОборот + ЗначениеСерии.Значение, ЗначениеСерии.Подсказка, ЗначениеСерии.Расшифровка); КонецЕсли; Иначе // Не смогли найти на схеме город. Сообщить("Город""" + Выборка.КодГорода +""" отсутствует на схеме.", СтатусСообщения.Внимание); КонецЕсли; КонецЕсли; // Получим область данных из макета. Область = Макет.ПолучитьОбласть("СтрокаДетальнаяЗапись'); // Заполним эту область данными. Область.Параметры.Контрагент = Выборка.Контрагент; Область.Параметры.СуммаОборота = Выборка.СуммаОборот; Область.Параметры.КоличествоОборота = Выборка.КоличествоОборот; // Выведем эту область в отчет. РезультатОтчета.Вывести(Область, 5); КонецЕсли; КонецЦикла; КонецПроцедуры Кратко поясним содержание процедуры. Профессиональная разработка в системе «1С:Предприятие 8»
Сначала динамически (в цикле обхо- дится список групп товаров) с помощью функции ДобавитьТекстЗапроса() (листинг 17.12) формируется текст запроса к регистру накопления Продажи. Затем запрос выполняется, и в цикле обхода результата запроса заполняются значения серий данных географической схемы и табличный документ с данными результата отчета. При заполнении отчета анализируется тип записи выборки. Если текущая запись - это итог по группировке (региона или города), то объект находится по коду региона или коду города в коллекции объектов соответствующего слоя. В табличный доку- мент выводится запись об этом объекте. На географической схеме регион отображается цветом, а город (если флажок ВыводитьГруппи- ровкуГородов установлен) - выбранным типом маркера. Продажи по регионам Схема отчета | Таблица отчета | Сформировать | Выводить в схема rpynrupoi Рис. 17.10. Отчет «Продажи п Если текущая запись выборки - это детальная запись, то в схеме находится объект с соот- ветствующим кодом (города или региона) и к значению необходимой серии добавляется значение суммы оборота продаж. Также значения детальной записи выводятся в табличный документ. Листинг 17.12. Функция «ДобавитьТекстЗапроса()» &НаСервере Функция ДобавитьТекстЗапроса(Индекс, Группа) // Начнем собирать текст запроса. ТекстЗапроса = "ВЫБРАТЬ” + Символы.ПС; ТекстЗапроса = ТекстЗапроса + "ПродажиОбороты.Контрагент.КодРегиона КАК КодРегиона," + Символы.ПС; ТекстЗапроса = ТекстЗапроса +" ПродажиОбороты.Контрагент.КодГорода КАК КодГорода, ” + Символы.ПС; ТекстЗапроса = ТекстЗапроса + " ПродажиОбороты.Контрагент КАК Контрагент, | СУММА(ПродажиОбороты.СуммаОборот) КАК СуммаОборот, | СУММА(ПродажиОбороты.КоличествоОборот) КАК КоличествоОборот," + Символы.ПС; ТекстЗапроса = ТекстЗапроса +"""Группа_" + СокрЛП(Группа.Код) +""” КАК Родитель"; ТекстЗапроса = ТекстЗапроса + Том 2
[1еографи^еские1схем£| ря (ЮПредприягие) ifl (в! L4 ' ъз © ' !il J2 ' „' - □ х жу по городам @ Продажи по регионам |3а все время) о регионам» |ИЗ | РегистрНакопления.Продажи.Обороты КАК ПродажиОбороты Г + Символы.ПС; ТекстЗапроса = ТекстЗапроса + "ГДЕ | ПродажиОбороты.Номенклатура В ИЕРАРХИИ | (&Родитель" + Индекс +")" + Символы.ПС; ТекстЗапроса = ТекстЗапроса + I ^ГРУППИРОВАТЬ ПО" + Символы.ПС; ТекстЗапроса = ТекстЗапроса + "ПродажиОбороты.Контрагент.КодРегиона," + Символы.ПС; ТекстЗапроса = ТекстЗапроса + "ПродажиОбороты.Контрагент.КодГорода," + Символы.ПС; ТекстЗапроса = ТекстЗапроса + "ПродажиОбороты.Контрагент” + Символы.ПС; Возврат ТекстЗапроса; КонецФункции В результате выполнения отчета данные о продажах товаров по регионам России отражаются на географической схеме (рис. 17.10) и выводятся в табличный документ (рис. 17.11).
инескогбТпредставленияУданных' ® чЗ/ W Продажи по регионам-Конфигурация (1 (^Предприятие) £1 L4 ' де ©К jil' м м+ м- -' □ х Продажи по регионам Схема отчета | Таблица отчета |_ Регион 1 Город I Контрагент Сумма Количество 1=1 итого no всем 32174600 214200 L HI Коми Peen 4263Л0 2200 1=1 Войвож 4263Л0 2200 । Русская одежда 30500 1500 | Русская одежда 860ОО 500 Русская одежда 309800 200 1 HI Саха/Якутия/Респ 2672400 12700 | 1=1 Чаща 400900 800 т Турмесов Марат Сергеевич 400900 800 ! 1=1 Сиктях 2263000 11800 1 Никитам Юрий 245500 400 Никитам Юрий 443500 5100 Никитам Юрий 15 74000 6300 о Тойоку 8600 100 т Филлеико 8500 100 1 Красноярский край 2664300 14000 HI Вере нд мл 2664300 14000 1 Завод РТИ 519000 5400 1 Завод РТИ 720000 9000 i Завод РТИ 1425300 2600 । HI Мурманская обл 3954800 20400 1=1 Красно ирлье 3954800 20400 Пугачев Максим Олегович 512000 6700 J Пугачев Максим Олегович 1132500 4500 Пугачев Максим Олегович 2310300 9200 HI Оренбургская обл 5528700 48300 1—1 Сорочинск 5528700 48300 Алекс-2002 572500 3700 Алекс-2002 877200 12600 Алекс-2002 4079000 31800 । Q Томская обл 4681800 67600 j Q Максимкин Яр 4681800 67600 Эльбрус 304000 2000 j Эльбрус 1430000 34500 Эльбрус 2847000 21000 । 1=1 Тюменская обл 3465100 11800 HI Больное Сорокине 3465100 11800 i Центр детского творчества 800600 900 Центр детского творчества 11 32500 4500 Центр детского твоочества 1522000 5600 HI Кор ясский АО 1000900 25ле Ачайваям 1000900 2500 Автохозяйство №34 98000 600 Автохозяйство №34 971900 1900 1—1 Таймырский АО 4742100 19500 Те Фактория Пейтурма 931800 2400 J I Максимус 931800 2400 т мвы: 0: 1 в Рис. 17.11. Отчет «Продажи по регионам» ДИАГРАММЫ В этом разделе речь пойдет об использовании диаграмм при разработке прикладных решений в системе «1С:Предприятие». Диаграмма предназначена для размещения в формах и табличных доку- ментах диаграмм и графиков различного вида. Логически диаграмма является совокупностью точек, серий и значений серий в точке (рис. 17.12). Как правило, в качестве точек используются моменты или объекты, для которых требуется получить значения характеристик, а в качестве серий - характеристики, значения которых нужно проанализировать. Например, диаграмма продаж видов номенклатуры по месяцам будет состоять из точек - месяцев, серий - видов номенклатуры и значений - оборотов продаж.
знхение серии в тоже Рис. 17.12. Пример диаграммы Для работы с диаграммами предназначен объект встроенного языка Диаграмма. Диаграмма имеет три области, которые позволяют управ- лять оформлением диаграммы: область применения, область заголовка и область легенды (рис. 17.13). Платформа «1 С:Предприятие» поддерживает работу с различными видами диаграмм, в том числе: график (обычный, по шагам, с областями и т. д.); гистограмма (обычная, с накоплением, объемная и т. д.); круговая (обычная и объемная); биржевая (обычная и «свеча»); изометрическая (обычная, непрерывная и т.д.); поверхностная (каркасная, выпуклая, вогнутая поверхность, сотовая и др.); радарная (с областями, с накоплением, нормированная и др.); измерительная диаграмма. Тип диаграммы определяется свойством ТипДиаграммы. Это свойство позволяет представить данные в наиболее удобном для восприятия графи- ческом виде. Любая диаграмма может быть вставлена в структуру отчета как отде- льный элемент и заполнена с помощью системы компоновки данных. Но в данном разделе мы рассмотрим, как заполнять и использовать диаграммы самостоятельно, с помощью методов встроенного языка. Профессиональная разработка в системе «1С:Предприятие 8»
Примеры работы с диаграммами Заполнение данными и отображение диаграммы Для отображения диаграммы в форме необходимо создать реквизит типа Диаграмма и связать его с полем формы вида Поле диаграммы. Затем нужно заполнить данными реквизит, содержащий диаграмму, и определить тип диаграммы (свойство ТипДиаграммы). Следует различать два режима работы диаграммы - связь с источником данных посредством свойства ИсточникДанных и наполнение диаграммы данными при помощи метода УстановитьЗначение(). Данные режимы не могут комбинироваться. ПОДРОБНЕЕ В демонстрационной конфигурации «Средства графического представ- ления данных», прилагающейся к книге на компакт-диске, существует обработка Работа с диаграммой, в которой демонстрируются примеры работы с круговой, измерительной диаграммой и гистограммой. Круговая диаграмма Рассмотрим пример, позволяющий показать данные в круговой диаграмме. Данная диаграмма имеет одну точку и произвольное количество серий. Для большей наглядности ограничим количество выводимых серий диаграммы, при этом оставшиеся серии будут объединяться в общую сводную серию. Для решения этой задачи создадим форму обработки РаботаСДиаграммой и реквизит формы КруговаяДиаграмма типа Диаграмма. Перетащим реквизит в дерево элементов формы и получим поле формы вида Поле диаграммы, связанное с этим реквизитом. Это поле будет отображать диаграмму в форме обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатии которой диаграмма будет заполняться данными. В обработчике команды напишем следующий код (листинг 17.13). Листинг 17.13. Обработчик команды «Сформировать» &На Клиенте Процедура Сформировать(Команда) СформироватьКруговуюДиаграмму(КруговаяДиаграмма); КонецПроцедуры По команде Сформировать вызывается внеконтекстная серверная процедура СформироватьКруговуюДиаграммуО, в которую передается реквизит КруговаяДиаграмма и заполняется данными методом Устано- витьЗначение(), листинг 17.14. Том 2
Щиаграмм^! Листинг 17.14. Процедура «СформироватьКруговуюДиаграммуО» &НаСервереБезКонтекста Процедура СформироватьКруговуюДиаграмму(Диаграмма) // Установить тип диаграммы. Диаграмма.ТипДиаграммы = ТипДиаграммы.КруговаяОбъемная; // Очистить диаграмму. Возможно, ранее в нее уже выводились данные. Диаграмма.Очистить(); // Количество серий будет ограничиваться (не все значения будут показываться). Диаграмма.МаксимумСерий = МаксимумСерий. Ограничено; Диаграмма. МаксимумСерийКоличество = 7; Диаграмма. ВидПодписей = ВидПодписейКДиаграмме.Процент; Диаграмма.ОбластьЗаголовка.Текст = "Обороты номенклатуры"; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Номенклатура, | СУММА(ПродажиКомпанииОбороты.КоличествоОборот) КАК | КоличествоОборот |ИЗ | РегмстрНакопления.Продажи.Обороты(,,,) КАК ПродажиКомпанииОбороты I ^ГРУППИРОВАТЬ ПО | ПродажиКомпанииОбороты.Номенклатура"; Результат = Запрос.Выполнить(); // Запретить обновление диаграммы на время вывода данных. Диаграмма.Обновление = Ложь; // Установить единственную точку. Диаграмма.КоличествоТочек = 1; Диаграмма.Точки[0].Текст = "Количество"; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл // Количество серий, если бы не ограничивали, // зависело бы от результата запроса. КоличествоСерий = Диаграмма.Серии.Количество(); Диаграмма. КоличествоСерий = КоличествоСерий +1; Диаграмма. Серии[КЬличествоСерий].Текст = Выборка.Номенклатура; // Установить значение "на пересечении" точки и серии. // Первый параметр - 0, так как в диаграмме только одна точка. Диаграмма,УстановитьЗначение(0, КоличествоСерий, Выборка.КоличествоОборот); КонецЦикла; // Обновить диаграмму. Диаграмма.Обновление = Истина; КонецПроцедуры
инескогбТпредставленияУданных' В данной процедуре диаграмма очищается, и устанавливается тип диаграммы, а также ограничивается максимальное количество серий диаграммы. Затем выполняется запрос по оборотному регистру накоп- ления Продажи, где данные группируются по номенклатуре и суммируются по полю КоличествоОборот. В процессе обхода выборки результатов запроса диаграмма заполняется данными методом УстановитьЗначение(), где точка одна - Количество, сериями является Номенклатура, а значениями серии в точке - КоличествоОборот. Чтобы не перерисовывать диаграмму каждый раз при установке ее свойств и значений, обновление диаграммы выключается в начале процедуры и включается после того, как диаграмма полностью сформирована. В результате выполнения этого кода будет получена следующая диаграмма (рис. 17.14). Рис. 17.14. Пример круговой диаграммы с данными о продажах номенклатуры Заметим, что специфика круговой диаграммы заключается в том, что она содержит одну точку и некоторое количество серий. В других видах диаграмм для вывода аналогичных данных номенклатуру лучше назна- чать точкам диаграммы (см. следующий пример). Гистограмма В данном примере мы рассмотрим заполнение гистограммы данными о продажах, в которой в качестве точек выбрана номенклатура, а в качестве серий - контрагенты. Кроме того, мы продемонстрируем возможность транспонирования, т. е. перемены местами точек и серий диаграммы.
Для решения этой задачи создадим реквизит формы Гистограмма типа Диаграмма, реквизит Транспонировать типа Булево и перетащим их в дерево элементов формы обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатии которой диаграмма будет заполняться данными. В обработчике этой команды вызывается внеконтекстная серверная процедура СформироватьГистограмму(), в которую передается реквизит Гистограмма и заполняется данными с помощью свойства методом УстановитьЗначение(), листинг 17.15. Листинг 17.15. Процедура «СформироватьГистограммуО» &НаСервереБезКонтекста Процедура СформироватьГистограмму(Диафамма, Транспонирование) // Установить тип диаграммы. Диаграмма.ТипДиаграммы = ТипДиаграммы.ГистограммаОбъемная; // Очистить диаграмму. Возможно, ранее в нее уже выводились данные. Диаграмма.Очистить(); Диаграмма. ВидПодписей = ВидПодписейКДиаграмме.Значение; Диаграмма.ОбластьЗаголовка.Текст = "Обороты номенклатуры"; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, | ПродажиКомпанииОбороты.Номенклатура, | СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот |ИЗ | РешстрНакопления.Продажи.Обороты(&ДатаНачала, ВДатаОкончания) | КАК ПродажиКомпанииОбороты I ^ГРУППИРОВАТЬ ПО | ПродажиКомпанииОбороты.Номенклатура, | ПродажиКомпанииОбороты.Контрагент"; Запрос.УстановитьПараметр("ДатаНачала”, '2011.09.14 00:00:00'); Запрос.УстановитьПараметр(''ДатаОкончания", '2011.09.15 23:59:59'); Результат = Запрос.Выполнить(); // Запретить обновление диаграммы на время вывода данных. Диаграмма.Обновление = Ложь; Выборка = Результат.Выбрать(); Пока Выборка.Следующий() Цикл Если Транспонирование Тогда ТекстТочки = Выборка.Контрагент.Наименование; ТекстСерии = Выборка.Номенклатура.Наименование; Иначе ТекстСерии = Выборка.Контрагент.Наименование; ТекстТочки = Выборка.Номенклатура. Наименование; Профессиональная разработка в системе «1С:Предприятие 8»
КонецЕсли; ТекущаяСерия = 0; СерияНайдена = Ложь; Для Каждого СерияДиаграммы Из Диаграмма.Серии Цикл Если СерияДиаграммы.Тексг = ТекстСерии Тогда СерияНайдена = Истина; Прервать; КонецЕсли; ТекущаяСерия = ТекущаяСерия +1; КонецЦикла; Если НЕ СерияНайдена Тогда Диаграмма.Серии.Добавить(ТекстСерии); КонецЕсли; ТекущаяТочка = 0; ТочкаНайдена = Ложь; Для Каждого ТочкаДиаграммы Из Диаграмма.Точки Цикл Если ТочкаДиаграммы.Текст = ТекстТочки Тогда ТочкаНайдена = Истина; Прервать; КонецЕсли; ТекущаяТочка = ТекущаяТочка +1; КонецЦикла; Если НЕ ТочкаНайдена Тогда Диаграмма.Точки .Добавить(ТекстТочки); КонецЕсли; // Установить значение "на пересечении” точки и серии. Диаграмма.УстановитьЗначение(ТекущаяТочка, ТекущаяСерия, Выборка.СуммаОборот); КонецЦикла; // Обновить диаграмму. Диаграмма.Обновление = Истина; КонецПроцедуры В данной процедуре диаграмма очищается, и устанавливается тип диаграммы. Затем выполняется запрос по оборотному регистру накоп- ления Продажи, где данные группируются по полям Номенклатура и Контрагент и суммируются по полю СуммаОборот. В процессе обхода выборки результатов запроса диаграмма заполняется данными методом УстановитьЗначение(), где точки и серии (Номенклатура или Контрагент) определяются в зависимости от значения флажка Транспонировать, пере- даваемого в процедуру вторым параметром, а значениями серии в точке являются значения поля СуммаОборот. В результате выполнения этого кода будет получена следующая диаграмма (рис. 17.15). При установке флажка Транспонировать будет получена диаграмма, в которой точки и серии меняются местами (рис. 17.16). Том 2
Щиаграмм^! -Г ’>4 Работа с диагрананой -Конфигурация (ЮПредприэтие) Работа с диаграммой Вседействия^ Круговая аиагранаиа Гистограмма Иомерительнаядиаграмма Диагранаиа Ганга Сформдовать ТранспогвроваткО 18000 16000 14000 12000 18000 8000 6000 4000 2000 о Рис. 17.15. Пример гистограммы с данными о продажах номенклатуры Рис. 17.16. Пример гистограммы с данными о продажах номенклатуры
инескогбТпредставленияУданных' Измерительная диаграмма Рассмотрим пример, позволяющий заполнить данные в измерительной диаграмме с помощью свойства ИсточникДанных. Для решения этой задачи создадим реквизит формы Измеритель- наяДиаграмма типа Диаграмма и перетащим его в дерево элементов формы обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатии которой диаграмма будет заполняться данными. В обработчике этой команды вызывается внеконтекстная серверная проце- дура СформироватьИзмерительнуюДиаграммуО, в которую передается реквизит ИзмеритепьнаяДиаграмма и заполняется данными с помощью свойства ИсточникДанных (листинг 17.16). Листинг 17.16. Процедура «СформироватьИэмерительнуюДиаграммуО» &НаСервереБезКонтекста Процедура СформироватьИзмеритвльнуюДиаграмму(Диаграмма) // Настроить свойства диаграммы. Диаграмма.ТипДиаграммы = ТипДиаграммы. Измерительная; Диаграмма.АвтоМаксимальноеЗначение = Ложь; Диаграмма.МаксимальноеЗначение = 20000; ДиаграммаЛвтоМинимвльноеЗначение = Ложь; Диаграмма.МинимальноеЗначение = 0; // Создать три полосы. Полосы = Диаграмма.ПолосыИзмерительнойДиаграммы; НоваяПолоса = Полосы.Добавить(); НоваяПолоса.Начвло = 0; НоваяПолоса.Конец = 3000; НоваяПолоса.ЦветФона = УУеЬЦвета. Красный; НоваяПолоса = Полосы.Добавить(); НоваяПолоса.Начвло = 3000; НоваяПолоса.Конец = 7000; НоваяПолоса.ЦветФона = УУеЬЦветв.Желтый; НоваяПолоса = Полосы .Добавить(); НоваяПолоса.Начвло = 7000; НоваяПолоса.Конец = 20000; НоваяПолоса.ЦветФона = УУеЬЦвета.Звленый; Запрос = Новый Запрос(" ВЫБРАТЬ ПродажиОбороты.Период, ПродажиОбороты.СуммаОборот ИЗ Регистр Накопления.Продажи.Обороты(&ДатвНачала, ЗДатаОкончания, День,) КАК ПродажиОбороты"); Запрос.УстановитьПараметр(”ДатаНачала", '2011.09.14 00:00:00'); Запрос.УстановитьПараметрСДатаОкончания", '2011.09.15 23:59:59'); Диаграмма.ИсточникДанных = Запрос.Выполнить().Выгрузить(); КонецПроцедуры
В процедуре устанавливается тип диаграммы, задается максимальное и минимальное значение ее шкалы, а также настраиваются измерительные полосы диаграммы. Затем выполняется запрос по оборотному регистру накопления Продажи, в котором выбирается поле СуммаОборот с перио- дичностью День. После этого результат запроса выгружается в таблицу значений и становится источником данных для диаграммы. В результате выполнения этого кода будут получены данные о продажах за два дня сентября 2011 года, которые отобразятся в изме- рительной диаграмме двумя стрелками, указывающими на объем продаж (рис. 17.17). Рис. 17.17. Пример измерительной диаграммы с данными о продажах номенклатуры по дням ДИАГРАММА ГАНТА Диаграмма Ганта представляет собой диаграмму интервалов на шкале времени и отражает использование объектами (точками) ресурсов (серий), рис. 17.18. Диаграмма Ганта широко используется для визуализации хода выпол- нения задач, планирования ресурсов, графика рабочего времени и других данных, которые представляются не конкретными числовыми значениями, а набором временных интервалов. Профессиональная разработка в системе «1С:Предприятие 8»
Для работы с диаграммой Ганта предназначен объект встроенного языка ДиаграммаГанта. Точка Интервал 1 I ||Невьмй Значение серия Рис. 17.18. Пример диаграммы Ганта Значение диаграммы Ганта представляет собой специальный объект, который автоматически формируется системой на основании того, какие точки и какие серии определены для данной диаграммы. Этот объект является совокупностью (коллекцией) интервалов, то есть может содер- жать не один, а несколько интервалов, которые соответствуют паре серия-точка (создаваемый по умолчанию объект ЗначениеДиаграммыГанта не содержит ни одного интервала). Разработчик может получить значение диаграммы, указав интересующую его точку и серию, и затем добавить в коллекцию необходимое количество интервалов. Все интервалы всех значений диаграммы располагаются с привязкой к единой оси времени, что дает возможность видеть их взаимное распо- ложение. Для диаграммы Ганта поддерживается возможность установки связей между различными интервалами. Таким образом, окончание одного интервала может быть связано с началом следующего интервала диаграммы. Примеры работы с диаграммой Ганта Рассмотрим пример, позволяющий заполнить данные в диаграмме Ганта, отражающей график дежурств для сотрудников. ПОДРОБНЕЕ Этот пример можно посмотреть в демонстрационной конфигурации «Средства графического представления данных», прилагающейся к книге на компакт-диске, в обработке Работа с диаграммой. Для решения этой задачи создадим реквизит формы ДиаграммаГанта типа ДиаграммаГанта и перетащим его в дерево элементов формы обработки. Том 2
'Диаграмма1Цанта1 Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатии которой диаграмма будет заполняться данными. В обработчике этой команды вызывается внеконтекстная серверная проце- дура СформироватьДиаграммуГанта(), в которую передается реквизит ДиаграммаГанта. Для того чтобы заполнить диаграмму Ганта, необходимо создать нужные серии (в нашем случае это виды дежурств), точки (в нашем случае это сотрудники) и заполнить свойства значений диаграммы для каждой пары точка - серия. Значение диаграммы представляет собой в общем случае совокупность нескольких интервалов. В данном примере каждое значение диаграммы содержит лишь один интервал, для которого задается начало, конец и текст, выводимый в качестве подсказки при наведении курсора мыши на этот интервал (листинг 17.17). Листинг 17.17. Процедура «СформироватьДиаграммуГанта()» &НаСервереБезКонтекста Процедура СформироватьДиаграммуГанта(Диаграмма) Диаграмма.Очистить(); // Запретить обновление диаграммы. Диаграмма.Обновление = Ложь; // Установить заголовок диаграммы. Диаграмма.ОбластьЗаголовка.Текст = "График дежурств"; // Интервал будем определять самостоятельно. Диаграмма.АвтоОпределениеПолногоИнтервала = Ложь; // Установить интервал. Диафамма.УстановитьПолныйИнтервал(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата())); // В диаграмме будет две точки - сотрудники Петров и Сидоров... ТочкаП = Диафамма.УстановитьТочкуС'Петров1'); ТочкаС = Диафамма.УстановитьТочку("Сидоров”); // и две серии - дежурство на вахте и дежурство в центральном офисе. СерияНаВахте = Диаграмма.УстановитьСерию("На вахте"); СерияВЦентре = Диаграмма.УстановитьСерию("В центральном офисе"); // Задать цвета серий, отличные от цвета по умолчанию. СерияНаВахте.Цвет = УУеЬЦвета.Синий; СерияВЦентре.Цвет = УУеЬЦвета.Желтый; ПервыйДень = НачалоМесяца(ТекущаяДата()); // Получить значение диаграммы - дежурство Петрова на вахте. Значение = Диаграмма.ПолучитьЗначение(ТочкаП, СерияНаВахте); // В значении определить новый интервал. Интервал = Значение.Добавить(); Интервал.Текст = "Работает на вахте”; // Определить границы интервала. Интервал.Начало = ПервыйДень; Интервал.Конец = ПервыйДень +10 * 24 * 60 * 60;
инескогбТпредставленияУданных' // Получить значение диаграммы - дежурство Петрова в центральном офисе. Значение = Диаграмма.ПолучитьЗначение(ТочкаП, СерияВЦентре); Интервал = ЗначениеДобавить(); Интерввл.Текст = "Работает в центральном офисе"; Интервал.Начало = ПервыйДень +14 * 24 * 60 * 60; Интерввл.КЬнец = ПервыйДень + 24 * 24 * 60 * 60; // Получить значение диаграммы - дежурство Сидорова на вахте. Значение = Диаграмма.ПолучитьЗначение(ТочкаС, СерияНаВахте); Интервал = ЗначениеДобавить(); Интерввл.Текст = "Работает на вахте"; Интерввл.Начало = ПервыйДень + 5 * 24 * 60 * 60; Интерввл.Конец = ПервыйДень +15 * 24 * 60 * 60; // Получить значение диаграммы - дежурство Сидорова в центральном офисе. Значение = Диаграмма.ПолучитьЗначение(ТочкаС, СерияВЦентре); Интервал = ЗначениеДобавить(); Интерввл.Текст = "Работает в центральном офисе”; Интерввл.Начало = ПервыйДень + 21 * 24 * 60 * 60; Интерввл.Конец = ПервыйДень + 25*24*60* 60; // Обновить диаграмму. Диаграмма.Обновление = Истина; КонецПроцедуры Диаграмма Ганта позволяет размещать на шкале времени непериоди- ческие метки, которые могут использоваться для обозначения контрольных точек или произвольных событий, связанных с отображаемыми в диаграмме данными. В качестве развития данного примера можно добавить в диаграмму две непериодические метки, которые будут обозна- чать события проверки дежурств, выполняемых сотрудниками. Добавим к приведенной процедуре следующий фрагмент кода (листинг 17.18). Листинг 17.18. Добавление непериодических меток ЭлементМеток = Диаграмма.ОбластъПостроения.ШкалаВремени.Элементы.Добавить(); ЭлементМеток.Единица = ТипЕдиницыШкалыВремени.День; // Скрыть периодические метки добавленного элемента. ЭлементМеток.ОтображатьПериодическиеМетки = Ложь; // Установить метку: первая проверка -10 часов утра 9-го числа. ПерваяПроверка = ПервыйДень + 8 * 24 * 60 * 60 +10 * 60 * 60; Метка = ЭлементМеток.Метки.Добавить(ПерваяПроверка); Метка.Текст = "Проверка"; Метка.ЦветТекста = УУеЬЦвета.Красный; Метка.ЦветЛинии = Метка.ЦветТекста; // Установить метку: вторая проверка - 8 часов вечера 23-го числа. ВтораяПроверка = ПервыйДень + 22 * 24 * 60 * 60 + 20 * 60 * 60; Метка = ЭлементМеток.Метки.Добавить(ВтораяПроверка); Метка.Текст = "Проверка"; Метка.ЦветТекста = УУеЬЦвета.Красный; Метка.ЦветЛинии = Метка.ЦветТекста;
Для добавления непериодических меток в процедуре для более нагляд- ного отображения меток используется дополнительный элемент шкалы времени. Те же самые метки можно было бы добавить и в существующий элемент шкалы времени. Также для каждой метки задается текст, цвет надписи и цвет линии, которая будет отображать эту метку в диаграмме. Диаграмма Ганта позволяет выделять цветом фона произвольные интер- валы. Эта возможность может использоваться, например, для «подсветки» выходных дней. Для иллюстрации этой возможности к примеру, приведен- ному в листинге 17.17, можно добавить код, который выделит выходные дни другим цветом фона диаграммы (листинг 17.19). Листинг 17.19. Выделение выходных дней цветом фона Неделя = 3600 * 24 * 7; Выходные = 3600 * 48; МаксимвльнаяДата = ПервыйДень + Неделя * 4; Текущая Дата = ПервыйДень; Пока ТекущаяДата <= МаксимвльнаяДата Цикл; Конец = НачалоНедели(ТекущаяДата); Начало = Конец - Выходные; Выходной = Диаграмма. ИнтерввлыФона.Добавить(Начало, Конец); Выходной.Цвет = УУеЬЦвета.СветлоСерый; ТекущаяДата = ТекущаяДата + Неделя; КонецЦикла; Для выделения выходных дней нужные интервалы добавляются к коллекции интервалов фона диаграммы, и устанавливается светло- серый цвет создаваемых интервалов. В результате выполнения кода, приведенного в листингах 17.17, 17.18, 17.19, будет получена следующая диаграмма, отражающая график дежурств сотрудников, с подсветкой выходных дней и отметкой дней проверок (рис. 17.19). Рис. 17.19. Пример диаграммы Ганта, отражающей график дежурств сотрудников Профессиональная разработка в системе «1С:Предприятие 8»
Диаграмма Ганта позволяет устанавливать связи между различными интервалами диаграммы. Для иллюстрации этой возможности дорабо- таем процедуру, приведенную в листингах 17.17,17.18,17.19, следующим образом (листинг 17.20). Листинг 17.20. Процедура «СформироватьДиаграммуГанта()» &НаСервереБезКонтекста Процедура СформироватьДиаграммуГанта(Диаграмма) Диаграмма.Очистить(); // Запретить обновление диафаммы. Диаграмма.Обновление = Ложь; // Установить заголовок диафаммы. Диафамма.ОбластьЗаголовка.Текст = "График дежурств"; // Интервал будем определять самостоятельно. Диафамма.АвтоОпределениеПолногоИнтервала = Ложь; // Установить интервал. Диафамма.УстановитьПолныйИнтервал(НачвлоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата())); // В диафамме будет две точки - сотрудники Петров и Сидоров... ТочкаП = Диафамма.УстановитьТочкуС'Петров''); ТочкаС = Диафамма.УстановитьТочку("Сидоров"); // и две серии - дежурство на вахте и дежурство в центральном офисе. СерияНаВахте = Диафамма.УстановитьСерию("На вахте”); СерияВЦентре = Диафамма.УстановитьСерию("В центральном офисе"); // Задать цвета серий, отличные от цвета по умолчанию. СерияНаВахте.Цвет = УУеЬЦвета.Синий; СерияВЦентре.Цвет = УУеЬЦвета.Желтый; ПервыйДень = НачалоМесяца(ТекущаяДата()); // Получить значение диафаммы - дежурство Петрова на вахте. Значение = Диафамма.ПолучитьЗначение(ТочкаП, СерияНаВахте); // В значении определить новый интервал. Интервал = ЗначениеДобавить(); // Запомнить интервал начала связи. СвязьИнтервалНачало = Интервал; Интервал.Текст = "Работает на вахте"; // Определить фаницы интервала. Интерввл.Начало = ПервыйДень; Интерввл.Конец = ПервыйДень +10 * 24 * 60 * 60; // Получить значение диафаммы - дежурство Петрова в центральном офисе. Значение = Диафамма.ПолучитьЗначение(ТочкаП, СерияВЦентре); Интервал = ЗначениеДобавить(); // Запомнить интервал окончания связи. СвязьИнтервалКонец = Интервал; Том 2
Диаграмма] Па нта Интервал.Текст = "Работает в центральном офисе"; Интервал.Начало = ПервыйДень +14 * 24 * 60 * 60; Интервал.Конец = ПервыйДень + 24 ‘ 24 * 60 * 60; // Связать два интервала. Связь = СвязьИнтервалНачалоДобавить(СвязьИнтервалКонец); Связь.Цвет = УУеЬЦвета.Синий; // Получить значение диаграммы - дежурство Сидорова на вахте. Значение = Диаграмма. ПолучитьЗначение(ТочкаС, СерияНаВахте); Интервал = Значение.Добавить(); // Запомнить интервал начала связи. СвязьИнтервалНачало = Интервал; Интервал.Текст = "Работвет на вахте"; Интервал.Начало = ПервыйДень + 5 * 24 * 60 * 60; Интервал.Конец = ПервыйДень +15 * 24 * 60 * 60; // Получить значение диаграммы - дежурство Сидорова в центральном офисе. Значение = Диаграмма. ПолучитьЗначение(ТочкаС, СерияВЦентре); Интервал = Значение.Добавить(); // Запомнить интервал окончания связи. СвязьИнтервалКонец= Интервал; Интервал.Текст = "Работает в центральном офисе"; Интервал.Начало = ПервыйДень + 21 * 24 * 60 * 60; Интервал.Конец = ПервыйДень + 25 * 24 * 60 * 60; // Связать два интервала. Связь = СвязьИнтервалНачалоДобавить(СвязьИнтервалКонец); Связь.Цвет = УУеЬЦвета.Синий; // Установить непериодические метки. ЭлементМеток = Диаграмма.ОбластьПостроения.ШкалаВремени.Эле менты .Добавить]); ЭлементМеток.Единица = ТипЕдиницыШкалыВремени.День; II Скрыть периодические метки добавленного элемента. ЭлементМеток.ОтображатьПериодическиеМетки = Ложь; // Установить метку: первая проверка -10 часов утра 9-го числа. ПерваяПроверка = ПервыйДень + 8 * 24 * 60 * 60 +10 * 60 * 60; Метка = ЭлементМеток.Метки.Добавить(ПерваяПроверка); Метка.Текст = "Проверка"; Метка.ЦветТекста = УУеЬЦвета. Красный; Метка.ЦветЛинии = Метка.ЦветТекста; // Установить метку: вторая проверка - 8 часов вечера 23-го числа. ВтораяПроверка = ПервыйДень + 22 * 24 * 60 * 60 + 20 * 60 * 60; Метка = ЭлементМеток.Метки.Добавить(ВтораяПроверка); Метка.Текст = "Проверка"; Метка.ЦветТекста = УУеЬЦвета. Красный; Метка.ЦветЛинии = Метка.ЦветТекста; // Выделить выходные дни другим цветом фона. Неделя = 3600 * 24 * 7; Выходные = 3600 * 48; МаксимальнаяДата = ПервыйДень + Неделя * 4; ТекущаяДата = ПервыйДень;
инескогбТпредставленияУданных' Пока ТекущаяДата <= МаксимальнаяДата Цикл; Конец = НачалоНедели(ТекущаяДата); Начало = Конец - Выходные; Выходной = Диаграмма.ИнтерввлыФона.Добавить(Начало, Конец); Выходной.Цвет = УУеЬЦвета.СветлоСерый; ТекущаяДата = ТекущаяДата + Неделя; КонецЦикла; // Обновить диаграмму. Диаграмма.Обновление = Истина; КонецПроцедуры Для добавления связи необходимо выполнить метод Добавить() того интервала диаграммы, который является началом связи. В качестве пара- метра этого метода необходимо передать интервал диаграммы, который будет являться окончанием этой связи. Кроме этого, можно задать другие свойства связи, например цвет. В результате выполнения кода будет получена следующая диаграмма (рис. 17.20). V? Работа с диаграммой-Конфигурация |ЮПредприягие) Работа с диаграммой Все действия ’ i (?) Круговая диаграмма Измерительная диаграмма I Диаграмма Ганга Рис. 17.20. Связь интервалов диаграммы Ганта, отражающей график дежурств сотрудников Итак, мы рассмотрели пример «ручного» заполнения диаграммы Ганта. В реальных механизмах данные для построения, скорее всего, будут полу- чаться из базы данных, например, из регистра расчета для построения отчета о начислениях сотрудникам. Рассмотрим пример, показывающий заполнение диаграммы Ганта, которая будет отображать для каждого сотрудника фактический период действия записи по каждому из видов расчета, имеющих место для этого сотрудника. Точками диаграммы являются сотрудники, а сериями - виды расчетов. Таким образом, для каждого сотрудника существует некоторое значение диаграммы по каждой из серий, то есть по каждому из видов расчета. ®<а>2
Для построения диаграммы Ганта можно использовать следующий код (листинг 17.21). Листинг 17.21. Процедура «СформироватьНаСервереО» &НаСервереБезКонтекста Процедура СформироватьНаСервере(Диаграмма) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ НачисленияФактическийПериодЦействия.Сотрудник, НачисленияФактическийПериодДействия.ВидРасчета, НачисленияФактическийПериодДействия.ПериодДействияНачало, НачисленияФактическийПериодДействия.ПериодДействияКонец, НачисленияФактическийПериодДействия.Результат, НачисленияФактическийПериодДействия.Регистратор, НачисленияФактическийПериодДействия.Регистратор.Представление ИЗ РегистрРасчета.Начисления.ФактическийПериодДействия КАК НачисленияФактическийПериодДействия"; ВыборкаРезультата = Запрос.Выполнить().Выбрать(); // Запретить обновление диаграммы. Диаграмма.Обновление = Ложь; Диаграмма.Очистить(); Диаграмма.ОтображатьЗаполовок = Ложь; // Заполнить диаграмму. Пока ВыборкаРезультата.Следующий() цикл // Получить серию, точку и значение для них. ТекущаяСерия = Диаграмма.УстановитьСерию(ВыборкаРезультата.ВидРасчета); ТекущаяТочка = Диаграмма.УсгановитьТочку(ВыборкаРезультата.Сотрудник); ТекущееЗначение = Диаграмма.ПолучитьЗначение(ТекущаяТочка, ТекущаяСерия); // Создать нужные нам интервалы в значении. ТекущийИнтервал = ТекущееЗначение.Добавить(); ТекущийИнтервал. Начало = ВыборкаРезультата.ПериодДействияНачало; ТекущийИнтервал.Конец = ВыборкаРезультата.ПериодДействияКонец; ТекущийИнтервал.Текст = ВыборкаРезультата.РегистраторПредставление; ТекущийИнтервал.Расшифровка = ВыборкаРезультата.Регистратор; КонецЦикла; // Раскрасить серии своими цветами. Для Каждого Серия из Диаграмма.Серии Цикл Если Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Оклед Тогда Серия.Цвет = УУЕВЦвета.Желтый; ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Премия Тогда Серия.Цвет = УУЕВЦвета.Зеленый; ИначеЕсли Серия.Значение = ПланыВидовРасчета.ОсновныеНачисления.Невыход Тогда Серия.Цвет = УУЕВЦвета.Красный; КонецЕсли; КонецЦикла; // Разрешить обновление диаграммы. Диаграмма.Обновление = Истина; КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Диаграмма заполняется данными в цикле обхода выборки результата запроса к регистру расчета. Сначала, используя методы УстановитьСерию() и Установить Точку(), получаются либо существующие, либо новые точка и серия. Точки и серии однозначно идентифицируются своими значениями, в качестве которых используются сотрудник и вид расчета из результата запроса. После этого с помощью метода ПолучитьЗначение() получается соответс- твующее точке и серии значение диаграммы. Затем в значение диаграммы добавляется новый интервал, задается его начало и конец, текст интер- вала, который будет показываться во всплывающей подсказке, и задается расшифровка интервала, которая будет выполняться при двойном щелчке мышью на этом интервале. После того как все значения диаграммы сформированы, серии раскра- шиваются своими цветами. Серии диаграммы представляют собой коллекцию значений, которая перебирается при помощи конструкции Для каждого ... Цикл. ГРАФИЧЕСКИЕ СХЕМЫ В этом разделе речь пойдет об использовании графических схем при разработке прикладных решений в системе «1С:Предприятие». Графическая схема (рис. 17.21) позволяет создавать различные организационные, структурные и другие схемы для графического офор- мления прикладного решения. Она предназначена для оформления форм и отчетов, в которых требуется представить те или иные организационные процессы, блок-схемы и пр. Кроме этого, графическая схема может быть использована как отдельный документ, являющийся частью оформления прикладного решения. С помощью графических схем удобно создавать иллюстрации, поясняющие состав тех или иных алгоритмов, структуру тех или иных процессов, организационные схемы и пр. Графическая схема широко применяется при создании карт маршрута бизнес-процессов. ПОДРОБНЕЕ Раздел «Бизнес-процессы. Точки маршрута», стр. 60. Однако графические схемы можно использовать для рисования любых произвольных схем и алгоритмов, иллюстрирующих рабочие процессы в организации. В этой главе мы рассмотрим, как использовать графические схемы в формах и отчетах и обращаться к ним с помощью встроенного языка. Том 2
ГрафинескиеТсхем^! Рис. 17.21. Графическая схема Основы работы с графической схемой Для того чтобы создать новую схему, необходимо выбрать пункт Новый в меню Файл конфигуратора «1С:Предприятия» и в появившемся окне указать тип документа Графическая схема (рис. 17.22). Выбор вида документа Г1 Текстовый документ S Картинка Таб/мчньй документ Внешняя обработка .0 Внешний отчет gS HTML документ I I | Отмена | Рис. 17.22. Создание новой графической схемы «1С:Предприятие» создаст новый документ графической схемы. Чтобы добавить новые элементы в схему, можно использовать панель Вставка элементов схемы, которая по умолчанию размещается в нижней части окна конфигуратора, но, как и любая панель инструментов, может быть размещена в любом его месте (рис. 17.23). рис -17 23. Паналь элементов графической схемы Для рисования произвольных графических схем удобно использовать элемент схемы Декорация ®>. По умолчанию декорация имеет форму прямоугольника, но можно изменить форму декорации, задав свойство Фигура (рис. 17.24). g<0>®
инескогбТпредставленияУданных' Свойства: Декорация si [xI'B। х - Г иперосылка О ▼Характеристики: Г оризонтальноеПоло ВертикальноеПолож» Подсказка X 'Оформление: ЦветФона ЦветЛинии ЦветТекста Шрифт ПоложениеКартинки ПрозрачныйФон Картинка РаэмерКартинки Нет □ Блок Сз Папка , D Файл_____________ ГИИ1Г Стрелка вправо Стрелка влево Стрелка вверх Стрелка вниз Стрелка вверх-вниз Стрелка влево-вправо Скобки вертикальные Скобки горизонтальные О Эллипс О 0 'Расположение: Рис. 17.24. Свойства элемента «Декорация» графической схемы Используя свойства Картинка, ПоложениеКартинки и РаэмерКартинки, можно задать для декорации картинку, установить ее положение и размер (рис. 17.25). Свойства: Декорация si|W* * ▼ Основные: Имя [Поставщики________________________ Заголовок [Поставка товараот поставщиков Гиперссылка О ▼ Характеристики: Г оризонгальноеПоложение [Ценц»фовать ВертикальноеПоложение [Центрцювать Подсказка | ▼Оформление: ЦветФона [□Дето ~ ЦветЛинии [□ стиль: Рамка ЦветТекста [И стиль: Текст формы Шрифт [Двто_________________ ПоложениеКартинки [ I Лево_____________ ПрозрачныйФон О ____________________L Выбор картинки X Библиотека Выбранная картинка Добавить новый элемент Соадатьэлеменг списка Добавить новый элемен... Удалить текущий элемент Удалить текущий элемент Изменить (или открыть)... и-------I----------» 46x48 |[ Выбрать из Файла i| | Очистить | | Сохранить | | ОК || Отмена | | Справка | РаэмерКартижи Фигура ▼ Расположение: Лево | 260| йнпптэ I 4П1 - *1 [ДвтоРазмер_______ [□ Блок Верх | 40| Ширина | 200| Рис. 17.25. Свойства элемента «Декорация» графической схемы Для соединения элементов схемы используется элемент Декоративная линия 4. По умолчанию линия сплошная, но можно изменить тип линии, задав свойство Линия (рис. 17.26). Также можно управлять видом стрелок декоративной линии, используя свойства СтрепкаНачала и СтрелкаКонца.
Свойства: Декоративная линия X Рис. 17.26. Свойства элемента «Декоративная линия» графической схемы Итак, используя описанные выше приемы, создадим графическую схему, описывающую работу склада по приему, учету и отгрузке товара (рис. 17.27). Осена работы складского комплекса распределительного тив Поставка товара от поставщжов Данные о составе Фур Разгрузка Фур Дополнительная информация о товаре Проверка по колгчесгеу и качеству J Выбраковка, составление П актов приемки Приходование товара в складской системе Занесение в адресную систему Выставление претензий Перемещение товара е эону готовых отборок (в коробах) Заказы. Расходные ордера I _ - - . J ► Сборка заказов Зона готовых отборок (экспедиция) Дажые в отдел транспортной логистики Загрузка машин Поставка товара клиентам Рис. 17.27. Графическая схема работы склада Профессиональная разработка в системе «1С:Предприятие 8»
Далее мы покажем пример использования этой схемы в прикладном решении «1С:Предприятия». Эту схему можно найти на приложенном диске, в каталоге Files. Сама схема будет храниться в файле *.grs, и затем в режиме Конфигуратор ее можно будет открыть (Файл ► Открыть) и отредактировать. Примеры работы с графической схемой Следует иметь в виду, что полностью работа с графической схемой средс- твами встроенного языка недоступна, поэтому в данном разделе будут рассмотрены только некоторые возможности такой работы. Для работы с графической схемой предназначен объект встроенного языка ГрафическаяСхема. Чтобы отобразить графическую схему в форме, необходимо создать реквизит типа ГрафическаяСхема и связать его с полем формы вида Поле графической схемы. ПОДРОБНЕЕ В демонстрационной конфигурации «Средства графического представ- ления данных», прилагающейся к книге на компакт-диске, существует обработка Работа с графической схемой, в которой можно посмотреть пример работы с графической схемой. Допустим, нам требуется разместить в форме (обработки или отчета) созданную ранее графическую схему и программно обрабатывать интер- активный выбор какого-либо элемента схемы. Для решения этой задачи создадим форму обработки РаботаСГрафичес- койСхемой и реквизит формы ГрафическаяСхема типа ГрафическаяСхема. Перетащим реквизит в дерево элементов формы и получим поле формы вида Поле графической схемы, связанное с этим реквизитом. Это поле будет отображать графическую схему в форме обработки. Затем создадим команду ОтобразитьСхему и соответствующую ей кнопку формы, по нажатии которой графическая схема методом Прочитать() будет загружаться из файла *.grs. В обработчике команды напишем следующий код (листинг 17.22). Листинг 17.22. Обработчик команды «ОтобразитьСхему» &На Клиенте Процедура ОтобразитьСхему(Команда) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Заголовок = "Выбрать схему из файла"; Диалог.Фильтр = "Графические схемы (*.grs)|*.grs|Bce файлы (*.*)!*.*"; Диалог.ИндексФильтра = 0; Диалог.МножественныйВыбор = Ложь; Диалог.Расширение = "grs"; Если не Диалог.Выбрать() Тогда Возврат; КонецЕсли; ГрафическаяСхема.Прочитать(Диалог,ВыбранныеФайлы[0]); КонецПроцедуры Том 2
ГрафййёскиёТсхемы Методом ПолучитьКартинкуО можно получить изображение графической схемы в форматах *.bmp, *.рпд (листинг 17.23). Листинг 17.23. Обработчик команды «ПолучитьКартинку» &НаКлиенте Процедура ПолучитьКартинку(Команда) Диалог = Новый ДивлогВыбораФайла(РежимДивлогаВыбораФайла.Сохранение); Диалог.Заголовок = "Сохранить схему в файл"; Диалог.Фильтр = "Картинки (*.bmp)|*.bmp|Bce файлы (*-*)!*-*”; Дивлог.ИндексФильтра = 0; Диалог.МножественныйВыбор = Ложь; Диалог.Расширение = "bmp"; Если не Диалог.Выбрать() Тогда Возврат; КонецЕсли; Картинка = ГрафическаяСхема.ПолучитьКартинку(,, ФорматКартинки.ВМР); Картинка.Записать(Диалог.ВыбранныеФайлы[0]); КонецПроцедуры Загруженную графическую схему можно отредактировать с помощью палитры свойств выделенного элемента. Затем отредактированную схему методом Записать!) можно сохранить в файл *.grs. ПОДРОБНЕЕ Синтакс-помощник: Общие объекты — Графическая схема. Теперь обеспечим программную обработку выбора пользователем како- го-либо элемента схемы. Для этого создадим обработчик события Выбор поля формы, содержащего графическую схему, и заполним его следу- ющим образом (листинг 17.24). Листинг 17.24. Обработчик события «Выбор» поля графической схемы &НаКлиенте Процедура ГрафическаяСхемаВыбор(Элемент) ЭлементСхемы = Элементы. ГрафическаяСхема.ТекущийЭлемент; ИмяЭлемента = ЭлементСхемы.Имя; Если ТипЗнч(ЭлементСхемы)= Тип("ЭлементГ рафическойСхемыДекорация") Тогда Если ИмяЭлемента = "Поставщики" Тогда ОткрытьФорму(”Справочник.Контрагенты.ФормаСписка”); ИначеЕсли ИмяЭлемента = "Покупатели" Тогда ОткрытьФорму("Справочник.Контрагенты.ФормаСписка"); ИначеЕсли ИмяЭлемента = "РасходныеНакладные” Тогда ОткрытьФорму("Документ.РасходнаяНакладная.ФормаСписка") ИначеЕсли ИмяЭлемента = "Сборка" ИЛИ ИмяЭлемента = "Разгрузка" ИЛИ ИмяЭлемента = "Загрузка” Тогда ЭлементСхемы.ЦветФона = УУЕВЦветаЛососьСветлый; КонецЕсли; КонецЕсли; КонецПроцедуры ®<0>§
инескогбТпредставленияУданных' Событие Выбор у поля графической схемы возникает при двойном щелчке мыши (нажатии клавиши Enter) на элементе графической схемы. В обработчике события анализируется тип текущего элемента графи- ческой схемы (Элементы.ГрафическаяСхема.ТекущийЭлемент) и его имя. В данном примере рассматриваются только элементы графической схемы с типом Декорация (ТипС'ЭлементГрафическойСхемыДекорация")). Если имя декорации Поставщики или Покупатели, то для просмотра откры- вается форма списка справочника Контрагенты. Если выбрана декорация с именем РасходныеНакладные, то открывается форма списка документа Расходная накладная. Для демонстрации возможностей программного изменения свойств элемента графической схемы, при выборе некоторых декораций, у них меняется цвет фона. Можно также программно изменить фигуру, рисунок и другие свойства декорации. Проверим результат. Вызовем обработку Работа с графической схемой и нажмем кнопку Отобразить графическую схему. Загрузим схему из файла Схема работы складского комплекса.дге. Двойным щелчком мыши выделим на схеме элемент Поставка товара от поставщиков (с именем Поставщики). В результате будет открыта форма списка справочника Контрагенты (рис. 17.28). Рис. 17.28. Обработка «Работа с графической схемой»
табличный документ В этом разделе речь пойдет об использовании табличного документа при разработке прикладных решений в системе «1С:Предприятие». Табличный документ «1С:Предприятия» является одним из основных средств для создания различных выходных форм и представления итоговых данных. Он может быть получен из файла табличного документа, сохранен в файлы различных форматов. Табличный документ может быть размещен в форме или в макете, работа с ним возможна средствами встро- енного языка (рис. 17.29). Рис. 17.29. Схема использования табличного документа Он может содержать вложенные таблицы, картинки, различные элементы управления, может использоваться для ввода данных. Табличный доку- мент поддерживает механизм расшифровок для получения связанных отчетов, открытия форм и иных действий. ПОДРОБНЕЕ В демонстрационной конфигурации «Средства графического представ- ления данных», прилагающейся к книге на компакт-диске, существует обработка Работа с табличным документом, в которой можно посмотреть некоторые примеры работы с табличным документом. Общие свойства табличного документа Можно сказать, что табличный документ состоит из строк и колонок, на пересечении которых располагаются ячейки. Общее оформление табличного документа определяется несколькими свойствами. Прежде всего, это свойства ОтображатьЗаголовки и ОтображатьСетку. По умолчанию при создании нового табличного документа эти свойства имеют значение Истина (листинг 17.25), поэтому табличный документ имеет вид, представленный на рис. 17.30. Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 17.25. Отображение заголовков и сетки табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.Показать(); Рис. 17.30. Отображение заголовков и сетки При необходимости разработчик может управлять отображением как заго- ловков, так и сетки документа (листинг 17.26). Внешний вид табличного документа с заголовками представлен на рис. 17.31. Листинг 17.26. Отображение заголовков табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; ТабДок.Показать(); Рис. 17.31. Отображение заголовков Пример отображения только сетки табличного документа представлен в листинге 17.27. Внешний вид документа с сеткой показан на рис. 17.32. Листинг 17.27. Отображение сетки табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьЗаголовки = Ложь; ТабДок.Показать(); Рис. 17.32. Отображение сетки Если оба свойства, ОтображатьЗаголовки и ОтображатьСетку, установить в значение Ложь (листинг 17.28), то табличный документ будет иметь вид, представленный на рис. 17.33. Листинг 17.28. Табличный документ без отображения заголовков и сетки ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьЗаголовки = Ложь; ТабДок.ОтображатьСетку = Ложь; ТабДок.ПоказатьО; Том 2
[Габлинш^йРдокумент ® z ы Tri & La ' w ' И ?’ - □ X Рис. 17.33. Табличный документ без заголовков и сетки Если заголовки табличного документа отображаются, разработчик может управлять цветом текста и цветом фона заголовков. Для этого используются свойства табличного документа ЦветТекстаЗаголовков и ЦветФонаЗаголовков, которые имеют значения типа Цвет. По умолчанию эти свойства имеют значения, соответствующие цветам текста формы и фона формы из стиля, используемого в качестве основного для конфигу- рации (свойство Основной стиль). Табличный документ позволяет фиксировать первые строки и колонки. Такую возможность удобно использовать для просмотра больших таблиц. В этом случае можно зафиксировать, например, шапку таблицы, и при вертикальной прокрутке документа она всегда будет присутствовать в верхней части видимой области документа. Для того чтобы задать количество фиксируемых строк или колонок, используются свойства табличного документа ФиксацияСверху и Фикса- цияСлева. Они принимают значения типа Число, которые указывают количество фиксируемых строк или колонок. Например, можно зафиксировать три строки и четыре колонки доку- мента (листинг 17.29). В этом случае при горизонтальной и вертикальной прокрутке документа первые четыре колонки и первые три строки всегда будут присутствовать в окне документа (рис. 17.34). Листинг 17.29. Использование горизонтальной и вертикальной фиксации в табличном документе ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; ТабДок.ФиксацияСверху = 3; ТабДок.ФиксацияСлева = 4; ТабДок.Показать(); Для оформления табличного документа может использоваться фоновый рисунок. Этот рисунок будет располагаться «под» текстом документа и может быть как зафиксирован (то есть при любой прокрутке документа
инескогбТпредставленияУданных' фоновый рисунок перемещаться не будет), так и не зафиксирован. При этом фоновый рисунок при прокрутке документа будет перемещаться вместе с ячейками табличного документа. Для задания фонового рисунка используется свойство табличного документа ФоноваяКартинка, имеющее тип Картинка. Для управления фиксацией фоновой картинки используется свойство ФиксированныйФон, имеющее тип Булево. По умолчанию фон не зафиксирован (свойство имеет значение Ложь). Пример добавления картинки и фиксации фона табличного документа приведен в листинге 17.30. Листинг 17.30. Использование фиксированной фоновой картинки в табличном документе ТабДок = Новый ТабличныйДокумент(); Картинка = Новый Картинка(”С:\Рю1рпд"); ТабДок.ФоноваяКартинка = Картинка; ТабДок.ФиксированныйФон = Истина; ТабДок.Показать(); Табличный документ может быть отображен на экране в окне редактора табличных документов. При этом можно управлять видом отображения: цветной или черно-белый. Черно-белый вид отображения может исполь- зоваться для того, чтобы оценить, например, внешний вид цветного документа, распечатанного на черно-белом принтере. Для управления видом отображения табличного документа использу- ется свойство ЧерноБелыйПросмотр. По умолчанию это свойство имеет значение Ложь, то есть документ отображается в цветном виде. Ячейки и области табличного документа могут быть защищены от редак- тирования, так же как и весь документ. Для того чтобы защитить весь документ, следует использовать свойство ТолькоПросмотр. Если его установить в значение истина, то можно будет редактировать только те ячейки, для которых свойство Защита не установлено. По умолчанию для всех ячеек табличного документа свойство Защита имеет значение Истина, а для самого документа - Ложь. Также независимо от свойств отдельных ячеек можно запретить редакти- рование и копирование табличного документа. Для этого следует свойство Защита документа установить в значение Истина. В том случае, если редактирование табличного документа разрешено, можно задать направление перехода после редактирования значения очередной ячейки. Для этого используется свойство НаправлениеПерехода, которое принимает значения системного перечисления ТипНаправленияПе- реходаТабличногоДокумента. По умолчанию значение этого свойства равно ПоКолонкам, но разработчик может задать также значения ПоСтрокам и БезПерехода. В последнем случае, после того как нажата клавиша Enter, положение текущей области табличного документа изменяться не будет. g<0>®
Табличный документ может быть прочитан из файла табличного доку- мента. Для этого используется метод Прочитать(). В качестве параметра передается строка, содержащая путь к файлу табличного документа. Чтобы отобразить табличный документ в окне редактора табличных документов, используется метод Показать(). В качестве параметров этого метода передается заголовок окна, который будет установлен при открытии документа, путь к сохраняемому файлу и признак активизации открываемого окна. Для обеспечения привычного поведения открытого файла при вызове метода Показать() обязательно должен быть указан путь для сохранения измененного файла. Тогда если пользователь модифицировал документ, при закрытии окна редактора будет задан вопрос о необходимости сохра- нения измененного файла. Если при вызове метода Показать() путь не указан, то окно редактора, содержащего модифицированный документ, будет закрываться без вопросов и изменения, выполненные пользователем, будут потеряны. Признак активизации по умолчанию имеет значение Истина. Таким образом, окно, содержащее открытый табличный документ, становится активным, открывается поверх существующих окон. Если установить его в значение Ложь, то активным будет оставаться то окно, из которого была вызвана обработка (листинг 17.31). Листинг 17.31. Открытие табличного документа без активизации окна &НаКлиенте Процедура ПрочитатьДокумент(Команда) ДдресВременногоХранилища = ПоместитьФайл(АдресВременногоХранилища, "САОтчет ПродажиПоРегионам.тхГ,Ложь); ТабДок = ЧтениеТабличногоДокумента(АдресВременногоХранилища); ТабДок.Показать("Продажи по регионам”, "САОтчет ПродажиПоРегмонам_№щ.тхГ, Ложь); КонецПроцедуры Поскольку метод табличного документа Прочитать() исполняется на сервере, то документ сначала помещается во временное хранилище и адрес данных в хранилище передается во внеконтекстную серверную функцию ЧтениеТабличногоДокумента(), листинг 17.32, в которой доку- мент получается из временного хранилища, записывается во временный файл и производится чтение документа. Листинг 17.32. Чтение табличного документа на сервере &НаСервереБезКонтекста Функция ЧтениеТабличногцДокумента(АдресДокументаВХранилище) ДанныеДокумента = ПолучитьИзВременногоХранилища(АдресДокументаВХранилище); ИмяДокумента = КаталогВременныхФайлов() + "temp.mxl"; ДанныеДокумента.Записать(ИмяДоку мента); ТабДок = Новый ТабличныйДокумент(); ТабДок.Прочитать(ИмяДокумента); Возврат ТабДок; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
Затем считанный табличный документ возвращается на клиента и там показывается методом Показать(). Табличный документ является полно- стью интерфейсным объектом и отображается только на клиенте. Открытое окно табличного документа может быть скрыто - для этого используется метод Скрыть() табличного документа. Скрытое окно может быть снова отображено с помощью метода Показать(). Запись табличного документа в файл можно выполнить с помощью метода Записать(). При этом необходимо указать путь к записывае- мому файлу, а также можно указать и формат создаваемого файла. По умолчанию файл будет записан в формате табличного документа «1С:Предприятия» (*.mxl), но также поддерживаются и другие форматы файлов. Формат файла задается с помощью системного перечисления ТипФайлаТабличногоДокумента (табл. 17.1). Таблица 17.1. Значения системного перечисления «ТипФайлаТабличногоДокумента» Значение Описание ANSITXT Формат текстового файла в кодировке ANSI DOCX Формат файла *.docx Word 2007 HTML Файл в формате HTML последней версии, поддерживаемой «1С:Предприятием» HTML3 Формат файла HTML версии 3 HTML4 Формат файла HTML версии 4 MXL Файл табличного документа «1С:Предприятия» MXL7 Файл табличного документа «1С:Предприятия» версии 7.7 ODS Электронная таблица ODF TXT Текстовый файл XLS Файл в формате Microsoft Excel, используемом по умолчанию XLS95 Файл в формате Microsoft Excel 95 XLS97 Файл в формате Microsoft Excel 97 XLSX Формат файла *.xlsx Excel 2007 Для табличного документа, открытого для просмотра, могут быть уста- новлены различные свойства, влияющие на его отображение, например отображение заголовков, сетки документа, отображение групп, отобра- жение именованных строк/колонок и т. д. Для того чтобы при повторном открытии документа эти свойства также были применены к документу, используется установка свойства документа СохранятьСвойстваОтобра- жения в значение Истина. По умолчанию это свойство имеет значение Ложь. Табличный документ имеет два свойства. В процессе редактирования или заполнения документа они позволяют определить размеры области табличного документа, которая содержит или может содержать данные. Это свойства ВысотаТаблицы и ШиринаТаблицы. Оба свойства доступны только для чтения и содержат соответственно количество строк и коли- чество колонок в таблице. Том 2
|[Габлинн£|йУдокумент| По умолчанию (при создании нового табличного документа) оба свойства имеют значение 0. В процессе редактирования или заполнения табличного документа они изменяют свои значения так, чтобы показывать реальное количество строк или колонок документа, которые заполнены данными. При интерактивном редактировании табличного документа область ячеек табличного документа, ограниченная значениями ВысотаТаблицы и Шири- наТаблицы, выделяется пунктирными линиями (рис. 17.35). Рис. 17.35. Высота и ширина таблицы При очистке значений строк или колонок значения свойств ВысотаТаб- лицы и ШиринаТаблицы не изменяются (рис. 17.36). Рис. 17.36. Высота и ширина таблицы В приведенном примере данные пятой колонки были очищены, однако ширина таблицы осталась равной 5. Для того чтобы свойство ШиринаТаблицы приняло значение 4 (в соответствии с реально заполнен- ными ячейками), необходимо удалить пятый столбец. В противном случае будет считаться, что этот столбец принадлежит таблице, т. к. может содер- жать, например, некоторое оформление, необходимое для документа. Области табличного документа Основной логической частью табличного документа, с которой осущест- вляется работа, является область ячеек табличного документа, или сокращенно просто область. Область может представлять собой как отдельную ячейку документа, так и совокупность нескольких ячеек, соответствующую определенным правилам. В качестве области может выступать: одна или несколько соседних строк; одна или несколько соседних колонок;
инескогбТпредставленияУданных' группа ячеек, находящихся на пересечении одной или нескольких соседних строк с одной или несколькими соседними колонками. Для обращения к области ячеек табличного документа используется метод табличного документа Область(). Этот метод позволяет обращаться к конкретным областям табличного документа, причем поддерживается обращение в нескольких вариантах. Обращение к области ячеек Обращение по номерам строк и колонок В этом варианте в параметрах метода перечисляются номера строк и колонок, которые образуют нужную область (листинг 17.33). Листинг 17.33. Синтаксис получения области по номерам строк и колонок Область(<номер первой строки», <номер первой колонки», I <номер последней строки», <номер последней колонки»)| Пример указания прямоугольной области на пересечении 2—4 строк и 2—4 колонок представлен в листинге 17.34. В результате выполнения этого примера получается область типа ОбластьЯчеекТабличногоДокумента, показанная на рис. 17.37. Листинг 17.34. Получение прямоугольной области табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; НоваяОбласть = ТабДок.Область(2,2,4,4); НоваяОбласть.Имя = "НоваяОбласть”; ТабДок.Показать(); S Новый! * . □ X Рис. 17.37. Прямоугольная область ПРИМЕЧАНИЕ Области, показанные на рисунках 17.37-17.40, выделены в табличном документе для визуального представления, а не как результат выпол- нения кода. Пример указания области, состоящей только из 2—4 строк, представлен в листинге 17.35. В результате выполнения этого примера получа- ется область типа ОбластьЯчеекТабличногоДокумента, показанная на рис. 17.38.
Листинг 17.35. Получение области, состоящей из строк табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; НоваяОбласть = ТабДок.Область(2,, 4); НоваяОбласть.Имя = "НоваяОбласть"; ТабДок.Показать(); & Новый! “____________________________________________ □ X I I 1 I 2 I 3 I 4 I 5 I I 1 I НовеяОбла< 2 I I 3 I I 4 I I 5 I I S I I 7 I Рис. 17.38. Область строк Пример указания области, состоящей только из 2—4 колонок, пред- ставлен в листинге 17.36. В результате выполнения этого примера получается область типа ОбластьЯчеекТабличногоДокумента, показанная на рис. 17.39. Листинг 17.36. Получение области, состоящей из колонок табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; НоваяОбласть = ТабДок.Область(, 2,, 4); НоваяОбласть.Имя = "НоваяОбласть"; ТабДок.Показать(); Рис. 17.39. Область колонок Пример указания области, состоящей из одной ячейки, представлен в листинге 17.37. В результате выполнения этого примера получа- ется область типа ОбластьЯчеекТабличногоДокумента, показанная на рис. 17.40. Листинг 17.37. Получение области, состоящей из одной ячейки табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; НоваяОбласть = ТабДок.Область(2,4); НоваяОбласть.Имя = "Новая область"; ТабДок.Показать(); Профессиональная разработка в системе «1С:Предприятие 8»
В Новый! ' Рис. 17.40. Область, состоящая из одной ячейки Обращение по адресу Обращение к области может быть выполнено также и по адресу области (листинг 17.38). Листинг 17.38. Синтаксис получения области по едресу Область(<адрес области») | Адрес области указывается координатами левого верхнего и правого нижнего углов области в формате R1C1:R2C2. Число после R обозначает номер строки, число после С - номер колонки, символом «:» (двое- точие) разделяются координаты левого верхнего и правого нижнего угла области. Пример обращения к прямоугольной области на пересечении 2—4 строк и 2—4 колонок показан в листинге 17.39. Листинг 17.39. Получение прямоугольной области табличного документа ТабДок = Новый ТабличныйДокумент(); I НоваяОбласть = ТабДок.Область("К2С2:Н4С4");| Пример обращения к области, состоящей из 2-4 строк, показан в листинге 17.40. Листинг 17.40. Получение области, состоящей из строк табличного документа ТабДок = Новый ТабличныйДокумент(); I НоваяОбласть = ТабДок.Область("К2Я4"); | Пример обращения к области, состоящей из 2—4 колонок, показан в листинге 17.41. Листинг 17.41. Получение области, состоящей из колонок табличного документа ТабДок = Новый ТабличныйДокумент(); I НоваяОбласть = ТабДок.ОбластъСС2:С4");| Пример обращения к области, состоящей из одной ячейки, которая нахо- дится на пересечении второй строки и четвертой колонки, представлен в листинге 17.42. Том 2
|[Габлинн£|йУдокумент| Листинг 17.42. Получение области, состоящей из одной ячейки табличного документа ТабДок = Новый ТабличныйДокумент(); НоваяОбласть = ТабДок.ОбластьСН2С4"); Обращение по имени Любая область табличного документа может иметь уникальное имя. Имя области может быть задано при визуальном редактировании доку- мента в редакторе табличных документов или программно. По умолчанию любая область имеет имя, совпадающее с ее адресом. Однако разра- ботчик имеет возможность присвоить области собственное, уникальное в пределах данного табличного документа имя. Для этого используется свойство области ячеек табличного документа Имя. Для управления отображением именованных областей служат две команды редактора табличных документов. Команда Таблица ► Имена к Отображение именованных строк/колонок позволяет отобра- зить имена областей, которые являются совокупностью соседних строк или соседних колонок. Команда Таблица к Имена к Отображать имено- ванные ячейки позволяет отобразить имена прямоугольных областей табличного документа. Из встроенного языка управление отображе- нием имен областей недоступно. Пример обращения к области по имени представлен в листинге 17.43. Листинг 17.43. Получение области табличного документа по имени ТабДок = ПолучитьМакетДокумента(”Макет"); НоваяОбласть = ТабДок.Область("НоваяОбласть"); Области, для которых заданы имена, отличные от имен по умолчанию, входят в коллекцию именованных областей табличного документа. Доступ к этой коллекции возможен через свойство табличного документа Области. Обход коллекции именованных областей возможен с помощью итератора Для Каждого ... Из ... Цикл. Пример перечисления всех имено- ванных областей, содержащихся в табличном документе, представлен в листингах 17.44, 17.45. Листинг 17.44. Перебор именованных областей табличного документа &НаКлиенте Процедура МакетДокумента(КЬманда) ТабДок = ПолучитьМакетДокумента("Макет"); ИменованныеОбласти = ТабДок.Области; Сообщение = Новый СообщениеПользователю; Для Каждого Область из ИменованныеОбласти Цикл Сообщение.Текст = Областъ.Имя; Сообщение.Сообщить(); КонецЦикла; КонецПроцедуры 33TI
инескогбТпредставленияУданных' Поскольку метод глобального контекста ПолучитьОбщийМакет() исполня- ется на сервере, то сначала вызывается внеконтекстная серверная функция ПолучитьМакетДокумента(), в которую передается имя макета таблич- ного документа (листинг 17.45). Затем макет возвращается на клиента, где в цикле обходятся элементы коллекции именованных областей таблич- ного документа и выводятся пользователю. Листинг 17.45. Перебор именованных областей табличного документа &НаСервереБезКЬнтекста Функция ПолучитьМакетДокумента(ИмяМакета) Возврат ПолучитьОбщийМакет(ИмяМакета); КонецФункции Кроме этого, для коллекции именованных областей доступны методы получения индекса области (Индекс()), получения количества имено- ванных областей (Количество()), поиска по имени области (Найти()) и получения области по индексу (ПолучитьО). ВНИМАНИЕ! Следует заметить, что в коллекцию именованных областей табличного документа входят также и рисунки табличного документа, для которых заданы имена, отличные от имен по умолчанию. О рисунках более подробно рассказывается в разделе «Рисунки табличного документа», стр. 381. Обращение к пересечению областей Помимо явного указания области по имени или в виде адреса, можно обращаться к пересечению двух областей. В этом случае синтаксис вызова метода Область() выглядит следующим образом (листинг 17.46). Листинг 17.46. Синтаксис получения области как пересечения именованных областей Область(<имя области 1 >|<имя области 2>) | В качестве имени области может быть использовано имя по умолчанию (адрес) или имя, назначенное разработчиком. Например, если в табличном документе определены две области - Гори- зонтальнаяОбласть и ВертикальнаяОбласть (рис. 17.41), то обратиться к их пересечению можно так, как это показано в листинге 17.47.
Листинг 17.47. Получение области табличного документа на пересечении двух областей ТабДок = ПолучитьМакетДокумента("Макет”); НоваяОбласть = ТабДок.Область(ТоризонтальнаяОбласгь|ВертикальнаяОбластьп); Общие свойства областей Область ячеек табличного документа обладает набором свойств и методов, которые позволяют оформить ее и получить характеристики области. Свойство Имя позволяет получать и изменять имя области. Свойство ТипОбласти предназначено для чтения и содержит значения системного перечисления ТипОбластиЯчеекТабличногоДокумента. Если область представляет собой совокупность строк или колонок, то ТипОбласти будет содержать, соответственно, значения Строки или Колонки. Если область прямоугольная, то в этом свойстве будет значение Прямоугольник. Если область представляет собой весь табличный доку- мент, то тогда значение свойства ТипОбласти будет равно Таблица. Для определения координат имеющейся области служат свойства Верх, Лево, Низ и Право. Они доступны только для чтения и содержат номера соответственно первой строки, первой колонки, последней строки и последней колонки области. Если область состоит из строк, то тогда свойства Лево и Право будут иметь значение 0. Если область состоит из колонок, то в этом случае свойства Верх и Низ будут равны нулю. Оформление областей Скрытие областей Области, состоящие из строк или колонок, могут быть скрыты при отоб- ражении табличного документа в окне редактора табличных документов. Для этого используется свойство Видимость, значение которого необхо- димо установить в Ложь. По умолчанию для всех областей табличного документа свойство Видимость имеет значение Истина. Например, скрыть 2—4 колонки можно с помощью кода, представленного в листинге 17.48. Листинг 17.48. Скрытие колонок табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; НоваяОбласть = ТабДок.Область(, 2, ,4); НоваяОбласть.Видимость = Ложь; ТабДок.Показать(); В результате табличный документ будет иметь вид, представленный на рис. 17.42. Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 17.42. Колонки 2-4 скрыты Защита областей Области табличного документа могут быть защищены, для этого использу- ется свойство Защита. Использование этого свойства имеет смысл только вместе со свойством самого табличного документа Защита. Если у таблич- ного документа свойство Защита установлено в значение Истина, то в окне редактора табличных документов пользователю будет недоступно редак- тирование тех областей табличного документа, для которых свойство Защита также установлено в значение Истина. По умолчанию свойство Защита имеет значение Истина для всех областей табличного документа. Высота строк Свойства ВысотаСтроки и АвтоВысотаСтроки позволяют задать различные варианты расчета высоты строк, участвующих в области табличного документа. В зависимости от значения свойства АвтоВысотаСтроки свойство Высо- таСтроки определяет либо собственно фиксированную высоту строки (АвтоВысотаСтроки = Ложь), либо максимальную высоту строки (АвтоВы- сотаСтроки = Истина). Высота строки задается в пунктах. Если свойство ВысотаСтроки имеет значение 0, то свойство АвтоВысо- таСтроки имеет значение Истина, и изменить его присвоением другого значения невозможно. Это значит, что высота строки будет установлена автоматически, в зависимости от текста, который содержится в области. Если свойству ВысотаСтроки присвоить значение, отличное от 0, то свойство АвтоВысотаСтроки автоматически будет установлено в значение Ложь. Это значит, что высота строки будет фиксированная и равна указанной величине. В этой ситуации свойство АвтоВысотаСтроки можно установить в значение Истина, и тогда свойство ВысотаСтроки будет использоваться как максимальная высота строки. Другими словами, высота строки будет переменная, от значения по умолчанию до указанного в свойстве ВысотаСтроки. Ширина колонок Табличный документ может иметь строки с различной шириной колонок. Такая возможность используется для создания форм отчетности, содержащих по сути несколько различных таблиц с различной шириной колонок в каждой из них. Том 2
|[Габлинн£|йУдокумент| Для установки ширины колонок используется свойство области ячеек табличного документа ШиринаКолонки. Если это свойство применяется к прямоугольной области или области колонок (листинг 17.49), то новая ширина колонок будет установлена для всех колонок, участвующих в указанной области (рис. 17.43). Листинг 17.49. Установка ширины колонок табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(2,2,4,4).ШиринаКолонки = 15; ТабДок.Показать(); Рис. 17.43. Установка ширины колонок Если ширину колонок задать для области, состоящей из строк, то новая ширина колонок будет установлена для всего табличного документа. Для того чтобы установить другую ширину колонок только в некоторых строках, необходимо предварительно создать новый формат строк (метод СоздатьФорматСтрок()) и затем заново получить требуемую область (листинг 17.50). После этого можно будет задать для этой области требу- емую ширину колонок (рис. 17.44). Листинг 17.50. Установка ширины колонок для выбранной области табличного документа ТабДок = Новый ТабличныйДокумент(); Область = ТабДок.Область(2,2,4,4); Область.СоздатьФорматСтрок(); Область = ТабДок.Область(2,2,4,4); Область.ШиринаКолонки = 15; ТабДок.Показать(); Рис. 17.44. Установка формата строк
инескогбТпредставленияУданных' Цвет фона и узор Для области табличного документа может быть задан цвет фона, а также узор и цвет узора. Причем если область включает в себя несколько ячеек документа, то эти свойства будут установлены для каждой ячейки, входящей в область. Для задания цвета фона и цвета узора используются, соответственно, свойства ЦветФона и ЦветУзора, принимающие значение типа Цвет. Для задания узора используется свойство Узор, которое принимает значения системного перечисления ТипУзораТабличногоДокумента. Это системное перечисление позволяет определить 17 различных узоров (рис. 17.45). Узор1 Узор2 УзорЗ Узор4 Узорб Узорб Узор? Узорб УЗОрЭ Узор10 Узор11 Узор12 Узор13 Узор14 Узор15 Узор15 Узор17 Рис. 17.45. Значения и внешний вид узоров Кроме этого, возможны значения БезУзора и Сплошной. Значение БезУзора позволяет не использовать узор вообще и является значением по умол- чанию, а использование значения Сплошной с заданным цветом узора аналогично установке фона области с этим цветом. Объединение ячеек Несколько ячеек, входящих в область табличного документа, могут быть объединены в одну ячейку. Для этого используется метод области ячеек табличного документа Объединить(). Пример объединения ячеек представлен в листинге 17.51. Листинг 17.51. Пример объединения ячеек области табличного документа ТабДок = Новый ТабличныйДокумент(); Область = ТабДок.Область(2,2,4,4); Область.Объединить(); ТабДок.ПоказатьО; Результат выполненного объединения показан на рис. 17.46.
Рис. 17.46. Объединение ячеек области Если к области, состоящей из объединенных ячеек, применить метод Разъединить/), то в области будет сформировано то же количество ячеек, что и до объединения. Группировка Области табличного документа, представляющие собой строки или колонки, могут быть сгруппированы. Для этого используется метод Сгруппировать(). Обратное действие выполняется с помощью метода Разгруппировать(). Группировка строк или колонок табличного документа позволяет при просмотре документа скрывать/раскрывать строки/колонки, детали- зирующие основную строку/колонку. Эта возможность используется, например, при выводе отчетов с группировками, например, остатков товаров по складам. Тогда строки, относящиеся к остаткам товаров на одном и том же складе, можно сгруппировать, и отчет удобнее читать. При просмотре отчета пользователь сможет сворачивать/разворачивать отдельные группировки или все группировки одного уровня. Пример группировки 2—4 строк табличного документа представлен в листинге 17.52. Листинг 17.52. Пример группировки строк табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(2,, 4).Сгруппировать(); ТабДок.Показать(); Внешний вид табличного документа, получающийся в результате выпол- нения этого кода, показан на рис. 17.47. Маркеры уровней (1 и 2) позволяют сворачивать/разворачивать все группировки, находящиеся на данном уровне, в то время как маркеры Профессиональная разработка в системе «1С:Предприятие 8»
отдельных группировок позволяют сворачивать/разворачивать отдельные группировки. Метод Разгруппировать() позволяет, соответственно, разгруппировать строки или колонки области ячеек табличного документа. Границы Для области табличного документа может быть задано отображение границ области целиком и отдельных ячеек, входящих в область. Для этого используются свойства ГраницаСверху, ГраницаСлева, Грани- цаСнизу и ГраницаСправа. Эти свойства имеют тип Линия. Если они применяются к области, содержащей несколько ячеек, то соответству- ющее свойство будет установлено у каждой ячейки, входящей в область. Цвет границы задается с помощью свойства ЦветГраницы, принимающего значения типа Цвет. Также для задания границ области можно использовать метод Обвести(), которому передаются объекты типа Линия, описывающие левую, верхнюю, правую и нижнюю границы области. В этом случае оформление будет применено только к внешним границам ячеек, находящимся на границе области. Метод Обвести(), так же как и прямое указание границ, может быть применен как к прямоугольным областям, так и к областям, состоящим из строк или колонок. ВНИМАНИЕ! При использовании конструктора объекта Линия следует помнить, что для линии ячейки табличного документа может быть задан отступ линии от краев ячейки, а толщина двойной линии может быть задана только равной единице. Пример оформления областей табличного документа линиями пред- ставлен в листинге 17.53. Листинг 17.53. Пример оформления областей табличного документа линиями ТаЗДок = Новый ТабличныйДокумент(); ТабДок.ОтображатьСетку = Ложь; ЛинияСОтступом = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Двойная, 1, Истина); ЛинияБезОтступа = Новый Линия(ТипЛинииЯчейкиТабличногоДокумента.Двойная, 1); Область = ТабДок.Область(2,4,3,5); Область. ГраницаСверху = ЛинияСОтступом; Область. ГраницаСлева = ЛинияСОтступом; Область! раницаСнизу = ЛинияСОтступом; Область. ГраницаСправа = ЛинияСОтступом; Область = ТаВДок.Область(5,2,6,3); Область.Обвести(ЛинияБезОтступа, ЛинияБезОтступа, ЛинияБезОтступа, ЛинияБезОтступа); ТабДок.Показать(); Том 2
|[Габлинн£|йУдокумент| Внешний вид табличного документа, получающийся в результате выпол- нения этого кода, показан на рис. 17.48. Рис. 17.48. Оформление областей линиями Примечание Область ячеек табличного документа может иметь примечание, которое будет отображаться при наведении курсора на маркер, расположенный в правом верхнем углу ячейки. Примечание представляет собой объект РисунокТабличногоДокумента, имеющий тип Текст. О рисунках таб- личного документа подробно рассказывается в разделе «Рисунки табличного документа», стр. 381. Здесь же скажем только, что сущес- твует возможность установить текст примечания для области ячеек, получив из свойства Примечание области объект РисунокТабличногоДо- кумента и обратившись к его свойству Текст (листинг 17.54). Листинг 17.54. Установка текста примечания для области ячеек табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.Область(2,2,4,4).Примечание.Текст = "Текст примечания области"; ТабДок,Показать(); В результате, если текст примечания был установлен для области, содер- жащей одну ячейку, соответствующий маркер будет установлен у этой ячейки. Если же текст примечания был установлен для области, содер- жащей несколько ячеек, примечание будет установлено у левой верхней ячейки этой области (рис. 17.49).
инескогбТпредставленияУданных' Очистка Метод Очистить() табличного документа позволяет очистить весь табличный документ и переводит его в состояние, которое табличный документ имеет после его создания конструктором. Этот метод может применяться, когда необходимо повторно использовать тот же самый экземпляр объекта табличного документа без его пересоздания. Метод Очистить() есть также и у области ячеек табличного документа. Для области ячеек метод Очистить() имеет три параметра, которые позво- ляют уточнять, что именно должно быть очищено: текст, форматирование, рамки. Все три параметра имеют тип значения Булево; по умолчанию очищается только текст, содержащийся в области ячеек табличного документа. Свойства области, относящиеся к тексту Текст и шрифт В самом простом случае область содержит текст, который доступен для чтения и изменения через свойство Текст. Следует учитывать, что это свойство применимо только для прямоугольных областей. При этом если область содержит несколько ячеек, то свойство Текст будет установ- лено для каждой ячейки, входящей в область. Для области табличного документа может быть задан шрифт текста (свойство Шрифт), содержащегося в этой области. Шрифт также задается один для всех ячеек, содержащихся в области. Вертикальное и горизонтальное выравнивание Свойства ВертикальноеПоложение и ГоризонтальноеПоложение позво- ляют задавать положение текста внутри области. Свойство Верти- кальноеПоложение принимает значения системного перечисления ВертикальноеПоложение - Верх, Низ, Центр (по умолчанию Низ), а свойство ГоризонтальноеПоложение принимает значения системного перечис- ления ГоризонтальноеПоложение - Авто, Лево, ПоШирине, Право, Центр (по умолчанию Авто). Значение Авто выравнивает числовые значения по правой границе, остальные - по левой. Значение ПоШирине располагает текст таким образом, чтобы занимать всю ширину области табличного документа. Если область состоит из нескольких ячеек, то эти свойства применяются к каждой ячейке области. При использовании горизонтального выравнивания может также приме- няться свойство ПоВыделеннымКолонкам. Если это свойство установлено в значение Истина, то горизонтальное выравнивание будет выполняться по следующему правилу.
Если справа от текущей ячейки, содержащей текст, находится ячейка с текстом, выравнивание будет применено только к текущей ячейке. Если справа от текущей ячейки находится одна или несколько пустых ячеек, то выравнивание будет применено к области, начинающейся с текущей ячейки и заканчивающейся перед последней непустой ячейкой справа. В качестве примера рассмотрим использование этого свойства при вырав- нивании текста в области, показанной на рис. 17.50. Если в этом случае к области применить горизонтальное выравнивание по центру и установить свойство ПоВыделеннымКолонкам (листинг 17.55), то надпись «первая» будет выровнена в пределах второй колонки, надпись «вторая» будет выровнена в пределах 3—5 колонок, а надпись «третья» будет выровнена в пределах 6-7 колонок (рис. 17.51). Листинг 17.55. Использование выравнивания по выделенным колонкам ТабДок = ПолучитьМакетДокументаС'Макет1'); Область = ТабДок.Область(2,2,2,7); Область.ГоризонтвльноеПоложение = ГоризонтальноеПоложение. Центр; Область.ПоВыделеннымКолонкам = Истина; ТабДок.Показать(); Рис. 17.51. Результат выравнивания по выделенным колонкам Профессиональная разработка в системе «1С:Предприятие 8»
Ориентация Текст в области табличного документа может располагаться под разными углами наклона относительно горизонтального положения. Для задания угла наклона используется свойство ОриентацияТекста. Угол наклона задается в градусах. Если угол наклона равен 0, текст будет расположен горизонтально. Угол наклона 90 соответствует расположению текста снизу вверх, угол наклона 270 - сверху вниз, а угол наклона 180 соответствует расположению текста, повернутого на 180 градусов (рис. 17.52). Рис. 17.52. Ориентация текста Отступ Свойство Отступ задает отступ текста от правого или левого края ячейки в средних символах шрифта. Отступ будет применен в зависимости от горизонтального положения, указанного для этой области. Размещение Свойство РазмещениеТекста позволяет задать тип размещения для текста, который не помещается целиком в ячейку. Возможные варианты задаются значениями системного перечисления ТипРазмещенияТекстаТабличногоДо- кумента: Авто - текст будет показан в соседних по горизонтали ячейках, если в них нет текста; Обрезать - видимая часть текста будет ограничена левой и правой границами ячейки; Забивать - видимая часть текста будет ограничена левой и правой границами ячейки, все символы видимой части будут отображаться как «#». Такой способ отображения может применяться для предотвра- щения неправильного восприятия длинных чисел; Переносить - текст будет переноситься на следующие строки ячейки. Для того чтобы текст был отображен в ячейке целиком, необходимо, чтобы свойство ВысотаСтроки было установлено в значение 0 (при этом свойство АвтоВысотаСтроки будет установлено в значение Истина). Примеры использования различного размещения текста представлены на рис. 17.53. Том 2
Табличн£|й’документ Рис. 17.53. Размещение текста Цвет Чтобы задать цвет текста, содержащийся в области табличного документа, используется свойство ЦветТекста, которое принимает значения типа Цвет. Если область состоит из нескольких ячеек, то свойство будет применено к каждой ячейке области. Выделение отрицательных Свойство ВыделятьОтрицатепьные позволяет выделить специальным цветом текст, содержащийся в области. Выделение будет осуществляться для тех текстов, которые начинаются с символа «-» (минус). При выде- лении таких текстов будет использоваться цвет Отрицательное число стиля, используемого конфигурацией. Работа с областями табличного документа Тип области В процессе выполнения различных действий с областями табличного документа необходимо знать, какую форму имеет та или иная область. Для этого можно использовать свойство области ячеек табличного документа ТипОбласти. Это свойство предназначено только для чтения и содержит значения системного перечисления ТипОбластиЯчеекТаблич- ногоДокумента. Тип области может принимать значения Колонки, Строки, Прямоугольник и Таблица. Если область является областью строк или колонок табличного документа, то тип области будет соответственно Строки или Колонки. Если область прямоугольная, то тип области будет Прямоугольник. Тип области Таблица означает, что область представляет собой весь табличный документ. Такая область может быть получена, например, в результате выполнения метода Область() без параметров (листинг 17.56). Листинг 17.56. Получение области с типом «Таблица» ТабДок = Новый ТабличныйДокумент(); ОбластьВесьДокумент = ТабДок.Область(); Сообщить(ОбластьВесьДокумент.ТипОбласти);
инескогбТпредставленияУданных' Текущая область У табличного документа всегда есть текущая область. По умолчанию при создании табличного документа текущей областью становится область с адресом R1C1. В режиме просмотра эта область выделяется жирной рамкой (рис. 17.54). Рис. 17.54. Текущая область по умолчанию Текущая область может быть изменена интерактивно или программно. Для программного определения и изменения текущей области таблич- ного документа используется свойство документа ТекущаяОбласть (листинг 17.57). Например, текущей может быть назначена область, состо- ящая из нескольких ячеек табличного документа (рис. 17.55). Листинг 17.57. Назначение текущей области табличного документа ТабДок = Новый ТабличныйДокумент(); ТабДок.ТекущаяОбласть = ТабДок.Область(2,2,4,4); ТабДок.Показать(); Рис. 17.55. Текущая область, состоящая из нескольких ячеек Белым цветом выделяется ячейка, с которой было начато интерактивное выделение данной области. Эта информация носит чисто визуальный характер. Если текущая область определяется программно, то белым цветом будет выделена ячейка, находящаяся в левом верхнем углу области. Выделенные области Табличный документ позволяет выделять одновременно несколько областей. В интерактивном режиме это выполняется с помощью мыши при нажатой клавише Ctrl. Для программного выделения нескольких областей используется коллекция выделенных областей табличного доку- мента, которая доступна через свойство документа ВыделенныеОбласти.
В этом свойстве содержится объект ВыделенныеОбластиТабличногоДоку- мента. Этот объект представляет собой коллекцию объектов двух типов: ОбластьЯчеекТабличногоДокумента и РисунокТабличногоДокумента, т.е. коллекция может содержать одновременно значения как одного, так и другого типа. Принцип работы с этой коллекцией не зависит от типа элемента, поэтому здесь мы рассмотрим работу с этой коллекцией на примере области ячеек табличного документа (про рисунки таблич- ного документа подробно рассказывается в разделе «Рисунки табличного документа», стр. 381). Коллекция выделенных областей всегда содержит одну область таблич- ного документа - это текущая область. Для добавления областей в коллекцию используется метод Добавить(), которому передается область ячеек или рисунок табличного документа (листинги 17.58,17.59). При этом добавленная область становится текущей для табличного доку- мента (рис. 17.56). В коллекции выделенных областей текущая область всегда имеет индекс 0. Листинг 17.58. Выделение нескольких областей &НаКлиенте Процедура ОбластьДокумента(Команда) ТабДок = ДобавитьОбласть(); ТабДок.Показать(); КонецПроцедуры Поскольку метод Добавить() исполняется на сервере, то вызывается внеконтекстная серверная функция ДобавитьОбласть(), листинг 17.59, которая добавляет выделенные области в табличный документ и возвра- щает его на клиента, где он показывается пользователю. Листинг 17.59. Выделение нескольких областей &НаСервереБезКонтекста Функция ДобавитьОбласть() ТабДок = Новый ТабличныйДокументО; ТабДок.ВыделенныеОбласти.Добавить( ТабДок.Область(2,2,3,3)); ТабДок.ВыделенныеОбласти.Добавить( ТабДок. Область(1,5,4,5)); Возврат ТабДок; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
Коллекция выделенных областей табличного документа содержит методы, позволяющие вставлять, сдвигать, удалять, получать по индексу и подсчи- тывать количество выделенных областей. Кроме этого, коллекция содержит метод Очистить(), который удаляет все области из коллекции выделенных областей. При этом текущей областью становится область с адресом R1C1, и она же включается в коллекцию выделенных областей. Копирование области Область ячеек табличного документа может быть скопирована в другую область документа. Для этого используется метод документа ВставитьОбласть(). В качестве параметров метода передается область- источник, область-приемник, направление смещения при вставке и признак заполнения параметров в области-приемнике. Если указано использование сдвига по горизонтали (листинги 17.60, 17.61), то область-источник будет скопирована на место области- приемника, а область-приемник и ячейки, расположенные правее, будут сдвинуты вправо (рис. 17.57). Листинг 17.60. Вставка области со сдвигом по горизонтали &НаКлиенте Процедура МакетДокумента(Команда) ТаВДок = ВставитьОбласть(); ТабДок.Показать(); КонецПроцедуры Поскольку метод ВставитьОбласть() исполняется на сервере, то вызывается внеконтекстная серверная функция ВставитьОбласть(), листинг 17.61, которая вставляет указанные области в табличный доку- мент и возвращает его на клиента, где он показывается пользователю. Листинг 17.61. Вставка области со сдвигом по горизонтали &НаСервереБезКонтекста Функция ВставитьОбластъ() ТабДок = ПолучитьОбщийМакет("Макет"); ОбластьИсточник = ТабДок.Область(2,2); ОбластьПриемник = ТабДок.Областъ(3,3); ТабДок.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник, ТипСмещенияТабличногоДокумента.ПоГоризонтали); ОбластъИсточник.ЦветФона = УУеЬЦвета.Желтый; ОбластъПриемник.ЦветФона = УУеЬЦвета. Голубой; Возврат ТабДок; КонецФункции Том 2
[Габлинш^йРдокумент ® о и ' Т -Й 4S Ld ' W ’ Я 'ji|' м м» м- X 11 I 2 I Э I 4 I S I 6 1 |11 12 13 14 15 2 |21 22 23 24 25 3 131 32 22 33 34 35 4 |41 42 43 44 45 5 151 52 53 54 55 6 1 ] L. Рис. 17.57. Вставка области со сдвигом по горизонтали Если указано использование сдвига по вертикали (листинг 17.62), то область-источник будет скопирована на место области-приемника, а область-приемник и ячейки, расположенные ниже, будут сдвинуты вниз (рис. 17.58). Листинг 17.62. Вставка области со сдвигом по вертикали &НаСервереБезКонтекста Функция ВставитьОбласть() ТабДок = ПолучитьОбщийМакет('Макет"); ОбластьИсточник = ТаВДок.Область(2,2); ОбластьПриемник = ТабДок.Область(3,3); ТабДок.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник, ТипСмещенияТабличногоДокумента.ПоВертикали); ОбластьИсточник.ЦветФона = УУеЬЦвета.Желтый; ОбластьПриемник.ЦветФона = УУеЬЦвета. Голубой; Возврат ТабДок; КонецФункции Рис. 17.58. Вставка области со сдвигом по вертикали Если указан тип сдвига БезСдвига (это значение используется по умолчанию, листинг 17.63), то фактически выполняется замещение области-приемника копией области-источника (рис. 17.59). Листинг 17.63. Вставка области без сдвига &НаСервереБезКонтекста Функция ВставитьОбластьО ТабДок = ПолучитьОбщийМакет('Макет"); ОбластьИсточник = ТабДок.Область(2,2); ОбластьПриемник = ТабДок.Область(3,3); ТабДок.ВставитьОбласть(ОбластьИсточник, ОбластьПриемник); ОбластьИсточник.ЦветФона = УУеЬЦвета.Желтый; ОбластьПриемник.ЦветФона = УУеЬЦвета. Голубой; Возврат ТабДок; КонецФункции
инескогбТпредставленияУданных' Если область-приемник не указана, то копирование выполняется в область, расположенную сразу за областью-источником в соответствии с типом сдвига (по вертикали или по горизонтали). Если тип сдвига также не указан (листинг 17.64), то будет выполняться вставка в область, распо- ложенную справа, сразу за областью-источником без сдвига (рис. 17.60). Листинг 17.64. Вставка области без указания области приемника и сдвига &НаСервереБезКонтекста Функция ВставитьОбласть() ТабДок = ПолучитьОбщийМакет("Макет"); ОбластьИсточник = ТабДок.Область(2,2); ОбластьПриемник = ТабДок.Обласгь(3,3); ТабДок.ВставитьОбласть(ОбластьИсточник); ОбластьИсточник.ЦветФона = УУеЬЦвета.Желтый; ОбластьПриемник.ЦветФона = УУеЬЦвета. Голубой; Возврат ТабДок; КонецФункции Рис. 17.60. Вставка без указания области-приемника и сдвига При выполнении вставки области ячеек табличного документа размеры области-источника и области-приемника должны совпадать, иначе будет выдана ошибка. ПРИМЕЧАНИЕ При указании типа сдвига следует учитывать, что если вставляется область строк, то не имеет смысла задавать тип сдвига равным ПоГори- эонтали, а при вставке области колонок не имеет смысла задавать тип сдвига равным ПоВертикали.
Удаление области Область табличного документа может быть удалена. Для этого использу- ется метод табличного документа УдалитьОбласть(), которому передается удаляемая область, а также вариант смещения строк или колонок таблич- ного документа. Вариант смещения задается значением системного перечисления ТипСмещенияТабличногоДокумента. Для значений ПоГоризонтали (рис. 17.61) и ПоВертикали (рис. 17.62) выполняется соответствующий сдвиг ячеек документа для заполнения удаляемой области. Рис. 17.61. Удаление области со сдвигом по горизонтали Рис. 17.62. Удаление области со сдвигом по вертикали Значение БезСмещения по сути означает очистку указанной области, так как сдвиг ячеек документа не производится (рис. 17.63). Рис. 17.63. Удаление области без сдвига По умолчанию удаление области выполняется без смещения. Очистка Метод Очистить() позволяет очистить весь табличный документ и пере- водит его в состояние, которое табличный документ имеет после его создания конструктором. Этот метод может применяться, когда необхо- димо повторно использовать тот же самый экземпляр объекта табличного документа без его пересоздания. Профессиональная разработка в системе «1С:Предприятие 8»
Поиск текста Табличный документ позволяет выполнять поиск определенного текста в табличном документе. Для этого используется метод табличного доку- мента НайтиТекст(), который содержит следующие параметры: Строка - имеет тип Строка и представляет собой текст, который необ- ходимо найти в табличном документе; Начало - имеет тип ОбластьЯчеекТабличногоДокумента. Представляет собой область, после которой начинается поиск. Если этот параметр не указан, то поиск будет выполнен с начала табличного документа (начиная с области R1C1); Где - имеет тип ОбластьЯчеекТабличногоДокумента. Представляет собой область, в пределах которой осуществляется поиск текста. Если этот параметр не указан, то поиск будет осуществляться во всем табличном документе; Искать по строкам - имеет тип Булево. Определяет способ поиска - по строкам или по колонкам. Значение по умолчанию - Истина, что означает поиск по строкам. При этом поиск будет осуществляться в соответствии со значением параметра Искать вперед. Например, поиск по строкам вперед означает следующую последова- тельность перехода (рис. 17.64). Перми строка I . I I I I I области поиска I-I I I I I I «------------------ (___________________} 1*1 । । । । Рис. 17.64. Поиск по строкам вперед Последовательность перехода при поиске по строкам назад показана на рис. 17.65. Последняя строка Г области поиска L Рис. 17.65. Поиск по строкам назад Ячейка целиком - имеет тип Булево. Значение по умолчанию - Ложь. Это означает, что будет искаться вхождение указанной подстроки в текст области. Значение Истина означает, что будет найдено только полное соответствие указанной строки тексту области; Искать вперед - имеет тип Булево и определяет направление поиска. Значение по умолчанию - Истина - искать вперед. Значение Ложь озна- чает поиск назад; Том 2
|[Габлинн£|йУдокумент| Игнорировать регистр - имеет тип Булево. Значение по умолчанию - Ложь. Это означает, что при поиске регистр будет игнорироваться. Значение Истина означает поиск с учетом регистра. Таким образом, по умолчанию метод осуществляет поиск первого вхож- дения указанной подстроки в текст какой-либо области, причем поиск выполняется во всем документе, начиная с ячейки R1C1, по строкам вперед, без учета регистра (листинг 17.65). Листинг 17.65. Пример поиска текста в табличном документе ТабДок = ПолучитьМакетДокумента("Макет"); НайденнаяОбласть = ТабДок.НайтиТекст("Остатки"); В случае успешного завершения поиска метод возвращает найденную область табличного документа (или рисунок табличного документа, если текст найден в нем). Если текст не найден, возвращается значение Неопределено. Рисунки табличного документа Помимо данных, размещенных непосредственно в ячейках, табличный документ может содержать рисунки. Коллекция рисунков табличного документа доступна через его свойство Рисунки. Элементами этой коллекции являются объекты РисунокТабличногоДокумента, каждый из которых описывает отдельный рисунок, содержащийся в табличном документе. Существует 12 типов рисунков, которые могут быть размещены в табличном документе и которые описываются значениями системного перечисления ТипРисункаТабличногоДокумента (табл. 17.2). Таблица 17.2. Типы рисунков табличного документа Значение Описание ГеографическаяСхема Рисунок, предназначенный для отображения в табличном документе объекта ПолеГеографическойСхемы Г рулпа Рисунок, представляющий собой группу рисунков Дендрограмма Рисунок, предназначенный для отображения в табличном документе объекта Дендрограмма Диаграмма Рисунок, предназначенный для отображения в табличном документе объекта Диаграмма ДиаграммаГанта Рисунок, предназначенный для отображения в табличном документе объекта ДиаграммаГанта Картинка Рисунок, отображающий картинку Объект Рисунок, предназначенный для отображения в табличном документе объекта ActiveX Прямая Рисунок, являющийся прямой линией Прямоугольник Рисунок, являющийся прямоугольником СводнаяДиаграмма Рисунок, предназначенный для отображения в табличном документе объекта СводнаяДиаграмма Текст Рисунок, содержащий текст Эллипс Рисунок, являющийся эллипсом
инескогбТпредставленияУданных' Добавление рисунков в табличный документ может быть выполнено с помощью метода Добавить() коллекции рисунков табличного документа. При этом обязательно должен быть указан тип добавляемого рисунка. Метод Добавить() возвращает добавленный рисунок, после чего устанав- ливаются требуемые свойства рисунка (листинг 17.66). Листинг 17.66. Добавление рисунка в табличный документ ТабДок = Новый ТабличныйДокумент; I НовыйРисунок = ТабДок.РисункиДобавить(ТипРисункаТабличногоДокумента.Картинка); | Коллекция рисунков табличного документа обладает также методами, позволяющими очищать коллекцию, удалять, получать рисунки по индексу и определять количество рисунков табличного документа. Общие свойства рисунков табличного документа Объект РисунокТабличногоДокумента имеет набор свойств, которые позволяют работать с теми или иными типами рисунков. Не все из сущес- твующих свойств могут быть использованы с любым типом рисунка, однако существует ряд свойств, которые, за небольшим исключением, используются с рисунками любого типа. Имя и тип Прежде всего это свойства Имя и ТипРисунка. Все рисунки, добавля- емые в табличный документ, получают имена по умолчанию D1, D2 и т. д. При необходимости разработчик может назначить собственное имя рисунку. При этом рисунок будет включен в коллекцию именованных областей табличного документа (свойство табличного документа Области), листинг 17.67. Листинг 17.67. Назначение имени рисунку ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.РисункиДобавить(ТипРисункаТабличногоДокумента.Картинка); Сообщить(НовыйРисунок.Имя); НовыйРисунок.Имя = "Логотип"; Сообщить(ТабДок.Области.Логотип.Имя); Сообщить (ТабДок.Рисунки .Логотип. Имя); Свойство ТипРисунка принимает значения системного перечисления ТипРисункаТабличногоДокумента и задается при добавлении рисунка в табличный документ. В дальнейшем значение этого свойства может быть только прочитано.
Размеры рисунка Каждый рисунок, добавляемый в табличный документ, ограничивается прямоугольной областью, размеры которой задаются с помощью свойств Верх, Высота, Лево и Ширина. Все эти свойства принимают значения типа Число. Свойство Верх задает расстояние от верхней стороны табличного доку- мента до границы рисунка, от которой будет отсчитываться высота в миллиметрах. Свойство Высота задает высоту рисунка в миллиметрах. Свойство Лево задает расстояние от левой стороны табличного документа до границы рисунка, от которой будет отсчитываться ширина в милли- метрах, а свойство Ширина задает ширину рисунка в миллиметрах. По умолчанию для нового рисунка значения всех перечисленных свойств равны нулю, поэтому их нужно задавать в явном виде (листинг 17.68). Листинг 17.68. Установка размеров рисунка ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Текст); НовыйРисунок.Текст = "Текст рисунка"; НовыйРисунок.Верх = 10; НовыйРисунокЛево = 10; НовыйРисунок.Высота = 5; НовыйРисунок.Ширина = 30; ТабДок.Показать(); В результате выполнения приведенного кода будет добавлен следующий рисунок (рис. 17.66). Рис. 17.66. Рисунок в табличном документе Следует отметить, что при положительных значениях ширины и высоты рисунка высота рисунка будет отсчитываться вниз от верхней границы рисунка, а ширина - вправо от левой границы рисунка. Если же свойс- твам Ширина и Высота присваиваются отрицательные значения, то высота будет отсчитываться вверх от верхней границы рисунка, а ширина - влево от правой границы рисунка. Поэтому приведенный на рис. 17.66 табличный документ также может быть получен с помощью следующего кода (листинг 17.69). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 17.69. Использование отрицательных значений ширины и высоты рисунка ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.РисункиДобавить(ТипРисункаТабличногоДокумента.Текст); НовыйРисунок.Текст = "Текст рисунка"; НовыйРисунок.Верх = 15; НовыйРисунокЛево = 40; НовыйРисунок.Высота = -5; НовыйРисунок.Ширина = -30; ТабДок.Показать(); ПРИМЕЧАНИЕ Для рисунков типа Группа применимы только те свойства, которые были перечислены: Имя, ТипРисунка, Верх, Высота, Лево и Ширина. Свойства, описываемые далее, не применимы к рисункам типа группа. Ограничивающая линия Для всех типов рисунков может быть использовано свойство Линия. Это свойство задает тип линии, которая будет ограничивать рисунок. Исключение составляют лишь рисунки типов Прямая и Эллипс: для них это свойство задает тип линии, которой рисуется отображаемая фигура, а сами рисунки этих типов не содержат ограничивающей линии. Свойство Линия принимает значения типа Линия, которые, как правило, создаются с помощью конструктора объекта Линия (листинг 17.70). При этом следует учитывать, что в конструкторе должен быть исполь- зован тип линии ТипЛинииРисункаТабличногоДокумента. В противном случае будет выдано сообщение о несоответствии типов при установке значения свойства Линия. Листинг 17.70. Пример использования свойства «Линия» ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.РисункиДобавить(ТипРисункаТабличногоДокумента.Эллипс); НовыйРисунок.Верх = 10; НовыйРисунокЛево = 10; НовыйРисунок.Высота = 5; НовыйРисунок.Ширина = 30; НовыйРисунокЛиния = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Точечная); ТабДок.Показать(); В результате выполнения приведенного кода будет добавлен следующий рисунок (рис. 17.67). Рис. 17.67. Использование свойства «Линия» Том 2
|Таблимн£|й’документ По умолчанию после добавления нового рисунка в его свойстве Линия установлена линия типа Сплошная с толщиной, равной 1. Цвет линии задается с помощью свойства ЦветЛинии, которое принимает значение типа Цвет. По умолчанию для нового рисунка цвет линии зада- ется черным с помощью абсолютных значений составляющих цвета. Свойства ГраницаСверху, ГраницаСлева, ГраницаСнизу и ГраницаСправа имеют тип Булево и определяют отображение соответствующих линий, ограничивающих рисунок. Эти свойства неприменимы для рисунков типов Прямая и Эллипс, т. к. такие рисунки не имеют ограничивающих линий. По умолчанию в этих свойствах установлены значения истина, поэтому для того, чтобы скрыть какие-либо ограничивающие линии рисунка (рис. 17.68), следует установить соответствующее свойство в значение Ложь (листинг 17.71). Листинг 17.71. Пример скрытия границы рисунка ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник); НовыйРисунок.Верх = 10; НовыйРисунокЛево = 10; НовыйРисунок.Высота = 5; НовыйРисунок.Ширина = 30; НовыйРисунок.Г раницаСверху = Ложь; ТабДок.Показать(); Рис. 17.68. Скрытие верхней границы рисунка Заполнение рисунка Для всех рисунков, кроме рисунка типа Прямая, может быть задан запол- няющий узор, цвет узора и цвет фона рисунка. Узор задается с помощью свойства рисунка табличного документа Узор, которое принимает значения системного перечисления ТипУзораТаблич- ногоДокумента (эти значения описаны в разделе «Цвет фона и узор», стр. 374), листинг 17.72. Листинг 17.72. Использование узора рисунка табличного документа ТабДок = Новый ТабличныйДокумент; НовыйРисунок = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Прямоугольник); НовыйРисунок.Верх = 10; НовыйРисунокЛево = 10; НовыйРисунок.Высота = 5; НовыйРисунок.Ширина = 30; НовыйРисунок.Узор = ТипУзораТабличногцДокумента.Узорб; ТабДок.Показать();
инескогбТпредставленияУданных' В результате выполнения приведенного кода в табличный документ будет вставлен прямоугольник, заполненный узором (рис. 17.69). Рис. 17.69. Использование узора рисунка Цвет узора и цвет фона рисунка задаются с помощью свойств ЦветУзора и ЦветФона, которые принимают значения типа Цвет. По умолчанию для новых рисунков цвет узора задается черным, а цвет фона - белым с помощью абсолютных значений составляющих цвета. Для рисунков, являющихся примечаниями, по умолчанию цвет фона зада- ется равным фону подсказки из стиля, используемого конфигурацией (свойство Основной стиль конфигурации). Защита рисунка Для рисунка, так же как и для области ячеек табличного документа, может быть задано свойство Защита. Использование этого свойства имеет смысл только вместе со свойством самого табличного документа Защита. Если у табличного документа свойство Защита установлено в значение Истина, то в окне редактора табличных документов пользователю будет недо- ступно редактирование тех рисунков табличного документа, для которых свойство Защита также установлено в значение Истина. По умолчанию свойство Защита имеет значение Истина для всех рисунков табличного документа. Рисунки типа «Текст» Рисунки табличного документа, имеющие тип Текст, используются для отображения текста и значений различного типа в табличном документе. Кроме этого, они используются для отображения примечаний к ячейкам табличного документа. Есть три основных отличия в использовании рисунка типа Текст самого по себе и в качестве примечания. Первое отличие заключается в том, что для добавления рисунка типа Текст в табличный документ используется метод Добавить() коллекции рисунков табличного документа (листинг 17.73). Листинг 17.73. Добавление рисунка типа «Текст» ТабДок = Новый ТабличныйДокумент; I РисунокТекст = ТабДок.РисункиДобавить(ТипРисункаТабличногоДокумента.Текст); |
Примечания в табличный документ добавлять не нужно. После создания табличного документа каждая его ячейка уже содержит примечание, доступ к которому можно получить через свойство области ячеек таблич- ного документа Примечание. При установке примечанию свойства Текст, отличного от пустой строки (листинг 17.74), это примечание будет отоб- ражено в табличном документе (рис. 17.70). Если свойству Текст рисунка, который является примечанием, присвоить значение пустой строки, то отображение примечания будет прекращено. Листинг 17.74. Установка примечания ТабДок = Новый ТабличныйДокумент; ТабДок.Область(2,2).Примечание.Текст = "Текст примечания"; Рис. 17.70. Примечание Второе отличие заключается в том, что примечания не отображаются в коллекции рисунков табличного документа. Поэтому, если доступ к обычному рисунку типа Текст можно получить через коллекцию рисунков табличного документа или через коллекцию именованных областей табличного документа (листинг 17.68), доступ к примечанию осуществляется только через область табличного документа, которой «принадлежит» данное примечание (листинг 17.74). Третье отличие заключается в том, что рисунок типа Текст, исполь- зуемый в качестве примечания, может отображать только текст, в то время как обычный рисунок типа Текст может отображать текст, а также может отображать значения других типов, которые задаются при помощи параметров рисунка. Рассмотрим общие свойства рисунка типа Текст - свойства Текст, ЦветТекста и Шрифт. Свойство Текст задает собственно сам текст, который будет отображен в рисунке. Свойство ЦветТекста описывает цвет, которым будет отображен указанный текст. По умолчанию для обычных рисунков типа Текст это черный цвет, заданный абсолютными значениями составляющих цвета, а для рисунков, являющихся примечаниями, это цвет текста подсказки из стиля, используемого конфигурацией. Свойство Шрифт имеет значение типа Шрифт и задает вид шрифта, используемого для отображения указанного текста. По умолчанию исполь- зуется шрифт Arial, 8. Профессиональная разработка в системе «1С:Предприятие 8»
Свойства РазмещениеТекста, ВертикальноеПоложение, ГоризонтальноеПо- ложение, ОриентацияТекста, Отступ и ВыделятьОтрицательные аналогичны одноименным свойствам области ячеек табличного документа, о которых более подробно можно прочитать в разделе «Свойства области, относя- щиеся к тексту», стр. 376. Свойство АвтоРазмер позволяет использовать возможность автомати- ческого задания размеров рисунка на основе текста, содержащегося в рисунке. Для обычных рисунков по умолчанию это свойство установлено в значение Ложь, что подразумевает указание размеров рисунка в явном виде (свойства Высота и Ширина). Для рисунков, являющихся примеча- ниями, по умолчанию свойство АвтоРазмер установлено в значение Истина. Это означает, что размер примечания будет определяться автоматически. Если необходимо явное указание размеров примечания (рис. 17.71), следует свойство АвтоРазмер установить в значение Ложь и задать нужные значения свойств Высота и Ширина (листинг 17.75). Листинг 17.75. Установка размеров примечания ТабДок = Новый ТабличныйДокумент; Примечание = ТабДок.Область(2,2).Примечание; Примечание.Текст = "Текст примечания"; Примечание.АвтоРазмер = Ложь; Примечание.Ширина = 50; Примечание.Высота = 50; ТабДок.Показать(); Том 2
(Габлинш^йУдокумент! Рисунки типа «Картинка» Рисунки типа Картинка используют два специальных свойства, которые не используются рисунками других типов. Это свойства Картинка и РазмерКартинки. Свойство Картинка имеет тип Картинка и позволяет указать собственно ту картинку, которая будет отображена в рисунке. Свойство РазмерКартинки имеет тип системного перечисления РазмерКар- тинки и позволяет указать способ отображения картинки в рисунке. Под де- рживаются следующие значения этого перечисления (табл. 17.3). Таблица 17.3. Значения системного перечисления «РазмерКартинки» Значение Описание АвтоРазмер Если область, в которой отображается картинка, больше чем размеры картинки, используется режим РеальныйРазмер, в противном случае используется режим Пропорционально Пропорционально Картинка растягивается или сжимается таким образом, чтобы занять всю высоту или ширину отведенной для нее области, сохраняя при этом соотношение высоты и ширины оригинальной картинки Растянуть Растянуть или сжать картинку таким образом, чтобы она занимала всю область, отведенную для ее отображения РеальныйРазмер Сохранять равльные размеры картинки. Если область, в которой отображается картинка, меньше ее размеров, из середины картинки вырезается прямоугольник нужного размера Черепица Картинка, сохраняя свои оригинальные размеры, будет периодически повторяться, заполняя всю отведенную для нее область Например, для добавления рисунка типа Картинка в табличный документ можно использовать следующий код (листинг 17.76). Листинг 17.76. Добавление рисунка типа «Картинка» ТабДок = Новый ТабличныйДокумент; РисунокКартинка = ТабДок.Рисунки.Добавить(ТипРисункаТабличногоДокумента.Картинка); РисунокКартинка.Картинка = Новый Картинка("С:/Ьодо.бГ); РисунокКартинка.Верх = 10; РисунокКартинка. Лево = 10; РисунокКартинка.Высота = 45; РисунокКартинка.Ширина = 60; РисунокКартинка.РазмерКартинки = РазмерКартинки.АвтоРазмер; РисунокКартинка.Г раницаСверху = Ложь; РисунокКартинка.ГраницаСлева = Ложь; РисунокКартинка.Г раницаСнизу = Ложь; РисунокКартинка. ГраницаСправа = Ложь; ТабДок.Показать();
инескогбТпредставленияУданных' В результате выполнения приведенного кода будет создан следующий табличный документ (рис. 17.72). Рис. 17.72. Добавление рисунка типа «Картинка» Рисунки, содержащие объекты Помимо рисунков табличного документа, отображающих текст, картинки, те или иные геометрические фигуры, существуют рисунки, предназна- ченные для отображения различных объектов и предоставляющие доступ к самим отображаемым объектам. Такими рисунками являются рисунки типа Диаграмма, ДиаграммаГанта, СводнаяДиаграмма, Дендрограмма, ГеографическаяСхема и Объект. Все перечисленные типы рисунков, кроме рисунка типа Объект, могут быть добавлены в табличный документ средствами встроенного языка (метод Добавить() коллекции рисунков табличного документа). Рисунок типа Объект может быть добавлен в табличный документ только интер- активно, т. к. при добавлении такого рисунка будет предложено выбрать один из зарегистрированных в операционной системе ActiveX объектов. ПРИМЕЧАНИЕ Следует заметить, что не все ActiveX объекты, зарегистрированные в операционной системе, могут быть размещены в табличном доку- менте. Также список ActiveX объектов, предлагаемых для размещения в табличном документе, будет отличаться от списка ActiveX объектов, предлагаемых для размещения, например, в форме. Это объясняется различным функциональным назначением формы и табличного доку- мента. Алгоритм работы со всеми перечисленными типами рисунков одинаков. Сначала нужно добавить рисунок в табличный документ, затем получить объект, отображаемый в рисунке, и после этого выполнить необходимые действия по настройке отображаемого объекта. gg<o>
Например, для того чтобы отобразить в табличном документе результаты отчета в виде диаграммы (рис. 17.73), можно выполнить код, представ- ленный в листингах 17.77, 17.78. Листинг 17.77. Пример вывода результатов отчета в диаграмму, расположенную в табличном документе &НаКпиенте Процедура Диаграмма(Команда) ТабДок = СформироватьДиаграмму(); ТабДок.ОтображатьСетку = Ложь; ТабДок.Показать(); КонецПроцедуры Диаграмма формируется в серверной внеконтекстной функции Сфор- мироватьДиаграмму(), листинг 17.78. Сначала диаграмма добавляется в коллекцию рисунков табличного документа. Затем объект Диаграмма заполняется данными отчета, и настраиваются свойства диаграммы. После этого табличный документ, содержащий диаграмму, возвращается на клиента и показывается пользователю. Листинг 17.78. Пример вывода результатов отчета в диаграмму, расположенную в табличном документе &НаСервереБезКонтекста Функция СформироватьДиаграмму() ТабДок = Новый ТабличныйДокумент; // Добавить рисунок типа "Диаграмма" и задать его размеры. РисунокДиаграмма = ТабДок.Рисунки.Добавить(ТипРисункаТабличногцДокументаДиаграмма); РисунокДиаграмма.Верх = 5; РисунокДиаграмма.Лево = 5; РисунокДиаграмма. Ширина = 150; РисунокДиаграмма.Высота = 70; // Получить объект "Диаграмма", отображаемый в рисунке. Диаграмма = РисунокДиаграмма.Объект; Диаграмма.ОбластьЗаголовка.Текст = "Продажа товаров”; // Настроить свойства диаграммы. Диаграмма.ТипДиаграммы = ТипДиаграммы. Измерительная; Диаграмма.АвтоМаксимвльноеЗначение = Ложь; Диаграмма.МаксимальноеЗначение = 20000; Диаграмма.АвтоМинимальноеЗначение = Ложь; Диаграмма.МинимальноеЗначение = 0; // Создать три полосы. Полосы = Диаграмма. ПолосыИзмерителыюйДиаграммы; НоваяПолоса = ПолосыДобавить(); НоваяПолоса. Начало = 0; НоваяПолосе.Конец = 3000; Профессиональная разработка в системе «1С:Предприятие 8»
НоваяПолоса.ЦветФона = УУеЬЦвета.Красный; НоваяПолоса = Полосы.Добавить(); НоваяПолоса.Начвло = 3000; НоваяПолоса.Конец = 7000; НоваяПолоса.ЦветФона = УУеЬЦвета.Желтый; НоваяПолоса = Полосы.Добавить(); НоваяПолоса.Начвло = 7000; НоваяПолоса.Конец = 20000; НоваяПолоса.ЦветФона = УУеЬЦвета.Зеленый; Запрос = Новый Запрос(" ВЫБРАТЬ ПродажиОбороты.Период, ПродажиОбороты.СуммаОборот ИЗ РегистрНакопления.Продажи.Обороты(&ДатаНачала, ВДатаОкончания, День,) КАК ПродажиОбороты”); Запрос.УстановитьПараметрС'ДатаНачвла'', '2011.09.14 00:00:00'); Запрос.УстановитьПараметр("ДатаОкончания", '2011.09.15 23:59:59'); Диаграмма.ИсточникДанных = Запрос.Выполнить().Выгрузить(); Возврат ТабДок; КонецФункции Рис. 17.73. Использование рисунка типа «Диаграмма» Рисунки типа «Прямая» В заключение рассказа о рисунках табличного документа остановимся на некоторых особенностях, связанных с использованием рисунка типа Прямая в табличном документе. Прямая всегда рисуется из левого верхнего угла рисунка в правый нижний. Таким образом, изменяя ширину и высоту рисунка (листинг 17.79), Том 2
|[Габлинн£|йУдокумент| мы можем нарисовать практически любую прямую, имеющую угол наклона от 270 градусов (вертикально, Ширина = 0) до 360 градусов (горизонтально, Высота = 0), рис. 17.74. Листинг 17.79. Пример рисования линии ТабДок = Новый ТабличныйДокумент; Для ВысотаПрямой = 0 По 50 Цикл Прямая = ТабДок.РисункиДобавить(ТипРисункаТабличногоДокумента.Прямая); Прямая.Лево = 5; Прямая.Верх = 5; Прямая.Ширина = 50; Прямая.Высота = ВысотаПрямой; ВысотаПрямой = ВысотаПрямой + 4; КонецЦикла; Для ШиринаПрямой = 0 По 50 Цикл Прямая = ТаВДок.РисункиДобавить(ТипРисункаТабличногоДокумента. Прямая); Прямая.Лево = 5; Прямая.Верх = 5; Прямая.Ширина = ШиринаПрямой; Прямая.Высота = 50; ШиринаПрямой = ШиринаПрямой + 4; КонецЦикла; ТабДок.ОтображатьСетку = Ложь; ТабДок.Показать(); Рис. 17.74. Пример рисования линии Но как же быть, если требуется нарисовать прямую, имеющую угол наклона от 180 до 270 градусов? Для этого можно использовать задание отрицательных значений высоты или ширины рисунка (листинг 17.80). Отрицательное значение высоты позволяет отразить рисунок вертикально, а отрицательное значение ширины - отразить рисунок горизонтально (рис. 17.75).
инескогбТпредставленияУданных' Листинг 17.80. Пример рисования линий ТабДок = Новый ТабличныйДокумент; ПрямаяОбычная = ТабДок.Рисунки .Добавить(ТипРисункаТабличногоДокумента.Прямая); ПрямаяОбычная.Линия = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Сплошная, 2); ПрямаяОбычная.Верх = 30; ПрямаяОбычнаяЛево = 55; ПрямаяОбычная.Ширина = 50; ПрямаяОбычная.Высота = 25; ПрямаяОтображениеВертикально = ТабДок.Рисунки. Добавить(ТипРисункаТабличногоДокумента.Прямая); ПрямаяОтображениеВертикальноЛиния = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Пунктир); ПрямаяОтображениеВертикально.Верх = 30; ПрямаяОтображениеВертикальноЛево = 55; ПрямаяОтображениеВертикально.Ширина = 50; ПрямаяОтображениеВертикально.Высота = -25; ПрямаяОтображениеГ оризонтвльно = ТабДок.Рисунки. Добавить(ТипРисункаТабличногоДокумента.Прямая); ПрямаяОтображениеВертикальноЛиния = Новый Линия(ТипЛинииРисункаТабличногоДокумента.Точечная); ПрямаяОтображениеГоризонтально.Верх = 30; ПрямаяОтображениеГоризонтвльно.Лево = 55; ПрямаяОтображениеГоризонтвльно.Ширина = -50; ПрямаяОтображениеГоризонтально.Высота = 25; НадписИ = ТабДок.РисункиЛобавить(ТипРисункаТабличногоДокумента.Текст); Надпись! .Текст = "Исходная прямая”; Надпись! .АвтоРазмер = Истина; Надпись! .Верх = 50; Надпись! Лево = 70; Надпись2 = ТабДок.РисункиЛобавить(ТипРисункаТабличногоДокумента.Текст); Надпись2.Текст = "Отражение вверх"; Надпись2.АвтоРазмер = Истина; Надпись2.Верх = 5; Надпись2Лево = 70; НадписьЗ = ТабДок.РисункиЛобавить(ТипРисункаТабличногоДокумента.Текст); НадписьЗ.Текст = "Отражение влево”; НадписьЗ.АвтоРазмер = Истина; НадписьЗ.Верх = 50; НадписьЗ Лево = 14; ТабДок-ОтображатьСетку = Ложь; ТабДок.Показать(); Рис. 17.75. Пример рисования линий
Использование макетов табличных документов Помимо непосредственного заполнения табличных документов данными, существует возможность формирования табличного документа на основе макета. Макет табличного документа описывает неизменяемые части табличного документа, содержащие оформление, и области, в которые могут быть выведены данные. Процесс заполнения табличного документа на основе макета заключается в считывании определенных областей макета, циклическом заполнении их данными и последовательном выводе полученных частей документа в результирующий табличный документ (рис. 17.76). Рис. 17.76. Схема использования макета табличного документа Профессиональная разработка в системе «1С:Предприятие 8»
Кроме этого, в процессе формирования результирующего табличного документа можно использовать возможность автоматической установки некоторых свойств документа, таких, например, как группировки и отступы. Формат макета табличного документа Макет табличного документа представляет собой табличный документ, у которого свойство Макет установлено в значение Истина. Изменение этого свойства возможно только интерактивным способом, т. к. создание макета выполняется средствами визуального конструирования в редак- торе табличных документов. После того как табличному документу установлено свойство Макет, для областей и рисунков табличного документа становится доступной возможность указать, чем будет заполняться та или иная область (рисунок) макета. Для этого используется свойство Заполнение области и рисунка таблич- ного документа (следует заметить, что для рисунков свойство Заполнение может быть использовано, только если рисунок имеет тип Текст). Свойство Заполнение принимает значения системного перечисления ТипЗапол- ненияОбластиТабличногоДокумента. Возможны три значения: текст - при выводе области/рисунка в табличный документ будет выведен текст, содержащийся в свойстве Текст области/рисунка; параметр - при выводе области/рисунка в табличный документ будет выведено значение параметра, имя которого указано в свойстве Параметр области/рисунка; шаблон - при выводе области/рисунка в табличный документ будет выведен текст в соответствии с шаблоном, который описан в свойстве Текст области/рисунка. Шаблон представляет собой строку, содержащую имена параметров. Для указания имени параметра используются символы «[» и «]» (листинг 17.81). Листинг 17.81. Пример шаблона Налогоплательщик: [НазваниеОрганизации] | В приведенном примере НазваниеОрганизации - это имя параметра, значение которого будет выведено в табличный документ после строки «Налогоплательщик: ». Как правило, в макете табличного документа определяется набор имено- ванных областей, соответствующих логическим частям будущего табличного документа. Например, если на основе шаблона будет форми- роваться отчет, содержащий табличные данные, то, скорее всего, макет такого отчета будет содержать области Шапка, Строка и Подвал. Том 2
|[Габлинн£|йУдокумент| Процедура формирования табличного документа Для того чтобы заполнить значения параметров области макета необхо- димыми данными, эта область должна быть получена в виде табличного документа. Для этого используется метод табличного документа Полу- читьОбласть(), которому в качестве параметра передается имя области. После этого к параметрам области можно обратиться с помощью свойства табличного документа Параметры. Обращение возможно по имени пара- метра (листинг 17.82). Листинг 17.62. Обращение к параметрам области макета по имени ТабМакет = ПолучитьОбщийМакет("Макет"); ОбластьШапки = ТабМакет.ПолучитьОбласть(" Шапка"); ОбластьШапки. Параметры. НачапоПериода = НачалоМесяца(ТекущаяДата()); ОбластьШапки.Параметры.КонецПериода = КонецМесяца(ТекущаяДата()); Свойство Параметры содержит коллекцию параметров табличного документа. Помимо обращения по имени, коллекция содержит метод Заполнить!), который позволяет заполнить значения всех параметров, содержащихся в области, значениями одноименных свойств переданного ей объекта. Такой способ заполнения параметров удобно использовать, например, при выводе в табличный документ результата запроса. Например, пусть создан следующий макет (рис. 17.77). 3 Конфигурация Конфигурация: Макет _ П X 1 1 1 1 2 I 3 L 1 (Строка | 2 I «Номенклатура* «КоличествоРасход* I 3 I -Ш I!► Рис. 17.77. Макет Тогда фрагмент кода, выводящий данные запроса в табличный доку- мент, формируемый на основе этого макета, может выглядеть следующим образом (листинг 17.83). Листинг 17.83. Пример заполнения значения параметров области макета Запрос = Новый Запрос; ЗапросТекст = "ВЫБРАТЬ | ТоварыНаСкладахОбороты.Номенклатура.Представление КАК Номенклатура, | ТоварыНаСкледахОбороты.КоличествоРасход КАК КоличествоРасход |ИЗ | РешстрНакопления.ТоварыНаСкладах.Обороты КАК ТоварыНаСкладахОбороты 1АВТОУПОРЯДОЧИВАНИЕ"; Выборка = Запрос.Выполнить().Выбрать(); // Получить макет. ТабМакет = ПолучитьОбщийМакет('Макет”);
инескогбТпредставленияУданных' // Получить область макета для вывода данных запроса. СекцияСтрока = ТабМакет.ПолучитьОбласть("Строка"); Пока Выборка.Следующий() Цикл // Заполнить значения параметров области. СекцияСтрока.Параметры.Заполнить(Выборка); КонецЦикла; После того как значения параметров области заданы, табличный доку- мент, содержащий область макета, может быть выведен в результирующий табличный документ. Для этого могут быть использованы два метода табличного документа: Вывести() и Присоединить(). Метод Вывести() выводит переданный ему табличный документ в резуль- тирующий табличный документ, добавляя его со следующей строки вслед за самой нижней выведенной строкой, начиная с первой колонки. Метод Присоединить() также выводит переданный ему табличный документ в результирующий табличный документ, но помещает его в следующей колонке правее самой правой выведенной колонки, начиная со строки, с которой выводился предыдущий табличный документ. Как правило, метод Вывести() используется для формирования линейных отчетов, когда области макета являются областями строк и должны выво- диться последовательно, друг за другом. Например, пусть существует макет, у которого определена область строк Строка, содержащая параметр Название (рис. 17.78). 3 Конфигурация Конфигурация: Макет . П X Рис. 17.78. Макет Тогда результирующий табличный документ, для формирования которого использовался метод Вывести(), листинги 17.84, 17.85, будет выглядеть следующим образом (рис. 17.79). Листинг 17.84. Пример использования метода «Вывести()» &На Клиенте Процедура МакетДокумента(Команда) ТабДок = ВывестиПараметры(); ТабДок.Показать(); КонецПроцедуры
Листинг 17.65. Пример использования метода «Вывести()» &НаСервереБезКонтекста Функция ВывестиПараметры() ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("Макет”); ОбластьСтрока = ТабМакет.ПолучитьОбласть("Строка"); ОбластьСтрока.Параметры.Название = "Первая область"; ТабДок.Вывести(ОбластьСтрока); ОбластьСтрока.Параметры.Название = "Вторая область"; ТабДок.Вывести(ОбластьСтрока); ОбластьСтрока.Параметры.Название = "Третья область"; ТабДок.Вывести(ОбластьСтрока); Возврат ТабДок; КонецФункции Рис. 17.79. Результирующий табличный документ Теперь предположим, что используется макет, в котором определена прямоугольная область Строка с параметром Название (рис. 17.80). Конфигурация Конфигурация: Макет _ П X I 1 I 2 3 4 1 I 2 3 I 4 I S I W Рис. 17.80. Макет Для вывода этой области макета будем использовать как метод Вывести(), так и метод Присоединить(), листинг 17.86. Листинг 17.86. Пример использования метода «Присоединит^)» &НаСервереБезКонтекста Функция ВывестиПараметрыО ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("Макет"); ОбластьСтрока = ТабМакет.ПолучитьОбласть("Строка"); ОбластьСтрока.Параметры.Название = "Первая область"; ТабДок.Вывести(ОбластьСтрока); Профессиональная разработка в системе «1С:Предприятие 8»
ОбластъСтрока.Параметры.Название = "Вторая область"; ТабДок.Вывести(ОбластьСтрока); ОбластьСтрока.Параметры.Название = "Третья область"; ТабДок.Присоединить(ОбластьСтрока); ОбластъСтрока.Параметры.Название = "Четвертая область"; ТабДок.Присоединить(ОбластьСтрока); Возврат ТабДок; КонецФункции В этом случае результирующий табличный документ будет выглядеть так, как показано на рис. 17.81. Рис. 17.81. Результирующий табличный документ Метод Присоединить() используется, как правило, при создании кросс- отчетов для вывода колонок отчета. Количество выводимых колонок отчета может изменяться в зависимости от состава данных отчета и заданных параметров. Поэтому обычно создается прямоугольная область макета, которая присоединяется к заголовку строки нужное количество раз при формировании результирующего табличного документа. Методы Вывести() и Присоединить() содержат четыре параметра, смысл которых одинаков для обоих методов. Параметр Таблица является обязательным и содержит тот самый табличный документ, который должен быть добавлен в результирующий табличный документ. Параметр Уровень используется для автоматической группировки строк/ колонок результирующего табличного документа. Соседние строки/ колонки с одинаковым уровнем будут отнесены к одной группе. При использовании метода Вывести() указывается уровень для груп- пировки строк, а при использовании метода Присоединить() - уровень для группировки колонок. Для автоматической группировки строк/колонок результирующего таблич- ного документа используются методы НачатьАвтогруппировкуСтрок(), ЗакончитьАвтогруппировкуСтрокО, НачатьАвтогруппировкуКолонок() и ЗакончитьАвтогруппировкуКолонок(). Том 2
|[Габлинн£|йУдокумент| Обычно возможность автогруппировки строк/колонок результирующего табличного документа используется при выводе иерархических резуль- татов запроса. Тогда в качестве номера уровня задается уровень записи выборки результата запроса, данные которой выводятся в область макета. Пусть, например, существует макет, показанный на рис. 17.82. 3 Конфигурация Конфигурация: Макет 1 I 2 I 3 1 4 5 1 (Контрагент 2 <Контраген1> «СуммаОборот* |Номенкла*п 3 «Контрагент* «Номенклатура* «СуммаОборот* 4 5 6 Рис. 17.82. Макет Тогда, указав при формировании результирующего табличного документа уровни группировок и необходимость автоматической группировки строк (листинги 17.87, 17.88), можно получить отчет, содержащий группировки товаров по складам (рис. 17.83). Листинг 17.87. Пример использования автогруппировки строк &НаКлиенте Процедура СформироватьОтчет(Комацда) ТабДок = ЗаполнитьОтчет(); ТабДок.Показать(); КонецПроцедуры Отчет формируется в серверной внеконтекстной функции Запол- нитьОтчет(). Затем заполненный данными табличный документ возвраща- ется на клиента и показывается пользователю. Листинг 17.86. Пример использования автогруппировки строк &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос; ЗапросЛекст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, | ПродажиКомпанииОбороты.Номенклатура, | СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот |ИЗ | РешстрНакопления.Продажи.Обороты(&ДатаНачала, ЯДатаОкончания) | КАК ПродажиКомпанииОбороты СГРУППИРОВАТЬ ПО Продажи КомпанииОбороты.Номенклатура, ПродажиКомпанииОбороты.Контрагент ИТОГИ СУММА(СуммаОборот) ПО Контрагент,
инескогбТпредставленияУданных' | Номенклатура"; Запрос.УстановитьПараметр(”ДатаНачала", '2011.09.14 00:00:00'); Запрос.УстановитьПараметр(”ДатаОкончания", '2011.09.1523:59:59'); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет(" МакетОтчета1'); ОбласгьКонтрагент = ТабМакет.ПолучитьОбласть("Контрагент"); ОбластьНоменклатура = ТабМакет.ПолучитьОбластьС'Номенклатура"); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка. Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); Возврат ТабДок; КонецФункции Рис. 17.83. Сформированный отчет ПРИМЕЧАНИЕ Обратите внимание, что на рис. 17.83 в строках, которые входят в группировку второго уровня, имя контрагента выведено с отступом от левого края ячейки. Так происходит потому, что для этой ячейки в макете табличного документа установлено свойство АвтоОтступ, которое задает количество символов отступа от левого края области в зависимости от уровня группировки. В данном случае значение свойства равно 3. Это означает, что для строк первого уровня груп- пировки будет использован отступ в 3 символа, для строк второго уровня - 6 символов и т.д.
Параметр ИмяГруппы метода Вывести() табличного документа задает название группы, к которой относятся выводимые строки. Это название будет отображено во всплывающей подсказке при наведении курсора на маркер группы. Использование таких подсказок может быть полезным в многоуровневых отчетах для улучшения их читаемости. Например, если взять за основу пример, приведенный в листинге 17.88, и несколько видоизменить его (листинг 17.89), то при сворачивании/ разворачивании группировок будет выдаваться соответствующая подсказка (рис. 17.84). Листинг 17.89. Пример использования имен групп &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос; Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень(), "Продажи номенклатуры контрагенту ” + Выборка.Контрагент); КонецЦикла; КонецЦикла; Возврат ТабДок; КонецФункции Рис. 17.84. Использование имен групп Параметр Открыта метода Вывести() табличного документа определяет вид, в котором будет выводиться создаваемая группа. Если параметр имеет значение Истина, группа будет выводиться в развернутом виде Профессиональная разработка в системе «1С:Предприятие 8»
(по умолчанию). Если параметр имеет значение Ложь, группа будет выводиться в свернутом виде. Например, если в примере, приведенном в листинге 17.88, использовать этот параметр при выводе группировки Номенклатура (листинг 17.90), то результирующий документ будет содержать свернутые группировки (рис. 17.85). Листинг 17.90. Пример упраапения видом создаваемых группировок &НаСервереБезКонтекста Функция ЗаполнитьОтчетО Запрос = Новый Запрос; Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Заполнить(Выборка); ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка. Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень(), , Ложь); КонецЦикла; КонецЦикла; Возврат ТабДок; КонецФункции Рис. 17.85. Результирующий документ Аналогичного результата можно достигнуть с помощью методов табличного документа ПоказатьУровеньГруппировокСтрок() и Пока- затьУровеньГруппировокКолонок(). Эти методы имеют один обяза- тельный параметр Уровень, задающий номер уровня, до которого необходимо раскрыть группировки. Например, в примере, приведенном в листинге 17.89, можно было бы использовать следующую конструкцию (листинг 17.91). Листинг 17.91. Пример управления видом создаваемых группировок ТабДок.ПоказатьУровеньГруппировокСтрок(0); Том 2
|[Габлинн£|йУдокумент| Табличный документ содержит методы, которые позволяют опреде- лить количество уровней группировки, использованных в документе. Это методы КоличествоУровнейГруппировокСтрокО и КоличествоУров- нейГруппировокКолонок(). Использование этих методов может пона- добиться, например, если требуется организовать собственную командную панель для управления группировками табличного документа. Тогда результаты, возвращаемые этими методами, позволят организовать цикл обхода всех уровней группировок. Наряду с автоматической группировкой строк/колонок результирующего документа можно группировать строки/колонки и «вручную». Для этого используются методы табличного документа НачатьГруппуСтрок(), Закон- читьГруппуСтрок(), начатьГруппуКолонок() и ЗакончитьГруппуКолонок(). Эти методы имеют два необязательных параметра: ИмяГруппы и Откры- таЛиГруппа. Если, например, говорить про группировку строк, то в случае исполь- зования методов НачатьГруппуСтрок() и ЗакончитьГруппуСтрок() в одну группу будут объединены строки, выведенные в результирующий табличный документ между вызовами этих методов. Также можно созда- вать и вложенные группировки. Например, в результате выполнения примера, приведенного в листингах 17.92, 17.93, будет получен следующий табличный документ (рис. 17.86). Листинг 17.92. Пример использования группировки строк табличного документа &НаКпиенте Процедура МакетДокумента(Команда) ТабДок = ВывестиПараметры(); ТабДок.Показать(); КонецПроцедуры Листинг 17.93. Пример использования группировки строк табличного документа &НаСервереБезКонтекста Функция ВывестиПараметры() ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет('Макет"); ОбластьСтрока = ТабМакет.ПолучитьОбласть("Строка"); // Вывести одну строку верхнего уровня. ОбластьСтрока.Параметры.Название = "Строка верхнего уровня"; ТабДок.Вывести(ОбластьСтрока); ТабДок.НачатьГ руп пуСтрок(); // Вывести три строки группы первого уровня. ОбластьСтрока.Параметры.Название = "Группировка первого уровня"; ТабДок.Вывести(ОбластьСтрока);
инескогбТпредставленияУданных' ТабДок.Вывести(ОбластьСтрока); ТабДок.Вывести(ОбластьСтрока); ТаВДок.НачатьГ руппуСтрок(); // Вывести две строки группы второго уровня. ОбластьСтрока.Параметры.Название = "Группировка второго уровня"; ТабДок.Вывести(ОбластьСтрока); ТабДок.Вывести(ОбластьСтрока); ТабДок.ЗакончитьГруппуСтрок(); // закончить группировку строк второго уровня ТабДок.ЗакончитьГруппуСтрок(); // закончить группировку строк первого уровня Возврат ТабДок; КонецФункции ® vr, ’ w ' тЯ & LA '-и ’Я jil' м ?' - □ х ilignlil I 1 I________________________2______________________Э i-i | 1 | Строка верхнею уровня | 2 I Группировке первого уровня | э | Группировка первого уровня н | 4 | Группировка первого уровня Т | 5 | Группировка второго уровня | 6 I Группировка второго уровня В I 9 I ‘ Рис. 17.86. Результирующий табличный документ Табличный документ позволяет управлять расположением маркеров секций, сворачивающих горизонтальные и вертикальные группировки табличного документа. Для этого используются свойства ИтогиСнизу и ИтогиСправа. Эти свойства принимают значения типа Булево и по умолчанию для нового документа установлены в значение Ложь, т.е. для горизонтальных секций маркеры будут располагаться сверху, а для вертикальных - слева. Свойство табличного документа ОтображатьГруппировки позволяет управлять отображением существующих группировок. По умолчанию это свойство для нового документа установлено в значение Истина. Это означает, что группировки будут отображены. Получение строк макета на разных языках При получении различных областей макета можно указать язык, на котором должны быть получены строки, содержащиеся в макете. Если в конфигурации определено несколько языков (Общие к Языки), то система предоставляет возможность задать значение любой строки, содержа- щейся в конфигурации, на каждом из языков, определенных в конфигурации. Таким образом, если макет содержит текстовые строки, то в общем случае их значения могут быть указаны отдельно, для каждого языка. Предположим, что существует макет (рис. 17.87), в котором определена область Строка, содержащая строку на разных языках.
Q Конфигурация Конфигурация: Макет _ □ X 1111 2 1 - |Строка | 2 I Сотрудник — I 3 I I S I I I» Рис. 17.87. Макет Если в палитре свойств ячейки R2C2, в свойстве Текст нажать кнопку открытия (со значком лупы), можно открыть диалог для ввода строк на разных языках. Для языка Русский (код гл) указано значение Сотрудник, а для языка Английский (код еп) - значение Employee (рис. 17.88). Рис. 17.88. Строка на разных языках При формировании результирующего табличного документа на основе такого макета указанная строка может быть получена как на русском языке, так и на английском. Для этого используется свойство табличного документа КодЯзыкаМакета (листинг 17.94). После того как область макета получена в виде табличного документа, ей следует установить нужный код языка (в нашем случае еп или ш). Тогда при выводе этой области в результирующий табличный документ для строк на разных языках, содержащихся в выводимом документе, будет получено их значение на языке, код которого совпадает с кодом, указанным в свойстве КодЯзыкаМакета. Листинг 17.94. Получение области на указанном языке &НаСервереБезКонтекста Функция ВывестиПараметры() ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет('Макет”); ОбластьСтрока = ТабМакет.ПолучитьОбласть("Строка"); // Вывести строки, содержащиеся в области, на русском языке. ОбластьСтрока.КодЯзыкаМакета = "ru"; ТабДок.Вывести(ОбластьСтрока); // Вывести строки, содержащиеся в области, на английском языке. ОбластьСтрока.КодЯзыкаМакета = "еп"; ТабДок.Вывести(ОбластьСтрока); Возврат ТабДок; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
Результирующий табличный документ будет выглядеть так, как показано на рис. 17.89. Рис. 17.89. Результирующий табличный документ В том случае, если свойству КодЯзыкаМакета указан код языка, отсутс- твующий в конфигурации, будет выведена пустая строка. По умолчанию свойство КодЯзыкаМакета имеет значение Неопределено. В этом случае при выводе областей макета в табличный документ будет использован код языка макета, соответствующий языку, назначенному для текущего пользо- вателя. Если текущему пользователю язык не назначен, будет использован код языка, установленного для свойства конфигурации Основной язык. Использование расшифровки в табличном документе Табличный документ предоставляет возможность использовать расшиф- ровку для получения детальной информации при нажатии на определенные ячейки результирующего табличного документа. ПРИМЕЧАНИЕ Следует заметить, что расшифровка может быть использована как непосредственно в табличном документе, так и в табличном доку- менте, размещенном в форме (поле вида ПолеТабличногоДокумента). Однако возможности использования расшифровки непосредственно в табличном документе ограничены, по сравнению с полем таблич- ного документа. Об использовании расшифровки в поле табличного документа рассказывается в разделе «Расшифровка в поле табличного документа», стр. 404. Для того чтобы существовала возможность использования расшифровки, должны быть выполнены три условия: ячейкам/рисункам табличного документа, для которых должна выполняться расшифровка, должны быть заданы имена параметров расшифровки (свойство ПараметрРасшифровки области ячеек таблич- ного документа или рисунка табличного документа); в процессе вывода областей макета в результирующий табличный документ параметрам расшифровки должны быть присвоены значения, отличные от Неопределено; результирующий табличный документ должен обеспечивать запрет редактирования тех ячеек/рисунков, для которых предполагается использовать расшифровку. Для этого используется обычно либо свойство ТолькоПросмотр, либо свойство Защита табличного доку- мента. Том 2
|[Габлинн£|йУдокумент| Если все перечисленные условия выполнены, то при наведении курсора на область/рисунок табличного документа, допускающий расшифровку, курсор принимает вид креста с расположенной на нем лупой. Это говорит о том, что данная ячейка допускает расшифровку. При двойном щелчке мышью на такой ячейке будет выполнено стандартное действие со значе- нием, находящимся в параметре расшифровки данной ячейки: для значений примитивных типов будет отображено их значение в отдельном окне; для ссылочных значений будет открыта основная форма объекта, используемая для редактирования данных объекта. Таким образом, непосредственно в табличном документе расшифровка используется, как правило, для того, чтобы предоставить возможность просмотра и редактирования данных ссылочных объектов, представления которых содержатся в результирующем табличном документе. Выполнение расшифровки возможно не только по двойному, но и по одинарному щелчку мышью на ячейке. Для этого используется свойство области/рисунка табличного документа Гиперссылка. Если это свойство установлено в значение Истина, то при наведении курсора на такую ячейку он будет принимать форму ладони и описанные выше действия будут выполняться по одинарному щелчку мыши. Также область ячеек табличного документа обладает свойством Использо- ваниеРасшифровки, которое принимает значения системного перечисления ИспользованиеРасшифровкиТабличногоДокумента (табл. 17.4). Таблица 17.4. Значения системного перечисления «ИспопьзованиеРасшифровкиТабпичногоДокумента» Значение Описание БезОбработки Курсор не меняет свой внешний вид, и расшифровка не выполняется Ячейка Расшифровка вызывается только для ячейки, содержащей значение параметра расшифровки Строка Расшифровка выполняется для всех ячеек строки, следующих за ячейкой, содержащей значение параметра расшифровки В качестве примера использования расшифровки рассмотрим формиро- вание отчета по продажам номенклатуры контрагентам, в котором при нажатии на контрагента или номенклатуру будет открываться форма соот- ветствующего элемента справочника Контрагенты или Номенклатура. Используем макет, показанный на рис. 17.90. В этом макете для ячеек, в которые выводится представление контрагента, указано имя параметра расшифровки РасшифровкаКонтрагента, а для ячеек, в которые выво- дится представление номенклатуры, указано имя параметра расшифровки РасшифровкаНоменклатуры.
и.ческого1представления!данн£1Х' Q Конфигурация Конфигурация: МакетОтчета 1 J 4. | Контрагент! 2 [Номенклап 3 «НоменклатураПредставление» <СумыаОборот> «СуммаООорот» Свойства: Ячейки ;1И1' х ~ [Ячейки ▼Основные: / I I t / Vе Размещение! екста Имя Защита Гиперссылка РежимИзмененияРазмера ▼Макет: Заполнение /(параметр Параметр ИспольэованиеРасшиФровки [Ячейка I* [КонтрагенгПредставление Ишлцщщдшиия ► Значения: н 3 з 3i 3 3 3 ► Положение: ► Оформление: S2 Рис. 17.90. Макет табличного документа Для формирования отчета используем код, представленный в лис- тингах 17.95, 17.96. Листинг 17.95. Пример использования расшифровки &НаКлиенте Процедура СформироватьОтчет(Команда) ТаВДок = ЗаполнитьОтчет(); // Установить режим просмотра документа. ТаВДок.ТолькоПросмотр = Истина; ТабДок.Показать(); КонецПроцедуры Листинг 17.96. Пример использования расшифровки &НаСервереБезКонтекста Функция ЗаполнитьОтчет() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, | ПродажиКомпанииОбороты. Контрагент.Представление КАК | КонтрагентПредставпение, | ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, | ПродажиКомпанииОбороты. Номенклатура.Представление КАК | НоменклатураПредставление, | СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот
|ИЗ I РешсгрНакопления.Продажи.Обороты(&ДатаНачала, ЯДатаОкончания) | КАК ПродажиКомпанииОбороты I ^ГРУППИРОВАТЬ ПО | ПродажиКомпанииОбороты.Номенклатура, | ПродажиКомпанииОбороты.Контрагент | ИТОГИ | СУММА(СуммаОборот) |ПО | Контрагент, | Номенклатура”; Запрос.УстановитьПараметр(''ДатаНачала“, '2011.09.14 00:00:00'); Запрос.УстановитьПараметр(''ДатаОкончания”, '2011.09.15 23:59:59'); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапросе.ПоГ руппировкам); ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет('Макет"); ОбластьКонтрагент = ТабМакет.ПолучитьОбласть("Контрагент"); ОбластьНоменклатура = ТабМакет.ПолучитьОбласть("Номенклатура"); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий() Цикл ОбласгьКонтрагент.Параметры.Заполнить(Выборка); // Установить расшифровку поля "Контрагент" группировки "Контрагент”. ОбласгьКонтрагент.Параметры.РасшифровкаКонтрагента = Выборка.Контрагент; ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(ВыборкаНоменклатура); // Установить расшифровку полей "Контрагент" и "Номенклатура" // группировки "Номенклатура". ОбластьНоменклатура.Параметры.РасшифровкаКонтрагента = Выбор каНоменклатура.Контрагент; ОбластьНоменклатура.Параметры.РасшифровкаНоменклатуры = Выбор каНоменклатура.Номенклатура; ТабДок.Вывести(ОбласгьНоменклатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); Возврат ТабДок; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
Отчет формируется в серверной внеконтекстной функции Запол- нитьОтчет(). В этой функции перед выводом областей макета в результирующий табличный документ параметрам расшифровки, содер- жащимся в этих областях, присваиваются значения, имеющие тип ссылки на контрагента или на номенклатуру. Затем заполненный данными табличный документ возвращается на клиента и показывается пользователю. Перед показом результирую- щего табличного документа на клиенте ему устанавливается свойство ТолькоПросмотр. В результате будет сформирован табличный доку- мент, в котором при двойном щелчке, например, по ячейке, содержащей представление контрагента, будет открываться форма для просмотра и редактирования данных этого контрагента (рис. 17.91). @ 'V- Таблица - Конфигурация * (ЮПредприялие) L<i Ъ? ЛУ 12 ' 2____________I_________________3__________________I_________4_______________5 I________6. Никитин Юрий 19 465 Завод РТИ 11959 Завод РТИ 1 С: Бухгалтерия 7.7 Базовая версия S00 Завод РТИ Доставка 400 I Завод РТИ |Консуттаим го настройке ОС Winaws 6 000 Завод РТИ Windows ХР Professionai Russian CD 350 Завод РТИ NgwcyjbTaifM го настройке 1С 600 Завод РТИ Vtatows ХР Home Edbon Russian UPG СС 1 900 Завод РТИ________1C:AchqtT77____________________________________2 000 @ Завод РТИ [КсЙфага.. ИСПрвдприягие) ISj 'ilil зЛ □ X Завод РТИ (Контрагенты) | Записать и закрыть 1|g| Все действия i (?) Код: [00014 | Наименование: [ИИПЩ| Родитель: [Покуигелн... Q| Код города: [ 2 403 000 000 500 000 000 000 000] Кодрегиона: [ 2400 000 000 000000 000 000 000] Рис. 17.91. Сформированный отчет Печать табличного документа Табличный документ может быть распечатан на принтере, причем система предоставляет возможность настройки различных параметров печати не только интерактивными средствами (в диалоге настройки печати), но и средствами встроенного языка. Для того чтобы распечатать табличный документ, используется метод табличного документа Напечатать(). Этот метод содержит один параметр ДиалогПечати, который определяет необходимость показа диалога печати перед печатью. Параметр принимает значения системного перечисления РежимИспользованияДиалогаПечати: Использовать или НеИспользовать. Значение по умолчанию НеИспользовать. Для того чтобы предоставить пользователю возможность вручную настраивать параметры печати, Том 2
(Габлинш^йУдокумент! в параметр метода Напечатать() должно быть передано значение Исполь- зовать (листинг 17.97). Листинг 17.97. Печать табличного документа с использованием диалога печати ТабДок = ПолучитьМакетДокумента(”Макет"); ТабДок.Напечатать(РежимИспользованияДиалогаПечати.Использовать); ВНИМАНИЕ! Следует учитывать, что если свойства табличного документа ВысотаТабпицы и ШиринаТабпицы равны нулю (подробнее смотрите на стр. 369), то при попытке печати такого документа будет выдано сообщение: Нет информации для вывода на печать, и печать будет отменена. По умолчанию печать будет осуществляться на принтер, который уста- новлен в операционной системе как принтер по умолчанию. Для того чтобы указать определенный принтер, на который должна осущест- вляться печать, используется свойство табличного документа ИмяПринтера (листинг 17.98). Листинг 17.98. Печать на указанный принтер ТабДок = ПолучитьМакетДокумента("Макет"); ТабДок.ИмяПринтера = "HP LaserJet 6L"; ТабДок.Напечатать(); Если принтер с указанным именем не установлен в операционной системе или если имя принтера не указано, печать будет осуществляться на принтер по умолчанию. Перед печатью табличного документа ему может быть установлен ряд параметров, аналогичных тем параметрам, которые задаются в диалоге настройки печати. Для этого используются следующие свойства таблич- ного документа. ОриентацияСтраницы - задает ориентацию страницы. Принимает значения системного перечисления ОриентацияСтраницы: Ландшафт или Портрет. По умолчанию используется значение Портрет. ПолеСверху, ПолеСлева, ПолеСнизу, ПолеСправа - эти свойства задают ширину полей отступа при печати в миллиметрах. По умолчанию для всех свойств используется значение 10. ОбластьПечати - задает область табличного документа, которая будет выводиться на печать. Содержит значение типа ОбластьЯчеекТаблич- ногоДокумента или Неопределено. Значение Неопределено - это значение по умолчанию. В этом случае на печать будет выведена область табличного документа, ограниченная свойствами ШиринаТабпицы и ВысотаТабпицы табличного документа.
инескогбТпредставленияУданных' Если это свойство содержит прямоугольную область табличного доку- мента, то будет напечатана указанная область. Если свойство содержит область строк, то будет напечатана часть этой области, ограниченная справа значением свойства табличного документа ШиринаТаблицы. Если свойство содержит область колонок, то будет напечатана часть этой области, ограниченная снизу значением свойства табличного документа ВысотаТабпицы. КоличествоЭкземпляров - задает количество экземпляров табличного доку- мента, которые будут выведены на печать. Принимает значения типа Число и Неопределено. Неопределено - значение по умолчанию. В этом случае количество экземпляров будет определяться настройками принтера, на который осуществляется печать. Экземпляров на странице - задает количество страниц, на которые будет разбит текст табличного документа, напечатанный на одном листе бумаги. Может принимать числовые значения 0, 1 и 2 и значение Неопределено. Значение 1 означает, что на одном листе будет напечатана одна страница. Значение 2 означает, что табличный документ, печатаемый на одном листе бумаги, будет разбит на две страницы по вертикали. Значение 0 задает автоматическое определение количества страниц на листе. Значение неопределено означает, что количество экземпляров на странице будет определяться настройками принтера, на который осуществляется печать. Разбор по копиям - позволяет управлять последовательностью печати страниц многострочного табличного документа при выводе на печать нескольких экземпляров документа. Если свойство установлено в значение истина, то печать будет выпол- няться в следующей последовательности: Экземпляр! Страница! Экземпляр! Страница? Экземпляр! СтраницаИ Экземпляр? Страница! Экземпляр? Страница? Экземпляр? СтраницаИ ЭкземплярК Страница! ЭкземплярИ Страница? ЭкземплярИ СтраницаИ
Если свойство установлено в значение Ложь, то печать будет выполняться в следующей последовательности: Экземпляр! Страница! Экземпляр? Страница! ЭкземплярИ Страница! Экземпляр! Страница? Экземпляр? Страница? ЭкземплярИ Страница? Экземпляр! СтраницаИ Экземпляр? СтраницаИ ЭкземплярИ СтраницаИ Значение Неопределено означает, что последовательность вывода страниц на печать будет определяться настройками принтера, на который осущест- вляется печать. Свойства МасштабПечати и АвтоМасштаб позволяют управлять масштабом печатаемого документа. Свойство АвтоМасштаб принимает значения типа Булево. Если значение свойства АвтоМасштаб установлено в Истина и по ширине табличный документ занимает более одной страницы, его масштаб будет уменьшен таким образом, чтобы документ помещался на одну страницу по ширине. Значение Ложь означает, что масштаб печати будет определяться свойством МасштабПечати. Свойство МасштабПечати принимает числовые значения и значение Неоп- ределено. Это свойство задает масштаб печатаемого табличного документа в процентах. Значение Неопределено - значение по умолчанию. Оно озна- чает, что масштаб будет определяться настройками принтера, на который осуществляется печать. Свойство ЧерноБелаяПечать позволяет печатать документ в черно-белом режиме. По умолчанию это свойство имеет значение Неопределено. Это означает, что режим печати будет определяться настройками того принтера, на который осуществляется печать. Значение Ложь означает, что будет выполняться печать в цветном режиме, значение Истина озна- чает, что печать будет выполняться в черно-белом режиме. При печати табличного документа можно определить строки/колонки, которые будут печататься на каждом новом листе. Для этого исполь- зуются свойства табличного документа ПовторятьПриПечатиСтроки Профессиональная разработка в системе «1С:Предприятие 8»
и ПовторятьПриПечатиКолонки. Эти свойства содержат значения типа ОбластьЯчеекТабличногоДокумента. Наиболее распространенным случаем использования этих свойств является повторение на каждом новом листе шапки таблицы, когда таблица располагается на нескольких страницах. Табличный документ позволяет использовать при печати колонтитулы. Колонтитулы представляют собой специальные области, вставляемые в верхнюю и нижнюю часть каждой страницы документа. В колонтитулы обычно помещается информация о номере страницы, названии документа, названии глав или разделов документа и т. д. В табличном документе верхний и нижний колонтитулы описы- ваются объектами КолонтитулТабличногоДокумента. Для доступа к верхнему колонтитулу используется свойство табличного документа ВерхнийКолонтитул, для доступа к нижнему - НижнийКолонтитул. Колонтитул состоит из трех логических частей: левой, центральной и правой. Каждая из этих частей может содержать значение типа Строка, которое и будет напечатано на каждом листе документа. Для доступа к этим частям колонтитула используются свойства ТекстСлева, ТекстВЦентре и ТекстСправа колонтитула табличного доку- мента. Эти свойства принимают значения типа Строка и могут содержать ряд управляющих конструкций (табл. 17.5). Таблица 17.5. Управляющие конструкции колонтитула табличного документа Конструкция Описание [&НомерСтраницы] При печати вместо данной управляющей конструкции будет выведен номер страницы [&СтраницВсего] При печати вместо данной управляющей конструкции будет выведено количество страниц в документе [ЗДата] При печати вместо данной управляющей конструкции будет выведена текущая дата [&Время] При печати вместо данной управляющей конструкции будет выведено текущее время Помимо собственно текста колонтитула, могут быть заданы различные свойства, определяющие внешний вид колонтитулов. Свойство ВертикальноеПоложение определяет способ выравнивания текста колонтитула по вертикали в пределах отведенной для него области (Верх, Низ, Центр). Значение по умолчанию - Низ. Размеры верхнего и нижнего колонтитулов задаются свойствами таблич- ного документа РазмерКолонтитулаСверху и РазмерКолонтитулаСнизу. Размеры задаются в миллиметрах и по умолчанию имеют значение 10. Свойство НачальнаяСтраница принимает значения типа Число и опреде- ляет номер страницы, начиная с которого будет выводиться колонтитул. По умолчанию имеет значение 0. Том 2
(Габлинш^йУдокумент Свойство Шрифт позволяет установить шрифт для вывода колонтитула. Принимает значения типа Шрифт. Свойство Выводить определяет необходимость вывода колонтитула. По умолчанию это свойство имеет значение Ложь. Это означает, что колонтитулы не выводятся. Пример задания колонтитулов документа показан в листинге 17.99. Листинг 17.99. Пример использования колонтитулов ТабДок = Новый ТабличныйДокумент; Область = ТабДок.Область(2,2); Область.Текст = "Тест печати"; ТабДок.ОбластьПечати = Область; ВерхнийКолонтитул = ТабДок.ВерхнийКолонтитул; ВерхнийКолонтитул. Выводить = Истина; ВерхнийКолонтитул.ТекстСлева = "Отчет составлен [&Дата] в [&Время]"; НижнийКолонтитул = ТабДок.НижнийКолонтитул; НижнийКолонтитул. Выводить = Истина; НижнийКолонтитул.ТекстВЦентре = "Страница [&НомерСтраницы] из [&СтраницВсего]"; ТабДок.Напечатать(); В процессе формирования результирующего табличного документа на основе макета могут использоваться методы ВывестиВертикальныйРаз- делительСтраниц() и ВывестиГоризонтальныйРазделительСтраниц(). Эти методы выводят в результирующий документ соответственно верти- кальный и горизонтальный разделители страниц. Например, эти методы могут быть использованы при печати документов, формы которых изна- чально подразумевают размещение информации на двух страницах. Метод табличного документа КоличествоСтраниц() возвращает коли- чество страниц в документе с учетом текущих настроек печати. Использование этого метода может быть полезным перед печатью резуль- тирующего табличного документа для информирования пользователя о количестве страниц, которые будут напечатаны. При формировании результирующего табличного документа может возникнуть задача - создать определенное оформление каждого печата- емого листа документа. Например, каждый лист документа, выводимый на печать, должен содержать однотипную шапку и однотипный подвал, в котором может быть указана итоговая информация по данным, выве- денным на этом листе. В этом случае после вывода шапки нужно вывести в табличный документ столько строк, чтобы на текущем печатаемом листе поместилась еще и область подвала. Для решения подобных задач предназначены методы табличного документа ПроверитьВыводО и Прове- ритьПрисоединение().
инескогбТпредставленияУданных' Метод ПроверитьВыводО, примененный к результирующему таблич- ному документу, позволяет определить, поместится ли на одном листе (по высоте) результирующий табличный документ (при текущих настройках печати), если в него вывести документы, переданные в пара- метре этого метода. Аналогичным образом метод ПроверитьПрисоединение(), примененный к результирующему табличному документу, позволяет определить, поместится ли на одном листе (по ширине) результирующий табличный документ (при текущих настройках печати), если к нему присоединить документы, переданные в параметре этого метода. Параметр этих методов может принимать значения типа ТабличныйДоку- мент или Массив. Если необходимо проверить добавление/присоединение одного табличного документа, то этот документ и передается в параметре указанных методов. Если необходимо проверить добавление/присоеди- нение нескольких табличных документов, то в этом случае в параметр метода передается массив, состоящий из добавляемых/присоединяемых документов. Указанные методы возвращают значение типа Булево. Значение Истина говорит о том, что результирующий табличный документ помещается на одну страницу. Значение Ложь говорит о том, что документ не помес- тится на одну страницу. Для примера рассмотрим формирование результирующего табличного документа на основе макета, в котором определены три области: Шапка, Строка и Подвал (рис. 17.92). 3 Конфигурация Конфигурация: Макет « □ X 1 1 1 1 2 3 I 4 I 5 I 6 I 7 — Шапка | 1 | 1 2 1 1 3 1 1 4 1 1 5 1 Строка | 6 1 Подвал | 7 1 1 8 1 9 1 10 I 111 I I 12 I Рис. 17.92. Макет табличного документа Требуется, чтобы каждая страница результирующего табличного доку- мента начиналась с области Шапка, содержала некоторое число областей Строка и заканчивалась областью Подвал, причем каждая страница должна быть максимально заполнена данными и не содержать пустых областей внизу страницы. Пример формирования документа по указанным правилам показан в листингах 17.100, 17.101. ^@©
Листинг 17.100. Пример использования метода «ПроверитьВыводО» &НаКлиенте Процедура ПечатьМакета(Команда) ТабДок = ПроверитьВыводДокумента(); ТабДок.Напечатать(); КонецПроцедуры Листинг 17.101. Пример использования метода «ПроверитьВыводО» &НаСервереБезКонтекста Функция ПроверитьВыведДокументаО ТабМакет = ПолучитьОбщийМакет("Макет"); ОбластьШапка = ТабМакет.ПолучитьОбласть("Шапка"); ОбластьСтрока = ТабМакет.ПолучитьОбласть('Строка”); ОбластьПодвал = ТабМакет.ПолучитьОбласть("Педвал"); // Сформировать массив областей для проверки. СтрокаСПодввлом = Новый Массив; СтрокаСПодвалом.Добавить(ОбластьСтрока); СтрокаСПодввлом.Добавить(ОбластьПодввл); ТабДок = Новый ТабличныйДокумент(); // Заполнение параметров области "Шапка". ОбластьШапка.ТекущаяОбласть.Текст = "ШапкаОтчета"; ОбластьШапка.ТекущаяОбласгь.Шрифт = Новый Шрифт(,, Истина); ТабДок.Вывести(ОбластьШапка); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, | ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, | СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот |ИЗ | РегистрНакопления.Продажи.Обороты() КАК ПродажиКомпанииОбороты I ^ГРУППИРОВАТЬ ПО | ПродажиКомпанииОбороты.Номенклатура, | ПродажиКомпанииОбороты.Контрагент"; Выборка = Запрос.Выполнить().Выбрать(); // Цикл обхода данных, выводимых в результирующий документ. Пока Выборка.Следующий() Цикл Если ТабДок.ПроверитьВывед(СтрокаСПодвалом) Тогда // Заполнение значений параметров области "Строка". ОбластьСтрока.ТекущаяОбласть.Текст = Строка(Выборка.Контрагент)+" 11 +Строка(Выборка.Номенклатура)+" " +Строка(Выборка.СуммаОборот); ТабДок.Вывести(ОбластьСтрока); Иначе Профессиональная разработка в системе «1С:Предприятие 8»
II Заполнение значений параметров области "Подвал". ОбластьПодвал.ТекущаяОбласть.Текст = "ПодвалОтчета"; ОбластьПодвал.ТекущаяОбласть.Шрифт = Новый Шрифт(,, Истина); ТабДок.Вывести(ОбластьПодвал); ТабДок.ВывестиГоризонтальныйРазделительСтраницО; // Заполнение параметров области "Шапка". ОбластьШапка.ТекущаяОбластъ.Текст = "ШапкаОтчета"; ОбластьШапка.ТекущаяОбласть.Шрифт = Новый Шрифт(,, Истина); ТабДок.Вывести(ОбластьШапка); // Заполнение параметров области "Строка". ОбластьСтрока.ТекущаяОбласть.Текст = Строка(Выборка.Контрагент)+" " +Строка(Выборка.Номенклатура)+ ’ ” +Строка(Выборка.СуммаОборот); ТабДок.Вывести(ОбластьСтрока); КонецЕсли; КонецЦикла; // Заполнение параметров области "Подвал". ОбластъПодвал.ТекущаяОбласть.Текст = "ПодвалОтчета"; ОбластьПодвал.ТекущаяОбласть.Шрифт = Новый Шрифт(,, Истина); ТабДок.Вывести(ОбластьПодвал); Возврат ТабДок; КонецФункции Сначала вызывается серверная внеконтекстная функция ПроверитьВы- водДокумента(). В этой функции формируется массив, состоящий из двух областей макета: Строка и Подвал. В цикле вывода области Строка в результирующий табличный документ выполняется проверка, помес- тится ли результирующий табличный документ на одну страницу, если к нему добавить области Строка и Подвал. В том случае, если документ помещается, выводится область Строка и осуществляется переход к следу- ющему шагу цикла. Если документ не помещается, выводится область Подвал, и формируется следующая страница документа: выводится горизонтальный разделитель страниц, область Шапка и область Строка. Затем результирующий табличный документ возвращается на клиента и печатается. Свойства областей и рисунков табличного документа, управляющие печатью Свойства и методы табличного документа, перечисленные в предыдущем разделе, необходимо применять непосредственно к тому документу, который будет напечатан, т. е. если результирующий табличный документ формируется на основе макета, то оформлять нужно именно результиру- ющий табличный документ, а не макет или области макета. Свойства же областей и рисунков табличного документа, управляющие печатью, могут быть применены как к областям/рисункам результа- том 2
|[Габлинн£|йУдокумент| рующего табличного документа, так и к областям/рисункам макета или областей макета. При выводе областей макета в результирующий табличный документ значения этих свойств будут сохранены. Рисунки табличного документа имеют свойство ВыводитьНаПечать, которое позволяет управлять выводом рисунка табличного документа на печать. Оно принимает значения типа Булево. Если свойство имеет значение Истина (значение по умолчанию для новых рисунков), рисунок будет напечатан. Для рисунков, которые являются примечаниями, управление выводом на печать также осуществляется с помощью этого свойства, однако оно будет использоваться только в том случае, если у табличного документа интерактивно включен режим отображения примечаний (Таблица ► Отоб- ражать примечания). В противном случае независимо от значения свойства ВыводитьНаПечать примечания не будут напечатаны. Область ячеек табличного документа обладает свойством ВместеСоСледу- ющим, которое позволяет объединять строки или колонки области таким образом, чтобы при разделении на страницы они всегда оказывались на одной странице. Следует учитывать, что это свойство применимо только к областям строк или областям колонок. По умолчанию свойство имеет значение Ложь. Для того чтобы объединение было выполнено, его необходимо установить в значение Истина. Также область ячеек табличного документа имеет свойства КонецСтра- ницы и НачалоСтраницы. Эти свойства принимают значения типа Булево и применимы только для областей строк/колонок. Значение свойства КонецСтраницы, равное Истина, говорит о том, что данная область явля- ется последней на странице. Значение свойства НачалоСтраницы, равное Истина, говорит о том, что данную область необходимо выводить с новой страницы. Использование табличного документа в форме Для отображения табличного документа в форме необходимо создать реквизит типа ТабличныйДокумент и связать его с полем формы вида Поле табличного документа. При этом к функциональности табличного документа, которая была описана выше, добавляются возможности, связанные с наличием контекста формы и модуля формы: обработка событий, возникающих при манипулировании табличным документом; обработка расшифровки; обработка нажатий в табличном документе. Реквизит типа ТабличныйДокумент содержит в себе табличный документ, которым он управляет, а связанное с ним поле формы вида Поле таблич- ного документа отображает содержимое табличного документа. ^©и
инескогбТпредставленияУданных' Например, необходимо сформировать и отразить в форме обработки данные о продажах номенклатуры контрагентам с возможностью расшиф- ровки данных по номенклатуре и контрагенту. Этот пример можно посмотреть в демонстрационной конфигурации «Средства графического представления данных», прилагающейся к книге на компакт-диске, в обработке Работа с табличным документом, на закладке Табличный документ в форме. Для этого создадим реквизит формы Результат типа ТабличныйДокумент. Перетащим реквизит в дерево элементов формы и получим поле формы ввда Поле табличного документа, связанное с этим реквизитом. Это поле будет отображать табличный документ в форме обработки. Затем создадим команду Сформировать и соответствующую ей кнопку формы, по нажатии которой табличный документ будет заполняться данными о продажах. В обработчике команды напишем следующий код (листинг 17.102). Листинг 17.102. Обработчик команды «Сформировать» &НаКлиенте Процедура Сформировать(Команда) Результат = ЗаполнитьОтчет(); КонецПроцедуры По команде Сформировать вызывается внеконтекстная серверная функция ЗаполнитьОтчет(), которая подробно рассматривалась в разделе «Использование расшифровки в табличном документе», стр. 395. Здесь она приводится еще раз (листинг 17.103). Листинг 17.103. Функция «ЗаполнитьОтчетО» &НаСервереБезКонтекста Функция ЗаполнитьОтчетО Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, | ПродажиКомпанииОбороты.Контрагент.Представление КАК | КонтрагентПредставление, | ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, | ПродажиКомпанииОбороты.Номенклатура.Представление КАК | НоменкпатураПредставление, | СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот |ИЗ | РегистрНакопления.Продажи.Обороты(&ДатаНачала, &ДатаОкончания) | КАК ПродажиКомпанииОбороты I ^ГРУППИРОВАТЬ ПО | ПродажиКомпанииОбороты.Номенклатура, | ПродажиКомпанииОбороты.Контрагент |ИТОГИ | СУММА(СуммаОборот) ^©2
|П0 I Контрагент, I Номенклатура"; Запрос.УстановитьПараметрС'ДатаНачала", '2011.09.14 00:00:00'); Запрос.УстановитьПараметр("ДатаОкончания", '2011.09.15 23:59:59'); Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГ руппировкам); ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучитьОбщийМакет("Макет”); ОбластьКонтрагент = ТабМакет.ПолучитьОбласть("Контрагент”); ОбластьНоменклатура = ТабМакет.ПолучитьОбласть(“Номенкпатура"); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий() Цикл ОбластьКонтрагент.Параметры.Запопнить(Выборка); II Установить расшифровку поля "Контрагент" группировки "Контрагент". ОбластьКонтрагент.Параметры.РасшифровкаКонтрагента = Выборка.Контрагент; ТабДок.Вывести(ОбластъКонтрагент, Выборка.Уровень()); ВыборкаНоменкпатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменкпатура.Следующий() Цикл ОбластьНоменкпатура.Параметры.Запопнигь(Выборка Номенклатура); II Установить расшифровку полей "Контрагент" и "Номенклатура" II группировки "Номенклатура”. ОбластьНоменклатура.Параметры.РасшифровкаКонтрагента = Выбор каНоменклатура.Контрагент; ОбластьНоменклатура. Параметры.РасшифровкаНоменклатуры = Выбор каНоменклатура.Номенклатура; ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончигьАвтогруппировкуСтрок(); Возврат ТабДок; КонецФункции Табличный документ, сформированный в этой функции, возвращается на клиента и присваивается реквизиту Результат. После этого табличный документ автоматически отображается в форме обработки в поле таблич- ного документа (рис. 17.93). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 17.93. Формирование табличного документа в форме Для того чтобы открыть табличный документ, содержащийся в форме, в отдельном окне, нужно вывести его в новый табличный документ, а затем показать этот документ (листинги 17.104, 17.105). Листинг 17.104. Показ табличного документа, содержащегося в форме, в отдельном окне &НаКлиенте Процедура Показать(Команда) ТабДок = ОткрытьВНовомОкне(); ТабДок.Показать(); КонецПроцедуры Листинг 17.105. Показ табличного документа, содержащегося в форме, в отдельном окне &НаСервере Функция ОткрытьВНовомОкне() ТабДок = Новый ТабличныйДокумент(); ТабДок.Вывести(Результат); Возврат ТабДок; КонецФункции Том 2
1Габлинн£|й7докуменТ| Использование события «ПриАктивизацииОбласти» Поле табличного документа обладает рядом событий, которые могут быть обработаны в обработчиках, расположенных в модуле формы. Прежде всего, это событие ПриАктивизацииОбласти. Оно возникает при смене текущей области табличного документа. Смена текущей области происходит, например, при нажатии клавиш управления курсором, при нажатии мыши, при нажатии клавиши табуляции и т. д. В обработчик события передается элемент управления, вызвавший это событие, в данном случае - поле табличного документа. Свойство Текущая Область поля табличного документа будет содержать ту область, которая стала текущей в результате смены текущей области. Таким образом, в обработчике события ПриАктивизацииОбласти можно проанализировать текущую область поля табличного документа и выполнить необходимые действия. При этом следует помнить, что текущей областью может быть как область ячеек табличного документа, так и рисунок табличного документа (листинг 17.106). Листинг 17.106. Пример использования обработчика события «ПриАктивизацииОбласти» поля табличного документа Процедура РезулыатПриАкгивизацииОбласги(Элемент) ТекОбласть = Элемент.ТекущаяОбласть; Если ТипЗнч(ТекОбласть) = ТипС'ОбластьЯчеекТабличногоДокумента'') Тогда //...алгоритм обработки. ИначеЕсли ТипЗнч(ТекОбласть) = Тип("РисунокТабличногоДокумента") Тогда //...алгоритм обработки. КонецЕсли; КонецПроцедуры Событие возникает на клиенте. В обработчике данного события нельзя использовать серверные методы формы с директивой компиляции &НаСервере. Использование события «Выбор» Событие Выбор поля табличного документа возникает при выборе какой- либо области или рисунка табличного документа. Если для области или рисунка табличного документа разрешен только просмотр и уста- новлено свойство Гиперссылка, то выбор осуществляется по одинарному щелчку мыши или нажатию клавиши Enter. В остальных случаях выбор осуществляется по двойному щелчку мыши или при нажатии клавиши Enter.
инескогбТпредставленияУданных' В процедуру обработки события Выбор передаются три параметра: Элемент - поле табличного документа, которое вызвало это событие; Область - область/рисунок табличного документа, для которого был выполнен выбор; Стандартная обработка - признак выполнения стандартных действий при выборе. По умолчанию имеет значение Истина. Это означает, что будет начато редактирование выбранной области/рисунка табличного документа (в том случае, если редактирование разрешено). В обработ- чике события Выбор этот параметр может быть установлен в значение Ложь - тогда редактирование выбранной области/картинки осущест- вляться не будет. В качестве примера использования события Выбор можно рассмотреть сохранение рисунка, выведенного в табличный документ, при щелчке на нем мышью. Для этого свойство Гиперссылка рисунка должно быть установлено в значение Истина, а результирующий табличный документ не должен иметь возможности редактирования (листинг 17.107). Листинг 17.107. Пример использования обработчика события «Выбор» поля табличного документа Процедура ПопеТабличногоДокументаВыбор(Элемент, Область, СтандартнаяОбработка) Если ТипЗнч(Область) = Тип("РисунокТабличногоДокумента") Тогда Если Область.ТипРисунка = ТипРисункаТабличногоДокумента.Картинка Тогда II Организовать диалог выбора файла для сохранения картинки. Диалог = Новый ДиалогВыбораФайла(РежикЩиалогаВыбораФайла.Сохранение); Диалог.Заголовок = "Сохраненение рисунка”; II Получить строковое представление формата картинки. ФорматРисунка = НРег(Строка(Область.Картинка.Формат())); Если ФорматРисунка = ФорматКартинки.НеизвестныйФормат Тогда Предупреждение("Формат картинки неизвестен, | задайте расширение сохраняемого файла самостоятельно"); Иначе Диалог.Фильтр = "Рисунок (*." + ФорматРисунка + ")|*." + ФорматРисунка; КонецЕсли; II Сохранить картинку в файл. Если Диалог.Выбрать() Тогда Обласгь.Картинка.Записать(Диалог.ПолноеИмяФайла + Диалог.Расширение); КонецЕсли; КонецЕсли; КонецЕсли; КонецПроцедуры <J-©<J.
Следует иметь в виду, что если событие Выбор возникает в результате нажатия мыши в поле табличного документа, то сначала будет вызвано событие ПриАктивизацииОбласти поля табличного документа. Причем если активизируемая область допускает редактирование, то двойной клик мышью в этой области вызовет два события ПриАктивизацииОбласти и одно событие Выбор (рис. 17.94). Рис. 17.94. Последовательность вызова событий Расшифровка в поле табличного документа Событие ОбработкаРасшифровки вызывается в результате выполнения расшифровки области/рисунка табличного документа. ПОДРОБНЕЕ Раздел «Использование расшифровки в табличном документе», стр. 395. В событие передаются три параметра: Элемент, Расшифровка и Стандарт- наяОбработка. Параметр Элемент содержит поле табличного документа, которое вызвало это событие. Параметр Расшифровка содержит значение параметра расшифровки области/рисунка табличного документа. Параметр СтандартнаяОбработка содержит по умолчанию значение Истина и определяет необходимость выполнения стандартной обработки расшифровки (для значений примитивных типов стандартной обработкой является отображение этих значений в отдельном окне; для ссылочных значений будет открыта основная форма объекта, используемая для редак- тирования данных объекта). Как правило, целью алгоритма, выполняемого в обработке расшифровки, является получение некоторых дополнительных, уточняющих данных для определенной ячейки или области отчета. Поэтому значением параметра расшифровки в этом случае является, как правило, структура, содержащая необходимую информацию. Профессиональная разработка в системе «1С:Предприятие 8»
Например, для отчета о продажах номенклатуры по контрагентам значе- нием параметра расшифровки ячейки, содержащей сумму оборота товаров, проданных контрагенту (листинг 17.108), может быть структура следующего вида (табл. 17.6). Таблица 17.6. Структура, передаваемая в параметр расшифровки Ключ Значение Контрагент Никитин Юрий Номенклатура Консультации по настройке 1С СуммаОборот 200 Листинг 17.108. Пример заполнения расшифровки при выводе в поле табличного документа &НаСервереБезКонтекста Процедура ОтчетСРасшифровкой(ТабДок) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Контрагент КАК Контрагент, | ПродажиКомпанииОбороты.Контрагент.Предстааление КАК | КонтрагентПредсгавление, | ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, | ПродажиКомпанииОбороты.Номенклатура.Представление КАК | НоменкпатураПредсгавление, | СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот |ИЗ | РегистрНакопления.Продажи.Обороты КАК ПродажиКомпанииОбороты I ^ГРУППИРОВАТЬ ПО | ПродажиКомпанииОбороты.Номенклатура, | ПродажиКомпанииОбороты.Контрагент |ИТОГИ | СУММА(СуммаОборот) |ПО | Контрагент, | Номенклатура"; Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); ТабМакет = ПолучитьОбщийМакет("Макет“); ОбластьКонтрагент = ТабМакет.ПолучитьОбласгь("Контрагент”); ОбластьНоменклатура = ТабМакет.ПолучитьОбласгь("Номенкпатура"); ТабДок.Очисппъ(); ТабДок.НачатьАвтогруппировкуСтрок(); Пока Выборка.Следующий() Цикл ОбласгьКонтрагент.Параметры.Заполнтъ(Выборка); II Установить расшифровку поля "Контрагент" группировки "Контрагент". СтруктураРасшифровки = Новый Структура; СтруктураРасшифровки.ВставитьС'Контрагент'1, Выборка.Контрагент); Том 2
Табличны йЩокумёнт СтруктураРасшифровки.Вставить("Номенклатура", Неопределено); СтруктураРасшифровки.Вставить("СуммаОборот", Неопределено); ОбластьКонтрагент.Параметры.РасшифровкаКонтрагента = СтруктураРасшифровки; II Установить расшифровку поля "СуммаОборот" группировки "Контрагент". СтруктураРасшифровки = Новый Структура; СтруктураРасшифровки.Вставить("Контрагент”, Выборка.Контрагент); СтруктураРасшифровки.Вставить("Номенклатура”, Неопределено); СтруктураРасшифровки.Вставить("СуммаО6орот", Выборка.СуммаОборот); ОбластьКонтрагент.Параметры.РасшифровкаСуммы = СтруктураРасшифровки; ТабДок.Вывести(ОбластьКонтрагент, Выборка.Уровень()); ВыборкаНоменклатура = Выборка.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(Выборка Номенклатура); II Установить расшифровку поля "Контрагент" группировки "Номенклатура". СтруктураРасшифровки = Новый Структура; СтруктураРасшифровки.Вставить("Контрагент", ВыборкаНоменклатура.Контрагент); СтруктураРасшифровки. Вставить("Номенклатура", Неопределено); СтруктураРасшифровки.Вставить("СуммаОборот", Неопределено); ОбластьНоменклатура.Параметры.РасшифровкаКонтрагента = СтруктураРасшифровки; II Установить расшифровку поля "Номенклатура" группировки "Номенклатура". СтруктураРасшифровки = Новый Структура; СтруктураРасшифровки.Вставить("Контрагент", ВыборкаНоменклатура.Контрагент); СтруктураРасшифровки.Вставить("Номенклатура", Выбор каНоменклатура.Номенклатура); СтрукгураРасшифровки.Вставить("СуммаОборот", Неопределено); ОбпастьНоменклатура.Парамегры.РасшифровкаНоменклатуры = СтруктураРасшифровки; II Установить расшифровку поля "СуммаОборот" группировки "Номенклатура". СтруктураРасшифровки = Новый Структура; СтруктураРасшифровки.Вставить("Контрагент", ВыборкаНоменклатура.Контрагент); СтруктураРасшифровки.Вставить(”Номенклатура", Выборка Номенклатура.Номенклатура); СтруктураРасшифровки.Вставить("СуммаОборот", Выбор каНоменклатура.СуммаОборот); ОбластьНоменклатура.Параметры.РасшифровкаСуммы = СтруктураРасшифровки; ТабДок.Вывести(ОбластьНоменклатура, ВыборкаНоменклатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончитьАвтогруппировкуСтрок(); КонецПроцедуры Отчет формируется во внеконтекстной процедуре ОтчетСРасшифровкой(), которая вызывается по команде Расшифровка. В процедуру переда- ется реквизит Результат, содержащий табличный документ. Табличный документ заполняется данными отчета, а также формируется структура расшифровки для полей табличного документа. Затем его содержимое автоматически отображается в форме обработки в поле табличного документа.
инескогбТпредставленияУданных' Теперь требуется обеспечить нестандартное поведение системы по обработке расшифровки значений, содержащихся в полях табличного документа. Для этого нужно создать обработчик события Обработка Рас- шифровки у поля формы табличного документа (листинг 17.109). Листинг 17.109. Пример процедуры обработки события «ОбработкаРасшифровки» Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка) Если Не ТипЗнч(Расшифровка) = Тип(”Структура") Тогда Возврат; КонецЕсли; СтандартнаяОбработка = Ложь; Контрагент = Расшифровка.Контрагент; Номенклатура = Расшифровка.Номенклатура; Сумма = Расшифровка.СуммаОборот; ТабДок = ПоказатьПродажиТоваров(Контрагент, Номенклатура, Сумма); ТабДок.ТолькоПросмотр = Истина; ТабДок.Показать(); КонецПроцедуры В этом обработчике нестандартная обработка расшифровки (Стандарт- наяОбработка = Ложь) обеспечивается только в случае, если в параметре Расшифровка содержится структура. В этом случае обработка расшифровки, например, может вызы- вать выполнение процедуры, формирующей отчет о продажах номенклатуры выбранному контрагенту с детализацией по регистратору (листинг 17.110). Листинг 17.110. Процедура «ПоказатьПродажиТоваров()» &НаСервереБезКонтекста Функция ПоказатьПродажиТоваров(Контрагент, Номенклатура, Сумма) Запрос = Новый Запрос; ЗапросЛекст = "ВЫБРАТЬ | ПродажиКомпанииОбороты.Регистратор КАК Регистратор, | ПродажиКомпанииОбороты.Номенклатура КАК Номенклатура, | СУММА(ПродажиКомпанииОбороты.КопичествоОборот) КАК КоличествоОборот, | СУММА(ПродажиКомпанииОбороты.СуммаОборот) КАК СуммаОборот |ИЗ | РегистрНакопления.Продажи.Обороты(,, Регистратор) КАК ПродажиКомпанииОбороть ГДЕ | ПродажиКомпанииОбороты.Контрагент = &Контрагент I ^ГРУППИРОВАТЬ ПО | ПродажиКомпанииОбороты.Регистратор, | ПродажиКомпанииОбороты.Номенклатура | ИТОГИ | СУММА(СуммаОборот), | СУММА(КоличествоОборот) |ПО
| Регистратор, I Номенклатура"; Запрос.УстановитьПараметрС'Контрагент”, Контрагент); Выборка = Запрос.Выполнить().Выбрать(ОбходРезулыатаЗапроса.ПоГ руппировкам); ТабДок = Новый ТабличныйДокумент(); ТабМакет = ПолучигьОбщийМакет("МакетРасшифровка"); Область = ТабМакет.ПолучитьОбластъ("Заголовок"); ОбластьДокумент = ТабМакет.ПолучигьОбластъ("Документ"); ОбластьНоменклатура = ТабМакет.ПопучитьОбласть("Номенкпатура"); Область.Параметры. Контрагент = Контрагент; ТабДок.Вывести(Область); ТабДок.НачатьАвтогруллировкуСтрок(); Пока Выборка .Следующий() Цикл ОбластьДокумент.Параметры.Запопнигь(Выборка); II Установить расшифровку поля "Регистратор" группировки "Документ". ОбластьДокумент.Параметры.РасшифровкаДокумента = Выборка.Регистратор; ТабДок.Вывести(ОбластъДокумент, Выборка.Уровень()); ВыборкаНоменкпатура = Выборка.Выбрать(ОбходРезулыатаЗапроса.ПоГруппировкам); Пока ВыборкаНоменклатура.Следующий() Цикл ОбластьНоменкпатура.Параметры.Запопнигь(Выборка Номенклатура); II Установить расшифровку полей "Регистратор" и "Номенклатура" II группировки "Номенклатура". ОбластьНоменклатура. Параметры.РасшифровкаДокумента = Выбор каНоменкпатура.Регистратор; ОбластьНоменклатура. Параметры.РасшифровкаНоменклатуры = Выбор каНоменкпатура.Номенкпатура; ТабДок.Вывести(ОбластьНоменкпатура, ВыборкаНоменкпатура.Уровень()); КонецЦикла; КонецЦикла; ТабДок.ЗакончигьАвтогруппировкуСтрок(); Возврат ТабДок; КонецФункции В результате будет получен табличный документ с данными о продажах номенклатуры контрагенту с детализацией по регистратору, в котором при двойном щелчке по ячейкам, содержащим представление документа или номенклатуры, будет открываться форма для просмотра и редак- тирования данных соответствующего элемента справочника, т.е. будет выполняться стандартная обработка расшифровки (рис. 17.95). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 17.95. Отчет о продажах номенклатуры контрагенту с детализацией по регистратору При обработке события ОбработкаРасшифровки также нужно иметь в виду, что перед вызовом события ОбработкаРасшифровки будет вызвано событие Выбор, а если событие ОбработкаРасшифровки возникает в результате нажатия мыши в поле табличного документа, то сначала будет вызвано событие ПриАктивизацииОбласти поля табличного доку- мента. Причем если активизируемая область допускает редактирование, то двойной щелчок мышью в этой области вызовет два события ПриАктивизацииОбласти, событие Выбор и событие Обработ- каРасшифровки (рис. 17.96). Расходнаяi | Провести и за» Рис. 17.96. Последовательность вызова событий Дета: (^Добавить । N Номенкла Рис. 17.97. Том 2
>Таблинн^1ЙУдокумент< Перетаскивание в табличном документе Поле табличного документа поддерживает механизм перетаскивания, который позволяет с помощью мыши переносить значения из/в табличный документ. В качестве примера можно рассмотреть формирование документа Заказ, при котором значения номенклатуры перетаскиваются в табличную часть документа мышью из сформированного отчета о продажах номен- клатуры. Предположим, что для формирования отчета о продажах номенклатуры используется некоторая обработка, ее форма содержит поле табличного документа, в которое и выводится отчет об остатках. Документ Расход- наяНакладная также имеет форму документа, содержащую таблицу с полем Номенклатура, связанную с данными табличной части документа Состав (рис. 17.97). Как таблица, расположенная в форме документа, так и поле табличного документа, расположенное в форме обработки, имеют два свойства, которые управляют возможностью перетаскивания. Это свойства Разре- шитьНачалоПеретаскивания и РазрешитьПеретаскивание. Свойство РазрешитьНачалоПеретаскивания управляет источником данных, а свойство РазрешитьПеретаскивание - приемником. В нашем случае источником данных будет являться поле табличного документа, поэтому его свойство РазрешитьНачалоПеретаскивания должно быть установлено в значение Истина. Приемником данных будет являться таблица формы документа, поэтому ее свойство РазрешитьПеретаскивание также должно быть уста- новлено в значение Истина (рис. 17.98). [ЮПреапр. накладная (создание) □ X Работа с... ПСПрепприягие) □ X Работа с табличным документом (рыть | йй1 । L* Провести Все действия’ । (?) Все действия'' i (?) Табли<иый документ в форме | Редактирование табличного... Свойства табличного докуме... |: Сформировать ]| | Показать | | Выбор картинки | | Расшифровка | ииимид ...QI Никитин Юрий РЬкитин Юрий РЬкитин Юрий РЬкитин Юрий РЬкитин Юрий РЬкитин Юрий РЬкитин Юрий РЬкитин Юрий Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ Завод РТИ /Тс. Бухгалтерия 7.7 Базовая версия "X Доставка Консультации по настройке ОС Wndwa Wndows ХР Professional Russian CD Консультации no настройке 1С Windows ХР Home Edtton Russian UPG CD 1С.Аспект7.7 1C. Бухгалтерия 7.7 Базовая версия Доставка Консультации по настройке ОС Wndws Windows ХР Professional Russian CD Консультации no настройке 1С Windows ХР Home Edtton Russian UPG CD Форма документа и отчет о продажах номенклатуры ^©у
инескогбТпредставленияУданных' РазрешитьЛеретаскивание » Испна РазрешитьНачалоЛеретаскивания » Истина Таблице) Поле табличного документа документа Рис. 17.98. Установка свойств, управляющих перетаскиванием В процессе перетаскивания система генерирует четыре события: НачалоПеретаскивания, ПроверкаПеретаскивания, Перетаскивание и ОкончаниеПеретаскивания. Два из этих событий генерируются в источ- нике, а два - в приемнике (рис. 17.99). РазрешитьЛеретаскивание ~ Истина РазрешитьНачалоЛеретаскивания ~ Истина Рис. 17.99. События, сопровождающие перетаскивание Эти события содержат различные параметры, но общим для всех событий является параметр ПараметрыПеретаскивания, который позволяет анали- зировать действия, выполняемые при перетаскивании, и управлять процессом перетаскивания. Этот параметр содержит объект ПараметрыПеретаскивания, который имеет три свойства. Значение - в этом свойстве содержится перетаскиваемое значение. В нашем случае таким значением будет табличный документ, состоящий из одной ячейки - той, которую перетаскивают.
Действие - это свойство имеет тип системного перечисления Дейст- вияПеретаскивания и определяет текущее действие перетаскивания. Текущее действие перетаскивания зависит от того, каким образом пользователь выполняет перетаскивание, и оно может принимать различные значения в каждом из обработчиков событий перетаскивания. Если перетаскивание выполняется правой кнопкой мыши, то свойство Действие будет иметь значение Выбор. Это означает, что в результате перетаскивания будет открыто контекстное меню, из которого пользо- ватель сможет выбрать необходимое действие (например, копирование, перемещение или отмена), рис. 17.100. Рис. 17.100. Выбор действия из контекстного меню Если перетаскивание выполняется левой клавишей мыши с нажатой клавишей Control, то свойство Действие будет иметь значение Копиро- вание. Если перетаскивание выполняется только левой клавишей мыши, то свойство Действие будет иметь значение Перемещение. Свойство Действие может принимать еще одно значение - Отмена. Это значение может быть установлено только средствами встроенного языка или системой в результате анализа условий перемещения. Значение Отмена означает, что перетаскивание не может быть выполнено. Свойство ДопустимыеДействия объекта ПараметрыПеретаскивания определяет те действия, которые в принципе допускается выполнять при перетаскивании. Это свойство принимает значения системного перечисления ДопустимыеДействияПеретаскивания (табл. 17.7). Значение этого свойства, установленное системой по умолчанию или заданное разработчиком при обработке события НачалоПеретаскивания, будет одним и тем же во всех обработчиках событий перетаскивания (если, конечно, разработчик не изменит его явным образом в одном из обработчиков). Профессиональная разработка в системе «1С:Предприятие 8»
Таблица 17.7. Значения системного перечисления «Допустим ыеДействияПеретаскивания» Зиачеиие Пояснение Копирование Допускается только копирование КопированиеИПеремещение Допускается копирование или перемещение Перемещение Допускается только перемещение НеОбрабатыввть Не осуществляется никаких действий В каждом обработчике события перетаскивания система анализирует значение свойств Действие и ДопустимыеДействия на непротиворечивость. Допускаются следующие сочетания значений (табл. 17.8). Таблица 17.8. Сочетания значений свойств «ДопустимыеДействия» и «Действие» ДопустимыеДействия Действие КопированиеИПеремещение Копирование Перемещение Выбор Отмена Копирование Копирование Выбор Отмена Перемещение Перемещение Выбор Отмена НеОбрабатыввть Отмена Если допустимым действием является копирование, а действие - пере- мещение, будет выполняться копирование. Если допустимым действием является перемещение, а действие - копирование, будет выполняться перемещение. Кроме непротиворечивости значений перечисленных свойств, системой принимается во внимание то, какие данные содержатся в источнике и приемнике. Например, при перетаскивании из поля табличного доку- мента, открытого в режиме Только просмотр, система позволит выполнить лишь копирование (или не выполнять никаких действий). При перетас- кивании в таблице формы, содержащей, например, список документов, система не позволит выполнить копирование. В то же время при перетас- кивании в таблице формы, источником данных которой является таблица значений, содержащая необъектные данные, копирование будет разре- шено. Также если, например, в таблице, источником данных которой является иерархический справочник, выполняется перетаскивание группы справочника в элемент справочника, система запретит любые действия, кроме отмены. В результате анализа непротиворечивости действий и данных источника и приемника система определяет, какое же действие перетаскивания будет выполняться. В соответствии с этим система изменяет форму курсора. Том 2
Табличны йЩокумёнт Если определено, что будет выполняться копирование, курсор отобража- ется с пиктограммой копирования (рис. 17.101). I ' Расходная накла... (1С:Предпрмятме) 'nil 'all М М* М- - - □ к Расходная накладная (создание) Провести ы закрыть 11^11 Г* Провести В се действия * । (?) 1омер: | | Дата 125.11.2011 0:00:00 g| контрагент: | ... Q Добавить । X 1 ф О Вседействия* N Номенклатура Количество Пена Сумиа ЕЯ Монигор19’НЙасЫСМ715ЕТ 1.00 2 Клавиатура Apple Pro КерЬ... 1.00 Рис. 17.101. Копирование Если определено, что будет выполняться перемещение или выбор, курсор отображается с пиктограммой перемещения (рис. 17.102). Действие Выбор не имеет отдельной пиктограммы. Выбор вида документа □ Текстовьй документ S Картинка 3 ТабличныйДокумент Внешняя обработка .Q] Внешний отчет §8 HTML документ Графическая схема I ок | | Отмена | Рис. 17.102. Перемещение Если определено, что будет выполняться отмена, то курсор отображается пиктограммой, изображающей перечеркнутую окружность (рис. 17.103). 1 (3) а ' Расходная накла... (1С:Предпрмятме) 'ЛИ 'Bit М М* М~ * - П X Расходная накладная (создание) Провести и закрыть | i Провести Вседействия* । (?) Номер: | | Дата 125.11.2011 СЮСЮР В| Контрагент: | Q ^Добавить । X । Ф О Вседействия* N Номенклатура Количество Цена Сумма ЕЯ Монигор19’НЙасЫСМ715ЕТ 1.00 2 Клавиатура Apple Pro Kejfc... 1.00 л Q Рис. 17.103. Отмена перетаскивания
инескогбТпредставленияУданных' Для формирования отчета будем использовать макет, в котором для ячейки, содержащей параметр Номенклатура, указано, что она содержит значение типа СправочникСсылка.Номенклатура (рис. 17.104). Рис. 17.104. Макет отчета Именно эти значения разрешено будет перетаскивать в форму документа. Для этого следует воспользоваться событием НачалоПеретаскивания поля табличного документа. В нем нужно проанализировать перетаскиваемую область и разрешить перетаскивание только в том случае, если область содержит значение. Событие НачалоПеретаскивания поля табличного документа поставляет три параметра: Элемент - элемент управления, вызвавший событие; в нашем случае поле табличного документа; ПараметрыПеретаскивания - параметры перетаскивания; СтандартнаяОбработка - признак выполнения стандартной обработки. Стандартная обработка заключается собственно в начале перетаски- вания данных. По умолчанию имеет значение Истина. Для того чтобы разрешить перетаскивание только ячеек табличного документа, содержащих значения номенклатуры, проанализируем признак СодержитЗначение текущей области табличного документа. Если область не содержит значение, перетаскивание выполнять не будем (листинг 17.111). ^и©
Листинг 17.111. Обработчик события «НечелоПеретескивания» Процедура РезультатНачалоПерегаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка) Если ПараметрыПеретаскивания.Значение.ТекущаяОбласгь.СодержитЗначение = Ложь Тогда СтандартнаяОбработка = Ложь; КонецЕсли; КонецПроцедуры После того как обработано событие НачалоПеретаскивания, у приемника (в нашем случае - таблица формы документа) будет вызвано событие ПроверкаПеретаскивания. Это событие вызывается всякий раз, когда курсор попадает на новый объект в элементе управления (например, в новую ячейку таблицы), а также при нажатии и отпускании клавиши Control. Событие ПроверкаПеретаскивания табличного поля поставляет пять пара- метров: Элемент - элемент управления, вызвавший событие; в нашем случае таблица формы документа; ПараметрыПеретаскивания - параметры перетаскивания; СтандартнаяОбработка - признак выполнения стандартной обработки. Стандартная обработка заключается в проверке возможности вставки значения, т.е. проверяется тип вставляемого значения, и если он совпадает с типом отображаемых данных, то производятся стандар- тные действия; Строка - строка, над которой находится курсор. Содержит порядковый номер строки или Неопределено; Поле - поле управляемой формы, с которым связана данная колонка таблицы, над которой находится курсор, или Неопределено. Так как в нашем случае источником данных таблицы является объект ДокументТабличнаяЧасть.РасходнаяНакладная.Состав, а перетаскива- емое значение имеет тип Табличный документ, то стандартную обработку необходимо отключить и установить действие перетаскивания вручную. Например, можно разрешить перетаскивание толью в том случае, если курсор находится над областью таблицы, не содержащей строк (листинг 17.112). Листинг 17.112. Обработчик события «ПроверкаПеретаскивания» Процедура СоставПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Попе) СтандартнаяОбработка = Ложь; Если Строка <> Неопределено И Объект.Состав.Капичество() <> 0 Тогда ПараметрыПеретаскивания.Действие = ДейстаиеПеретаскивания.Отмена; Иначе ПараметрыПеретаскивания.Дейсгвие = Действие Перетаскивания.Копирование; КонецЕсли; КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Если отпустить клавишу мыши у приемника (в нашем случае - таблица формы документа), будет вызвано событие Перетаскивание. Обработчик этого события может быть использован для того, чтобы заполнить приемник данными, если способ заполнения отличается от стандартного. Обработчик этого события имеет такие же параметры, что и обработчик события ПроверкаПеретаскивания. В нашем случае необходимо отказаться от выполнения стандартной обработки (т. к. тип данных табличного поля не совпадает с типом пере- таскиваемого значения) и заполнить приемник данными самостоятельно (листинг 17.113). Том 2
>Таблинн^1ЙУдокумент< Листинг 17.113. Обработчик события «Перетаскивание» Процедура СоставПеретаскивание(Элемент, ПараметрыПеретаскивания, СтандартнаяОбработка, Строка, Поле) ПараметрыПеретаскивания.Действие = ДействиеПеретаскивания.Копирование; ТабДок = ПараметрыПеретаскивания.Значение; Значение = ТабДок.ТекущаяОбласть.Значение; НоваяСтрока = Объект.Состав.Добавить(); НоваяСтрока. Номенклатура = Значение; НоваяСтрока.Копичество = 1; КонецПроцедуры вот
Гл а ва117 У С рёд стват граф и ч ес ко го’ п рёд ста вл ения'данных 412
Профессиональная разработка в системе «1С:Предприятие 8»
Глава 18. Интеграция с другими информационными системами Очень часто при решении задач комплексного учета возникает необходи- мость в рамках одного программного комплекса использовать возможности другого программного комплекса, проводить обмен данными между различными системами и т.п. Это может быть обусловлено спецификой автоматизируемых задач, особенностями структуры автоматизируемой компании (организации) и массой других причин. К примеру, при необходимости работы с каким-либо оборудованием «общение» с ним производится через специализированную программу (драйвер). В компании может быть принято оформлять договоры в формате программы Microsoft Word. В связи с этим возникает необхо- димость работы с данной программой, хранения полученных документов в информационной базе. При организации обмена с такой же системой (информационной базой) или с другими возникает как задача формиро- вания (и чтения) файла обмена, так и задача его доставки. На самом деле все подобные задачи не перечесть. Но возможность их решения определяет, насколько велик потенциал используемого програм- много комплекса по интеграции (организации совместной работы) с другими системами. Система «1С:Предприятие» является открытой. Предоставляется возмож- ность для интеграции практически с любыми внешними программами и оборудованием на основе общепризнанных открытых стандартов и протоколов передачи данных. В системе «1С:Предприятие» имеется целый набор средств, с помощью которых можно: создавать, обрабатывать и обмениваться данными различных форматов; осуществлять доступ ко всем объектам системы «1С:Предприятие», реализующим ее функциональные возможности; поддерживать различные протоколы обмена; поддерживать стандарты взаимодействия с другими подсистемами; разрабатывать собственные интернет-решения. Проведем краткий обзор технологий, которые могут использоваться плат- формой «1 С:Предприятие» при решении задач интеграции. Текстовые документы. Встроенный язык системы позволяет разработчику создавать, динамически формировать и записывать текстовые документы. Том 2
Обмен данными с использованием текстовых документов может быть одним из менее «ресурсоемких» способов организации взаимодействия с другими информационными системами. Помимо обычных способов работы с текстовыми документами (чтение, запись, вставка и добавление строк, получение строк), разработчик имеет возможность динамического формирования текстовых документов на основе заранее созданных шаблонов. Текстовые файлы. Обмен с помощью текстовых файлов - наиболее простой механизм обмена данными. Он может быть использован для решения самых разнообразных задач. Его основное преимущество - простота освоения и удобное текстовое представление информации. Фори<77ии/>ованныедо7с>уиен»гы.Форматированныйдокументпредназначен для создания и редактирования текста различных форматов, содержащих оформление (картинки, текст, таблицы). XML-документы. Система позволяет организовывать интеграцию с прикладными системами с использованием XML-документов, явля- ющихся на сегодняшний день общепринятым средством представления данных. DBF-файлы. Механизм работы с базами данных формата DBF пред- назначен для обеспечения возможности манипулирования ими непосредственно из встроенного языка системы. Возможно практически любое манипулирование данными. Внешнее соединение. Основная задача, решаемая с помощью внешнего соединения, - обеспечение надежного и быстрого программного доступа к данным системы «1С:Предприятие» из внешних приложений. В общем и целом работа с системой через внешнее соединение подобна работе с системой в режиме Automation-сервера. Существенное отличие заклю- чается в том, что запускается вариант «1С:Предприятия», не содержащий интерфейсной части (подразумевается работа с данными толью програм- мными средствами, без использования интерфейсных возможностей). Automation Client/Server. Основное назначение Automation-сервера «1С:Предприятия» - управление приложением системы «1С:Пред- приятие» из других приложений и выполнение действий, аналогичных интерактивным действиям. HTML-документы. Средства работы с HTML-документами позволяют встраивать их в формы прикладного решения и выполнять редактиро- вание средствами встроенного языка. ж
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Работа с файлами. «1С:Предприятие» средствами встроенного языка предоставляет доступ к функциям работы с файловой системой. Эта возможность может быть использована при организации взаимодейс- твия с другими информационными системами через общие каталоги. Макеты ActiveDocument. Технология ActiveDocument предназна- чена для редактирования документов внешними по отношению к «1С:Предприятию» редакторами. Технология внешних компонентов. Технология создания внешних компо- нентов разработана для решения специальных задач интеграции, в которых требуется тесное взаимодействие между системой «1С:Предприятие» и другими программами. Работа с Интернетом. Работа с Интернетом возможна непосредс- твенно из встроенного языка. Разработчик может выполнять отправку и прием писем электронной почты, а также осуществлять обмен данными по протоколам HTTP (HTTPS) и FTP. Web-расширение. Web-расширение является отдельным программным продуктом и позволяет встраивать доступ к данным «1С:Предприятия» в существующие веб-сайты и веб-приложения, а также создавать готовые веб-приложения, использующие информационную базу «1 (^Предприятия». Обмен данными. Механизмы обмена данными, реализованные в технологической платформе «1 С:Предприятие», позволяют созда- вать территориально распределенные информационные системы как на основе информационных баз «1С:Предприятия», так и с участием других информационных систем, не основанных на «1С:Предприятии». Например, можно организовать работу главного офиса, филиалов и складов предприятия в единой информационной базе или обеспечить взаимодействие информационной базы «1С:Предприятия» с существу- ющей базой данных, например, MySQL. Web-сервисы. Механизм Web-сервисов позволяет создавать web-сервисы в конфигурации «1С:Предприятия», а также взаимодействовать в конфигу- рации «1С:Предприятия» с веб-сервисами, опубликованными сторонними поставщиками. XDTO. Механизм XDTO предназначен прежде всего для описания типов параметров и возвращаемых значений Web-сервисов. Также этот механизм может использоваться для обмена данными между различными конфигу- рациями «1С:Предприятия» или другими информационными системами. ПОДРОБНЕЕ Про работу с Web-расширением рассказывается в главе 20 «Web- расширение», стр. 523, механизмы обмена данными описаны в главе 19 «Обмен данными», стр. 481. Все остальные механизмы будут рассмотрены в данной главе.
ФОРМАТЫ ФАЙЛОВ ОБМЕНА При реализации обмена данными между информационными системами одной из подзадач, требующей решения, является определение варианта передачи данных (и его реализация). Это может быть: использование механизмов взаимодействия напрямую (например, OLE, СОМ); использование промежуточных файлов. В данном же разделе рассмотрим подробно второй вариант - исполь- зование промежуточных файлов для передачи изменений данных. Будем считать, что известно, какими данными необходимо обмениваться. Тогда необходимо определиться с форматом файла передачи данных. С точки зрения «1С:Предприятия» можно использовать различные форматы файлов. Наиболее часто обмен реализуется посредством: текстовых файлов, файлов DBF, XML-документов, форматированных документов. Рассмотрим все эти варианты на примере задачи выгрузки и загрузки справочника Номенклатура. Считаем, что элемент справочника характери- зуется (с точки зрения задачи обмена) следующими реквизитами: код элемента (тип Строка); наименование элемента (тип Строка); закупочная цена (тип Число); единица измерения (тип Строка). Работа с текстом Работа с текстовыми файлами в «1С:Предприятии» может осуществляться в контексте двух моделей: работа в модели последовательного доступа (объекты ЗаписьТекста, ЧтениеТекста); работа с текстовым документом, который полностью загружается в память (объект ТекстовыйДокумент, поле формы вида ПолеТексто- вогоДокумента). При использовании модели последовательного доступа, как при чтении, так и при записи, обрабатывается определенный фрагмент текста. Доступ к таким фрагментам осуществляется последовательно. Нельзя переско- чить какой-либо фрагмент. Рассмотрение возможностей работы с текстовыми файлами начнем с модели, в которой содержимое файла загружается полностью. Профессиональная разработка в системе «1С:Предприятие 8»
Прежде чем приступить к реализации обмена посредством текстовых файлов, сторонам (между которыми будет производиться обмен) необхо- димо «договорится» о логической структуре этого файла: вариант использования текста: с фиксированной длиной полей, с пере- менной длиной полей; если выбран вариант с переменной длиной полей, то какой использу- ется разделитель; последовательность следования данных; возможная структура текстового документа и т. д. Считаем, что в результате были достигнуты следующие договоренности. В первой строке текстового документа с позиции № 1 по позицию № 39 включительно указывается наименование организации - отправи- теля данных. Далее указывается дата отправки в формате «ДД.ММ.ГГГГ», т. е. первые две цифры - это день месяца, далее две цифры - это номер месяца, далее четыре цифры - это номер года. В каждой следующей строке выгружается элемент справочника Номен- клатура. Последовательно производится выгрузка кода, наименования, закупочной цены, наименования единицы измерения. Выгружаемые значения заключаются в кавычки, разделителем значения считается «,». Для включения как запятой, так и кавычек в выгружаемые данные используется символ «\». То есть для включения строки "Комплект "Пода- рочный", на 4 персоны" она должна быть преобразована к виду: "Комплект \"Подарочный\"\, на 4 персоны". Пример файла, который будет использоваться при обмене, приведен в листинге 18.1. Листинг 16.1. Пример файла обмена ООО Быстрее, выше, сильнее 16.10.2010 "000000004","Посудомоечная машина”,"20 ООО","шт" "000000003","Стиральная машина","15 000","" "000000007","Фен","1800","шт" "000000002","Холодильник","25 ООО","шт" "000000006","Чайник","2 000","" Только после фиксирования подобных договоренностей можно приступать к реализации механизмов выгрузки и загрузки. О Обработка © X 1 £ В Форма 333 Команд! €> LJ Группа! Ъ LJ Труп е о (S . -1 О Труп 8 Элементы Текстовый | Записать 41олеТД В Форма | Том 2
№ррматБ1Гфайлов1о1бмёна1 Текстовый документ, поле текстового документа Для иллюстрации возможностей работы с текстовым файлом (с ис- пользованием объекта ТекстовыйДокумент и поля формы вида ПолеТек- стовогоДокумента) создадим обработку, в которой будут производиться чтение и запись текста. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаСТекстом, команды формы Прочитать номенклатуру, Записать номенклатуру). В редакторе основной формы обработки создадим реквизит ПолеТД типа ТекстовыйДокумент и разместим в форме поле вида ПолеТекстовогоДоку- мента, связанное с этим реквизитом (рис. 18.1). Для записи данных из справочника в текстовый документ может исполь- зоваться следующий программный код (листинги 18.2, 18.3, 18.4 и 18.5). РаботаСТекстом: Форма - □ X > Oil!5 чая панель па2 руппа4 к) ЗаписагьНоменклапру* 3 ПрочитагьЦомбжлвгуру паЗ JI Командный ингерфей»* аокут внг )_______________________________ номенклатуру j | Прочитать номенклатуру | I &□! » X Реквизит 1 В|Тип тбоаботкаОбьекгРаботаСТекстом! О ТекстовьйДокумент } Реквизиты J а К Свойства: Поле ’Основные: Заголовок Поле текстового документа . ПолеТД Дето Я г □ |Авто Тиа ЛТутьКДанным ПоложениеЗаголовка Видимость 0 Пользовательская видимость Открыть Доступность ТолькоПросмогр ПропускатьПриВеме АктиэиэчэовагьПоЫ молчанио О [3] Модуль I Вставка поля текстового документа Ж
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Листинг 18.2. Функция «ЭлементВСтрокуО» &НаСервереБезКонтекста Функция ЭлементВСтроку(Элемент) Результат = СтрЗаменить(Элемент.Наименование, II Заменить символы "и, на V и \, Результат = СтрЗаменить(Результат, Символ(34), Т + Символ(34)); Результат = Символ(34) + Строка(Элемент.Код) + Символ(34) + + Символ(34) + Результат + Символ(34); II Убирать пробелы из строкового представления числа. Цена = СтрЗаменить(Строка(Элемент.ЗакупочнаяЦена),"", Результат = Результат ++ Симвоп(34) + Цена + Симвоп(34) + + Символ(34) + Строка(Элемент.ЕдиницаИзмерения) + Симвоп(34) ++ Симвоп(34); Возврат Результат; КонецФункции Листинг 18.3. Функция «СформироветьЗеголовок()» &НаКлиенте Функция СформироватьЗаголовок(Наименование Компании) Результат = СокрЛП(НаименованиеКомпании); КоличествоСимволов = СтрДпина(Результат); Для Счетчик = КоличествоСимволов По 38 Цикл Результат = Результат +" КонецЦикла; СтрокаДаты = Формат(ТекущаяДата(), "ДЛФ=О”); Результат = Результат + СтрокаДаты; Возврат Результат; КонецФункции Листинг 18.4. Процедура «ЗаписатьНоменклатуруО» &НаКлиенте Процедура ЗаписатьНоменклатуру(Команда) II Необходимо установить реальный путь. Путь = "с:\”; ТД = Новый ТексговыйДокумент; II Кодировка UTF8 является кодировкой по умолчанию. ТД.УстановитьТипФайла(КодировкаТекста.иТР8); Текст = ПолучитьСтрокиНоменкпатуры(); Текст = СформироватьЗагоповокС'ООО Быстрее, выше, сильнее") + Символы.ПС + Текст; ТД.УстановитьТекст(Текст); ТД.Записать(Путь + "nomen.txt"); КонецПроцедуры ФИ®
Листинг 18.5. Функция «ПолучитьСтрокиНоменклатуры()» &НаСервереБезКонтекста Функция ПолучитьСтрокиНоменклатуры() СтрокиНоменклатуры = Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка .Следующий() Цикл II Выгрузить только элементы справочника. Если Не Выборка.ЭтоГруппа Тогда СтрокиНоменклатуры = СтрокиНоменклатуры + ЭлементВСтроку(Выборка) + Символы.ПС; КонецЕсли; КонецЦикла; Возврат СтрокиНоменклатуры; КонецФункции Процесс записи инициирует процедура ЗаписатьНоменклатуру() (см. листинг 18.4). В процедуре производится создание объекта Тексто- выйДокумент и устанавливается тип кодировки этого документа. Затем вызывается функция ПолучитьСтрокиНоменклатуры(), см. лис- тинг 18.5. Эта функция выполняется на сервере. В ней в цикле выборки элементов справочника Номенклатура, не являющихся группой, формиру- ются строки номенклатуры и в виде одной большой строки передаются обратно на клиента в процедуру ЗаписатьНоменклатуру(). В полученную строку добавляется заголовок файла обмена. Для полу- чения заголовка используется функция СформироватьЗаголовок() (см. листинг 18.3). Затем эта строка устанавливается в виде текста в текстовый документ методом УстановитьТекст(), и документ записыва- ется. Для формирования строки элемента номенклатуры используется функция ЭлементВСтрокуО, см. листинг 18.2. Эта функция, а также функция СформироватьЗаголовок() реализуют достигнутые при переговорах о формате файла «договоренности». Для чтения данных из полученного файла может использоваться следу- ющий программный код (листинги 18.6 и 18.7). Листинг 18.6. Функция «РазобратьСтрокуЦ» &НаКлиенте Функция РазобратьСтроку(СтрокаДляРазбора) Результат = Новый Структура("Код, Наименование, Цена, ЕдиницаИзмерения"); II Прочитать код. Позиция = Найти(СтрокаДляРазбора, Код = Сред(СтрокаДляРазбора, 2, Позиция - 3); Профессиональная разработка в системе «1С:Предприятие 8»
Результат.Код = Код; II Отрезать прочитанный фрагмент. СтрокаДалее = Сред(СтрокаДляРазбора, Позиция + 2); II Прочитать наименование. Позиция = Найти(СтроксДалее, ”,"); Наименование = Сред(СтрокаДалее, 1, Позиция - 2); Результат.Наименование = Наименование; II Отрезать прочитанный фрагмент. СтрокаДалее = Сред(СтрокаДалее, Позиция + 2); II Прочитать цену. Позиция = Найти(СтрокаДалее, Цена = Сред(СтрокаДалее, 1, Позиция - 2); Результат.Цена = Цена; II Отрезать прочитанный фрагмент. СтрокаДалее = Сред(СтрокаДалее, Позиция + 2); II Прочитать единицу измерения. Позиция = Найти(СтрокаДалее, ЕдиницаИзмерания = Сред(СтрокаДалее, 1, Позиция - 2); Результат.ЕдиницаИзмерения = ЕдиницаИзмерения; Возврат Результат; КонецФункции Листинг 18.7. Процедура «ПрочитатьНоменклатуруО» &НаКлиенте Процедура ПрочитатьНоменклатуру(Команда) II Необходимо установить реальный путь. Путь= ”с:\"; ТД = Новый ТекстовыйДокумент; ТД.Прочитать(Путь + "nomen.txf1); Сообщение = Новый СообщениеПользователю(); ЗаголовокФайла = ТД.ПолучитьСтроку(1); Сообщение.Текст = ЗаголовокФайла; Сообщение.Сообщить(); НазваниеОтправителя = СокрЛП(Сред(ЗаголовокФайла, 1,39)); ДатаТекстом = СокрЛП(Сред(ЗагоповокФайла, 40)); Для ТекущаяСтрока = 2 По ТД.КоличествоСтрок() Цикл ПрочитаннаяСтрока = ТД.ПопучитьСтроку(ТекущаяСтрока); Сообщение.Текст = ПрочитаннаяСтрока; Сообщение.СообщитьО; Значение = РазобратьСтроку(ПрочитаннаяСтрока); КонецЦикла; КонецПроцедуры Том 2
№ормат£|[файлов1обмена1 Процесс чтения начинается с выполнения процедуры ПрочитатьНо- менклатуру(), см. листинг 18.7. Для чтения создается объект Тексто- выйДокумент. При выполнении его метода Прочитать!) файл полностью загружается в оперативную память. Получение строк производится с помощью метода ПолучитьСтроку() текстового документа. Функция РазобратьСтрокуО, см. листинг 18.6, извлекает из строки данные по элементу справочника, исходя из договоренностей по формату данных. Разбор заголовка реализован в процедуре ПрочитатьНоменкла- туру(), см. листинг 18.7. Отображение текстового документа Для чтения и отображения в диалоге содержимого текстового документа может использоваться следующая процедура (листинг 18.8). Листинг 18.8. Процедура «ПросмотрТДО» &НаКлиенте Процедура ПросмотрТД(Команда) II Необходимо установить реальный путь. Путь = "с:\"; ПопеТД.Очистить(); ПопеТД.Прочитать(Путь + "nomen.txt”); ПопеТД.ВставитьСтроку(1, "Показывается в оригинальном виде”); КонецПроцедуры Перед выводом текстового документа реквизит ПолеТД типа Тексто- выйДокумент очищается, после чтения в качестве первой вставляется строка «Показывается в оригинальном виде» (она «сдвигает» ранее загру- женные строки). Пользователь может проводить любые корректировки текста, представ- ленного в поле формы, отражающем текстовый документ. Чтобы записать результат работы в файл, можно воспользоваться следующей процедурой (листинг 18.9). Листинг 18.9. Процедуре записи результета в файл &НаКлиенте Процедура ЗаписьТД(Команда) II Необходимо установить реальный путь. Путь = ”с:\"; ПопеТД.Записатъ(Путь + "result.txt"); ПопеТД.ОчиститьО; КонецПроцедуры После записи реквизит, содержащий данные текстового документа, очища- ется (это можно и не делать).
I ГлаваН 84 И нтеграция[с1другими1информационн£|ми[системами При работе с текстовыми файлами в «1С:Предприятии» следует учиты- вать особенности представления разделителей строк в файлах Windows и в тексте, используемом для обработки внутри «1 С:Предприятия». Для целей внутренней обработки текста используется разделитель, состо- ящий из одного символа, в то время как в файлах Windows в качестве разделителя строк используется комбинация из двух последовательных символов. Внутри «1С:Предприятия» разделителем строк является символ Символы.ПС, он же LF (Line Feed, Перевод Строки), который имеет шест- надцатеричный код ОА. В то же время в кодировке текстовых файлов для Windows принято, что разделителем строк является пара символов - CR-LF. CR (Carriage Return, Возврат Каретки) имеет шестнадцатеричный код DD. При записи и чтении текстовых файлов «1С:Предприятие» производит преобразование внутренних разделителей строк в представление, принятое в текстовых файлах Windows. То есть при записи символ ПС (LF) преобра- зуется в пару символов ВК-ПС (CR-LF). При чтении происходит обратное преобразование, то есть пара ВК-ПС (CR-LF) преобразуется в одиночный символ ПС (LF). Символ ВК (CR) при записи файла не преобразуется и не выбрасывается, то есть попадает в файл как есть. При чтении файла символы ВК (CR) и ПС (LF), не образующие пару, также считываются без преобразований. Модель последовательного доступа В ранее рассмотренном примере работы с текстовыми файлами содер- жимое файла загружалось в оперативную память полностью. При работе с файлами большого размера такой подход может привести к замед- лению обработки данных из файла. В этом случае можно воспользоваться возможностью «1С:Предприятия» работать с текстовыми файлами в рамках модели последовательного доступа. Данная модель реализована объектами ЗаписьТекста и ЧтениеТекста. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаСТекстом, команды формы Последовательная запись, Последова- тельное чтение). Для записи данных может использоваться следующая процедура (листинг 18.10).
Листинг 18.10. Пример записи тексте &НаКлиенте Процедура ПоследовательнаяЗапись(Команда) II Необходимо установить реальный путь. Путь = "с:\"; ЗаписьТекста = Новый ЗаписьТексга(Путь + "nomen.txt”, КодировкаТекста.итР8); За письТекста.ЗаписатьСтроку(СформироватьЗаголовок("Наименование компании1')); Текст = ПопучитьСтрокиНоменкпатуры(); ЗаписьТекста.ЗаписатьСтроку(Текст); ЗаписьТекста.Закрыть(); КонецПроцедуры В процедуре создается объект ЗаписьТекста, и с помощью метода Запи- сатьСтрокуО документ построчно записывается в файл. Здесь так же, как и в случае с объектом ТекстовыйДокумент, строки элементов справочника Номенклатура получаются с сервера в виде одной большой строки функ- цией ПолучитьСтрокиНоменклатуры() и затем записываются на клиенте методом ЗаписатьСтроку() объекта ЗаписьТекста. Необходимо заметить, что в случае записи файлов большого размера строку для записи нужно разбивать на небольшие порции (например, ограничить размер записыва- емой строки 1 000 элементов номенклатуры). Текст функций СформироватьЗаголовок(), ЭлементВСтроку() и Полу- читьСтрокиНоменклатуры()приводился ранее (см. листинги 18.3, 18.2 и 18.5). Для чтения данных может использоваться следующая процедура (листинг 18.11). Листинг 18.11. Пример чтения текста &НаКлиенте Процедура ПоследовательноеЧтение(Команда) II Необходимо установить реальный путь. Путь = Текст = Новый ЧтениеТекста(Путь + "nomen.txt”, КодировкаТекста.0ТР8); II Считать первую строку. ПрочитаннаяСтрока = Текст.ПрочитатьСтроку(); НазваниеОтправителя = СокрЛП(Сред(ПрочитаннаяСтрока, 1,39)); ДатаТекстом = СокрЛП(Сред(ПрочитаннаяСтрока, 40)); II Цикл выполняется, пока не будет достигнут конец файла. Пока ПрочитаннаяСтрока <> Неопределено Цикл ПрочитаннаяСтрока = Текст.ПрочитатъСтроку(); Значение = РазобратьСтроку(ПрочитаннаяСтрока); КонецЦикла; КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Следует отметить, что чтение данных может осуществляться не только построчно, но и по указанному количеству символов (метод Прочитать() объекта ЧтениеТекста). Работа с форматированным документом Предположим, что в справочнике Номенклатура существует также реквизит Картинка типа ХранилищеЗначения. И при выгрузке элементов справоч- ника необходимо включить его в файл обмена. Для этого воспользуемся объектом ФорматированныйДокумент и создадим обработку, в которой будет производиться чтение и запись форматирован- ного текста. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаСФорматированным документом, команды формы Прочитать номенклатуру, Записать номенклатуру). В редакторе основной формы обработки создадим реквизит ПолеФД типа ФорматированныйДокумент и разместим в форме поле вида ПолеФормати- рованногоДокумента, связанное с этим реквизитом. Для записи данных из справочника в форматированный документ могут использоваться следующие процедуры (листинги 18.12, 18.13). Листинг 18.12. Процедура «ЗаписатьНоменклатуруО» &На Клиенте Процедура ЗаписатьНоменклатуру(Команда) II Необходимо установить реальный путь. Путь = ФД = ЗаписатьНоменкпатуруНаСервера(); ФД.Записать(Путь + "result2.htm", ТипФайлаФорматированногоДокумента.НТМЬ); КонецПроцедуры Листинг 18.13. Выгрузка элементов справочника в форматированный документ &НаСервереБезКонтексга Функция ЗаписатьНоменкпатуруНаСервере() ФД = Новый ФорматированныйДокумент; ФДДобавить(СформироватьЗагоповок("000 Быстрее, выше, сильнее”), ТипЭлементаФорматированногоДокумента.Текст); Том 2
№ормат£|[файлов1обмена1 ФД.Добави1ъ(, ТипЭлементаФорматмрованногоДокумента.ПереводСтроки); Выборка = Справочники. Номенклатура.Выбратъ(); Пока Выборка .Следующий!) Цикл II Выгрузить только элементы справочника. Если Не Выборка.ЭтоГруппа Тогда ФД.Добавить(ЭлементВСтроку(Выборка), ТипЭлементаФорматарованногоДокумента.Текст); Картинка = Выборка. Картинка. Получить(); Если Картинка <> Неопределено Тогда ФД.Добавить(Картинка, ТипЭлементаФорматированногоДокумента.Картинка); КонецЕсли; ФД.Добавить(, ТипЭлементаФорматированногрДокумента.ПереводСтроки); КонецЕсли; КонецЦикла; Возврат ФД; КонецФункции Процесс записи инициирует процедура ЗаписатьНоменклатуруО, см. листинг 18.12. В процедуре вызывается серверная функция ЗаписатьНо- менклатуруНаСервере(), см. листинг 18.13, в которой создается объект ФорматированныйДокумент, заполняется элементами номенклатуры с картинками, затем передается обратно на клиента и записывается. Добавление строк в форматированный документ производится методом Добавить!) объекта ФорматированныйДокумент. Вторым параметром в этот метод передается тип элемента, который нужно вставить. Это значение системного перечисления ТипЭлементаФорматированногоДокумента, которое может принимать значения Текст, Картинка, ПереводСтроки. Для получения заголовка (первой строки) используется функция Сфор- мироватьЗаголовок(), см. листинг 18.3, для записи элемента справочника в строку используется функция ЭлементВСтроку(), см. листинг 18.2. При переборе элементов справочника мы сначала получаем объект Картинка из реквизита Картинка методом Получить!) и, если элемент спра- вочника содержит картинку, добавляем ее в форматированный документ с соответствующим типом элемента. В конце каждого элемента справочника добавляем в форматированный документ перевод строки с соответствующим типом элемента. После передачи на клиента, в процедуре ЗаписатьНоменклатуруО форма- тированный документ записывается в файл обмена методом Записать!). Вторым параметром в этот метод передается тип файла, в который производится запись. Это значение системного перечисления ТипФай- лаФорматированногоДокумента, которое может принимать значения HTML,
I ГлаваН 84 И нтеграция[с1другими1информационн£|ми[системами TXT, ANSITXT. Поскольку форматированный документ содержит картинки, записываем его в файл типа HTML. Для чтения и отображения в форме содержимого форматированного доку- мента может использоваться следующая процедура (листинг 18.14). Листинг 18.14. Загрузка данных в форматированный документ &НаСервере Процедура ПрочитатьНоменкпатуруНаСервере() II Необходимо установить реальный путь. Путь = "с:\“; ПолеФД.Удалить(); Текст = Новый ЧтениеТекста(Путь + ''result2.htm”, КодировкаТекста.11ТР8); II Считать первую строку. ПрочитаннаяСтрока = Текст.ПрочигатьСтроку(); II Цикл выполняется, пока не будет достигнут конец файла. Пока ПрочитаннаяСтрока <> Неопределено Цикл ПрочитаннаяСтрока = Текст.ПрочитатьСтроку(); РисунокНачало = Найти(ПрочитаннаяСтрока, ”<img src''); Если РисунокНачало > 0 Тогда ТекстНоменкпатуры = Лев(ПрочитаннаяСтрока, РисунокНачало -1); ПопеФД.Добавигь(ТекстНоменклатуры, ТипЭлементаФорматированногцДокумента.Текст); РисунокКонец = Найти(ПрочитаннаяСтрока, "<Ьг>"); РисунокНоменклатуры = Путь + Сред(ПрочиганнаяСтрока, РисунокНачало +10, РисунокКонец - 2 - РисунокНачало -10); ПопеФД.Добавигь(Новый Картинка(РисунокНоменклатуры), ТипЭлементаФорматированногоДокумента.Картинка); Иначе ПолеФД.Добавить(ПрочитаннаяСтрока, ТипЭлементаФорматированногоДокумента.Текст); КонецЕсли; ПолеФД.Добавить(, ТипЭлементаФорматированногоДокумента.ПереводСтроки); КонецЦикла; КонецПроцедуры Для чтения файла обмена воспользуемся объектом ЧтениеТекста. Методом ПрочитатьСтрокуО построчно считываем файл, пока не будет достигнут конец файла. В цикле чтения файла мы разбираем прочитанную строку и разделяем ее на обычный текст и строку, содержащую адрес рисунка. По адресу рисунка создаем объект Картинка. И затем добавляем в форматированный документ текст и/или рисунок с соответствующим типом элемента. <J-^©
Таким образом, мы загружаем данные из файла обмена в форматиро- ванный документ. Поле формы вида ПолеФорматированногоДокумента отображает данные этого форматированного документа (рис. 18.2). Рис. 18.2. Отображение форматированного документа в форме Пользователь может проводить любые корректировки текста, представ- ленного в поле формы, отражающем форматированный документ, и затем записать его методом Записать(). Необходимо заметить, что в процедурах записи и чтения данных в/из файла обмена действуют «договоренности» о передаче картинки номенклатуры, например, что она будет записываться в конце строки, описывающей каждый элемент. Работа с DBF Для работы с базами данных формата DBF (dBase III) в системе имеется специальный объект - XBase. Механизм работы с базами данных формата DBF предназначен для обеспечения возможности манипулирования ими непосредственно из встроенного языка системы «1С:Предприятие». Возможно практически любое манипулирование данными. Помимо работы с существующими базами данных, объект XBase имеет набор методов, позволяющих создать новую базу данных произвольной структуры, новые индексы и новый индексный файл. Следует отметить, что если использование методов, изменяющих структуру базы данных, Профессиональная разработка в системе «1С:Предприятие 8»
возможно только для объектов, не связанных с существующей базой данных (т.е. для вновь создаваемых баз данных), то создание новых индексов и индексного файла возможно как для создаваемых баз данных, так и для уже существующих и открытых. Для записи данных в файл DBF может использоваться следующий фрагмент кода (листинг 18.15). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной конфигу- рации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаСОВР, команды формы Запись данных, Чтение данных, Поиск данных). Листинг 18.15. Пример записи денных в файл DBF &НаКлиенте Процедура ЗаписьДанных(Команда) Путь = "с:\"; БД = Новый XBase; БД.Поля.Добавить("СООЕ", "S", 9); БД.Поля.Добавить("МАМЕ", "S", 40); БД.Поля.Добавить("СОЗГ, "N", 5,0); БД.Поля.Добавить("ЕО", "S", 10); БД.СоздатьФайл(Путь + "nomen.dbf”, Путь + "index.cdx"); БД.Индексы.Добавигь(”ЮХСООЕ", "CODE"); ИБД = БД.СоздатьИндексныйФайл(Путь + "index.cdx"); БД.АвтоСохранение = Истина; СтрокиНоменклатуры = ПопучитьСтрокиНоменклатуры(); Для Каждого Строка Из СтрокиНоменклатуры Цикл БД.Добавигь(); Значение = РазобратьСтроку(Строка); БД.СООЕ = Значение.Код; БД.NAME = Значение.Наименование; БД.СОЭТ = Значение.Цена; БД.ЕО = Значение.ЕдиницаИзмерения; КонецЦикла; БД.ЗакрытьФайл(); КонецПроцедуры Создается файл, у которого определяются четыре поля (CODE, NAME, COST, ED). Поле COST имеет числовой тип, остальные поля имеют стро- ковый тип. У создаваемого DBF-файла определяется один индексный файл. Следует отметить, что у DBF-файла может быть определено несколько индексов, но создаваемый при этом индексный файл всегда один. Том 2
№ормат£|[файлов1обмена1 При записи данных следует обращать внимание на свойство АвтоСохранение объекта XBase. Если оно установлено в значение Истина, то добавление записи в файл производится при вызове следующего метода Добавить(), создающего новую запись. Из процедуры ЗаписьДанных() вызывается серверная функция Полу- читьСтрокиНоменклатурыО, которая возвращает на клиента массив строк элементов номенклатуры, не являющихся группой (листинг 18.16). Листинг 18.16. Функция «ПолучитьСтрокиНоменклатурыО» &НаСервереБезКонтекста Функция ПолучитьСтрокиНоменклатурыО МассивСтрок = Новый Массив(); Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка .Следующий() Цикл II Выгрузить только элементы справочника. Если Не Выборка.ЭтоГруппа Тогда МассивСтрок.Добавить(ЭлементВСтроку(Выборка)); КонецЕсли; КонецЦикла; Возврат МассивСтрок; КонецФункции В процедуре ЗаписьДанных() в цикле обхода элементов массива в функции РазобратьСтроку() каждая строка разбирается на данные структуры, в DBF-файл добавляется строка, и элементы этой структуры записыва- ются в соответствующие поля DBF-файла. Текст функций ЭлементВСтроку() и РазобратьСтроку() приводился ранее (см. листинги 18.2 и 18.6). Для чтения данных может использоваться следующий фрагмент кода (листинг 18.17). Листинг 18.17. Пример чтения данных из файла DBF &НаКлиенте Процедура ЧтениеДанных(Команда) Путь = "с:\"; БД = Новый XBase; БД.ОткрытьФайл(Путь + "nomen.dbf", Путь + "index.cdx"); Сообщение = Новый СообщениеПользоватвлю(); Пока Истина Цикл Сообщение.Текст = БД.ССЮЕ +"" + Bfl.Name; Сообщение.Сообщить(); Если Не БД.Следующая() Тогда Прервать; КонецЕсли; КонецЦикла; БД.ЗакрытьФайл(); КонецПроцедуры
I ГлаваН 84 И нтеграция[с7другими1информационн£|ми[системами В приведенном фрагменте не используется определенный при записи индекс. Порядок отображения данных может быть следующий (факти- чески это соответствует физическому положению записей в файле). Листинг 18.18. Порядок отображения денных 000000004 Посудомоечная машина 000000003 Стиральная машина 000000007 Фен 000000002 Холодильник 000000006 Чайник Изменим код, добавив в него использование индекса (листинг 18.19). Листинг 18.19. Пример чтения данных из фейле DBF &НаКлиенте Процедура ЧтениеДанных(Команда) Путь = "с:\"; БД = Новый XBase; БД.ОткрытьФайл(Путь + "nomen.dbf, Путь + "index.cdx"); БД.ТекущийИндекс = БД.Индексы.ЮХСООЕ; Сообщение = Новый СообщениеПользователю(); Пока Истина Цикл Сообщение.Текст = БД.СООЕ +" ” + БД.Name; Сообщение.Сообщить(); Если Не БД.Следующая() Тогда Прервать; КонецЕсли; КонецЦикла; БД.ЗакрытьФайл(); КонецПроцедуры В этом случае в результате будут получены только следующие записи (листинг 18.20). Листинг 18.20. Полученные записи 000000004 Посудомоечная машина 000000006 Чайник 000000007 Фен Дело в том, что при открытии файла объект XBase позиционируется на записи, которая является физически первой в файле. Однако с точки зрения используемого индекса, построенного в порядке возрастания кодов номен- клатуры, она далеко не первая. При выполнении метода Следующая() выбирается следующая запись в индексном файле. Поэтому в результате выполнения данного кода из пяти записей обходятся только три.
Для того чтобы обойти все записи, необходимо явно использовать метод Первая(), как приведено ниже (листинг 18.21). Листинг 18.21. Пример использования метода «ПерваяЦ» &НаКлиенте Процедура ЧтениеДанных(Команда) Путь = ”с:\"; БД = Новый XBase; БД.ОткрытьФайл(Путь + "nomen.dbf", Путь + "index.cdx"); БД.ТекущийИндекс = БД.Индексы.ЮХССЮЕ; Сообщение = Новый СообщениеПользователю(); БД.Первая(); Пока Истина Цикл Сообщение.Текст = БД.ССЮЕ +11" + БД-Name; Сообщение.Сообщить(); Если Не БД.Следующая() Тогда Прервать; КонецЕсли; КонецЦикла; БД.ЗакрытьФайл(); КонецПроцедуры В результате будут получены все записи по возрастанию кода. Индексы полезно использовать не только для упорядочивания выборок записей по какому-либо полю, но и для реализации каких-либо «поис- ковых механизмов». Рассмотрим пример кода (листинг 18.22). Листинг 18.22. Пример чтения данных из файла DBF &НаКлиенте Процедура ПоискДанных(Команда) Путь = ”с:\"; БД = Новый XBase; БД.ОткрытьФайл(Путь + "nomen.dbf, Путь + "index.cdx"); БД.ТекущийИндекс = БД.Индексы.ЮХССЮЕ; Сообщение = Новый СообщениеПопьзователю(); Если БД.Найти("000000004", ">=") Тогда Пока Истина Цикл Сообщение.Текст = БД.ССЮЕ +"" + Bfl.Name; Сообщение.Сообщить(); Если Не БД.Следующая() Тогда Прервать; КонецЕсли; КонецЦикла; КонецЕсли; БД.ЗакрытьФайл(); КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
В результате будут получены только три записи (листинг 18.23). Листинг 18.23. Полученные записи 000000004 Посудомоечная машина 000000006 Чайник 000000007 Фен Менять текущий индекс можно и во время выборки (однако следует помнить, что при «умелой» манипуляции индексами можно никогда не достигнуть юнца DBF-файла). Работа с XML-документами Ранее были рассмотрены возможности работы с текстовыми файлами и файлами DBF. К недостаткам рассмотренных подходов следует отнести тот факт, что обмен возможен после установки определенных «дого- воренностей». Фактически для каждого такого случая необходимо индивидуально создавать какие-либо обработки, реализующие меха- низм записи и чтения данных из файлов представленного формата. При организации обмена большим количеством типов данных (со сложной иерархией) алгоритмы данных механизмов будут получаться очень слож- ными и громоздкими. Отклонение от подобного формата в лучшем случае приведет к ошибке, в худшем - к получению искаженных (неправильно проинтерпретиро- ванных) данных, причем факт искажения может быть и не замечен даже при использовании этих данных (например, перепутали цену с количес- твом и т. п.). При таком подходе получается, что задача обмена очень часто решается в индивидуальном порядке. На каждый обмен - свой формат. К определенному моменту развития различных программных комплексов стало громадное количество форматов обмена. В итоге назрела необхо- димость в разработке универсального формата обмена. В качестве такого универсального формата в 1991 году и был представлен язык XML (расши- ряемый язык разметки). Считается, что для организации обмена данными посредством XML-документов достаточно договориться только о факте обмена с использованием этого формата. Основные положения XML-документ в общем случае представляет собой файл с расширением XML, имеющий текстовое наполнение. Исходя из этого, можно сказать, что самым простейшим редактором таких документов может служить Блокнот (Notepad), хотя существует довольно большое количество специ- ализированных редакторов. Том 2
№ормат£|[файлов1обмена1 Может возникнуть вопрос: если XML-документ имеет текстовое наполнение, то чем же он отличается от обычного текстового файла (ведь можно сказать, что язык XML является частным случаем обмена посредством текстовых файлов), в чем его универсальность? Можно выделить несколько основных отличий: XML-документ создается по строгим правилам, внутри него соблюда- ется четкая иерархия составных частей, вместе с данными передается структура этих данных; описание возможной структуры документа определяется на специ- альном, формализованном языке (одном из нескольких), вследствие чего эта структура может быть программно разобрана (на приемной стороне можно разобрать возможную структуру, описанную на специ- альном языке, сопоставить структурные элементы документами с метаданными системы и после этого произвести загрузку данных); при работе с XML-документами используется объектный подход (а не разбор строки с помощью специальных функций работы со строко- выми значениями); формальное описание типов. Теперь если вернуться к универсальности XML-документов, то под ней понимается, что при необходимости произвести обмен данными посредс- твом XML-документов должны быть реализованы такие понятия, как: XML-документ с данными (созданный в соответствии со стандартом, определенным ко всем XML-документам); к документу существует описание его структуры, которое можно формально разобрать (схема XML-документа); определены пространства имен (в которых в том числе описаны типы данных, используемые в документе). Следует отметить, что, рассматривая особенности механизмов, позво- ляющих работать с XML-документами из «1С:Предприятия», мы в дальнейшем не будем подробно касаться таких понятий, как пространство имен (описанное в нем пространство типов), схема XML-документа. Но необходимо отдавать себе отчет в том, что при организации обмена с произвольными информационными системами понадобится более детальная работа с ними. Пора перейти к рассмотрению структуры и общих принципов формиро- вания XML-документов. При рассмотрении внутреннего наполнения XML-документов в них можно выделить определенные форматирующие конструкции. По аналогии с HTML (наверное, самый простой из языков разметки) их пока можно назвать тегами. Под тегом будем понимать некое выражение, заключенное в угловые скобки <выражение>. $2®
I ГУлаваЦ ,8Я И нтеграция[с?другими1информацибннй1ми[системами Различают открывающий тег <тег> и закрывающий тег </тег> (отличие - в наклонной черте перед именем тега). Если продолжать сравнение с языком разметки HTML, то в языке HTML набор тегов фиксирован. Теги HTML условно можно разделить на теги определения структуры документа и теги «форматирования» представляемых данных. К примеру, с тега <body> начинается основное тело HTML-документа, весь текст, попавший между тегами <Ь> и </Ь>, отображается полужирным и т.п. Для тегов можно задать значения характерных для них свойств. Например, <body text=red >. Свойство text определяет цвет текста тела документа по умолчанию (в примере он будет красным). Таким образом, изучение языка HTML сводится к ознакомлению с множеством тегов (их назначе- нием), свойствами тегов и их возможными значениями. В языке XML имена тегов не фиксированы, разработчик волен давать им собственные имена, определять у них произвольные свойства с любыми типами значений. В имени тега XML могут использоваться точки (правда, это может не поддерживаться рядом специализированных редакторов). В содержимом атрибутов, элемента пробелы и символы табуляции не игнорируются. Перейдем от термина «тег» к терминам более правильным по отно- шению к XML-документу. Можно сказать, что минимальной логической единицей XML-документа является элемент. У элемента может быть определено несколько атрибутов (упрощенно атрибут можно назвать свойством элемента). У любого элемента может быть один (непосредс- твенный) элемент-владелец (его нет только у единственного корневого элемента XML-документа) и любое количество подчиненных элементов (рис. 18.3). Рис. 18.3. Пример иерархии элементов XML Следует отметить, что в различной литературе используемая терминология может отличаться. То, что в данной главе называется элементом, может называться «узлом». В используемой нами терминологии понятие узел также встречается, но под ним понимается структурная часть элемента XML (такая как начало элемента, текст и т.д.).
Рассмотрим структуру элемента XML (рис. 18.4). Содержимое элемента (может быть текст или друг но элементы) Открывающий тег /Имяэлеменга Область действия тега ь Закрывающий тег Элемент вместе со всем содержимым Рис. 18.4. Схема элемента XML Пример, иллюстрирующий приведенную схему, приведен в лис- тинге 18.24. Листинг 18.24. Пример элемента XML «Товар ИмяСправочника = "Номенклатура" Код = "14”>Ardo TL1000 ЕХ-1«/Товар> В данной строке определен элемент с именем Товар. В начале элемента определяются два атрибута с именами ИмяСправочника и Код (соответс- твенно со значениями Номенклатура и 14). Между началом элемента и его концом (</Товар>) расположен текст элемента (его значение Ardo TL 1000 ЕХ-1). Вместо текста между тегами, описывающими начало и конец элемента, может находиться описание вложенных элементов. Также допускается следующий вариант определения элемента XML- документа (рис. 18.5). и_______________Эшшенх_______________р Л_____________HmsjukmcmuiZ_________t Атрибут = "Значение атрибута" J .Открывающий и он же закрывающий тег. Рис. 18.5. Схема элемента XML Приведенная схема представляет следующий вариант описания элемента (листинг 18.25). Листинг 18.25. Пример элемента XML «Товар Код = "14" Наименование = "ArdoTL 1000 ЕХ-17> Данный вариант допустим, когда между открывающим и закрывающим тегом нет текста и нет вложенных элементов. Поэтому вместо <Товар> </Товар> допустима конструкция <Товар/>. В приведенном описании определяется элемент с именем Товар и два атрибута с именами Код и Наименование. Рассмотрим пример XML-документа (листинг 18.26). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 18.26. Пример XML-документа <?xml version-'1.0" encoding="UTF-8" ?> «Корневой* «ОоситепЮЬ)ес1ПриходнаяНакладная* «Ref*4c0a4c73-905d-11d8-92a4-00030d0ca645«/Ref* <DeletionMark>false</DeletionMark> «Date>2010-04-17T14:52:43«/Date> «Number>000000001 «/Number* <Posted*tnje«/Posted> <Контрагент>4с0а4с72-905Ь-11 d8-92a4-00030d0ca645</KoHipareHT> <Товары> «Row* <HoMeHKnaiypa>efbfeaf4-831d-11d8-957e-00c026abdd5e</HoMeHKnaTypa> «Количество* 10«/Количество> «Цена*900«/Цена> «Сумма>1000</Сумма> «/Row* «Row* <HoMeHKnaiypa>efbfeaf6-831d-11d8-957e-00c026abdd5e</HoMeHKnaTypa> «Количество* 10«/Количество* «Цена*1000«/Цена> «Сумма>10000«/Сумма> «/Row* «/Товары* </ОоситепЮЬ]ес1.ПриходнаяНакладная* «/Корневой* В первой строке XML-документа определяется директива, указыва- ющая на то, что данный документ с текстовым содержимым является XML-документом. Далее определяется элемент Корневой. Внутри него определяются другие элементы. Можно сказать, что в данном документе просматривается определенная древовидная структура (она показана на рис. 18.6). Рис. 18.6. Древовидная структура XML-документа Том 2
№ормат£|[файлов1обмена1 Эта структура обеспечивается тем, что у XML-документа всегда один корневой элемент, описание одного элемента всегда находится внутри описания другого элемента (исключение составляет корневой элемент). Можно сказать, что древовидность структуры является обязательным признаком правильности оформленного XML-документа. При рассмотрении любого XML-документа можно говорить о его синтак- сической правильности и корректности. Синтаксически правильный XML-документ упрощенно удовлетворяет следующим условиям: язык XML чувствителен к регистру символов. Это обязательно нужно учитывать при описании начала и конца элемента; все значения атрибутов, используемых в определении элементов, должны быть заключены в кавычки; каждому открывающему тегу соответствует закрывающий. Можно сказать, что XML-документ является совокупностью элементов. Два возможных варианта описания элементов были представлены выше; элементы образуют древовидную структуру с одним корневым элементом (он обязательно один). Это достигается тем, что области действия тегов не могут пересекаться (либо они рядом, либо одна находится целиком внутри другой). Базовые средства «1С:Предприятия» для работы с XML В «1С:Предприятии» существует базовая подсистема работы с XML-документами. Основой этой подсистемы являются два объекта «1 С:Предприятия»: ЧтениеХМЦ ЗаписьХМЬ. При работе с XML-документами данные объекты реализуют модель последовательного доступа. Основная особенность работы в этой модели заключается в том, что документ не загружается полностью, работа идет только с текущим его фрагментом (частью элемента XML, например началом элемента, текстом элемента и т. д.). Поэтому при работе с доку- ментом нет возможности получать выборки элементов, «перепрыгивать» узлы и т. п.
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Запись данных в XML-документ Вернемся к задаче обмена данными об элементах справочника Номен- клатура. Рассмотрим пример использования объекта ЗаписьХМЬ (листинг 18.27). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- таСХМЦ команда формы Запись данных). Листинг 18.27. Пример записи XML-документа &НаКпиенте Процедура ЗаписьДанных(Команда) ЗаписьХМЬ = Новый ЗаписьХМЬ; ЗаписьХМ1.0ткрытьФайл("с:\боситеп1хтГ'); II Записать директиву. ЗаписьХМЬ.ЗаписатьОбъявлениеХМЦ); II Записать начало корневого элемента. ЗаписьХМ1.3аписатьНачалоЭлемента("Корневой"); II Записать атрибут корневого элемента. ЗаписьХМ1.3аписатьАтрибут("ИмяСправочника", "Номенклатура"); ЗаписьХМЬЗаписатьКомментарийС'Выгрузка элементов справочника"); СтрокиНоменкпатуры = ПолучигьСтрокиНоменкпатуры(); Для Каждого Строка Из СтрокиНоменкпатуры Цикл Значение = РазобратьСтроку(Строка); ЗаписьХМЬЗаписатьНачалоЭлемента ("Элементе правочника"); ЗаписьХМЬЗаписатьНачалоЭлементаС'Код"); ЗаписьХМ1.3аписатьТексг(Значение.Код); ЗаписьХМ1.3аписатьКонецЭлемента(); ЗаписьХМЬЗаписатьНачалоЭлемента("Наименование"); ЗаписьХМ1.3аписатьТексг(Значение.Наименование); ЗаписьХМ1.3аписатьКонецЭлемента(); ЗаписьХМ1.3аписатьНачалоЭлемента("ЗакупочнаяЦена"); ЗаписьХМ1.3аписатьТексг(Значение.Цена); ЗаписьХМЬЗаписатьКонецЭлементаО; ЗаписьХМ1.3аписатьНачалоЭлемента("ЕдиницаИзмерения"); ЗаписьХМ1.3аписатьТексг(Значение.ЕдиницаИзмерения); ЗаписьХМ1.3аписатьКонецЭлемента(); ЗаписьХМЬЗаписатьКонецЭлементаО; КонецЦикла; ЗаписьХМЬЗаписатъКонецЭлементаО; ЗаписьХМЬЗакрыть(); КонецПроцедуры $2®
Здесь так же, как и при записи DBF-файла, вызывается серверная функция ПолучитьСтрокиНоменклатурыО, которая возвращает на клиента массив строк элементов номенклатуры, не являющихся группой. Затем в цикле обхода элементов массива в функции РазобратьСтрокуО каждая строка разбирается на данные структуры, и элементы этой структуры записыва- ются в виде элементов XML-файла. Текст функций ЭлементВСтроку(), РазобратьСтрокуО и ПолучитьСтро- киНоменклатурыО приводился ранее (см. листинги 18.2, 18.6 и 18.16). В результате выполнения представленного кода будет получен следующий XML-документ (листинг 18.28). Листинг 18.28. Полученный XML-документ <?xml version-'1.0" encoding=''UTF-8'' ?> - «Корневой ИмяСправочника-'Номенклатура"> < !-- Выгрузка элементов справочника - «ЭлементСправочника> <Код>000000004</Код> «Наименование>Посудомоечная машина«/Наименование> <ЗакупочнаяЦена>20 000</ЗакулочнаяЦена> «ЕдиницаИзмерения>шт«/ЕдиницаИзмерения> </ЭлементСправочника> - «ЭлементСправочника> «Код>000000003«/Код> «Наименование>Стиральная машина«/Наименование> «ЗакупочнаяЦена>15000«/ЗакупочнаяЦена> «ЕдиницаИзмерения /> </ЭлементСправочника> - «ЭлементСправочника> <Код>000000007</Код> «Наименование>Фен«/Наименование> «ЗакупочнаяЦена>1 800«/ЗакупочнаяЦена> «ЕдиницаИзмерения>шт«/ЕдиницаИзмерения> </ЭлементСправочника> - «ЭлементСправочника> <Код>000000002</Код> «Наименование>Холодильник«/Наименование> <ЗакупочнаяЦена>25000«/ЗакупочнаяЦена> «ЕдиницаИзмерения>шт«/ЕдиницаИзмерения> </ЭлементСправочника> - «ЭлементСправочника> «Код>000000006«/Код> «Наименование>Чайник«/Наименование> <ЗакупочнаяЦена>2 000</ЗакулочнаяЦена> «ЕдиницаИзмерения /> </ЭлементСправочника> </Корневой> Первой строкой кода создается объект ЗаписьХМЬ. Через созданный объект в модели последовательного доступа будет производиться запись данных в XML-документ. С помощью метода ОткрытьФайл() указывается имя файла, куда будет производиться запись данных. Метод ЗаписатьОбъявлениеХМЬ() определяет директиву, что создава- Профессиональная разработка в системе «1С:Предприятие 8»
емый документ будет являться XML-документом (директива размещается в первой строке созданного документа). Для записи элемента XML-документа используются методы ЗаписатьНачалоЭлемента(), ЗаписатьАтрибут(), ЗаписатьТекст(), Запи- сатьКонецЭлемента(), которые производят запись соответствующего узла элемента XML в файл. При этом важно соблюдать порядок (иерархию) вызова этих методов. Напомним, что элемент можно представить в виде следующих узлов (листинг 18.29). Листинг 18.29. Узлы элемента XML <ИМЯ АТРИБУТ=Значение> Содержимое (Текст или описание другого элемента) </ИМЯ> Для записи вышеприведенного элемента можно использовать следующую последовательность методов (листинг 18.30). Листинг 18.30. Пример записи элемента XML ЗаписьХМ1.3аписатьНачалоЭлемента("ИМЯ"); ЗаписьХМ1.3аписатьАтрибут("АТРИБУГ, "Значение"); ЗаписьХМЬ.ЗаписатьТекст("Содержимое (Текст или описание другого элемента)"); ЗаписьХМ1.3аписатьКонецЭлемента(); Следует обратить внимание на тот факт, что если при определении начала элемента в соответствующем методе указывается его имя, то при закрытии имя не указывается. Закрывается элемент, открытый последним. В связи с этим следует внимательно относиться к последовательности исполняемых методов, чтобы не запутаться в иерархии (в ряде случаев для упрощения алгоритмов создания документов сложной структуры могут использоваться рекурсивные вызовы процедур, ответственных за создание элементов). Последовательность методов объекта ЗаписьХМЬ, вызываемых при создании элементов, можно проиллюстрировать следующей схемой (рис. 18.7). Правильный XML-документ содержит единственный корневой элемент, запись всего документа начинается с записи этого элемента. Запись любого элемента XML начинается с записи открывающего тега (начала элемента, выполняемого с помощью метода ЗаписатьНачалоЭле- мента()). Только в контексте начала элемента можно записывать атрибуты XML-документа (используется метод ЗаписатьАтрибут(), вызываемый последовательно для каждого атрибута). Записать атрибут после записи текста или конца элемента нельзя. Том 2
№ррматБ1Гфайлов1о1бмёна1 Рис. 18.7. Последовательность использования методов при записи XML-документа После записи начала элемента и всех его атрибутов можно провести запись текста (это означает, что у формируемого элемента XML нет вложенных элементов) или рекурсивно перейти к записи другого вложен- ного элемента. После того как либо текст, либо другой вложенный элемент (элементы) закрыт, производится запись конца элемента (метод ЗаписатьКонецЭле- мента()). Чтение данных из ХМL-документа Объект ЧтениеХМЬ предназначен для чтения данных из XML-документа. Так же как при записи данных, чтение элемента производится узлами. Перечень узлов определен в системном перечислении ТипУзлаХМЬ: НачалоЭлемента, Атрибут, Текст, КонецЭлемента, Ничего, ИнструкцияОбработки. Какой узел получен при чтении следующего структурного элемента, можно узнать, обратившись к свойству ТипУзла объекта ЧтениеХМЬ. Будем исходить из того, что необходимо прочитать следующий XML- документ (полученный при выгрузке с помощью объекта ЗаписьХМЬ), листинг 18.31. Ф2У
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Листинг 18.31. Читаемый XML-документ <?xml version-'1.0" encoding="UTF-8" ?> - «Корневой ИмяСправочника-'Номенклатура”> <!-- Выгрузка элементов справочника -> - «ЭлементСправочника> «Код>000000004«/Код> «Наименование>Посудомоечная машина«/Наименование> «ЗакупочнаяЦена>20 000«/ЗакупочнаяЦена> < Единица Измерения>шт«/ЕдиницаИзмерения> «/ЭлементСправочника> - «ЭлементСправочника> «Код>000000003«/Код> <Наименование>Старальная машина«/Наименование> «ЗакупочнаяЦена>15 000«/ЗакупочнаяЦена> «ЕдиницаИзмерения /> «/ЭлементСправочника> - «ЭлементСправочника> «Код>000000007«/Код> «Наименование>Фен«/Наименование> «ЗакупочнаяЦена>1 800</ЗакупочнаяЦена> < Единица Измерения>шт«/ЕдиницаИзмерения> «/ЭлементСправочника> - «ЭлементСправочника> <Код>000000002«/Код> «Наименование>Холодильник«/Наименование> <ЗакупочнаяЦена>25 000</ЗакулочнаяЦена> < Единица Измерения>шт«/ЕдиницаИзмерения> «/ЭлементСправочника> - «ЭлементСправочника> «Код>000000006«/Код> «Наименование>Чайник«/Наименование> «ЗакупочнаяЦена>2 000</ЗакупочнаяЦена> «ЕдиницаИзмерения /> </ЭлементСправочника> </Корневой> Пример использования объекта ЧтениеХМЬ (листинг 18.32). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- TaCXML, команда формы Чтение данных). Листинг 18.32. Чтение XML-документа &НаКлиенте Процедура ЧтениеДанных(Команда) Файл = Новый ЧтениеХМЦ Файл.ОткрытьФайл("с:\боситеп1хтГ); Сообщение = Новый СообщениеПользователю(); II Прочитать фрагменты элемента.
Пока Файл.Прочитатъ() Цикл II После чтения проверить тип узла. Если Файл.ТипУзла = ТипУзлаХМЕНачалоЭлемента Тогда Сообщение.Тексг = Файл.Имя; Сообщение.Сообщить(); II Прочитать атрибуты. Пока Файл.ПрочитатьАтрибут() Цикл Сообщение.Тексг = "атрибут:" + Файл.Имя + "=" + Файл.Значение; Сообщение.Сообщить(); КонецЦикла; КонецЕсли; Если Файл.ТипУзла = ТипУзлаХМЬ.Текст Тогда Сообщение.Тексг = Файл.Значение; Сообщение.Сообщить(); КонецЕсли; Если Файл.ТипУзла = ТипУзлаХМЬКонецЭлемента Тогда Сообщение.Тексг = 7" + Файл.Имя; Сообщение.Сообщить(); КонецЕсли; КонецЦикла; Файл.3акрыть(); КонецПроцедуры Процесс чтения начинается с создания объекта ЧтениеХМЬ С помощью метода ОткрытьФайл() производится указание файла, из которого в даль- нейшем будет производиться чтение данных. Само чтение осуществляется с помощью метода Прочитать(). Данный метод возвращает значение Истина, в случае если получилось позициони- роваться на следующем узле элемента XML. Для того чтобы понять, какой узел является текущим, производится обращение к свойству ТипУзла. В случае, если это НачалоЭлемента, можно провести выборку атрибутов (они существуют только в контексте начала элемента). После того как метод Прочитать() возвращает значение Ложь (достигнут конец документа), работа с XML-документом завершается вызовом метода Закрыть(). Порядок работы с объектом ЧтениеХМЬ можно проиллюстрировать следу- ющей схемой (рис. 18.8). Общий принцип работы довольно прост. Открывается XML-документ, далее в цикле выполняется метод Прочитать(). После чтения анализи- руется тип полученного узла. В зависимости от типа предпринимаются некие специфические действия по извлечению данных. Если полученный узел является началом элемента, предпринимается попытка получить все атрибуты, которые могут быть в нем определены. Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 18.8. Последовательность использования методов при чтении XML-документа XML-сериализация Как уже говорилось ранее, XML-документ имеет текстовое содержимое. Это в первую очередь означает, что при записи в него любого значения (числа, даты, ссылки на объект и т.д.) оно преобразуется к строке. При получении данных возникает обратная задача по преобразованию значения из строкового в нужный тип. С одной стороны, с помощью базовых средств чтения и записи документов XML можно решить любую задачу, связанную с организацией обмена. Но решение задачи преобразования типов в строковый и обратно потре- бует от разработчика очень больших затрат времени (на самостоятельную реализацию данных преобразований). Придется в полной мере работать со стандартными типами (W3C), определять собственное пространство имен (для описания некоторых типов «1С:Предприятия» в XML) и т.д. Альтернативным (более простым и удобным) решением данной задачи может быть использование уже реализованных средств XML-сериали- зации. С точки зрения данной системы каждый объект данных «1 С:Предприятия» представляется как элемент XML-документа. Этот элемент может иметь подчиненные элементы. Как раз с этой точки зрения (есть у элемента подчиненные или нет) типы значений делятся на простые и сложные. К простым типам данных относятся типы, значения которых представ- ляются подсистемой XML-сериализации в виде элементов XML только с текстовым содержимым (листинг 18.33). Том 2
№ормат£|[файлов1обмена1 Листинг 18.33. Пример сериализации знечения ссылки на справочник <CatalogRef.HoMeHKnaiypa> 178a492a-3fd4-11da-a1f2-0011d8388a5d </CatalogRef.HoMeHKnaiypa> Значения сложных типов представляются в виде элементов XML, содер- жащих вложенные элементы (листинг 18.34). Листинг 18.34. Пример сериализации знечения типа «УдалениеОбъекта» <v8:ObjectDeletion xmlns="http://v8.1c.nj/data"> <v8:Ref xsi:type="CatalogRef.BaHKM"> 60c5cec3-7f6f-4ec3-9620-e757fe3614ca </v8:Ref> </v8:ObjectDeletion> Если проанализировать типы, которые требуется подвергать преобразо- ванию, то их можно разделить на три группы: типы, которым можно найти прямое соответствие в типах, опреде- ленных в документе XML Schema Part 2: Datatypes консорциума W3C (пространство имен - http://www.w3.org/2001/XMLSchema). Значения данных типов могут представляться в виде элемента с текстовым содержимым; предопределенные типы «1С:Предприятия» (пространство имен - http://v8.1c.ru/data, http://v8.1c.ru/8-1/data, http://v8.1c.ru/8.2/data). Эти типы не зависят от структуры метаданных и существуют в любой инфор- мационной базе. Исходя из этого, имеет смысл описать их в специализированном пространстве имен. Они могут относиться как к простым типам, так и к сложным; типы, производные от метаданных конфигурации «1С:Предприятия». Наличие таких типов зависит от состава и специфики определения объектов конфигурации. В каждой информационной базе они могут иметь произвольную реализацию. Исходя из этого, нет возмож- ности описать все возможные варианты этих типов в каком-либо пространстве имен (при создании объекта конфигурации разработчик имеет столько степеней свободы, что описать все возможные варианты создаваемых объектов в принципе невозможно). В итоге такие типы не относятся ни к какому пространству имен и тоже могут являться как простыми, так и сложными типами (например, ссылка на объект отно- сится к простым типам, сам объект - к сложным). При рассмотрении примеров представления различных значений в XML и при дальнейшем изложении будем исходить из предположения, что определены следующие соответствия пространств имен (после xmlns определены их префиксы): xmlns:xsd="http://www. w3 .org/2001/XMLSchema"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:v8="http://v8.1c.ru/data".
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами xmlns:v8="http://v8. lc.ru/8.1/data". xmlns:v8="http://v8. lc.ru/8.2/data". К простым типам с точки зрения представления в XML относятся следу- ющие типы «1 С:Предприятия»: Число; Строка; Дата; Булево; ДвоичныеДанные; NULL; УникальныйИдентификатор; ХранилищеЗначения; все ссылки на объекты базы данных; ссылки на перечисления, определяемые в конфигурации. К сложным типам, значения которых могут быть представлены в XML, относятся следующие типы: Тип; ОписаниеТипов; Комета нта МенеджерЗначения. < и мя >; все объекты базы данных; наборы записей регистров, последовательностей, перерасчетов; УдалениеОбъекта. Простые типы Рассмотрим различные варианты представления значений простых типов в XML-документе. Число Типу Число соответствует тип данных XML decimal из пространства имен http://www.w3.org/2001/XMLSchema (префикс xsd). Правила представления значений данного типа определены в документе XML Schema Part 2: Datatypes. Ниже приведены примеры представления значений типа Число в XML (листинг 18.35). Листинг 18.35. Варианты представления значения типа «Число» - 3.14156 < !- Не задано явно имя корневого элемента -> <decimal>3.14156</decimal> < !- Явно задано имя корневого элемента XML <Amount>3.14156</Amount> < !- Явно указан тип данных XML -> <Data xsi:type="xsd:decimal">3.14156</Data>
В первом случае имя типа (пространство имен http://www.w3.org/2001/ XMLSchema) совпадает с именем элемента, в котором передается значение. Во втором случае именем узла является имя переменной (свойства, рекви- зита), из которого/в которое должна производиться запись. В третьем случае тип определен явно. Используется тот факт, что в пространстве имен с префиксом xsi определена возможность использования такого атрибута, как type. С помощью значения этого атрибута может указы- ваться тип, который был преобразован к строковому и размещен в тексте элемента XML. В нашем случае указано, что при загрузке текст «3.14156» необходимо интерпретировать как тип decimal из пространства имен с префиксом xsd. Строка Типу Строка соответствует тип данных string из пространства имен http://www.w3.org/2001/XMLSchema. Строка записывается в XML как есть. Ниже приведены примеры представления в XML значений типа Строка (листинг 18.36). Листинг 18.38. Варианты представления значений типа «Строке» <!- Не задано явно имя корневого элемента -> <string>3T0 такая crpoKa</string> <!-- Явно задано имя корневого элемента XML <№те>Иванов</№те> <!-- Явно указан тип данных XML <Data xsi:type=”xsd:string">3ro такая строка<Юа(а> Дата Типу Дата соответствует тип данных XML dateTime из пространства имен http://www.w3.org/2001/XMLSchema. Значения типа Дата представляются в виде CCYY-MM-DDTHH:MM:SS, где CCYY - год, представленный в виде четырех цифр; ММ - месяц, представленный двумя цифрами; DD - день месяца двумя цифрами; Т - латинская буква Т; НН - час суток; ММ - минута; SS - секунда. Такой формат даты определен как допустимый в документе XML Schema Part 2: Datatypes. Ниже приведены примеры представления в XML значений типа Дата (листинг 18.37). Листинг 18.37. Варианты представления значений типа «Дата» <!- Не задано явно имя корневого элемента -> <dateTime>2010-09-21T12:00:00</dateTime> <!-- Явно задано имя корневого элемента XML <Started>2010-10-30T19:00:00</Started> <!-- Явно указан тип данных XML <Dataxsi:type="xsd:dateTime">2010-08-25T10:00:00</Data> Профессиональная разработка в системе «1С:Предприятие 8»
Булево Типу Булево соответствует тип данных boolean из пространства имен http://www.w3.org/2001/XMLSchema. Значение Ложь представляется строкой false, а значение Истина - строкой true. Такой формат предусмотрен в документе XML Schema Part 2: Datatypes. Ниже приведены примеры представления в XML значений типа Булево (листинг 18.38). Листинг 18.38. Варианты представления значений типа «Булево» < !- Не задано явно имя корневого элемента -> <boolean>falee</boolean> < !-- Явно задано имя корневого элемента XML <Posted>true</Posted> < !-- Явно указан тип данных XML <Data xsi:type="xsd:boolean">true</Data> ДвоичныеДанные Типу ДвоичныеДанные соответствует тип данных XML base64Binary из пространства имен http://www.w3.org/2001/XMLSchema. Значения данного типа представляются как двоичные данные, закодиро- ванные с использованием алгоритма Base64, описанного в RFC 2045. Ниже приведены примеры представления в XML значений типа Двоич- ныеДанные (листинг 18.39). Листинг 18.39. Варианты представления значений типа «ДвоичныеДанные» < !- Не задано явно имя корневого элемента <base64Binary>YWJjZGVm</base64Binary> <!-- Явно задано имя корневого элемента XML <BinaryData>YWJjZGVm</BinaryData> <!- Явно указан тип данных XML -> <Dataxsi:type="xsd:base64Binaty”>YWJjZGVm</Data> Null Типу Null соответствует тип данных XML Null из пространства имен http://v8.1c.ru/data. Данный тип имеет одно-единственное значение, которое представляется пустой строкой. Ниже приведены примеры представления в XML значений типа Null (листинг 18.40). Том 2
№ормат£|[файлов1обмена1 Листинг 18.40. Верианты представления значения типа Null <!- Не задано явно имя корневого элемента -> <v8:Null/> <!-- Явно задано имя корневого элемента XML <Selected/> <!-- Явно указан тип данных XML <Data xsi:type=nv8:Null7> УникальныйИдентификатор Типу УникальныйИдентификатор соответствует тип данных XML UUID из пространства имен http://v8.1c.ru/data. Значения данного типа представляются в XML в соответствии с общепри- нятой практикой и стандартами (ISO-11578, DCE 1.1: Remote Procedure Call - Universal Unique Identifier). Ниже приведены примеры представления в XML значений типа Уникаль- ныйИдентификатор (листинг 18.41). Листинг 18.41. Варианты представления значений типа «УникальныйИдентификатор» <!- Не задано явно имя корневого элемента -> <v8:UUID>3294be0f-c039-41a9-bd65-596da0dcfe68</v8:UUID> <!-- Явно задано имя корневого элемента XML -> <ld>da035e32-3f7a-4d87-9c6d-accf7db8cb4b</ld> <!-- Явно указан тип данных XML <Data xsi:type="v8:UUID"> 08893b0b-5ec3-4a53-a9f5-173312316919</Data> ХранилищеЗначения Типу ХранилищеЗначения соответствует тип данных XML Valuestorage из пространства имен http://v8.1c.ru/data. Значения данного типа представляются в XML как данные Хранили- щеЗначения, сохраненные в файл, а затем закодированные с использова- нием алгоритма Base64. Ниже приведены примеры представления в XML значений типа ХранилищеЗначения (листинг 18.42). Листинг 18.42. Варианты представления значений типа «ХранилищеЗначения» <!- Не задано явно имя корневого элемента -> <v8:ValueStorage>AQEOAAAAAAAAAO+7v3siUylsljHQoSJ9</v8:ValueStorage> <!- Явно задано имя корневого элемента XML -> <Data>AQEOAAAAAAAAAO+7v3siUylsljHQoSJ9</Data> <!-- Явно указан тип данных XML <Dataxsi:type="v8:ValueStorage">AQEOAAAAAAAAAO+7v3siUylsljHQoSJ9</Data>
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Тип ссылки на объект базы данных Каждому из типов ссылок на объекты базы данных соответствует свой собственный тип данных XML. Имя типа данных XML для ссылок на объекты базы данных соответствует англоязычному имени типа значения ссылки «1С:Предприятия». Так, например, для справочника Валюты англоязычное имя типа ссылки будет выглядеть как CatalogRef.BaniOTbi. Так же будет выглядеть и имя типа данных XML. Типы данных XML для ссылок на объекты базы данных не относятся ни к какому пространству имен (зависит от определенных в конфигурации объектов). Значения ссылок представляются в XML как значения типа Уникаль- ныйИдентификатор, полученные из ссылок. Ниже приведены примеры представления в XML значений ссылок на объекты базы данных (листинг 18.43). Листинг 18.43. Варианты представления значений типа ссылки на объект базы данных < !- Не задано явно имя корневого элемента -> <CatalogRef.BaHKH>911b5b8b-11f5-4993-9673-2c9a7a8995d5</CatalogRef.BaHKH> < !-- Явно задано имя корневого элемента XML <Ref>911b5b8b-11f5-4993-9673-2c9a7a8995d5</Ref> < !- Явно указан тип данных XML -> <Dataxsi:type="CatalogRef.BaHKH">911b5b8b-11f54993-9673-2c9a7a8995d5</Data> Тип ссылки на значение перечисления Каждому из типов ссылок на значения перечислений, определенных в конфигурации, соответствует свой собственный тип данных XML. Имя типа данных XML для ссылок на значения перечисления соответс- твует англоязычному имени типа «1С:Предприятия». Так, например, для перечисления ВидыАдресов англоязычное имя типа ссылки на значение будет выглядеть как ЕпитРеТ.ВидыАдресов. Так же будет выглядеть и имя типа данных XML. Типы данных XML для ссылок на значения перечислений не относятся ни к какому пространству имен (также определяются структурой любой конфигурации «1 С:Предприятия»). В XML ссылки на значения пере- числений представляются в виде имени соответствующего значения перечисления. Ниже приведены примеры представления в XML ссылок на значения перечислений (листинг 18.44).
Листинг 18.44. Верианты предстевления значений типа ссылки на значение перечисления < !- Не задано явно имя корневого элемента -> < ЕпитРе1.ВидыАдресов>Юридический</ЕпитРе1.ВидыАдресов > < !-- Явно задано имя корневого элемента XML <ЯеТ>Юридический</ЯеТ> < !-- Явно указан тип данных XML <Data xsi:type="EnumRef.BnflbiAflpecoB">0H3M4ecKHM</Data> Работа с простыми типами Для работы с XML-представлениями значений простых типов предназна- чены два метода глобального контекста - ХМ1_Строка() и ХМ1_Значение(). Метод ХМЬСтрока() имеет единственный параметр - значение, для которого нужно получить XML-представление. Это значение должно отно- ситься к типу, являющемуся простым с точки зрения XML-сериализации. В противном случае будет вызвано исключение. При нормальном завер- шении функция возвращает строку, которая может быть использована как текст элемента XML, представляющего значение простого типа. Метод ХМ1_Значение() выполняет противоположную задачу. У этого метода два параметра. Первый параметр - тип значения, которое нужно получить из строки, второй параметр - сама строка. Для преобразования типа данных «1С:Предприятия» в тип данных XML и наоборот предназначены методы ХМ1_Тип() и ИзХМЬТипа(). Метод ХМЬТип() имеет один параметр - тип, для которого нужно получить соот- ветствующий тип данных XML. Если соответствующий тип данных XML определен, то метод возвращает значение типа ТипДанныхХМЬ. Если же соответствующего типа данных XML нет, то метод возвращает значение Неопределено. Метод ИзХМЬТипа() имеет два варианта вызова. В первом варианте метод имеет единственный параметр типа ТипДанныхХМЬ Во втором варианте параметра два: имя типа XML и пространство имен. В обоих случаях метод возвращает соответствующий типу данных XML тип данных «1С:Предприятия», если таковой имеется, или Неопределено в противном случае. Поскольку большинство методов для работы с данными XML (за исклю- чением примитивных типов данных) не работают на клиенте, а получать файл с данными пользователю нужно в основном именно на клиенте, здесь и далее будем использовать следующий подход. При записи данных XML будем производить необходимую обработку данных на сервере, записывать эти данные во временный файл, в виде двоичных данных сохранять файл во временном хранилище, и адрес этих Профессиональная разработка в системе «1С:Предприятие 8»
данных в хранилище передавать на клиента. И затем уже получать файл на клиенте по адресу во временном хранилище. При чтении данных XML будем сохранять XML-документ во временном хранилище и адрес данных в хранилище передавать в северную проце- дуру, в которой документ будет получаться из временного хранилища, записываться во временный файл, и будет производиться чтение документа. Рассмотрим пример использования вышеперечисленных методов (листинги 18.45, 18.46). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обра- ботка РаботаСХМЦ команды формы ЗаписьПростыхТиповДанных, ЧтениеПростыхТиповДанных). Листинг 18.45. Пример записи XML-документа &НаКлиенте Процедура ЗаписьПростыхТиповДанных(Команда) АдресДокументаВХранилище = ЗаписьПростыхДанныхХМЦ); ПолучитьФайл(АдресДокументаВХранилище, КаталогВраменныхФайлов() + "my_xml.xml", Ложь); КонецПроцедуры В процедуре записи XML-документа вызывается серверная функция ЗаписьПростыхДанныхХМЬ(), листинг 18.46, в которой производится необ- ходимая обработка данных, затем эти данные записываются во временный файл, который в виде двоичных данных сохраняется во временном храни- лище, и адрес этих данных в хранилище возвращается на клиента. Листинг 18.46. Функция «ЗеписьПростыхДанныхХМЬ()» &НаСервереБезКонтексга Функция ЗаписьПросгыхДанныхХМ1() ИмяФайлаХМЬ = КаталогВременныхФайлов() + "temp.xml"; Файл = Новый ЗаписьХМЬ; Файл.ОткрытьФайл(ИмяФайлаХМЬ); Файл.ЗаписатьОбъявлениеХМ1(); Файл.ЗаписатьНачалоЭлемента("Кор невой"); II Записать значение типа "Число”. II Получить значение "ТипДанныхХМЬ" для числа. Том 2
№ормат£|[файлов1обмена1 TnnXML = ХМ1_ТипЗнч(1000); II Создать элемент, имя которого совпадает с именем типа XML, II при этом записать и пространство имен типа XML. Файл.ЗаписатъНачалоЭлемента(ТипХМ1_.ИмяТипа, ТипХМ1_.ий1ПространстваИмен); Файл.ЗаписатъТекст(ХМ1Строка(1000)); Файл.ЗаписатьКонецЭлемента(); II Записать значение типа "Строка". TnnXML = ХМ1ТипЗнч("Иванов”); Файл.ЗаписатьНачалоЭлемента(ТипХМ1_.ИмяТипа, ТипХМ1_.иР1ПространстваИмен); Файл.ЗаписатъТекст(ХМ1Строка("Иванов')); Файл.ЗаписатьКонецЭлемента(); II Записать значение типа "Дата". TnnXML = XMLTnn3H4('2010-09-21T12:00:00Z'); Файл.ЗаписатьНачалоЭлемента(ТипХМ1_.ИмяТипа, ТипХМ1_.иР1ПространстваИмен); Файл.ЗаписатьТекст(ХМ1Строка('2010-09-21Т12:00:00г')); Файл.ЗаписатьКонецЭлемента(); II Записать значение типа "Булево". TnnXML = ХМЬТипЗнч(1ше); Файл.ЗаписатьНачалоЭлемента(ТипХМ1_.ИмяТипа, ТипХМ1_.иР1ПространстваИмен); Файл.ЗаписатьТекст(ХМ1Строка({гие)); Файл.ЗаписатьКонецЭлемента(); II Получить ссылку на элемент номенклатуры. СсылкаНаНоменкпатуру = Справочники.Номенкпатура.НайтиПоКоду("000000003"); TnnXML = ХМЬТипЗнч(СсыпкаНаНоменклатуру); Файл.ЗаписатьНачалоЭлемента(ТипХМ1_.ИмяТипа, ТипХМ1_.иР1ПространстваИмен); Файл.ЗаписатьТекст(ХМ1Строка(СсылкаНаНоменкпатуру)); Файл.ЗаписатьКонецЭлемента(); Файл.ЗаписатьНачалоЭлемента(ТипХМ1_.ИмяТипа, ТипХМ1_.иР1ПространстваИмен); Файл.ЗаписатьТекст(Строка(СсыпкаНаНоменклатуру)); Файл.ЗаписатьКонецЭлемента(); Файл.ЗаписатьКонецЭлемента(); Файл.3акрыть(); Возврат ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаХМ1)); КонецФункции Особенность вышеприведенного механизма заключается в том, что при записи элемента в его имя записывается имя типа XML (получае- мого при обращении к значению, полученному при обращении к методу ХМЬТипЗнчО). Также записывается пространство имени типа. Следует отметить, что тип XML можно было получить и при обращении к методу ХМЬТип(). В результате выполнения фрагмента кода сформируется следующий доку- мент (листинг 18.47).
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Листинг 18.47. Пример сформированного XML-документа <?xml version="1.0" encoding="UTF-8" ?> - <Корневой> <d2p1:decimalxmlns:d2p1="http://www.w3.org/2001/XMLSchema"> 1000</d2p1:decimal> <d2p1 string xmlns:d2p1 ="http://www.w3.org/2001/XMLScherna"> klBaHOB</d2p1:string> <d2p1:dateTimexmlns:d2p1="http://www.w3.org/2001/XMLSchema"> 2010-09-21T12:00:00</d2p1:dateTime> <d2p1:booleanxmlns:d2p1="http://www.w3.org/2001/XMLSchema"> true</d2p1:boolean> <CatalogRef.HoMeHKnaiypa> 503e93a0-d943-11df-b606-001617c01d7d</CatalogRef.HoMeHKnaiypa> <Са(а1одРеТ.Номенклатура>Стиральная машина</Са(а1одРеТ.Номенклатура> </Корневой> Обратите внимание на следующий факт. Пространство имен типов должно быть записано для каждого элемента с данными. Однако в пятом и шестом элементах (для ссылки справочника номенклатуры) оно не определено. Так и должно быть, ведь для типов данных, производных от объектов конфигурации, пространство имен не определяется. Кроме этого, обратите внимание на различие результата записи ссылки. В первом случае используется метод ХМЬСтрока(), записывается значение уникального идентификатора ссылки. Во втором записывается представ- ление ссылки (чаще всего это наименование). Для чтения выгруженного XML-документа (см. листинг 18.47) может использоваться следующий программный код (листинг 18.48). Листинг 18.48. Пример чтения XML-документа &НаКпиенте Процедура ЧтениеПростыхТиповДанных(Команда) АдресВременногоХранилища = ПоместитьФайл(АдресВраменногоХранилища, КаталогВременныхФайлов() + "my_xml.xmr, Ложь, УникальныйИдентификатор); ЧтениеПростыхДанныхХМЦАдресВременногоХранилища); КонецПроцедуры В процедуре чтения XML-документа сначала документ помещается во временное хранилище. Адрес данных в хранилище передается в серверную процедуру ЧтениеПростыхДанныхХМЬ(), листинг 18.49, в которой документ получается из временного хранилища, записывается во временный файл, и производится чтение документа.
Листинг 18.49. Процедура «ЧтениеПростыхДанныхХМЦ)» &НаСервереБазКонтекста Процедура ЧтениеПростыхДанныхХМЦАдресДокументаВХранилище) Сообщение = Новый СообщениеПопьзователю(); ДанныеДокумента = ПолучитъИзВременногоХранилища(АдресДокументаВХранилище); ИмяФайлаХМЬ = Катало1ВременныхФайлов() + "temp.xml"; ДанныеДокумента.За писатъ(ИмяФайлаХМ1_); Файл = Новый ЧтениеХМЬ; Файл.ОткрытьФайл(ИмяФайлаХМ1_); II Спозиционироваться на начале элемента "Корневой". Файл.Прочитать(); II Начало элемента "decimal". Файл.Прочитать(); II Из имени элемента (совпадающего с именем типа) и URI пространства имен получить тип ”1С:Предприятия”. ТипЗначения = ИзХМ!_Типа(Файл.ЛокальноеИмя, Файл.11Р1ПространстваИмен); II Спозиционироваться на тексте. Файл.Прочитать(); II Прочитать значение, не указав тип, нельзя. ПопученноеЗначение = ХМ1_Значение(ТипЗначения, Файл.Значение); Сообщение.Текст = Строка(ПолученноеЗначение); Сообщение.Сообщить(); II Конец элемента "decimal". Файл.Прочитать(); II Начало элемента "string". Файл.Прочитать(); ТипЗначения = ИзХМ1_Типа(Файл.ЛокальноеИмя, Файл.иЛ1ПросгранстваИмен); Файл.Прочитать(); ПопученноеЗначение = ХМ1_Значение(ТипЗначения, Файл.Значение); Сообщение.Текст = Строка(ПолученноеЗначение); Сообщение.Сообщить(); II Конец элемента "string". Файл.Прочитать(); II Начало элемента "dateTime". Файл.Прочитать(); ТипЗначения = ИзХМ1Типа(Файл.ЛокальноеИмя, Файл.11Р1ПространстваИмен); Файл.Прочитать(); ПопученноеЗначение = ХМ13начение(ТипЗначения, Файл.Значение); Сообщение.Текст = Строка(ПолученноеЗначение); Сообщение.Сообщить(); II Конец элемента "dateTime". Файл.Прочитать(); II Начало элемента "boolean". Файл.Прочитать(); ТипЗначения = ИзХМ1Типа(Файл.ЛокальноеИмя, Файл.11Р1ПространстваИмен); Файл.Прочитать(); ПопученноеЗначение = ХМ13начение(ТипЗначения, Файл.Значение); Сообщение.Текст = Строка(ПолученноеЗначение); Сообщение.Сообщить(); Профессиональная разработка в системе «1С:Предприятие 8»
II Конец элемента "boolean". Файл.Прочитать(); II Начало элемента "CatalogRef.HoMeHKnaTypa”. Файл.Прочитать(); II Из имени элемента (совпадающего с именем типа) и URI пространства имен получить тип "1С:Предприятия". ТипЗначения = ИзХМЬТипа(Файл.ЛокальноеИмя, Файл.иН1ПространстваИмен); Файл.Прочитать(); II Прочитать значение, не указав тип, нельзя. ПолученноеЗначение = ХМ1_Значение(ТипЗначения, Файл.Значение); Сообщение.Тексг = Строка(ПопученноеЗначение); Сообщение.Сообщил>(); II Конец элемента "CatalogRef.HoMeHKnaTypa”. Файл.Прочитать(); II Начало элемента "CatalogRef.HoMeHKnaTypa". Файл.Прочитатъ(); //ТипЗначения = ИзХМ1Типа(Файл.ЛокальноеИмя, Файл.иЛ1ПространстваИмен); Файл.Прочитатъ(); ПолученноеЗначение = ХМ1_Значение(Тип("Строка”), Файл.Значение); Сообщение.Тексг = Строка(ПопученноеЗначение); Сообщение.Сообщить(); II Конец элемента "CatalogRef.HoMeHKnaTypa”. Файл.Прочитать(); Файл.3акрыть(); КонецПроцедуры Сложные типы Перейдем к рассмотрению сложных (с точки зрения сериализации) типов. Тип Типу Тип соответствует тип данных XML Туре из пространства имен http://v8.1c.ru/data. Элемент XML, представляющий значение данного типа, содержит текст. В нем записано имя типа XML, соответствующего типу данных «1 С:Предприятия». Примеры представления в XML значений типа Тип приведены ниже (листинг 18.50). Листинг 18.50. Варианты представления значений типа «Тип» < !- Не задано явно имя корневого элемента -> <v8:Type>v8:ValueStorage</v8:Type> < !-- Явно задано имя корневого элемента XML <Tp>xsd:string</Tp> < !- Явно указан тип данных XML ~> <Dataxsi:type="v8:Type">v8:ValueStorage<Data> Том 2
№ормат£|[файлов1обмена1 На первый взгляд тип Тип относится не к сложным, а к простым типам данных, так как элемент, представляющий значение данного типа, не содержит вложенных элементов. Однако это не так. Вложенных элементов действительно нет. Но при этом текст элемента, содер- жащий имя типа данных XML, содержит префикс пространства имен типа, который должен быть определен в данном элементе или одном из родительских элементов, что делает текст элемента не вполне само- достаточным. Поэтому данный тип не отнесен к простым типам. Описаниетипов Типу ОписаниеТипов соответствует тип данных XML TypeDescription из пространства имен http://v8.1c.ru/data. Корневой элемент, представля- ющий значение типа Описаниетипов, содержит ряд вложенных элементов, каждый из которых содержит некоторую составляющую часть описания типов. Назначение составляющих частей понятно из примера (листинг 18.51). Листинг 18.51. Пример представления знечений типе «ОписаниеТипов» <v8:TypeDescription> <v8:Types> <v8:Type>v8:UUID</v8:Typa> <v8:Type>CatalogRef.BaHKu</v8:Type> <v8:Type>xsd:boolean</v8:Type> <v8:Type>xsd:decimal</v8:Type> </v8:Types> <v8:NumberQualifiers> <v8:Digits>10</v8:Digits> <v8:FractionDigits>2</v8:FractionDigits> <v8:AllowedSign>Any</v8:AllowedSign> </v8:NumberQualifiers> <v8:StringQualifiers> <v8:Length>30</v8:Length> <v8 Allowed Length>Variable</v8:AllowedLength> </v8:StringQualifiers> <v8:DateQualifiers> <v8:DateFractions>Date</v8:DateFractions> </v8:DateQualifiers> </v8:Type Description» Вложенный элемент Types из пространства имен http://v8.1c.ru/data содержит представления отдельных типов, входящих в описание типов. Элемент с именем NumberQualifiers из пространства имен http://v8.1c.ru/data содержит квалификаторы числового значения. А элементы с именами StringQuallfiers и DateQualifiers из того же пространства имен содержат квалификаторы строки и даты соответственно.
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами КонстантаМенеджерЗначения.<имя> Каждому из типов КонстантаМенеджерЗначения.<имя> соответствует тип данных XML ConstantValueManager.<HMB>, не относящийся ни к какому пространству имен. Пример приведен ниже (листинг 18.52). Листинг 18.52. Пример представления значения типа «КонстантаМенеджерЗначения.НазваниеОрганизаЦии» <Соп8(ап1Уа1иеМападег.НазваниеОрганизации> <Value>OOO "Мебиус"<Л/а1ие> </Сопз1ап1Уа1иеМападег.НазваниеОрганизации> Объект Объекты базы данных представляются в XML как совокупность значений реквизитов и табличных частей. Имя типа данных XML, соответству- ющего объекту базы данных, определяется как англоязычное имя типа значения «1 С:Предприятия». Типы данных XML для объектов базы данных не относятся ни к какому пространству имен. Состав элементов XML, вложенных в корневой элемент, определяется типом объекта, а также составом реквизитов и табличных частей. Каждый из реквизитов представляется элементом XML, имя которого соответствует имени реквизита. Если тип значения имеет составной тип, то элемент XML, представляющий реквизит, содержит атрибут xsktype, в котором указан тип значения XML. Каждая из табличных частей представляется элементом XML, имя кото- рого совпадает с именем табличной части. Каждая из строк табличной части представляется элементом XML с именем Row. Реквизиты табличной части представлены элементами XML, вложенными в элемент Row. Ниже приведен пример представления в XML объекта типа Доку- мент.ЗаказПокупателя (листинг 18.53). Листинг 18.53. Пример представления значения типа «Документ.ЗаказПокупателя» <ОоситепЮЬ)ес13аказПокупателя> <Ref>8d106783-9726-11d7-9334-0050ba8480bd</Ref> <DeletionMark>false</DeletionMark> < Date>2010-04-15Т12:00:00</Date> <Number>00000006</Number> <Posted>true</Posted> <nQflpa3fleneHneKoMnaHnn>317f130d-5a08-11d7-9324-0050ba8480bd</nQflpa3fleneHneKoMnaHHH> <СтруюурнаяЕдиницах81:1уре-'Са(а1одРе1.КассыКомпании"> 317П214-5а08-1^7-9324-0050Ьа8480Ь0</СтруктурнаяЕдиница> <KoHTpareHT>12952ac7-5a08-11d7-9324-0050ba8480bd</KoHrpareHT> <ЮрФизЛицоКонтрагентах81:1уре="Са(а1одРе1.ЮридическиеЛица"> Oaadfe81-5aO8-11d7-9324-OO5Oba848Obd</IOp0H3JlHi4oKoHTpareHTa> 43®
«ВалютаДокумента>029156b4-5a08-11 и7-9324-0050Ьа8480Ь<1</ВалютаДокумента> «КурсДокумента»! «/КурсДокумента» <УчитыватьНДС»1ше«/УчитыватьНДС» «УчитыватъНП»!а18е«/УчитыватьНП> «СуммаВключаетНДС»1а18е«/СуммаВключаетНДС» «СуммаВключаетНП»!а18е«/СуммаВключаетНП> «Комментарий/» «СуммаДокумента»44077.14«/СуммеДокумента> «ВидОперации»СчетНаОплату«/Вид Операции» «Договор Взаиморасметов>Ь0401!23-6е84-11б7-932с-0050Ьа8480Ьб«/Договор Взаиморасчетов» «СкледКомпании>317f 1317-5а08-11 б7-9324-0050Ьа8480Ьб«/СкладКомлании> <ТипЦен>31711311-5а08-11б7-9324-0050Ьа8480Ьб«/ТипЦен> «ДатаОплаты»2010-04-15Т00:00:00«/ДатаОплаты> «АвтоРезервирование»!а18е«/АвтоРезервирование> «АвтоРазмещение»1а18е«/АвтоРазмещение» «КурсВзаиморасчетов»33.4209«/КурсВзаиморасчетов> «ТипСкидкиНаценки>00000000-0000-0000-0000-000000000000«/ТипСкидкиНаценки> «Организация>317И308-5а08-11б7-9324-0050Ьа8480Ьб«/Организация> «ДатаОтгрузки»2010-04-15Т00:00:00«/ДатаОтгрузки> «Ответственный»4#40е0Ь-5ас5-11б7-9325-0050Ьа8480Ьб«/Ответственный> «КратностьДокумента» 1 «/КратностьДокумента» <КратностьВзаиморасчетов>1«/КратностьВзаиморасчетов> «Товары» «Row» «Номенклатура»297с6534-5а08-11 б7-9324-0050Ьа8480Ьб«/Номенклатура> «ЕдиницаИзмерания»297с6535-5а08-11б7-9324-0050Ьа8480Ьб«/Единица Измерения» «Цена»4537.56«/Цена> «Сумма>13612.68«/Сумма> «Ставка НДС»НДС20«/Ставка НДС» «СуммаНДС»2722.54«/СуммаНДС> «СтавкаНП»1ас73736-5а08-11б7-9324-0050Ьа8480Ьб«/СтавкаНП> «СуммаНП»О«/СуммаНП> «ХаракгеристикаНоменклатуры»00000000-0000-0000-0000-000000000000 «/Характеристика Номенклатуры» «Размещение xsi:nil="tnje7> «Коэффициент»! «/Коэффициент» «Количество»3«/Копичество> «ПроцентСкидкиНаценки>0«/ПроцентСкидкиНаценки» «/Row» «Row» <Номенклатура>317f 12d8-5a08-11 б7-9324-0050Ьа8480Ьб«/Номенклатура> «ЕдиницаИзмерания»317Н2с19-5а08-11с17-9324-0050Ьа8480Ьс1«/Единица Измерения» «Цена»4915.55«/Цена> «Сумма»19662.2«/Сумма> «Ставка НДС»НДС20«/Ставка НДС» «СуммаНДС»3932.44«/СуммаНДС> «СтавкаНП»1ас73736-5а08-11б7-9324-0050Ьа8480Ьб«/СтавкаНП> «СуммаНП»О«/СуммаНП> <ХаракгеристикаНоменклатуры»00000000-0000-0000-0000-000000000000 «/Характеристика Номенклатуры» «Размещение xsi:nil="true"/> «Коэффициент»! «/Коэффициент» «Количество»4«/Копичество> <ПроцентСкидкиНаценки»0</ПроцентСкидкиНаценки» «/Row» «/Товары» «ВозвратнаяТара/» </Роситеп1ОЬ]ес1.3аказПокупателя» Профессиональная разработка в системе «1С:Предприятие 8»
ПРИМЕЧАНИЕ В используемом примере, а также в других примерах данной главы присутствуют длинные строки (например, «<ЕдиницаИзме- рения>317 fl 2d9-5a08-11 <17-9324-0050Ьа8480Ь<1</ЕдиницаИзме- рения>»). Такие строки приводятся с переносом на следующую строку текста. Реально такие строки записываются в модуле в одну строку. Набор записей Представление в XML набора записей включает отбор, по которому получен набор записей и сами записи, входящие в отбор. Значения отбора представлены во вложенном элементе XML с именем Filter, не относя- щемся ни к какому пространству имен. А все записи, составляющие набор записей, - во вложенном элементе с именем Records, также не относя- щемся ни к какому пространству имен. Записи представлены элементами XML с именем Record, вложенными в элемент Records. Имя элемента Record также не относится ни к какому пространству имен. Ниже приведен пример представления в XML набора записей регистра накопления ОстаткиТоваровКомпании (листинг 18.54). Листинг 18.54. Пример представления значения типа «РегистрНакопленияНеборЗеписей.ОстаткиТоваровКомпании» «Accumulation Еед1в1егЕесогбЗе1.ОстаткиТоваровКомпании> <Filter> «Recorder хя:1уре="Ооситеп1Ре1РеализацияТоваров"> 1725f36e-6f35-11d7-932d-0050ba8480bd«/Recorder> </Filter> <Records> «Record> «Recorder xsi:type="DocumentRef.PeanM3ai4HHToBapoB"> 1725f36e-6f35-11d7-932d-0050ba8480bd«/Recorder> «Period>2010-04-13T17:45:39«/Period> «MovementType>Expense«/MovemenfType> «Active>true«/Active> <Номенкпатура>297с6556-5а08-1107-9324-0050Ьа8480Ь0«/Номенкпатура> «СкладКомпании>317П317-5а08-1187-9324-0050Ьа84801х1</СкладКомпании> «Заказ xsi:nil="true"/> «ЦенаВРознице>0«/ЦенаВРознице> «Характеристика Номенкпатуры>00000000-0000-0000-0000-000000000000 </ХарактеристикаНоменкпатуры> «Копичество>2«/Количество> <ПодразделениеКомпании>317f 130d-5a08-11 d7-9324-0050ba8480bd </ПодраздепениеКомпании> «/Record> «Record> «Recorder xsi:type="DocumentRef.PeanM3ai4HHToBapoB"> 1725f36e-6f35-11d7-932d-0050ba8480bd«/Recorder> «Period>2010-04-13T17:45:39«/Period> «MovementType>Expense«/MovementType> «Active>true«/Active> <Номенкпатура>297с6558-5а08-1187-9324-0050Ьа8480Ь0«/Номенкпатура> Том 2
№ормат£|[файлов1обмена1 <СкпадКомпании>317И317-5а08-11б7-9324-0050Ьа8480Ьс1</СкпадКомпании> «Заказ xsi:nil="true7> «ЦенаВРознице*0«/ЦенаВРознице> <ХарактеристикаНоменкпатуры>ас47б77е-5ес7-11б7-9329-0050Ьа8480Ьс1 «/Характеристика Номенклатуры* «Количество>2«/Копичество> «Подразделен иеКомпании>317Н30с1-5а08-11б7-9324-0050Ьа848Obd «/Подразд елениеКомпании* «/Record* «/Records* «/AccumulationRegisterRecordSet.OcTaTKnToBapoBKoMnaHHH* УдалениеОбъекта Типу УдалениеОбъекта соответствует тип данных XML ObjectDeletion, из пространства имен http://v8.1c.ru/data. Корневой элемент XML-представ- ления значения типа УдалениеОбъекта содержит один вложенный элемент с именем Ref из пространства имен http://v8.1c.ru/data, в котором находится представление ссылки на объект базы данных. Ниже приведен пример представления в XML объекта типа Удале- ниеОбъекта (листинг 18.55). Листинг 18.55. Пример представления знечения типа «УдалениеОбъекта» «v8:ObjectDeletionxmlns="http://v8.1c.Rj/data"> «v8:Ref xsi:type="CatalogRef.BaHKM"*60c5cec3-7f6f-4ec3-9620-a757fe3614ca«/v8:Ref* «/v8:ObjectDeletion> Работа co сложными типами Для работы со сложными с точки зрения сериализации значениями могут использоваться следующие методы «1С:Предприятия» (они же могут использоваться и для простых типов): ЗаписатьХМЦ), ПрочитатьХМЦ). Метод ЗаписатьХМЦ) имеет два обязательных параметра. Первый пара- метр - это объект типа ЗаписьХМЦ через который осуществляется запись XML, а второй - значение, которое должно быть записано в XML. Необя- зательные параметры образуют три различных варианта вызова метода. В простейшем случае параметра три, и в качестве третьего параметра указывается значение перечисления НазначениеТипаХМЦ определяющее необходимость явного указания типа данных XML в атрибуте xsi:type корневого элемента XML. У следующего варианта вызова в качестве третьего параметра исполь- зуется строковое значение, указывается имя корневого элемента XML. При этом подразумевается, что пространство имен не определено. Четвертый параметр - значение типа НазначениеТипаХМЦ определяющее необходимость явного указания типа данных XML.
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами И, наконец, у последнего варианта вызова после параметра, указывающего имя корневого элемента XML, появляется еще один параметр - стро- ковое значение, обозначающее пространство имен, к которому относится корневой элемент. Последний параметр по-прежнему имеет тип Назначе- ниеТипаХМЬ. Рассмотрим пример использования объекта ЗаписатьХМЬ (листинг 18.56). Листинг 18.56. Пример использования объекта «ЗаписьХМЬ» Знач = "Строка такая”; ЗаписатьХМЦЗп, Знач); ЗаписатьХМЦЗп, Знач, "Root", НазначениеТипаХМЬЯвное); ЗаписатьХМЦЗп, Знач, "Root", "um:some-namespace"); В результате выполнения приведенного кода будет получен следующий XML-фрагмент (листинг 18.57). Листинг 18.57. Фрагмент XML-документа <string>CrpoKa такая</зЮпд> <Root xsi:type="xsd:string”>CTpoKa Taxan</Root> <d 1 p1 :Root xmlns:d1 p1 ="urn:some-namespace">CTpoKa такаж/dl p1 :Root> Если в качестве значения, помещаемого в XML, будет передано значение типа, который не может быть представлен в XML, то будет вызвано исключение. Метод ПрочитатьХМЬ() предназначен для чтения значений из XML. Данный метод имеет один обязательный параметр - объект ЧтениеХМ!., из которого должно быть прочитано значение. В качестве второго пара- метра может быть указан тип значения, которое должно быть прочитано из XML. Если тип значения явно указан в XML, то в качестве второго параметра может быть указано значение Неопределено, или же он может быть вообще опущен. В этом случае метод ПрочитатьХМЬ() пытается определить тип читаемого значения по содержимому атрибута xsktype, а если атрибут xsi:type отсутствует, то по имени элемента. Если тип уста- новить не удалось или значение указанного типа не может быть прочитано из XML, то вызывается исключение. При удачном завершении метод ПрочитатьХМЬ() возвращает считанное значение. Следует обратить внимание на то, как считываются менеджеры значений констант, объекты базы данных и наборы записей. После успешного выполнения чтения метод ПрочитатьХМЬ() возвращает считанное из XML значение, но это значение еще не записано в базу данных. Если, например, считан элемент справочника, то для того чтобы считанный элемент спра- вочника оказался записанным в базу данных, необходимо обратиться к его методу Записать(), как и при «обычной» записи измененного состояния объекта. Это же относится и к другим объектам базы данных, менеджерам записи констант и наборам записей.
При чтении объекта базы данных из XML в базе данных производится поиск объекта с таким же значением ссылки. Если такой объект найден, то считывание из XML выглядит так, как будто объект был прочитан из базы данных, после чего значения его реквизитов, табличных частей и т.п. перезаписываются полученными из XML значениями. Если же объект по ссылке не найден, то считывание из XML выглядит как создание нового объекта, установка ему значения ссылки и заполнение его содер- жимого значениями, прочитанными из XML. Метод ВозможностьЧтенияХМЦ) определяет, возможно ли считывание значения из объекта ЧтениеХМЦ находящегося в текущей позиции доку- мента XML. Объект ЧтениеХМЬ передается данному методу в качестве параметра. Если метод возвращает Истина, то чтение возможно, если Ложь - значение не может быть считано. Метод ПолучитьХМЬТип() позволяет получить из объекта ЧтениеХМ!- тип данных XML, соответствующий текущей позиции документа XML. Данный метод также имеет один параметр - ЧтениеХМЬ Рассмотрим использование вышеперечисленных методов на примере. В контексте процедуры ЗаписьСложныхТиповДанных() существует пере- менная Документ (тип ДокументСсылка.<имя>). Данный документ имеет следующую структуру: реквизит Контрагент, тип СправочникСсылка.Контрагенты; табличная часть Товары, реквизиты табличной части: □ Номенклатура, тип СправочникСсылка.Номенклатура; □ Количество, тип Число; □ Цена, тип Число; □ Сумма, тип Число. Следует отметить, что метод ЗаписатьХМЦ) сам определяет структуру выгружаемого объекта. В данном случае она приводится для того, чтобы пояснить полученный XML-документ. При записи и чтении сложных типов XML данных так же, как это подробно описано в разделе «Работа с простыми типами» на стр. 432, передача XML-документа между клиентом и сервером происходит через временное хранилище. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обра- ботка РаботаСХМЦ команды формы ЗаписьСложныхТиповДанных, ЧтениеСложныхТиповДанных). Процедура, используемая для выгрузки, имеет следующий код (листинги 18.58, 18.59). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 18.58. Пример зеписи XML-документа &НаКлиенте Процедура ЗаписьСложныхТиповДанных(Команда) АдресДокументаВХранилище = ЗаписьСложныхДанныхХМЦ); ПолучитьФайл(АдресДокументаВХранилище, КаталогВременныхФайлов() + "doc._xml.xmr, Ложь); КонецПроцедуры Листинг 18.59. Функция «ЗеписьСложныхДанныхХМСО» &НаСервереБезКонтекста Функция ЗаписьСложныхДанныхХМЦ) ИмяФайлаХМЬ = КаталогВременныхФайлов() + "temp.xml"; Файл = Новый ЗаписьХМЦ Файл.ОткрытьФайл(ИмяФайлаХМЬ); Файл.ЗаписатьОбъявлениеХМЦ); II Получить ссылку на документ. СсылкаНаДокумент = Документы.РасходнаяНакладная.НайтиПоНомеру("000000001"); ДокументОбъект = СсылкаНеДокумент.ПолучитьОбъект(); ЗаписатьХМЦФайл, ДокументОбъект, НазначениеТипаХМЬ.Явное); Файл.3акрыть(); Возврат ПоместитьВоВраменноеХранилище(Новый ДвоичныеДанные(ИмяФайлаХМЬ)); КонецФункции В результате работы процедуры сформируется XML-документ следую- щего вида (листинг 18.60). Листинг 18.60. Пример сформированного XML-документа <?xml version-'1.0" encoding="UTF-8" ?> - <ОоситепЮЬ]ес1РасходнаяНакладная xmlns:xsi="http://ww.w3.org/2001/XMLSchema-instance" хы:1ура="ОоситепЮЬ)ес1РасходнаяНакладная"> <Ref>41dd4a0d-dc6f-11df-b60a-001617c01d7d</Ref> <DeletionMark>false</DeletionMark> <Date>2010-10-20T21:30:33</Date> <Number>000000001 </Number> <Posted>true</Posted> <KoHTpareHT>41dd4a0c-dc6f-11df-b60a-001617c01d7d</KoHTpareHT> - <Товары> - <Row> <Номенклатура>503е9391-б943-11б1-Ь606-001617с01б7б</Номенклатура> <Количество>2</Количество> <Цена>25000</Цена> <Сумма>50000</Сумма> </Row> - <Row> <Номенклатура>503е93а1-б943-11сИ-Ь606-001617с01б7б</Номенклатура> <Количество>5</Количество> <Цена>20000</Цена> Том 2
№ормат£|[файлов1обмена1 <Сумма>100000</Сумма> </Row> </Товары> </РоситепЮЬ]есГРасходнаяНакладная> Можно сказать, что структура выгруженного документа повторяет струк- туру его метаданных, причем дополнительно включаются такие данные, как: ссылка на документ (Ref); пометка на удаление (DeletionMark); дата (Date); номер (Number); проведен (Posted). Процедура чтения данных представлена в листингах 18.61, 18.62. Листинг 18.61. Процедура чтения XML-документа &НаКлиенте Процедура ЧтениеСпожныхТипоеДанных(Команда) АдресВременногоХранилища = ПомесгитьФайл(АдресВременногоХранилища, КаталогВременныхФайлов() + "doc_xml.xml", Ложь, УникальныйИдентификатор); ЧтениеСложныхДанныхХМЦАдресВременногоХранилища); КонецПроцедуры Листинг 18.62. Процедура «ЧтениеСложныхДанныхХМГО» &НаСервереБазКонтексга Процедура ЧтениеСложныхДанныхХМЦАдресДокументаВХранилище) ДанныеДокумента = ПолучитьИзВременногоХранилища(АдресДокументаВХранилище); ИмяФайлаХМЬ = КаталогВременныхФайлов() + "temp.xml"; ДанныеДокумента. Записать(ИмяФайлаХМЬ); Файл = Новый ЧтениеХМЬ; Файл.ОткрытьФайл(ИмяФайлаХМЬ); II Позиционируемся на начале элемента, содержащего документ. Если Файл.Прочитать() Тогда II Проверка на возможность чтения значения. Если ВозможносгьЧгенияХМ1(Файл) Тогда II Получается значение ДокументОбъект.Имя. II Если значения с таким внутренним идентификатором нет, то создается новый. Объект = ПрочитатьХМЦФайл); Объект.Дата = '2010-12-11'; Объект.3аписать(); КонецЕсли; КонецЕсли; Файл.3акрыть(); КонецПроцедуры
I ГлаваН 84 И нтеграция[сУдругими1информационн£|ми[системами Следует отметить, что если объект, в который производится загрузка, имеет отличную структуру (отличается состав реквизитов, табличных частей, реквизитов табличных частей или порядок их следования) от выгружаемого объекта, то метод ВозможностьЧтенияХМЦ) может возвратить значение Истина. При попытке проведения чтения объекта из XML-документа будет вызвано исключение. Это объясняется тем, что метод ВозможностьЧтенияХМЦ) анализирует текущее состояние объекта ЧтениеХМЬ. В этот момент текущим является начало соответствующего элемента. Если имя элемента, атрибуты «понятны» методу, он возвращает значение Истина. Проверка структуры, других моментов методом Возмож- ностьЧтенияХМЦ) не производится. XDTO-сериализация Механизм XDTO является универсальным способом представления данных для интеграции с другими системами. Аббревиатура XDTO расшифровывается как XML Data Transfer Objects. XDTO является меха- низмом объектного моделирования данных, описываемых с помощью схемы XML. Можно выделить несколько задач, для решения которых используется механизм XDTO: обмен данными между конфигурациями «1 (^Предприятия» с разными структурами данных; обмен данными на основе схем XML, не привязанных к той или иной конфигурации (например, обмен с информационными системами, построенными не на основе системы «1С:Предприятие»); создание собственной системы типов и значений для обработки произ- вольных данных; описание типов параметров и возвращаемых значений Web-сервисов. В данном разделе мы остановимся на вопросе сериализации данных на основе механизма XDTO. Использование механизма для описания типов параметров и возвращаемых значений Web-сервисов будет рассмот- рено в разделе «Использование XDTO для описания типов параметров и возвращаемых значений Web-сервисов» на стр. 474. В настоящее время обмен с различными программными системами реализуется с использованием XML. Механизм XDTO позволяет созда- вать требуемые для обмена схемы XML и формировать XML-документы, удовлетворяющие этим схемам. Основным понятием, на котором строится механизм XDTO, явля- ется фабрика XDTO. Фабрика XDTO содержит описание всех типов, с которыми оперирует система. В частности, при создании новой инфор- мационной базы «1С:Предприятия» автоматически создается глобальная фабрика XDTO, которая описывает все типы, используемые в конфи- гурации. Эта фабрика доступна через свойство глобального контекста ФабрикаХОТО.
В общем случае фабрика XDTO создается на основании описаний всех типов, которые зарегистрированы в фабрике. Для создания фабрики XDTO средствами встроенного языка используется конструктор объекта ФабрикаХОТО, которому передается набор схем XML, содержащийся в объекте НаборСхемХМЬ. В системе «1С:Предприятие» реализована сериализация данных на основе механизма XDTO, которая позволяет сериализовать в/из XML: все типы данных, хранящиеся в базе данных; некоторые другие типы. XDTO-сериализация предназначена для сохранения данных объекта в файл XML и создания объекта на основе данных, хранящихся в файле XML. Для этого используется объект СериализаторХОТО, который может быть получен с помощью конструктора на основе существующей фабрики XDTO. Например, сериализация ссылки на элемент справочника Номенклатура в файл XML может быть выполнена с помощью следующего програм- много кода (листинг 18.63). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- таСХМЦ команды формы СериализацияВХМ1_, СериализацияИзХМГ). Листинг 18.63. Сериализация ссылки на элемент справочника «Номенклатура» в файл XML &НаКлиенте Процедура СериализацияВХМЦКоманда) II Создать сериализатор XDTO для глобальной фабрики XDTO. НовыйСериализаторХОТО = Новый СериализаторХОТО(ФабрикаХОТО); II Создать объект записи XML и открыть файл. НоваяЗаписьХМЬ = Новый ЗаписьХМЦ); НоваяЗаписьХМ1.ОткрытьФайл(”с:\ехсбапде.хтГ); II Получить ссылку на элемент справочника "Номенклатура". СсылкаНаЭлементСправочника = ПолучитьСсылкуНаЭлементСправочника(); II Сериализовать ссылку в XML. НовыйСериализаторХОТО.ЗаписатьХМЦНоваяЗаписьХМЬ, СсылкаНаЭлементСправочника, НазначениеТипаХМЬЯвное); КонецПроцедуры В процедуре СериализацияВХМЦ) используется серверная функция Полу- читьСсылкуНаЭлементСправочника(), которая возвращает на клиента ссылку на номенклатуру (листинг 18.64). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 18.64. Функция «ПолучитьСсылкуНаЭлементСправочникеО» &НаСервереБезКонтекста Функция ПолучитьСсылкуНаЭлементСправочника() Возврат Слравочники.Номенклатура.НайтиПоКоду("000000003"); КонецФункции Сериализация ссылки на элемент справочника Номенклатура из файла XML может быть выполнена с помощью следующего программного кода (листинг 18.65). Листинг 18.65. Сериализация ссылки на элемент справочника «Номенклатура» из файле XML &НаКлиенте Процедура СериализацияИзХМЦКоманда) II Создать сериализатор XDTO для глобальной фабрики XDTO. НовыйСериализаторХОТО = Новый СериализаторХОТО(ФабрикаХОТО); II Прочитать данные объекта XDTO из файла XML. НовоеЧтениеХМЬ = Новый ЧтениеХМЦ); НовоеЧтениеХМЬ.ОткрытьФайл ("c:\exchange.xml"); II Сериализовать ссылку из XML. СсылкаНаЭлементСправочника = НовыйСериализаторХОТО.ПрочитатьХМ1_(НовоеЧтениеХМ1_); ЗалисатьНоменклатуру(СсылкаНаЭлементСлравочника); КонецПроцедуры В процедуре СериализацияИзХМЦ) используется серверная проце- дура ЗаписатьНоменклатуруО, в которую передается сериализованное значение ссылки на номенклатуру. В процедуре по этой ссылке получа- ется XML-значение, из него получается объект - элемент справочника. И затем этот элемент редактируется и записывается (листинг 18.66). Листинг 18.66. Процедура «ЗаписатьНоменклатуруО» &НаСервереБезКонтекста Процедура ЗаписатьНоменклатуру(СсылкаНаЭлементСправочника) СсылкаНаЭлементСправочника = ХМ1_Значение(Тил("СправочникСсылка.Номенклатура"), СсылкаНаЭлементСправочника); ЭлементСправочника = СсылкаНаЭлементСправочника. ПолучитъОбъект(); ЭлементСправочника.ПолноеНаименование = ЭлементСправочника.Наименование + " - сериализован из XML" + Строка(ТекущаяДата()); ЭлементСправочника.Записатъ(); КонецПроцедуры Том 2
№ормат£|[файлов1обмена1 Пример реализации обмена при разной структуре объектов конфигурации Даже при организации обмена данными между информационными базами «1 С:Предприятия» довольно редкой является ситуация, когда структура объектов конфигурации (даже в рамках обмениваемых данных) полностью совпадает. Что делать, когда структура объектов различается? Один из вариантов решения задачи приводится ниже (данный подход не обязательно должен использоваться только при организации обмена между базами «1С:Предприятия 8»), Считаем что конфигурации, между которыми производится обмен, отлича- ются только структурой справочника Номенклатура. Структура остальных объектов совпадает. В базе данных - источнике в справочнике Номенклатура присутствует реквизит Артикул (тип СправочникСсылка.Артикулы), в базе-приемнике существует реквизит Куратор (тип СправочникСсылка.ФизическиеЛица). Все остальные реквизиты совпадают, их состав: Код, тип Число; Наименование, тип Строка; ПолноеНаименование, тип Строка; ЗакупочнаяЦена, тип Число; Картинка, тип ХранилищеЗначения. В этом примере так же, как это подробно описано в разделе «Работа с простыми типами» на стр. 432, передача XML-документа между клиентом и сервером происходит через временное хранилище. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- таСХМЬ, команды формы ВыгрузкаДанныхХМЦ ЗагрузкаДанныхХМЦ. Выгрузка данных выполняется с помощью трех процедур: Выгруз- каДанных(), листинги 18.67, 18.68, ЗаписатьДанные(), листинг 18.69, и НоменклатураЗаписатьХМЦ), листинг 18.70. Листинг 18.67. Процедура «ВыгрузкаДанных()» &НаКлиенте Процедура ВыгрузкаДанныхХМЦКоманда) АдресДокументаВХранилище = ЗаписьДанныхХМЦ); ПопучитьФайл(АдрасДокументаВХранилище, КаталогВременныхФайлов() + "out.xml", Ложь); КонецПроцедуры
I ГлаваН 84 И нтёграция[сУдругими1информациЬннй1ми[систёмами Листинг 18.68. Функция «ЗеписьДенныхХМЦ)» &НаСервере Функция ЗаписьДанныхХМЦ) ИмяФайлаХМЬ = КаталогВременныхФайлов() + "temp.xml"; ЗаписьХМЬ = Новый ЗаписьХМЦ ЗаписьХМЬОткрытьФайл(ИмяФайлаХМ1); ЗаписьХМЬЗаписатьОбъявлениеХМЦ); ЗаписьХМ1.3аписатьНачалоЭлемента("Корневой"); //Для сокращения размера файла сообщения записываем соответствие II пространств имен. ЗаписьХМ1.3аписатьСоответствиеПространстваИмен("хвс1", “http://www.w3.org/2001/XMLSchema");' ЗаписьХМ1.3аписатьСоответствиеПространстваИмен("хв|", ''http://www.w3.org/2001/XMLSchema-instance''); ЗаписьХМЬ.ЗаписатьСоответствиеПространстваИмен('У8", "http://v8.1c.ru/data''); II Получаем выборку данных из табличной части. Для Каждого Элемент Из Объект.ВыгружаемыеДанные Цикл Данные = Элемент.СсылкаНаОбъект.ПолучитьОбъект(); II Записываем данные. ЗаписатьДанные(ЗаписьХМЬ, Данные); КонецЦикла; ЗаписьХМЬ.ЗаписатьКонецЭлементаО; ЗаписьХМкЗакрытьО; Возврат ПоместитьВоВременноеХранипище(Новый ДвоичныеДанные(ИмяФайлаХМЬ)); КонецФункции Листинг 18.69. Процедура «ЗаписатьДенныеЦ» &НаСервере Процедура ЗаписатьДанные(ЗаписьХМ1, Данные) Если ТипЗнч(Данные) = Тип("СправочникОбъект.Номенклатура") Тогда II Записываем элемент справочника вручную. НоменклатураЗаписатьХМ1(ЗаписьХМ1, Данные); Иначе II Записываем данные с помощью стандартного метода. ЗаписатьХМЦЗаписьХМЬ, Данные); КонецЕсли КонецПроцедуры Листинг 18.70. Процедуре «НоменклатураЗеписатьХМкО» &НаСервере Процедура НоменклатураЗаписатьХМ1(ЗаписьХМ1, Номенклатура) II Записываем начало элемента XML. ЗаписьХМЬЗаписатъНачалоЭлемента("Са(а1одОЬ)ес(.Номенкпатура.Вручную"); II Ссылка. ЗаписатьХМЦЗаписьХМЬ,
Номенклатура.Ссылка, "Ref, НазначениеТипаХМЬЯвное); //ЭтоГруппа. ЗаписатьХМЦЗаписьХМЬ, Номенклатура.ЭтоГруппа, "IsFolder", НазначениеТипаХМЬЯвное); II Родитель. ЗаписатьХМЦЗаписьХМЬ, Номенкпатура.Родитель, "Parent”, НазначениеТипаХМЬЯвное); //Код. ЗаписатьХМЦЗаписьХМЬ, Номенклатура.Код, "Code", НазначениеТипаХМЬЯвное); II Наименование. ЗаписатьХМЦЗаписьХМЬ, Номенкпатура.Наименование, "Description", НазначениеТипаХМЬЯвное); II Реквизиты, выгружаемые только для элемента справочника, // а не для группы. Если Не Номенклатура.ЭтоГруппа Тогда II ЗакупочнаяЦена. ЗаписатьХМЦЗаписьХМЬ, Номенкпатура.ЗакупочнаяЦена, "ЗакупочнаяЦена", НазначениеТипаХМЬЯвное); II ЕдиницаИзмерения. ЗаписатьХМЦЗаписьХМЬ Номенклатура. ЕдиницаИзмерания, "ЕдиницаИзмерения", НазначениеТипаХМЬЯвное); II Картинка. ЗаписатьХМЦЗаписьХМЬ Номенкпатура.Картинка, "Картинка", НазначениеТипаХМЬЯвное); II ПолноеНаименование. ЗаписатьХМЦЗаписьХМЬ, Номенклатура.ПолноеНаименование, "ПолноеНаименование", НазначениеТипаХМЬЯвное); КонецЕсли; II Записываем конец элемента. ЗаписьХМЬЗаписатьКонецЭлемента(); КонецПроцедуры Порядок взаимодействия данных процедур можно проиллюстрировать следующей схемой (рис. 18.9). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 18.9. Взаимодействие процедур при записи данных В процедуре ВыгрузкаДанных(), см. листинг 18.68, производится перебор выгружаемых данных. Данные для выгрузки определяются в табличной части ВыгружаемыеДанные. У табличной части один реквизит табличной части СсылкаНаОбъект (набор типов Любая ссылка). В процедуре ЗаписатьДанные(), см. листинг 18.69, проверяется: если записываемый объект является элементом справочника Номенклатура, то вызывается специализированная процедура для его записи Номен- клатураЗаписатьХМЦ), см. листинг 18.70, в противном случае запись производится с помощью метода системы ЗаписатьХМЦ). В процедуре НоменклатураЗаписатьХМЦ) производится «ручное» формирование элемента Са1а1одОЬ)есЬ.Номенклатура.Вручную (начиная с записи начала элемента и заканчивая записью конца элемента). При выгрузке двух элементов, первый из которых представляет собой элемент справочника Контрагенты, а второй - элемент справочника Номенклатура, полученный XML-документ будет иметь следующий вид (листинг 18.71). Листинг 18.71. Пример сформированного XML-документа <?xml version-'1.0" encoding-'UTF-8" ?> - «Корневой xmlns:v8="http://v8.1c.ru/data” xmlns:xsd="http://www.w3.org/2001/XMLSchema'' xmlns:xsi-'http://www.w3.org/2001/XMLSchema-instance"> -<Са1а1одОЬ]’ес1Номенклатура.Вручную> «Ref xmlns=ml xsitype-'CatalogRef.HoMeHKnaiypa"> 503e939f-d943-11df-b606-001617c01d7d«/Ref> «lsFolderxsi:type-'xsd:boolean">false</lsFolder> «Parent xmlns="" xsitype-'CatalogRef.HoMeHKnaTypa''* 503e939e-d943-11 df-b606-001617c01 d7d«/Parent> «Codexsi:type="xsd:string">000000002«/Code> «Description xsitype="xsd:string">XanqflnnbHHK«/Description> «ЗакупочнаяЦена xsitype-'х5Ь:Ьес1таГ>25000</ЗакупочнаяЦена> Tom 2
№ормат£|[файлов1обмена1 «ЕдиницаИзмерения xsi:type=,'xsd:string">un’</EflHHH4aM3MepeHHA> «Картинка xsi:type="v8:ValueStorage"> AQEIAAAAAAAAAO+7v3siVSJ9«/KapTHHKa> «ПолноеНаименование xsi:type="xsd:string"> Холодильник Samsung 525\М«/ПолноеНаименование> </Са(а1одОЬ)ес1.Номенкпатура.Вручную> - <CatalogObject.KoHTpareHTbi> «Ref>41 dd4a0a-dc6f-11df-b60a-001617c01d7d«/Ref> «DeletionMark>false«/DeletionMark> <Code>000000001«/Code> «Description>OOO CaiypH«/Description> «/CatalogObject.KoHipareHibi> «/Корневой» Загрузка данных из XML-документа может быть осуществлена с помощью следующих процедур и функций: ЗагрузкаДанных(), листинги 18.72, 18.73, ВозможностьЧтенияДанных(), листинг 18.74, ПрочитатьДанные(), листинг 18.75, и НоменклатураПрочитатьХМЦ), листинг 18.76. Листинг 18.72. Процедура «ЗагрузкаДанныхЦ» &НаКлиенте Процедура ЗагрузкаДанныхХМЦКоманда) АдресВременногоХранилища = ПоместитьФайл(АдресВременногоХранилища, КаталогВременныхФайлов() + "out.xml", Ложь, УникальныйИдентификатор); ЧтениеДанныхХМЦАдресВременногоХранилища); КонецПроцедуры Листинг 18.73. Процедура «ЧтениеДанныхХМЦ)» &НаСервереБезКонтекста Процедура Чтен иеДанныхХМ L( АдресДокументаВХранилище) ДанныеДокумента = ПолучитьИзВременногоХранилища(АдресДокументаВХранилище); ИмяФайлаХМЬ = КатапогВременныхФайпов() + "temp.xml"; ДанныеДокумента.Залисать(ИмяФайпаХМ1_); II Создаем объект чтения XML. ЧтениеХМЬ = Новый ЧтениеХМЬ; ЧтениеХМ1_.ОткрытьФайл(ИмяФайлаХМ1_); II Позиционируемся на корневом элементе. ЧтениеХМ1.Прочитать(); II Позиционируемся на первом элементе, содержащем данные. ЧтениеХМ1.Прочитать(); II Читаем данные, пока это возможно. Пока ВозможностьЧтенияДанных(ЧтениеХМЬ) Цикл II Читаем очередное значение. Данные = ПрочитатьДанные(ЧтениеХМЬ); II Записываем полученные данные. Данные.3аписать(); КонецЦикла; ЧтениеХМкЗакрыть(); КонецПроцедуры
I ГлаваН 84 И нтеграция[сУдругими1информационн£|ми[системами Листинг 18.74. Функция «ВозможностьЧтенияДанных()» &НаСервереБезКонтекста Функция ВозможностьЧтенияДанных(ЧтениеХМЬ) II Получаем тип данных XML, который может быть считан в данный момент. TnnXML = ПолучитъХМЕТип(ЧтениеХМЕ); Если TnnXML = Неопраделено Тогда Возврат Ложь; КонецЕсли; Если ТилХМЬИмяТипа = "Са(а1одОЬ]ес1Номенклатура.Вручную" И TnnXML.URinpocrpaHCTBaMMeH = Тогда Возврат Истина; КонецЕсли; Возврат ВозможностьЧтенияХМЦЧтениеХМЕ); КонецФункции Листинг 18.75. Функция «ПрочитатьДанныеО» &НаСервереБезКонтекста Функция ПрочитатьДанные(ЧтениеХМЕ) TnnXML = ПолучитьХМЬТип(ЧтениеХМЕ); Если TnnXML = Неопраделено Тогда Возврат Неопределено; КонецЕсли; Если ТилХМЬИмяТипа = "Са(а1одОЬ]ес1Номенклатура.Вручную" И ТипХМЫ1Л1ПространстваИмен = "" Тогда II Пытаемся прочесть значение справочника "Номенклатура". Возврат НоменкпатураПрочитатьХМЦЧтениеХМЕ); КонецЕсли; II Пытаемся прочесть значение из объекта "ЧтениеХМЬ' стандартным образом. Возврат ПрочитатьХМЦЧтениеХМЕ); КонецФункции II ПрочитатьДанные(ЧтениеХМЕ) Листинг 18.76. Функция «НоменклатураПрочитатьХМЬО» &НаСервереБезКонтекста Функция НоменкпатураПрочитатьХМЦЧтениеХМЕ) Если HTeHneXML.TnnYana <> ТипУзлаХМЬНачалоЭлемента Тогда ВызватьИсключение "Ошибка чтения XML"; КонецЕсли; II Чтение следующего узла. ЧтениеХМЬПрочитать(); II Чтение ссылки на элемент справочника. НоменкпатураСсылка = npo4nraTbXML(4TeHneXML); Если ТипЗнч(НоменклатураСсылка) <> Тип("СправочникСсылка. Номенклатура") Тогда ВызватьИсключение "Ошибка чтения XML”; КонецЕсли;
II Пытаемся создать объект по полученной ссылке. Номенклатура = НоменкпатураСсылка.ПопучитьОбъект(); II Чтение признака группы. ЭтоГруппа = ПрочитатьХМЦЧтениеХМЬ); Если Номенклатура <> Неопределено Тогда Если Номенкпатура.ЭгоГруппа <> ЭтоГруппа Тогда ВызватьИсключение "Некорректные данные"; КонецЕсли; Иначе II Создаем элемент справочника. Если ЭтоГруппа = Истина Тогда II Создаем группу. Номенклатура = Справочники.Номенкпатура.СоздатьГруппу(); Иначе II Создаем элемент справочника. Номенклатура = Справочники.Номенклатура.СоздатьЭлемент(); КонецЕсли; II Устанавливаем значение ссылки для нового объекта. Номенклатура.УстановитьСсылкуНового( Номенклатур аСсылка); КонецЕсли; II Родитель. Номенклатура.Родитель = ПрочитатьХМЦЧтениеХМЦ; //Код. Номенкпатура.Код = ПрочитатьХМЦЧтениеХМЦ; II Наименование. Номенклатура.Наименование = ПрочитатьХМЦЧтениеХМЦ; II Реквизиты, загружаемые только для элемента справочника, II а не для группы. Если Не Номенкпатура.ЭгоГруппа Тогда II ЗакупочнаяЦена. Номенклатура.ЗакупочнаяЦена = ПрочитатьХМЦЧтениеХМЬ); II ЕдиницаИзмерения. Номенклатура.ЕдиницаИзмерения = ПрочитатьХМЦЧтениеХМЬ); II Картинка. Номенклатура.Картинка = ПрочитатьХМЦЧтениеХМЬ); II ПолноеНаименование. Номенклатура. ПолноеНаименование = ПрочитатьХМЦЧтениеХМЦ; КонецЕсли; II Проверяем, что текущим узлом является КонецЭлемента. Если ЧтениеХМЬТипУзла <> ТипУзлаХМЬКонецЭлемента Тогда ВызватьИсключение "Ошибка чтения XML"; КонецЕсли; II Чтение следующего узла для завершения чтения элемента. ЧтениеХМкПрочитатьО; Возврат Номенклатура; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
Порядок взаимодействия процедур можно представить в виде следующей схемы (рис. 18.10). Рис. 18.10. Взаимодействие процедур при чтении данных В процедуре ЗагрузкаДанных(), см. листинг 18.73, производится выборка (последовательный обход) элементов, содержащих данные. Для каждого элемента в функции ВозможностьЧтенияДанных(), см. листинг 18.74, про- веряется возможность чтения. Причем если имя типа равно CatalogObj- ect.Номенклатура.Вручную, возвращается значение Истина, в противном случае вызывается «штатный» метод «1С:Предприятия» ВозможностьЧте- нияХМЦ) для выполнения этой проверки для других типов. Чтение данных из элемента производится в функции прочитатьДанные(), см. листинг 18.75. Если читается элемент CatalogObject.HoMeHKnaTy- ра.Вручную, то тогда для чтения вызывается специализированная функция НоменклатураПрочитатьХМЦ), см. листинг 18.76, в противном случае чтение осуществляется с помощью «штатного» метода ПрочитатьХМЦ). Следует обратить внимание на тот факт, что в данном случае потребова- лась «ручная» отработка изменений, как на стороне выгрузки, так и на стороне загрузки. Может возникнуть вопрос: что делать, если в объекте приемника добавлен (по сравнению с объектом источника) дополни- тельный реквизит. Стоит ли вносить изменения как на стороне выгрузки, так и на стороне загрузки? Разберем этот вопрос последовательно. Да, можно выгрузить объект как есть, но при этом в XML-элементах, подчиненных элементу объекта, не будет данных о типах свойств, реквизитов. В итоге их загрузка (универсальная) будет затруднена. Скорее всего, в этом случае придется прописывать очень жесткие механизмы (если этот элемент имеет имя Картинка, значит, его тип Храни- лищеЗначения и т.п.). Том 2
№ормат£|[файлов1обмена1 Без изменения процедуры загрузки можно обойтись, только когда в объекте приемника меньше реквизитов, чем в источнике. В этом случае можно «подделать» структуру элемента так, чтобы метод ПрочитатьХМЦ) его воспринял. Работа с ZIP-архивами При решении задач обмена может потребоваться передача довольно большого объема данных, как посредством каких-либо интернет-тех- нологий, так и другими средствами. В связи с объемом этих данных может возникнуть необходимость в их сжатии перед передачей и распа- ковкой после приема. Платформа «1 (^Предприятие» предоставляет возможности работы с ZIP-архивами. Для этого в системе существуют объекты Запись21РФайла (ответственный за запись) и Чтениег1РФайла (ответственный за чтение архивов). Создание архива Для того чтобы записать файлы в ZIP-архив, необходимо выполнить несколько простых действий: создать архив с необходимыми параметрами, в который будут поме- щаться файлы; поместить в архив необходимые файлы; записать архив. Рассмотрим эти действия на следующем примере (листинг 18.77). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной конфигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаС71РАрхивами). Листинг 18.77. Пример записи файла в ZIP-архив Архив = Новый Запись/1РФайла("с:\архив.21р", "Пароль", "Комментарий", МетодСжатия21Р.Сжатие, УровеньСжатия21Р.Максимальный, МетодШифрованияДР.2р20); Архив.Добавить("с:\А1е.х1в", РежимСохраненияПутей21Р.НеСохранятьПути); Архив.3аписать(); Создание объекта Запись21РФайла можно осуществить двумя путями: создать инициализированный объект (см. листинг 18.77); создать неинициализированный объект и вызвать у него метод Открытье (файл архива не должен существовать в этом случае), листинг 18.78.
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Листинг 18.78. Пример использования неинициализированного объекта «Запись21РФайла» Архив = Новый Запись71РФайла(); Архив.Открыть("с:\архив.ар”, "Пароль", "Комментарий", МетодСжатия71Р.Сжатие, УровеньСжатия2!Р.Максимальный, МетодШифрования21Р.Др20); При создании нового архива (либо при создании конструктором, либо методом Открыть()) требуется указать: имя файла, куда будет записан архив. Этот параметр является обяза- тельным. Если такой файл уже существует на диске, он будет перезаписан (в момент вызова метода ЗаписатьО); пароль доступа к архиву. Если этот параметр пропущен или равен пустой строке, то шифрование производиться не будет; комментарий к архиву; метод сжатия файлов в архиве. На выбор предоставляется возможность скопировать файлы в архив без сжатия или сжать их. По умолчанию файлы сжимаются; уровень сжатия файлов в архиве. Можно выбирать между мини- мальным, оптимальным и максимальным сжатием. По умолчанию используется оптимальное сжатие; метод шифрования. Можно защитить архив методом шифрования ZIP20, совместимым с большинством программ, или с помощью шифрования на основе новейшего стандарта AES с различной длиной ключа (128,192 и 256 бит). Однако следует помнить, что данный метод может быть не совместим с некоторыми программами архивирования старых версий. После создания объекта необходимо добавить в него сжимаемые файлы. Для этой цели используется метод Добавить(). У него 3 параметра: полное имя файла или маска; режим сохранения путей к файлу. Можно сохранять полные пути, не сохранять пути совсем или сохранять пути относительно каталога; режим обработки подкаталогов. Можно обрабатывать подкаталоги рекурсивно или не обрабатывать их. Параметр имеет смысл, если в качестве имени указана маска. После того как все необходимые файлы добавлены, можно записать архив на диск, воспользовавшись методом Записать(). Важно понимать, что до выполнения этого метода никаких реальных действий по созданию архива не происходит. После записи архива на диск объект закрывает его, и для работы со следующим архивом необходимо выполнить метод Открыть().
Особенности упаковки файлов по маске Остановимся подробнее на особенностях упаковки файлов по маске. Предположим, что у нас есть следующие файлы: c:\ZIP\filel.xls c:\ZIP\file2.xls c:\ZIP\file.doc c:\ZIP\Test\file3.xls c:\ZIP\Test\file4.xls Для упаковки всех этих файлов в архив можно воспользоваться следу- ющим кодом (листинг 18.79). Листинг 18.79. Пример добавления файлов в ZIP-архив Архив.Добавить("с:\2|Р\(Ие1.х1в", РежимСохраненияПутейаР.СохранятьПолныеПути); ApxnB.flo6aBHTb("c:\ZIP\Test\file3.xls", РежимСохраненияПутей21Р.СохранятьОгносительныеПути); ApxnB.flo6aBWTb("c:\ZIP\Test\file4.xls", РежимСохраненияПутей21Р.НеСохранятьПути); //и так далее... Следует отметить, что относительные пути актуальны только при задании маски (значение СохранятьОтносительныеПути системного перечисления РежимСохраненияПутейг1Р). В архив файлы попадут следующим образом: c:\ZIP\filel.xls \file3.xls \file4.xls Добавить файлы в архив можно и другим способом (листинг 18.80). Листинг 18.80. Пример добавления файлов в ZIP-архив Архив.Добавить(''с:\Д PV.xls", РежимСохраненияПутей21Р.СохранятьОтносительныеПути, РежимОбработкиПодкаталогов21Р.НеОбрабатывать); В результирующий архив попадут следующие файлы: \filel.xls \file2.xls При создании архива можно включать файлы во вложенных каталогах (листинг 18.81). Листинг 18.81. Пример добавления фейлов из вложенных кеталогов в ZIP-архив Архив.Добавить("с:\/1Р\*.х|5", РежимСохраненияПутей21Р.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговДР.ОбрабатыватьРекурсивно); Профессиональная разработка в системе «1С:Предприятие 8»
В результирующий архив попадут следующие файлы: \filel.xls \file2.xls \Test\file3.xls \Test\flle4.xls Особенности работы метода «Добавить^)» Упаковать файлы в архив можно несколькими способами в зависимости от того, какой результат необходим. Упаковать некоторые файлы в папку ZIP с сохранением структуры каталогов. Предположим, что у нас есть следующие файлы: c:\ZIP\filel.xls c:\ZIP\Test\flle3.xls Добавить их в архив можно, вызывая для каждого метод Добавить() с указанием требуемых параметров (листинг 18.82). Листинг 18.82. Пример добавления файлов в ZIP-ерхив Архив.Добавигь(”с:\21Р\А1е1 ,xls", РежимСохраненияПутей21Р.СохранятьПолныеПути); I ApxnB.flo6aBHTb("c:\ZIP\Test\file3.xls", РежимСохраненияПутейДР.СохранятьПолныеПути);| В архив файлы попадут следующим образом: \ZIP\filel.xls \ZIP\Test\file3.xls Упаковать все файлы в папку ZIP без сохранения структуры каталогов. Предположим, что у нас есть следующие файлы: c:\ZIP\filel.xls c:\ZIP\Test\file3.xls Для добавления всех файлов передадим в метод Добавить() маску для поиска всех файлов (*.*), скажем, что нет необходимости сохранять пути для файлов, и укажем, что требуется производить поиск в подпапках (листинг 18.83). Листинг 18.83. Пример добавления файлов в ZIP-архив Архив.Добавить("с:\21Р\*.‘", РежимСохраненияПутейДР.НеСохранятъПути, Режим ОбработкиПодкаталогов21Р.ОбрабатыватьРекурсивно); В архив файлы попадут следующим образом: \filel.xls \file3.xls Том 2
№ормат£|[файлов1обмена1 При этом следует помнить, что если в разных папках будут файлы с одинаковыми именами, то операция выполнена не будет из-за того, что фактически мы попытаемся добавить в архив файлы с одинаковыми именами. Упаковать все файлы в папку ZIP с сохранением относительных путей. Предположим, что у нас есть следующие файлы: c:\ZIP\filel.xls c:\ZIP\Test\file3.xls Для добавления всех файлов передадим в метод Добавить() маску для поиска всех файлов (*.*), скажем, что необходимо сохранять относи- тельные пути для файлов, и укажем, что требуется производить поиск в подпапках. При этом следует помнить, что относительные пути будут начинаться от папки, в которой начался поиск (листинг 18.84). Листинг 18.84. Пример добавления файлов в ZIP-архив Архив.Добавить("с:ЙР\*.*, РежимСохраненияПутей71Р.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговДР.ОбрабатыватьРекурсивно); В архив файлы попадут следующим образом: \filel.xls \Test\file3.xls Чтение ZIP-архивов На приемной стороне при получении архива возникает задача его чтения. С точки зрения объекта Чтениег!рФайла необходимо выполнить два дейс- твия: открыть полученный архив; распаковать файлы (извлечь их из архива). Создание объекта Чтениег|рФайла может производиться двумя спосо- бами: создать инициализированный объект (листинг 18.85); создать неинициализированный объект (листинг 18.86). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной конфигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаС21РАрхивами).
Глава118ЯЙнтёграция[сУдругими1информационн£|ми[системами Листинг 18.85. Пример использования объекта «ЧтениеЗрФайла» Архив = Новый ЧтениеЗрФайла("с:\архив.ар", "Пароль"); | Листинг 18.86. Пример использования объекта «ЧтениеЗрФайла» Архив=Новый Чтение2рФайла(); Архив.Открыть("с:\архив.ар", "Пароль"); Извлечение файлов из архива может осуществляться двумя методами: метод ИзвлечьВсе(), листинг 18.87; метод Извлечь() (каждый файл по отдельности), листинг 18.88. Листинг 18.87. Пример извлечения файлов из ZIP-архиве Архив.ИзвлечьВсе(”с:\Тетр", РежимВоссгановленияПутейФайловЗР.НеВосстанавливать); | Листинг 18.88. Пример извлечения файлов из ZIP-архива Для Каждого Элемент Из Архив.Эпементы Цикл Архив.Извлечь(Элемент, "c:\Temp”, РежимВосстановленияПутейФайлов21Р.НеВосстанавливать, ?(Элемент.Зашифрован, Пароль,'"')); КонецЦикла; При взгляде на приведенный код может возникнуть вопрос: зачем же указы- вать пароль для расшифровки, если мы уже указали его при открытии? Суть этого в том, что формат ZIP-архива позволяет указать произвольный пароль для любого файла, и многие популярные программы архивиро- вания поддерживают такую возможность. При указании индивидуального пароля распаковки будет использоваться он. А если индивидуальный пароль не указан, то пароль, указанный при открытии архива. После извлечения файлов для прекращения работы с архивом необходимо выполнить метод Закрыть(). Приведем пример распаковки файлов из архива (листинг 18.89). Листинг 18.89. Пример распаковки файлов из ZIP-архива Пароль =""; Подсказка = "Введите пароль на архив"; II Запросим пароль на архив. Если ВвесгиСтроку(Пароль, Подсказка, 0, Ложь) Тогда Архив = Новый Чтение2рФайла("с:\архив.ар", Пароль); Сообщение = Новый СообщениеПользователю(); Сообщение.Тексг = "Комментарий:" + Архив.Комментарий; Сообщение.Сообщить(); Для Каждого Элемент Из Архив.Эпементы Цикл Сообщение.Тексг = "Распаковывается файл:" + Элемент.Имя + " размер:" + Элемент.РазмерНесжатого; Сообщение.Сообщить(); Архив.Извлечь(Элемент, "c:\Temp”, Режим ВосстановпенияПутейФайлов21Р.НеВосстанавливатъ, ?(Элемент.Зашифрован, Пароль,"")); КонецЦикла; Архив.3акрыть(); КонецЕсли;
Работа с файлами большого объема При работе с большими объемами данных могут возникнуть проблемы при пересылке архивных файлов. Типичной проблемой является ограни- чение некоторых почтовых серверов на размер сообщения - если письмо превышает некий заранее установленный размер, оно отбрасывается сервером. Применительно к «1 (^Предприятию» такая ситуация может возникнуть при пересылке больших сообщений обмена данными. Для решения этих проблем можно использовать функции глобального контекста РазделитьФайл() и ОбъединитьФайлыО. Функция РазделитьФайл() предназначена для разбиения файла на несколько частей указанного размера. Функция ОбъединитьФайлы(), наоборот, позволяет из нескольких томов собрать один файл. Пример использования функции РазделитьФайл() приведен в лис- тинге 18.90. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- таС21РАрхивами). Листинг 18.90. Пример использования функции «РазделитьФайлО» | Массив = РазделитьФайл("с:\архив.ар", 1024 * 1024, пс:\"); Первый параметр функции содержит имя архива, во второй записывается размер каждой части файла в байтах, в третьем параметре указывается путь, по которому будут размещаться создаваемые файлы. Функция возвращает массив имен созданных файлов. Функцию ОбъединитьФайлы() можно использовать двумя способами: указывая в первом параметре массив файлов, которые необходимо объединить (листинг 18.91); указывая в первом параметре шаблон, в соответствии с которым будет производиться объединение (листинг 18.92). Листинг 18.91. Пример использования функции «ОбъединитьФайлыО» МассивИмен = Новый Массив(2); МассивИмен.Добавить("с:\архив.ар.ООТ'); МассивИмен.Добавить("с:\архив.ар.002"); ОбъединитьФайлы(МассивИмен, "c:\apxHB.zip"); Листинг 18.92. Пример использования функции «ОбъединитьФайлыО» | ОбъединитьФайлы("с:\архив.ар.*”, "с:\архив.ар"); Профессиональная разработка в системе «1С:Предприятие 8»
Во втором параметре функции указывается полное имя создаваемого в результате объединения файла. Кроме этого способа существует также возможность объединить файлы в один с помощью команды операционной системы COPY. Для этого нужно воспользоваться ее возможностью конкатенации двоичных файлов (листинг 18.93). Листинг 18.93. Пример использования команды COPY C:\>COPY apxMB.zip.001 /В + apxMB.zip.002 /В apxHB.zip ИСПОЛЬЗОВАНИЕ ИНТЕРНЕТ-ТЕХНОЛОГИЙ Прежде чем приступить к рассмотрению возможностей интернет-техно- логий, которые могут использоваться платформой «1 С:Предприятие» для реализации различных механизмов интеграции с другими информацион- ными системами, рассмотрим основы работы этих технологий. Среди интернет-технологий распространена модель «Клиент-Сервер», разделяющая взаимодействующие стороны по функциональности клиента (запрашивающего выполнение операции) и сервера (выпол- няющего запрошенную операцию). Взаимодействие клиента и сервера производится в соответствии с определенными правилами (протоколом). Схематично модель «Клиент-Сервер» можно изобразить следующим образом (рис. 18.11). Рис. 18.11. Модель клиент-сервер Каждый компьютер в глобальной сети Интернет обладает неким уникальным идентификатором (IP-адресом). При организации любого взаимодействия учитываются IP-адреса, как клиента, так и сервера. Кроме IP-адресов дополнительно используется такое понятие, как порт. Под портом понимается некая адресная точка (локально на компьютере), через которую и производится взаимодействие. Как на стороне сервера, так и на стороне клиента порт обслуживается какой-либо специализиро- ванной программой. Том 2
Доступ клиента (это может быть программа Microsoft Internet Explorer и т.д.) из локальной сети в сеть Интернет может производиться как напрямую, так и через специализированную службу: прокси-сервер (некая служба-посредник). Задача службы - выполнять запросы клиентов к серверу от своего имени, получать, выдавать, хранить (для повторной отправки) ответы серверов. При использовании этой службы клиент выполняет запрос не к серверу, а к прокси-серверу (с указанием данных сервера, содержащего запраши- ваемый ресурс). Если такой запрос уже проходил через прокси-сервер и ответ хранится в его базе данных (это определяется набором факторов, например таких, как «время жизни ответа», политика администратора сервера и т. п.), то запрос к серверу, содержащему запрашиваемый ресурс, не производится - ответ выбирается из базы данных. Использование такой службы позволяет экономить внешний (по отношению к локальной сети) трафик, более быстро получать ответы на часто задаваемые вопросы. Схематично этот процесс выглядит следующим образом (рис. 18.12). Рис. 18.12. Прокси-сервер После рассмотрения принципов перейдем к рассмотрению конкретных технологий, которые могут использоваться механизмами, реализован- ными в «1С:Предприятие». Работа с HTML Можно сказать, что HTML-документ представляет собой текстовый файл, имеющий определенную структуру, которому принудительно дано расши- рение НТМ или HTML. На самом деле более правильно говорить о языке HTML (язык разметки гипертекста). С этой точки зрения HTML-доку- мент - это документ с текстовым содержимым, написанный на языке HTML. Структура HTML-документа задается с помощью так называемых «тегов» (выражений, заключенных в угловые скобки). Набор тегов и их свойств (значений свойств) зафиксирован. Изучение языка HTML сводится к изучению конечного множества тегов, свойств тегов и их значений.
ГлаваУ18ЯЙнтёграция[сУдругими1информационн£|ми[системами Если говорить о «задаче, решаемой языком HTML», то это форматиро- вание отображаемых данных. В этом смысле теги можно разбить на «теги структуры документа», «теги форматирования» и другие. Основные теги, задающие структуру HTML-документа, следующие (листинг 18.94). Листинг 18.94. Основные теги, задающие структуру HTML-документа <html> <head> <meta content="text/html; charset=windows-1251”> <Ш1е>Заголовок сграницы<ДН1е> </head> <body bgcolor=lightyellow text=darkblue> 'Teno” документа </body> </html> В теле документа могут располагаться различные форматирующие теги. Пример таких тегов приведен в листинге 18.95. Листинг 18.95. Пример форматирующих тегов <М Заголовок 1-го уровня (можно до 6-го)</Ы> <Ь>Полужирный<!> полужирный и наклонный</Ь> наклонный обычный текст <р>новый абзац<Л></р> Данные в HTML-документе можно организовывать в таблицы (листинг 18.96). Листинг 18.96. Пример таблицы <table> <tr> <td>nepeoe</td> <td>BTopoe</td> </tr> <tr> <td>rpeTbe</td> <td>4eTeepToe<rtd> </tr> </table> Для навигации (переходу к другим ресурсам) могут использоваться гиперссылки (листинг 18.97). Листинг 18.97. Пример использования гиперссылки <а href=pecypc">TeKcr гиперссылки</а> | Следует отметить, что в данном разделе не ставится задача познакомить со всем множеством тегов - это удел специализированной литературы. Рассматриваем только основные понятия.
Если собрать все продемонстрированные фрагменты и запустить полу- ченный HTML-документ на просмотр в специализированной программе (например, Microsoft Internet Explorer), то получим, например, следу- ющую картинку (рис. 18.13). Рис. 18.13. Пример HTML-документа В платформе «1С:Предприятие» существует специализированный ввд поля формы, который позволяет просматривать HTML-документы. Поле HTML-документа Функциональность поля формы вида ПолеНТМЬДокумента целиком зависит от установленной на локальном компьютере программы интер- нет-браузера (она ею обеспечивается). Для просмотра различных интернет-ресурсов, возвращающих ответ в виде HTML-документа (это не обязательно должны быть опреде- ленные в явном виде HTML-документы, также можно смотреть результат обращения к файлам *.asp, *.jsp и т.д.), нужно подставить адрес запраши- ваемого ресурса в значение строкового реквизита, который отображается полем HTML-документа (листинг 18.98). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- TaCHTML). Листинг 18.98. Пример использования поля HTML-документа | noneHTML = "http://www.v8.1c.nj”; Профессиональная разработка в системе «1С:Предприятие 8»
Для работы с историей просмотренных страниц можно использовать методы ВпередО и НазадО, листинг 18.99. Листинг 18.99. Пример использования методов «ВпередО» и «НазадО» Элементы.ПолеНТМ1.Вперед(); I Элементы.ПолеНТМЬНазадО;| Поле HTML-документа, так же как и большинство специализированных программ, поддерживает работу с объектной моделью HTML-документа, которая зависит от установленной операционной системы и используемого интернет-браузера. Поэтому в каждом конкретном случае программная модель может быть разной. Например, ниже описана модель HTML-документа, используемая компа- нией Microsoft в браузере Internet Explorer. Эту модель можно представить в виде набора взаимосвязанных объектов (каждый из которых опреде- ляется при помощи соответствующих тегов HTML). Схема фрагмента данной модели представлена на рис. 18.14. Рис. 18.14. Фрагмент объектной модели HTML-документа Рассмотрим следующий HTML-документ (листинг 18.100). Листинг 18.100. Пример HTML-документа <html> <head> <Ш1е>Анкета<ЛН!е> </head> <body> Том 2
Исполйз6вание]интернет£технологий «form name-anketa' action- input.asp’> «table* <tr> <1<1>Организация</1с1> <td> «input type=text name='finna'> «/td> </tr> <tr> «td*KoMy«/td> <td> «input type=text name='to'> «/td> «/tr> «tr> <td>rio>KenaHHe</td> «td> «input type=text name-message'* «/td> «/tr> «tr> «td colspan=2 align=center> «input type=submit name-ok' value-Отправить'* «/td> «/tr> «/table* «/form* «/body* «/html* Визуально этот документ отображается следующим образом (рис. 18.15). Организация | | Кому Пожелание | ~] [ Отправить ] Рис. 18.15. HTML-документ С точки зрения объектной модели его можно упрощенно представить следующим образом (рис. 18.16). Рис. 18.16. Структура HTML-документа Для того чтобы заполнить анкету, загруженную в поле HTML-документа, можно воспользоваться следующим фрагментом кода (листинг 18.101).
Глава118ЯЙнтёграция[сУдругими1информационн£|ми[системами Листинг 18.101. Пример заполнения анкеты Док = Элементы. ПолеНТМЬДокумент; flOK.forms["anketa"].firma.Value = "ООО Вперед"; flOK.fbrms["anketa”j.to.Value = "директору"; flOK.forms["anketa''].message.Vaiue = "здоровья и счастья!"; Свойство Документ поля HTML-документа позволяет получить СОМОбъект, который содержит объект document, представленный в объектной модели. У поля формы вида Поле HTML документа существуют следующие события: событие ПриНажатии. Возникает при нажатии (с помощью мыши или клавиатуры) на любом элементе внутри окна поля HTML-документа; событие ДокументСформирован. Возникает, когда HTML-документ построен и готов к использованию. Если понадобится активно работать с объектной моделью, настоятельно рекомендуем использовать обработчик события поля HTML-документа ДокументСформирован. Событие возникает, когда документ загружен полностью (либо в ряде случаев, когда загружен пустой документ: blank). Этот момент можно использовать для начала попытки работы с объек- тной моделью. НТТР-соединение Протокол HTTP (hypertext transfer protocol) - это протокол обмена гипертекстом (фактически обмен HTML-документами и их составляю- щими — картинками, flash-анимацией и т.д.). В качестве НТТР-сервера (программы, которая обслуживает нужный порт) может использоваться соответствующая служба Microsoft Internet Information Services. Для обращения к HTML-ресурсу нужно знать имя сервера и порт, который обслуживается нужной программой (обычно этот порт имеет номер 80). При настройке соединения для указания параметров доступа к прокси- серверу используется объект ИнтернетПрокси, для указания параметров доступа к HTTP-серверу - объект НТТРСоединение. Пример работы с объектами НТТРСоединение и ИнтернетПрокси приведен в листинге 18.102. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- таСНТТР).
Листинг 18.102. Пример работы с НТТР-соединением &НаКлиенте Процедура ПолучитьФайлЧерезНТТРСоединение(Команда) Перем HTTP; Сообщение = Новый СообщениеПользователю; Если ИслользуетсяПрокси = Истина Тогда ПроксиСервер = Новый ИнтернетПрокси(); ПроксиСервер.Пользователь = ИмяПользователя; ПроксиСервер.Пароль = ПарольПользователя; Попытка HTTP = Новый НТТРСоединение(СерверИсточник,,,, ПроксиСервер); Исключение Сообщение.Тексг = "Не удалось соединиться с сервером:" + СерверИсточник; Сообщение.Сообщить(); Сообщение.Тексг - ОписениеОшибки)); Сообщение.Сообщить(); Возврат; КонецПопытки; Иначе Попытка HTTP = Новый НТТРСоединение(СерверИсточник); Исключение Сообщение.Тексг = “Не удалось соединиться с сервером: ” + СерверИсточник; Сообщение.Сообщить(); Сообщение.Тексг = ОписаниеОшибки)); Сообщение.Сообщить(); Возврат; КонецПопытки; КонецЕсли; Попытка НТТР.Получить(СтрокаПараметраПолучения, ИмяВхрдящегоФайла); Исключение Сообщение.Тексг = ОписаниеОшибки)); Сообщение. Сообщить)); Возврат; КонецПопытки; КонецПроцедуры В рассмотренном механизме используются следующие внешние пара- метры: СерверИсточник — параметр, указывающий сервер, где смотрим файлы, например, localhost или users.v8.lc.ru/Actual.aspx; СтрокаПараметраПолучения - полное имя получаемого файла на сервере, например, /test/warning.gif; ИмяВходящегоФайла — полное имя сохраняемого файла на локальном компьютере, например, c:\test.gif; ИмяПользователя - параметр, содержащий имя пользователя прокси- сервера; Профессиональная разработка в системе «1С:Предприятие 8»
ПарольПользователя — параметр, содержащий пароль на доступ к прокси-серверу; ИспользуетсяПрокси - параметр, определяющий, используется ли прокси-сервер (тип Булево). То, что ни в каком из объектов явно не указываются порты обращения к серверам, говорит о том, что используются значения по умолчанию. После установки соединения с сервером файлы получаются с сервера методом Получить(). Использование FTP Работать с FTP-ресурсами (копировать на них или с них файлы) можно двумя способами: основываясь на функциональности процедуры КопироватьФайл() (может использоваться и для копирования файлов в локальной сети, и для работы по протоколу FTP); используя специализированные объекты ЕГРСоединение, ЕГРФайл, ИнтернетПрокси. Рассмотрим оба варианта. Процедура «КопироватьФайл()>> Для копирования файла с FTP-сервера (или ресурса локальной сети) в локальный каталог компьютера можно использовать следующий фраг- мент кода (листинг 18.103). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- таСНТТР). Листинг 18.103. Пример использования процедуры «КопироватьФайл()» &На Клиенте Процедура ПопучигьФайлыССервера(Команда) // СерверИсточник - параметр, указывающий, где смотрим файлы. ПутьНаСервере = "setup/”; Путь = "с:\"; Сообщение = Новый СообщениеПользователю; // Находим файлы в нужном каталоге по указанной маске. МаскаФайлов = "*.txt‘"; МассивФайлов = НайтиФайлы(СерверИсточник + ПутьНаСервере, МаскаФайлов); Том 2
Испол йз6вание]интернетАтехн6л6гий Для Каждого Файл Из МассивФайлов Цикл // Копируем файл в локальный каталог. Сообщение.Текст =" - Считывается файл" + Файл.Имя; Сообщение.Сообщить(); Попытка // Копируем файл с сообщением обмена в указанный файл. КопироватьФайл(СерверИсточник + ПутьНаСервере + Файл.Имя, Путь + Файл.Имя); Исключение Сообщение.Текст = ОписаниеОшибки(); Сообщение.Сообщить(); Возврат; КонецПопытки; КонецЦикла; КонецПроцедуры ЕГРСоединение Для доступа к FTP-серверам можно использовать специализированный объект ЕГРСоединение. Кроме этого, может использоваться объект Интер- нетПрокси. Протокол FTP - это протокол обмена файлами. В качестве FTP-сервера (программы, которая обслуживает нужный порт) может использоваться соответствующая служба Microsoft Internet Information Services. Для обращения к FTP-pecypcy нужно знать имя FTP-сервера и порт, который обслуживается нужной программой (обычно этот порт имеет номер 21). При настройке соединения для указания параметров доступа к прокси- серверу используется объект ИнтернетПрокси, для указания параметров доступа к FTP-серверу - объект ЕГРСоединение. Пример работы с объектами ЕГРСоединение и ИнтернетПрокси приведен в листинге 18.104. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной конфигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаСНТТР). Листинг 18.104. Пример использования объекта «ЕГРСоединение» &НаКлиенте Процедура ПолучитьФайлыЧерезЕГРСоединение(Команда) ПутьНаСервере = Путь = "с:Г; Сообщение = Новый СообщениеПользователю; 353
ГлаваУ18ЯЙнтеграция[сУдругими[информационн£|ми[системами Если ИспользуетсяПрокси = Истина Тогда ПроксиСервер = Новый ИнтернетПрокси(); ПроксиСервер.Пользователь = ИмяПользователя; ПроксиСервер.Пароль = ПарольПользователя; Попытка Сервер = Новый ЕГРСоединение(СерверИсточник,, ИмяПользователя, ПарольПользователя, ПроксиСервер); Исключение Сообщение.Тексг = "Не удалось соединиться с сарвером:" + СерверИсточник; Сообщен ие.Сообщить(); Сообщение.Тексг = ОписаниеОшибки(); Сообщение.Сообщить(); Возврат; КонецПопытки; Иначе Попытка Сервер = Новый ЕГРСоединение(СерверИсточник,, ИмяПользователя, ПарольПользователя); Исключение Сообщение.Тексг = "Не удалось соединиться с сарвером: ” + СерверИсточник; Сообщение.Сообщить(); Сообщение.Тексг = ОписаниеОшибки(); Сообщен ие.Сообщить(); Возврат; КонецПопытки; КонецЕсли; // Находим файлы в нужном каталоге по указанной маске. МаскаФайлов = МассивФайлов = Сервер.НайтиФайлы(ПутьНаСервере, МаскаФайлов); Для Каждого Файл Из МассивФайлов Цикл // Не каталог ли это. Если Файл.ЭтоФайл() Тогда // Копируем файл в локальный каталог. Сервер.Получить(Файл.ПолноеИмя, Путь + Файл.Имя); КонецЕсли; КонецЦикла; КонецПроцедуры В рассмотренном механизме используются следующие внешние пара- метры: МаскаФайлов — параметр, содержащий маску для файлов загрузки; ПутьНаСервере — содержит путь на FTP-сервере до нужных файлов, например, /setup/; СерверИсточник - параметр, указывающий сервер, где смотрим файлы, например, ftp.v8.1c.ru; Путь — параметр, определяющий каталог, куда перемещать файлы; ИмяПользователя — параметр, содержащий имя пользователя прокси- сервера; ПарольПользователя — параметр, содержащий пароль на доступ к прокси-серверу;
Используется Прокси - параметр, определяющий, используется ли прок- си-сервер (тип Булево). После установки соединения с сервером файлы получаются с сервера методом Получить(). Работа с электронной почтой С помощью объекта ИнтернетПочта можно организовывать прием, отправку писем. Объект ИнтернетПочта позволяет работать с почтовыми серверами напрямую по протоколам SMTP, POP3. Прежде чем приступить к рассмотрению материала данного раздела, вспомним основные понятия, используемые при рассмотрении различных интернет-технологий. Для подключения к какому-либо серверу (в том числе и к почтовому) необходимо знать его адрес и порт, на котором обслуживаются запросы в соответствии с интересующим протоколом. Для работы с почтовым сервером объект ИнтернетПочта может использовать протокол SMTP (отправка сообщений, порт по умолчанию № 25) и POP3 (получение сооб- щений, порт по умолчанию № ПО). Настройки обращения к почтовым серверам указываются в специализированном объекте ИнтернетПоч- товыйПрофиль. Рассмотрим пример, позволяющий отправлять почтовые сообщения (листинг 18.105). ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка РаботаСПочтой, команды формы ОтправитьСообщениеОбмена, Полу- читьСообщениеОбмена). Листинг 18.105. Пример отправки почтовых сообщений &НаКлиенте Процедура ОтправитьСообщениеОбмена(Команда) Профиль = Новый ИнтернетПочтовыйПрофиль; Профиль.АдресСервераЗМТР = СерверЗМТР; // Профиль.ПользовательЗМТР = Пользователь; // Профиль.ПарольЗМТР = Пароль; // Профиль.АутентификацияЗМТР = СпособЗМТРАутентификации.БезАутентификации; Профиль.АдресСервераРОРЗ = СерверРОРЗ; Профиль.Пользователь = Пользователь; Профиль.Пароль = Пароль; // Формируем сообщение обмена. Профессиональная разработка в системе «1С:Предприятие 8»
Сообщение = Новый ИнтернетПочтовоеСообщение; Сообщение.Тема = "СООБЩЕНИЕ_ОБМЕНА: ” + ИмяФайлаСообщения; Сообщение.Отправитель = ОтправительПочтовогоСообщения; Сообщение.Получатели.Добавить(ПочтовыйАдресОбмена); Если ИмяФайлаСообщения <>Тогда ФайлСообщения = Новый Файл(ИмяФайлаСообщения); // Создаем вложение с файлом обмена. Сообщение.Вложения.Добавить(ИмяФайлаСообщения, ФайлСообщения.Имя); КонецЕсли; Почта = Новый ИнтернетПочта; Сообщ = Новый СообщениеПользователю(); Попытка Почта.Подключиться(Профиль); // Отправляем сообщение с файлом обмена. Почта.Послать(Сообщение); Исключение Сообщ.Текст =" - Ошибка при отправке файла:" + ИмяФайлаСообщения; Сообщ.Сообщить(); Сообщ.Текст = ОписаниеОшибки(); Сообщ.Сообщить(); Возврат; КонецПопытки; Сообщ.Текст =' - Отправлен файл" + ИмяФайлаСообщения +" на адрес" + ПочтовыйАдресОбмена; Сообщ.Сообщитъ(); Почта.Отключиться(); КонецПроцедуры В данном примере используются следующие входные параметры: ИмяФайлаСообщения — полное имя отправляемого файла; CepeepSMTP - имя сервера, например, smtp.mail.ru; ОтправительПочтовогоСообщения — полное имя отправителя сообщения, например, <логин>@таН.ги; ПочтовыйАдресОбмена — почтовый адрес; СерверРОРЗ — содержит адрес сервера, например, pop3.mail.ru; Пользователь, например, <логин>; Пароль. ВНИМАНИЕ! В данном примере используется почтовый сервер mail.ru. Работа с ним имеет такую особенность: перед первой отправкой почты ее нужно сначала один раз получить с сервера. И обязательно требуется указать отправителя почтового сообщения. Прочитать сообщения можно, используя следующий фрагмент кода (листинг 18.106). Том 2
Листинг 18.106. Пример чтения почтовых сообщений &НаКлиенте Процедура ПолучитьСообщениеОбмена(Команда) Профиль = Новый ИнтернетПочтовыйПрофиль; Профиль.АдресСервераРОРЗ = СерверРОРЗ; Профиль.Пользователь = Пользователь; Профиль.Пароль = Пароль; Почта = Новый ИнтернетПочта; Сообщ = Новый СообщениеПользователю(); Попытка Почта.Подключиться(Профиль); // Получаем вса сообщения из почтового ящика. МассивСообщений = Новый Массив; МассивСообщений = Почта.Выбрать(Ложь); Исключение // Ошибка при подключении к серверу или при приеме сообщения обмена. Сообщ.Текст -" - Ошибка при подключении или приеме" + ОписаниеОшибки(); Сообщ.Сообщить(); Возврат; КонецПопытки; // Массив будет содержать сообщения, которые впоследствии будут удалены с сервера. МассивСообщенийОбмена = Новый Массив; Если МассивСообщений.КоличествоО = 0 Тогда // Сообщений в почтовом ящике нет. Сообщ.Текст =" - Сообщений в почтовом ящике нет."; Сообщ.Сообщить(); Возврат; КонецЕсли; ИмяФайлаСообщения = Для Индекс = 0 По МассивСообщений.КоличествоО -1 Цикл // Отсеиваем только сообщения, которые содержат файлы обмена для участвующих в обмене узлов. ЧастьТемы = "СООБЩЕНИЕ_ОБМЕНА:"; Если Лев(МассивСообщений[Индекс].Тема, СтрДлина(ЧастьТемы)) = ЧастьТемы Тогда Если МассивСообщений[Индекс].Вложения[0],Имя > ИмяФайлаСообщения Тогда // Выбираем сообщение с последним номером сообщения обмена. ИмяФайлаСообщения = МассивСообщений[Индекс].Вложения[0].Имя; ИндексСообщения = Индекс; КонецЕсли; МассивСообщенийОбмена.Добавить(МассивСообщений[Индекс]); КонецЕсли; КонецЦикла; Если ИндексСообщения <> Неопределено Тогда // Записываем файл обмена во временный файл. МассивСообщений[ИндекеСообщения].Впожения[0]Данные.Записать(ИмяФайлаСообщения); Сообщ.Текст =" - Принят файл обмена данными" + ИмяФайлаСообщения + ” с адреса" + ПочтовыйАдресОбмена; Сообщ.Сообщить();
Глава118ЯЙнтёграция[сУдругими1информационн£|ми[системами // Удаляем все сообщения обмена с сервера для узлов, участвующих в обмене. Почта.УдалигьСообщения(МассивСообщенийОбмена); Почта.Отключиться(); Иначе // Сообщений обмена в почтовом ящике нет. Сообщ.Текст =" - Сообщений обмена в почтовом ящике нет."; Сообщ.Сообщить(); Почта.Отключиться(); Возврат; КонецЕсли; КонецПроцедуры В примере используются следующие входящие данные: СерверРОРЗ - содержит адрес сервера, например, pop3.mail.ru; Пользователь; Пароль. У метода Выбрать() в данном случае определен один параметр (Ложь), означающий, что письма с сервера не удаляются. Из всех писем, которые находятся на почтовом сервере, отбираются только те, у которых в теме определен префикс СообщениеОбмена. Остальные сообщения (считаем, что они личные) остаются на сервере. Обратите внимание, что при работе с объектом ИнтернетПочта отсутствует такое понятие, как «непрочитанные письма». В ряде случаев возникает необходимость оставлять находящиеся на сервере сообщения довольно длительное время (даже после прочтения). При большом потоке писем полная их загрузка может занимать много времени (такие потери времени могут быть крайне нежелательны). Для того чтобы решить эту проблему, существует возможность не загружать полностью все почтовые сооб- щения, а первоначально загружать только их конверты. Метод ПолучитьЗаголовки() объекта ИнтернетПочта позволяет получать с сервера только заголовки сообщений. Благодаря этому, например, можно получить информацию о теме, отправителе и т. д. и решить, принимать ли это письмо, оставить его или сразу удалить. Данный метод возвращает массив объектов типа ИнтернетПочтовоеСооб- щение. Каждый объект содержит информацию из заголовка сообщения. Вложения и тексты с сервера не принимаются. Например, требуется получить все заголовки почтовых сообщений (листинг 18.107). Листинг 18.107. Пример получения заголовков почтовых сообщений Профиль = Новый ИнтернетПочтовыйПрофиль; Профиль.АдресСервераРОРЗ = "pop3.yandex.nj"; Профиль Пользователь = "user"; Профиль Пароль = "password";
II Подключиться к почтовому серверу. Почта = Новый ИнтернетПочта; Почта.Подключиться(Профиль); // Принять заголовки всах писем, находящихся на сервере // ЗаголовкиСообщений - это массив с объектами типа // ИнтернетПочтовоеСообщение. ЗаголовкиСообщений = Почта.ПолучитьЗаголовки(); При просмотре можно заполнять новый массив заголовками сообщений, которые в дальнейшем можно попытаться получить полностью. Сам процесс получения может выглядеть следующим образом (листинг 18.108). Листинг 18.108. Пример получения почтовых сообщений Попытка // Получить полные сообщения. ПолученныеСообщения = Почта. Выбрать(Ложь, НужныеЗаголовкиСообщений), Исключение Сообщить (ОписаниеОшибки()); КонецПопытки; Используя метод ПолучитьЗаголовки(), можно получать сообщения по одному. Кроме того, можно заключить процедуру получения в опера- торы Попытка ... Исключение, что позволит продолжить получение, если при приеме определенного сообщения произошла ошибка. Также можно поместить в форме индикатор для графического отображения процесса получения сообщений. Использование форматированного документа в почтовом сообщении Выше мы рассматривали пример, как с помощью почты передавать файлы обмена. Теперь рассмотрим вариант, когда тело сообщения формируется с помощью форматированного документа, в него помещается форма- тированный текст, картинки, ссылки, специальные символы. Затем это сообщение отправляется, принимается с помощью почтового сервера и отображается в форме обработки в HTML-документе. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- таСПочтой, команды формы ОтправитьПочту, ПолучитьПочту). Для этого в обработку РаботаСПочтой нужно добавить реквизит типа ФорматированныйДокумент и перетащить его в дерево элементов формы. Для отображения командной панели форматированного документа в форме нужно добавить над ним группу вида Командная панель и запол- Профессиональная разработка в системе «1С:Предприятие 8»
нить ее свойство Источник команд реквизитом формы, который будет содержать этот форматированный документ (рис. 18.17). Обработке РаботаСЛочтой: Форма □ Реквизит । Грдоа? — ИмяФайлаСообшемм ® ВыбретьФайтвложетыя rpjpnal ® ОтправигьЛочту (ЭЕ) Отпр витъСообщемтеОбменэ^ Грутюаб “ СерверР РЭ — По*зов те* “ Паре* “ ТекстНТ IL нты з 1 гманажй интерфейс “ ИмяФайлаСообшемы = ОпфаеительПочгоеогоСообщемм = Пароль “ По*зоеате* = ПочтоеьМдресОбменэ = СерверРОРЭ - CepeepSMTP = ТекстНТМЬ «• ТекстФД 8 Реквизиты 8 Параметры Тип (ОбрабвткаОбъект.РаботаСЛочтоА) Строка Строка Строка Строка Строка Строка Строка о Строка Формапфоеа»е*йДок!рленг Свойс ।ua. I руппа Отправите* почтое» > сообщения:! Отправить почту |_ Сервер SMTP ПолуытьПомту Лочтовьйадрес обь ма. Имя Файла сообщены. ВседейЬция’1 'Основные! Заголовок |Гр^паЗ Все действия' "она | Командная пане* ъИсточни1коман1 |Соаерхоелое Видимость По*зоваге*скаяенд>*юсть Открыть Доступность @ ТолькоПросмотр Q РаэреимтьИэменемСостава 0 'Использование'. Подсказка I 5 Форма ЮМац» Гормзонтв*ноеПоложение [Лево 'Оформление: ЦветТекстаЗаголоека ! Авто Рис. 18.17. Отображение форматированного документа в форме Визуально при создании исходящего сообщения форматированный доку- мент отображается следующим образом (рис. 18.18). Рис. 18.18. Тело отправляемого сообщения Том 2
И спбл15з6вание]интернетАтехн6л6гий Для отправки сообщения, содержащего форматированный документ, можно использовать следующий фрагмент кода (листинг 18.109). Листинг 18.109. Пример Отправки почтовых сообщений &НаКлиенте Процедура ОтправитьПочту(Команда) Перем HTML, Картинки; Профиль = Новый ИнтернетПочтовыйПрофиль; Профиль.АдресСервераЗМТР = СерверЗМТР; Профиль.АдресСервераРОРЗ = СерверРОРЗ; Профиль.Пользователь = Пользователь; Профиль.Пароль = Пароль; Сообщение = Новый ИнтернетПочтовоеСообщение; Сообщение.Тема = "Форматированный документ"; Сообщение.Отправитель = ОтправительПочтовогоСообщения; Сообщение.Получатели.Добавить(ПочтовыйАдресОбмена); Содержимое.ПолучитьНТМЦНТМЦ Картинки); Для Каждого Картинка Из Картинки цикл Вложение = Сообщение.Вложения.Добавить(Картинка.Значение.ПолучитьДвоичныеДанные()); Вложение.Идентификатор = Картинка.Ключ; HTML = СтрЗаменить(НТМЦ Картинка.Ключ, "cid:" + Вложение.Идентификатор); КонецЦикла; ТекстСообщения = Сообщение.Тексты.Добавить(НТМЦ TnnTeKCTano4TOBoroCoo6uieHHH.HTML); Почта = Новый ИнтернетПочта; Сообщ = Новый СообщениеПользователю(); Попытка Почта.Подключиться(Профиль); Почта. Послать(Сообщение); Исключение Сообщ.Текст = “ - Ошибка при отправке почты: “; Сообщ.Сообщить(); Сообщ.Текст = ОписаниеОшибки(); Сообщ.Сообщить(); Возврат; КонецПопытки; Сообщ.Текст =" Сообщение отправлено."; Сообщ.Сообщить(); Почта.Отключиться(); Содержимое.Удалить(); КонецПроцедуры Для отправки содержимого форматированного документа сначала исполь- зуется его метод ПолучитьНТМЬ(), который получает HTML-составляющие форматированного документа - массив картинок и HTML-текст. Затем полученные картинки добавляются как вложения в почтовое сообщение
I Гл a Bail 84 И нтеграция[сУдругими!информационн£|ми[системами и сопоставляются с текстом письма путем установки свойства Идентификатор объекта ИнтернетПочтовоеВложение. HTML-текст добав- ляется в массив текстов почтового сообщения с указанием типа текста ТипТекстаПочтовогоСообщения.НТМЬ. Остальная работа по отправке сооб- щения выполняется с помощью методов Подключиться() и Послать() объекта ИнтернетПочта. Для чтения сообщения, содержащего форматированный документ, можно использовать следующий фрагмент кода (листинг 18.110). Листинг 18.110. Пример чтения почтовых сообщений &НаКлиенте Процедура ПолучитьПочту(Команда) Перем HTML, Картинки; Профиль = Новый ИнтернетПочтовыйПрофиль; Профиль.АдресСервераРОРЗ = СерверРОРЗ; Профиль.Пользователь = Пользователь; Профиль.Пароль = Пароль; Почта = Новый ИнтернетПочта; Сообщ = Новый СообщениеПользователю(); Попытка Почта.Подключиться(Профиль); // Получаем все сообщения из почтового ящика. МассивСообщений = Новый Массив; МассивСообщений = Почта.Выбрать(Ложь); Исключение // Ошибка при подключении к серверу или при приеме сообщения обмена. Сообщ.Текст =" - Ошибка при подключении или приеме" + ОписаниеОшибки(); Сообщ.Сообщить(); Возврат; КонецПопытки; КоличествоСообщений = МассивСообщений. Количество(); Если КоличествоСообщений = 0 Тогда // Сообщений в почтовом ящике нет. Сообщ.Текст =" - Сообщений в почтовом ящике нет.”; Сообщ.Сообщить(); Возврат; КонецЕсли; Для Индекс = 0 По КоличествоСообщений -1 Цикл Сообщ.Текст = "Принято сообщение:" + МассивСообщений[Индекс].Тема; Сообщ.Сообщить(); // Выводим содержимое письма в форматированью документ для последнего сообщения. Если Индекс = КоличествоСообщений - 1 Тогда Для каждого Элемент Из МассивСообщений[Индекс].Тексты Цикл Если Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.НТМЬ Тогда // Отображение тела сообщения в HTML-документе. TeKcrHTML = Элемент.Текст; Если Найти(ТекстНТМЦ "<HTML>") = 0 Тогда TeKCrHTML = "<HTML><BODY>" + TeKCrHTML + ’</BODY></HTML>";
КонецЕсли; КонецЕсли; КонецЦикла; КонецЕсли; КонецЦикла; Почта.Отключиться(); КонецПроцедуры Для отображения содержимого полученного сообщения используется элемент формы ТекстНТМЬ вида Поле HTML документа, связанный с соот- ветствующим строковым реквизитом формы. В этот реквизит помещается HTML-текст прочитанного сообщения. AUTOMATION Технология Automation предназначена для программного использования объектов, чаще всего не имеющих визуального представления (исклю- чения составляют, например, объекты Microsoft Office Word.Application и Excel.Application, при этом они отображаются в отдельном окне, отличном от окна «1С:Предприятия»). Обычно задачи, которые решаются с помощью этой технологии, это запись и чтение данных в/из специфических (для других приложений) форматов, записи и чтения в какие-либо базы данных. «1С:Предприятие» может выступать как в роли Automation Server, так и в роли Automation Client. Automation Server Основное назначение Automation-сервера «1С:Предприятия» — управ- ление приложением системы «1 С:Предприятие» из других приложений и выполнение действий, аналогичных интерактивным действиям. Automation-сервер «1С:Предприятия» предоставляет доступ ко всем свойствам и методам своего глобального контекста, имеет дополни- тельные свойства и методы для выполнения действий, специфичных для работы в режиме Automation. Для запуска системы «1С:Предприятие» в качестве Automation-сервера из внешнего приложения выполняется следующая последовательность дейс- твий: создается COM-объект с идентификатором V82.Application (толстый клиент) или V82c.Application (тонкий клиент); выполняется инициализация системы «1С:Предприятие» методом Connectf); вызываются свойства и методы системы «1С:Предприятие» как Automation-сервера. Профессиональная разработка в системе «1С:Предприятие 8»
Поставим задачу загрузить данные из листа программы Microsoft Excel в базу данных «1С:Предприятие». В листе данные расположены следующим образом (рис. 18.19). А В С D Е F G 1 Контрагент ОАО Стимул 2 Номер 123 3 Дата 11.11.2010 4 5 Номер Наименование Количество Цена Сумме 6 1 Холодильник 3 35000 105000 7 2 Чайник 10 2000 20000 В # 9 Рис. 18.19. Состав листа Excel Признаком конца табличной части является наличие в колонке «Номер» символа «#». Пример кода приведен в листинге 18.111. ПОДРОБНЕЕ Код, приведенный в листингах 18.111, 18.112, 18.116, содержится в макросах файла «Интеграция.xls», прилагающегося к книге. Листинг 18.111. Пример чтения данных из листа Excel в толстом клиенте Sub OLE() Dim trade As Object Dim Элемент As Object Set trade = CreateObjectfV82.Application") trade.Connect(,,File-'"c:\lnfoBases\Trade''";Usr=,,"Diractor"";,') Rem создаем документ Set Документ = 1габе.Документы.РасходнаяНакладная.СоздатьДокумент() Rem получаем данные из листа Set Контрагент = 1габе.Справочники.Контрагенты.НайтиПоНаименованию(АррНсайоп.Се118(1,2).Value) НомерДокумента = Application.Cells(2,2).Value Дата = Application.Cells(3,2). Value Rem записываем полученные данные в документ Документ.Контрагент = Контрагент Документ.Дата = Дата Документ.Номер = НомерДокумента Номер = 6 'Первая строка табличной части НомерСтроки = Application.Cells(HoMep, 1). Value Rem в последней строке табличной части будет символ # While НомерСтроки <> Т Rem получаем данные из листа Set Номенклатура = (габе.Справочники.Номенклатура. НайтиПоНаименованию(Арр0са(юп.СеН5(Номер, 2).Value) Количество = Application.Cells(HOMep, 5).Value Цена = Application.Cells(HoMep, 6).Value Сумма = Application.Cells(HoMep, 7).Value Том 2
Automation! Rem записываем полученные данные в строку табличной части Set Строка = Документ.Товары .ДобавитьЦ Строка.Номенклатура = Номенклатура Строка.Количество = Количество Строка.Цена = Цена Строка.Сумма = Сумма Номер = Номер + 1 НомерСтроки = Application.Cells(HoMep, 1 j.Value Wend Документ.Записать Документ ЛолучитьФорму.ОткрытьМодально End Sub В данном примере создается COM-объект с идентификатором V82.Application, то есть запускается и инициализируется конфигурация «1С:Предприятия 8.2» в режиме толстого клиента с базой данных в каталоге c:\lnfoBases\Trade. Далее создается экземпляр документа Расход- наянакладная. Из листа извлекаются данные документа и записываются в объект «1С:Предприятие». В конце алгоритма открывается форма вновь созданного документа. Аналогичные действия можно выполнять и в режиме тонкого клиента, когда создается объект V82c.Application. Однако в тонком клиенте недоступны методы прикладных объектов, невозможно обратиться к менеджерам справочников, документов и т.п. Поэтому новый доку- мент создается с помощью метода ПолучитьФорму(), обращение к его реквизитам происходит через основной реквизит полученной формы, а поиск ссылки на справочник выполняется в функции ПолучитьСсыл- куНаСправочник() общего неглобального модуля РаботаСДанными (листинг 18.112). Листинг 18.112. Пример чтения данных из листа Excel в тонком клиенте Sub OLE_V82c() Dim trade As Object Dim Элемент As Object Set trade = CreateObject("V82c.Application”) trade.Connect ("File="'c:\lnfoBases\Trade"";Usr=""'";") Rem создаем документ Set ФормаДокумента = (габе.ПолучитьФорму("Документ.РасходнаяНакладная.ФормаОбъекта") Rem получаем данные из листа Set Контрагент = trade.РаботаСДанными.ПолучитьСсылкуНаСправочник("Контраганты”, Application.Cells(1,2).Value) НомерДокумента = Application.Cells(2,2).Value Дата = Application.Cells(3,2). Value Rem записываем полученные данные в документ ФормаДокумента.Объект.Контрагент = Контрагент ФормаДокумента.Объект.Дата = Дата ФормаДокумента.Объект.Номер = НомерДокумента Номер = 6 ‘Первая строка табличной части НомерСтроки = Application.Cells(HoMep, 1). Value
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Rem в последней строке табличной части будет символ # While НомерСтроки <> "#" Rem получаем данные из листа Set Номенклатура = trade.РаботаСДанными.ПолучитьСсылкуНаСлравочник ("Номенклатура”, Application.Cells(HoMep, 2).Value) Количество=Application. СеНв(Номер, 5). Value Цена = Application.СеНв(Номер, 6). Value Сумма = Application.Cells(HoMep, 7).Value Rem записываем полученные данные в строку табличной части Set Строка = ФормаДокумента.Объект.Товары.Добавить() Строка.Номенклатура = Номенклатура Строка.Количестао = Количество Строка.Цена = Цена Строка.Сумма = Сумма Номер = Номер +1 НомерСтроки=Application.Cells(HoMep, 1 J.Value Wend ФормаДокумента.Открыть End Sub В конце алгоритма открывается форма вновь созданного документа, и данные в документ могут быть записаны интерактивно из формы. Объект Automation-сервер «1С:Предприятия» в качестве своих свойств может иметь: системные константы; значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, пере- числения, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры); переменные, объявленные в модуле приложения с ключевым словом Экспорт. Automation-сервер «1С:Предприятия» в качестве своих методов может иметь: системные процедуры и функции; процедуры и функции модуля приложения и общих модулей, объяв- ленные с ключевым словом Экспорт; два дополнительных метода — Connect() и NewObject(). Как и многие современные программные продукты, «1С:Предприятие» может выступать в роли клиентов Automation. Поэтому имеется возмож- ность из системы «1С:Предприятие» обращаться к другой копии «1С:Предприятия» (например, к другой конфигурации) для обмена данными. Здесь также можно запускать «1С:Предприятие» в толстом клиенте (листинг 18.113) и в тонком клиенте (листинг 18.114).
ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Automation). Листинг 18.113. Пример использования системы «1С:Предприятие» в качестве Automation Client (толстый клиент) Процедура Аи(ота(юпТолстыйКлиент(Команда) Путь = "c:\lnfbBases\Trade”; Пароль = Пользователь ="“; V82 = Новый COMO6beKT("V82.Application"); Попытка Открытие = V82.Connect("File=" + Путь + ";Usr=" + Пользователь + ";Pwd=" + Пароль + Исключение Предупреждение("База данных не открыта!!!"); Возврат; КонецПопытки; МенеджерНоменклатуры = V82.Справочники.Номенклатура; НовыйЭлемент = МенеджерНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Наименование = "Созданный"; НовыйЭлемент.Записать(); Фрм = НовыйЭлемент.ПолучитьФормуО; Фрм.ОткрытьМодально(); КонецПроцедуры Листинг 18.114. Пример использования системы «1С:Предприятие» в качестве Automation Client (тонкий клиент) Процедура Аи(отайопТонкийКлиент(Команда) Путь = "c:\lnfoBases\Trade"; Пароль ="“; Пользователь ='"; V82 = Новый COMObject("V82c.Application"); Попытка Открытие = V82.Connectf'File=" + Путь + ”;Usr=" + Пользователь + ";Pwd=" + Пароль +";"); Исключение Предупреждение("База данных не открыта!!!”); Возврат; КонецПопытки; // Тонкий клиент - создание нового элемента при открытии формы. Фрм = У82.ПолучитьФорму("Справочник.Номенклатура.ФормаОбъекта”); Фрм.Объект.Наименование = "Созданный"; Фрм.ОткрытьМодально(); КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Automation Client Основное назначение Automation-клиента «1 С: Предприятия» - управление другими приложениями из системы «1С:Предприятие» и выполнение действий, аналогичных интерактивным действиям. Можно сказать, что технология рекомендуется к применению, когда не требуется предоставлять пользователю интерфейс, выходящий за рамки возможностей «1С:Предприятия», но в то же время требуется взаимо- действие с «внешней функциональностью». В общем случае применение этой технологии состоит из двух частей — создание объекта по его идентификатору и последующее использование объекта. Создание объекта выполняется оператором Новый СОМОбъект(ИдентификаторОбъекта). Использование созданного объекта ничем не отличается от использования остальных объектов «1С:Предприятия». Дополнительные возможности предоставляет функция Полу- читьСОМОбъект(). С ее помощью можно создать Automation-объект из файла или подключиться к уже существующему в операционной системе экземпляру Automation-объекта. Пример работы с книгой программы Microsoft Excel приведен в лис- тинге 18.115. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Automation). Листинг 18.115. Пример работы с книгой Excel Путь= Сообщение = Новый СообщениеПользователю(); Документ = ПолучитьСОМОбьект(Путь + ”data.xls"); НомерЛиста = 1; Контрагент = Документ.8Ьее1в(НомерЛиста).Се11в(1,1 ).Value; // Дальнейшая обработка данных шапки документа. НомерСтроки=3; Номер = Документ.8Ьее1в(НомерЛиста).Се11в(НомерСтроки, 1).Value; Пока СокрЛП(Номер) <> Т Цикл Номенклатура = Документ.8Ьее(в(НомерЛиста).СеПв(НомерСтроки, 2).Value; Цена = Документ.8Ьее(в(НомерЛиста).СеПв(НомерСтроки, 3).Value; Сообщение.Тексг = Номенклатура + + Строка(Цена); Сообщение.Сообщить(); Том 2
ВнешнёеТсоединениё // Дальнейшая обработка данных табличной части документа. НомерСтроки = НомерСтроки +1; Номер = Документ.ЗЬее15(НомерЛиста).Се11е(НомерСтроки, 1).Value; КонецЦикла; // Завершение работы. Документ.АррНсаИоп.ОиКО; Следует отметить, что для завершения работы с объектами Microsoft Office, имеющими метод Quit(), его желательно вызывать в явном виде. ВНЕШНЕЕ СОЕДИНЕНИЕ Основная задача, решаемая с помощью внешнего соединения, — обеспе- чение надежного и быстрого программного доступа к данным системы «1С:Предприятие» из внешних приложений. В общем и целом работа с системой «1С:Предприятие» через внешнее соединение подобна работе с системой «1С:Предприятие» в режиме Automation-сервера. Основные отличия заключаются в следующем: в случае Automation-сервера запускается полноценное приложение «1С:Предприятия», а в случае внешнего соединения запускается отно- сительно небольшой внутрипроцессный СОМ-сервер; при работе через внешнее соединение недоступны функциональные возможности, так или иначе связанные с организацией пользователь- ского интерфейса системы «1С:Предприятие»; при работе через внешнее соединение не используется модуль приложения конфигурации «1С:Предприятия». Его роль при работе с внешним соединением играет модуль внешнего соединения. При использовании внешнего соединения для доступа к данным системы «1С:Предприятие» имеются следующие преимущества по сравнению с использованием Automation-сервера: более быстрая установка соединения, так как не требуется создания отдельного процесса операционной системы, а все действия произво- дятся в рамках вызывающего процесса; более быстрое обращение к свойствам и методам объектов системы «1С:Предприятие», так как для организации обращения не требуется организации межпроцессной коммуникации; меньший расход ресурсов операционной системы. Для организации доступа к данным системы «1С:Предприятие» через внешнее соединение выполняется следующая последовательность дейс- твий: создается менеджер COM-соединений, с помощью которого произво- дится установка соединения;
I ГлаваН 84 И нтёграция[сУдругими1информациЬнн£|ми[систёмами через полученный объект внешнего соединения производится обра- щение к допустимым методам, свойствам и объектам базы данных, с которой установлено соединение. Поставим задачу загрузить данные из листа программы Microsoft Excel в базу данных «1С:Предприятия» (посредством механизма СОМ). В листе данные расположены так же, как и в предыдущем примере (см. рис. 18.19). Признаком конца табличной части является наличие в колонке «Номер» символа «#». Пример кода приведен в листинге 18.116. Листинг 18.116. Пример чтения данных из листа Excel Sub СОМ() Dim trade As Object Dim Элемент As Object Set obj = CraateObject("V82.COMConnector'’) Set trade = obj.Connect ("File=""c:\lnfoBases\Trade"';Usr=""DirectoiJ"';") Rem создаем документ Set Документ = 1гаЬе.Документы.РасходнаяНакладная.СоздатьДокумент() Rem получаем данные из листа Set Контрагент = (гаЬе.Справочники.Контрагенты. НайтиПоНаименованию(Арр1юа(юп.Се115(1,2).Value) НомерДокумента = Application.Cells(2,2).Value Дата = Application.Cells(3,2). Value Rem записываем полученные данные в документ Документ.Контрагент = Контрагент Документ.Дата = Дата Документ.Номер = НомерДокумента Номер = 6 ‘Первая строка табличной части НомерСтроки = Application.Cells(HoMep, 1). Value Rem в последней строке табличной части будет символ # While НомерСтроки <> "#" Rem получаем данные из листа Set Номенклатура = Ьабе.Справочники.Номенклатура. НайтиПоНаименованию(АррНса(юп.Се11з(Номер, 2).Value) Количество = Application.Cells(HoMep, 5).Value Цена = Application.Cells(HoMep, 6).Value Сумма = Application.Cells(HoMep, 7). Value Rem записываем полученные данные в строку табличной части Set Строка = Документ.Товары.Добавить() Строка.Номенклатура = Номенклатура Строка.Количество = Количество Строка.Цена = Цена Строка.Сумма = Сумма Номер = Номер +1 НомерСтроки = Application.СеНз(Номер, 1). Value Wend Документ.Записать End Sub
В данном примере запускается и инициализируется конфигурация «1С:Предприятия» с базой данных в каталоге c:\lnfoBases\Trade. Далее создается экземпляр документа Расходнаянакладная. Из листа извле- каются данные документа и записываются в объект «1С:Предприятия». В конце алгоритма документ сохраняется. Обязанности модуля приложения при работе через внешнее соединение выполняет модуль внешнего соединения. Данный модуль может иметь процедуры-обработчики событий, в которых могут быть размещены действия, выполняемые при инициализации и завершении соединения соответственно. Процедуры, функции и глобальные переменные, определенные в модуле внешнего соединения с ключевым словом Экспорт, становятся, как и в случае модуля приложения, частью глобального контекста. Внешнее соединение с информационной базой «1С:Предприятия» предо- ставляет полный доступ к глобальному контексту и в качестве своих свойств может иметь: системные константы; значения заданных в конфигураторе объектов, доступ к которым осуществляется с помощью менеджеров (например, константы, пере- числения, справочники, документы, журналы документов, отчеты, обработки, планы видов характеристик, планы счетов, планы видов расчета, регистры); переменные, объявленные в модуле внешнего соединения с ключевым словом Экспорт. В качестве своих методов внешнее соединение может иметь: системные процедуры и функции; процедуры и функции модуля внешнего соединения и общих модулей, объявленные с ключевым словом Экспорт. Открытые внешние соединения могут быть сохранены в пуле для их повторного использования, что позволяет экономить ресурсы и уско- рять работу пользователей, которые ранее уже подключались к данной информационной базе. Для управления пулом используются свойства менеджера COM-соединений: MaxConnections, PoolCapacity и PoolTimeout. После создания менеджера COM-соединений используются стандартные значения этих параметров—0. Поэтому пул хотя и есть, но не используется. Чтобы «1С:Предприятие» начало использовать пул, нужно установить значения, отличные от 0. Имеется возможность из системы «1С:Предприятие» обращаться к другой копии «1С:Предприятия» (например, к другой конфигурации) для обмена данными (листинг 18.117). Профессиональная разработка в системе «1С:Предприятие 8»
ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Automation). Листинг 18.117. Пример обращения к другой информационной базе «1С:Предприятия» Путь = ''c:\lnfoBases\Trade"; Пароль = ""; Пользователь = ""; V8 = Новый СОМОбъект("У82.СОМСоппесЬ|л); Попытка Открытие = V8.Connect("File=" + Путь + ";Usr=” + Пользователь + ";Pwd=” + Пароль +";"); Исключение Предупреждение("База данных не открыта!!!"); Возврат; КонецПопытки; МенеджерНоменклатуры = Открытие.Справочники.Номенклатура; НовыйЭлемент = МенеджерНоменклатуры.СоздатьЭлемент(); НовыйЭлемент.Наименование = "Добавлен"; НовыйЭлемент.Записать(); Использование внешнего соединения для интеграции с интернет-приложением В ряде случаев может возникнуть задача организации связи какого-либо интернет-приложения (например, интернет-магазина) с базой системы «1С:Предприятие». Это может быть обусловлено необходимостью полу- чения текущих остатков на складе, регистрации заказов и т. д. Архитектура веб-приложений может быть различной, но в рамках данного раздела будем рассматривать вариант, в котором приложение состоит из двух частей: набор HTML, ASP-документов, находящихся в определенном вирту- альном каталоге; база данных, в которой находятся отображаемые данные и данные, вводимые пользователями. Клиент, используя специальную программу (следует отметить, что очень часто под «клиентом» понимается именно программа, отсылающая запрос, а не пользователь), посылает запрос на просмотр интересующего его ресурса. Этот ресурс находится на каком-либо сервере, под управ- лением специального программного обеспечения (для примера будем рассматривать Microsoft IIS). IIS может работать с так называемыми ASP- документами. Эти документы, как и HTML-документы, представляют Том 2
собой текстовый файл, которому было дано расширение ASP. Основное отличие состоит в том, что ASP документ выполняется на сервере, и клиенту отсылается результат выполнения. Само «выполнение» возможно благодаря тому, что «asp» документ в общем случае представ- ляет собой скрипт (описание команд на выполнение). Для написания скриптов используются две конструкции: <% код скрипта %> или набор тегов <script language= "имя языка" runat= "server" > и </script>. Первая конструкция используется для написания кода на первичном языке, вторая - на указанном в параметре language. На одной странице может быть несколько скриптовых конструкций. Порядок их выполнения довольно сложный. Для облегчения отслежи- вания порядка выполнения скриптов рекомендуется в конструкциях <script> помещать определение процедур, функций и вызывать их при использовании тегов <°/о°/о>. Только таким образом можно обеспечить однозначность последовательности исполнения скриптов. Для указания странице языка по умолчанию используется директива <%@ 1А1\1С11АСЕ=ИмяЯзыка%>, для указания кодовой страницы исполь- зуется директива CODEPAGE и т. п. Из текста скрипта (документа ASP) можно создавать различные объекты, в том числе использовать внешнее соединение с базой «1С:Предприятия», обращаться к специально определенным процедурам и т. д. Общая схема работы представлена на рис. 18.20. Рис. 18.20. Общая схема рассматриваемого примера Клиент производит запрос ASP-документа. IIS получает этот запрос, выполняет данный документ. В процессе выполнения создается подклю- чение (через внешнее соединение) к «1С:Предприятию», и, к примеру, выполняется функция, описанная в модуле внешнего соединения. При выполнении формируется HTML-документ (или XML, который потом преобразуется в HTML). Сформированный документ возвращается как результат выполнения функции в IIS. IIS, в свою очередь, «передает» ответ на запрос клиенту. Важно понимать, что языки скриптов — это отдельные языки, требующие дополнительного изучения.
Глава418ЯЙнтеграция[сУдругими[информационн£|ми[системами Средства интернет-сервера В контексте ASP-документов помимо объектов, определяемых выбранным языком скриптов, существует шесть дополнительных объектов, которые предоставляют дополнительные возможности при работе с интернет-при- ложением. Это следующие объекты: Application - с помощью данного объекта можно управлять всем прило- жением, создавать видимые во всем приложении объекты; Objectcontext — для введения или снятия транзакции; Request - для приема данных. Поддерживает следующие методы: □ Form () — прием данных, отосланных формой методом Post; □ QueryString() — прием данных, отосланных формой методом Get; □ Cookies(); Response — для вывода данных. Поддерживает следующие методы и свойства: □ Write() - вывод данных (часто HTML-текст) в формируемый доку- мент; □ CacheControl - контроль кеширования; □ Charset кодовая страница; Server - объект, позволяющий управлять определенными параметрами сервера. Поддерживает метод CreateObject(); Session - объект, позволяющий работать с текущей сессией. Подде- рживает метод SessionlD — получение идентификатора сессии. В данном перечне содержатся далеко не все свойства и методы объектов, поддерживаемых IIS. В задачу данного раздела их подробное рассмотрение и не входит. В рамках следующего материала будет использоваться только метод Write() объекта Response. Например, использование конструкции Response.Write("<b>nepBoe</b>") приведет к появлению в результиру- ющем документе слова Первое, выделенного полужирным шрифтом. Пример использования В этом примере используется демонстрационная конфигурация «Интег- рация с другими информационными системами, пример 2», которая находится на приложенном к книге компакт-диске. После установки шаблона этой конфигурации в каталог шаблонов будут скопированы все *.asp и *.xsl файлы, используемые в этом примере. Расположение каталога шаблонов на вашем компьютере можно посмот- реть из режима Конфигуратор: Конфигурация - Поддержка - Шаблоны конфигураций и обновлений... Файлы будут находиться в этом каталоге в папке 1c\82integration\comconnector.
ВНИМАНИЕ! Чтобы приведенный ниже пример использования заработал, нужно соблюдать следующие условия расположения файлов: 1. При установке базы из шаблона "Пример внешнего соединения" ее нужно поместить в каталог c:\InfoBases\Trade, или же поменять путь к базе в *.asp файлах. 2. *.xsl файлы нужно поместить в каталог c:\InfoBases\Xsl, или же поменять путь к файлам XSL преобразований в *.asp файлах. 3. *.asp файлы нужно поместить в корневой каталог веб-сервера, например, c:\Inetpub\wwwroot. В каталоге, являющемся корневым для нашего Web-сервера, разместим два ASP-документа. Документ default.asp будет стартовым файлом веб-ресурса (листинг 18.118). Листинг 18.118. Документ default.asp <%@ Language=javascript %> <html> <head> <tifle>Ham web site</title> <meta name="GENERATOR" content=" Microsoft FrontPage 5.0"> <meta http-equiv-'Content-Type" content="text/html"> «script id="dientEventHandlersJS" language="javascript"> function bbut_click() ^alert("Dont strike this button!") } </script> </head> «body BGCOLOR="#99ffff" TEXT="#990033"> «form ID="Form1"> <h1 аНдп="сеп(ег">Демонстрация Web-сервера на базе внешнего соединения "1С:Предприятия".«/Ь1> <р align="center"> «а href="reflist.asp"> «font size-5">Справочники«/Л>п(> </а> </р> </fbrm> </body> </html> Файл reflist.asp при обращении к нему (вызывается из файла по умолчанию) возвращает имена всех справочников, определенных в конфигурации (листинг 18.119). Листинг 18.119. Файл reflist.asp <%@ Language=javascript %> «% entConn = newActiveXObject("V82.COMConnector"); conn = entConn.connect("File=c:/lnfoBases/Trade"); сопп.КатапогХЗЬПреобразований = "c:/lnfoBases/xsl"; Response.Write(conn.getRefList()); Профессиональная разработка в системе «1С:Предприятие 8»
Корневой каталог веб-сервера определяется в свойствах веб-сервера по умолчанию в оснастке Internet Information Services (свойство Local Path), рис. 18.21. Рис. 18.21. Установка корневого каталога веб-сервера В данном документе (см. листинг 18.119) производится создание СОМ- объекта «1С:Предприятия», подключение к информационной базе. Производится установка экспортной переменной модуля внешнего соеди- нения (определяется путь к файлам XSL преобразований). Вызывается функция getRefList(), которая возвращает HTML-текст, включаемый с помощью метода Write() в ответ сервера клиенту. В информационной базе, которая выступает в качестве СОМ-сервера для веб-приложения, в модуле внешнего соединения необходимо опреде- лить следующий текст (листинг 18.120). Листинг 18.120. Фрагмент модуля внешнего соединения Перем КаталогХЗШреобразований Экспорт; // Получить список справочников в формате XML и преобразовать его к HTML // при помощи XSL-трансформации. Функция getRefList() Экспорт РезультатХМб = Писатель = Новый XMLWriter; Писатель.УстановитьСтроку(); Писатвль.ЗаписатьОбъяалениеХМЦ); Том 2
ВнешнёеТсоединениё Писатель.ЗаписатьНачалоЭлемента("ге(егепса8"); Счетчик=1; Для Каждого Спр Из Метаданные.Справочники Цикл Писатель.ЗаписатьНачалоЭлемента("ге(егепсе"); Писатвль.ЗаписатьНачалоЭлемента("питЬег"); Писатель.ЗалисатьТекст("” + Счетчик); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьНачалоЭлемента("пате"); Писатель.ЗалисатьТекст("” + Спр); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьКонецЭлемента(); Счетчик = Счетчик +1; КонецЦикла; Писатель.ЗаписатьКонецЭлемента(); РезультатХМЬ = Писатель.3акрыть(); Трансформатор = Новый ПреобразованиеХЗЬ; Трансформатор.ЗагрузитьИзФайла(КаталогХ31_Преобразований + '7геА1з(.хзГ); РезультатНТМЬ = Трансформатор. ПреобразоватьИзСтроки(РезультатХМЬ); Возврат РезультатНТМЬ; КонецФункции Чтобы соединение с базой устанавливалось, в файловом варианте работы внешнего соединения нужно дать пользователю, от имени которого работает IIS, права на каталог информационной базы (в нашем случае c:/lnfoBases/Trade). Для этого сначала необходимо открыть в обозревателе диалог Свойства папки и убедиться, что флажок Использовать простой общий доступ к файлам на закладке Вид снят (иначе закладка Безопасность при установке свойств конкретной папки не будет доступна), рис. 18.22. Свойства папки I— НИ Общие Вид | Типы Файлов | Автономные Файлы | _ Представление палок------------------------------------ Можно применить вид. выбранный для этой лагни, I например, "Таблица" или "Плитка**, ко всем пакам. | Применить ко всем папкам ] Сброс для веек папок Дополнительные параметры _________ Ir^i Файлы и папки * в Автоматический поиск сетевые папок и принтеров □ Восстанавливать прежние окна папок при входе в систем в 1ыводигь полный путь в панели аореса □ В ыводигь полный путь в строке заголовка — {“□Использовать простой общий доступ к Файлам (рекомеф ^У’ПТкэшиоовагьэскизы О Открывать каждую палку в отдельном окне □ 1тображвть "Панель управления" в палке "Мой компыот в 1тображеть описание для папок и элементов рабочего г 1 PI Отображать простой вид папок в списке папок "Проводу^ Восстановить умолчания | ОК | Отмена | Применить Рис. 18.22. Диалог обозревателя «Свойства папки»
I ГлаваН 84 И нтёграция[сУдругими1информациЬнн£|ми[систёмами Затем нужно открыть свойства той папки, где находится информационная база, на закладке Безопасность добавить пользователя, от имени которого работает IIS, и установить ему флажок прав Полный доступ (рис. 18.23). Свойства: Trade Г?Тх1 Общие | Доступ Безопасность | Доступ через веб | Настройка | Группы или пользователи: fij SYSTEM б USER (ELENA4USER) (£ Администраторы 1Е1£№ЛАдм>«истраторы1 <5 Пользователе (ЕЬЕМЦПольэователм) УI Разрешения для Гостевая учетная запись Интернета Добавить... Удалить Разрешить Заметить Чтобы задать особые разрешения или параметры, нажмите эту кнопку: Дополнительно OK j Отмена I Применить Рис. 18.23. Свойства папки информационной базы Файл стиля, используемого для проведения преобразования (файл reflist.xsl), показан в листинге 18.121. Листинг 18.121. Файл reflist.xsl <?xml version-'1.0'?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0”> <xsl:template match="references"> <html> <head> <meta name="GENERATOR" content="Microsoft Frontpage 5.0" charset="windows-12517> <meta http-equiv="Content-Type" content="text/html" /> <title>List of References.</title> </head> <body BGCOLOR="#FFFFFF" TEXT=”#000000"> <fbrm ID="Formr> <H1 align="center">References from database.</H1> <table width=,,100%" border=”1” cellpadding="O" cellspacing-'I''* <tr align="center"> <td> <font size="5">Reference name</fbnt> </td> </tr> <xsl:apply-templatesselect="raference7> </table> </fbrm> </body> </html> </xsl:template> <xsl:template match=”reference">
<tr align="centeH> <td> <a hrei="rafone.asp?key={number}"> <xsl:value-of select="name7> </a> </td> </tr> </xsl:template> </xsl:stylesheet> Преобразование, выраженное через XSLT, описывает правила преобра- зования исходного дерева XML-документа в конечное дерево другого документа. Преобразование строится путем сопоставления образцов и шаблонов. Образец сравнивается с элементами исходного дерева, а шаблон используется для создания частей конечного дерева. Структура конечного дерева может полностью отличаться от структуры исходного дерева. В ходе построения конечного дерева элементы исход- ного дерева могут подвергаться фильтрации и переупорядочиванию, также может быть добавлена новая структура. Разберемся в представленном механизме поэтапно. В результате работы объекта Писатель получаем XML-документ следую- щего вида (листинг 18.122). Листинг 18.122. Пример XML-документа <?xml version="1.0"?> <references> <reference> <number>1</number> <пате>Номенклатура</пате> </raference> <reference> <number>2</number> <пате>Контрагенты</пате> </referenca> </raferencas> Изначально из файла стиля выбирается шаблон для корневого элемента XML-документа (можно сказать, что он размещается пока в пустом конечном документе), листинг 18.123. Листинг 18.123. Шаблон для корневого элемента XML-документа <html> <head> <meta name=”GENERATOR" content="MicroBoft FrontPage 5.0” charset=”windows-125T' l> <meta http-equiv=”Content-Type' content="text/html" /> <title>List of references.</title> </head> <body BGCOLOR=”#FFFFFF" TEXT="#000000"> <fbrm ID-'Formr> <H1 align-'center">References from database.</H1> <table width=n100%" border="T' callpedding="O" cellspadng=T> <tr align- 'center"* <tdxfont size="5">Reference name</fbnt></td> </tr> Профессиональная разработка в системе «1С:Предприятие 8»
<xsl:apply-templates select="reference7> </table> </fbrm> </body> </html> Далее полученный документ анализируется, и в отведенное место (вместо <xsl:apply-templates select="reference"/>) записывается шаблон для узла reference. Результат представлен в листинге 18.124. Листинг 18.124. Результат после записи шаблона <html> <head> <meta name="GENERATOR" content=”Microsoft Frontpage 5.0” charset=”windows-1251" /> <meta http-equiv=”Content-Type" content-’text/html" /> <title>List of references.</title> </head> <body BGCOLOR=”#FFFFFF" TEXT="#000000”> <fbrm ID="Form1"> <H1 align="center">References from database.</H1> <table width="100%'1 border=T cellpadding-'O" callspacing='T> <tr align-'center"> <td> <font size- '5">Reference name</fbnt> </td> </tr> <tr align=“canter"> <td> <a href=''refone.asp?key={number}"> <xsl:value-of select="name'7> </a> </td> </tr> <tr align-'center11* <td> <a href=”refbne.asp?key={number}“> <xsl:value-of select="name7> </a> </td> </tr> </table> </fbrm> </body> </html> После полного применения преобразования получаем конечный HTML- документ (листинг 18.125). Листинг 18.125. Конечный HTML-документ <html> <head> <meta name="GENERATOR” content=”Microsoft Frontpage 5.0" charset=”windows-1251" /> <meta http-equiv="Content-Type" content-'text/html” /> <title>List of references.</title> </head> <body BGCOLOR=”#FFFFFF” TEXT="#000000”> <form ID="FormT'> <H1 align="center">References from database.</H1> <table width=”100%” border='1” cellpadding="O" callspacing=T> Tom 2
ВнешнёеТсоединениё <tr align="center"> <td> <font size="5“>Referenca name</font> </M> </tr> <tr align-’center"* <td> <ahraf=,'refbne.asp?key=r>HoMeHKnaTypa</a> </td> </tr> <tr align- ’center"* <td> <a href=“refone.asp?key=2">KoHTpareHTbi </a> </td> <ftr> </table> </fbrm> </body> </html> При желании просматривать формы списков каждого справочника в рассматриваемый пример необходимо добавить файл refone.asp (листинг 18.126), разместить в нужном каталоге дополнительный файл стиля refone.xsl (листинг 18.128) и добавить в модуль внешнего соеди- нения функцию getRefOne(), листинг 18.127. Листинг 18.126. Файл refone.asp <%@ Language=javascript %* <% entConn = newActiveXObject("V82.COMConnector"); conn = entConn.connect("File=c:/lnfbBases/Trade"); сопп.КаталогХЗЬПреобразований = "c:/lnfoBases/xsl"; grVal = Request.QueryString(“group”); if (grVal.Count == 0) { var empty; Response.Write(conn.getRefOne(Request.QueryString(''key")(1), empty)); else Response. Write(conn.getRefOne(Request.QueryString(''key")(1), grVal(1))); Листинг 18.127. Функция getRefOne() // Получить список элементов справочника по текстовому представлению // ссылки на родительский элемент. Функция де(ПеЮпе(НомерСправочника, СсылкаНаЗапись) Экспорт СтрокаСоСсылкой = "f"#",’ + СсылкаНаЗапись +"}"; МдСпр = Метаданные.Справочники[Число(НомерСправочника) - 1]; Спр = Справочники[МдСпр.Имя]; Если СсылкаНаЗапись = Неопределено ИЛИ СсылкаНаЗапись ="" Тогда Выборка = Спр.выбрать(Спр.ПустаяСсылка()); Иначе Выборка = Спр.выбреть(ЗначениеИзСтрокиВнутр(СтрокаСоСсылкой)); КонецЕсли; РезультатХМЬ = "; Писатель = Новый XMLWriter; Писатель.УстановитьСтроку();
I ГлаваН 84 И нтеграция[сУдругими1информационн£|ми[системами Писатель.ЗаписатьОбъявлениеХМЦ); Писатель.ЗаписатьНачалоЭлемента("ге(егепсе"); Писатвль.ЗаписатьНачалоЭлемента("пагле"); Писатель.ЗаписатьТекстС" + МдСпр); Писатель.ЗаписатьКонецЭлемента(); Писатвль.ЗаписатьНачалоЭлемента("сос1е"); Писатель.ЗаписатьТекстС" + НомерСправочника); Писатель.ЗаписатьКонецЭлемента(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Писатель.ЗаписатьНачалоЭлемента(”дгоир"); Иначе Писатель.ЗалисатьНачалоЭлемента("|(егл"); КонецЕсли; Писатель.ЗаписатьНачалоЭлемента(ТсГ); СтрокаСоСсылкой = ЗначениеВСтрокуВнутр(Выборка.ссылка); Писатель.ЗаписатьТекст(Сред(СтрокаСоСсылкой, 6, СтрДлина(СтрокаСоСсылкой) - 6)); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьНачалоЭлемента("собе"); Писатель.ЗаписатьТекстС" + Выборка.Код); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьНачалоЭлемента("бевспрбол"); Писатель.ЗаписатьТекст(Выборка.Наименование); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьКонецЭлемента(); КонецЦикла; Писатель.ЗаписатьКонецЭлемента(); РезультатХМЬ = Писатель.3акрыть(); Трансформатор = Новый ПреобразованиеХЗЬ; Трансформатор.ЗагрузитьЙзФайла(КаталогХЗЬПреобразований + 'Vrefone.xsl'1); РезультатНТМЬ = Трансформатор.ПреобразоватьИзСтроки(РезультатХМЬ); Возврат РезультатНТМЬ; КонецФункции Листинг 18.128. Файл стиля refone.xsl <?xml version-'1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0”> <xsl:template match="reference"> <html> <head> <meta name="GENERATOR" content="Microsoft Frontpage 5.0" charset=”windows-125T' /> <meta http-equiv="Content-Type" content="text/html" /> <title>Referenca content.<ftitle> </head> <body BGCOLOR="#FFFFFF" TEXT=”#000000"> <fbrm ID="Formr> <xsl:apply-templates select="name"/> <table width="100%" border=T cellpadding="O" cellspadng='T> <tr align="center"> <td><fbnt size="5”>Code</font></td> <td><fbnt size-,5">Name</fbnt></td> </tr> <xsl:apply-templates select="group7> <xsl:apply-templates select="item'/> </table> </fbrm> </body> </html> </xsl:template>
<xsl:template match-'name"> <H1 align=”canter">Referanca: <xsl:value-of select=".7></H1> </xsl:template> <xsl:template match-'group"> <tr align-'center1'* <td> <a href=”refone.asp?key={../code}&amp;group={id)',> <fdnt size-'4”><xsl:value-of select=”code7></fbnt> </a> </td> <td> <a href=”refone.asp?key={../code}&amp;group={id},'> <fdnt size-'4”> <xsl:value-of select=”description7> </fbnt> </a> </td> </tr> </xsl:template> <xsl:template match-'item"> <tr align="center”> <td> <ahref=”refitem.asp?key={../code)&amp;item={id}”> <xsl:value-of select="code"/> </a> </td> <td> <a href=”refitem.asp?key={../code}&amp;item={id}”> <xsl:value-of select=''description'/> </a> </td> </tr> </xsl:template> </xsl:stylesheet> Механизм работы добавленных файлов такой же, как и ранее рассматри- ваемый. При желании просматривать содержимое элемента каждого справоч- ника в рассматриваемый пример необходимо добавить файл refltem.asp (листинг 18.129), разместить в нужном каталоге дополнительный файл стиля refitem.xsl (листинг 18.131) и добавить в модуль внешнего соеди- нения функцию getRefItem(), листинг 18.130. Листинг 18.129. Файл refitem.asp <%@ Language=javascript %> <% entConn = new ActjveXObject("V82.COMConnector"); conn = entConn.connect("File=c:/lnfoBases/Trade"); сопп.КаталогХЗЬПреобразований = "c:/lnfoBases/xsl" Response.Write(conn.getRefltem(Request.QueryString(”key,,)(1), Request.QueryString("iteml,)(1))); %> Листинг 18.130. Функция getRefltem() // Получить значения всех реквизитов и табличных частей одного элемента // справочника по текстовому представлению ссылки на него. Функция getRefltem(H0MepCnpaB04HHKa, СсылкаНаЗапись) Экспорт МдСпр = Метаданные.Справочники[Число(НомерСправочника) -1]; СтрокаСоСсылкой = "fW”,’ + СсылкаНаЗапись + Профессиональная разработка в системе «1С:Предприятие 8»
Запись = ЗначениеИзСтрокиВнутр(СтрокаСоСсылкой); РезультатХМЬ =""; Писатель = Новый XMLWriter; Писатель.УстановитьСтроку(); Писатель.ЗаписатьОбьявлениеХМЦ); Писатвль.ЗаписатьНачалоЭлементаС'Иет"); Писатвль.ЗаписатьНачалоЭлемента("пате"); Писатель.ЗаписатьТекст(Запись.Наименование); Писатель.ЗаписатьКонецЭлемента(); Писатвль.ЗаписатьНачалоЭлемента("ргор"); Писатель.ЗаписатьНачалоЭлемента("пате"); Писатель.ЗаписатьТекст("Код"); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьНачалоЭлемента(Л/а1ие”); Писатель.ЗаписатьТекст("" + Запись.Код); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьКонецЭлемента(); Писатвль.ЗаписатьНачалоЭлемента(”ргор"); Писатель.ЗаписатьНачалоЭлемента("пате"); Писатель.ЗаписатьТекст("Наименование"); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьНачалоЭлемента("уа1ие"); Писатель.ЗаписатьТекст(Запись.Наименование); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьКонецЭлемента(); Для Каждого Рекв Из МдСпр.Реквизиты Цикл Писатель.ЗаписатьНачалоЭлемента(”ргор"); Писатель.ЗаписатьНачалоЭлемента("пате”); Писатель.ЗаписатьТекстС" + Рекв); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьНачалоЭлемента(\а1иеп); Писатель.ЗаписатьТекстС" + Запись[Рекв.Имя]); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьКонецЭлемента(); КонецЦикла; Для Каждого МдТч Из МдСпр.ТабличныеЧасти Цикл Писатель.ЗаписатьНачалоЭлемента(ТаЫеТ Писатель.ЗаписатьНачалоЭлементаС'пате"); Писатель.ЗаписатьТекстС” + МдТч); Писатель.ЗаписатьКонецЭлемента(); Писатель.ЗаписатьНачалоЭлементаСЪеабег'1); Для Каждого МдРеквТч Из МдТч.Реквизиты Цикл Писатель.ЗаписатьНачалоЭлементаГпате"); Писатель.ЗаписатьТекстС” + МдРеквТч); Писатель.ЗаписатьКонецЭлемента(); КонецЦикла; Писатель.ЗаписатьКонецЭлемента(); Тч = Запись[МдТч.Имя]; Для Каждого ЗаписьТч Из Тч Цикл Писатель.ЗаписатьНачалоЭлементаСгесопГ); Для Каждого МдРеквТч Из МдТч.Рекаизиты Цикл Писатель.ЗаписатьНачалоЭлементаСУа1ие”); Писатель.ЗаписатьТекстС" + ЗаписьТч[МдРеквТч.Имя]); Писатель.ЗаписатьКонецЭлемента(); КонецЦикла; Писатвль.ЗаписатьКонецЭлемента(); КонецЦикла; Писатель.ЗаписатьКонецЭлемента(); КонецЦикла; Писатель.ЗаписатьКонецЭлементаО; РезультатХМЬ = Писатель.3акрыть(); Тренсформатор = Новый ПреобразованиеХЗЬ; Трансформатор.ЗагрузигьЙзФаила(КаталогХЗЬПреобразований + 7геТ|1ет.хвГ); РезультатНТМк = Трансформатор. ПреобразоватьИзСтроки(РезультатХМЬ); Возврат РезультатНТМЬ; КонецФункции Том 2
ВнешнёеТсоединениё Листинг 18.131. Файл стиля refltem.xsl <?xml version-'1.0"?> <xsl: stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transfbrm” version="1.0"> <xsl:template match="item”> <html> <head> <meta name="GENERATOR” content='Microsoft Frontpage 5.0" charset=''windows-125r /> <meta http-equiv-'Content-Type” content="text/html" /> <title>Reference item.</title> </head> <body BGCOLOR-'#FFFFFF' TEXT="#000000"> <xsl:apply-templates select="name" mode=”doc'7> <table width="100%” border="0" cellpadding='O" cellspadng=T> <tr align-left” bgcdor=”#FFFF77"> <td><fbnt size-'5”>Prop</font></td> <td><fbntsize-'5”>Value</font></td> </tr> <xsl:apply-templates select=”prop7> </table> <xsl:apply-templatesselect="table/> </body> </html> </xsl:template> <xsl:template match="name" mode=”doc”> <H1 aiign="center"><xsl:value-of select='.7></H1> </xsl:template> <xsl:template match="name" mode=”tbl"> <H2 аидп="сеп(ег">ТаЫе: <xsl:value-of select=".7></H2> </xsl:template> <xsl:template match="name" mode=”pro"> <td><font size="4"><xsl:value-of select-'."/></fbnt></td> </xsl:template> <xsl:template match="prop”> <tr align- 'left"> <td><xsl:value-ofselect="name7></td> <td><xsl:value-of select=”value7></td> </tr> </xsl:template> <xsl:template match="table"> <xsl:apply-templates select=”name” mode=”tbr7> <table width="100%" border='T cellpadding="0" cellspadng="1"> <xsl:apply-tem plates select="header7> <xsl:apply-tem plates select=”record7> </table> </xsl:template> <xsl:template match="header"> <tr align-’center" bgcolOF”#FFFF77"> <xsl:apply-templates select="name" mode-'pro7> </tr> </xsl:template> <xsl:template match="record"> <tr align=”left"> <xsl:apply-templates select=”value”/> </tr> </xsl:template> <xsl:template matdi="value"> <td><xsl:value-of select=”.7></ld> </xsl:template> </xsl:stylesheet> Механизм работы добавленных файлов такой же, как и ранее рассматри- ваемый.
I Глава?! 84 И нтеграция[сУдругими!информационн£|ми[системами ACTIVEDOCUMENT Технология ActiveDocument предназначена для редактирования доку- ментов внешними по отношению к «1С:Предприятию» редакторами. Эта технология позволяет в режиме Конфигуратор (в пользова- тельском режиме данная особенность недоступна) редактировать документы визуально (например, Word или Excel) непосредственно в окне «1С:Предприятия». При этом элементы пользовательского интерфейса (меню, панели команд и т. д.) заменяются на предоставляемые редактором. Документы могут быть предварительно отредактированы и сохранены в макетах конфигурации, а затем макеты могут использоваться пользова- телями как основы для создания окончательных версий документов. Для добавления в конфигурацию возможности работы с ActiveDocument необходимо для требуемого объекта (например, для документа Расход- наяНакладная) создать новый макет и при этом выбрать соответствующий тип макета (рис. 18.24). Конструктор макета X Имя [ПМИЩ | Синоним: [Договор | Комментарий: [ | - В ыберите тип макета:------------------------------------------- О Т аблмчный документ О Т екстовый документ О Двоичные данные ® Active document О HTML документ О Г«графическая схема О Срафическая схема О Схема компоновки данных О Макет оформления компоновки данных Загрузить из Файла: [С:\Шаблоны\ЗЬаЫоп.бо( |...| [ Готово | | Отмена | | Справка | Рис. 18.24. Конструктор макета Эта технология применяется в случае, когда в конфигурации необходимо хранить данные, редактируемые другим приложением, — такие, например, как шаблоны для факсов или деловых писем, созданные в Microsoft Word, или шаблоны прайс-листов в Microsoft Excel. Такая необходимость возникает, как правило, при регламентировании формата документов (как во внутреннем документообороте, так и при обмене документами со сторонними организациями и клиентами), однако при отсутствии огра- ничений на формат документа рекомендуется использовать существующие в «1С:Предприятии» возможности по оформлению электронных и печатных документов. ^у©
Ниже (листинг 18.132) приведен пример кода, получающего из макета (имеющего тип «Active document») заготовку документа программы Microsoft Word. Имя макета определено как Договор. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной кон- фигурации «Интеграция с другими информационными системами, пример 1», прилагающейся к книге на компакт-диске (обработка Рабо- TaCActiveDocument). Листинг 18.132. Пример использования макета Active Document &НаКлиенте Процедура РедактироватьМакет(Команда) РедактироватьМакетДокумента(); КонецПроцедуры &НаСервереБезКонтекста Процедура РедактироватьМакетДокумента() Договор = Документы.РасходнаяНакладная.ПолучитьМакет(”Договор“); // Получить объект из макета. MSWord = Договор.Получить(); НаименованиеКонтрагента = "ООО Торгуем всем"; НомерДоговора = “333"; ДатаДоговора = Строка(ТекущаяДата()); НаименованиеОрганизации = Константы. Организация. Получигь(); Попытка Документ = MSWord.Application.Documents(l); ДокументАсМеО; // Получить объект, который будем использовать для поиска и замены. Замена = Документ.Соп(еп1Пп<1; // Заменить заранее определенные ключевые конструкции на требуемый текст. Замена.Ехеси(е(”<НазваниеКомпании>", Ложь, Истина, Ложь, Истина, Ложь, + НаименованиеКонтрагента +"""”); Замена = floKyMeHT.Content.Find; Замена.Ехеси(е("<НомерДоговора>", Ложь, Истина, Ложь, Профессиональная разработка в системе «1С:Предприятие 8»
Истина, Ложь, НомерДоговора); Замена = Документ.Соп(еп(.Пп<1; Замена.Ехеси(е("<ДатаДоговора>", Ложь, Истина, Ложь, Истина, Ложь, ДатаДоговоре); Замена = Документ-Content.Find; Замена.Ехеси(е("<Организация>", Ложь, Истина, Ложь, Истина, Ложь, НаименованиеОрганизации); // Далее аналогично для остальных ключевых конструкций. II... II Делаем видимым приложение и активизируем его. MSWord.Application.Visible = Истина; MSWord.Activate(); Исключение // Если произойдет ошибка, выводятся данные об ошибке // и объект закрывается. Сообщение = Новый СообщениеПользователю(); Сообщение.Тексг = ОписаниеОшибки(); Сообщение.Сообщить(); MSWord.Application.Quit(); КонецПопытки; КонецПроцедуры После получения производится поиск специальным образом определенных ключевых фраз и замена их на данные из информационной базы. Том 2
'Active Doc u merit! ВНЕШНИЕ КОМПОНЕНТЫ Технология создания внешних компонентов разработана для решения специальных задач интеграции, в которых требуется тесное взаимодейс- твие между системой «1С:Предприятие» и другими программами. Процесс написания файла внешнего компонента описан в докумен- тации по созданию внешних компонентов. В данном разделе мы не будем касаться их внутреннего устройства, рассмотрим только способы исполь- зования готовых внешних компонентов в системе «1С:Предприятие». Внешние компоненты могут быть созданы по двум технологиям: Native API — рекомендуемая технология, появилась в версии «1С:Предприятие 8.2»; СОМ - старая технология, существовавшая в версиях «1С:Пред- приятие 8.1» и младше. В версии 8.2 она поддерживается для совмес- тимости со старыми компонентами. В зависимости от контекста исполнения могут использоваться внешние компоненты, созданные только по «новой» технологии или по любой из этих технологий: толстый и тонкий клиент могут использовать компоненты, созданные по обеим технологиям; веб-клиент может использовать любые компоненты Native API, а компоненты СОМ только в том случае, если веб-клиент работает в браузере под управлением ОС семейства Windows; на сервере можно использовать только компоненты Native API. Внешний компонент представляет собой файл с расширением dll. Так как «1С:Предприятие» может работать на разных операционных системах с различной разрядностью, разработчикам внешних компонентов реко- мендуется создавать комплект из четырех файлов: для ОС Windows 32 разряда, ОС Windows 64 разряда, ОС Linux 32 разряда, ОС Linux 64 разряда. Эти файлы могут поставляться: в виде ZIP-архива (рекомендуемый способ для толстого клиента и сервера, а для тонкого клиента и веб-клиента — это обязательный способ). Архив включает в себя четыре файла внешних компонентов и файл-манифест, описывающий назначение каждого из компонентов; в виде отдельных файлов. Внешний компонент (либо набор внешних компонентов) может храниться: на диске (только в виде отдельных файлов); в макете «1С:Предприятия», содержащем двоичные данные (в виде отдельных файлов или ZIP-архива); яти
|Глава'118лЙнтеграция[стдругими1инф'ормационнй1ми[системами| в информационной базе в реквизите с типом ХранилищеЗначения (в виде отдельных файлов или ZIP-архива). Ниже мы рассмотрим разные ситуации, в которых требуется подключать внешний компонент. Подключение внешнего компонента в толстом клиенте или на сервере (на примере Native API компонента) Для подключения внешнего компонента на сервере или в толстом клиенте используется метод глобального контекста ПодключитьВнешнююКомпо- ненту(). Разберем примеры подключения внешнего компонента в зависимости от вариантов его хранения. Подключение внешнего компонента из файла на диске (отдельные файлы) Листинг 18.133. Пример подключения внешнего компонента СисИнфо = Новый СистемнаяИнформация; Если СисИнфо.ТипПлатформы = ТипПлатформы.УУюбоиге_х86 Тогда ПодключигьВнешнююКомпоненту("С:\Абб1пСРР.б1Г, "ПроизвольноеИмя", ТипВнешнейКомпоненты.Native); ИначеЕсли СисИнфо.ТипПлатформы = ТипПлатформы.УУюбою5_х86_64 Тогда КонецЕсли; ОбъектКомпоненты = Новый (<,Addln.ПpoизвoльнoeИмя.CompoпentExteпtioп,,); ОбъектКомпоненты.ИмяСвойства =...; В рассмотренном примере (и далее) используются следующие входные данные: ПроизвольноеИмя — произвольное имя, задаваемое разработчиком «1 С:Предприятия»; ComponentExtention - расширение, реализуемое компонентом. Это расширение должно быть описано в документации к этому внешнему компоненту.
Подключение внешнего компонента из макета (ZIP-архив) Листинг 18.134. Пример подключения внешнего компонента ПодключитьВнешнююКомпоненту('Обработка.Компонента.Макет.Абб1п", "ПроизвольноеИмя"); ОбъектКомпоненты = Новый ("Addin.ПроизвольноеИмя.Сотропеп1Ех(еп(юп"); ОбъектКомпоненты.ИмяСвойства = Подключение внешнего компонента из макета (отдельные файлы) Листинг 18.135. Пример подключения внешнего компонента СисИнфо = Новый СистемнаяИнформация; Если СисИнфо.ТипПлатформы = ТипПлатформы.УШошв_х86 Тогда ПодключитьВнешнююКомпоненту("Обработка.Компонента.Макет. AddlnWindows32", "ПроизвольноеИмя", ТипВнешнейКомпоненты.Native); ИначеЕсли СисИнфо.ТипПлатформы = ТипПлатформы.1/У1лбоиге_х86_64 Тогда КонецЕсли; ОбъектКомпоненты = Новый ("Addin.ПроизвольноеИмя.Сотропеп(Ех(еп(юп"); ОбъектКомпоненты.ИмяСвойства =...; Подключение внешнего компонента из базы данных (ZIP-архив) Листинг 18.136. Пример подключения внешнего компонента Ссылка = ПолучитьНавигационнуюСсылку( "Справочники.ВнешниеКомпоненты.НашаКомпонента", "КомпонентаВАрхиве"); ПодключитьВнешнююКомпоненту(Ссылка, "ПроизвольноеИмя"); ОбъектКомпоненты = Новый ("Addin.ПроизвольноеИмя.Сотропеп(Ех(епИоп"); ОбъектКомпоненты.ИмяСвойства =...; Подключение внешнего компонента из базы данных (отдельные файлы) Листинг 18.137. Пример подключения внешнего компонента СисИнфо = Новый СистемнаяИнформация; Если СисИнфо.ТипПлатформы = ТипПлатформы.1Мпбо\л/в_х86 Тогда Ссылка = ПолучитьНавигационнуюСсылку( "Справочники.ВнешниеКомпоненты.НашаКомпонента", "КомпонентаУУтЭб"); ИначеЕсли СисИнфо.ТипПлатформы = ТипПлатформы.1ЛМо*ге_х86_64 Тогда КонецЕсли; ПодключитьВнешнююКомпоненту(Ссылка, "ПроизвольноеИмя", ТипВнешнейКомпоненты.Ыа^е); ОбъектКомпоненты = Новый ("Addin.ПроизвольноеИмя.Сотропеп(Ех(епйоп"); ОбъектКомпоненты.ИмяСвойства =...; Профессиональная разработка в системе «1С:Предприятие 8»
Подключение внешнего компонента в тонком клиенте или в веб-клиенте (на примере Native API компонента) Для подключения внешнего компонента в тонком клиенте или веб-клиенте используются методы глобального контекста ПодключитьВне- шнююКомпонентуО и УстановитьВнешнююКомпоненту(), причем метод УстановитьВнешнююКомпоненту() используется только тогда, когда внешний компонент расположен не на диске. Разберем примеры подключения внешнего компонента в зависимости от вариантов его хранения. Подключение внешнего компонента из файла на диске (отдельные файлы) Данный вариант подключения возможен только в тонком клиенте (листинг 18.138). Листинг 18.138. Пример подключения внешнего компонента СисИнфо = Новый СистемнаяИнформация; Если СисИнфо.ТипПлатформы = ТипПлатформы.1/У1пбоиге_х86 Тогда ПодключитьВнешнююКомпоненту( "C:\AddlnCPP.dll”, "ПроизвольноеИмя", ТипВнешнейКомпоненты.Ма^е); ИначеЕсли СисИнфо.ТипПлатформы = ТипПлатформы.1/У1пбоюв_х86_64 Тогда КонецЕсли; ОбъектКомпоненты = Новый ("Addin.ПроизвольноеИмя.Сотропеп(Ех1епйоп"); ОбъектКомпоненты.ИмяСвойства =...; Подключение внешнего компонента из макета (ZIP-архив) Листинг 18.139. Пример подключения внешнего компонента УстановигьВнешнююКомпоненту("Обработка.Компонента.MaKei.Addln"); ПодключитьВнешнююКомпоненту("Обработка.Компонента.Макет.Абб1п", "ПроизвольноеИмя"); ОбъектКомпоненты = Новый ("Addin.ПроизвольноеИмя.ComponentExtention"); ОбъектКомпоненты.ИмяСвойства =...; Подключение внешнего компонента из базы данных (ZIP-архив) Листинг 18.140. Пример подключения внешнего компонента Ссылка = ПолучитьНавигационнуюСсылку( "Справочники.ВнешниеКомпоненты.НашаКомпонента", "КомпонентаВАрхиве"); УстановитьВнешнююКомпоненту(Ссылка); ПодключитьВнешнююКомпоненту(Ссылка, "ПроизвольноеИмя"); ОбъектКомпоненты = Новый ("Addin.ПроизвольноеИмя.ComponentExtention"); ОбъектКомпоненты.ИмяСвойства =...; Том 2
Внешние1компонент£| WEB-СЕРВИСЫ Механизм Web-сервисов позволяет использовать систему «1С:Пред-при- ятие» как набор сервисов в сложных распределенных и гетерогенных системах, а также позволяет интегрировать ее с другими информацион- ными системами с использованием сервис-ориентированной архитектуры (SOA). Сервис-ориентированная архитектура предлагает новый подход к созданию распределенных информационных систем, в которых програм- мные ресурсы рассматриваются как сервисы, предоставляемые по сети. Конфигурация системы «1С:Предприятие» может экспортировать свою функциональность через Web-сервисы. Web-сервисы определяются в дереве объектов конфигурации и становятся доступны произвольным информационным системам после их публикации на веб-сервере. Кроме того, система «1 С:Предприятие» может обращаться к Web-сервисам сторонних производителей как через статические ссылки на Web-cep- висы, определенные в дереве объектов конфигурации, так и с помощью динамических ссылок на Web-сервисы, создаваемых с помощью встроен- ного языка. В основе сервисной архитектуры системы «1С:Предприятие» находится менеджер сервисов, который выполняет следующие функции: управление пулом соединений с информационными базами; поддержка WSDL описаний сервиса; реализация протокола SOAP, сериализация сообщений, вызов соот- ветствующего сервиса. Предоставление функциональности через Web-сервисы Чтобы функциональность системы «1С:Предприятие» стала доступной внешним потребителям Web-сервисов, необходимо выполнить следу- ющие действия: создать в конфигурации необходимые Web-сервисы; опубликовать эти Web-сервисы на веб-сервере с помощью специаль- ного инструмента конфигуратора (Администрирование ► Публикация на веб-сервере...). ПОДРОБНЕЕ Этот процесс подробно описан в документации «1 (^Предприятие 8.2. Руководство администратора».
ГлаваУ18ЯЙнтеграция[сУдругими1Йнф~ормационн£|ми[системами Для создания Web-сервиса нужно: добавить в дерево конфигурации объект WebCepenc и описать основные свойства этого объекта: □ URI пространства имен. Каждый Web-сервис может быть однозначно идентифицирован по своему имени и URI пространства имен, кото- рому он принадлежит; □ Пакеты XDTO. Содержит перечень пакетов XDTO, типы которых могут использоваться для описания типов параметров и возвраща- емых значений Web-сервиса; □ Имя файла публикации. Содержит имя файла описания Web-cep- виса, который расположен на веб-сервере; описать операции, которые может выполнять данный Web-сервис. Основные свойства операций: □ Тип возвращаемого значения. Содержит тип значения, которое возвращает операция Web-сервиса. Может являться типом значения XDTO или типом объекта XDTO; □ Возможно пустое значение. Показывает, может ли значение, возвра- щаемое операцией, принимать неопределенное значение; □ Имя метода. Содержит имя экспортируемой процедуры, располо- женной в модуле Web-сервиса, которая будет выполняться при его вызове; описать параметры выполняемых операций. Основные свойства пара- метров: □ Тип значения. Содержит тип значения параметра операции Web-cep- виса. Может являться типом значения XDTO или типом объекта XDTO; □ Возможно пустое значение. Показывает, может ли параметр операции принимать неопределенное значение; □ Направление передачи. Определяет направление передачи данных с помощью параметра. Входной параметр используется для передачи данных Web-сервису; Выходной — для получения данных от Web- сервиса; Входной-выходной может использоваться как для передачи данных, так и для их получения от Web-сервиса; создать модуль Web-сервиса и разработать в нем операции, определя- ющие его функциональность. Объект конфигурации WebCepenc содержит модуль, в котором создаются процедуры на встроенном языке, выполняемые при вызове тех или иных операций Web-сервиса. Типы параметров и возвращаемых значений этих операций описываются с помощью типов XDTO и могут представлять собой либо значения XDTO, либо объекты XDTO.
Использование XDTO для описания типов параметров и возвращаемых значений Web-сервисов Механизм XDTO представляет собой гибкое средство моделирования данных, которое широко используется в технологии Web-сервисов «1 (/Предприятия». Механизм XDTO позволяет определять объекты переноса данных, которые могут образовывать строгую иерархию и сериализоваться в XML. Эти свойства позволили использовать объекты XDTO в качестве пара- метров и возвращаемых значений операций Web-сервисов. Основным понятием, на котором строится механизм XDTO, явля- ется фабрика XDTO. Фабрика XDTO содержит описание всех типов, с которыми оперирует система. В частности, при создании новой инфор- мационной базы «1С:Предприятия» автоматически создается глобальная фабрика XDTO, которая описывает все типы, используемые в конфи- гурации. Эта фабрика доступна через свойство глобального контекста ФабрикаХОТО. Серверная часть Web-сервиса может использовать глобальную XDTO фабрику для создания объектов и значений Web-сервиса. Все типы данных XDTO подразделяются на типы-значения и типы-объ- екты. Типы-значения позволяют определять простые типы, например, строки, числа, даты, булевы значения и т.д. Типы-объекты позволяют определять сложные типы, такие как структуры и массивы. ТипЗначенияХОТО и ТипОбъектаХЭТО однозначно идентифицируются двумя свойствами — именем типа и URI пространства имен, которые обра- зуют уникальный идентификатор типа. Рассмотрим более подробно, как задавать с помощью XDTO некоторые характерные типы. Строки Строки моделируются типами-значениями. Строковый тип имеет имя: {http://www.w3.org/2001/XMLSchemaJstring. В фигурных скобках здесь задается пространство имен типа. Для создания строкового значения нужно выполнить следующий фрагмент кода (листинг 18.141). Листинг 18.141. Пример создания значения строкового типа строковыйТип = 0a6pnKaXDTO.Tnn("http://www.w3.org/2OO1/XMLSchema", "string"); значение = ФабрикаХОТО.Создать(строковыйТип, "Hello world!!!”); Строка при передаче представляется в виде текста XML-тега (листинг 18.142). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 18.142. Фрагмент XML-документа <param>Hello world</param> | Следует учесть, что строки конвертируются в UTF-8 при сериализации. Целые числа Целые числа моделируются типами-значениями. Целочисленный тип имеет имя: {http://www.w3.org/2001/XMLSchemaJint. Для создания цело- численного значения нужно выполнить следующий фрагмент кода (листинг 18.143). Листинг 18.143. Пример создания значения целочисленного типа целыйТип = 0a6pnKaXDTO.Tnn("http://www.w3.org/2OO1/XMLSchema", "int”); значение = ФабрикаХРТО.Создать(целыйТип, 10); Число при передаче представляется в виде текста XML-тега (листинг 18.144). Листинг 18.144. Фрагмент XML-документа <param>10</param>| Аналогично с другими простыми типами. ПОДРОБНЕЕ Раздел «XML-сериализация. Простые типы», стр. 430. Структуры Перед тем как использовать структуру, необходимо создать пакет XDTO, описывающий тип-объект структуры. Для этого используются средства визуального конструирования, позволяющие добавлять пакеты XDTO в ветку дерева объектов конфигурации Общие ► XDTO-пакеты. Пакет XDTO содержит описание некоторого множества типов, принадле- жащих одному пространству имен — пространству имен пакета. Структуры моделируются типами-объектами. Тип-объект может содер- жать свойства, которые соответствуют элементам структуры. Каждое свойство характеризуется уникальным именем и типом. Тип свойства может быть как типом-значением, так и типом-объектом. Например, для создания структуры Номенклатура из демоконфигурации «Web-сервисы» (ИТС) нужно выполнить следующий фрагмент кода (листинг 18.145). Том 2
LWeblcepBHcGi Листинг 18.145. Пример создания объекта структурного типа структурныйТип = 0a6pnKaXDTO.Tnn("http://www.1c.ru/demos/products", "Номенклатура"); номенклатура = ФабрикаХОТО.Создать(структурныйТип); номенклатура.Наименование = "Ботинки женские"; номенклатура.ЗакулочнаяЦена = 1000; Структура при передаче представляется в виде XML-структуры (листинг 18.146). Листинг 18.146. Фрагмент XML-документа «Номенклатура xmlns='http://www.1c.ru/demos/products"> «Наименование*Ботинкиженские«/На именование* «Закупочная Цена>1000«/ЗакупочнаяЦена* «/Номенклатура* Массивы Массивы моделируются свойствами типов-объектов. Тип массива нельзя создать напрямую, но на определенном свойстве типа-объекта можно указать минимальное и максимальное количество элементов массива. Если оба значения равны 1, то это единичное свойство; если максимальное количество больше 1, то множественное свойство; если же максимальное количество равно -1, то количество элементов массива неограниченно. Свойства-массивы реализованы в XDTO через СписокХЭТО. Например, для создания массива элементов номенклатуры, определенного в свойстве Элементы структуры НоменклатураГруппа, из демоконфигу- рации «Web-сервисы» (ИТС) нужно выполнить следующий фрагмент кода (листинг 18.147). Листинг 18.147. Пример создания массива объектов структурного типа структурныйТип = 0a6pHKaXDTO.Tnn(,,http://www.1c.ru/demos/products“, “НоменклатураГруппа"); номенклатураГруппа = ФабрикаХОТО.Создать(структурныйТип); номенклатура.Элементы.Добавить(номенклатура); Массив при передаче представляется в виде XML-структуры (листинг 18.148). Листинг 18.148. Фрагмент XML-документа «НоменклатураГруппа xmlns="http://www.1c.ru/demos/products"> «Элементы* <Наименование*Ботинкиженские«/Наименование> <ЗакупочнаяЦена*1000«/ЗакупочнаяЦена* «/Элементы* «Элементы* «Наименование*Ботинкидетские«/Наименование* «ЗакупочнаяЦена>500«/Закупочная Цена* «/Элементы* «/НоменклатураГ руппа*
ГлаваУ18ЯЙнтеграция[сУдругими1Йнф~ормационн£|ми[системами Работа с Web-сервисами сторонних поставщиков Система «1С:Предприятие» может использовать Web-сервисы, предостав- ляемые другими поставщиками, двумя способами: с помощью статических ссылок, создаваемых в дереве объектов конфи- гурации; с помощью динамических ссылок, создаваемых средствами встроен- ного языка. При использовании статической ссылки система «1 С:Предприятие» полу- чает описание Web-сервиса поставщика только один раз, при создании ссылки. За счет этого достигается большая скорость работы. При использовании динамической ссылки описание Web-сервиса полу- чается каждый раз при вызове Web-сервиса. Скорость работы при этом уменьшается, но зато такой подход обеспечивает актуальность описания Web-сервиса поставщика. В случае же использования статических ссылок для получения актуального описания Web-сервиса требуется выполнить повторный импорт WSDL-описания средствами конфигуратора и затем сохранить измененную конфигурацию. Пример реализации механизма Web-сервиса ПОДРОБНЕЕ Познакомиться с реализацией механизма Web-сервисов можно в демонстрационных конфигурациях «Интеграция с другими информа- ционными системами: пример 3 и пример 4», прилагающихся к книге на компакт-диске. Эти демонстрационные конфигурации иллюстрируют использование следующих механизмов: определение Web-сервиса, определение схемы данных, получение описания Web-сервиса, динамическое создание прокси Web-сервиса, статическое создание прокси Web-сервиса на основе WSCcbuiKH, вызов операции Web-сервиса, работа с объектами передачи данных (XDTO). В демонстрационной конфигурации «Интеграция с другими информа- ционными системами, пример 3» рассмотрен механизм предоставления функциональности системы «1С:Предприятие» через Web-сервисы другим информационным системам и использования ее внешними потре- бителями этих Web-сервисов (конфигурация «Интеграция с другими информационными системами, пример 4»), ФУ®
Конфигурация «Интеграция с другими информационными системами, пример 3» демонстрирует создание и публикацию Web-сервиса, содер- жащего операцию, которая по переданным параметрам выполняет отчет, выгружает данные этого отчета в таблицу значений и возвращает эту таблицу. Конфигурация «Интеграция с другими информационными системами, пример 4» демонстрирует возможность доступа к данному Web-сервису из системы «1С:Предприятие». После получения описания Web-cep- виса с помощью статических либо динамических ссылок вызывается его операция, в которую передаются параметры выполнения отчета, и назад возвращается таблица значений, содержащая данные отчета. Затем эта таблица выводится в таблицу значений. ВНИМАНИЕ! В файловом варианте работы, чтобы пример реализации механизма Web-сервиса корректно работал, нужно дать пользователю, от имени которого работает IIS (IUSR_<XXXX>, IWAM_<XXXX>), права на каталог информационной базы, из которой публикуется Web-сервис (см. рис. 18.23). Создание Web-сервиса В конфигурации «Интеграция с другими информационными системами, пример 3», демонстрирующей первую часть примера, созданы и заполнены справочники Номенклатура, Склады, Контрагенты и документы Приход- наяНакладная и РасходнаяНакладная. При проведении этих документов формируются движения в регистре накопления ОстаткиНоменклатуры, который учитывает поступление и расход товаров в разрезе номенклатуры и складов. На основе виртуальной таблицы остатков и оборотов этого регистра формируется отчет ОстаткиТоваров, который показывает остатки товаров по складам за период (рис. 18.25). Отчет имеет два параметра, задающих отчетный период, — ДатаНачала и ДатаОкончания. Итак, нам нужно создать Web-сервис, выполняющий данный отчет по заданным параметрам и возвращающий данные отчета в виде таблицы значений. Для описания типов параметров и возвращаемых значений Web-cep- виса создадим пакет XDTO ДанныеОтчета с пространством имен http://localhost/wsreport. В свойстве URI пространства имен содержится http://localhost—адрес веб-сервера, установленного на локальном компью- тере с помощью IIS, /wsreport — каталог, в который будет опубликован Web-сервис. Пакет XDTO будет содержать следующие типы объектов XDTO (рис. 18.26). Профессиональная разработка в системе «1С:Предприятие 8»
J | Выбрать вариант... | ® 'О V? Остатки товаров-... (ТСПредприягие) !S1 ' М М* М- ' - □ X Остатки товаров Вариант отчета: |0еновной Рис. 18.25. Отчет «Остатки товаров» Рис. 18.26. Структура пакета XDTO «ДанныеОтчета» Номенклатура — для передачи данных элемента справочника Номенкла- тура. Этот тип объектов XDTO будет содержать свойство: □ Наименование — тип string из пространства имен http://www.w3.org/2001/XMLSchema; Склад — для передачи данных элемента справочника Склад. Этот тип объектов XDTO будет содержать свойство: □ Наименование — тип string из пространства имен http://www.w3.org/2001/XMLSchema; Том 2
LWeblcepBHcGi СтрокаТаблицыОтчета — для передачи данных одной строки отчета. Этот тип объектов XDTO будет содержать следующие свойства: □ Номенклатура — тип Номенклатура из пространства имен http://localhost/wsreport. Представляет собой ссылку на объект XDTO, определенный нами выше; □ Склад — тип Склад из пространства имен http://localhost/wsreport. Представляет собой ссылку на объект XDTO, определенный нами выше; □ НачальныйОстаток - тип int из пространства имен http://www.w3.org/2001/XMLSchema; □ Приход - тип int из пространства имен http://www.w3.org/2001/ XMLSchema; □ Расход — тип int из пространства имен http://www.w3.org/2001/ XMLSchema; □ КонечныйОстаток — тип int из пространства имен http://www.w3.org/2001/XMLSchema; ТаблицаОтчета - для передачи данных всех строк отчета. Этот тип объектов XDTO будет содержать единственное свойство: □ Состав — тип СтрокаТаблицыОтчета из пространства имен http://localhost/wsreport. Представляет собой ссылку на объект XDTO, определенный нами выше. Для того чтобы это свойство могло содержать неограниченное множество значений, установим его свойство Максимальное количество в значение -1 (рис. 18.27). Рис. 18.27. Свойства свойства «Состав» типа объекта XDTO «ТаблицаОтчета» Теперь, когда необходимые типы объектов XDTO созданы, добавим в конфигурацию «Интеграция с другими информационными системами, пример 3» ДанныеОтчета со следующими свойствами (рис. 18.28).
I Глава?! 84 И нтеграция[сУдругими!информационн£|ми[системами 3* Web-сервис ДанныеОтчета Основные Подсистемы Операции | ► Прочее _________Модуль || URI пространства имен: [http7/locafriosVwsteport ] ПакетыХОТО: [htfc/TtocatTosVwsteport |,„ х| Имя Файла публикации |w$repo(t.1cw$ ] [ Действия [ <Наэад| [ Закрыть | [ Справка | Рис. 18.28. Свойства Web-сервиса «ДанныеОтчета» URI пространства имен - http://localhost/wsreport; Пакеты XDTO - http://localhost/wsreport; Имя файла публикации - wsreport.lcws. У созданного Web-сервиса определим операцию ПолучитьОтчет со следу- ющими свойствами (рис. 18.29). j) Weh-сервис ДанныеОтчета _ □ X Основные Подсистемы * X Q EII • ДэтаНачфа • ДэтаОко^чашя [ ► Операции Прочее Свойства: ПолучитьОтчет Основные: Синошм [Полумгь отчет Комментарий | Тип возвращаемого значения Возможно пустое значение В транзакции Имя метода ’ Данные: Режим управления блокировкой данных [Управляемый |Ta6flmaOT4OTa(http:ZZIoca>ioslZwsfeport)|... х| 0 □_______________ | ПолучитьОтчет IO] Рис. 18.29. Свойства операции «ПолучитьОтчет» Тип возвращаемого значения — ТаблицаОтчета из пространства имен http://localhost/wsreport; Возможно пустое значение — установлен; Имя метода — ПолучитьОтчет. У операции ПолучитьОтчет определим параметры ДатаНачала и ДатаОкончания со следующими свойствами (рис. 18.30). Эти параметры будут передаваться в процедуру, связанную с операцией Web-сервиса, для формирования отчета. ^у®
3* Web-сервис ДанныеОтчета □ X Рис. 18.30. Свойства параметров операции «ПопучитьОтчет» Тип значения — тип date из пространства имен http://www.w3.org/2001/ XMLSchema; Возможно пустое значение - установлен; Направление передачи — Входной. После этого откроем модуль созданного Web-сервиса и поместим в нем экспортируемую функцию ПолучитьОтчет(), которая будет выполняться при его вызове (листинг 18.149). Листинг 18.149. Функция «ПолучитьОтчет()» Функция ПолучитьОтчет(ДатаНачала, ДатаОкончания) Экспорт СхемаКомпоновкиДанных = Отчеты.ОстаткиТоваров.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных"); Настройки = СхемаКомпоновкиДанных.НастройкиПоУмолчанию; ПараметрДанныхНачалоПериода = Настройки.ПараметрыДанных.Элементы[0]; ПараметрДанныхНачалоПериода.Значение = ДатаНачала; ПараметрДанныхНачалоПериода.Использование = Истина; ПараметрДанныхКонецПериода = Настрой ки.ПараметрыДанных.Элементы[1]; ПараметрДанныхКонецПериода.Значение = ДатаОкончания; ПараметрДанныхКонецПериода.Использование = Истина; ТаблицаРезультата = Новый ТаблицаЗначений; КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных; МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаКомпоновкиДанных, Настройки,,, Тип(ТенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений")); ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных); ПроцессорВывода=Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений; ПроцессорВывода.УстановитьОбьект(Таблица Результата); Профессиональная разработка в системе «1С:Предприятие 8»
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных); НоменклатураТип = 0a6pnKaXDTO.Tnn("http://localhost/wsreport", "Номенклатура"); СкладТил = 0a6pnKaXDTO.Tnn("http://localhost/wsreport", "Склад"); ТаблицаОтчетаТил = 0a6pnKaXDTO.Tnn("http://localhost/wsreport", "ТаблицаОтчета"); СтрокаТаблицыОтчетаТип = 0a6pnKaXDTO.Tnn("http://localhost/wsreport", "СтрокаТаблицыОтчета"); ТаблицаОтчета = ФабрикаХВТО.Создать(ТаблицаОтчетаТип); Для Каждого СтрокаТаблицыРезультата из ТаблицаРезультата Цикл СтрокаТаблицыОтчета = ФабрикаХОТО.Создать(СтрокаТаблицыОтчетаТип); Номенклатуре = ФабрикаХОТО.Создать(НоменклатураТип); Склад = ФабрикаХВТО.Создать(СкладТип); Если ТипЗнч(СтрокаТаблицыРезультата.Номенклатура) = Тип("СправочникСсылка.Номенклатура") Тогда Номенклатура.Наименование = СтрокаТаблицыРезультата. Номенклатуре.Наименование; Иначе Номенклатура.Наименование = КонецЕсли; Если ТипЗнч(СтрокаТаблицыРезультата.Склад) = Тип("СправочникСсылка.Склады") Тогда Склад.Наименование = СтрокаТаблицыРезультата.Склад.Наименование; Иначе Склад.Наименование = КонецЕсли; СтрокаТаблицыОтчета.Номенклатура = Номенклатура; СтрокаТаблицыОтчета.Склад = Склад; СтрокаТаблицыОтчета.НачальныйОстаток = СтрокаТаблицы Результата.НачальныйОстаток; СтрокаТаблицыОтчета.КонечныйОстаток = СтрокаТаблицыРезультата. КонечныйОстаток; СтрокаТаблицыОтчета.Приход = СтрокаТаблицыРезультата.Приход; СтрокаТаблицыОтчета.Расход = СтрокаТаблицыРезультата.Расход; ТаблицаОтчета.Состав.Добавить(СтрокаТаблицы Отчета); КонецЦикла; Возврат ТаблицаОтчета; КонецФункции Сначала в функции получается схема компоновки данных отчета ОстаткиТоваров и соответствующие ей стандартные настройки. Затем параметрам данных этих настроек присваиваются значения параметров ДатаНачала и ДатаОкончания, переданных в функцию. После этого создается макет компоновки данных отчета с учетом изме- ненных настроек, отчет компонуется и выводится в таблицу значений ТаблицаРезультата. Затем с помощью глобальной фабрики XDTO получаются типы объектов XDTO, ранее описанные нами в пакете XDTO ДанныеОтчета - Номенк- Том 2
LWeblcepBHcGi латураТип, СкладТип, СтрокаТаблицыОтчетаТип и ТаблицаОтчетаТип, на основе которого создается список значений XDTO ТаблицаОтчета. Затем коллекция значений ТаблицаРезультата, содержащая данные отчета, обходится в цикле. На каждом шаге этого цикла создается объект XDTO — СтрокаТаблицыОтчета и заполняются все его свойства — Номенк- латура, Склад, НачальныйОстаток и др. После этого СтрокаТаблицыОтчета добавляется в список значений XDTO ТаблицаОтчета. В заключение функция возвращает объект XDTO ТаблицаОтчета. Тип этого объекта был описан в свойстве Тип возвращаемого значения операции ПолучитьОтчет созданного нами Web-сервиса ДанныеОтчета. Теперь осталось только опубликовать созданный Web-сервис на веб-сервере, например, расположенном на локальном компьютере http://localhost в каталоге /wsreport (рис. 18.31). Публикация на веб-сервере X Имя [ЩДЩ I | Опубликовать | Веб-сервер: [internet Information Services IH [ Отключить | Каталог |C:\lnetpub^wwwrootWSRepoit\ [ Закрыть | @ Публиковать тонкий клиент и веб-клиент | Справка | 0 Публиковать Web-сервисы □ Использовать аутентификацию операционной системы на веб-сервере Рис. 18.31. Диалог публикации на веб-сервере Использование Web-сервиса В конфигурации «Интеграция с другими информационными системами, пример 4», демонстрирующей вторую часть примера, рассматривается возможность использования Web-сервиса сторонних поставщиков путем получения описания Web-сервиса с помощью статических либо динами- ческих ссылок. В конфигурации создана обработка ПолучитьОтчетПоТоварам с реквизи- тами ДатаНачала и ДатаОкончания, в которые будут вводиться значения параметров, задающих отчетный период для формирования отчета. По кнопке Сформировать результат отчета будет выводиться в таблицу значений, отражающую данные реквизита ТЗРезультат (рис. 18.32).
I Глава?! 84 И нтеграция[сУдругими1информационн£|ми[системами @ Q- Получаъ отчет по товарам-Web-сервисы (1 С: Предприятие) Получить отчет по товарам {Сформировать) Вседействия» । (?) Дата начала [10.122010 SI Дата окончания: [ЙДНЯИИ ISI ^Добавить | I О О Вседействия» Номенклатура I Склад Посудомоечная машина Посудомоечная машина Основной Посудомоечная машина Розничный Спральная машина Спральная машина Основной Фен Фен Основной Холодильник Холодильник Розничный Чайник Чайник Основной Чайник Розничный Рис. 18.32. Обработка «Получить отчет по товарам», получающая данные отчета через Web-сервис При нажатии кнопки Сформировать вызывается серверная процедура СформироватьОтчет(), листинг 18.150. Листинг 18.150. Функция «СформироватьОтчетО» &НаСервере Процедура СформироватьОтчет(ДатаНачала, ДатаОкончания) Определения = Новый WSOnpefleneHHfl("http://localhost/wsreport/ws/wsreport.1cws?wsdr); Прокси = Новый УУЗПрокси(Определения, “http://localhost/wsreport", "ДанныеОтчета", "ДанныеОтчетаЗоар"); ДанныеОтчета = Прокси.ПолучитьОтчет(ДатаНачала, ДатаОкончания); Если ДанныеОтчета = Неопределено Тогда Возврат; КонецЕсли; ТЗРезультат.Очистить(); Для Каждого СтрокаТаблицыРезультата из ДанныеОтчета.Состав Цикл НоваяСтрока = ТЗРезультат.Добавить(); НоваяСтрока.Склад = СтрокаТаблицыРезультата.Склад.Наименование; НоваяСтрока.Номенклатура = СтрокаТаблицыРезультата.Номенклатура.Наименование; НоваяСтрока.НачальныйОстаток = СтрокаТаблицы Результата.НачальныйОстаток; НоваяСтрока.Приход = СтрокаТаблицыРезультата.Приход; НоваяСтрока.Расход = СтрокаТаблицыРезультата.Расход; НоваяСтрока.КонечныйОстаток = СтрокаТаблицы Результата.КонечныйОстаток; КонецЦикла; КонецПроцедуры В данной процедуре создается объект WSOnpefleneHMH, который получает определение Web-сервисов из WSDL файла. На основе определения Web- сервиса создается объект WSnpoKCM и связывает его с точкой подключения Web-сервиса.
Затем выполняется операция Web-сервиса ПолучитьОтчет(), в которую передаются значения реквизитов ДатаНачала и ДатаОкончания, введенные в форме обработки. В результате отчет формируется и выгружается в таблицу значений, которая возвращается Web-сервисом в виде списка XDTO. Далее реквизит ТЗРезультат в цикле заполняется данными отчета и показывается в форме обработки. Заметьте, что хотя в конфигурации «Интеграция с другими инфор- мационными системами, пример 4» нет исходных данных для формирования отчета - документов, регистров накопления и т. п., данные отчета становятся доступны благодаря использованию Web-сервиса стороннего поставщика, предоставившего подобную функциональность путем создания и публикации Web-сервиса на веб-сервере. Использование динамической WS-ссылки В процедуре СформироватьОтчет(), см. листинг 18.150, использована динамическая WS-ссылка, когда объект М/БПрокси для подключения к Web-сервису получается на основании объекта WSOnpefleneHHH (листинг 18.151). Листинг 18.151. Использование динамической WS-ссылки Определения = Новый WSOnpaAeneHHR("http://localhost/wsreport/ws/wsreport.1cws?wsdr); Прокси = Новый УУ8Прокси(Определения, "http://localhost/wsreport", "ДанныеОтчета", "ДанныеОтчетаЗоар"); ДанныеОтчета = Прокси.ПолучитьОтчет(ДатаНачала, ДатаОкончания); Использование статической WS-ссылки Для использования статической WS-ссылки следует добавить в дерево объектов конфигурации объект WSCcunKa с именем ДанныеОтчета, ссыла- ющийся на опубликованный Web-сервис. Для этого нужно выполнить импорт WSDL-описания опубликованного Web-сервиса и в качестве URL указать http://localhost/wsreport/ws/wsreport.1cws?wsdl (рис. 18.33). Введите URL импортируемого WSDL X ! °К -' Отмена ' Рис. 18.33. Создание WS-ссылки После этого создание WSnpoKCM на основе статической WS-ссылки будет выглядеть следующим образом (листинг 18.152). Листинг 18.152. Использование статической WS-ссылки Прокси = WSCcNnKH.flaHHbieOT4eTa.Co3flaTbWSnpOKcn("http://localhost/wsreport", "ДанныеОтчета", "ДанныеОтчетаЗоар”); ДанныеОтчета = Прокси.ПолучитьОтчет(ДатаНачала, ДатаОкончания); Профессиональная разработка в системе «1С:Предприятие 8»
Глава 19. Обмен данными При решении различных задач может возникнуть необходимость в создании распределенной информационной системы (в силу террито- риальной распределенности организации, использования разнородного программного обеспечения для решения отдельных подзадач и т.п.). Технологическая платформа «1С:Предприятие» позволяет решать такие задачи, причем распределенные информационные системы могут строиться как на основе информационных баз «1С:Предприятия», так и с задействованием совершенно других систем. Одной из самых важных задач, которую необходимо решить при органи- зации распределенных информационных систем, является задача обмена между ее составными частями. Обмен данными в системе «1С:Предприятие» реализуется благо- даря использованию ряда средств технологической платформы, которые разработчик может применять как по отдельности, так и в различных комбинациях, в зависимости от конкретной решаемой задачи. Такой подход позволяет обеспечить гибкость механизмов обмена и их настраиваемость на решение как можно большего круга задач. В состав средств платформы, используемых для построения схем обмена данными, входят: объекты конфигурации План обмена, базовые средства работы с XML, средства XML-сериализации. При помощи этих средств могут быть реализованы два механизма обмена данными: универсальный механизм обмена данными, механизм распределенных информационных баз. Универсальный механизм обмена данными позволяет создавать произ- вольные распределенные системы и практически не накладывает никаких ограничений на структуру создаваемой системы. Можно как связывать в единое целое базы «1С:Предприятия» с отличными друг от друга конфигурациями, так и осуществлять обмен с принципиально отличными информационными системами (базами данных). Том 2
Механизм распределенных информационных баз, напротив, предна- значен для обмена данными только с идентичными конфигурациями «1С:Предприятия» и жестко регламентирует структуру создаваемой системы. Основные отличия механизма универсального обмена данными от меха- низма распределенных информационных баз можно проиллюстрировать следующей таблицей (табл. 19.1). Таблица 19.1. Сравнение механизмов обмена данными Универсальный механизм обмена данными Механизм распределенных информационных баз В узлах плана обмена находятся Произвольные базы данных, в том числе информационные базы «1 (^Предприятия» Только информационные базы «1 (^Предприятия» Конфигурации информационных баз Могут быть разные (применительно к информационным базам «1С:Предприятия») Только идентичные В сообщениях обмена передаются Только изменения данных Изменения данных, изменения конфигурации Направление передачи Произвольное, между двумя связанными узлами Изменения данных - произвольное, изменения конфигурации - от главного к подчиненному узлу Формат файлов обмена Произвольный, чаще всего XML XML Создание распределенной базы и выполнение обмена Требуется написание кода (определение порядка разрешения коллизий, стратегии распространения данных, создания начальных выгрузок, решение задачи синхронизации данных) Может быть выполнено исключительно интерактивными средствами, без кодирования (действуют соглашения по умолчанию) Структура распределенной системы Произвольная. Может отсутствовать понятие главный - подчиненный (отсутствовать иерархия) Древовидная. Любой узел (кроме корневого) имеет один главный и произвольное количество подчиненных узлов Перед тем как перейти к рассмотрению возможностей организации как универсального обмена, так и создания распределенных информационных баз «1С:Предприятия», рассмотрим функциональность такого объекта платформы, как План обмена. он
ГлаваУ! 9КЬбмен1данн£|ми ПЛАНЫ ОБМЕНА При организации постоянного обмена может возникнуть ряд задач: с кем будет производиться обмен (определение состава участников обмена); какими данными будет производиться обмен (с одной стороны, это определение перечня типов объектов; с другой стороны, определение «экземпляров»); определение регламента обмена (например, нумерация сообщений, адресация, процесс разрешения коллизий и т. п.). Все эти задачи в той или иной мере могут решаться с использованием функциональности планов обмена. Рассмотрим данный объект более подробно. Примеры, иллюстрирующие возможности обмена данными, можно посмотреть в демонстрационной конфигурации «Обмен данными», которая находится на приложенном диске. Как объект конфигурации План обмена характеризуется составом рекви- зитов, табличных частей (составом реквизитов табличных частей), определенными для него формами, макетами. У узла плана обмена сущес- твуют свойства Код, Наименование и т.п. В конфигурации может быть определено любое количество планов обмена. Элементами данных плана обмена являются узлы плана обмена, подобно тому, как элементами данных справочника являются элементы справочника. Каждый из узлов плана обмена обозначает участника обмена данными по данному плану обмена. Один из узлов (он является предопределенным) соответствует данной информационной базе, а остальные — другим участникам, с которыми данная информационная база может обмениваться данными (рис. 19.1). Удаленные склады ^Создать | ф & @ । QHaftrn.. । Вседействия-» | (?) Код । Наименование Л. I Склад IГлавшй if Оптовый Оптовый склад ’if Розничный Розничный склад Розничный склад 0*1 ЦенгрОФыс Центральный офис Оптовый склад л ▼ Рис. 19.1. Узлы плана обмена Реквизиты и табличные части узла обмена могут использоваться для указания специфических данных по участнику обмена. С их помощью определяется порядок взаимодействия с данным участником, привязка его к другим объектам базы. Например, может указываться, что данный узел с точки зрения базы данных является «таким-то» складом (элементом
справочника Склады), файл выгрузки данному получателю необходимо отправлять по «такому-то» FTP-адресу и т.п. (рис. 19.2). @ Оптовый склад (... (^Предприятие) @ 'Ш| [зЦ □ X Оптовый склад (Удаленный склад) * |ГЭаписатьиэакрытъ)) Й1 Все действия ’ । (?) Основное! Дополнительно__________________________________________ О сновные-------------------------------------------------------- Код- [Огтгоеьй ] Наименование: [Опгоеьй склад ] Номер отправленного сообщения:) б] Номер принятого сообщения: [ б] Главный: О Склад------------------------------------------------------------ Склад: [Опгоеьйсклад |-.^| Параметры обмена------------------------------------------------- ® Обмен по локальной сети или по FTP О Обмен по электронной почте Адрес обмена: [ftp7Z127,0.0,1/EKchange | пример адреса обмена: для локальной сети ’AresourceMoHet для доступа через FTP: ltp:Mtp.foo.com/foldei Рис. 19.2. Пример узла плана обмена Данные переносятся между узлами с помощью сообщений. Средства работы с сообщениями образуют инфраструктуру сообщений. Каждое сообщение относится к определенному плану обмена, имеет опреде- ленный узел-отправитель и определенный узел-получатель. Сообщение не может быть отправлено неизвестному узлу и не может быть принято от неизвестного узла. Каждое сообщение имеет свой собственный цело- численный номер. С точки зрения инфраструктуры сообщений у узла существуют два свойства: номер отправленного сообщения, номер принятого сообщения. Для предопределенного узла эти свойства смысла не имеют (база данных сама с собой данными не обменивается). Служба регистрации изменений предназначена для регистрации изме- нений данных, производимых «1С:Предприятием», чтобы при обмене данными иметь возможность передавать не все данные, а только новые, измененные и удаленные. Настройка состава объектов, для которых включается регистрация изме- нений, производится в режиме Конфигуратор, на закладке Основные объекта конфигурации ПланОбмена (необходимо нажать кнопку Состав), рис. 19.3. Можно сказать, что объекты, для которых включается регистрация изме- нений, являются входными данными для службы регистрации изменений. Задача этой службы состоит в том, чтобы, опираясь на данный перечень Профессиональная разработка в системе «1С:Предприятие 8»
объектов, отслеживать изменения объектов, их удаление и производить соответствующие записи в таблицах регистрации изменений объектов. При этом отслеживаются ситуации повторного изменения (но об этом более подробно в разделе, посвященном именно службе регистрации изменений). План обмена Отделения | ► Основные Подсистемы Функциональные опции Данные Формы Команды Макеты Ввод на основании Права Прочее JSj План обмена Отделения: Состав Действия ▼ । 1 | Действия -1 QUHOOI в- Сбавочники 0Й Клиенты 0ffl Согрудмжи 0tffi Номенклатура 0ffl Склады 0ffl ВариантыНоменклатуры 0ffl ДополнигельныеСвойстваНоменклатуры Qffl Субконго □И ВидыГраФиковРаботы Ф QQ Документы <+:• 0ЕИ Планы видов характеристик Ф О^Г Планы счетов ‘6- Планы видов расчета Ф Е]Н Регистры сведений Ф 00 Регистры накопления Ф OS Регистры бухгалтерии Ф QS Регистры расчета ' Авторегистрация !*) Разрешить 1*1 Разрешить !*) Разрешить 1*1 Разрешить !*) Разрешить 1*1 Разрешить □ X Рис. 19.3. Состав плана обмена Обобщив изложенный ранее материал, можно сказать, что планы обмена: определяют состав участников обмена (любой узел, кроме предопре- деленного, соответствует какому-либо участнику обмена); позволяют производить регистрацию изменений объектов (служба регистрации изменений, как объектов, так и самой конфигурации); реализуют инфраструктуру сообщений. Служба регистрации изменений Довольно сложно разделить службу регистрации изменений и инфра- структуру сообщений — их функциональность тесно связана, но все же постараемся рассмотреть особенности их работы по отдельности. Начнем со службы регистрации изменений. Целью регистрации изменений является получение списка изме- ненных элементов данных, которые должны быть переданы в очередном Том 2
План£|Гобмена1 сообщении тому или иному узлу, с которым производится обмен данными. При каждом изменении данных должно быть зарегистрировано, что имеются изменения, которые предстоит передать во все узлы, с которыми поддерживается обмен этими данными. При получении подтверждения приема сообщения, в котором были отправлены изменения, записи регис- трации изменений должны быть удалены. Регистрация изменений может выполняться для следующих элементов данных: КонстантаМенеджерЗначения.<имя>; объекты базы данных: □ СправочникОбъект.<имя>; □ ДокументОбъект.<имя>; □ ПланСчетовОбъект.<имя>; □ План ВидовХарактеристикОбъект. < имя >; □ ПланВидовРасчетаОбъект.<имя>; □ БизнесПроцессОбъект.<имя>; □ ЗадачаОбъект.<имя>; наборы записей: □ РегистрСведенийНаборЗаписей. < имя >; □ РегистрБухгалтерииНаборЗаписей.<имя>; □ РегистрНакопленияНаборЗаписей.<имя>; □ ПоследовательностьНаборЗаписей.<имя>; □ РегистрРасчетаНаборЗаписей.<имя>; □ ПерерасчетНаборЗаписей.<имя>. Для каждого из приведенных элементов данных ведется своя таблица регистрации изменений. Таблицы имеют разную структуру, в зависи- мости от того, для каких элементов данных регистрируются изменения, но все-таки структуры таблиц подобны. В структуре можно выделить три составляющих: ключ элемента данных, для которого регистрируются изменения; ссылка на узел, в который изменение должно быть передано; номер сообщения, в котором изменение передано в первый раз. Следует отметить, что в конфигурации может быть определено несколько планов обмена. Для каждого из них может включаться регистрация изме- нений какого-либо объекта. Так вот, вне зависимости от количества планов обмена, в рамках которого регистрируются изменения какого- либо объекта, таблица регистрации изменений у объекта одна (можно сказать, что поле, содержащее ссылку на узел плана обмена, может иметь составной тип).
ГлаваУ! 9КЬбмен1данн£|ми Структуры таблиц регистрации изменений для разных данных отлича- ются ключом, так как ключи у разных данных разные: для константы ключом является идентификатор константы; для объектов базы данных в качестве ключа используется ссылка на объект; для наборов записей, для которых определен регистратор, в качестве ключа используется ссылка на объект-регистратор; для набора записей регистра сведений, если регистратор не определен, в качестве ключа используется совокупность измерений, входящих в основной отбор. А если регистр сведений является периодическим и включен основной отбор по периоду, то в ключ входит еще и период. Основной отбор (для регистров сведений) позволяет определять логи- ческую единицу обмена данными. Рассмотрим это понятие более подробно (рис. 19.4). Свойства: Номенклатдра ▼Основные: Синоним [Номенклатура Комментарий [ Z3 Z3 Тип [СправочникСсылкаНоменклагура Ведущее 0 Основной отбор 0 Запрет незаполненных значений □ ▼ Использование: Индексировать Не индексировать Полнотекстовый поиск [Использовать ▼ Представлетше: Рис. 19.4. Свойство «Основной отбор» Понятно, что физически минимальной единицей обмена является запись регистра сведений. Но всегда ли правильно обмениваться записями? Рассмотрим пример. Есть регистр сведений, в котором содержатся данные о дополнительных свойствах номенклатурных позиций. Речь идет именно о свойствах, которые четко характеризуют товарную позицию. Если для какого-то товара свойство имеет другое значение, то, значит, это другой товар. Например, такое свойство, как количество компрессоров холодиль- ника. У данного регистра сведений два измерения: ссылка на номенклатуру и ссылка на свойство. Если обмен будет производиться по каждой записи отдельно, у одного участника обмена добавили одно свойство, а у другого — другое, то в результате обмена у элемента номенклатуры появятся два свойства. Но в данном случае более правильно, чтобы свойства отдельно взятого товара представляли собой единое логическое целое (входили в некий логический квант данных). Как раз для того, чтобы объединить несколько физических записей в один логический набор данных, и используется понятие Основной отбор.
Если в приведенном примере для измерения Номенклатура (содержащего ссылку на номенклатурную позиций) установить свойство Основной отбор, то при изменении хотя бы одной физической записи обмен будет произво- диться всеми свойствами данной номенклатуры. В качестве примера рассмотрим следующие данные (наполнение регистра сведений), табл. 19.2. Таблица 19.2. Записи регистра сведений Измерение «Номенклатура» (входит в основной отбор) Измерение «Свойство» (не входит в основной отбор) Значение Атлант МХМ 1704-00 Количество компрессоров 2 Атлант МХМ 1704-00 Цвет Белый ArdoTL 1000 ЕХ-1 Тип загрузки Вертикальная ArdoTL 1000 ЕХ-1 Количество подшипников 1 Добавим в регистр запись о новом свойстве (выделена серым фоном), табл. 19.3. Таблица 19.3. В регистр сведений добавлена запись Измерение «Номенклатура» (входит в основной отбор) Измерение «Свойство» (не входит в основной отбор) Значение Атлант МХМ 1704-00 Количество компрессоров 2 Атлант МХМ 1704-00 Цвет Белый Атлант МХМ 1704-00 Отделов в морозильной камере 3 ArdoTL 1000 ЕХ-1 Тип загрузки Вертикальная ArdoTL 1000 ЕХ-1 Количество подшипников 1 В результате будут зарегистрированы следующие изменения (табл. 19.4). Таблица 19.4. Записи, попавшие в регистрацию изменений Измерение «Номенклатура» (входит в основной отбор) Измерение «Свойство» (не входит в основной отбор) Значение Атлант МХМ 1704-00 Количество компрессоров 2 Атлант МХМ 1704-00 Цвет Белый Атлант МХМ 1704-00 Отделов в морозильной камере 3 Если в основной отбор включить все измерения (если регистр сведений периодический, то включить в основной отбор и период), то логической единицей обмена будет отдельно взятая запись регистра сведений. Следует отметить тот факт, что при записи набора в регистр сведений состав этого набора определяется логикой работы конфигурации и не обязательно совпадает с набором, получаемым «при исполь- зовании» основного набора. А при принудительной регистрации изменений для набора записей обязательно должен быть установлен отбор, Профессиональная разработка в системе «1С:Предприятие 8»
совпадающий с основным (иначе будет вызвано исключение). Такой порядок работы определяется тем, что основной отбор явля- ется специфической чертой именно механизма обмена данными. Исходя из сказанного выше, следует, что при изменении основного отбора необходимо будет менять и программный код, в котором производится принудительная регистрация записей регистра сведений (во всех вхожде- ниях в конфигурацию). Изменение элемента данных должно быть зарегистрировано для всех узлов, в которые изменение должно быть передано. Таким образом, в результате изменения элемента данных в таблице регистрации изменений должно появиться N записей (наборов записей), где N — коли- чество узлов, для которых регистрируются изменения (все узлы плана обмена, за исключением предопределенного). В каждой из этих записей (наборе записей) указано одно и то же значение ключа элемента данных и различные значения ссылки на узел. Непосредственно после выполнения регистрации изменения номер сооб- щения имеет значение Null. При первой отправке изменения в составе сообщения в данное поле помещается номер сообщения, в котором изме- нение отправлено. Рассмотрим приведенный алгоритм на примере. Считаем, что в плане обмена включена регистрация для документа РасходнаяНакладная. В плане обмена определено три узла: один — предопределенный, другие — с кодами Оптовый и Розничный. После включения регистрации было изменено два документа. В соответствии с этим таблица регистрации изменения примет следующий вид (табл. 19.5). Таблица 19.5. Состав таблицы регистрации изменений ДокументСсылка.РасходнаяНакладная Узел Номер сообщения Расходная накладная № 1 от... Оптовый Null Расходная накладная № 1 от... Розничный Null Расходная накладная № 2 от... Оптовый Null Расходная накладная № 2 от... Розничный Null После этого было произведено формирование и отправка сообщения с номером 1 для узла Оптовый. Таблица приняла следующий вид (табл. 19.6). Таблица 19.6. Состав таблицы регистрации изменений ДокументСсылка.РасходнаяНакладная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 1 Расходная накладная № 1 от... Розничный Null Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 2 от... Розничный Null Том 2
План£|Гобмена1 Далее было зарегистрировано изменение еще одного документа (табл. 19.7). Таблица 19.7. Состав таблицы регистрации изменений ДокументСсылка.РасходнаяНакпадная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 1 Расходная накладная № 1 от... Розничный Null Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 2 от... Розничный Null Расходная накладная № 3 от... Оптовый Null Расходная накладная № 3 от... Розничный Null После этого были сформированы и отправлены сообщения для узлов Оптовый и Розничный. Фактически были проведены две выгрузки (сфор- мировано два сообщения). Для узла Розничный сообщение имело номер 1, для узла Оптовый - номер 2 (табл. 19.8). Таблица 19.8. Состав таблицы регистрации изменений ДокументСсылка.РасходнаяНакладная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 1 Расходная накладная № 1 от... Розничный 1 Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 2 от... Розничный 1 Расходная накладная № 3 от... Оптовый 2 Расходная накладная № 3 от... Розничный 1 После выгрузки для узла Оптовый запись в таблице для документа Расходная накладная № 3 отмечается номером сообщения 2 (первый раз изменение было передано именно в сообщении с таким номером), другие записи (для которых в поле НомерСообщения содержалось значение 1) остались без изменений (именно таким образом работает служба регис- трации изменений). Для узла Розничный все изменения были отнесены сообщением с номером 1. Предположим, что после выполнения вышеуказанных действий произошло повторное изменение документа Расходная накладная № 1. В этом случае таблица регистрации изменений будет иметь следующий вид (табл. 19.9). Таблица 19.9. Состав таблицы регистрации изменений ДокументСсылка.РасходнаяНакпадная Узел Номер сообщения Расходная накладная № 1 от... Оптовый Null Расходная накладная № 1 от... Розничный Null Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 2 от... Розничный 1 Расходная накладная № 3 от... Оптовый 2 Расходная накладная № 3 от... Розничный 1
ГлаваУ! 9КЬбмен!данн£|ми Продолжая разговор о службе регистрации изменений, следует отме- тить, что состав плана обмена распространяется на все узлы данного плана обмена. Поэтому, если, например, с разными узлами нужно обме- ниваться разным составом информации, необходимо создавать несколько планов обмена, в которых объединять узлы, обменивающиеся одинаковым составом информации. Например, если с одним узлом необходимо обмениваться изменениями в справочнике Номенклатура, а с другим изменениями — в документах РасходнаяНакладная, то не стоит создавать один план обмена, лучше создать план обмена ПоНоменклатуре (с соответствующей настройкой состава данных, по которым ведется регистрация изменений) и план обмена Расходные (с другим составом). Управление регистрацией изменений При рассмотрении вышеприведенного примера акцент делался на запол- нение таблицы регистрации изменений. Каким образом производилась регистрация, не учитывалось. Можно сказать, что рассматривалась функ- циональность службы регистрации изменений с учетом того, что для всех объектов включена авторегистрация изменений. Пришло время рассмот- реть и этот аспект работы программного комплекса. При определении состава объектов, для которых производится регистрация изменений (кнопка Состав на закладке Основные объекта конфигурации План обмена), для каждого объекта можно определить свойство Авторе- гистрация (рис. 19.5). JSj План обмена Отделения: Состав П X Рис. 19.5. Свойство «Авторегистрация» Авторегистрацию можно разрешить или запретить. Если авторегист- рация разрешена, то при изменении данных регистрация будет выполнена автоматически. Если запрещена, то регистрацию изменения необходимо выполнять «вручную» (определив код на встроенном языке). Следует отметить, что можно «корректировать» результат регистрации и в том случае, если авторегистрация объекта включена. Оба действия будут подробнее рассмотрены несколько позже.
У каждого объекта конфигурации, входящего в состав плана обмена, имеется свойство ОбменДанными, имеющее тип ПараметрыОбме- наДанными. Данное свойство может быть использовано только для чтения и предназначено как для управления различными параметрами при обмене данными, так и при реализации других механизмов, связанных с изменением объекта. Например, такое свойство, как Загрузка, может опре- делять необходимость проведения (непроведения) каких-либо проверок в момент записи объекта (при записи в режиме загрузки можно отказаться от проверки номеров, кодов объектов, наличия каких-либо связанных с загружаемыми объектами данных и т. п., так как эти данные могут быть загружены после). Следует обратить внимание на тот факт, что значение данного свойства не хранится в базе данных. В соответствии с этим все изменения (опреде- ления различных коллекций, свойств), которые выполняются через данное свойство, «работают» только в течение существования объекта. У объекта ПараметрыОбменаДанными есть свойство Получатели, имеющее тип НаборУзлов. В данном свойстве хранится перечень узлов, для которых будет выполняться регистрация изменений при записи или удалении данных. Рассмотрим особенности регистрации изменений, как при автоматической регистрации изменений, так и в обратном случае. Автоматическая регистрация изменений Если для объекта включена автоматическая регистрация изменений, этот список получателей (свойство Получатели) заполняется автомати- чески, перед тем как будет вызван обработчик события ПередЗаписыо (при выполнении записи данных) или ПередУдалением (при выполнении удаления). Перед вызовом данных обработчиков событий список полу- чателей предварительно очищается. Исходя из этого, вносить изменения в список получателей (если для объекта включена автоматическая регис- трация изменений) можно только в обработчиках ПередЗаписыо (и/или ПередУдалением). При этом следует помнить, что список получателей может содержать только ссылки на узлы, относящиеся к планам обмена, в состав которых входит соответствующий объект конфигурации. В приведенном ниже примере обработчик ПередЗаписыо исключает из списка получателей узел с кодом Оптовый плана обмена Удален- ныеСклады (листинг 19.1). Листинг 19.1. Пример обработчика события «ПередЗаписыо» Процедура ПерадЗаписью() Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый"); Объект.ОбменДанными.Получатвли.Удалить(Узел); КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Следует вспомнить, что значение свойства ОбменДанными не хранится в информационной базе. Можно сказать, что данное свойство заполняется некими значениями по умолчанию при создании объекта (в оперативной памяти). Одним из таких свойств, которое в дальнейшем определяет порядок регистрации изменений, является свойство Автозаполнение. То есть, несмотря на тот факт, что при настройке состава регистрации изменений авторегистрация для объекта была включена, при создании объекта (при создании, получении из кода, при открытии формы объекта) это свойство можно переопределить. Пример реализации приведен в листинге 19.2. Листинг 19.2. Пример изменения свойства «Автозаполнение» Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый"); Объект.ОбменДанными.Получатели.Автозаполнение = Ложь; Обьект.ОбменДанными.Получатели.Добавить(Узел); Объект.3аписать(); В этом случае автозаполнение отключается, и состав коллекции полу- чателей можно определять в любом возможном месте (участке кода, отвечающего за работу с объектом). Но чтобы конфигурация была логи- чески понятна и легко читаема, лучше это делать все в тех же обработчиках событий ПередЗаписью и/или ПередУдалением. Также следует напомнить, что в конфигурации может быть определено несколько планов обмена. В одном из них для объекта может быть вклю- чена автоматическая регистрация изменений, в другом она может быть отключена. Рассмотрим пример. План обмена УдаленныеОфисы (автоматическая регистрация изменений для документа Расходнаянакладная включена), состав непредопределенных узлов: Центральный склад, Офис на «Рублевке». План обмена УдаленныеСклады (автоматическая регистрация изменений для документа Расходнаянакладная отключена), состав непредопреде- ленных узлов: Розничный склад, Оптовый склад. Подобная настройка планов обмена может быть выполнена исходя из соображений, что документ Расходнаянакладная должен присутство- Том 2
План£|Гобмена1 вать во всех офисах компании и при этом должен быть выгружен только на «свой» склад. При создании документа Расходная Накладная (изменении существую- щего) в таблице регистрации изменений данного документа появятся две записи для узлов: УдаленныеОфисы - Центральный склад; УдаленныеОфисы - Офис на «Рублевке». Следует оговориться, что такое поведение системы наблюдается только в том случае, если не предпринимается никаких шагов по принудительной регистрации изменений. Кстати, свойство Автозаполнение в коллекции Получатели в данном примере установлено в значение Истина. Ручная регистрация изменений Если автоматическая регистрация изменений не производится, то перед вызовом обработчиков ПередЗаписью и ПриУдалении сброс и заполнение списка получателей не осуществляются. Исходя из этого, заполнение данного списка может производиться в любом фрагменте кода, как пока- зано в листинге 19.3. Листинг 19.3. Пример заполнения списка узлов Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый"); Объект.ОбменДанными.Получатели.Добавить(Узел); Объект.3аписать(); Если автоматическая регистрация изменений для объекта отключена и в конфигурации нигде не встречаются строки кода, подобные тем, которые приведены выше (или будут рассматриваться ниже), экземпляры данного объекта никогда не попадут в таблицу регистрации изменений (для данного объекта она будет пустой). Вернемся к примеру с несколькими планами обмена (условия — в преды- дущем разделе). Несмотря на тот факт, что в свойстве Автозаполнение коллекции Получатели (свойства ОбменДанными) установлено значение Истина, для непредопределенных узлов, определенных в плане обмена УдаленныеСклады, регистрация изменений не проводится. Но список получателей перед вызовом обработчиков событий ПередЗаписью и ПередУдалением очищается. Исходя из этого, для ручной регистрации изменений можно в модуле объекта (документа) определить следующий обработчик события (листинг 19.4). ОУ
ГлаваИ 9КЬбмен1данн£|ми Листинг 19.4. Пример обработчика события «ПередЗаписыо» Процедуре ПередЗаписью(Отказ) Если ОбменДанными.Получатели.Автозаполнение Тогда ВключитьРегистрацию(ОбменДанными, Склад); // Проверка, что изменился склад. Если Не ЭтоНовый() Тогда Запрос = Новый Залрос(” ВЫБРАТЬ Склад ИЗ Документ.РасходнаяНакладная ГДЕ Ссылка = &ТекСсылка"); Запрос.УстановитьПараметр("ТекСсылка", Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Выбор ка.Следующий(); Если Выборка.Склад <> Склад Тогда ВключитьРегистрацию(ОбменДанными, Выборка.Склад); КонецЕсли; КонецЕсли; КонецЕсли; // Выводим диагностическое сообщение о регистрации изменений. ВывестиРегистрацию(ЭтотОбъект); КонецПроцедуры В глобальном общем модуле определим следующую процедуру (листинг 19.5). Листинг 19.5. Процедура «ВключитьРегистрациюО» Процедура ВключитьРегистрацию(ОбменДанными, Склад) Экспорт // Получение узлов для конкретного склада. Запрос = Новый Запрос; Запрос-Текст = "ВЫБРАТЬ | УдаленныеСклады.Ссылка |ИЗ | ПланОбмена.УдаленныеСклады КАК УдаленныеСклады ГДЕ | (УдаленныеСклады.Склад = &Склад ИЛИ | УдаленныеСклады.Склад = &ПустойСклад) И | УдаленныеСклады.Ссылка <> &ЭтотУзел"; Запрос.УстановитьПараметр("Склад”, Склад); Запрос.УстановитьПараметр("ПустойСклад", Справочники.Склады.ПустаяСсылка()); Запрос.УстановитьПараметр(”ЭтотУзел", ПланыОбмена.УдаленныеСклады.ЭтотУзел()); Выборка = Запрос.Выполнить().Выбрать(); // Регистрация изменений для выбранных узлов. Пока Выборка.Следующий() Цикл ОбменДанными.ПолучателиДобавить(Выборка.Ссылка); КонецЦикла; КонецПроцедуры
Обе рассмотренные процедуры одновременно решают две задачи: регистрируют изменения для узла, у которого реквизит Склад совпа- дает со складом, указанным в документе; производят проверку (для ранее существовавших документов), не изме- нился ли склад. Если склад изменился, то производится регистрация изменения для узла, значение реквизита Склад которого соответс- твует старому значению документа (хранимому на момент проверки в информационной базе). Далее в момент выгрузки изменений данная регистрация может быть «подменена» на объект УдалениеОбъекта, что приведет к удалению накладной, «не свойственной» узлу. Принудительная регистрация изменений В некоторых случаях может потребоваться принудительная регистрация изменений для какого-либо объекта, их списка (или всех объектов). Для этой цели может использоваться метод ЗарегистрироватьИзме- нения() объекта ПланыОбменаМенеджер. Данный метод позволяет выпол- нять регистрацию изменений одиночных элементов данных или целых групп для одного или нескольких узлов. Первый параметр данного метода — ссылка на узел плана обмена или массив ссылок на узлы, для которых выполняется регистрация изменений. Если первый параметр представляет собой одиночную ссылку на узел, то второй параметр может быть опущен. При этом выполняется регис- трация изменений всех элементов данных, которые на данный момент присутствуют в базе данных и изменения которых могут быть зарегист- рированы для данного узла (листинг 19.6). Листинг 19.6. Регистрация изменений данных для указанного узла Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду(”Новый"); ПланыОбмена.ЗарегистрироватьИзменения(Узел); Данный вариант использования метода может быть полезен для органи- зации начальной передачи данных вновь созданному узлу. Если же первый параметр представляет собой массив ссылок на узлы, то второй параметр обязательно должен быть указан (листинг 19.7). Листинг 19.7. Регистрация изменений элемента данных для указанных узлов Узлы = Новый Массив(2); Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Олтовыйп); Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Розничный"); Данные = Спревочники.Номенклатура.НайтиПоКоду("000000004"); ПланыОбмена.ЗарегистрироватьИзменения(Узлы, Данные); Впрочем, второй параметр может присутствовать и в том случае, если первый параметр — одиночная ссылка на узел. В зависимости от способа Профессиональная разработка в системе «1С:Предприятие 8»
задания второго параметра можно зарегистрировать изменения одного элемента данных или же всех данных, относящихся к одному объекту конфигурации. Кроме этого, можно зарегистрировать удаление объекта (указав в качестве второго параметра объект типа УдалениеОбъекта). Для регистрации изменений одного элемента в качестве второго пара- метра может быть указан сам элемент данных, ссылка на объект базы данных или объект конфигурации. Пример регистрации изменений всех данных, относящихся к объекту конфигурации, приведен в листинге 19.8. Листинг 19.8. Регистрация изменений данных, относящихся к объекту конфигурации Узлы = Новый Массив(2); Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКодуС'Оптовый'); Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Розничный”); ПланыОбмена.ЗарегистрироватьИзменения(Узлы, Метаданные.Справочники.Номенклатура); До сих пор ничего не говорилось об очистке таблицы регистрации изменений. По большому счету существуют две основные стратегии выполнения данного действия: гарантированная доставка сообщений. В этом случае очистка таблиц регистрации изменений производится сразу же после того, как сооб- щение будет сформировано; ожидание квитанции. В этом случае очистка таблиц регистрации изменений производится при приеме сообщения, исходя из номера последнего полученного «от нас» сообщения (этот номер передается как квитанция в заголовке сообщения). Рассмотрим следующий пример. Считаем, что таблица регистрации изменений документа РасходнаяНакладная имеет следующее наполнение (табл. 19.10). Таблица 19.10. Таблица регистрации изменений ДокументСсылка.РасходнаяНакладная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 3 Расходная накладная № 1 от... Розничный Null Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 2 от... Розничный 1 Расходная накладная № 3 от... Оптовый 2 Расходная накладная № 3 от... Розничный 1 Расходная накладная № 4 от... Оптовый 3 Расходная накладная № 4 от... Розничный Null Исходя из данных таблицы, можно сказать, что в узел Оптовый было отправлено три сообщения, в узел Розничный — одно. Том 2
План£|Гобмена1 Используется стратегия ожидания подтверждающей квитанции, при этом от участника обмена Оптовый приходит сообщение, в котором указано, что последнее полученное от «нас» сообщение имело номер 2. Исходя из этой информации, можно удалить изменения, отправленные в сообщениях 1 и 2 (поле НомерСообщения таблицы регистрации изменений). Таблица примет следующий вид (табл. 19.11). Таблица 19.11. Таблица регистрации изменений ДокументСсылка.РасходнаяНакладная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 3 Расходная накладная № 1 от... Розничный Null Расходная накладная № 2 от... Розничный 1 Расходная накладная № 3 от... Розничный 1 Расходная накладная № 4 от... Оптовый 3 Расходная накладная № 4 от... Розничный Null В случае гарантированной доставки таблица регистрации изме- нений очищается сразу после отправки сообщения. Например, таблица регистрации изменений имела следующий вид (табл. 19.12). Таблица 19.12. Таблица регистрации изменений ДокументСсылка.РасходнаяНакладная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 3 Расходная накладная № 1 от... Розничный Null Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 3 от... Оптовый 2 Расходная накладная № 4 от... Оптовый 3 Расходная накладная № 4 от... Розничный Null В узел Розничный формируется сообщение с номером 2. После того как сообщение сформировано, таблица регистрации будет иметь следу- ющий вид (табл. 19.13). Таблица 19.13. Таблица регистрации изменений ДокументСсыпка.РасходнаяНакладная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 3 Расходная накладная № 1 от... Розничный 2 Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 3 от... Оптовый 2 Расходная накладная № 4 от... Оптовый 3 Расходная накладная № 4 от... Розничный 2
ГлаваИ 9КЬбмен1данн£|ми Далее производится вызов метода по удалению записей в таблице регистрации изменений (метод рассматривается чуть позже). Таблица регистрации изменений примет такой вид (табл. 19.14). Таблица 19.14. Таблица регистрации изменений ДокументСсылка.РасходнаяНакпадная Узел Номер сообщения Расходная накладная № 1 от... Оптовый 3 Расходная накладная № 2 от... Оптовый 1 Расходная накладная № 3 от... Оптовый 2 Расходная накладная № 4 от... Оптовый 3 Для удаления записей регистрации изменений у менеджера планов обмена имеется метод УдалитьРегистрациюИзменений(). В качестве первого пара- метра метода может использоваться ссылка на узел или массив таких ссылок. В качестве второго параметра может указываться ссылка на объект, УдалениеОбъекта, объект конфигурации, число (номер сообщения). Для удаления записей таблицы регистрации изменений с номерами сообщения не больше переданного (в примере с номерами 1 и 2) может использоваться фрагмент кода (листинг 19.9). Листинг 19.9. Пример удаления записей таблицы регистрации ЧтениеХМЬ = Новый ЧтениеХМЬ; ЧтениеХМЬ.ОткрытьФайл(ИмяФайла); // Загрузка из найденного файла. ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеХМЬ); // Считаем, что получен номер сообщения, равный 2. НомерПринятого = ЧтениеСообщения.НомерПринятого; ПланыОбмена.УдалитьРегистрациюИзменений(Узел, НомерПринятого); Пример удаления записей регистрации изменений для всех данных, которые зарегистрированы для узла, приведен в листинге 19.10. Листинг 19.10. Пример удаления записей таблицы регистрации Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый"); | ПланыОбмена.УдалигьРегистрациюИзменений(Узел); | Можно удалить записи регистрации изменений конкретного элемента данных для одного или нескольких узлов (листинг 19.11). Листинг 19.11. Пример удаления записей таблицы регистрации Узлы = Новый Массив(2); Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКодуС'Оптовый"); Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду(”Розничный"); Данные = Справочники.Номенклатура.НайтиПоКоду("000000004"); ПланыОбмена.УдалитьРегистрациюИзменений(Узлы .Данные);
Также можно удалить записи регистрации изменений всех данных, отно- сящихся к объекту конфигурации для одного или нескольких узлов (листинг 19.12). Листинг 19.12. Пример уделения записей таблицы регистреции Узлы = Новый Массив(2); Узлы[0] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый"); Узлы[1] = ПланыОбмена.УдаленныеСклады.НайтиПоКоду('Розничный"); ПланыОбмена.УдалитьРегистрациюИзменений(Узлы, Метаданные. Справочники.Номенклатура); Инфраструктура сообщений Важнейшей составляющей инфраструктуры сообщений являются сами сообщения. Как уже отмечалось, сообщения передаются в рамках плана обмена от одного узла другому. То есть каждое сообщение точно ассоции- ровано с планом обмена, имеет одного отправителя и одного получателя. Рассмотрим, что такое сообщение. Сообщение оформляется как документ XML, имеющий определенную структуру. В качестве примера рассмотрим следующее сообщение (листинг 19.13). Листинг 19.13. Пример сообщения обмена <?xml version="1.0" encoding="UTF-8" ?> <v8msg:Messagexmlns:v8msg-'http://v8.1c.ru/messages"> <v8msg:Header> <у8твд:ЕхсЬапдеР1ап>УдаленныеСклады</у8твд:ЕхсЬапдеР1ап> <v8msg:To>OnroBbM</v8msg:To> <v8msg:From>L(eHTpO0HC<v8msg:From> <v8msg:MessageNo>20</v8msg:MessageNo> <v8msg:ReceivedNo>15</v8msg:ReceivedNo> </v8msg:Header> <v8msg:Body> <!— Тело сообщения -> </v8msg:Body> </v8msg:Message> Все сообщение находится внутри элемента XML с именем Message, отно- сящимся к пространству имен http://v8.1c.ru/messages. Сообщение делится на заголовок Header и тело сообщения Body. Оба относятся к пространству имен http://v8.1c.ru/messages. Структура заголовка жестко задана. Информация заголовка пред- ставлена в нескольких элементах XML, вложенных в элемент Header. Все элементы, вложенные в элемент Header, относятся к пространству имен http://v8.1c.ru/messages: элемент с именем ExchangePlan содержит имя плана обмена, к кото- рому относится сообщение; элемент с именем From содержит код узла-отправителя; Профессиональная разработка в системе «1С:Предприятие 8»
элемент с именем То содержит код узла, для которого предназначено сообщение; элемент с именем MessageNo содержит номер данного сообщения. Номер сообщения является положительным целым числом и присваи- вается узлом-отправителем. Номер каждого последующего сообщения равен номеру предыдущего отправленного сообщения плюс 1; элемент с именем Received No содержит максимальный номер сооб- щения, которое узел-отправитель данного сообщения принял от узла-получателя данного сообщения. Данное значение включено в состав заголовка сообщения для подтверждения приема сообщений. Тело сообщения содержится в элементе XML с именем Body, относя- щемся к пространству имен http://v8.1c.ru/messages. Данный элемент может иметь произвольное содержимое, определяемое прикладными потребнос- тями. Инфраструктурой сообщений содержимое тела сообщения никак не регламентируется. Пример создания сообщения для выгрузки данных (листинг 19.14). Листинг 19.14. Пример сообщения для выгрузки данных ЗаписьХМЬ = Новый ЗаписьХМЦ); ЗаписьХМЬ.ОткрытьФайл("с:\выгрузка.хтГ); ЗаписьХМЬЗаписатьОбъявлениеХМЦ); Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду("Оптовый"); // Создаем объект "ЗаписьСообщенияОбмена". ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьХМЬ, Узел); // Запись тела сообщения. ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьХМ1.3акрыть(); Выгрузка данных сопровождается созданием объекта с типом ЗаписьСо- общенияОбмена (переменная ЗаписьСообщения). Сразу после создания этот объект еще «не знает» своего номера, получателя и т. п. Вся подобная информация указывается при выполнении метода НачатьЗапись(). В качестве первого параметра передается объект ЗаписьХМЦ в качестве второго — ссылка на узел плана обмена (ссылка на получателя). При выполнении этого метода сообщению присваивается номер, определя- емый как номер предыдущего отправленного сообщения, увеличенный на 1 (информация берется их узла-получателя). Производится запись в XML- документ заголовка сообщения, а также записывается начало элемента XML, соответствующего телу сообщения. Устанавливается блокировка на запись базы данных, соответствующая узлу плана обмена. Том 2
План£|Гобмена1 Завершить запись сообщения можно с помощью двух методов объекта ЗаписьСообщенияОбмена: ЗакончитьЗаписьО, ПрерватьЗапись(). Вызов метода ПрерватьЗапись() прерывает запись сообщения, при этом оно считается неотправленным (счетчик отправленных сообщений в итоге не увеличивается). Неявный вызов этого метода происходит также в случае повторного вызова метода НачатьЗапись() (без последую- щего вызова метода ЗакончитьЗаписьО) либо при разрушении (окончании времени жизни переменной, связанной с объектом) объекта ЗаписьСооб- щенияОбмена. Метод ЗакончитьЗаписьО осуществляет нормальное завершение записи сообщения. В этом случае в сообщение записывается конец элемента XML (представляющего тело сообщения). В узел плана обмена записы- вается номер сообщения обмена данными. С записи узла плана обмена снимается блокировка, и сообщение считается отправленным. Для чтения записанного в файл сообщения обмена в базе узла-получателя может использоваться следующий фрагмент кода (листинг 19.15). Листинг 19.15. Пример чтения сообщения обмена ЧтениеХМБ = Новый ЧтениеХМБ; ЧтениеХМЬОткрытьФайл('с:\выгрузка.хтГ); // Создаем объект "ЧтениеСообщенияОбмена”. ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеХМЬ,ДопустимыйНомерСообщения.Больший); // Чтение тела сообщения. ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеХМ1_.Закрыть(); После открытия XML-документа, содержащего сообщение, создается объект ЧтениеСообщенияОбмена. Чтение данных начинается с выпол- нения метода НачатьЧтение() объекта ЧтениеСообщенияОбмена. При этом производится чтение заголовка сообщения обмена данными, проверя- ются содержащиеся в заголовке данные. Если какие-либо данные указаны неправильно (задан неизвестный план обмена, указан узел, не входящий в план обмена, номер сообщения не соответствует ожидаемому), иници- ируется исключение. При начале чтения сообщения устанавливается блокировка на запись узла плана обмена. Используя второй параметр метода, можно установить вариант ожидаемого номера сообщения: любой (фактически контроль номеров сообщения не производится); очередной (строго больший на единицу, чем предыдущий); больший.
ГлаваУ! 9КЬбмен!данн£|ми Следует обратить внимание на тот факт, что в приведенном фрагменте кода нет ни указания на используемый план обмена (их в конфигурации может быть несколько), ни указания на узел-отправитель. Данная инфор- мация получается из заголовка сообщения (в случае невозможности определения, как и было сказано выше, возникает исключение). Завершить чтение сообщения можно с использованием двух методов: ЗакончитьЧтение(), ПрерватьЧтение(). Обращение к методу ПрерватьЧтение() вызывает немедленное прерывание чтения сообщения. Блокировка с записи узла плана обмена снимается. В соответствующий узел плана обмена не вносится никаких изменений (не изменяется номер последнего принятого сообщения). Этот же метод вызывается неявно при разрушении (окончании времени жизни пере- менной, связанной с данным объектом) объекта ЧтениеСообщенияОбмена или перед повторным вызовом метода НачатьЧтение(). Выполнение метода ЗакончитьЧтение() вызывает попытку нормаль- ного завершения чтения сообщения. При этом проверяется нормальное завершение сообщения (текущим элементом в объекте ЧтениеХМЬ явля- ется конец элемента, реализующего само сообщение). Номер принятого сообщения помещается в реквизит НомерПринятого узла плана обмена. Блокировка записи узла плана обмена снимается, и сообщение считается принятым. УНИВЕРСАЛЬНЫЙ МЕХАНИЗМ ОБМЕНА ДАННЫМИ Универсальный механизм обмена данными может использоваться как вместе с механизмом распределенных информационных баз, так и по отдельности (для решения задач организации обмена данными информаци- онных баз «1С:Предприятия» с различными программными системами). В качестве программных систем, с которыми может быть организован универсальный обмен данными, могут выступать другие информационные базы «1С:Предприятия», в том числе с отличающимися конфигурациями, совершенно другие программные комплексы (в этом и состоит отличие от механизма распределенных информационных баз, в рамках которого орга- низуется обмен между базами данных с идентичными конфигурациями). К универсальному механизму обмена данными могут быть отнесены: средства чтения и записи документов XML, XML-сериализация, планы обмена.
Функциональность планов обмена была рассмотрена в преды- дущих разделах данной главы. Возможности базовых средств чтения и записи XML-документов подробно рассматриваются в разделе «Работа с XML-документами» на стр. 423. При желании узнать о данных механизмах больше рекомендуем обратиться к соответствующим разделам книги. Использование возможностей работы с XML-документами До данного момента рассматривались только механизмы регистрации и удаления регистрации изменений. Рассмотрим пример кода, реализу- ющий (в рамках универсального обмена) полный цикл выгрузки данных (включает в себя выборку данных, для которых были зарегистрированы изменения). При этом в качестве файлов «носителей данных» будут использоваться документы XML. Следует отметить, что обмен данными может выполняться через файлы других форматов, но создать объекты ЧтениеСообщения и ЗаписьСооб- щения без указания в качестве параметра объектов ЧтениеХМЬ и ЗаписьХМЬ нельзя (листинг 19.16). Листинг 19.16. Пример выгрузки данных ЗаписьХМЬ = Новый ЗаписьХМЦ) ЗаписьХМЬОткрытьФайл(ИмяФайлаСообщения); Узел = ПланыОбмена.УдаленныеСклады.НайтиПоКоду(КодУзла); ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьХМЬ, Узел); Выборка = ПланыОбмена.ВыбратьИзменения(Узел, ЗаписьСообщения.НомерСообщения); Пока Выборка.Следующий() Цикл Данные = Выборка. Получигь(); ЗаписатьХМЦЗаписьХМЬ, Данные); КонецЦикла; ЗаписьСообщения.ЗакончитьЗапись(); Для получения выборки данных, для которых зарегистрированы изме- нения, используется метод ВыбратьИзменения(). Для обхода полученных данных используется метод Следующий() выборки. В процессе выборки изменений в записи таблиц регистрации изменений (которые раньше не выгружались и у которых, соответственно, в поле таблицы НомерСооб- щения находится значение Null) проставляется номер сообщения обмена данными, в котором должны передаваться изменения. Представленный алгоритм выгрузки предполагает, что отправ- ленные сообщения могут быть потеряны по тем или иным причинам. Если потерь сообщения не может быть в принципе (гарантированная доставка), то в конце алгоритма можно поместить следующую строку (листинг 19.17). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 19.17. Удаление регистрации изменений при гарантированной доставке ПланыОбмена.УдалигьРегистрациюИзменений(Узел, НомерСообщения); | В этом случае из таблицы регистрации изменений будут удалены записи, относящиеся к узлу, ссылка на который передана в качестве первого пара- метра метода. Причем будут удалены не все записи, а только те, в которых номер сообщения равен или меньше того значения, которое передано в качестве второго параметра метода. Это те записи, в которых была произведена первая отправка изменений. Фрагмент кода, в котором производится чтение сообщения, содержащего измененные данные, выглядит следующим образом (листинг 19.18). Листинг 19.18. Пример чтения сообщения обмена ЧтениеХМЬ = Новый ЧтениеХМЦ) ЧтениеХМЬ.ОткрытьФайл(ИмяФайлаСообщения); ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщенияО; ЧтениеСообщения.НачатьЧтение(ЧтениеХМЬ); ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого); Пока ВозможностьЧтенияХМЦЧтениеХМЬ) Цикл Данные = ПрочитатьХМЦЧтениеХМЦ; Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Данные.ОбменДанными.Загрузка = Истина; Данные.3аписать(); КонецЦикла; ЧтениеСообщения.ЗакончитьЧтение(); В приведенных выше примерах чтения и записи сообщений не учиты- валось, что при обмене данными может случиться так, что один и тот же элемент данных будет изменен одновременно в двух обменивающихся данными узлах. В этом случае непонятно, какое из изменений должно быть в конечном счете принято. Такая ситуация называется коллизией. Один из способов разрешить коллизию — определить, какой из узлов явля- ется главным, а какой — подчиненным. При этом должно быть принято изменение, сделанное в главном узле, а изменение, сделанное в подчи- ненном узле, должно быть отвергнуто. Для реализации этого при приеме сообщения перед записью данных необходимо установить, зарегистрировано ли изменение этих данных, и в зависимости от роли узла в данной паре получатель-отправитель принять решение: записывать или не записывать данные. Ниже (листинг 19.19) приведен пример реализации стратегии «главный — подчиненный» при чтении сообщения. Предполагается, что для хранения роли узла в плане обмена был определен реквизит Главный, имеющий тип Булево. Том 2
Листинг 19.19. Пример реализации стратегии главный - подчиненный ЧтениеХМЬ = Новый ЧтениеХМЦ) ЧтениеХМЬОткрытьФайл(ИмяФайлаСообщения); ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения. НачатьЧтение(ЧтениеХМ1_); ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения. НомерПринятого); Отправитель = ЧтениеСообщения.Отправитвль; Главный = Отправитель.Главный; Пока ВозможностьЧтенияХМЦЧтениеХМЦ Цикл Данные = ПрочитатьХМЦЧтениеХМЬ); Если Главный ИЛИ (Не ПланыОбмена.ИзменениеЗарегистрировано(Отправитвль, Данные)) Тогда Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитвль; Данные.ОбменДанными.Загрузка = Истина; Данные.3аписать(); КонецЕсли; КонецЦикла; ЧтениеСообщения.ЗакончитьЧтение(); Следует обратить внимание на необходимость установки у загружаемого элемента данных свойства Загрузка в значение Истина. В обработчиках событий записи объекта рекомендуется отслеживать данный режим и не делать каких-либо проверок на корректность заполнения, присутствие каких-либо связанных данных. Это обусловлено тем фактом, что на момент загрузки данного объекта другие объекты могут быть еще не загружены. Пример реализации универсального обмена Рассмотрим пример реализации механизмов универсального обмена. ПОДРОБНЕЕ Познакомиться с этим примером можно в демонстрационной конфигу- рации «Обмен данными», прилагающейся к книге на компакт-диске. В демонстрационной конфигурации определен план обмена Удален- ныеСклады. У данного плана обмена определены следующие реквизиты: Склад (тип СправочникСсылка.Склады) — ссылка на склад, представля- ющий данный узел; Главный (тип Булево) — для реализации стратегии «главный — подчи- ненный»; АдресОбмена (строка)—для указания ресурса, куда выгружаются сфор- мированные сообщения и откуда они загружаются; Описание (строка) - содержит описание участника обмена.
ГлаваУ! 9КЬбмен1данн£|ми У плана обмена определены следующие узлы: Центральный офис (предопределенный узел, код ЦентрОфис); Склад розничный (код Розница); Склад оптовый (код Опт). Свойство Главный не может быть установлено у предопределенного узла, соответствующего текущей информационной базе. Реквизит Склад узла ЦентрОфис содержит пустую ссылку. Следует отметить, что в реальной жизни для каждого узла (через рекви- зиты, табличные части плана обмена) можно указывать используемые способы доставки сообщений (электронная почта, FTP, MSMQ и т.п.). Особенности организации доставки сообщений разными способами рассматриваются в главе 18 «Интеграция с другими информацион- ными системами» на стр. 413. При желании познакомиться с данными механизмами поближе рекомендуем обратиться к данной главе. Состав плана обмена представлен на рисунке 19.6. План обмена УдаленныеСклады: Состав Действия • I 35 । Объекты Авгорегистраиия «• 0а? <+:• 0ffl Справочники Ф 00 Документы Ф 0S Регистры сведений <*•' 0И Регистры накопления Выбранные объекты: ЙЙ1К Эа Название0рган«зацни 6- И Справочники И Склады И Номенклатура И Контрагенты И ТиыЦен 6- Q Документы Q ПриходнатНаклаоная П РасходнаяНаклаоная Н Регистры сведений Н ЦеныНоменклетуры $ 0 Регистры накопления 0 УчетНоменклагуры Авторегистрация 1*1 Разрешить 1*1 Разрешить 0 Разрешить Ы Разрешить 0 Разрешить 0 Разрешить 0 Запретить 0 Разрешить 0 Запретить Рис. 19.6. Состав плана обмена Обратите внимание, что некоторые объекты (Документ.РасходнаяНа- кладная, РегистрНакопления.УчетНоменклатуры) входят в состав плана обмена, и при этом авторегистрация для них запрещена (при изме- нении соответствующих объектов список узлов получателей свойства ОбменДанными автоматически не заполняется). Это сделано, чтобы проде- монстрировать ручное управление регистрацией изменений.
При решении задачи обмена следует принять во внимание следующие моменты: при обмене каждая накладная должна уйти в свой узел (реквизит Склад узла плана обмена должен совпасть со складом, выбранным в документе); пользователям разрешается менять склад в документе. Если документ уже ушел в неправильный узел, он должен в нем удалиться и отпра- виться в правильный. Если у документа РасходнаяНакладная с помощью свойства ОбменДан- ными будет включен режим Автозаполнение, то при программном создании этого документа необходимо самостоятельно зарегистрировать документ в нужных узлах. Для этого в модуле объекта РасходнаяНак- ладная разместим обработчик события ПередЗаписыо (листинг 19.20). Листинг 19.20. Обработчик события «ПередЗаписыо» документа «РасходнаяНакладная» Процедура ПередЗаписыо(Отказ) Если ОбменДанными.Получатели.Автозаполнение Тогда ОбменСУдаленнымиСкладами.ВключитьРегисграцию(ОбменДанными, Склад); // Проверка, что изменился склад. Если Не ЭтоНовый() Тогда Запрос = Новый Запрос(" ВЫБРАТЬ Склад ИЗ Документ.РасходнаяНакладная ГДЕ Ссылка = &ТекСсылка"); Запрос.УстановитьПараметр("ТекСсылка”, Ссылка); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий!); Если Выборка.Склад <> Склад Тогда ОбменСУдаленнымиСкладами.ВключитьРегистрацию( ОбменДанными, Выборка.Склад); КонецЕсли; КонецЕсли; КонецЕсли; // Выводим диагностическое сообщение о регистрации изменений. ОбменСУдаленнымиСкладами.ВывестиРегистрацию(ЭтотОбъект); КонецПроцадуры В данном обработчике (в случае включения режима Автозаполнение) производится проверка соответствия выбранного склада в объекте и записанного в информационной базе. В случае расхождения доку- мент регистрируется как для нового узла (в соответствии с измененным складом), так и для старого. Процедура с аналогичным назначением определена в модуле набора записей регистра накопления УчетНоменклатуры (листинг 19.21). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 19.21. Обработчик события «ПередЗаписыо» набора записей регистра «УчетНоменкпатуры» Процедура ПередЗаписью(Отказ) Если ОбменДанными.Получатели.Автозаполнение Тогда СкладНабора = Неопраделено; // Для каждой записи набора. Для Каждого Запись Из ЭтотОбъект Цикл Если СкладНабора = Неопраделено ИЛИ Запись.Склад <> СкладНабора Тогда ОбменСУдаленнымиСкладами.ВключигьРегистрацию( ОбменДанными, Запись.Склад); КонецЕсли; СкладНабора = Запись.Склад; КонецЦикла; // Проверка, что изменился склад. Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ Различные | Склад |ИЗ | РегистрНакопления.УчетНоменклатуры |ГДЕ | Регистратор = &ТекСсылка"; Запрос.УстановитьПараметр(”ТекСсылка", Отбор.Регистратор.Значение); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // Включаем регистрацию изменений для ОбменСУдаленнымиСкладами.ВключитьРегистрацию( ОбменДанными, Выборка.Склад); КонецЦикла; КонецЕсли; // Выводим диагностическую информацию по набору записей. ОбменСУдаленнымиСкладами.ВывестиРегисграцию(ЭтотОбьект); КонецПроцедуры Обе эти процедуры используют процедуры ВключитьРегистрацию() и ВывестиРегистрацию(). Они определены в общем модуле ОбменСУдален- нымиСкладами (листинги 19.22, 19.23). Листинг 19.22. Процедура «ВывестиРегистрацию()» Процедура ВывесгиРегисграцию(Данные) Экспорт ОбменДанными = Данные.ОбменДанными; Сообщение = Новый СообщениеПользователю(); Сообщение.Тексг = ” - Регистрация" + Данные.Метаданные() ++ Строка(Данные); Сообщение.Сообщить(); // Вывод списка узлов, куда будет выполняться регистрация. Для Каждого Получатель Из ОбменДанными.Получатели Цикл Том 2
Если He ОбменДанными.Отправитель = Получатель Тогда Сообщение.Текст = + Получатель; Сообщение.Сообщить(); КонецЕсли; КонецЦикла; КонецПроцедуры Процедура ВывестиРегистрацию() выводит в окно сообщений данные об объекте, регистрация которого произошла, и узлах-получателях, для которых эта регистрация произошла. Листинг 19.23. Процедура «ВключитьРегистрациюО» Процедура ВключитьРегистрацию(ОбменДанными, Склад) Экспорт // Получение узлов для конкретного склада. Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ УдаленныеСклады.Ссылка ИЗ ПланОбмена.УдаленныеСклады КАК УдаленныеСклады ГДЕ (УдаленныеСклады.Склад = &Склад ИЛИ УдаленныеСклады.Склад = &ПустойСклад) И УдаленныеСклады.Ссылка <> &ЭтотУзел"; Запрос.УстановитьПараметр(''Склад", Склад); Запрос.УстановитьПараметрГПустойСклад", Справочники.Склады.ПустаяСсылка()); Запрос.УстановитьПараметр("ЭтотУзел", ПланыОбмена.УдаленныеСклады.ЭтотУзел()); Выборка = Запрос.Выполнигь().Выбрать(); // Регистрация изменений для выбранных узлов. Пока Выборка.Следующий() Цикл ОбменДанными.Получатели.Добавить(Выборка.Ссылка); КонецЦикла; КонецПроцадуры Задача процедуры ВключитьРегистрациюО — определить всех возможных получателей регистрируемого изменения. В этот список попадут те узлы, у которых в реквизите Склад содержится ссылка на интересующий нас склад либо пустая ссылка (что расширяет функциональность решения). И, естественно, этот получатель не должен быть предопределенным узлом данного плана обмена. Для осуществления обмена по плану обмена УдаленныеСклады создана обработка ОбменСУдаленнымиСкладами. Она позволяет решать следу- ющие задачи: полная регистрация изменений для выбранного узла, удаление регистрации изменений для выбранного узла, выполнение выгрузки данных в узел, выполнение загрузки данных из узла. Рассмотрим реализацию данных механизмов.
ГлаваУ! ЭКОбмен/данн^ми Полная регистрация изменений для узла Полная регистрация изменений для выбранного узла производится с использованием одноименной процедуры, определенной в общем модуле ОбменСУдаленнымиСкладами. У данной процедуры два параметра. В первый передается ссылка на узел, для которого необходимо выполнить регистрацию изменений. Во второй параметр передается значение типа Булево. Если это значение Истина, то для данного узла будет выполняться регистрация изменения всех объектов (невзирая на принадлежность данного узла к какому-либо определенному складу). Такой же вариант регистрации будет осуществлен, если в качестве первого параметра будет передан узел, у которого в реквизите Склад содержится пустая ссылка. Достигается полная регистрация всех объектов вызовом метода Зарегис- трироватьИзменения() без указания второго параметра (его значение по умолчанию Неопределено). При этом на отключенную авторегистрацию (для документов Расходная Накладная и наборов записей регистра накоп- ления УчетНоменклатуры) внимания не обращается (листинг 19.24). Листинг 19.24. Полная регистрация изменений для узла Процедуре ПолнаяРегистрацияДанныхПоУзлу(Узел, РегистрироватьВсе) Экспорт // Регистрация изменений всех данных для узла производится в случае // значения параметра РегистрироватьВсе = Истина или // значение склада в узле не установлено. Сообщение = Новый СообщениеПользователю(); Если РегистрироватьВсе Или Узел.Склад.Пустая() Тогда Сообщение.Тексг = "Регистрация всех данных для узла" + Узел; Сообщение.Сообщить(); ПланыОбмена.ЗарегистрироватьИзменения(Узел); Иначе Сообщение.Тексг = "Регистрация данных для узла" + Узел +"-----"; Сообщение.Сообщить(); ПланОбмена = Узел.Метаданные(); Состав = ПланОбмена.Состав; Для Каждого ЭлементСостава Из Состав Цикл Сообщение.Тексг = "Регистрация данных" + ЭлементСостава.Метаданные + "для узла" + Узел; Сообщен ие.Сообщить(); Если ЭлементСостава.Метаданные = Метаданные.Документы.РасходнаяНакладная Тогда II Для документов "РасходнаяНакладная" регистрация изменений //для узла производится только при совпадении складов узла и накладной. // Выбираем документы "РасходнаяНакладная" по складу узла. Запрос = Новый Запрос("ВЫБРАТЬ Ссылка ИЗ Документ.РасходнаяНакладная ГДЕ Склад = &Склад"); Запрос.УстановитьПараметр("Склад", Узел.Склад); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // Регистрируем изменение документа для узла. ПланыОбмена.ЗарегистрироватьИзменения(Узел, Выборка.Ссылка);
КонецЦикла; ИначеЕсли ЭлементСостава.Метаданные = Метаданные.РегистрыНакопления.УчетНоменклатуры Тогда // Выбираем всех различных регистраторов регистра. Запрос = Новый Запрос("ВЫБРАТЬ РАЗЛИЧНЫЕ Регистратор ИЗ РегистрНакопления.УчетНоменклатуры ГДЕ Склад = &Склад"); Запрос.УстановитьПараметрС'Склад", Узел.Склад); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл // Создаем набор записей регистра с отбором // по регистратору. НаборЗаписей = РегистрыНакопления.УчетНоменклатуры. СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Регистратор.Установить(Выборка.Регистратор); // Регистрируем изменения набора записей для узла. ПланыОбмена.ЗарегистрироватьИзменения(Узел, НаборЗаписей); КонецЦикла; Иначе // Регистрация изменений всах данных объекта для узла. ПланыОбмена.ЗарегистрироватьИзменения(Узел, ЭлементСостава.Метаданные); КонецЕсли; КонецЦикла; // обход состава плана обмена КонецЕсли; КонецПроцадуры Если в качестве второго параметра передается значение Ложь, расходные накладные и записи регистра накопления регистрируются как измененные только в случае совпадения склада со складом, определенным в узле плана обмена. Все остальные данные регистрируются обычным образом. Удаление регистрации изменений для узла Для осуществления данного действия в общем модуле ОбменСУдален- нымиСкладами определена процедура, текст которой приведен ниже. В качестве параметра передается ссылка на узел, для которого должна произойти очистка таблиц регистрации изменений (листинг 19.25). Листинг 19.25. Удаление регистрации изменений для узла Процадура ПолноеУдалениеРегистрецииДанныхПоУзлу(Узвл) Экспорт Сообщение = Новый СообщениеПользоватвлю(); Сообщение.Тексг = "Удаление регистрации всех данных для узла" + Узел; Сообщение.Сообщигь(); ПланыОбмена.УдалитьРегистрациюИзменений(Узел); КонецПроцедуры Профессиональная разработка в системе «1С:Предприятие 8»
Выполнение выгрузки данных в узел Приведенная ниже процедура может являться обработчиком события нажатия кнопки либо гиперссылки. С помощью нее инициируется процесс выгрузки данных (листинг 19.26). Листинг 19.26. Процедура, инициирующая выгрузку данных &НаКпиенте Процедура ВыполнитьВыгрузку(Команда) ВыполнитьВыгрузкуНаСервере(); КонецПроцедуры &НаСервере Процедура ВыполнитьВыгрузкуНаСервере() // Получаем объект узла обмена. УзелОбмена = Узел.ПолучитьОбъект(); // Записываем новое сообщение обмена. УзелОбмена.ЗаписатьСообщениеСИзменениями(); КонецПроцедуры В обработке выбирается узел обмена. Ссылка на выбранный узел сохраняется в реквизите обработки Узел, имеющем тип ПланОбме- наСсылка.УдаленныеСклады. Затем в процедуре выгрузки данных из этой ссылки получается объект ПланОбмена и вызывается метод Запи- сатьСообщенияСИзменениями() этого объекта, реализующий собственно сам процесс выгрузки данных. Взаимосвязь основных процедур и функций, используемых для про- ведения выгрузки, можно проиллюстрировать следующей схемой (рис. 19.7). Рис. 19.7. Взаимосвязь процедур и функций для выгрузки измененных данных Том 2
В процедуре ЗаписатьСообщенияСИзменениями(), определенной в модуле плана обмена (листинг 19.27), производится вызов процедур и функций, которые решают следующие задачи: получение имени файла по заранее установленным правилам (извес- тным на принимающей стороне); вызов функции, в которой производится запись сообщения в файл с именем, переданным в качестве параметра; вызов процедуры, осуществляющей доставку файла по указанному пути; удаление сформированного файла. Листинг 19.27. Процедура «ЗаписетьСообщениеСИзменениями()» Процедура ЗаписатьСообщениеСИзменениями() Экспорт // Формируем имя временного файла. ИмяФайла = КаталогВременныхФайлов() + т + ОбменСУдаленнымиСкладами.ПолучитьИмяФайлаОбмена( ПланыОбмена.УдаленныеСклады.ЭтотУзел(), Ссылка, "_W"); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст ='----Выгрузка в узел" + Строка(ЭтотОбъект) + ”----"; Сообщение.Сообщить(); // Записываем новое сообщение обмена в файл. НомерСообщения = ЗаписатьНовоеСообщение(ИмяФайла); // Публикуем файл с сообщением обмена. ОпубликоватьФайлОбмена(ИмяФайла, НомерСообщения); Попытка // Удаляем файл с сообщением обмена. УдалитьФайлы(ИмяФайла); Исключение КонецПопытки; Сообщение.Текст = °---Конец выгрузки-------"; Сообщение.Сообщить(); КонецПроцедуры Функция ПолучитьИмяФайлаОбмена(), листинг 19.28, расположенная в общем модуле ОбменСУдаленнымиСкладами, собирает имя файла из ключевого слова Message, добавляя код узла источника и приемника. У файла определяется расширение XML (листинг 19.28). Листинг 19.28. Функция «ПолучитьИмяФайлаОбменаО» Функция ПолучитьИмяФайлаОбмена(УзелИсточник, УзелПриемник, Постфикс ="”) Экспорт // Формируем имя файла, исходя из кодов источника и приемника сообщения обмена. Возврат "Message" + СокрЛП(УзелИсточник.Код) + + СокрЛП(УзелПриемник.Код) + СокрЛП(Постфикс) + ".xml"; КонецФункции
ГлаваИ 9КЬбмен1данн£|ми В функции ЗаписатьНовоеСообщение(), листинг 19.29, в XML-файл с переданным в качестве параметра именем начинается запись данных. Для сокращения размера файла сообщения первоначально определяется соответствие используемым пространствам имен. Создается новое сооб- щение, производится выборка изменений. Функция определена в модуле плана обмена, ссылка на узел-получатель получается из контекста выпол- нения функции (одноименное свойство Ссылка). Выбранные данные с помощью вызова функции НуженПереносДанных(), листинг 19.30, проверяются на необходимость выгрузки. В случае, если выгрузка производится, вызываются процедуры ЗаписатьДанные(), листинг 19.31, и ВывестиДанные(), листинг 19.32. В противном случае вызывается процедура УдалениеДанных(), листинг 19.33. Все моменты, связанные с интерфейсной частью механизма (вывод информационных сообщений), выполняются только на стороне клиента (отмечено директи- вами препроцессора). Листинг 19.29. Функция «ЗаписатьНовоеСообщениеО» Функция ЗаписатьНовоеСообщение(ИмяФайла) НомерСообщения = 0; // Создаем объект записи XML. ЗаписьХМЬ = Новый ЗаписьХМЬ; ЗаписьХМЬ.ОткрытьФайл(ИмяФайла); ЗаписьХМЬЗаписатьОбъявлениеХМЦ); // Создаем новое сообщение. ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьХМЬ, Ссылка); II Для сокращения размера файла сообщения записываем соответствие пространств имен. ЗаписьХМ1.3аписатьСоответствиеПространстваИмен("хвсГ, "http://www.w3.org/2001/XMLSchema"); ЗаписьХМЬ.ЗаписатьСоответствиеПространстваИмен("хв|", "http://www.w3.org/2001/XMLSchema-instance"); ЗаписьХМЬЗаписатьСоответствиеПространстваИмен(\8", "http://v8.1c.nj/data"); НомерСообщения = ЗаписьСообщения.НомерСообщения; Сообщение = Новый СообщениеПользователю(); Сообщение.Тексг = "Номер сообщения:" + НомерСообщения; Сообщение.Сообщить(); // Получаем выборку измененных данных. Счетчик = 0; ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(ЗаписьСообщения.Получатель, НомерСообщения); Пока ВыборкаИзменений.Следующий() Цикл Данные = ВыборкаИзменений.Получить/); #Если Клиент Тогда Счетчик = Счетчик + 1; Состояние("Выгрузка данных:" + Строка(Счетчик)); #КонецЕсли
II Если перенос данных не нужен, то, возможно, // необходимо записать удаление данных. Если Не НуженПереносДанных(Данные) Тогда // Получаем значение с возможным удалением данных. УдалениеДанных(Данные); КонецЕсли; // Записываем данные в сообщение. ЗаписатьДанные(ЗаписьХМЬ, Данные); #Если Клиент Тогда // Выводим диагностическое сообщение о записанных данных. ВывестиДанные(Данные); #КонецЕсли КонецЦикла; // Завершаем запись сообщения. ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьХМЬ.Закрыть(); Возврат НомерСообщения; КонецФункции Функция НуженПереносДанных(), см. листинг 19.30, реализует стратегию распространения данных. Документы ПриходнаяНакладная и РасходнаяНа- кладная (и соответствующие им наборы записей регистра накопления) выгружаются только в случае, если значения реквизита Склад документов (и наборов записей регистра накопления) совпадают по значению с одно- именным реквизитом, определенным для узла получателя. Для набора записей регистра накопления производится проверка на то, что во всех записях используется один склад. Данная проверка может и не проводиться, если такая ситуация изначально не может встретиться. Листинг 19.30. Функция «НуженПереносДанных()» Функция НуженПереносДанных(Данные) Перенос = Истина; Если ТипЗнч(Данные) = Тип("ДокументОбъект.ПриходнаяНакладная") ИЛИ ТипЗнч(Данные) = Тип('ДокументОбъект.РасходнаяНакладная") Тогда // Проверяем, что у документов склад совпадает. Если Не Склад.Пусгая() И Данные.Склад <> Склад Тогда Перенос = Ложь; КонецЕсли; ИначеЕсли ТипЗнч(Данные) = Тип(“РегистрНакопленияНаборЗаписей.УчетНоменклатуры") Тогда // Проверяем, что у записей набора склад совпадает. СкладНабора = Неопределено; Для Каждого Запись Из Данные Цикл Если СкладНабора <> Неопределено И Запись.Склад <> СкладНабора Тогда ВызватьИсключение "Склад должен быть одинаковый для всех записей"; Профессиональная разработка в системе «1С:Предприятие 8»
КонецЕсли; СкладНабора = Запись.Склад; КонецЦикла; Если Не Склад.Пустая() И СкладНабора <> Склад Тогда Перенос = Ложь; КонецЕсли; КонецЕсли; Возврат Перенос; КонецФункции Рассматриваемый механизм выгрузки данных относится к разряду универсальных и подразумевает, что обмен данных производится между конфигурациями, имеющими разную структуру. В процедуре ЗаписатьДанные(), см. листинг 19.31, производится разделение данных на те, которые выгружаются в индивидуальном порядке (в нашем случае это элементы справочника Номенклатура) и с помощью метода платформы ЗаписатьХМЦ). ПОДРОБНЕЕ Процедура НоменклатураЗаписатьхМЦ) рассматривается более под- робно в разделе «Пример реализации обмена при разной структуре объектов конфигурации», стр. 441. Листинг 19.31. Процедура «ЗаписатьДанныеЦ» Процедура ЗаписатьДанные(ЗаписьХМЦ Данные) Удаление = ?(ТипЗнч(Данные) = ТипС'УдалениеОбъекта”), Истина, Ложь); // Получаем объект описания метаданного, соответствующий данным. ОбьектМетаданных = ?(Удаление, Данные. Ссылка.Метаданные(), Данные.Метаданные()); // Если выгружаемыми данными яаляется Справочник.Номенклатура, // то его выгружаем вручную. Если Не Удаление И ОбьектМетаданных = Метаданные.Справочники.Номенклатура Тогда // Записываем элемент справочника вручную. НоменклатураЗаписатьХМЦЗаписьХМЬ, Данные); Иначе // Записываем данные с помощью стандартного метода. ЗаписатьХМЦЗаписьХМЬ, Данные); КонецЕсли; КонецПроцедуры Текст процедуры, производящей вывод диагностических сообщений, приведен ниже (см. листинг 19.32). Том 2
Листинг 19.32. Процедура «ВывестиДанныеО» Процедура ВывестиДанные(Данные) Перем Представление; Если ТипЗнч(Данные) = Тил(”УдалениеОбъекта”) Тогда Представление = "Удаление объекта:" + Строка(Данные.Ссылка.Метаданные()) + + Строка(Данные.Ссылка); Иначе Представление = Строка(Данные.Метаданные()) ++ Строка(Данные); КонецЕсли; Сообщение = Новый СообщениеПользователю(); Сообщение.Тексг = + Представление; Сообщение.Сообщить(); КонецПроцедуры Если данные (полученные при выборке изменений) не подлежат выгрузке в текущий узел плана обмена, производится вызов процедуры УдалениеДанных(), см. листинг 19.33. В данной процедуре для данных, имеющих объектную природу, создается объект УдалениеОбъекта. Этим достигается удаление в узле-прием- нике ранее неправильно отосланных данных. Наборы записей регистров очищаются. Листинг 19.33. Процедура «УдалениеДанных()» Процедура УдалениеДанных(Данные) // Получаем объект описания метаданного, соответствующий данным. ОбъектМетаданных = ?(ТипЗнч(Данные) = Тип("УдалениеОбьекта"), Данные.Ссылка.Метаданные(), Данные.Метаданные()); Если Метаданные.Справочники.Содержит(ОбъектМетаданных) ИЛИ МетаданныеДокументы.Содержит(ОбъектМетаданных) ИЛИ Метаданные.ПланыСчетов.Содержит(ОбъектМетаданных) ИЛИ Метаданные.ПланыВидовРасчета.Содержит(ОбъектМетаданных) ИЛИ Метаданные.ПланыВидовХарактерстик.Содержит(ОбъектМетаданных) Тогда // Перенос удаления объекта для объектных. Данные = Новый УдалениеОбъекта(Данные.Ссылка); ИначеЕсли Метаданные.РегистрыСвадений.Содержит(ОбъектМетаданных) ИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) ИЛИ Метаданные.РегистрыБухгалтерии.Содержит(ОбъектМетаданных) ИЛИ Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных) ИЛИ Метаданные.РегистрыРасчета.Содержит(ОбъектМетаданных.Родитель) ИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда // Очищаем данные. Данные.Очистить(); КонецЕсли; КонецПроцадуры
ГлаваУ! 9КЬбмен1данн£|ми С помощью процедуры ОпубликоватьФайлОбмена(), листинг 19.34 полу- ченный в результате XML-документ может быть выложен на FTP-сервер либо на ресурс локальной сети. Имя ресурса определено в рекви- зите АдресОбмена. Для того чтобы была возможность отправлять файл, используя схемы FTP, HTTP, HTTPS, в пути приемника производится замена символов «\» на «/». Листинг 19.34. Процедура «ОпубликоватьФайлОбменаО» Процедура ОпубликоватьФайлОбмена(ИмяФайла, НомерСообщения) ИмяФайлаСообщения = ОбменСУдаленнымиСкладами.ПолучитьИмяФайлаОбмена( ПланыОбмена.УдаленныеСклады.ЭтотУзвл(), Ссылка, Формат(НомерСообщения, ”ЧЦ=10; ЧВН=; ЧГ=О")); Путь = СтрЗаменить(АдресОбмена, Т, 7“); // Копируем файл в каталог, определенный для данного узла. Попытка КопироватьФайл(ИмяФайла, Путь + ?(Прав(Путь, 1) = 7", ”,7”) + ИмяФайлаСообщения); Исключение Сообщение.Тексг =" - Ошибка публикации файла:" + ИмяФайлаСообщения; Сообщение.Сообщить(); Сообщение.Тексг = ОписаниеОшибки(); Сообщение.Сообщить(); Возврат; КонецПопытки; Сообщение.Тексг =11 - Опубликован файл:" + ИмяФайлаСообщения; Сообщение.Сообщить(); КонецПроцедуры При публикации файла его имя формируется из слова Message, кода узла-отправителя(предопределенногоузла(ПланыОбмена.УдаленныеСкла- ды.ЭтотУзел())), кода узла-получателя и номера отправляемого сообщения (номер представлен в формате целого числа из 10 цифр). Из вышеуказанной процедуры производится возврат в процедуру Запи- сатьСообщениеСИзменениями(), см. листинг 19.27, после завершения которой процесс выгрузки завершается. Выполнение загрузки данных из узла Приведенная ниже процедура может являться обработчиком события нажатия кнопки либо гиперссылки. С помощью нее инициируется процесс загрузки данных (листинг 19.35). Листинг 19.35. Процедура, инициирующая загрузку данных &НаКлиенте Процедура ВыполнитьЗагрузку(Команда) ВыполнитьЗагрузкуНаСервере(); КонецПроцедуры &НаСервере !S@@
Процедура ВыполнитьЗагрузкуНаСервере() // Получаем объект узла обмена. УзелОбмена = Узел.ПолучитьОбъект(); // Читаем новое сообщение обмена. УзелОбмена.ПрочитатьСообщениеСИзменениями(); КонецПроцедуры В обработке выбирается узел обмена. Ссылка на выбранный узел сохраняется в реквизите обработки Узел, имеющем тип ПланОбменаСсыл- ка.УдаленныеСклады. Затем в процедуре выгрузки данных из этой ссылки получается объект ПланОбмена и вызывается метод ПрочитатьСооб- щенияСИзменениями() этого объекта, реализующий, собственно, сам процесс загрузки данных. Взаимосвязь основных процедур, рассматриваемых в данном разделе, показана на схеме, представленной ниже (рис. 19.8). Рис. 19.8. Взаимосвязь процедур и функций для загрузки измененных данных Следует отметить, что используется ряд процедур, рассмотренных в разделе «Выполнение выгрузки данных в узел» на стр. 497. В текущем разделе они повторно рассматриваться не будут (это касается функции ПолучитьИмяФайлаОбмена(), см. листинг 19.28, и процедуры ВывестиДанные(), см. листинг 19.32. В процедуре ПрочитатьСообщениеСИзменениями(), листинг 19.36, опре- деленной в модуле плана обмена, первоначально получаем имя файла. Это имя будет использоваться для создания временного документа, из которого будет впоследствии производиться считывание данных. Профессиональная разработка в системе «1С:Предприятие 8»
Имя складывается из слова Message, кода узла-приемника, кода узла-отправителя и постфикса _R. Процедура расположена в модуле плана обмена, поэтому для получения ссылки узла-источника использу- ется одноименное свойство (Ссылка). Вызов функции ПолучитьФайлОбмена(), листинг 19.37, в случае успеш- ного получения файла записывает данные во временный файл с ранее сформированным именем. Само чтение производится функцией ПрочитатьНовоеСообщениеО, листинг 19.38. Данная функция возвра- щает номер полученного сообщения (он потом используется процедурой УдалитьФайлыОбмена(), листинг 19.41, для удаления сообщений с внешнего ресурса с данным и меньшими номерами). Листинг 19.36. Процедура «ПрочитатьСообщениеСИзменениями))» Процедура ПрочитатьСообщениеСИзменениями() Экспорт Перем НомерСообщения; // Номер принимаемого сообщения // Формируем имя временного файла. ИмяФайла = КаталогВременныхФайлов() + "\“ + ОбменСУдаленнымиСкладами.ПолучитьИмяФайлаОбмена( ПланыОбмена.УдаленныеСклады.ЭтотУзел(), Ссылка, "_R"); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст ="----Загрузка из" + Строка(ЭтотОбьект) +"----”; Сообщение.Сообщить(); // Получаем копию файла обмена с новым сообщением во временный файл. ФайлПолучен = ПолучитьФайлОбмена(ИмяФайла); Если ФайлПолучен Тогда Попытка // Читаем полученное сообщение из файла. НомерСообщения = ПрочитатьНовоеСообщение(ИмяФайла); Исключение Сообщение.Текст = ” ” + ОписаниеОшибки(); Сообщение.Сообщить(); КонецПопытки; Если НомерСообщения <> Неопределено Тогда // Удаляем файлы со старыми сообщениями обмена. УдалитьФайлыОбмена(НомерСообщения); КонецЕсли; КонецЕсли; Попытка // Удаляем файл с сообщением обмена. УдалитьФайлы(ИмяФайла); Исключение КонецПопытки; Сообщение.Текст = ”---Конец загрузки------"; Сообщение.Сообщить(); КонецПроцедуры Том 2
При получении файла обмена (см. листинг 19.37) считаем, что файл, который мы ожидаем, имеет имя, состоящее из слова Message, кода узла-отправителя, кода узла-получателя (предопределенного узла ПланыОбмена.УдаленныеСклады.ЭтотУзелО) и номера, состоящего из 10 цифр. По сформированной маске ищем сообщения с любым номером. Из всех найденных файлов выбираем тот, который обладает наибольшим номером. Исходя из стратегии очистки журнала регистрации данных «по получению квитанции», в сообщении с большим номером будет нахо- диться наиболее полная порция данных для загрузки. После того как определились с файлом с помощью метода платформы КопироватьФайл(), копируем файл на локальную машину (в каталог временных файлов). Листинг 19.37. Функция «ПолучитьФайлОбмена()» Функция ПолучитьФайлОбмена(ИмяФайла) // Получаем маску для поиска файлов с сообщениями обмена. МаскаФайлов = ОбменСУдаленнымиСкладами.ПолучитьИмяФайлаОбмена(Ссылка, ПланыОбмена.УдаленныеСклады.ЭтотУзел(),"??????????'); ИмяФайлаСообщения = Сообщение = Новый СообщениеПользователю(); // Ищем файлы по маске в каталоге загрузки. Файлы = НайтиФайлы(АдресОбмена, МаскаФайлов); // Отбираем файл с максимальным номером в имени. Для Каждого Файл Из Файлы Цикл Если ПустаяСтрока(ИмяФайлаСообщения) ИЛИ Файл.ПолноеИмя > ИмяФайлаСообщения Тогда ИмяФайлаСообщения = Файл.ПолноеИмя; КонецЕсли; КонецЦикла; Если Не ПустаяСтрока(ИмяФайлаСообщения) Тогда Сообщение.Тексг =" - Считывается файл ” + ИмяФайлаСообщения; Сообщение.Сообщить(); Попытка // Копируем файл с сообщением обмена в указанный файл. КопироватьФайл(ИмяФайлаСообщения, ИмяФайла); Исключение Сообщение.Тексг =" " + ОписаниеОшибки(); Сообщение.Сообщить(); Возврат Ложь; КонецПопытки; // Файл с сообщением обмена получен успешно. Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции
ГлаваИ 9КЬбмен1данн£|ми Чтение полученного сообщения (из временного файла) начинается в функции ПрочитатьНовоеСообщение(), см. листинг 19.38. В качестве параметра передается имя файла, куда будет произведено копирование сообщения. После того как создан объект ЧтениеСообщения и чтение начато, произво- дится очистка таблиц регистрации изменений данных (этим реализуется стратегия «ожидание квитанции»). Проверка возможности чтения очередной порции данных производится в функции ВозможностьЧтенияДанных(), листинг 19.39, непосредс- твенно чтение производится с помощью функции ПрочитатьДанные(), листинг 19.40. Когда данные получены, анализируется возможность возникновения коллизий. При обнаружении коллизии принимается решение в пользу узла-приемника (они не принимаются), если в узле-отправителе реквизит Главный установлен в значение Ложь. Листинг 19.38. Функция «ПрочитатьНовоеСообщениеО» Функция ПрочитатьНовоеСообщение(ИмяФайла) // Создаем объект чтения XML. ЧтениеХМЕ = Новый ЧтениеХМЬ; ЧтениеХМЬ.ОткрытьФайл(ИмяФайла); // Загрузка из найденного файла. ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеХМЬ); НомерСообщения = ЧтениеСообщения.НомерСообщения; Если ЧтениеСообщения.Отправитвль <> Ссылка Тогда // Сообщение предназначено не для этого узла. ВызватьИсключение "Неверный узел"; КонецЕсли; // Удаляем регистрацию изменений для узла отправителя сообщения // по номеру принятого сообщения, полученного из сообщения. ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого); // Читаем данные из сообщения, пока это возможно. Счетчик = 0; Пока ВозможностьЧтенияДанных(ЧтениеХМ1_) Цикл // Читаем очередное значение. Данные = ПрочитатьДанные(ЧтениеХМ1); #Еспи Клиент Тогда Счетчик = Счетчик+ 1; Состояние("3агрузка данных:" + Строка(Счетчик)); #КонецЕспи // Разрешение коллизий при одновременном изменении в обоих узлах. Если Не ЧтениеСообщения.Отправитель.Главный И
ПланыОбмена.ИзменениеЗарегистрировано(ЧтениеСообщения.Отправитель, Данные) Тогда Сообщение = Новый СообщениеПользователю(); Сообщение.Текст =Изменения отклонены:”; Сообщение.Сообщить(); #Если Клиент Тогда ВывестиДанные(Данные); #КонецЕспи Продолжить; КонецЕсли; // Вывод диагностического сообщения о загружаемых данных. ВывестиДанные(Данные); // Устанавливаем отправителя, чтобы для него при записи // не было бы зарегистрировано изменение. Данные.ОбменДанными.Отправитепь = ЧтениеСообщения.Отправитель; // Включает режим "Загрузка", так как данные могут загружаться // в произвольном порядке и нужно отключить такой контроль данных, // как проверка уникальности номеров. Данные.ОбменДанными.Загрузка = Истина; // Запись перенесенных данных. Данные.3аписать(); КонецЦикла; ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеХМЬЗакрыть(); Возврат НомерСообщения; КонецФункции В функции ВозможностьЧтенияДанных(), см. листинг 19.39, для данных с различающейся структурой (отрабатываемых по специальным алго- ритмам) возвращается значение Истина. Остальные данные проверяются штатным методом платформы «1С:Предприятие». Считается, что конфи- гурации, участвующие в обмене, отличаются только структурой справочника Номенклатура. Для переноса изменений в данных этого справочника используется специальным образом определенный элемент CatalogObject.HoMeHKnarypa. Вручную. Листинг 19.39. Функция «ВозможностьЧтенияДанныхЦ» Функция ВозможностьЧтенияДанных(ЧтениеХМ1_) // Получаем тип данных XML, который может быть считан в данный момент. TnnXML = ПолучитьХМ1_Тип(ЧтениеХМ1_); Если ТипХМЬ = Неопределено Тогда Возврат Ложь; КонецЕсли; Если ТипХМЬ.ИмяТипа = "Са1а1одОЬ)ес(.Номенклатура.Вручную” И ТилХМШП1ПространстваИмен ="" Тогда Возврат Истина; КонецЕсли; Возврат ВозможностьЧтенияХМЦЧтениеХМЦ; КонецФункции Профессиональная разработка в системе «1С:Предприятие 8»
Функция ПрочитатьДанные(), см. листинг 19.40, для чтения элемента справочника Номенклатура из элемента XML-документа Catalogobject. Номенклатура.Вручную использует специальную функцию Номенклату- рапрочитатьХМЦ). Все остальные данные считываются стандартным методом подсистемы сериализации ПрочитатьХМЦ). Листинг 19.40. Функция «ПрочитатьДанные()» Функция ПрочитатьДанные(ЧтениеХМЬ) TnnXML = ПолучитьХМ1_Тип(ЧтениеХМ1_); Если TnnXML = Неопределено Тогда Возврат Неопределено; КонецЕсли; Если ТипХМЬИмяТипа = "CatalogObject-Номенклатура. Вручную" И ТипХМ1.11Н1ПространстваИмен ="" Тогда // Пытаемся прочесть значение справочника "Номенклатура". Возврат НоменклатураПрочитатьХМЦЧтениеХМЕ); КонецЕсли; // Пытаемся прочесть значение из объекта "ЧтениеХМЬ" стандартным образом. Возврат ПрочитатьХМЦЧтениеХМЬ); КонецФункции ПОДРОБНЕЕ Принципы построения функции (и пример) НоменклатураПрочи- татьХМЬ() рассматриваются в разделе «Пример реализации обмена при разной структуре объектов конфигурации», стр. 441. Процедура УдалитьФайлыОбмена(), см. листинг 19.41, производит очистку файлов - сообщений на внешнем ресурсе с номером сообщения, равным принятому или меньшему (получаем все файлы по маске, удаляем по условию). Листинг 19.41. Процедура «УдалитьФайлыОбменаО» Процедура УдалитьФайлыОбмена(НомерСообщения) // Получаем имя файла с номером сообщения. МаксИ мяФайпа = ОбменСУдаленнымиСкпадами.ПолучитьИмяФайлаОбмена(Ссылка, ПланыОбмена.УдаленныеСклады.ЭтотУзел(), Формат(НомерСообщения, "ЧЦ=10; ЧВН=; ЧГ=О")); // Получаем маску для поиска файлов с сообщениями обмена. МаскаФайлов = ОбменСУдаленнымиСкладами.ПолучитьИмяФайлаОбмена(Ссылка, ПланыОбмена.УдаленныеСкпады.ЭтотУзел(), "??????????"); // Ищем файлы по маске в каталоге загрузки. Том 2
Файлы = НайтиФайлы(АдресОбмена, МаскаФайлов); // Удаление файлов со старыми сообщениями обмена. Для Каждого Файл Из Файлы Цикл // Удаляем только файлы, имена которых меньше или равны // имени файла с указанным номером сообщения. Если Файл.Имя <= МаксИмяФайла Тогда Попытка // Пытаемся удалить файл. УдалитьФайлы(Файл.ПолноеИмя); Исключение КонецПопытки; КонецЕсли; КонецЦикла; КонецПроцедуры Регистрация в произвольные узлы В рассматриваемом примере для документов ПриходнаяНакладная была включена автоматическая регистрация изменений. Если необходимо зарегистрировать изменения для какого-либо определенного перечня узлов (отличного от формируемого при авторегистрации), можно воспользоваться двумя способами: определить обработчики события ПередЗаписью и ПередУдалением модуля объекта или воспользоваться следующими процедурами: ЗарегистрироватьГ1риходные(), листинг 19.42, и ЗаполнитьНаборУзлов(), листинг 19.43. Листинг 19.42. Процедура «ЗарегистрироватьПриходныеЦ» Процедура ЗарегистрироватьПриходные(Узлы) Выборка = Документы.ПриходнаяНакладная.Выбрать(); Пока Выборка.Следующий() Цикл Объект = Выборка.ПолучитьОбъект(); // Заполняем набор узлов-получателей. Объект.ОбменДанными.Получатели.АвтоЗаполнение = Ложь; ЗаполнитьНаборУзлов(Объект.ОбмеиДанными.Получатели, Узлы); // Записываем элемент данных. Объект.3аписать(); КонецЦикла; КонецПроцедуры Процедура Зарегистрироватьприходные() в качестве параметра полу- чает коллекцию узлов, для которых необходимо провести регистрацию изменений. В теле процедуры производится выборка всех документов ПриходнаяНакладная. У каждого полученного объекта отключается
ГлаваУ! 9КЬбмен!данн£|ми автозаполнение, и набор получателей формируется самостоятельно (используется функция ЗаполнитьНаборУзловО), листинг 19.43. Листинг 19.43. Процедура «ЗаполнитьНаборУзловО» Процедура ЗапопнитьНаборУзлов(Набор, Список) Набор.Очистить(); Для каждого Элемент Из Список Цикл Набор .Добавить(Элемент); КонецЦикла; КонецПроцедуры У документа Расходнаянакладная отключена автоматическая регистрация изменений. Ее можно включить, используя механизм, подобный приве- денному (листинг 19.44). Листинг 19.44. Процедура «ЗарегистрироватьРасходныеЦ» Процедура ЗарегистрироватьРасходные(Узлы) Выборка = Документы.РасходнаяНакладная.Выбрать(); Пока Выборка.Следующий() Цикл Объект = Выборка.ПолучитьОбъект(); // Набор узлов-получателей заполнится автоматически. Объект.ОбмеиДвнными.Получатели.АвтоЗаполнение = Истина; // Записываем элемент данных. Объект.3аписать(); КонецЦикла; КонецПроцедуры Следует отметить тот факт, что в обработчике события ПередЗа- писью данного документа установлена защита, которая не позволит зарегистрировать изменения документа для всех узлов. Эта проце- дура рассмотрена в начале раздела «Универсальный механизм обмена данными» на стр. 492. Пример работы универсального обмена данными Чтобы проверить работу механизма универсального обмена данными на реальном примере, необходимо выполнить следующие шаги: 1. Создать один или несколько узлов обмена (путем загрузки конфигу- рации из файла), как описано в разделе «Создание узла из конфигу- рации» на стр. 510. 2. В центральной базе, в списке плана обмена, реализующего механизм универсального обмена (в нашем примере Удаленные склады), нужно
установить для узла обмена реквизиты: Код, Наименование, Склад и Адрес обмена (например, для выгрузки данных обмена на локальный компьютер - с:\ (рис. 19.9). @ С... ПСПрелприяги (S) ' JS| ' □ X Склад оптовый (Удаленный склад) | Записал» и закрыть | @ Вседействия » | (?) Кед: [ИЯ | Наименование: [Склад опговьй | Склад: [Оптовый склад 1—^1 Главный: О Адрес обмена: [с:\ | Описание: ( | Рис. 19.9. Установка реквизитов узла обмена в центральной базе 3. В базе узла обмена, которому нужно передать данные, в список плана обмена (в нашем примере Удаленные склады) необходимо внести узлы плана обмена с такими же кодами, как и в центральной базе. При этом узел, для которого создавалась база (например, с кодом Опт), нужно внести как предопределенный (помечен специальной пиктограммой в списке узлов), а узел центральной базы нужно отметить признаком Главный (для разрешения коллизии «главный - подчиненный»). Также нужно указать реквизиты: Склад и Адрес обмена для непредопре- деленных узлов (рис. 19.10). Удаленные склады ^Создать | Ц) & |х] | Q Найти.. | Вседействия» | (?) Код Tft Опр й? Розница 'If ЦентрОФис [ Наименование -=. ' Склад I Адрес обмена сА с: I Глав№1й 0 л Розничный склад Центральный офис Розничный склад ▼ —I I Lr Рис. 19.10. Список узлов плана обмена для базы подчиненного узла 4. Для предотвращения конфликта записи объектов с одинаковыми номе- рами в базе каждого из узлов обмена требуется установить значение константы Префикс номеров. Подробнее об этом рассказывается в разделе «Подготовка конфигурации к работе в распределенной информационной базе» на стр. 512. 5. Для выгрузки данных в центральной базе нужно вызвать обработку Обмен с удаленными складами, выбрать узел, которому будут переда- ваться данные (например, Оптовый склад), и нажать кнопку Выполнить выгрузку (рис. 19.11). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 19.11. Выполнение выгрузки данных из центральной базы в удаленный склад 6. Для загрузки данных в базе узла, в который будут загружаться данные, нужно вызвать обработку Обмен с удаленными складами, выбрать узел, из которого данные были выгружены (например, Центральный офис), и нажать кнопку Выполнить загрузку (рис. 19.12). ® О Ч? ' Обмен С даалет.. (^Предприятие) 'ujj |S) ' !SI 1S1 ' Обмен с удаленными складами Все действия * | (?) Сообщения ф • Считывается Файл c:\MessageU енгрОФис.ОпгОООО... ф • Контрагенты: ООО "Сатурн" Ф - Склады Рознмеяй склад ф • Склады Оптовый склад ф Цены номежлвтуры РегистрСведенийНаборЗаписей.. Ф - Цены номежлвтуры РетмстрСведенийНаборЗаписей... ф-Учег номенклатуры Узел обмена: | Центральной офис Обмен денными------------------------ | Выполнить выгрузку | ^^ыпо/><иг^афуэку^|^ Регистрация изменений---------------- | Выполнить полн!рз регистрацию изменентй| | Удалить регистрацию изменений | 3 Рис. 19.12. Выполнение загрузки данных в удаленный склад из центральной базы Произойдет первоначальная загрузка данных из центральной базы во вновь созданный узел. В дальнейшем изменение данных можно произ- водить в любом из узлов плана обмена и обмениваться данными в обе стороны. При этом обмениваться данными можно не только с узлом цент- ральной базы, но и с любым другим узлом (например, между узлами Розничный склад и Оптоаый склад), с той лишь разницей, что при приеме данных изменения, сделанные в главном узле, будут иметь больший приоритет. ПОДРОБНЕЕ Познакомиться с реализацией механизма универсального обмена дан- ными можно в демонстрационной конфигурации «Обмен данными», прилагающейся к книге на компакт-диске. В данном примере выполнен обмен данных между тремя парами узлов (Центральный офис, Розничный склад и Оптоаый склад) в произвольном порядке. Данные, созданные в каждом из узлов, имеют свой префикс нуме- рации. При этом документы Приходная накладная и Расходная накладная (и соответствующие им наборы записей регистра накопления Учет номен- Том 2
клатуры) передавались только в случае, если значения реквизита Склад документов (и наборов записей регистра накопления) совпадали по значению с одноименным реквизитом, определенным для узла-получа- теля. В случае пустой ссылки на склад документы передавались в полном объеме, например в узел Центральный офис. РАСПРЕДЕЛЕННЫЕ ИНФОРМАЦИОННЫЕ БАЗЫ Распределенная информационная база представляет собой иерархи- ческую структуру, состоящую из отдельных информационных баз «1 С:Предприятия» - узлов распределенной информационной базы, между которыми организован обмен данными с целью синхронизации конфигу- рации и данных. В основе механизмов распределенных информационных баз лежат универсальные механизмы обмена данными, но они содержат неко- торые дополнительные возможности, не доступные через универсальные механизмы. Главное отличие распределенных информационных баз от универсальных механизмов обмена данными заключается в том, что универсальные меха- низмы обмена данными позволяют выстраивать достаточно произвольные схемы обмена данными, в то время как распределенные информационные базы имеют более узкую специализацию. Общие принципы Распределенная информационная база - это совокупность информаци- онных баз «1С:Предприятия» (узлов распределенной информационной базы), в которых поддерживается синхронизация конфигурации и данных. Распределенная информационная база имеет иерархическую структуру. У каждого узла распределенной информационной базы может быть один главный и произвольное число подчиненных узлов. «Самый главный узел» или узел, у которого нет главного узла, называется корневым узлом распределенной информационной базы. Каждый из узлов может обмени- ваться данными только со своими «соседями», то есть со своими главным и подчиненными узлами (рис. 19.13). Рис. 19.13. Структура узлов распределенной информационной базы
I ГлаваЦ 9 КО.б мен!даннй1ми Изменения конфигурации допускаются только в корневом узле распре- деленной информационной базы с последующим ее распространением по иерархии от корневого узла к его подчиненным и т. д. Таким образом, механизм управления распределенными информационными базами обес- печивает наличие во всех узлах распределенной информационной базы одной и той же конфигурации. Изменение данных допускается в любом узле распределенной информаци- онной базы. Синхронизация данных достигается путем распространения изменений данных, произведенных в одном узле, во все структуры распре- деленной информационной базы (рис. 19.14). Рис. 19.14. Миграция данных в распределенной информационной базе Если в рамках всей распределенной информационной базы поддержи- вается полная идентичность конфигурации, то полная идентичность данных не обязательна. Состав данных, изменения которых передаются в рамках распределенной информационной базы, может регулироваться как «по вертикали» (путем определения множества объектов конфигу- рации, данные которых участвуют в обмене), так и «по горизонтали» (путем задания условий на передачу и прием изменений на уровне отде- льных элементов данных). Планы обмена занимают центральное место и в управлении распределен- ными информационными базами. Но для того чтобы тот или иной план обмена мог использоваться для организации распределенной информа- ционной базы, у него при конфигурировании должно быть установлено свойство Распределенная информационная база. Данные в распределенной информационной базе переносятся с помощью сообщений, предоставляемых инфраструктурой сообщений. В отличие от универсальных механизмов обмена данными, содержимое сообщений, передаваемых между узлами распределенной информационной базы, не может быть произвольным, а является регламентированным прото- колом обмена, принятым для распределенной информационной базы. Состав данных, изменениями которых будет производиться обмен в рамках распределенной информационной базы, определяется составом плана обмена. Вхождение объекта конфигурации в состав плана обмена показывает, что изменения данных, соответствующих объекту конфи-
гурации, могут регистрироваться для узлов данного плана обмена. Но в отличие от универсальных механизмов обмена данными, номен- клатура данных, обмен которыми может производиться в рамках распределенной информационной базы, строго ограничена составом соот- ветствующего плана обмена. Для регистрации изменений данных в распределенной информаци- онной базе задействована служба регистрации изменений. Элементы данных помещаются в сообщение с использованием механизмов XML-сериализации. Помимо изменений данных между узлами распре- деленной информационной базы, передаются изменения конфигурации, а также некоторая дополнительная служебная информация. Регистрация изменений конфигурации и включение их в сообщение обмена в распреде- ленной информационной базе осуществляются полностью автоматически и недоступны для пользователя и разработчика конфигураций. В отличие от универсальных механизмов обмена данными, формирование и прием сообщения обмена данными в распределенной информационной базе производятся «в одно действие», то есть все содержимое сооб- щения формируется путем вызова одного метода встроенного языка (листинг 19.45). Листинг 19.45. Пример вызова метода «ЗаписатьИзмененияО» | ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 0); Считывание содержимого сообщения производится также путем вызова одного метода (листинг 19.46). Листинг 19.46. Пример вызова метода «ПрочитатьИзменения()» | ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); ПОДРОБНЕЕ Пример использования данных методов приведен в разделе «Запись и чтение сообщений обмена», стр. 511. Для того чтобы управлять составом данных, помещаемых в сообщение, а также считываемых из сообщения и помещаемых в базу данных, на уровне отдельных элементов данных в модуле плана обмена могут быть определены обработчики событий: ПриОтправкеДанныхПодчиненному, ПриОтправкеДанныхГлавному, ПриполученииДанныхОтПодчиненного, ПриПолученииДанныхОтГлавного. Таким образом, в распределенной информационной базе практически полностью задействованы универсальные механизмы обмена данными, но имеются и некоторые дополнительные возможности, не доступные вне распределенной информационной базы. Профессиональная разработка в системе «1С:Предприятие 8»
Главный и подчиненный узлы Как было указано выше, у каждого из узлов распределенной информаци- онной базы может быть один главный и произвольное число подчиненных узлов. Для своего главного узла узел является подчиненным и, соответс- твенно, для своих подчиненных - главным. Узел, у которого нет главного узла, является корневым узлом распределенной информационной базы. Корневой узел распределенной информационной базы - это единственное место, где разрешено вносить изменения в конфигурацию информаци- онной базы. Распределенная информационная база может быть построена на основе нескольких планов обмена, с установленным свойством Распределенная информационная база. Взаимодействие в каждой паре узлов «главный - подчиненный» производится в соответствии с одним из определенных в конфигурации планов обмена. Никаких ограничений на использование того или иного плана обмена в том или ином узле распределенной инфор- мационной базы не накладывается. Каждый из узлов распределенной информационной базы, как и в случае использования универсальных механизмов обмена данными, «знает» только своих «соседей», то есть свой главный и свои подчиненные узлы (рис. 19.15). Рис. 19.15. Состав узлов распределенной информационной базы для узла «Розничный магазин» Таким образом, полная схема распределенной информационной базы при наличии более чем двух уровней неизвестна никакому из узлов. Это является особенностью службы регистрации изменений: изменения регис- трируются для всех непредопределенных узлов; если в каком-либо плане обмена указать все узлы распределенной базы, то это нарушит структуру подчинения баз данных. Том 2
Сообщение обмена данными в распределенной информационной базе Для передачи изменений данных и конфигурации в распределенной информационной базе используются сообщения обмена данными, предо- ставляемые инфраструктурой сообщений. Если в случае применения универсальных механизмов обмена данными разработчик конфигурации сам определяет, что и как помещается в тело сообщения, то в случае распределенной информационной базы структура и состав данных, поме- щаемых в тело сообщения, четко определены. Рассмотрим структуру сообщения обмена данными, используемого в распределенной информационной базе. В качестве примера рассмотрим следующее сообщение (листинг 19.47). Листинг 19.47. Пример структуры сообщения обмена <?xml version-'1.0" encoding-'UTF-8” ?> <v8msg:Messagexmlns:v8msg=”http://v8.1c.ru/messages"> <v8msg:Header> <v8msg:ExchangePlan>yflaneHHbieCKnaflbi</v8msg:ExchangePlan> <у8тзд:То>Склад1 </v8msg:To> <v8msg:From>O4>MC</v8msg:From> <v8msg:MessageNo>20</v8msg:MessageNo> <v8msg:ReceivedNo>15</v8msg:ReceivedNo> </v8msg:Header> <v8msg:Body> <v8de:Changesxmlns:v8de-'http://v8.1c.ru/dataexchange',> <v8de:Signature> 7b4d5320-f69c-4a7b-9273-ff56607fc8ab </v8de:Signature> <v8de:Config xmlns:v8md- 'http://v8.1 c.ni/metadata"> <!— Измененные объекты конфигурации --> <v8de:Digest1> 88d3f3a6ba3f4df03c7ec00f154837fc </v8de:Digest1> <v8de:Digest2> 00cf636b02a488103a64c7a2cf81069e </v8de:Digest2> </v8de:Config> <v8de:Nodes> <v8de:Node> <!— Данные главного узла -> </v8de:Node> <v8de:Node> <!— Данные подчиненного узла -> </v8de:Node> </v8de:Nodes> <v8de:Data> <!— Измененные элементы данных -> </v8de:Data> </v8de:Changes> </v8msg:Body> </v8msg:Message>
ГлаваУ! 9КЬбменУданн£|ми Как видно из примера, все особенности сообщения обмена данными, используемого в распределенной информационной базе, сосредото- чены в теле сообщения. Тело сообщения (элемент Body, относящийся к пространству имен http://v8.1c.ru/messages) содержит один-единс- твенный элемент XML - Changes, относящийся к пространству имен http://v8.1c.ru/dataexchange. Внутри этого элемента сосредоточены все данные, передаваемые при обмене данными в распределенной информа- ционной базе. Элемент Changes может содержать четыре вложенных элемента, относя- щихся к тому же пространству имен: 1. Элемент Signature содержит «подпись» плана обмена, в соответствии с которым получено сообщение. 2. Элемент Config содержит изменения конфигурации, а также данные, идентифицирующие состояние конфигурации. Необязательные элементы Metadata, вложенные в Config, содержат изменения отдельных объектов конфигурации. Если изменения конфигурации не передаются в сообщении, то элементы Metadata отсутствуют. Такие элементы могут присутствовать только в сообщениях, передаваемых от главного узла подчиненному. Элементы Digestl и Digest2 содержат цифровые подписи передаваемых в данном сообщении изменений конфигурации и всей конфигурации за вычетом изменений. Элементы Digestl и Digest2 присутствуют во всех сообщениях: передаваемых от главного узла подчиненному и наоборот. 3. Элемент Nodes может присутствовать только в сообщениях, переда- ваемых от главного узла подчиненному. Этот элемент содержит два вложенных элемента Node, первый из которых содержит данные глав- ного узла (отправителя), а второй - подчиненного (получателя). 4. И, наконец, элемент Data содержит измененные элементы данных, пере- даваемые в сообщении. Элементы данных помещаются в сообщение с помощью XML-сериализации. Создание узла распределенной информационной базы Создание нового узла распределенной информационной базы в платформе «1С:Предприятие» можно выполнить несколькими способами: создать начальный образ, создать узел из конфигурации главного узла распределенной инфор- мационной базы, создать узел из копии информационной базы главного узла распреде- ленной информационной базы. Рассмотрим варианты подробнее.
Создание начального образа Данный вариант представляет собой наиболее простой способ создания нового узла распределенной информационной базы. Процедуру создания начального образа можно инициировать путем выполнения соответству- ющей интерфейсной команды Создать начальный образ. Также это можно сделать при помощи метода встроенного языка объекта ПланыОбменаМенеджер (листинг 19.48). Листинг 19.48. Пример использования метода «СоздатьНачальныйОбразО» | ПланыОбмена.СоздатьНачальныйОбраз(Узел, СтрокаСоединения); Интерактивное создание начального образа Для того чтобы интерактивно создать начальный образ для узла плана обмена, необходимо открыть форму списка плана обмена или непосредс- твенно форму узла плана обмена. Для выбранного (непредопределенного) узла плана обмена следует выполнить команду Создать начальный образ, которая доступна в командной панели формы, а также в меню Все дейс- твия (рис. 19.16). Магазины Создать Ins Смгмровэть F9 & Изменить F2 [х| Пометить на удаление /Снять пометку De! ix) Ыдатмть Shi(*De! О Обновить F5 Q Найти... Ctrl+F •’ Отменить поиск Ctrl+Q Настроить список... fjp Вывести список... Записать изменения... Прочитать изменен*!... |®^ Создать начальмй образ., [о] Изменить Ферму.. Рис. 19.16. Интерактивное создание начального образа При этом на экране появится диалог создания начального образа, в котором будет предложено заполнить все необходимые параметры информационной базы - нового узла распределенной информационной базы. Структура диалога создания начального образа узла распределенной информационной базы аналогична структуре диалога создания новой информационной базы. После заполнения всех необходимых параметров платформа «1С:Предприятие» выполнит создание начального образа: 1. Будет создана новая информационная база с указанными параметрами. Профессиональная разработка в системе «1С:Предприятие 8»
2. Конфигурация распределенной информационной базы будет перене- сена во вновь созданную информационную базу. 3. Будет выполнен перенос данных текущей информационной базы во вновь созданную, при этом для каждого элемента данных будет вызвана процедура узла плана обмена с предопределенным именем ПриОтправкеДанныхПодчиненному (т.е. будут перенесены только те данные, которые входят в состав соответствующего плана обмена, с учетом всех ограничений, фильтров, которые определены в обработ- чике события ПриОтправкеДанныхПодчиненному). 4. В новом узле распределенной информационной базы будут заполнены данные узла ЭтотУзел плана обмена данными узла данной информаци- онной базы, для которого создается начальный образ. Этот узел будет предопределенным для базы подчиненного узла. 5. В новом узле распределенной информационной базы будет создан элемент плана обмена, соответствующий данной информационной базе. Его данные будут перенесены. Затем ссылка на этот элемент будет установлена в качестве значения главного узла в этой информационной базе. 6. Будут удалены все записи о регистрации изменений для узла, начальный образ которого был только что создан. Создание начального образа из встроенного языка Процесс создания начального образа при помощи метода СоздатьНа- чальныйОбраз() менеджера планов обмена аналогичен интерактивной процедуре, за исключением того, что все параметры новой информаци- онной базы, а также узел, для которого необходимо создать начальный образ, должны быть переданы в качестве параметров при вызове указанной процедуры (листинг 19.49). Листинг 19.49. Пример создания начального образа Узел = ПланыОбмена. Магазины. НайтиПоКоду("Оптовый"); I ПланыОбмена.СоздатьНачальныйОбраз(Узел, СтрокаСоединения); | В строковой переменной СтрокаСоединения указывается информационная база, в которой будет создан начальный образ подчиненного узла распре- деленной информационной базы. Информационная база для создания начального образа должна быть пустой или не должна существовать вовсе. Строка соединения представляет собой набор параметров, каждый из которых представляет собой фрагмент вида <Имя>=<Значение>, где имя <Имя> - имя параметра, а <3начение> - его значение. Фрагменты отделя- ются друг от друга символами «;». Если значение содержит пробельные символы, то оно должно быть заключено в двойные кавычки ("). Том 2
Набор параметров определяется вариантом создаваемой информационной базы: файловый или клиент-серверный. Для файлового варианта опреде- лены следующие параметры: File - каталог, в котором размещается файл информационной базы; Locale - язык (страна), которые будут использованы при создании информационной базы. Допустимые значения такие же, как у пара- метра Форматная строка метода Формат(). Параметр Locale задавать не обязательно. Если этот параметр не задан, то будут использованы региональные установки текущей информационной базы. Для клиент-серверного варианта определены следующие параметры: Srvr - имя сервера «1 С:Предприятия». Для обеспечения бесперебойной работы клиентских приложений возможно указание нескольких адресов кластера. Для этого: □ значением параметра Srvr может быть список адресов кластера через запятую, например: Srvr="Server1, Server2" или Srvr="Server1:1741, Server2:1741”; □ в диалоге добавления информационной базы в клиентском прило- жении значением свойства «Кластер серверов 1С:Предприятия» может быть список адресов кластера через запятую, например: "Serverl, Server2” или "Server1:1741, Server2:1741"; Ref - имя информационной базы на сервере «1 С:Предприятия»; DBMS - тип используемого сервера баз данных: □ MSSQLServer - Microsoft SQL Server; □ PostgreSQL - PostgreSQL; □ IBMDB2 - IBM DB2; □ OracleDatabase - Oracle Database; DBSrvr - имя сервера баз данных; DB - имя базы данных в сервере баз данных; DBUID - имя пользователя сервера баз данных; DBPwd - пароль пользователя сервера баз данных. Если пароль для пользователя сервера баз данных не задан, то данный параметр можно не указывать; SQLYOffs - смещение дат, используемое для хранения дат в Microsoft SQL Server. Может принимать значения 0 или 2000. Данный параметр задавать не обязательно. Если не задан, принимается значение 0; Locale - язык (страна), аналогично файловому варианту; CrSQLDB - создать базу данных в случае ее отсутствия (Y/N: Y - созда- вать базу данных в случае отсутствия, N - не создавать. Значение по умолчанию - N); SchJobDn - в созданной информационной базе запретить выполнение регламентных заданий (Y/N). Значение по умолчанию - N;
ГлаваУ! 9КЬбмен!данн£|ми SUsr - имя администратора кластера, в котором должен быть создан начальный образ. Параметр необходимо задавать, если в кластере определены администраторы и для них аутентификация операционной системы не установлена или не подходит; SPwd - пароль администратора кластера. Для всех вариантов определены параметры: Usr - имя пользователя; Pwd - пароль. Создание узла из конфигурации Данный способ является альтернативным способом создания нового узла распределенной информационной базы. Он может применяться в случаях, когда, например, нет необходимости в операции переноса данных (проис- ходящего при создании начального образа) во вновь создаваемую информационную базу. Во многом операции, которые необходимо выпол- нить для создания нового узла распределенной информационной базы данным способом, совпадают с операциями, выполняемыми платформой «1С:Предприятие» при создании начального образа. Опишем данный способ подробнее: 1. В информационной базе - узле распределенной информационной базы, для которой необходимо создать подчиненный узел, создаем узел плана обмена, устанавливаем его код и заполняем все необходимые для него реквизиты. Если узел, для которого необходимо создать информа- ционную базу, уже существует, данный пункт можно пропустить. 2. Сохраняем конфигурацию данной информационной базы в файл. 3. Создаем пустую информационную базу там, где необходимо создание узла распределенной информационной базы. 4. Загружаем из файла конфигурацию, созданную в пункте 2, во вновь созданную информационную базу. 5. Обновляем конфигурацию базы данных. 6. В режиме 1С:Предприятие заполняем данные предопределенного узла ЭтотУзел плана обмена данными, соответствующими данным узла, для которого создается узел распределенной информационной базы, в исходной информационной базе (информационной базе главного узла). Коды указанных узлов должны совпадать. 7. Создаем узел плана обмена, который будет соответствовать информа- ционной базе главного узла, и заполняем его данными, соответствую- щими данным узла ЭтотУзел в исходной информационной базе. Коды указанных узлов должны совпадать. 8. При помощи метода УстановитьГлавныйУзел() менеджера планов обмена устанавливаем свойство ГлавныйУзел в значение ссылки на узел, созданный в предыдущем пункте (листинг 19.50).
Листинг 19.50. Установка главного узла ГлавныйУзел = ПланыОбмена.Магазины.НайтиПоКоду("ЦентрОфис"); ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел); После выполнения последнего пункта создание узла распределенной информационной базы считается законченным. Созданная информаци- онная база может участвовать в обмене данными в рамках распределенной информационной базы. Стоит отметить, что в созданной таким образом информационной базе узла распределенной информационной базы полностью отсутствуют данные. Наполнение данными узла распределенной информационной базы должно выполняться самостоятельно. Для этого можно воспользо- ваться непосредственно механизмом распределенной информационной базы: 1. В информационной базе главного узла распределенной информаци- онной базы выполнить регистрацию данных, которые необходимо передать в новый узел (листинг 19.51). 2. Выполнить процедуру обмена данными между главным узлом и созданным узлом распределенной информационной базы. Листинг 19.51. Пример регистрации изменений данных для узла Узел = ПланыОбмена.Магазины.НайтиПоКоду("Магазин"); ПланыОбмена.ЗарегистрироватьИзменения(Узеп, Неопределено); Создание узла из копии информационной базы Под копией информационной базы в данном случае можно пони- мать полученный тем или иным способом экземпляр информационной базы, полностью идентичный оригиналу. Так как конфигурация копии информационной базы идентична конфигурации оригинала, шаги, соот- ветствующие синхронизации конфигураций, можно пропустить. Создание узла распределенной информационной базы выполняется следующим образом: 1. В оригинале информационной базы - узле распределенной информа- ционной базы, для которой необходимо создать подчиненный узел, создаем узел плана обмена, устанавливаем его код и заполняем все необходимые для него реквизиты. Если узел, для которого необходимо создать информационную базу, уже существует, данный пункт можно пропустить. 2. В копии информационной базы удаляем все непредопределенные узлы соответствующего плана обмена. 3. Заполняем данные предопределенного узла ЭтотУзел значениями, аналогичными содержащимся в узле, созданном в первом пункте. Значения кодов узлов должны совпадать. Профессиональная разработка в системе «1С:Предприятие 8»
4. Создаем узел плана обмена, который будет соответствовать информа- ционной базе главного узла, и заполняем его данными, соответствую- щими данным узла ЭтотУзел в базе оригинала. Коды указанных узлов должны совпадать. 5. При помощи метода УстановитьГлавныйУзел() менеджера планов обмена устанавливаем свойство ГлавныйУзел в значение ссылки на узел, созданный в предыдущем пункте (листинг 19.52). Листинг 19.52. Установка главного узла ГлавныйУзел = ПланыОбмена.Магазины.НайтиПоКоду(“ЦентрОфис"); I ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел); | После выполнения последнего пункта создание узла распределенной информационной базы считается законченным. Созданная информаци- онная база может участвовать в обмене данными в рамках распределенной информационной базы. Состав данных полученного узла распределенной информационной базы полностью соответствует составу данных информационной базы ориги- нала (никакой фильтрации данных согласно составу мигрирующих объектов и в процедуре ПриОтправкеДанныхПодчиненному произведено не было). Состав данных, необходимый для правильной работы узла, должен быть скорректирован самостоятельно. Запись и чтение сообщений обмена Если план обмена используется в реализации механизма распределенных информационных баз, то в форме списка узлов данного плана обмена, в командной панели, а также в меню Все действия доступны две команды по записи и чтению сообщения обмена (рис. 19.17). Магазины ^Создать | & |х] | Q Найти.. | Записать изменения^ I^Все действия"^||| (?) Создать 1п$ Скопировать F9 Изменить F2 Пометить на удаление / Снять пометку 0 el Удалить Shilt*Oel Обновить F5 Найти.. Ct<1+F Отменить поиск Ct<l+Q Настроить список... Вывести список... Записать изменения... Прочитать изменения... Создать начальный образ... Рис. 19.17. Интерактивная запись и чтение изменений Том 2
При выборе команды (например, записи изменений) открывается диалог, в котором указывается количество элементов данных, обрабатываемых в одной транзакции, и устанавливается флажок Сжимать сообщение (XML- документ будет упакован в архив ZIP), рис. 19.18. @ Запись сообщения с изменениями-Создание информационны.. ПСПредлриятие) X Запись сообщения с изменениями Количестеоэлеменгоеаажык, обрабагываенък в одной транзакции:! |ЩЕ!С| Сжимать сообщение: @ | Записать и сохранить в Файл | Закрыть (?) Рис. 19.18. Диалог записи сообщения обмена После нажатия кнопки Записать и сохранить в файл нужно указать имя файла сообщения. Если файл был упакован в архив ZIP, то при чтении сообщения обмена из этого файла архив будет распакован. К недостатку данного метода следует отнести тот факт, что в данном случае нет возможности отследить окончание как процесса выгрузки, так и процесса загрузки данных из сообщения обмена. Аналогичное действие можно реализовать и самостоятельно, используя для записи следующий фрагмент кода (листинг 19.53). Листинг 19.53. Пример записи сообщения обмена ЗаписьХМЬОткрытьФайп{"с:\ои1.хтГ); ЗаписьХМЬЗаписатьОбъявпениеХМЦ); // Создаем новое сообщение. Узел = ПланыОбмена.Магазины.НайтиПоКоду("Магазин"); ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьХМ1_, Узел); // Пишем изменения. П ланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 10ОО); ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьХМ1.Закрыть(); Пример чтения сообщения обмена приведен в листинге 19.54. Листинг 19.54. Пример чтения сообщения обмена // Создаем объект чтения XML. ЧтениеХМЬ = Новый ЧтениеХМЬ; ЧтениеХМ1.ОткрытьФайп("с:\ои1.хтГ); // Загрузка из найденного файла. ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеХМ1_); // Читаем изменения. ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения,ЮОО); ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеХМ1.3акрыть();
ГлаваУ! 9КЬбмен1данн£|ми Данный подход позволяет отследить момент окончания процесса загрузки/ выгрузки и при необходимости выполнить какие-либо действия. При необходимости произвести упаковку полученного файла сообщений (или извлечение сообщения из архива) можно воспользоваться функ- циональностью платформы по работе с ZIP-архивами, рассмотренной в разделе «Работа с ZIP-архивами» на стр. 445. Подготовка конфигурации к работе в распределенной информационной базе Конфигурация, разработанная для обычной информационной базы, в большинстве случаев требует адаптации для работы в распределенной информационной базе. В этом разделе мы рассмотрим основные методы адаптации конфигурации к работе в распределенной информационной базе. Описанные методы не являются исчерпывающими, ими можно ограничиться, когда необходимо обеспечить простой обмен данными. Например, разделение на два офиса с полным дублированием инфор- мации в них. Если же требуется реализация специфической схемы обмена, то может понадобиться реализация сложной архитектуры распределенного решения, влекущая за собой серьезную переработку конфигурации. Пред- положим, разрабатывается схема обмена, в которой данные из организаций холдинга должны передаваться в центральную информационную базу в виде сводных данных за определенный период. В этом случае требу- ется реализация в конфигурации соответствующих объектов для хранения детальной и сводной информации. Одной из особенностей работы в модели распределенной информационной базы является возможность создания в различных узлах объектов (доку- ментов, элементов справочника, видов характеристик и т. д.), обладающих одинаковыми номерами (кодами). Это может привести к возникновению в одной информационной базе объектов с одинаковыми номерами (кодами) и привести к определенным проблемам. Дело в том, что синхронизация объектов ведется по уникальному иденти- фикатору. При создании двух и более одинаковых объектов в различных информационных базах можно определить у них одинаковые значения реквизитов, одинаковые наборы данных в табличных частях, но при этом значения уникальных идентификаторов (если механизм назначения уникальных идентификаторов не менялся разработчиком конфигурации) у них разные. В процессе загрузки такие объекты будут считаться разными. И в этих случаях для справочника могут создаться элементы с одинаковым кодом, для документов могут создаться экземпляры с одина- ковым номером в определенном периоде и т.д.
Когда назначение номера (кода) выполняется системой автоматически, для подобных объектов необходимо ввести префиксацию, идентифи- цирующую место создания объекта. Для объектов, чьи номера (коды) устанавливаются вручную, подобную префиксацию реализовывать не нужно (например, коды счетов назначаются пользователями вручную, добавление префикса для них является неправильным). Для объектов, требующих наличия префикса в номере (коде), необходимо: 1. Установить тип номера (кода) в значение Строка. 2. Добавить в конфигурацию объект конфигурации Константа, в котором будет установлено значение префикса номера (кода), однозначно идентифицирующее данный узел распределенной информационной базы (значение константы должно быть уникальным среди всех узлов распределенной информационной базы, сама константа не должна быть включена в состав плана обмена, на базе которого развернута распределенная информационная база). 3. Реализовать в модулях объектов предопределенные процедуры, выполняемые при установке номера (кода) - ПриУстановкеНово- гономера (ПриУстановкеновогоКода). Реализация должна использовать в качестве значения префикса значение описанной ранее константы, листинг 19.55. Листинг 19.55. Пример назначения префикса Процедура ПриУстановкеНовогоКода(СтандартнаяОбработка, Префикс) Префикс = Константы.ПрефиксНомеров.Получить(); КонецПроцедуры Работа конфигурации в распределенной информационной базе подразу- мевает обмен данными между узлами распределенной информационной базы. В процессе обмена порядок следования данных в сообщениях обмена не определен. При чтении данных могут возникать ситуации, при которых считанные данные ссылаются на несуществующие (возможно, еще не загруженные) данные. При записи считанных данных в информа- ционную базу необходимо учесть возможность наличия неразрешенных ссылок в записываемых данных. Для этого в обработчиках событий Пере- дЗаписыо, ПриЗаписи и ПередУдалением необходимо учитывать свойство Загрузка: при записи данных средствами механизма распределенной информационной базы данное свойство будет установлено в значение Истина. В указанных процедурах в режиме Загрузка не следует выполнять различные проверки, связанные с наличием тех или иных данных, участ- вующих в обмене (например, регистратор записываемого набора записей регистра накопления может быть еще не прочитан из сообщения обмена), не рекомендуется также выполнять изменение связанных данных. Профессиональная разработка в системе «1С:Предприятие 8»
В данном режиме рекомендуется дать возможность системе записать прочитанные данные. Контроль допустимости данных для данного узла распределенной информационной базы может быть осуществлен в соот- ветствующих обработчиках, вызываемых при чтении сообщения обмена (приПолученииДанныхОтПодчиненного, ПриПолученииДанныхОтГлавного). Особое внимание следует уделить регистрам сведений, имеющим неза- висимый режим записи (свойство Режим записи установлено в значение Независимый). Для данных регистров гранулой обмена является набор записей с отбором по измерениям, с установленным свойством Основной отбор. Необходимо проанализировать, будет ли соответствовать состав передаваемой информации логике работы конфигурации. Например, в регистре сведений хранится информация о характеристиках товаров. В основной отбор включены измерения: Характеристика (идентифицирующее характеристику товара); Товар (определяющее собственно товар). По логике работы конфигурации важно обеспечить целостность редак- тирования характеристик товара - состав характеристик товара должен редактироваться целиком. Считаем, что ситуация, когда в одном узле исправляется одна характеристика, а в другом - другая, и через некоторое время (после обмена данными) в характеристиках происходит объеди- нение исправлений, является недопустимой. В данном случае (когда все измерения регистра сведений входят в основной отбор) гранулой обмена данными выступает одна запись регистра сведений. И это может привести к ситуации, при которой состав характеристик товара будет состоять из различных характеристик, полу- ченных из разных узлов распределенной информационной базы (мы можем считать эту ситуацию недопустимой). Для устранения подобных проблем следует внести коррективы в набор измерений, входящих в основной отбор регистра: исключить из основного отбора измерение, вносящее излишнюю гранулярность (характеристику из приведенного примера). Это позволит в процессе обмена передавать наборы записей, содержащие информацию, которая полностью соответс- твует логике работы конфигурации (все характеристики номенклатурной позиции являются логической единицей обмена). Выполнение этих рекомендаций позволяет просто настроить обмен данными в рамках распределенной информационной базы. Дальнейшая адаптация конфигурации зависит от конкретной специфики обмена. Том 2
Пример работы обмена данными в распределенной информационной базе Чтобы проверить работу обмена данными в распределенной информа- ционной базе на реальном примере, необходимо выполнить следующие шаги: 1. В центральной базе, в списке плана обмена, поддерживающего обмен данными в распределенной информационной базе (в нашем примере Магазины), создать центральный узел плана обмена, установить его код и заполнить все необходимые для него реквизиты. 2. Создать подчиненный узел обмена (путем создания начального образа), как описано в разделе «Интерактивное создание начального образа» на стр. 508 (рис. 19.19). Рис. 19.19. Создание подчиненного узла «Оптовый» путем создания начального образа 3. При этом в базе подчиненного узла, в списке плана обмена (в нашем примере Магазины), узел, для которого создавалась база (например, с кодом Опт), будет внесен платформой как предопределенный (помечен специальной пиктограммой в списке узлов), а узел центральной базы будет добавлен в качестве главного узла обмена (помечен специальной пиктограммой в списке узлов), рис. 19.20. Магазины ^Создать । & |х] | С^Найгм... | | % Записать изменения . | Все действия « | (?) Код | Наименование = I Склад к Опт Оптовый склад л^ЦенгрОфис Центральный офис ▼ Рис. 19.20. Список узлов плана обмена для базы подчиненного узла 4. Для предотвращения конфликта записи объектов с одинаковыми номерами в базе каждого из узлов обмена нужно установить значение константы Префикс номеров. Подробнее об этом рассказывается в разделе «Подготовка конфигурации к работе в распределенной информационной базе» на стр. 512. 5. После изменения данных в центральной базе в списке узлов плана обмена нужно выбрать подчиненный узел, которому будут §0®
I ГлаваИ 9 дОбменщаннымй передаваться данные (например, Оптовый), и нажать кнопку Записать изменения (рис. 19.21). Магазины (^Создать | & [х] | Q Найти... I Записать изменения^ Все действия » | (?) Код Опт 1 Наименование а. । Склад л Розница 1/; ЦентрОфис Розничный Центральный офис Розничный склад ▼ Рис. 19.21. Запись измененных данных из центральной базы в удаленный склад 6. В базе узла, в который будут загружаться данные, в списке узлов плана обмена нужно выбрать узел, из которого данные были выгружены (например, Центральный офис), и нажать кнопку Прочитать изменения (рис. 19.22). Рис. 19.22. Чтение измененных данных из центральной базы в удаленный склад Произойдет загрузка данных из центральной базы, являющейся корневым узлом, в подчиненный узел обмена. В дальнейшем изменение данных можно производить в любом из узлов плана обмена и обмениваться данными в обе стороны. Но, в отличие от универсального обмена данными, в распределенных информационных базах обмениваться данными можно только между парами узлов «главный - подчиненный», а не между подчи- ненными узлами. Изменения конфигурации возможны только в корневом узле и должны быть переданы по всем уровням иерархии. ПОДРОБНЕЕ Познакомиться с реализацией обмена данными в распределенной информационной базе можно в демонстрационной конфигурации «Обмен данными», прилагающейся к книге на компакт-диске. В данном примере выполнен обмен данными между двумя парами узлов (Центральный офис — Розничный склад и Центральный офис — Оптовый склад). Данные, созданные в каждом из узлов, имеют свой префикс нумерации. При этом изменения конфигурации выполнены в корневом узле Центральный офис и переданы подчиненному узлу Оптовый склад. Причем изменения конфигурации и изменения данных были переданы 5М
в одном сообщении обмена. В этом случае прочитать сообщение обмена в узле-получателе нужно дважды. Сначала будут получены изменения конфигурации. Затем нужно в режиме Конфигуратор обновить конфигу- рацию и выполнить чтение изменений еще раз. Теперь будут получены измененные данные. Сценарии обмена данными в распределенной информационной базе Обработчики событий ПриОтправкеДанныхПодчиненному, ПриОтправ- кеДанныхГлавному, ПриПолученииДанныхОтПодчиненного, ПриПолу- ченииДанныхОтГлавного в модуле плана обмена позволяют достаточно гибко управлять обменом данными в распределенной информационной базе. С использованием этих обработчиков может быть построено большое разнообразие сценариев обмена данными. В этом разделе в качестве примера будет рассмотрена организация нескольких сценариев. Поведение по умолчанию Данный сценарий является наиболее простым и соответствует поведению распределенной информационной базы по умолчанию. Для этого сценария характерно следующее: каждое изменение элемента данных, произведенное в любом из узлов распределенной информационной базы, стремится распространиться по всем узлам; разрешение коллизий производится на основании отношения узлов «главный - подчиненный». Для реализации такого сценария все обработчики не должны изменять значения переданных им параметров, или же обработчики могут быть не определены вовсе. Распределение данных по подчиненным узлам Данный сценарий подразумевает, что для некоторых элементов данных, для которых он реализуется, выполняется следующее: вся совокупность элементов данных присутствует в гиавном узле; присутствие того или иного элемента данных в том или ином подчи- ненном узле определяется на основе сравнения значений некоторых реквизитов элемента данных с реквизитами подчиненного узла плана обмена; разрешение коллизий производится на основании отношения узлов «главный - подчиненный». Профессиональная разработка в системе «1С:Предприятие 8»
Для реализации данного сценария нужно обеспечить, чтобы при записи сообщения обмена данными в главном узле в сообщение не попадали элементы данных, которые не должны присутствовать в подчиненном узле. Кроме того, если значения реквизитов элемента данных могут быть изме- нены в подчиненном узле, то необходимо обеспечить, чтобы при получении сообщения обмена данными в главном узле производилась регистрация изменений для тех объектов, которых в соответствии со значениями их реквизитов в подчиненном узле быть не должно. Для более детального рассмотрения примера предположим, что в качестве типа элементов данных, для которых реализуется сценарий, выступает документ РасходнаяНакладная. У данного документа имеется реквизит Склад типа СправочникСсылка.Склады. Обмен данными организован в соответствии с планом обмена Магазины. У этого плана обмена также определен реквизит Склад типа СправочникСсылка.Склады. В соответс- твии с этим планом обмена организована распределенная информационная база, в которой корневым узлом является центральный офис, а его подчи- ненными узлами - склады. У каждого из подчиненных узлов плана обмена значение реквизита Склад установлено так, чтобы обозначать, какому складу соответствует этот узел. Все документы РасходнаяНакладная должны присутствовать в корневом узле, а условием присутствия доку- ментов в подчиненных узлах является равенство значений реквизитов Склад в документе и узле плана обмена. В этом случае, для того чтобы документы РасходнаяНакладная не попа- дали в те подчиненные узлы, куда они попадать не должны, обработчик события ПриОтправкеДанныхПодчиненному в модуле плана обмена должен иметь следующий вид (листинг 19.56). Листинг 19.56. Процедура «ПриОтправкеДанныхПодчиненномуО» Процедура ПриОтправкеДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента) ТипДанных = ТипЗнч(ЭлементДанных); Если ТипДанных = Тип("ДокументОбъект.РасходнаяНакпадная") Тогда Если ЭлементДанных.Склад <> Склад Тогда ОтправкаЭлемента = ОтправкаЭлементаДанных.Удалить; КонецЕсли; КонецЕсли; КонецПроцедуры В приведенном примере обработчика анализируется тип элемента данных, и если он равен ДокументОбъект.Расходнаянакладная, то значение рекви- зита Склад документа сравнивается со значением реквизита Склад узла плана обмена. Если значения реквизитов равны, то значение параметра ОтправкаЭлемента можно не изменять (при вызове параметр имеет значение Аато). При этом в сообщение будет помещено XML-представ- Том 2
ление документа. Если же значения реквизитов не равны, то параметру ОтпраакаЭлемента присваивается значение Удалить. В этом случае в сооб- щение будет помещено XML-представление объекта УдалениеОбъекта, проинициализированного ссылкой на соответствующий документ Расход- наяНакладная. Может показаться странным, что в случае неравенства значений рекви- зитов Склад параметру ОтпраакаЭлемента присваивается значение Удалить, а не Игнорировать, так как в случае значения Удалить XML-представление объекта УдалениеОбъекта будет помещаться в сообщения, отправляемые всем подчиненным узлам, кроме того узла, в который будет отправлен сам документ. Таким образом, в значительной части случаев Удале- ниеОбъекта будет отправлено тем узлам, где документа, который требуется удалить, никогда не было. Это действительно так, но в данном примере рассмотрен наиболее общий случай. Если же, например, известно, что значение реквизита Склад документа РасходнаяНакладная может быть установлено только при создании документа и в даль- нейшем не может быть изменено, то параметру ОтправкаЭлемента в данном обработчике действительно могло бы быть присвоено значение Игнорировать. Если же значение реквизита Склад документа РасходнаяНакладная может быть изменено в подчиненном узле, то в модуле плана обмена необходимо определить обработчик события ПриПолученииДанныхОтПодчиненного следующего вида (листинг 19.57). Листинг 19.57. Процедура «ПриПолученииДанныхОтПодчиненногоО» Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлементв, ОтправкаНазад) ТипДанных = ТипЗнч(ЭлементДанных); Если ТипДанных = Тил("ДокументОбъект.РасхрднаяНакладная") Тогда Если ЭлементДанных.Склад <> Склад Тогда ПолучениеЭлементв = ПолучениеЭлементаДанных.Игнорировать; ОтправкаНазад = Истина; КонецЕсли; КонецЕсли; КонецПроцедуры В приведенном примере обработчика анализируется тип элемента данных, и если он равен ДокументОбъект. РасходнаяНакладная, то значение рекви- зита Склад документа сравнивается со значением реквизита Склад узла плана обмена. Если значения реквизитов равны, то значения параметров ПолучениеЭлемента и ОтправкаНазад можно не изменять, обеспечив этим поведение по умолчанию при приеме элемента данных. Если же значения реквизитов не равны, то параметру ОтправкаНазад присваивается значение Истина. Тем самым гарантируется, что изменения документа будут заре- гистрированы и при отправке сообщения подчиненному узлу будет отправлено УдалениеОбъекта, если, конечно, реквизит Склад документа не будет изменен в главном узле так, что он окажется равен значению реквизита Склад соответствующего узла плана обмена. ей
ГлаваУ! 9КЬбмен1данн£|ми Если же значение реквизита Склад документа Расходнаянакладная не может быть изменено после создания документа, то обработчик ПриПо- лученииДанныхОтподчиненного можно не определять. Разрешение коллизий На основе отношения «главный - подчиненный» в распределенной инфор- мационной базе организована типовая процедура разрешения коллизий, автоматически выполняемая при приеме сообщения. Считается, что изме- нение элемента данных, произведенное в главном узле, имеет высший приоритет по отношению к изменению, произведенному в подчиненном узле. Таким образом, если сообщение, пришедшее от подчиненного узла, содержит элемент данных, изменения которого зарегистрированы в базе главного узла для этого подчиненного узла, то никаких действий пред- принято не будет, то есть этот элемент данных не будет помещен в базу данных и запись регистрации изменений не будет удалена. Если сообщение, пришедшее от главного узла, содержит элемент данных, изменения которого зарегистрированы в базе подчиненного узла для главного узла, то элемент данных будет записан в базу данных, а запись регистрация изменения будет удалена. В случае, если данный сценарий не устраивает, можно реализовать прямо противоположный (принимаются изменения из нижестоящей базы). Данный сценарий подразумевает, что для некоторых элементов данных, для которых он реализуется, выполняется следующее: каждое изменение элемента данных, произведенное в любом из узлов распределенной информационной базы, стремится распространиться по всем узлам; разрешение коллизий производится на основании отношения узлов «главный - подчиненный», но более высокий приоритет имеет подчи- ненный узел. Для рассмотрения данного случая воспользуемся приведенным выше примером с документом Расходнаянакладная и планом обмена Магазины. В данном случае требуется определить обработчики событий ПриПолуче- нииДанныхОтПодчиненного и ПриПолученииДанныхОтГлавного в модуле плана обмена. Обработчик ПриПолученииДанныхОтПодчиненного будет иметь следующий вид (листинг 19.58). Листинг 19.58. Процедура «ПриПолученииДанныхОтПодчиненногоО» Процедура ПриПолученииДанныхОтПодчиненного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) ТипДанных = ТипЗнч(ЭлементДанных); Если ТипДанных = Тип("ДокументОбъект.РасходнаяНакладная”) Тогда ПолучениеЭлемента = ПолучениеЭлементаДанных.Принять; КонецЕсли; КонецПроцедуры
Приведенный обработчик весьма прост: проверяется тип элемента данных, и если элемент данных относится к интересующему нас типу, то пара- метру ПолучениеЭлемента присваивается значение Принять, что приводит к безусловному приему элемента данных, независимо от того, зарегист- рированы его изменения или нет. Обработчик события ПриПолученииДанныхОтГлавного выглядит следу- ющим образом (листинг 19.59). Листинг 19.59. Процедура «ПриПолученииДанныхОтГлавногоО» Процедура ПриПолученииДанныхОтГлавного(ЭлементДанных, ПолучениеЭлемента, ОтправкаНазад) ТипДанных = ТипЗнч(ЭлементДанных); Если ТипДанных = Тип("ДокументОбъект.РасходнаяНакладная“) Тогда Если ПланыОбмена.ИзменениеЗарегистрировано( Ссылка, ЭлементДанных) Тогда ПолучениеЭлемента = ПолучениеЭлементаДанных.Игнорировать; КонецЕсли КонецЕсли; КонецПроцедуры Этот обработчик несколько сложнее. Если элемент данных относится к интересующему нас типу, то производится проверка - зарегистриро- ваны ли изменения элемента данных для узла-отправителя сообщения. Если изменения зарегистрированы, то параметру ПолучениеЭлемента присваивается значение Игнорировать. В результате прочитанный элемент данных не записывается в базу данных, а регистрация изменений сохраня- ется, что позволит поместить элемент данных в сообщение, отправляемое главному узлу. Восстановление узла распределенной информационной базы из резервной копии В случае возникновения ситуации, при которой необходимо восстановить резервную копию информационной базы, работающую в рамках распре- деленной информационной базы, можно воспользоваться следующими рекомендациями. Процедура восстановления информационной базы корневого узла Напомним, что корневым узлом считается информационная база, у которой свойство ГлавныйУзел содержит значение Неопределено. Восста- новление корневого узла сводится к восстановлению резервной копии информационной базы. После восстановления информационной базы корневого узла необходимо восстановить обмен данными в распределенной информационной базе. Профессиональная разработка в системе «1С:Предприятие 8»
Для этого над всеми информационными базами - узлами распределенной информационной базы - необходимо выполнить действия, аналогичные рекомендуемым при восстановлении информационной базы подчинен- ного узла. Процедура восстановления информационной базы подчиненного узла Процедуру восстановления информационной базы подчиненного узла можно разделить на несколько этапов: 1. Восстановление в информационной базе подчиненного узла конфигу- рации главного узла: □ отключение от распределенной информационной базы (осущест- вляется путем установки свойству ГлавныйУзел значения Неопределено) - ПланыОбмена.УстаноаитьГлавныйУзел(неоп- ределено); □ загрузка конфигурации главного узла (для восстановления работы в распределенной информационной базе необходимо полное соответствие конфигураций главного и подчиненного узлов). Для выполнения этого условия необходимо загрузить конфигурацию (из файла *.cf), полученную из главного узла, в информационную базу подчиненного узла (режим объединения конфигураций в данном случае использовать нельзя). 2. Синхронизация номеров сообщений между главным и подчиненным узлами. Для правильного обмена сообщениями в распределенной информационной базе необходимо, чтобы соблюдалось условие: номер принимаемого сообщения должен быть больше номера, запи- санного в реквизите НомерПринятого узла, соответствующего инфор- мационной базе - источнику сообщения. Номер сообщения получается путем добавления единицы к номеру последнего принятого сообщения (значение реквизита НомерОтправленного узла, соответствующего информационной базе - приемнику сообщения). 3. Подключение к распределенной информационной базе. Для подклю- чения информационной базы подчиненного узла обратно в распре- деленную информационную базу необходимо установить свойству ГлавныйУзел прежнее значение (листинг 19.60). Листинг 19.60. Установка свойства «ГлавныйУзел» ГлавныйУзел = ПланыОбмена.УдаленныеСклады.НайтаПоКоду("ЦентрОфис"); I ПланыОбмена.УстановитьГлавныйУзел(ГлавныйУзел); | 4. Синхронизация данных главного и подчиненного узлов. Синхрони- зация данных может выполняться в обе стороны: от главного узла в подчиненный и от подчиненного узла в главный. В обоих случаях достаточно лишь выполнить регистрацию требуемых данных в службе Том 2
регистрации изменений (для этого можно воспользоваться соответс- твующим методом менеджера плана обмена), листинг 19.61. Листинг 19.61. Регистрация изменений для узла Узел = ПланыОбменв.УдаленныеСклады.НайтиПоКоду("Опт"); ПланыОбмена.ЗарегистрироватьИзменения(Узел, Неопределено); После выполнения описанных действий работа распределенной информа- ционной базы может продолжаться в обычном режиме. Особенности использования последовательности документов в распределенной информационной базе Для отслеживания правильного порядка проведения документов в «1С:Предприятии» служит механизм последовательностей документов. Этот механизм позволяет отслеживать порядок проведения документов и производить восстановление этого порядка. Для того чтобы документ оказался в последовательности, он должен зарегистрироваться в после- довательности, тогда механизм последовательностей будет учитывать его при своей работе. При организации работы последовательности документов в распреде- ленной информационной базе нужно учитывать, что участие документа в последовательности имеет смысл только в одном узле распределенной информационной базы. Это может быть либо узел, в котором документ был создан, либо другой узел, но узел должен быть один. Нарушение данного принципа может привести к различным проблемам в процессе работы с системой, например, невозможности восстановления последова- тельности документов. Таким образом, документ, участвующий в последовательности, должен регистрироваться в последовательности только в одном узле информа- ционной базы. Для этого документ должен содержать информацию, по которой на момент записи документа можно сделать вывод, должен ли он в данном узле регистрироваться или нет. Для того чтобы документ мог это определить, все узлы информационной базы должны иметь уникальную идентификацию. Например, документ может содержать реквизит, в качестве значения кото- рого содержится код узла плана обмена его информационной базы. Коды узлов информационных баз должны быть в этом случае уникальными. Этого можно добиться организационными методами. Основываясь на информации принадлежности данному узлу распределенной информаци- онной базы, документ должен при записи либо очистить набор записей регистрации в последовательности, либо, наоборот, его заполнить. Тем самым будет достигнута цель регистрации документа в последова- тельности только в собственном узле информационной базы.
ГлаваУ! 9КЬбмен1данн£|ми Пример очистки наборов записей в последовательностях (фраг- мент кода размещается в обработке проведения документа) приведен в листинге 19.62. Листинг 19.62. Пример очистки набора записей регистрации документа в последовательности Если Узел<>ПланыОбмена.Расходные.ЭтотУзел().Код Тогда Для Каждого НаборПоследовательности Из ПринадлежностьПоследовательностям Цикл НаборПоспедовательности.Очистить(); КонецЦикла; КонецЕсли; Узел - реквизит документа, содержащий код узла, в котором он должен регистрироваться в последовательностях. Как уже было сказано, документ может участвовать в последовательности только в одном узле информационной базы. Поэтому сами последователь- ности документов не должны участвовать в обмене данных. Иначе записи регистрации документа будут переданы в другой узел информационной базы, тем самым нарушив принцип регистрации документа в последова- тельности только в одном узле информационной базы. ИСПОЛЬЗОВАНИЕ ТРАНЗАКЦИЙ ПРИ ОРГАНИЗАЦИИ ОБМЕНА При реализации обмена, как посредством универсального механизма обмена, так и с использованием механизма распределенных информаци- онных баз, одна из задач, которые требуют решения, - это обеспечение целостности и согласованности данных. Данная задача при использовании универсального обмена может решаться с использованием транзакций (листинг 19.63). Листинг 19.63. Пример использования транзакций НачатьТранзакцию(); // Обработка данных. ЗафиксироватьТранзакцию(); При выгрузке данных в механизме распределенных информационных баз используется метод ЗаписатьИзменения() менеджера планов обмена (листинг 19.64). Листинг 19.64. Пример использования метода «ЗаписатьИзмененияЦ» ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 0);|
Второй параметр метода указывает количество элементов, записываемых в одной транзакции. Значение 0 указывает на то, что запись всех изме- ненных данных производится в одной транзакции. Такой подход (когда вся выгрузка или загрузка осуществляется в одной транзакции) обладает как определенными преимуществами, так и опреде- ленными недостатками. Преимущества такого подхода заключаются в том, что, например, в файловом варианте работы действия, сгруппированные в одну тран- закцию, выполняются значительно быстрее (до определенного предела). Кроме этого, при выгрузке данных использование одной транзакции позволяет избежать несогласованности выгружаемых данных (например, когда после выгрузки документа, но до выгрузки наборов записей регис- тров произошло перепроведение документа). Минусами такого подхода является снижение параллельности работы пользователей, так как выгружаемые данные будут заблокированы до окончания транзакции. Кроме этого, необходимо учитывать объем изменений, выполняемых в одной транзакции. Например, в файловом варианте все изменения, произведенные транзакцией, накапливаются в оперативной памяти, что при записи больших объемов данных может привести к исчерпыванию свободной памяти. В клиент-серверном варианте такой опасности нет, но все-таки записы- вать большие объемы данных в одной транзакции не рекомендуется (из-за проблем параллельности блокировки тоже требуют ресурса сервера баз данных и т. п.). При обмене большими порциями данных имеет смысл использовать несколько транзакций при загрузке или выгрузке данных. Например, в алгоритме загрузки данных можно использовать следующий фрагмент кода, позволяющий разбивать процесс загрузки на несколько транзакций по 1 000 элементов данных (в данном случае величина 1 000 - условная), листинг 19.65. Листинг 19.65. Пример использования нескольких транзакций при выгрузке данных Счетчик = 0; НачатьТранзакцию(); // Обработка данных. Если Счетчик = 1000 Тогда Счетчик = 0; Зафиксировать! ранзакцию(); НачатьТранзакцию(); КонецЕсли; // Обработка данных. ЗафиксироватьТранзакцию(); Профессиональная разработка в системе «1С:Предприятие 8»
В случаях использования механизма распределенных информаци- онных баз количество объектов указывается вторым параметром метода ЗаписатьИзменения(), листинг 19.66. Листинг 19.66. Пример указания количества элементов, записываемых в одной транзакции ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 10ОО); | Следует отметить, что зачастую в каждом конкретном случае необходимо искать компромисс между скоростью и параллельностью работы пользо- вателей. МЕТОДИКА ВКЛЮЧЕНИЯ В СООБЩЕНИЕ ОБМЕНА ДОПОЛНИТЕЛЬНОЙ ИНФОРМАЦИИ В некоторых случаях обмен данными должен сопровождаться передачей в сообщении обмена служебной дополнительной информации. Передачу подобной информации можно осуществлять непосредственно в теле сооб- щения обмена. Дополнительную информацию можно размещать в теле сообщения, как при реализации универсального обмена, так и в случае работы с распределенными информационными базами. При универсальном обмене это делается довольно просто. При выгрузке данных (в любой момент: в начале сообщения, в середине, в конце) можно записать в тело сообщения специализированный элемент XML (с нужным наполнением), листинг 19.67. Листинг 19.67. Пример записи служебной информации ЗаписьХМЬЗаписатьНачалоЭлементаСШ); ЗаписьХМ1_.ЗаписатьАтрибут("содержание", "Дополнительная информация"); ЗаписьХМ1_.ЗаписатьТекст("передаваемая информация"); ЗаписьХМ1,ЗаписатьКонецЭлемента(); При чтении необходимо предусмотреть возможность чтения данного специализированного узла (листинг 19.68). Листинг 19.68. Пример чтения служебной информации Если ЧтениеХМ1.Имя="1п(Ь" Тогда // Читаем текст xml-элемента. ЧтениеХМ1.Прочитать(); // Читаем конец элемента into. ЧтениеХМ1_.Прочитать(); // Позиционируемся на начале элемента v8de:Changes. ЧтениеХМ1.Прочитать(); КонецЕсли; Том 2
Испол £зованиеУгранзакций1при[организацииГобмена1 При необходимости указания дополнительных данных при работе с распределенной информационной базой можно использовать следу- ющий подход (листинг 19.69). Листинг 19.69. Пример передачи дополнительной информации в сообщении распределенной информационной базы // Создаем объект записи XML. ЗаписьХМЬ = Новый ЗаписьХМЬ; ЗаписьХМ1.ОткрытьФайп("с:Ш.хтГ); ЗаписьХМиЗаписатьОбъявпениеХМЦ); // Создаем новое сообщение. Узел = ПланыОбмена.Магазины.НайтиПоКодуС'Магазин”); ЗвписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьХМ1, Узел); // Пишем дополнительную информацию. ЗвписьХМ1_.ЗаписатьНачалоЭлемента("1п1о"); ЗаписьХМ1_.ЗаписатьАтрибут(”содержание", "Код"); ВключитьСтроку =" |Событие = Документы.Событие.СоздатьДокумент(); |Событие.Дата = ТекущаяДата(); |Событие.ОписаниеСобытия = ""Сформировать внутренние заказы""; |// заполнение других реквизитов документа |Событие.Записать();"; ЗвписьХМЬ.ЗаписатьТекст(ВключитьСтроку); ЗаписьХМиЗаписатьКонецЭлемента(); // Пишем изменения. ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения, 0); ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьХМ1.Закрыть(); В результате выполнения получаем следующее сообщение (приведен начальный фрагмент), листинг 19.70. Листинг 19.70. Фрагмент сообщения обмена <?xml version="1.0” encoding="UTF-8" ?> <v8msg:Messagexmlns:v8msg="http://v8.1c.nj/messages"> <v8msg:Header> <v8msg:ExchangePlan>Mara3MHbi</v8msg:ExchangePlan> <v8msg:To>Mara3HH</v8msg:To> <v8msg:From>L|eHTpC^nc</v8msg:From> <v8msg:MessageNo>1</v8msg:MessageNo> <v8msg:ReceivedNo>0</v8msg:ReceivedNo> </v8msg:Header> <v8msg:Body <info содержание="Код”> Событие=Документы.Событие.СоздатьДокумент(); Событие .Дата=ТекущаяДата(); Событие.ОписаниеСобытия="Сформировать внутренние заказы"; // Заполнение других реквизитов документа. Событие.3аписать();"; 54®
I ГлаваИ 9 дОбменщаннымй </info> <v8de:Changes xmlns:v8- 'http://v8.1c.ru/data" xmlns:v8de="http://v8.1c.ru/dataexchange/2005/02" xmlns:xs=”http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <v8de:Signature> b16e45e5-1a9b-48b3-811f-286a45f6dd50 </v8de:Signature> Чтение сообщения обмена, содержащего дополнительную информацию, может быть выполнено так, как показано в листинге 19.71. Листинг 19.71. Пример чтения сообщения обмена // Создаем объект чтения XML. ЧтениеХМЬ = Новый ЧтениеХМЬ; ЧтениеХМЬОткрытьФайл(”с:\ои1.хтГ); // Загрузка из найденного файла. ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеХМЬ); // Читаем текст элемента xml. ЧтениеХМ1.Прочитать(); // Читаем конец элемента into. ЧтениеХМ1_.Прочитать(); // Позиционируемся на начале элемента v8de:Changes. ЧтениеХМ1.Прочитать(); // Читаем изменения. ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеХМ1.Закрыть(); Обратите внимание, что после начала чтения сообщения объект чтениеХМЬ уже позиционирован на начале элемента info (можно сразу производить выборку атрибутов элемента). Следует отметить, что алгоритм как записи, так и чтения (в обоих вари- антах обмена) зависит от структуры элемента, специализирующегося на «переносе» дополнительной информации. ОРГАНИЗАЦИЯ ОДНОСТОРОННЕГО ОБМЕНА В некоторых случаях нет необходимости организовывать полноценный обмен данными между двумя узлами - достаточно передавать данные в одном направлении (подобная задача может возникнуть как при орга- низации универсального обмена, так и в контексте распределенной информационной базы). Однако для правильного функционирования меха-
низмов обмена и инфраструктуры сообщений, в частности, необходимо получение ответных сообщений - сообщений, содержащих квитанции о доставке данных. Все механизмы по реализации одностороннего обмена можно разбить на две большие группы: без ответных квитанций; с ответными сообщениями, содержащими только квитанции. Для реализации одностороннего обмена без необходимости получения ответных сообщений можно воспользоваться схемой обмена с гаранти- рованной доставкой. Суть этой схемы в следующем: после формирования сообщения обмена производится удаление регистрации изменений. Этим действием подтверждается, что данные (записанные в только что сфор- мированное сообщение) будут гарантированно доставлены адресату (листинг 19.72). Листинг 19.72. Пример удаления регистрации изменений Узел = ПланыОбмена.Магазины.НайтиПоКодуС’Магазин"); ПланыОбмена.УдапитъРегистрациюИзменений(Узел); Если данный механизм используется в распределенных базах данных, следует помнить, что метод УдалитьРегистрациюИзменений() не очищает изменения, связанные со структурой конфигурации. То есть если конфи- гурация изменяется (и используется распределенная информационная база), отказаться от передачи ответных квитанций не получится. Если рассматривать схемы, связанные с передачей ответного сообщения (содержащего только квитанцию), то можно выделить следующие вари- анты решения: отсутствие регистрации изменений данных в информационной базе, выступающей в роли узла-приемника - сообщение обмена содержит только квитанцию о доставке (данный вариант доступен только при реализации универсального обмена); фильтрация выгружаемых данных из информационной базы, выступа- ющей в роли узла-приемника - сообщение обмена содержит только квитанцию о доставке (рекомендуется в случае использования распре- деленных информационных баз, так как остается необходимость получать изменения конфигурации), листинг 19.73; данные просто не включаются в сообщение (можно использо- вать в распределенных информационных базах, для уведомления о приеме изменений конфигурации в случае, если в источнике исполь- зуется принудительная очистка таблиц регистрации изменений), листинг 19.74. В результате в файл обмена включается только заго- ловок сообщения (листинг 19.75); Профессиональная разработка в системе «1С:Предприятие 8»
фильтрация принимаемых данных от информационной базы, высту- пающей в роли узла-приемника - при приеме отрабатывается только квитанция о доставке. Последний вариант является наименее предпочтительным, так как пред- полагает передачу фактически ненужных данных. Листинг 19.73. Процедура «ПриОтправкеДанныхПодчиненномуО» // В зависимости от направления можно использовать либо //событие ПриОтправкеДанныхПодчиненному, либо ПриОтправкаДанныхГлавному. Процедура ПриОтправкаДанныхПодчиненному(ЭлементДанных, ОтправкаЭлемента) ОтправкаЭлемента = ОтправкаЭлементаДанных.Игнорировать; КонецПроцедуры Листинг 19.74. Пример записи сообщения обмена ЗаписьХМЬ = Новый ЗаписьХМЬ; ЗаписьХМ1_.ОткрытьФайл("с:\ои1хтГ); ЗаписьХМЬЗаписатьОбъявлениеХМЦ); // Создаем новое сообщение. Узел = ПланыОбмена.Магазины.НайтиПоКоду("Магазин"); ЗаписьСообщения = ПланыОбмена. СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьХМ1_, Узел); ЗаписьСообщения.ЗакончитьЗапись(); ЗаписьХМ1.Закрыть(); Листинг 19.75. Фрагмент сообщения обмена <?xml version=”1.0" encoding-'UTF-8” ?> <v8msg:Messagexmlns:v8msg="http://v8.1c.nj/messages”> <v8msg:Header> <v8msg:ExchangePlan>Mara3HHbi</v8msg:ExchangePlan> <v8msg:To>Mara3HH</v8msg:To> <v8msg:From>L|eHTpO4)HC</v8msg:From> <v8msg:MessageNo>6</v8msg:MessageNo> <v8msg:ReceivedNo>0</v8msg:ReceivedNo> </v8msg:Header> <v8msg:Body/> </v8msg:Message> ПРИМЕРЫ РЕАЛИЗАЦИИ АВТОМАТИЧЕСКОГО ОБМЕНА ДАННЫМИ В процессе использования механизмов обмена данными часто возникает необходимость выполнять процедуру обмена автоматически (например, каждую ночь в определенные часы). В данном разделе мы рассмотрим несколько возможных вариантов организации автоматического обмена данными. Том 2
ОрганизацияГодностороннегоТо б м е н а Использование регламентных заданий Автоматический обмен может быть реализован при помощи регламен- тных заданий, которые выполняются платформой «1С:Предприятие» по определенному расписанию. Допустим, каждый день в начале работы системы центральной базе необходимо обмениваться данными с узлом плана обмена Оптовый. Для этого в конфигурации центральной базы создадим объект Регла- ментноеЗадание с именем АатоматическийОбменДанными. Установим его свойство Предопределенное и зададим расписание его выполнения - Выполнять: каждый день; с 8:00 один раз в день (рис. 19.23). Свойства: АвтоматическийОбменДанными ;i [S]^ii х у_________________________ ''Основные: Имя | АвтоматическийОбменДанными Синоним [Автоматический обмен да>мыми Комментарий [_________________________ ^[мя метода Наименование Использование 0 Предопределенное (0) Количество повторов при аварийном завершении [~ Интервал повтора при аварийном завершении [ [ ОК | [ Отмена 11 Справка | Рис. 19.23. Свойства и расписание регламентного задания В свойстве Имя метода укажем процедуру общего неглобального модуля, которая будет вызываться при выполнении этого регламентного задания. Эту процедуру в общем модуле заполним следующим образом (листинг 19.76). Листинг 19.76. Процедура «АвтоматическийОбменДанными()» Процедура АвтоматическийОбменДанными() Экспорт Узвл = ПланыОбмена.УдаленныеСкпады.НайтиПоКодуС'Опт”); // Получаем объект узла обмена. УзвлОбмена = Узел.ПолучитьОбъект(); // Читаем новое сообщение обмена. УзелОбмена.ПрочитатьСообщениеСИзменениями(); // Записываем новое сообщение обмена. УзвлОбмена.ЗаписатьСообщениеСИзменениями(); КонецПроцедуры
ГлаваХ19М0бмен1данн^1ми В процедуре выполняется поиск узла обмена Оптовый и производится обмен данными с этим узлом в обе стороны с помощью методов плана обмена УдаленныеСклады ПрочитатьСообщениеСИзменениями() и Запи- сатьСообщениеСИзменениями(). Эти методы были подробно рассмотрены в разделе «Пример реализации универсального обмена» на стр. 493. Для клиент-серверного варианта работы «1С:Предприятия» больше не требуется предпринимать никаких действий для выполнения создан- ного регламентного задания в соответствии с указанным расписанием. Эту работу автоматически выполняет менеджер кластера серверов «1С: Предприятия». В файловом варианте работы (в котором и работает наша демонстра- ционная база «Обмен данными») для запуска регламентного задания требуется создать специальную обработку. Создадим форму этой обработки и ее событие ПриОткрытии. Заполним обработчик этого события следующим образом (листинг 19.77). Листинг 19.77. Обработчик события формы «ПриОткрытии» &НаКпиенте Процедура ПриОткрытии(Отказ) ПодключитьОбработчикОжодания("ОбработкаЗаданий", 10); КонецПроцедуры А также в модуле формы поместим сам обработчик ожидания - проце- дуру ОбработкаЗаданий(), листинг 19.78. Листинг 19.78. Обработчик ожидания &НаКпиенте Процедура ОбработкаЗаданий() ВыполнитьОбработкуЗаданий(); КонецПроцедуры; При открытии формы обработки выполняется подключение в качестве обработчика ожидания процедуры с именем ОбработкаЗаданий(). В свою очередь, процедура ОбработкаЗаданий() выполняет одно-единс- твенное действие - вызывает метод ВыполнитьОбработкуЗаданий(). Этот метод проверяет, существуют ли задания, которые в соответствии с их расписанием должны быть выполнены. Если такие задания сущест- вуют, он запускает их на выполнение. Таким образом, в начале рабочего дня при соединении с центральной информационной базой, при открытии формы обработки Автоматичес- кийОбменДанными будет запускаться регламентное задание, организующее автоматический обмен данными с узлом плана обмена Оптовый.
Использование объекта СОМСоединение Автоматический обмен может быть реализован при помощи внешней программы, использующей возможности объекта СОМСоединение плат- формы «1С:Предприятие». Данный метод может быть использован, когда изменение конфигурации (для внедрения кода поддержки автоматичес- кого обмена) по каким-либо причинам невозможно или нежелательно. Для примера напишем программу на языке Visual Basic для выполнения обмена, аналогичного описанному в разделе «Использование командной строки» на стр. 522 (листинг 19.79). Листинг 19.79. Пример процедуры обмена Dim connector = CreateObject("V82.COMConnector") Dim connection = connector.connect("file=d:\DemoExchange”) Dim nodeRef = соппесйопЛланыОбмена.УдаленныеСклады.НайтиПоКодуС'Оптовый") If (Not nodeRef.riycraflO) Then Dim node = побеНеГЛолучитьОбъект() node.ripo4MTaTbCoo6i^eHMeCH3MeHeHMnMM() node.3anMcaTbCoo6i^eHMeCM3MeHeHMAMM() End If В данном примере используются те же процедуры узлов плана обмена УдаленныеСклады, что и в реализации обмена с использованием коман- дной строки. Полученный исполняемый модуль может быть поставлен в очередь плани- ровщика. Пример на языке JavaScript приведен в листинге 19.80. Листинг 19.80. Пример постановки задания в очередь <%@ Language=javascript %> <% entConn = new ActiveXObject("v82.ComConnector”); conn = entConn.connect(”file=d:\DemoExchange"); nodeRef = сопп.ПланыОбмена.УдаленныеСкпады.НайтиПоКоду("Оптовый"); if (nodeRef.flycranO == false) { node = nodeRef.riony4MTbO6beKT(); побе.ПрочитатьСообщениеСИзменениями(); побе.ЗаписатьСообщениеСИзменениями(); } %> Данный код можно размещать в документах *.asp, *.aspx. Профессиональная разработка в системе «1С:Предприятие 8»
Глава 20. Web-расширение Роль Интернета в современной деловой и общественной жизни сложно переоценить. В связи с развитием интернет-технологий появились новые виды бизнеса (электронные аукционы, интернет-магазины и т. и.). Фактически уже считается стандартом, что любая компания имеет некое свое «представительство» в Интернете, активно использует различные интернет-технологии для организации как внутрикорпоративного взаи- модействия, так и взаимодействия с огромной аудиторией клиентов, партнеров по бизнесу. Большое количество бизнес-задач уже решается с активным использо- ванием этих технологий. С точки зрения автоматизации деятельности учета компаний интернет-технологии позволяют организовать удобный процесс обмена данными, организовать распределенные информаци- онные системы, реализовать механизмы доступа огромного количества пользователей к данным компании. При разговоре о различных интернет-технологиях очень часто встреча- ются следующие понятия: клиент, сервер, протокол. Под сервером понимается некий ресурс глобальной сети, к которому можно обратиться для получения какой-либо информации, осущест- вления обработки данных. Под клиентом обычно понимается программа, обращающаяся к серверу. Протокол - это правила, в соответствии с кото- рыми происходит общение клиента и сервера. Рассмотрим эти понятия несколько подробнее. Предположим, возникло желание просмотреть новости на каком-либо сайте в Интернете. С точки зрения пользователя интернет-технологий мы для решения этой задачи выполняем следующую последовательность действий: 1. Запускаем программу, позволяющую просматривать страницы в Интер- нете (к примеру, это может быть Internet Explorer). 2. В строке Адрес программы вводим название интересующего нас сайта (URL). 3. В основном окне программы просматриваем полученные данные. Том 2
А вот как этот процесс выглядит изнутри (напоминаем, что рассмотрение производится довольно упрощенно). Каждый компьютер в глобальной сети Интернет обладает неким уникальным адресом (IP). При организации любого взаимодействия учитываются IP-адреса как клиента, так и сервера. Кроме IP-адресов дополнительно используется такое понятие, как порт. Рассматривая схему взаимодействия клиента и сервера, можно провести следующую аналогию с реальной жизнью: на корабле нужно доставить груз в город N-ск. В общем случае довольно сложно представить себе корабль (если только это не судно на воздушной подушке), разгружающийся на центральной площади города. Для разгрузки судна (осуществления «взаи- модействия» с городом) используется порт (некая точка взаимодействия). Саму разгрузку выполняет определенная «служба» (бригада грузчиков, крановщиков и т.п.). При обслуживании используются определенные «команды», понятные как экипажу корабля, так и сотрудникам порта («вира», «майна» и т. п.). То же самое происходит и при обработке данных как клиентом, так и сервером. С точки зрения Интернета любой компьютер в сети пред- ставляет собой некий «черный ящик» с определенным набором точек взаимодействия (аэропорт, порт, ж/д вокзал и т.п.). Каждая такая точка работает по своим правилам (протоколам). Для обслуживания порта может использоваться специализированная программа (рис. 20.1). Рис. 20.1. Взаимодействие клиента и сервера
Вернемся к получению данных с интернет-сайта. В качестве клиента в данном случае выступает программа браузера (Internet Explorer). Когда пользователь вводит данные в поле Адрес, опре- деляется IP-адрес компьютера, который содержит интересующий ресурс, т. е. IP-адрес сервера (для этой цели в Интернете существует специальная «служба»). Для просмотра интернет-страниц используется протокол HTTP (протокол обмена гипертекстом, также можно сказать, что это протокол обмена HTML-документами и их содержимым). По умолчанию работа в соответствии с этим протоколом ведется через порт с номером 80 (номер порта может быть изменен администратором, в этом случае при обра- щении он должен указываться в явном виде). По полученному IP-адресу сервера (порт № 80) клиент формирует запрос на получение данных. Данный порт на сервере обслуживает специализированная программа: веб-сервер (к примеру, это может быть Internet Information Server, далее IIS). Эта программа получает запрос, выполняет его (это может сопровож- даться выполнением какого-либо специализированного кода, из которого производится обращение к определенным базам данных). Результат исполнения IIS отсылает на IP-адрес клиента. Получив ответ, программа браузера отображает его в виде, понятном пользователю. Следует отметить, что в данном примере не рассматривается порядок работы через «промежуточные» службы (прокси-сервера, сервера защиты). Теперь рассмотрим общие принципы работы Web-расширения. Задача Web-расширения заключается в том, чтобы организовать доступ к функциональности прикладных решений «1С:Предприятия» через Интернет. Благодаря этому появляется возможность встраивать доступ к данным «1С:Предприятия» в существующие веб-сайты и создавать интернет-приложения, использующие данные информационных баз «1С: Предприятия». Web-расширение - это один из компонентов платформы. Оно поставляется в составе отдельного продукта - «1С:Предприятие 8. Web- расширение 1.1». В версии «1С:Предприятие 8.2» существует приложение - веб-клиент, но не нужно его путать с Web-расширением. Веб-клиент - это клиент- ское приложение. Достаточно его запустить, и все прикладное решение будет само, автоматически, работать в браузере. А Web-расширение - это специальный компонент платформы, позволяющий на языке высокого уровня (например, С#) написать веб-приложение, которое будет рабо- тать в среде веб-браузера и взаимодействовать с информационной базой, предоставляя пользователю какую-часть ее функциональности. Или будет являться частью существующего веб-портала, умеющей получать, обра- батывать и изменять некоторые данные информационной базы. Общую схему взаимодействия клиента с информационной базой «1С:Предприятия» можно представить следующим образом (рис. 20.2).
Рис. 20.2. Схема взаимодействия клиента с информационной базой «1С:Предприятия» Web-расширение предоставляет как пользовательский, так и програм- мный интерфейс к данным информационной базы «1С:Предприятия». Другими словами, с помощью Web-расширения можно создавать веб-сайты и т. п., работая с которыми пользователь будет работать с информационной базой «1С:Предприятия», не имея представления об этом. Работа будет вестись из программы по просмотру интернет-страниц (например, IE), без установленной на компьютере клиента платформы «1 (^Предприятие». ОСНОВНЫЕ ПОЛОЖЕНИЯ Web-расширение позволяет организовать доступ к информационным базам (функциональности платформы) «1С:Предприятия» из веб-приложений и веб-сервисов, реализованных на платформе .NET компании Microsoft. Основная идея, реализованная в данной платформе, - унифицировать работу распределенных вычислительных систем, сделать их независи- мыми от особенностей работы каждого отдельного приложения, сервиса. В данной платформе можно выделить две важные составляющие: Visual Studio.Net - универсальная среда разработки для платформы .Net; .Net Framework - многоязыковая инфраструктура исполнения прило- жений для платформы .Net. В свою очередь, .Net Framework также состоит из двух основных частей: FCL (.Net Framework Class Library) - библиотека классов; CLR (Common Language Runtime) - среда исполнения управляемых приложений. Можно выделить две основные технологии, которые реализуются клас- сами FCL: ADO.NET (ActiveX Data Objects .Net) - помогает устанавливать связь приложений с базами данных; Профессиональная разработка в системе «1С:Предприятие 8»
ASP.NET (Active Server Pages .Net) - активные серверные страницы .Net, помогает создавать веб-приложения и веб-сервисы на основе веб- форм. Постараемся показать взаимосвязь основных технологий, используемых Web-расширением, с помощью следующей схемы (рис. 20.3). Рис. 20.3. Взаимосвязь используемых технологий Библиотека FCL содержит более 7 000 типов и разделена на различные модули, разделы (иерархические пространства имен). К примеру, в одном пространстве имен могут содержаться «кирпичики», с помощью которых можно работать с правами доступа; в другом - все необходимое для орга- низации работы со специфическими элементами управления форм и т. п. Некоторые пространства имен могут подразделяться на более специфи- ческие пространства имен (так формируется их иерархия). Создание приложений с помощью .Net Framework означает написание программы (в общем случае на любом языке, поддерживаемом системой) посредством использования библиотеки FCL. В данной главе код будет целиком написан на С#, и в нем повсеместно будут использоваться возможности .Net Framework. Для того чтобы написанное на C# приложение могло быть выполнено, его код необходимо преобразовать в язык, понятный операционной системе. Подобное преобразование называется компиляцией программы и выполняется компилятором. В .Net этот процесс состоит из двух этапов (оба этапа реализуются CLR): 1. Компиляция в промежуточный язык MSIL (Microsoft Intermediate Language). Этот код не является специфическим ни для какой опера- ционной системы. 2. Компиляция в код, специфический для операционной системы и архи- тектуры используемого компьютера. Выполняется ЛТ-компиляторами (Just In Time, своевременный). Том 2
ОсновныеТполЬжёнйя В прошлом часто возникала необходимость транслировать написанную программу в несколько различных приложений, каждое из которых предназначалось для конкретной операционной системы, архитектуры центрального процессора (одно приложение под Windows 9х, другое - под Windows NT и т. п.). Сейчас такая необходимость исчезла. Существует несколько JIT-компиляторов, каждый из которых предназначается для определенного варианта архитектуры компьютера. Вызов нужного из них определяется условиями, в которых необходимо транслировать программу (из кода на языке MSIL) в машинный код. При таком подходе фактически можно забыть о системно-зависимых особенностях приложения и сконцентрироваться на его функционале. Использование CLR (среда исполнения управляемых приложений) не ограничивается компиляцией программы на MSIL и компиляцией в машинный код с помощью какого-либо JIT-компилятора. Код, напи- санный с помощью .Net Framework, является управляемым на этапе выполнения (runtime). Это означает, что CLR отслеживает выполнение приложений, управляя памятью, межъязыковой отладкой, обеспечением безопасности и т.п. Приложения, выполняемые не под контролем CLR, называются неуправляемыми. Часто такую возможность используют для получения доступа к функциям нижнего уровня операционной системы. В качестве обобщения можно рассмотреть последовательность действий, необходимых для создания и выполнения приложения: код приложения записывается на языке программирования, совмес- тимом с .Net; производится компиляция в промежуточный язык MSIL; перед выполнением код компилируется соответствующим ЛТ-компи- лятором; полученный машинный код исполняется. Если взглянуть на Web-расширение с точки зрения рассмотренных техно- логий, то можно сказать, что оно фактически является расширением (дополнением) библиотеки FCL (добавляются компоненты как в ADO. NET, так и в ASP.NET). ADO.NET ADO.NET является технологией доступа к данным, позволяющей прило- жениям получить доступ к данным, хранящимся в различных источниках. Данная технология может применяться для доступа к данным не только в веб-приложениях, но и других приложениях, построенных на техноло- гиях .NET. Основное ее отличие от множества аналогичных технологий доступа к данным - это возможность работы с данными без постоянного соеди- нения с источником данных.
_____________________________________1 Данные, полученные из базы данных, располагаются в объекте, известном как DataSet, после чего соединение с базой данных закрывается. Доступ и манипуляция данными, находящимися в DataSet, возможны без «живого» соединения с базой данных. После того как произведены необходимые изменения, DataSet может быть синхронизирован с базой данных средс- твами ADO.NET одной транзакцией. Подобная способность работать без постоянного соединения с базой данных является очень выгодной, эффективной и часто востребованной при работе в распределенных средах, таких как веб-приложения. Благодаря этому не требуется прилагать много усилий по сохранению соединения и полученных данных на сервере. К тому же это позволяет создавать более масштабируемые и высокопроизводительные веб-приложения, так как минимизирует количество информации, хранящейся на сервере, и сервер более эффективно использует свои ресурсы. Основными классами FCL, реализующими технологию ADO.NET, явля- ются классы Connection, Command, DataReader, Data Adapter и DataSet пространства имен System.Data. С помощью этого набора объектов осуществляется чтение, добавление, изменение и удаление данных. Объект Connection представляет собой соединение с источником данных. Посредством него остальные объекты осуществляют доступ к источнику данных. В Connection указываются параметры соединения с источником данных и сам источник данных. Для установления соединения с источ- ником данных нужно открыть соединение. После выполнения требуемых действий соединение закрывается. Объект Command используется для извлечения и модифицирования данных, находящихся в источнике данных. Для указания, какие данные и в каком виде следует извлечь или изменить, используется текст команды. Обычно текст команды содержит запрос, написанный на соответствующем языке запросов. Для задания значений параметров запроса используются параметры команды. Параметры команды могут быть именованными или нет - это зависит от источника данных и языка запросов. Для указания источника данных, из которого следует извлечь данные, команде устанав- ливается Connection. Результат исполнения команды может быть прочитан с помощью объекта DataReader. Объект DataReader предназначен для чтения результата исполнения команды. Данный объект и возвращается при ее выполнении. Кроме чтения данных результата запроса, DataReader позволяет получить инфор- мацию о структуре результата, то есть получить информацию о количестве и составе колонок результата запроса. DataAdapter служит для преобразования данных, полученных с помощью команды, и заполнения этими данными объекта DataSet. DataSet служит универсальным хранилищем данных и играет ключевую роль при пере- даче данных между различными компонентами системы. Поэтому часто
встает задача преобразования данных результата в DataSet и обратно. Эту задачу и решает DataAdapter. Этот объект содержит команды для чтения, добавления, изменения и удаления данных. Следует отметить, что после установки Web-расширения появля- ется возможность использования таких объектов, как V8DbConnection, V8DbCommand, V8DataAdapter, V8DataReader, V8DbSelectCommand, V8DbUpdateCommand, V8DbDeleteCommand, V8DbInsertCommand использование которых упрощает процесс обращения к данным инфор- мационной базы «1С:Предприятие». Описание данных классов находится в пространстве имен _1C.V8.Data. Примеры работы с этими объектами будут рассмотрены позже. ASP.NET В самом начале данной главы рассматривалась последовательность действий, выполняемых при желании клиента просмотреть какую-либо HTML-страницу. Напомним эту последовательность: 1. По уникальному адресу ресурса в Интернете клиентом (например, программой Internet Explorer) производится запрос на получение данных (обращение идет к нужному порту системы). 2. Этот порт на сервере обслуживает специализированная программа (веб-сервер), которая, приняв запрос, обрабатывает его. 3. Результат запроса в виде HTML-документа возвращается браузеру и им отображается. Модель такого поведения называется «запрос-ответ», она является базовой в Интернете. Недостатком такой модели является то, что общение клиента с сервером происходит только в момент выполнения запроса (получения данных). После этого клиент живет своей «жизнью», сервер - своей. Технология ASP.NET позволяет использовать событийно-ориентиро- ванную программную модель. Суть этой модели заключается в том, что сервер «знает», что делает клиент. Для того чтобы понять, как это работает и какие преимущества это дает, проведем краткий экскурс в историю развития веб-технологий. Для размещения газетных публикаций в Интернете был разработан язык HTML (язык разметки гипертекста). Фактически его задачей было пред- ставление информации для пользователей Интернета с определенными функциями ее форматирования. Но страницы, описанные на этом языке, были статическими, никак не реагирующими на действия пользователя в программе-клиенте. Если говорить о функциях веб-сервера, то он просто, получив запрос, «брал» готовый HTML-документ и отсылал его клиенту. Начиная с 4-й версии языка HTML (так называемый DHTML, дина- мический HTML) появилась возможность выполнять фрагменты кода Профессиональная разработка в системе «1С:Предприятие 8»
(скрипты) на стороне клиента. Они имитировали нажатие графических кнопок, с их помощью настраивалась анимация и т.д. В своей работе эти языки использовали объектную модель клиентской программы (браузера). С их помощью также можно было программно формировать запросы к серверу (запросы GET, когда параметры запроса отражаются в строке URL страницы в формате иг1?параметр=значение). Ограничением этих языков было то, что они выполнялись на стороне клиента и, естес- твенно, не обладали средствами по работе с базами данных на стороне сервера. Несколько позже (рассматриваем технологии компании Microsoft) появилась технология ASP (активные серверные страницы). Суть этой технологии заключалась в том, что у сервера (точнее у программы веб-сервера Internet Information Server) появилась возможность испол- нять ASP-документы (документы, внутри которых находился код на каком-либо допустимом языке программирования). Страницы «ожили». Появилась возможность формировать ответы клиенту (резуль- тирующий HTML-документ) в зависимости от каких-либо условий, в том числе от состояния базы данных, расположенной на сервере. Таким образом, программный код стал исполняться и на стороне сервера. Но серверный сценарий никак напрямую не мог контактировать с клиентским сценарием, и наоборот. По-прежнему общение клиента и сервера производилось при явном выполнении запроса или при отправке данных клиентом (в форме по кнопке Submit, ОК или т. п.). Сервер получал запрос (данные) от клиента, выполнял файл и отсылал результат обратно. По-прежнему не было информации о том, что проис- ходит на клиенте. Разработчикам интернет-приложений приходилось принудительно (разными средствами) включать в запрос от клиента нужные данные (полученные в результате действий пользователя), потом (в случае возврата к ранее заполненным формам) определять механизмы восстановления введенных значений и т. п. С приходом технологии ASP.NET появились такие понятия, как веб-формы и серверные элементы управления, HTML-элементы управления. Суть в том, что если раньше (в технологии ASP) элементы управления созда- вались на стороне клиента (и модель их поведения также описывалась на стороне клиента), то теперь элементы управления могут создаваться на стороне сервера. И на сервере появилась возможность отслеживать события (и как следствие выполнять их обработку), связанные с работой пользователя с этими элементами управления. Это фактически и есть событийно-ориентированная модель. Следует отметить, что несмотря ни на что событийная модель лежит поверх модели запрос-ответ, она ее использует. Но запросы к серверу могут выполняться без явной команды пользователя. Рассмотрим на примере, как же все это работает. В среде разработки Visual Studio .NET создадим новый проект (рис. 20.4). Том 2
ОсновныеТполЬжёнйя ffe &iit V|ew Toob Wjndow Help Open ► Rte,,, Ctd+N Qose HankSdutton... Рис. 20.4. Создание нового проекта Далее будет предложено выбрать шаблон проекта. На будущее (данная глава построена на сквозном примере) выберем шаблон V8 Web Application (хотя в данном случае могли выбрать Web Application). Шаблоны V8 Web Application и V8 Web Service появляются после установки Web-расширения (рис. 20.5). Project Types: ....Visual Gt Projects Й О Visual C++ Projects i-Q setup and Deployment Projects Й-ClI Other Projects Q Visual Stud» Solutions A project for creating a V8 Web appkabon Name; j MySite Location: | http://locatiost/MySite ▼! Browse... Project wil be created at http://locaho5t/MySte. «More OK I Caned [ Hdp [ Рис. 20.5. Создание нового приложения Отличием данного шаблона от Web application является то, что дополни- тельно в утилите импорта метаданных (она запускается автоматически) потребуется указать базу данных «1С:Предприятия 8», которая будет использоваться в веб-приложении по умолчанию (с точки зрения дейс- твий, которые производятся при выборе данного шаблона, отличий намного больше: копируются формы по умолчанию, картинки, настраива- ется ряд «конфигурационных» файлов и т. п.), рис. 20.6. 9Q Информационные базы:_____________________________________ Обмен данным* Демонстрационньй пример Основные объекты Приемник ПроФ Управление произвооствежьм преоприятием Управление произвооствежьм преоприятием Управление проиэводствежым преоприятием Управление торговлей (демо| |Fie-"C;\knwebkdb“; Имя: J webuser Пароль: |”“”1 Рис. 20.6. Окно конструктора приложения
После выбора базы требуется указать пользователя, в контексте кото- рого будет осуществляться работа всего приложения с информационной базой «1С:Предприятия». При обращении к объектам информационной базы (если иного не предусмотрено явным образом) будут использоваться права именно этого пользователя. В созданный проект добавим новую Web-форму (пункт меню Project - Add New Item), рис. 20.7. Рис. 20.7. Конструктор Web Form Используя панель инструментов Toolbox (группа Web Forms), разместим в диалоге формы четыре элемента управления TextBox, столько же элементов Label и две кнопки (элемент управления Button). Группы VBWeb, V8Data появляются в данной панели инструментов после установки Web-расши- рения. Используя палитру свойств для каждого элемента управления, можно добиться следующего вида формы (рис. 20.8). Start Page | Webporml.aspx | LoglnFombaaprr | Logkil %лгян Ав паспорта | Ок | Очистить | Рис. 20.8. Пример формы У создаваемой формы есть два режима просмотра: Design - показывается диалог формы таким, каким его будет видеть пользователь в программе-клиенте; HTML - показывается исходный код формы (содержащийся в файле с расширением aspx). S2®
В режиме HTML код созданной страницы выглядит следующим образом (листинг 20.1). Листинг 20.1. HTML-код созданной страницы <%@ Page language="c#" Codebehind-'LoginForm.aspx.cs" AutoEventWireup-'false" lnherits="V8WebBook.LoginForm” %> «IDOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TransitionaWEN" > <HTML> <HEAD> <title>LoginForm</title> <meta name="GENERATOR” Content-'Microsoft Visual Studio .NET 7.1"> <meta name=”CODE_LANGUAGE" Content="C#“> <meta name-'vs_defaultClientScript" content-'JavaScript”> <meta name=”vsJargetSchema” content=”http://schemas.microsoft.corn/intellisense/ie5,l> </HEAD> <body MS_POSITIONING="GridLayout”> <form id=”Formr method-'post” runat=”server"> <asp:TextBox id="TextBoxT runat="server"></asp:TextBox> <asp:Button id="Button2” runat="server” Тех1="Очистить”> </asp:Button> <asp:Button id="Button1” runat="server” Text="OK,,></asp:Button> <asp:Label id="Label4" runat="server">riaponb</asp:Label> <asp:Label id-'Label3" runat-'server">CepnH </asp:Label> <asp:Label id="Label2" runat="server">№ nacnopja</asp:Label> <asp:Label id-'LabeH" runat-lserver’,>JlornH</asp:Label> <asp:TextBox id="TextBox4" runat="server”></asp:TextBox> <asp:TextBox id-'TextBox3'' runat- 'server”></asp:TextBox> <asp:TextBox id="TextBox2" runat="server”></asp:TextBox> </form> </body> </HTML> Исходный текст формы включен не полностью, из него были удалены свойства элементов управления, связанные со стилем отображения (поло- жение, шрифт и т.п.), но были оставлены все моменты, существенные с точки зрения рассматриваемого материала. Первые две строки (в исходном тексте это была одна строка) занимает директива, в которой указано, что основным языком программирования для данной формы является язык С#, программная модель (исходный код формы) находится в файле LoginForm.aspx.cs. После этого до первого тега с префиксом asp (тегом называется некое выражение, заключенное в угловые скобки) идет, казалось бы, обычный HTML. Отличие, про которое необходимо знать, заключается в том, что хотя сам язык HTML допускает наличие открывающего тега без закры- вающего, в данном случае желательно каждому открывающему тегу сопоставлять закрывающий тег. Закрывающий тег отличается от открыва- ющего наличием символа «/» перед именем закрываемого тега. Обратите внимание на строку (листинг 20.2). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 20.2. Фрагмент HTML-кода созданной страницы <form id- 'Formi" method=”post" njnat="server”> | Когда форма конструировалась в режиме Design, метод отправки для нее явно не определялся. Конструктор автоматически устанавливает метод отправки Post (данные формы отправляются во внутренних переменных запроса и не отображаются в строке URL браузера). Форма выполняется на сервере (обратите внимание: для того чтобы сделать форму клиент- ской, не нужно писать runat="client'', следует просто убрать атрибут runat="server"). Те, кто работал с HTML или ASP, обратили внимание на тот факт, что в данной форме не определен обработчик высылаемых ею данных, т. е. после отправки данных на сервер они для обработки переда- ются этой же форме (производится отсылка самой себе). Внутри формы с помощью тегов с префиксом asp (этот префикс указыва- ется для серверных элементов управления) определяются все визуально размещенные в них элементы управления. К примеру, в следующей строке указывается, что в форме определен элемент управления TextBox с уникальным идентификатором TextBoxl. Элемент управления является серверным (определяется наличием атри- бута runat="server"), листинг 20.3. Листинг 20.3. Фрагмент HTML-кода созданной страницы <asp:TextBox id=”TextBox1" runat="server”></asp:TextBox> | Для того чтобы посмотреть, как эта форма ведет себя в пользовательском режиме, следует выполнить команду меню Project - Web Project - Set As Start Page (в рамках данного проекта страница станет стартовой). После этого нужно произвести компиляцию проекта и запус- тить его на исполнение. Это можно сделать одномоментно (действия будут выполняться по очереди, но как бы в пакетном режиме), запустив проект в режиме отладки (выполнив команду меню Debug - Start). Внешний вид формы будет точно таким же, как и в режиме Design. Следует отметить, что при использовании браузеров старых версий или других производителей внешний вид может отличаться. Кстати, одной из приятных особенностей ASP.NET является тот факт, что HTML-файл ответа, отсылаемый клиенту, подстраивается под возможности браузера клиента (для наиболее распространенных случаев). Если воспользоваться возможностью браузера просмотреть исходный код (пункт меню Вид - Источник) отображаемого документа, то можно увидеть следующее (листинг 20.4). Том 2
ОсновныеТполЬжёнйя Листинг 20.4. Исходный код страницы «iDOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TransitionaWEN" > <HTML> «HEAD> <title>LoginForm</title> «meta name=”GENERATOR" Content="Microsoft Visual Studio .NET 7.1”> «meta name=”CODE_LANGUAGE" Content="C#"> «meta name=”vs_defaultClientScript" content-'JavaScript'^ «meta name=”vsJargetSchema"content="http://schemas.microsoft.com/intellisense/ie5"> «/HEAD> <body MS_POSITIONING="GridLayout"> «form name="Formr method="post” action="LoginForm.aspx” id="Formr> «input type=”hidden'' name=”__VIEWSTATE” value="dDwzMzkwMzkzMTY7Oz5XREZCICJcq6Ogjr2NGMikVs3uQ==7> «input name="TextBox1" type-'text" id=”TextBox1”/> «input type=”submit" name="Button2'' value-'Очистить” id="Button27> «input type=”submit” name-'Button 1" value="OK" id="Button1" l> «span id="Label4">riaponb«/span> «span id=”Label3">CepMn «/span> «span id="Label2">№ nacnopya«/span> «span id="LabeH">JloniH«/span> «input name="TextBox4" type-text" id=”TextBox47> «input name="TextBox3" type-'text" id=”TextBox3"/> «input name="TextBox2" type-text" id=”TextBox27> «/form> «/body> «/HTML> Если сравнить с исходным текстом Web-формы, то можно сказать, что: представленный код является полностью «чистым» кодом HTML (без каких-либо директив, префиксов); при описании формы HTML (тег form) появилось явное указание, что данные, введенные в нее, она же и будет обрабатывать (action="LoginForm.aspx"); в данном тексте представлены обычные HTML-элементы формы, создаваемые на стороне клиента; добавился тег input с типом hidden (скрытый) и «непонятным» значе- нием. Фактически происходит следующее: при визуальном проектировании формы в ней размещаются серверные элементы управления. При обра- щении к данной форме для каждого элемента управления создается его HTML-представление, которое и отправляется в браузер. На самом деле браузер и может отображать только код HTML. Если бы ему был передан исходный код формы, то те фрагменты, которые ему не «понятны», не отобразились бы. Рассмотрим назначение скрытого тега input. При работе с технологией ASP, при отправке данных из формы самой себе информация (состо- яние), введенная в элементы управления, сбрасывалась (форма как бы
_________________________________________1 получалась заново, и в нее передавались данные запроса). Для того чтобы оставить введенные данные на месте (восстановить состояния элементов управления), разработчикам приходилось прописывать специфические механизмы. При использовании технологии ASP.NET в этом нет необ- ходимости: рассматриваемое поле содержит все состояния и значения элементов управления, представленных на форме. Теперь займемся программной моделью поведения веб-формы. Для начала определим обработчик события Нажатие на кнопку "Очис- тить". Для этого произведем двойной щелчок на кнопке Очистить. Откроется дополнительное окно, показывающее содержимое файла LoginForm.aspx.cs (исходный программный код формы). В представ- ленном коде уже будет сформировано определение функции, обработчика события Button2_Click(object sender, System.EventArgs е). Текст, который нужно определить в обработчике, будет ниже выделен серым фоном, а пока ознакомимся со всем представленным кодом (листинг 20.5). Листинг 20.5. Программный код формы using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.Ul.WebControls; using System.Web.Ul.HtmIControls; // Новое пространство имен, совпадающее с именем проекта. namespace VSWebBook { /// <summary> /// Summary description for LoginForm. /// </summary> public class LoginForm: System.Web.UI.Page { protected System.Web.Ul.WebControls.TextBox TextBoxI; protected System.Web.Ul.WebControls.TextBox TextBox2; protected System.Web.Ul.WebControls.TextBox TextBox3; protected System.Web.Ul.WebControls.TextBox TextBox4; protected System.Web.Ul.WebControls.Label Labell; protected System.Web.Ul.WebControls.Label Label2; protected System.Web.Ul.WebControls.Label Label3; protected System.Web.Ul.WebControls.Label Label4; protected System.Web.Ul.WebControls.Button Buttonl; protected System.Web.Ul.WebControls.Button Button2; private void PageJ_oad(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code
override protected void Onlnit(EventArgs e) { // // CODEGEN: This call is required by the //ASP.NET Web Form Designer. // lnitializeComponent(); base.Onlnit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void lnitializeComponent() { this.Button2.Click += new System.EventHandler(this.Button2_Click); this.Load += new System.EventHandler(this.Page_Load); } tfendregion private void Button2__Click(object sender, System.EventArgs e) { this.TextBox1.Text='"'; this.TextBox2.Text=""; this.TextBox3.Text='"'; this.TextBox4.Text=""; } } } Первоначально с помощью оператора using указываются используемые в данном коде пространства имен (каждое пространство имен содержит описание типов, решающее какую-либо определенную задачу). В новом пространстве имен определяется класс LoginForm, он наследу- ется от класса System.Web.UI.Page (базовый класс для любой веб-формы). Любой элемент управления определяется как защищенный член создавае- мого класса (из объявления видно, что определения серверных элементов управления находятся в пространстве имен System.Web.Ul.WebControls). При обращении к форме производится вызов функции OnInit(EventArgs е), из нее вызывается функция lnitializeComponent(). В функции lnitializeComponent() производится определение обработчиков событий: начало загрузки страницы (Page_Load()); нажатие кнопки Button2 (Button2_Click()). Для того чтобы функция могла выступать как обработчик события, она должна быть определена с двумя параметрами (листинг 20.6). Листинг 20.6. Пример определения функции | private void Page_Load(object sender, System.EventArgs e) Профессиональная разработка в системе «1С:Предприятие 8»
Параметр sender имеет тип object (базовый тип всех объектов) и харак- теризует объект, событие которого обрабатывается. Один обработчик события может обрабатывать однотипные события разных объектов, данный параметр может использоваться для уточнения или доступа к свойствам объекта источника. Второй параметр позволяет получить более подробные данные о произо- шедшем событии. После отработки процедуры OnInit(EventArgs е) инициируется событие (соответствующая функция начинает выполняться) Page_Load. После загрузки форма переходит к ожиданию отрабатываемых событий. При нажатии кнопки Очистить вызывается обработчик события Button2_ Click, в котором очищаются все определенные в форме поля ввода (обращение производится к соответствующим защищенным членам класса). Что и происходит в пользовательском режиме. Изменим пример. Определим обработчик события для элемента управ- ления TextBoxI (поле ввода, в которое пользователь вводит логин). Щелкнем два раза на выбранном элементе управления (в режиме Design), в открывшемся модуле в созданном обработчике события определим следующий текст (листинг 20.7). Листинг 20.7. Пример обработчика события TextBox1_TextChanged private void TextBox1_TextChanged(object sender, System.EventArgs e) { this.TextBox2.Text = "неизвестен"; this.TextBox3.Text = "неизвестен"; Обратите внимание, что в функцию InitializeComponent() была автома- тически добавлена строка (определяющая, что добавленная функция будет являться обработчиком события), листинг 20.8. Листинг 20.8. Объявление функции lnitializeComponent() private void lnitializeComponent() { this.TextBoxl.TextChanged += new System.EventHandler(this.TextBox1_TextChanged); this.Button2.Click += new System.EventHandler(this.Button2_Click); this.Load += new System.EventHandler(this.Page_Load); J Заметьте, несмотря на то, что событие TextChanged возникает при любом изменении в поле ввода TextBoxI, запустив веб-приложение в режиме отладки, мы этого не увидим. Какие бы данные ни вводились бы в поле TextBoxI, изменений значений (текста) в полях TextBox2 и TextBox3 произ- водиться не будет. И только при нажатии любой кнопки будет виден результат выполнения обработчика события TextChanged. Том 2
Постараемся пояснить суть происходящего. Все события, которые проис- ходят на форме, можно разделить на две большие группы: пассивные (связанные с движениями мыши, нажатием клавиш клавиатуры); активные (нажатие кнопок, изменение текста и т. п.). Пассивных событий формируется огромное множество, отрабатывать их на стороне сервера нет необходимости (и возможности). Их отработка возлагается на скрипты (сценарии), выполняемые на стороне клиента. Активные события отрабатываются на стороне клиента сервера (если для них определены обработчики событий). Но при этом не всякое событие приводит к его немедленной обработке на сервере. Часть событий может кешироваться на клиенте. В нашем случае событие TextChanged кешировалось. После того как произошло нажатие любой кнопки, например кнопки ОК, произошла отправка данных на сервер. Это можно увидеть, проанализировав текст источника HTML-кода в браузере. Кнопка определена следующим фрагментом кода (листинг 20.9). Листинг 20.9. Фрагмент кода | «input type-'submit” name-'Buttonr value-'Ок" id-'Buttonl" /> Тип кнопки установлен в значение submit. Это и определяет тот факт, что производится передача данных. В качестве получателя данных (для обработки) указана та же форма, это определено в теге form, в атри- буте action="LoginForm.aspx" (листинг 20.10). Листинг 20.10. Фрагмент кода | <fbmn name-'Formr method-'posf' action- 'LoginForm.aspx” id="FormT'> После передачи данных на сервер обработчики событий выполня- ются в порядке их возникновения. Последним обрабатывается событие, вызвавшее процесс отправки данных серверу. Если необходимо, чтобы событие TextChanged обрабатывалось на сервере сразу после возникновения, в палитре свойств серверного элемента управления TextBoxI свойство AutoPostBack (немедленная отправка) нужно установить в значение True (рис. 20.9). ЕИ TextBoxI System.Web.UI.WebControls.TextBox El Appearance AccessKey EnableViewState Рис. 20.9. Свойство AutoPostBack
_____________________________________________________1 После установки данного свойства в исходном тексте формы (*.aspx) во фрагменте, описывающем серверный элемент управления, появился новый атрибут AutoPostBack=l,True" (листинг 20.11). Листинг 20.11. Фрагмент кода «asp:TextBox id=”TextBox1" njnat="serverJ' AutoPostBack- True''>«/asp:TextBox> | Изменения произошли и в HTML-документе, получаемом программой- клиентом. Во-первых, был добавлен сценарий, выполняемый на стороне клиента (листинг 20.12). Листинг 20.12. Сценарий, выполняемый на стороне клиента «script language-'javascript"> <!- function _doPostBack(eventTarget, eventArgument) { varthefbrm; if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) { theform = document.fbrms["Form1"]; } else { theform = document.Form1; } thefbrm._EVENTTARGET.value = eventTarget.splitC,$',).join('':"); theform._EVENTARGUMENT.value = eventArgument; thefbrm.submit(); } //-> </script> В области действия тега script определена функция _doPostBack(eventTar- get, eventArgument). Основная задача этой функции - вызвать принуди- тельную отсылку данных из HTML-формы на сервер. Вызов данной функции определен при описании HTML-элемента, ответс- твенного за прием данных о логине (листинг 20.13). Листинг 20.13. Фрагмент кода «input name- TextBoxI" type="text" onchange-'_doPostBack(TextBox1',")" language="javascripf' id="TextBox1"/> To, что эта функция будет задействована, определяется вызовом в свойстве onchange тега input. При возникновении необходимости определения собственных сценариев, выполняемых на стороне клиента, обращайте внимание на тот факт, что
в зависимости от производителя программы клиента (браузера) придется по-разному отрабатывать какие-либо ситуации; реализация объектной модели браузера может различаться. Это наглядно видно по функции, представленной выше. Если в качестве браузера выступает программа компании Netscape, объект Форма получается с помощью следующей строки (листинг 20.14). Листинг 20.14. Пример для браузера Netscape | theform = document.forms["Formr]; В остальных случаях (Microsoft, Opera) он будет получен следующим образом (листинг 20.15). Листинг 20.15. Пример для браузеров Microsoft, Opera | theform = document.Form1; После, казалось бы, незначительной манипуляции (установка свойства AutoPostBack в значение True) нужный эффект был достигнут. После рассмотрения данного примера может возникнуть желание вклю- чать данное свойство для всех серверных элементов управления. На самом деле лучше этого не делать. Данное свойство лучше включать только в тех случаях, когда это действительно нужно, когда именно в этом и заключа- ется функциональность элемента управления. Необоснованное включение может привести к падению производительности создаваемой веб-формы. При этом не стоит думать, что эта производительность зависит от скорости работы персонального компьютера или от скорости канала связи (хотя и не без этого). В первую очередь скорость выполнения запроса зависит от количества промежуточных узлов от клиента до сервера. Дело в том, что когда возникает необходимость отправить данные на сервер, как правило, старое соединение уже разрушено. Если так, то вначале производится соединение с сервером, затем отсылка заголовков сообщений. После того как клиент и сервер поняли, что соединились удачно, клиент отправляет данные. После обработки сервер инициирует обратный процесс... Очевидно, что делать все это без необходимости совершенно не стоит. Если вернуться к палитре свойств Toolbox, становится очевидным, что помимо серверных элементов управления в диалоге можно размещать и обычные HTML-элементы. Это рекомендуется делать, если есть необхо- димость разместить какой-либо элемент и при этом нет смысла определять его на стороне сервера (хоть немного, но позволит сэкономить ресурсы сервера). Кстати, если при работе с серверными элементами управления возникнет необходимость просмотреть, какие обработчики события для них опреде- Профессиональная разработка в системе «1С:Предприятие 8»
лены, можно воспользоваться палитрой свойств, переключив ее в режим просмотра событий (рис. 20.10). Рис. 20.10. Палитра свойств КОНСТРУКТОРЫ WEB-РАСШИРЕНИЯ ДЛЯ ВЕБ-ПРИЛОЖЕНИЙ В состав средств разработки, поставляемых вместе с Web-расширением (помимо других средств), входят файлы шаблонов для мастера Microsoft Visual Studio Net 2003. Для знакомства с шаблонами, позволяющими созда- вать веб-приложения, необходимо первоначально создать новый проект с выбором шаблона V8 Application. После выбора данного шаблона будет предложено выбрать информационную базу «1 С:Предприятия». В качестве такой базы предлагаем выбрать демонстрационную конфигурацию Обмен данными, входящую в состав информационно-технологического сопро- вождения (ИТС). Перед использованием конфигурации желательно (это понадобится в дальнейшем) определить пользователя базы данных. Предварительно необходимо создать полный набор прав и только после этого добавить пользователя с этими правами (рис. 20.11). Пользователь X Основные | Прочие____________________________________ Имя [web ] Полное имя |web | (^[Аутентификация ЮПреоприятия Пароль: [**“* ] (простой) Подтверждение пароля 1’°"°' | Пользователю запрещено изменять пароль О Показывать в списке выбора} @ ОАугентиФикация операционной системы Пользователь: | 0К 11 Отмена 11 Справка | Рис. 20.11. Создание нового пользователя информационной базы «1С:Предприятия» После добавления пользователя можно приступить к созданию нового веб-приложения. Для этого необходимо запустить среду разработки Visual Studio Net 2003 и создать новый проект. При создании нового проекта (пункт главного меню File - New - Project) нужно выбрать шаблон V8 Web Том 2
К OHCTpyKTopiJilWe Ь3расширения(цля1вебгприложени й Application. Данный шаблон будет доступен после установки Web-расши- рения на компьютере разработчика (рис. 20.12). Project Types: г-Visual C# Projects $£] Visual C++ Projects j-Q Setup and Deployment Projects Other Projects Visual Stud» Solutions Templates: A project for creating a V8 Web appkation Name: | MySite Location: | http://k>cabost|MySite' ▼I Browse... [ Project wil be created at http://locaho5t/MySte. OK | Caned [ Hdp Рис. 20.12. Создание нового веб-приложения В нижней части указывается путь к виртуальному каталогу создавае- мого веб-приложения (строку localhost трогать не нужно). После нажатия кнопки ОК откроется окно утилиты генерации метаданных (запуск этой утилиты является особенностью шаблона VB Web Application), рис. 20.13. Информациожые базы Курс 5-Б декабря В) Медицинские челчгн_____________________________________ 0 бмен данньми. Демонстрациожый пример Й1 __ Основные объекты я |р1е-‘Р:\КонФип|раци|ЛТиг1оеые\РетоЕ.change"; Имя |web ] Пароль: |~1 ~| | ОК | | Отмена | Рис. 20.13. Окно конструктора приложения В окне утилиты необходимо выбрать конфигурацию (базу данных), которая будет основной у создаваемого веб-приложения, указать пара- метры доступа к ней (имя пользователя и его пароль). После нажатия кнопки ОК будет создан ряд файлов, необходимых для работы всего приложения в целом, и будет открыта единственная (пустая) веб-форма (с именем WebForml .aspx). Просмотреть все созданные файлы можно, используя Solution Explorer (команда главного меню программы View - Solution Explorer), рис. 20.14.
Efe ЕЛ View | Pro)ect fiutd Debug Data E £pde ™ S Designer Shft+F7 [J Open Open With... HTML Source Ctrl+PgDn Visfcje Borders Ctrl+Q Detajte Ctrl+Shft+Q A Labri Synchronize Docunent Outline SI TextBo) fold Oi ЛМ* I 1X3 *4 а. Л I . *4 */. . •- i ► II i iToobox VBWeb VBData Data Web Forms It Pointer Рис. 20.14. Вызов Solution Explorer В результате выполнения команды откроется окно следующего вида (рис. 20.15). QJ Solution 'MySte' (1 project) Й- © MySIte__________ Е}- ^IReferences! Е I- Images R3 assemblylnfo.cs г- £| DefaJtErrorForm.aspx — Ц] DefaJtReldTreeForm.aspx ь- Ц] DefaukHlterFonn.aspx — DefaukImageForm.aspx u- DefaukLIneFonn.aspx j— DefauitListForni.aspx — DefaukObjectForm.aspx *- DefaukRecordForm.aspx j— DefauitReportPrtnt.aspx — Ц] DefauitTypeChoice.aspx ь- Ц] DefaukTypeInfo.aspx — DefaukValuesUst.aspx £| Global.asax r— 43 5tyte5beet.css — ® TaUeFormMap.xml — § TableFormMap.xsd — Web.config - В WebForml.aspx ри£. 20.15. ОКНО Solution ЕХр|ОГвГ Если рассмотреть содержимое указанного окна, то можно увидеть, что внутри группы Images находятся ссылки на картинки, используемые при оформлении форм. Внутри группы References находятся ссылки на dll-файлы, отвечающие за реализацию ряда механизмов Web-расширения. Кроме этого, там находится ссылка на файл 1cvB.dll, в котором хранится информация о метаданных конфигурации, используемой веб-приложением. В корне MySite (так был назван виртуальный каталог приложения) опре- делен ряд других файлов. Рассмотрим их назначение: DefaultEiTorForm - форма, отображающая ошибки исполнения; DefaultFieldTreeForm - вызывается для отображения доступных полей при работе с объектом V8ReportBuilder; DefaultFilterForm - вызывается для установки отборов в списке; DefaultlmageForm - вызывается для отображения картинок; Defa ultLine Form - вызывается для редактирования строки табличной части (если указан режим редактирования в отдельной форме);
DefaultListForm - вызывается для отображения формы списка, формы выбора, формы выбора групп; DefaultObjectForm - вызывается для отображения формы объекта или группы справочника; DefaultRecordForm - вызывается для редактирования констант и записи в списке регистра сведений с независимым режимом записи; DefaultReportPrint - используется для вывода отчета на просмотр и печать; DefaultTypeChoice - вызывается для выбора типа в поле ввода; DefaultTypelnfo - возвращает информацию о типах из метаданных; DefaultValueList - используется для формирования подбора при вводе по строке; Global.asax - является как бы глобальным модулем веб-приложения, в нем можно определять ряд обработчиков событий; StyleSheetcss - содержит стили оформления, применимые к веб- формам; TableFormMap.xml - содержит описания основных форм объектов; Web.config - определяет настройки веб-приложения. Использование ряда этих файлов будет рассмотрено в следующих разделах данной главы. V8 List Form Познакомимся с конструктором V8 List Form на примере создания в прило- жении веб-формы, позволяющей просматривать (и выполнять ряд других стандартных действий) список номенклатурных позиций подключенной информационной базы. Для решения этой задачи включим в проект новый элемент (веб-форму). Сделать это можно, выполнив команду главного меню программы (Project-Add New Item...), рис. 20.16. File Etft View Project k Quid Debug Date Format IB-tia-i? Add WebEprm... I ► II О I Add Web User Control... Toobox ’O Add НПЧ. Page... VSWeb Wl Add Web Sendee... VBData Wl Add Component... Date AddOass... Web Forms Mill AcldNewItem... Ctrl+Shift+A I Pointer A Label Ш Add Existing Item... Shft+Ak+A Рис. 20.16. Команда Add New Item... Форму необходимо создать с использованием шаблона V8 List Form (для того чтобы не искать данный шаблон среди всех элементов пользо- вательского интерфейса, можно в левой части диалога сразу же выделить интересующую категорию VB), рис. 20.17. Профессиональная разработка в системе «1С:Предприятие 8»
Add Mew Item - MySitc Categories: S-Q web Project Items Templates: • О in Code -O Data £3 Utikty --£) Resources -€J V8 V8 Chait Form V8 Item Form V8 Report Form A form for Web Appfications | nomentet.aspx' Open | Cancel [ Help Рис. 20.17. Шаблон V8 List Form В нижней части диалога определяется имя создаваемой веб-формы. Данный шаблон может использоваться для создания веб-форм, которые по своей функциональности соответствуют формам списка любых объектов «1С: Предприятие». После открытия (кнопка Open) выбранного шаблона необходимо из списка выбрать таблицу базы данных, которая будет выступать источ- ником данных для создаваемой веб-формы (рис. 20.18). Имя таблицы Поля для разы Контрагент Склад Документ. П рихцднаяН аклэдная ПланОбмена.УдалежыеОфисы ПланОбмена.УдаленныеСклады РегистрНакопления. УчетНоменклетуры РегистрСведений.иеныНоменклвтуры Справочник-Контрагенты Справочные Склады Справочник.ТипыЦен Рис. 20.16. Выбор таблицы базы данных На этом же этапе конструктора можно определять состав полей, которые будут отображаться в создаваемой форме списка справочника (рис. 20.19). ВНИМАНИЕ! Следует отметить тот факт, что при создании форм может возник- нуть ситуация, когда имя реквизита совпадает с именем метода, существующего для объекта. К примеру, в справочнике может быть определен реквизит ПолноеНаименование. При создании формы списка (для объекта с таким реквизитом) и ее использовании проблем воз- никать не будет, но при попытке открыть из этой формы форму элемента справочника может быть выдано сообщение Member not found (при создании нового элемента, сразу при открытии формы элемента, при изменении существующего элемента, при попытке сохранения сделанных изменений). Том 2
К OHCTpyKTopiJilWe Ь3расширения(цля1вебгприложени й В Имя таблицы: |Справочник.Номенклатцра |У Записывать информацию в Файл соответствия имен таблиц и форм Рис. 20.19. Выбор состава полей Внизу открытого диалога автоматически ставится флажок Записывать информацию в файл соответствия имен таблиц и форм. Если оставить этот флажок отмеченным, то тогда в файле проекта TableFormMap.xml будет размещен дополнительный элемент XML TableFormMap. Содержимое файла приведено ниже (листинг 20.16). Листинг 20.16. Содержимое файла TableFormMap.xml «?xml version="1.0" encoding="utf-8"?> <!- Пример оформления «TableFormMap xmlns="http://tempuri.org/TableFormMap.xsd"> «table пате="Документ.ИнвентаризацияТоваровНаСкладе"> «formtype="Element">lnvent.aspx«/fbrm> «formtype="Lisf’>lnventList.aspx«/form> </table> «/TableFormMap> -> «TableFormMap xmlns="http://tempuri.org/TableFormMap.xsd”> «table пате="Справочник.Номенклатура"> «fbrmtype="Lisf'>nomenlist.aspx«/form> </table> «/TableFormMap» Элемент XML TableFormMap, представленный выше, описывает, что для таблицы Справочник.Номенклатура определена форма списка с именем nomenlist.aspx. Это приведет к тому, что при возникновении необходи- мости работы со списком указанной таблицы пользователь будет работать не с формой списка по умолчанию (DefaultListForm.aspx), а с данной формой, если иное действие не определено разработчиком явным образом. Например, он может явно указать, что для подбора номенклатуры из какого-либо документа должна использоваться строго определенная форма и т. п. ®3®
В результате добавления элемента по выбранному шаблону будет создана веб-форма следующего вида (рис. 20.20). Start Page | WebForml .aspx nomenltetaspx | <Выбрать < 1g Перейти Иерархически И Действия Ввод на основан ColumnO Column 1 Columns abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc VBLislDataSource: LialDalaSource Рис. 20.20. Созданная веб-форма Для просмотра созданной формы в действии ее можно определить как стартовую, используя команду главного меню программы (Project - Web Project - Set As Start Page), рис. 20.21. Edt View 1И-Й1-С2 13 Toolbox_______ VSWeb ~ VBData Data Web Forms | Pointer ~ A Label И1 TextBox Button Lin№utton * tn о % AddWebgorm... Add Web User Control... Add HTML Page... Add Web Service... Add Component... Add £)ass... Table Frames loots Wjndo | Debug » | £ nomenltstaepx ] 1i Перейти Иера|: Colum AddNe^Item... Ctrl+Shft+A AddExistinglten)... 5Mt+A)t+A Copy Project... abc abc abc Рис. 20.21. Команда Set As Start Page После этого можно запустить приложение в режиме отладки (Debug - Start) и проверить работу созданной формы. Следует отметить, что установка формы в качестве стартовой действует только в режиме отладки. В готовом веб-приложении стартовая страница определяется в настройках веб-сервера (рис. 20.22). Directory Security |f HTTP Headers Д Custom Errors [ Server Extensions Web Site Д ISAPI Fiers ]| Home Directory |^Drei«retSs DefatHasp index, htm isstartasp DefatHaspx fl I J I - I | Remove~~] -□ Enable Document Footer | | | Browse..."| Рис. 20.22. Указание стартовых страниц в настройках веб-сервера
Для каждого веб-сервера эти настройки могут быть определены индивидуально администратором сервера (например, программы Microsoft IIS). Подробное знакомство В результате работы конструктора в форме определено три объекта, их взаимосвязь можно показать схематически (рис. 20.23). VBCommandPanel | LinkedContfd ~| V6Grid | ListOataSource | VBLietDataSoutce TableName 1 Рис. 20.23. Взаимосвязь объектов Рассмотрение любой формы лучше начинать с источников. Источ- ником данных для этой формы является объект V8ListDataSource (ID - ListDataSource). Одно из свойств объекта содержит указание на используемую таблицу базы данных (Справочник.Номенклатура). Если веб-приложение работает с несколькими информационными базами «1С:Предприятия», то псевдоним базы указывается в свойстве IBAIias (пустой псевдоним означает, что используется база данных по умолчанию, которая была указана при создании веб-приложения). В диалоге определен серверный элемент управления V8Grid (элемент, показывающий список). Этот элемент управления связан с источником данных посредством свойства ListDataSource. Элемент управления V8CommandPanel (командная панель) связан с нужным списком посредством свойства LinkedControl. Для просмотра кода созданной веб-формы (ее реализации на языке С#) можно воспользоваться командой главного меню программы View - Code (рис. 20.24). Зе | View Project EMd Qebug Tools Wjndc IВ ’ fe] Ш Л i . * J M Designer ЭД1 t+F7 I j k 1 * * * * * * В * * 11 1_- I •' Рис. 20.24. Команда Code Код формы выглядит следующим образом (листинг 20.17). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 20.17 Код формы using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.Ul.WebControls; using System.Web.Ul.HtmIControls; using _1C.V8.Data; using _1C.V8.WebControls; namespace MySite { public class nomenlist: System.Web.UI.Page { /// Заголовок страницы. protected Literal Title; protected V8Grid Grid; /// Источник данных. protected VSListDataSource ListDataSource; /// Командная панель. protected VSCommandPanel Panel; #region Web Form Designer generated code override protected void Onlnit(EventArgs e) { Initial izeComponent(); base.Onlnit(e); } /// Required method for Designer support - do not modify /// the contents of this method with the code editor. private void lnitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); this.lnit += new System.EventHandler(this.Page_lnit); } #endregion private void Page_lnit(object sender, System.EventArgs e) { // Настройка командной панели. string controlName = Request.Params["ControlName'']; if (controlName != null && controlName != string.Empty) { Grid.State = V8Grid.V8GridState.Select; // Если установлено имя ЗУ, значит, список открыт для выбора. //Добавляем колонку "Представление", // так как при выборе его нужно передавать в ЗУ. ListDataSource.Fields.Add( ListDataSource.Metadata.TermString( WebConsts.kPresentationPropTermString), false, false); Grid.PresentationField = ListDataSource.Metadata.TermStringf WebConsts.kPresentationPropTermString); Tom 2
К6нструкторЙ1РЛ/еЬЗрасширёния7для1вёбгприложений ) else { (breach (VSCommandButton btn in Panel.Buttons.GetButtonsByType( VeCommandButtonType.Choice)) btn.Visible = false; } if (ListDataSource.CheckAccessRight(V8Rights.lnteractiveDelete)) { const IntActionsBtn = 10; // Для объектов команду удаления добавляем // в подменю "Действия". VOCommandButton btn = new V8CommandButton(); Panel.Buttons[ActionsBtn].SubMenu.Add(btn); btn.CommandType = V8CommandButtonType.Delete; } V8WebUtil.SetButtonsStateByRight( ListDataSource, PaneLButtons, V8CommandButtonType. Insert, V8Rights.lnteractivelnseit); V8WebUtil.SetButtonsStateByRight( ListDataSource, PaneLButtons, veCommandButtonType.lnsertFolder, VSRights.lnteractivelnsert); V8WebUtil.SetButtonsStateByRight( ListDataSource, PaneLButtons, V8CommandButtonType.Copy, VSRights.lnteractivelnsert); V8WebUtil.SetButtonsStateByRight( ListDataSource, PaneLButtons, V8CommandButtonType.DeletionMark, V8Rights.lnteractiveSetDeletionMark); V8WebUtil.SetButtonsStateByRight( ListDataSource, PaneLButtons, V8CommandButtonType.Delete, VSRights.lnteractiveDelete); } private void Page_Load(object sender, System.EventArgs e) { // Проверка прав на просмотр таблицы. if (!ListDataSource.CheckAccessRight(V8Rights.View)) { V8WebUtil.RegisterShowErrorScript( _1C.V8.Data.V8.GetString(''en_accessRightViolation''), this, true); Response.End(); return; } if (IlsPostBack) Title.Text = ListDataSource.Tablelnfb.Presentation; ) } }
_______________________________________1 Прокомментируем данный код. Оператор using определяет пространства имен библиотеки классов, которые используются в данной форме. Два последних из них: _1C.V8.Data, _1C.V8.WebControls. Они являются специфическими для Web-расширения. Пространство имен _1C.V8.Data содержит определения классов, реализующих различные механизмы работы с информационными базами. Пространство имен _1С. VB.WebControls содержит определение элементов управления, специфи- ческих для Web-расширения, и их свойств. Далее в коде формы определяется пространство имен проекта MySite. В этом пространстве имен определяется единственный класс nomenlist, он наследуется от класса System.Web.UI.Page (базового класса для веб- форм). В качестве защищенных членов класса определяются заголовок формы (Title) и все объекты, размещенные в диалоге формы (источник, список, командная панель). Далее определяется функция инициализации класса (OnInit(EventArgs е)). В данном обработчике производится вызов функции InitializeComponent(), которая отвечает за определение функций (членов класса) как обработ- чиков каких-либо событий. Затем производится вызов метода Init базового класса (System.Web.UI.Раде). Далее по коду определяются две функции, которые функцией InitializeComponent() были назначены как обработчики события инициа- лизации и загрузки формы. Следует отметить, что любой обработчик события является защищенным членом класса, функцией, которая не возвращает значения (void). У данной функции определено два параметра. Первый параметр - это элемент, с которого произошел вызов данной функции (объект, являющийся источ- ником события), второй параметр содержит объект, описывающий детали возникшего события. В функции - обработчике события Page_Init производится настройка командной панели, определенной в форме (определяется состав кнопок). Первоначально анализируется возможный параметр запроса ControlName (Request.Paramsf'ControlName1']). В случае, если в этом параметре опре- делено значение, отличное от Null, это значит, что форма открывается как форма выбора. Тогда для элемента управления устанавливается режим выбора (при двойном щелчке форма будет закрыта, и выбранное значение будет передано форме, из которой производился запрос), в источнике инициализируемой формы добавляется колонка Представление (для пере- дачи в элемент управления, в который производится выбор значения). В противном случае пытаемся найти кнопку выбора (в командной панели) и сделать ее невидимой.
Остальные кнопки устанавливаются в соответствии с правами пользо- вателя, в контексте которого производится обращение к базе данных «1 С:Предприятия». В обработчике события Page_Load производится проверка прав пользо- вателя на просмотр списка (в противном случае формируется сообщение о нарушении прав доступа). Далее проверяется свойство IsPostBack. Свойство позволяет отследить «первую загрузку» формы (форма загружа- ется не в связи с отработкой каких-либо «пользовательских» событий, т. е. не «повторно»), В случае, если форма загружается впервые, устанавлива- ется заголовок формы. Обратите внимание на тот факт, что инициализация формы и ее загрузка производятся каждый раз, как при ее первоначальной загрузке, так и при отработке каких-либо событий на стороне сервера. Форма объекта, вызываемая по умолчанию Если при работе в ранее созданной форме списка номенклатуры произ- вести двойной щелчок левой клавишей мыши, то откроется форма, содержащая данные о выбранном элементе справочника (рис. 20.25). File Edit View Favorites Tools Help ©Back • © • 0 @ ^Favorite ф№Ла 0 | 0’ И □ KI Рис. 20.25. Форма элемента справочника Это происходит, несмотря на тот факт, что явно форма элемента справоч- ника нами не создавалась. Дело в том, что в проект изначально включен набор форм по умолчанию (их перечень рассматривался ранее). И как раз в этом случае одна из этих форм и используется (DefaultObjectForm). Рассмотрим данный механизм более подробно. Профессиональная разработка в системе «1С:Предприятие 8»
Начнем с самой формы DefaultObjectForm. В диалоге формы определен источник данных, без указания таблицы, с которой он связан, и два элемента управления: таблица (обычный серверный элемент управления из пространства имен Sysytem.Web.UI.WebControls); командная панель (элемент управления, специфический для Web-pac- ширения). Фрагмент диалога формы показан на рисунке (рис. 20.26). WebForml.aspx | nomenfct.aspx | nomenfct.aspx.cs DefaultObJetlFuriihaspx* | 4 > X |та1пТаЫеСЫ Syslem.Web.UI.WebControk.T^le Д] fc ГЙ1ТЙ1 ? II и Рис. 20.26. Фрагмент диалога формы В командной панели определены три кнопки (OK, Save, Close). Состав коллекции кнопок и возможные варианты настройки показаны на следу- ющем рисунке (рис. 20.27). Arid I Remove OK Properties: E) Misc OK I Cancel | Help | Рис. 20.27. Состав коллекции кнопок Программная реализация формы на языке C# приведена ниже (листинг 20.18). Следует отметить, что данный код приводится в качестве примера формы, определяемой программно (на основании переданных параметров). Никто не гарантирует, что со временем реализация этой формы не будет меняться. Том 2
К OHCTpyKTopiJilWe ЬЗрасширенияРдля1вебгприложени й Листинг 20.18. Программная реализация формы DefaultObjectForm using System; using System.Collections; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.Ul.WebControls; using System.Web.Ul.HtmIControls; using System.lO; using _1C.V8.Deta; using _1C.V8.WebControls; namespace _1 C.V8.Forms { /// <summary> /// Форма объекта. /// </summaiy> public class DefaultObjectForm: System.Web.UI.Page protected _1C.V8.WebControls.V8CommandPanel menuPanel; protected _1C.V8.WebControls.V8CommandPanel mainPanel; protected System.Web.Ul.WebControls.Table mainTableCtri; protected Literal Title; protected _1C.V8.WebControls.V8ObjectDataSource objectDS; public const string CssLabelClass = "labelltem"; public const string CssTextBoxClass = "textbox"; private void DefaultObjectForrnJnitfobject sender, System.EventArgs e) if (Session["Culture"] != null) System.Threading.Thread.CurrentThread.CunentCulture = newSystem.Globalization.Culturelnfo((string)Session["Culture"]); string IBAIias = (string)Request.Params["IBAIias"]; if (IBAIias == null) IBAIias = string.Empty; objectDS.IBAIias = IBAIias; V8Metadata metadata = V8Metadata.GetMetadata(IBAlias); if (Request.Params["KeyType"] != null) objectDS.TableName = metadata.TableNameByTypeNamef Request.Params["KeyType"]); else if (Request.Params["TableName'l != null) objectDS.TableName = Request.Params["TableName"]; else if (Request.Params["CopyKeyType"] != null) objectDS.TableName = metadata.TableNameByTypeNamef Request.Params["CopyKeyType"]); else throw new Exceptional C.V8.Data.V8.GetString("erT_WrongPageParameters")); objectDS.ChecklsFolder(Request.Params["lsFolder"], Request.Params["KeyValue"], Request.Params["CopyKeyValue"], Request.Params["CopyKeyType"]);
Гл а ва}20АМё Ьиэас ширение' objectDS.SetTabularParts(objectDS.GetAIITabularParts()); // Проверка на Redirect. FormType formType = FormType. Element; if (objectDS.IsFoloer) formType = FormType.ElementFolder; string uri = V8Config.GetUri(obiectDS.IBAIias, obiectDS.TableName, formType); if (uri != string.Empty && uri != WebConsts.DefaultForms.DefaultObjectFormName) Server.Transfer(uri); Title.Text = objectDS.Tablelnfo.Presentation; ConstructForm(); private void DefaultObjectForm_Load(object sender, System.EventArgs e) // Проверка прав на просмотр табпицы. if (!objectDS.CheckAccessRight(V8Rights.View)) V8WebUtil.RegisterShowErrorScript( _1C.V8.Data.V8.GetString("err_accessRightViolation"), this, true); Response.End(); return; } if (ilsPostBack) RegisterResizeScript(); } 1 #region Web Form Designer generated code override protected void Onlnit(EventArgs e) Initial izeComponent(); base.Onlnit(e); private void lnitializeComponent() this.Load += new System.EventHandler(this.DefaultObjectForm_Load); this.lnit += new System.EventHandler(this.DefaultObjectFormJnit); this.PreRender += new System.EventHandler(this.DefaultObjectForm_PreRender); #endregion /// <summary> /// Создать эпементы управления формы. /// </summary> protected void ConstructForm() bool enabled = obiectDS.CheckAccessRight(V8Rights.Edit); objectDS.Enabled = enabled; menuPanel.Buttons[0].Text = \Z8.Data.V8.GetString("menu_reRead"); string presentationName = objectDS.Metadata.TermString( WebConsts.kPresentationPropTermString); // Создаем ЗУ для отображения и редактирования полей шапки. VeitemDSFieldCollection fields = objectDS.GetFields(); (breach (VSItemDSField field in fields) {
if (Ifield.Visible) continue; VSFieldlnfb fieldinfo = objectDS.Tablelnfo.Fieldslnfo[field.Name]; if (fieldlnfo.ReadOnly) continue; // Пропускаем хранипище значения. if (fieldlnfb.TypeDomain.Types.C ount == 1 && string.Compare(fieldlnfo.TypeDomain.Types[0], veConsts.kValueStorageTypeString, true) == 0) continue; } TableRow row = new TableRowf); mainTableCtri.Rows.Add(row); TableCell cell = new TableCellQ; row.Cells.Add(cell); Label labelCtrl = new Label(); cell.Controls.Add(labelCtri); labelCtri.Text = fieldlnfo.Presentation; labelCtrl.CssClass = CssLabelClass; cell = new TableCellf); row.Cells.Add(cell); cell.Width = Unit.Percentage(IOO); V8TextBox textBoxCtri = new V8TextBox(); textBoxCtri.IBAIias = objectDS.IBAIias; cell.Controls.Add(textBoxCtrt); if (fieldlnfo.PresentationLength == 01| fieldlnfb.PresentationLength > 25) textBoxCtri.Width = Unit.Percentage(IOO); textBoxCtri.Width = new Unit(27, UnitType.Ex); textBoxCtri.ID = fieldlnfo.Name; textBoxCtrl.CssClass = CssTextBoxClass; if (string.Equals(fieldlnfb.Name, objectDS.Tablelnfo.ParentField)) textBoxCtri.ChoiceMode = ChoiceFoldersAndltems.Folders; textBoxCtrl.Type = fieldlnfo.TypeDomain; if (fieldlnfo.TypeDomain.Types.Count > 1) textBoxCtri.ClearButton = true; bool existReference = fieldlnfo.ReferenceExist; bool existEnum = fieldlnfo.EnumExist || fieldlnfo.BodExist || fieldlnfo.EnumRefExist; if (existReference) textBoxCtri.SelectButton = true; textBoxCtrl.OpenButton = true; textBoxCtri.ClearButton = true; else if (existEnum || fieldlnfo.DateExist) textBoxCtri.SelectButton = true; else if (fieldlnfo.TypeDescriptionExist) textBoxCtri.SelectButton = true; textBoxCtrl.SelectURL = WebConsts.DefaultForms. DefaultTypeChoiceFormName; textBoxCtrl.AvailableTypes = fieldlnfo.AvailableTypes; textBoxCtri. ItemDataSource = objectDS.UniquelD; textBoxCtri. FieldName = fieldlnfo.Name; } // Создаем закладки для табличных частей. VSItemDSTabularPartCollection tabularParts = objectDS.GetAIITabularPartsQ; Профессиональная разработка в системе «1С:Предприятие 8»
if (tabularParts.Count > 0) mainTableCtrl.Height = Unit. Percentage^ 00); TableRow row = new TableRow(); mainTableCtrl.Rows.Add(row); TableCell cell = new TableCell(); row.Cells.Add(cell); cell. ColumnSpan = 2; cell.Height = Unit.Percentage(100); V8TabControl tabControl = new V8TabControl(); cell.Controls.Add(tabControl); tabControl.Width = Unit.Percentage(100); tabControl.Height = Unit.Percentage(100); // Для каждой табличной части создаем таблицу. (breach (VSItemDSTabularPart tp in tabularParts) V8Tab tab = new V8TabQ; tabControl.Tabs.Add(tab); tab.Text = objectDS. Metadata. Tableslnfb[objectDS.TableName ++ tp.Name]. Presentation; HtmITable tabTable = new HtmlTable(); tab.Controls.Add(tabTable); tabTable.Width = ”100%"; tabTable.Height = ”100%"; tabTable.CellSpacing = 0; tabTable.CellPadding = 0; HtmITableRow tabRow = new HtmlTableRow(); tabTable.Rows.Add(tabRow); HtmlTableCell tabCell = new HtmlTableCellf); tabRow.Cells.Add(tabCell); tabCell.ColSpan = 2; V8CommandPanel panel = new V8CommandPanel(); tabCell.Controls.Add(panel); panel.LinkedControl = "Table.” + tp.Name; panel.lD = tp.Name + "Panel”; V8CommandButton btn = new V8CommandButton(); btn.CommandType = V8CommandButtonType.lnsertRow; panel.Buttons.Add(btn); btn = new V8CommandButton(); btn.CommandType = V8CommandButtonType.CopyRow; panel.Buttons.Add(btn); btn = new V8CommandButton(); btn.CommandType = V8CommandButtonType.DeleteRow; panel.Buttons.Aad(btn); tabCell.Controls.Addf new LiteralControl(@”<div style=’height:2px'><img src='" + WebConsts.lmages.Emptylmage +”'/></div>")); tabRow = new HtmlTableRow(); tabTable.Rows.Add(tabRow); tabCell = new HtmlTableCell(); tabRow.Cells.Add(tabCell); tabCell.Width = "1px"; Tom 2
Конструктор£|1УУеЬ;расширенияУдля1вёбгприложений tabCell.Controls.Add( new LiteralControl(@”<div style—width:1px;height:80px’>" + ”<img src='" + WebConsts.lmages.Emptylmage +/></div>")); tabCell = new HtmlTableCell(); tabRow.Cells.Add(tabCell); tabCell.Height = "100%"; tabCell.Width = "100%; Panel overPanel = new Panelf); tabCell.Controls.Add(overPanel); overPanel.Width = Unit.Percentage(100); overPanel.Height = Unit.Percentage(100); overPanel.Style.AddC'overflow”, "auto”); VOTablelnfb subTableinfo = objectDS. Metadata. Tableslnfb[objectDS.TableName ++ tp.Name]; VOEditGrid editGridCtri = new V8EditGrid(); editGridCtri.IBAIias = objectDS. IBAIias; editGridCtri.ID = "Table." + tp.Name; overPanel.Controls.Add(editGridCtri); editGridCtri.GridLines = GridLines.Horizontal; editGridCtri.BorderWidth = Unit.Pixel(1); editGridCtri.BorderStyle = BorderStyle.Solid; editGridCtri.BorderColor = Color.Gray; editGridCtri. Width = Unit.Percentage(100); editGridCtri. ItemDataSource = objectDS.UniquelD; editGridCtri.DataMember = tp.Name; // Создаем колонки no полям табличной части. VSItemDSFieldCollection tpFields = tp.GetFields(); foreach (\Z8ltemDSField field in tpFields) if (ifield.Visible) // TODO переделать на // невидимую колонку у грида continue; VSFieldlnfo fieldinfo = subTablelnfo.Fieldslnfo[field.Name]; if (fieldlnfo.ReadOnly) continue; V8EditGridColumn column = new V8EditGridColumn(); editGridCtri.Columns.Add(column); column. FieldName = fieldlnfo.Name; column.HeaderText = fieldlnfo.Presentation; column.Type = fieldlnfb.TypeDomain; if (field.Presentation) column.PresentationField = fieldlnfo.Name + presentationName; if (fieldlnfo.TypeDomain.Types.Count > 1) column.ClearButton = true; bool existReference = fieldlnfo.ReferenceExist; bool existEnum = fieldlnfo.EnumExist || fieldlnfo.BoolExistll fieldlnfo.EnumRefExist; if (existReference) column.ClearButton = tme; column.OpenButton = true; column.SelectButton = true; } else if (existEnum || fieldlnfo.DateExist)
Гл а ва}20АМё Ьиэас ширение' column.SelectButton = true; else if (fieldlnfb.TypeDescriptionExist) column.SelectButton = true; column.SelectURL = WebConsts.DefaultForms. DefaultTypeChoiceFormName; column.AvailableTypes = fieldinfo. AvailableTypes; // Добавить допопнитепьные команды. if (enabled && objectDS.Tablelnfb.Helper != null && objectDS.Tablelnfo.Helper.Actions != null) ArrayList actions = objectDS.Tablelnfo.Helper.Actions; int pos = mainPanel.Buttons.Count -1; if (pos < 0) pos = 0; foreach (V8Action action in actions) if (iaction.ltem) continue; VSCommandButton btn = new V8CommandButton(); btn.CommandType = V8CommandButtonType.Custom; btn.CommandName = action.Name; btn.Text = action.Presentation; btn.Hint = action.Presentation; mainPanel.Buttons.lnsert(pos, btn); pos++; protected void RegisterResizeScript() string s = "<script>ResizeWindow(500,350);</script>"; Page.RegisterStartupScript("Resize”, s); private void DefaultObjectFomn_PreRender(object sender, System.EventArgs e) switch (objectDS.FormMode) case VSItemDataSourceMode.New: menuPanel.ButtonsMl.Text = V8.Data.V8. GetString("V8ltemDataSourceMode.New"); break; case VSItemDataSourceMode.Edit: menuPanel.Buttons[1].Text = V8.Data.V8. GetString("V8ltemDataSourceMode.Edit"); break; case VSItemDataSourceMode.Copy: menuPanel.Buttons[1].Text = V8.Data.V8. GetString("V8ltemDataSourceMode.Copy"); break; cese VSItemDataSourceMode.InputOnBasis: menuPanel.Buttons[1].Text = V8.Data.V8. GetStnng("V8ltemDataSourceMode.lnputOnBasis"); break;
Если рассмотреть представленный код, то можно отметить, что «струк- тура» кода совпадает со структурой кода любой веб-формы (в том числе веб-формы, позволяющей работать со списком номенклатуры). Отличи- тельной особенностью является наполнение (код) обработчика события инициализации веб-формы (DefaultObjectForm_Init) и наличие дополни- тельной функции ConstructForm. Рассмотрим их назначение и особенности функционирования. Обработчик инициализации формы DefaultObjectForm_Init фактически производит настройку источника данных (V8ObjectDataSource objectDS). Производится опрос возможных параметров запроса к данной форме. Если Web-приложение работает с несколькими базами «1С:Предприятия», проверяется значение параметра IBAIias. Полученное значение устанавли- вается в свойство объекта источника данных. Далее (в нашем случае в параметре КеуТуре, получаемом с помощью вызова Request.Params["KeyType"]) определяется значение Справоч- ник.Номенклатура (это значение в запрос к форме включается автома- тически). Значение полученного параметра устанавливается как имя таблицы источника данных. Далее по коду делается ряд проверок, и осуществляется установка других (не менее важных) свойств источника. Практически в самом конце обра- ботчика размещены следующие строки (листинг 20.19). Листинг 20.19. Фрагмент кода string uri = V8Config.GetUri(objectDS.IBAIias, objectDS.TableName, fbrmType); if (uri != string.Empty && uri != WebConsts.DefaultForms.DefaultObjectFormName) Server.Transfer(uri); В первой строке производится попытка получения формы, назначенной основной (используются данные, записанные в файле TableFormMap.xml). В случае, если в результате выполнения метода GetUrl() не возвращается пустая строка либо имя формы по умолчанию, производится переход на данную (специфическую) форму (Server.Transfer(url)), путь к которой был получен. Если переход на другую форму не производится, то вызывается функция ConstructForm(). В тексте модуля данной функции можно выделить несколько основных моментов: в самом начале производится проверка на наличие прав на редактиро- вание объекта; в соответствии с метаданными объекта создается набор элементов управления, связанных со свойствами редактируемого объекта; в соответствии с метаданными объекта создается набор элементов управления V8EditGrid, определяется состав колонок (в соответствии с набором реквизитов соответствующих табличных частей). Профессиональная разработка в системе «1С:Предприятие 8»
Связывание списков Поставим перед собой задачу: определить в веб-форме, позволяющей работать со списком номенклатуры, возможность просмотра и заполнения регистра сведений ЦеныНоменклатуры. Регистр сведений имеет два измерения: Номенклатура, тип СправочникСсылка.Номенклатура; ТипЦены, тип СправочникСсылка.ТипыЦен. Также регистр имеет ресурс Цена, тип Число. Регистр непериодический, режим записи независимый. Вернемся к форме nomenlist.aspx. Добавим в форму списка новый источник (V8ListDataSource), в качестве таблицы (свойство TableName) укажем таблицу РегистрСведений.ЦеныНоменклатуры (рис. 20.28). | Properties у X V8Ustt)ataSourcel JC.Ve.WebControls.V6UstD8ta5ource a 2 Misc 1 neo VBListDataSourcel AbwedData True ChoteeMode FddersAndltems Condfctondause (Colection) Heids (Colection) hierarchical False IBAfes InfcByRequest True OrderRelds PageSze 20 TableName Регистров едений.ЦеныНоменкмтуры TypeDescripttonNeeded False WhereClause Номенклатура=&Ссыяка WhereParameters (Colection) Рис. 20.26. Свойства источника данных V8ListDataSource При настройке свойств нового источника в свойство WhereClause потре- буется записать условие (можно сказать, что описание условия в данном свойстве равнозначно описанию условия в разделе ГДЕ при постро- ении запроса к указанной таблице). Если необходимо определить условие как параметр виртуальной таблицы, то используется коллекция Conditionclause. Так же как и при описании запроса, параметр описывается с помощью символа &, но, в отличие от работы с объектом Запрос «^Пред- приятия 8», параметр должен быть еще и определен (не путать с присво- ением параметру значения). Определение параметров происходит при настройке коллекции WhereParameters (необходимо просто создать новый параметр и указать его имя - Ссылка). После настройки нового источника необходимо добавить еще один серверный элемент управления V8Grid. В свойство ListDataSource опреде- лить имя добавленного источника данных (рис. 20.29). Том 2
К OHCTpyKTopiJilWe Ь3расширения(цля1вебгприложени й VBGridl _lC.V8.WebControfc.VBGrid В Appearance в Behavior в Data (DataBindhgs) DataMember DataMemberParents DataSource IBARas IsFokierFieM KeyFields VBUstDataSourcel PresentabonField ТаЫеМате Рис. 20.29. Установка свойства ListDataSource Кроме этого, можно в свойство Width записать значение 100% (это приведет к тому, что ширина табличного поля будет совпадать с шириной открыва- емой формы). После размещения элемента в диалоге можно определиться с составом отображаемых им колонок. Для этой цели сначала нужно выполнить команду контекстного меню Fill columns (заполнить колонки) добавленного элемента управления V8Grid (рис. 20.30). View НТИ. Source X Cut % Copjr @ Paste Pasts as HTML X Delete Build Style... Bl View in Browser View dient Script View Code Synchronize Document Outine В Prooertes рис 20.30. Команда Fill columns После выполнения указанной команды будет автоматически (в соот- ветствии с указанным источником) заполнена коллекция Columns табличного поля. Остается удалить из коллекции ненужные колонки (рис. 20.31). В Members: ТипЦен Properties: EMisc Mier ffiira 1 hierarchical VBGridl (CoRectlon) False 1]цена 1—1 □ CotumnName Format ТипЦен ТипЦенПредстаЕ [V hierarchyByElement OpenEnabled False True OpenFdderUrl HeaderText ТипЦен OpenUrl HorizontalARgn NotSet Select edlndex 0 Visible True State Browse Width Рис. 20.31. Настройка колонок списка
Следующим действием будет назначение элементу управления V8Grid, ответственному за список номенклатуры, обработчика события SelectedlndexChanged (при изменении текущего индекса строки). Для этой цели в окне просмотра свойств необходимо переключиться в режим просмотра обработчиков событий (кнопка с молнией), устано- вить курсор напротив события с именем V8Grid_SelectedIndexChanged (рис. 20.32) и нажать кнопку Enter на клавиатуре. Properties ? X VBGridl _lC.V8.WebControkV8Grid b[£Jb Action 1 ClearFllterCommand DeleteCommand DeletionMarkCommand RlterCommand FdderDomCommand FolderUpCommand ItemCommand RefreshCommand V8Gridl_SelectedIndexChanged ▼! | SwtchHierarchyCommand Рис. 20.32. Событие SelectedlndexChanged При этом выполнятся два действия. Во-первых, в функции InitializeComponentO (ответственной за определение обработ- чиков событий) появится новая строка. Этой строкой новая функция Grid_SelectedIndexChanged() назначается обработчиком события SelectedlndexChanged для элемента управления V8Grid (табличное поле, созданное конструктором формы и позволяющее работать со списком номенклатуры). Добавленная строка выделена серым фоном (листинг 20.20). Листинг 20.20. Функция I nitializeComponent private void InitializeComponentO { this.Grid.SelectedlndexChanged += new System.EventHandler(this.Grid_SelectedlndexChanged); this.Load += new System.EventHandler(this.Page_Load); this.lnit += new System.EventHandler(this.Page_lnit); Во-вторых, в коде описан заголовок функции Grid_SelectedIndexChanged(). Остается определить внутри функции следующие строки кода (листинг 20.21). Листинг 20.21. Функция Grid_SelectedlndexChanged private void Grid_SelectedlndexChanged(object sender, System.EventArgs e) { V8ListDataSource1 .WhereParameters[O].Value = Grid.ltems[Grid.Selectedlndex].KeyValues[O]; V8ListDataSource1 .FirstQ; V8Grid1.DataBind(); } see
В данной функции производится получение ключевого поля (мы опреде- лили в качестве ключевого поля ссылку на номенклатуру) по текущему (новому) индексу записи в списке номенклатуры. Полученная ссылка устанавливается в значение первого параметра. Обращение к параметрам производится по индексу. Первый параметр, а он у нас и единственный, в коллекции параметров имеет индекс, равный нулю. Далее источник V8ListDataSource1, связанный с регистром сведений, принудительно перечитывает данные в соответствии с новым значением параметра. После этого у табличного поля (V8Grid1) вызывается метод, инициирующий получение данных у источника. При проверке реализованного механизма можно убедиться, что требу- емый результат достигнут (рис. 20.33). Hie Edt View Favorites Tools Help ОВаЛ ’ © - 0 @ й Search Favorites Media Address http://locahost/MySite/nomen>st.aspx ~an Go ] Links ** § Ий IS; Перейти ▼ Иерархически й] Vx Действия ▼ ^Обновить 0 0 S й код Наименование Пометка удаления Ссылка Предопределенный Родитель Это группа Полное наименование 0000014 Ardo TL 1000 ЕХ-1 Ardo TL 1000 ЕХ-1 Ardo TL 1000 ЕХ-1 ТипЦен Цена Рис. 20.33. Пример созданной формы Схематически весь процесс можно представить следующим образом (рис. 20.34). Рис. 20.34. Схема взаимодействия связанных списков У рассмотренного механизма есть один недостаток. При первоначальном открытии окна табличное поле, связанное с регистром сведений (V8Grid) Профессиональная разработка в системе «1С:Предприятие 8»
данными, не заполняется. Это происходит по той причине, что событие SelectedlndexChanged не возникает при открытии формы. Для решения этой проблемы необходимо выполнить несколько действий. Сначала следует изменить обработчик загрузки веб-формы (добавить строки), листинг 20.22. Листинг 20.22. Обработчик события Page_Load private void Page_Load(object sender, System.EventArgs e) { // Проверка прав на просмотр табпицы. if (!ListDataSource.CheckAccessRight(V8Rights.View)) { V8WebUtil.RegisterShowErrorScript( _1C.V8.Data.V8.GetString(”err_accessRightViolation"), this, true); Response.End(); return; } if (IlsPostBack) { Title.Text = ListDataSource.Tablelnfb.Presentation; this.ListDataSource.First(); this.Grid.DataBind(); this.Grid_SelectedlndexChanged(Grid, null); } .} При первой загрузке страницы производится программное чтение данных в источник, связанный с номенклатурой. Далее производится получение данных соответствующим табличным полем, и после этого производится принудительный вызов функции - обработчика события SelectedlndexChanged. Затем у обоих элементов управления - источников данных — нужно уста- новить свойство InitByRequest в значение False (рис. 20.35). IBAfas __________________ False Vj Order Reids____ЗтоГруппа УбывДаимен ф РяпйЯ&а 2fl Рис. 20.35. Свойство InitByRequest Установка данного свойства необходима для исключения двойного считы- вания данных, так как теперь данные считываются и программно. Том 2
К OHCTpyKTopiJilWe Ь3расширения(цля1вебгприложени й V8 Item Form Для создания веб-формы, которая бы отображала данные какого-либо объекта (элемента справочника, документа и т.п.), необходимо выбрать шаблон V8 Item Form (рис. 20.36). 13 Templates: Categories: web Project Items i-O m code Data uaty *••••£) Resotrces L-3J V8 V8 Chart Form V8 Report Form V8 List Form A form for Web Appfcations Name: | docobj.aspx )pen | Cancel | Help | Рис. 20.36. Шаблон V8 Item Form После определения имени создаваемой формы открываем шаблон. Для начала необходимо определиться с объектом, для которого будет создаваться веб-форма. Будем считать, что необходимо создать форму документа Поступление товароа (рис. 20.37). Имятаблицы |До«умеигПосг^тле**«Тоеарое' Р Записывать информацию в Файл соответствия имен таблиц и Форм Назад | Вперед | | Готово | Отмена Рис. 20.37. Окно конструктора формы элемента
______________________________________1 После выбора таблицы необходимо определиться с составом рекви- зитов. Следует отметить, что в данном случае желательно выбирать все реквизиты (кроме предопределенных), если вы не создаете форму только для просмотра. После нажатия кнопки Вперед необходимо будет выбрать табличную часть, которая будет размещена в веб-форме, и определиться с составом отоб- ражаемых реквизитов табличной части документа. Заметьте, несмотря на то, что есть возможность для табличной части выбрать ссылку и номер строки (как показано на рисунке), делать это совсем не обязательно (рис. 20.38). Рис. 20.36. Выбор реквизитов табличной части После нажатия кнопки Готово интересующая нас форма будет создана. Познакомимся с этой формой поближе. В рассматриваемой веб-форме можно увидеть несколько элементов управ- ления: V8ObjectDataSource - является источником данных (в его настройках указывается таблица, из которой будут извлекаться данные для формы). В качестве ключевого поля данного элемента выступает ссылка на загруженный элемент; V8TextBox - предназначен для отображения (и обработки) реквизитов шапки документа; V8EditGrid - предназначен для вывода табличной части документа (на каждую табличную часть по элементу); veCommandPanel - реализует командную панель (как для экземпляра документа в целом, так и для каждой табличной части).
Взаимосвязь элементов управления в упрощенном виде можно изобра- зить в виде следующей схемы (рис. 20.39). Рис. 20.39. Взаимосвязь элементов управления Внутри каждого объекта указаны свойства, посредством которых настра- ивается взаимосвязь указанных элементов управления. Программная реализация веб-формы строится по стандартной схеме и имеет следующий вид (листинг 20.23). Листинг 20.23. Программная реализация веб-формы using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.Ul.WebControls; using System.Web.Ul.HtmIControls; using _1C.V8.Pata; using _1 C.V8.WebControls; namespace MySite { /// <summary> /// Summary description for docobj. /// </summary> public class docobj: System.Web.Ul.Page { /// <summary> /// Заголовок страницы. /// </summary> protected Literal Title; /// <summary> /// Источник данных. /// </summary> protected VSObjectPataSource ItemPataSource; Профессиональная разработка в системе «1С:Предприятие 8»
Ill <summary> /// Командная панель. /// </summary> protected _1 C.V8.WebControls.V8CommandPanel menuPanel; /// <summary> /// Командная панель формы. /// </summary> protected _1C.V8.WebControls.V8CommandPanel mainPanel; /// <summary> /// Редактирование полей. /// </summary> protected System.Web.Ul.WebControls.Label Labelflaia; protected V8TextBox Дата; protected System.Web.Ul.WebControls.Label LabelHoMep; protected VSTextBox Номер; protected System.Web.Ul.WebControls.Label 1_аЬе1Контрагент; protected V8TextBox Контрагент; protected System.Web.Ul.WebControls.Label 1_аЬе1Скпад; protected VSTextBox Склад; protected System.Web.Ul.WebControls.Label 1_аЬе1Ссылка; protected V8TextBox Ссылка; protected System.Web.Ul.WebControls.Label 1_аЬе1ПометкаУдаления; protected VSTextBox ПометкаУдаления; protected System.Web.Ul.WebControls.Label ЕаЬе1Проведен; /// <summary> /// Редактирование табличных частей. /// </summary> protected V8TabControl V8TabControl1; II Состав. protected V8Tab V8TbM ; protected V8EditGrid V8EditGrid1; protected _1 C.V8.WebControls.V8CommandPanel V8CommandPanel3; #region Web Fonn Designer generated code ovenide protected void Onlnit(EventArgs e) { Initial izeComponent(); base.Onlnit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void lnitializeComponent() { this.Load += new System.EventHandler(this.Page_Load); this.PreRender += new System.EventHandler(this.Page_PreRender); } #endregion private void Page_Load(object sender, System.EventArgs e) { // Проверка прав на просмотр таблицы. if (!ltemDataSource.CheckAccessRight(V8Rights.View)) Том 2
К OHCTpyKTopiJilWe ЬЗрасширенияУдля1вебгприложени й { V8Weblitil.RegisterShowErrorScript( _1C.V8.Data.V8.GetString("em_accessRightViolation"), this, true); Response.End(); return; } if (UsPostBack) Title.Text = ItemDataSource.Tablelnfo.Presentation; } private void Page_PreRender(object sender, System.EventArgs e) { switch (ItemDataSource.FormMode) { case VSItemDataSourceMode.New: menuPanel.Buttons[1].Text = _1C.V8.Data.V8. GetString("V8ltemDataSourceMode.New”); break; case VSItemDataSourceMode.Edit: menuPanel.Buttons[1].Text = _1C.V8.Data.V8. GetString(''V8ltemDataSourceMode.Edit"); break; case VSItemDataSourceMode.Copy: menuPanel.Buttons[1].Text = _1C.V8.Data.V8. GetString("V8ltemDataSourceMode.Copy"); break; cese VSItemDataSourceMode.inputOnBasis: menuPanel.Buttons[1].Text = _1C.V8.Data.V8. GetString("V8ltemDataSourceMode.lnputOn Basis"); break; } } } } В пространстве имен проекта определяется новый класс. Все элементы управления определены как защищенные члены класса. Далее по коду определяются обработчики событий. Обработка строки табличной части При работе с документом, созданным в предыдущем разделе, стано- вится очевидным одно неудобство: сумма по строке табличной части не считается, цена не подбирается. Данные механизмы уже давно относятся к обязательным. Рассмотрим пример реализации расчета суммы по строке по введенному количеству и сумме. И7
В самом начале потребуется включить в проект новую форму (используя шаблон Web Form). В диалоге разместить несколько элементов управ- ления: V8LineDataSource (имя lineDS, в качестве источника указана табличная часть документа); V8TextBox (по одному элементу управления на каждый реквизит табличной части); надписи (обычные HTML-элементы); veCommandPanel, командная панель, связанная с объектом lineDS. Приблизительный вид формы (рис. 20.40). art Page | WebForml.aspx | docfct.aspx | docob|.aspx | docobj.a$px.cs | бпедослврк* [ Bnedoc.aspx.cs | DefaukLiTK :::::::::: Номенклатура | : ^Ьс Е)Н :::::::::: Количество I:::: |аьё ::: Пена [ fabc ::::::::::::::::::::::::::::::::: Юумма I:::: VBLineDaiaSource: lineDS |::::::::::::::::::::::::::::::::::::::::::::: Рис. 20.40. Внешний вид веб-формы Для элементов управления V8TextBox, связанных с реквизитами табличной части Количество и Цена, можно определить обработчик события ValueChanged. Текст всей формы приведен ниже (листинг 20.24). Листинг 20.24. Программная реализация веб-формы using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.Ul.WebControls; using System.Web.Ul.HtmlControls; using _1C.V8.Data; using _1 C.V8.WebControls; namespace MySite { /// <summary> /// Summary description for linedoc. /// </summary> public class linedoc: System.Web.UI.Page { protected _1 C.V8.WebControls.V8TextBox V8TextBox1; protected _1 C. V8.WebControls.V8TextBox V8TextBox2; protected 1C.V8.WebControls.V8TextBox V8TextBox3;
protected _1C.V8.WebControls.V8LineDataSource lineDS; protected _1C.V8.WebControls.V8CommandPanel mainPanel; protected _1C.V8.WebControls.V8TextBox V8TextBox4; private void Page_Load(object sender, System.EventArgs e) { // Получает список элементов. this.lineDS.SetColumns(); } #region Web Form Designer generated code override protected void Onlnit(EventArgs e) { // // CODEGEN: This call is required by the //ASP.NET Web Form Designer. // lnitializeComponent(); base.Onlnit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void lnitializeComponent() { this.V8TextBox2.ValueChanged += new _1 C.V8.WebControls. ValueChangedHandler(this.V8TextBox2_ValueChanged); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void V8TextBox2_ValueChanged(System.EventArgs eventArgs) { decimal Summa=0; Summa = Convert.ToDecimal(this.V8TextBox2.Value) * Convert.ToDecimal(this.V8TextBox3.Value); this.V8TextBox4.Value = Summa; } } } He следует забывать тот факт, что если не предпринимать никаких допол- нительных шагов, обработка события (изменения количества и цены) будет производиться только после явной отправки формы. Для того чтобы вызов функции происходил именно при изменении (а не кешировался), необходимо свойство AutoPostBack установить в значение True. Следует отметить, что не нужно без особой необходимости устанавливать данное свойство для всех элементов управления. Рекомендуется это делать только в тех случаях, когда действительно нужна немедленная обработка данных (фактически после проведения изменений производится отсылка формы серверу), рис. 20.41. Профессиональная разработка в системе «1С:Предприятие 8»
El V8TextBox2 JC.V8.WebControb.V8TextBox UseUstChoice False В Behavior I Ac cessKey True Enabled True EnableVlewState True Tabindex 0 ToolTip Visfcle True в Data I (DataBIncings) AvaWeTypes ChokeMode Folder sAndltems ReldName Котчество IBAkas ItemDataSource kneDS Рис. 20.41. Свойство AutoPostBack Теперь, после того как форма (ответственная за редактирование строки) готова, остается в веб-форме, ответственной за редактирование документа, установить нужным образом свойства объекта V8EditGrid (рис. 20.42). Рис. 20.42. Свойство EditlnSeparateWindow В свойстве EditlnSeparateWindow указывается, что редактирование строки табличной части будет производиться в отдельном окне. И в качестве этого окна будет использоваться вновь созданная форма строки табличной части. V8 Report Form При необходимости включения в создаваемое веб-приложение каких- либо отчетных форм можно воспользоваться шаблоном V8 Report Form. Создадим отчет, с помощью которого можно будет просматривать остатки номенклатурных позиций по складам. Для начала включим в проект новую форму. При создании выбираем шаблон VB Report Form (рис. 20.43). а Categories: B-Q Web Project Items ! •••□ Ш ‘•••Q Code 'О Data hO ut*y :- Pl Resources Templates: A form for Web AppkaUons Name: | nomenost.aspx ^^^per^^J Cancel | Help | Рис. 20.43. Шаблон V8 Report Form Tom 2
К OHCTpyKTopiJilWe Ь3расширения(цля1вебгприложени й После открытия шаблона (указания имени создаваемой формы) опреде- ляем текст запроса (рис. 20.44). Текст запроса:___________________________________ ВЫБРАТЬ Номенклатура КАК. Номенклатура, ПРЕДСТАВЛЕНИЕ(Номенклагура)КАК Товар. Склад КАК Склад. ПРЕДСТАВЛЕНИЕ(Склад) КАК Местонахождение. КоличествоОстаток КАК Остаток ИЗ РегистрНакопления.УчетНоменклагурькОсгэгки ИТОГИ СиММА(Осгаток) ПО Склад Рис. 20.44. Пример запроса Следует отметить, что получаемая отчетная форма будет обладать функци- ональностью, похожей на функциональность выходной формы, созданной с использованием возможностей построителя отчета. Исходя из этого, в тексте запроса в обязательном порядке должен быть определен раздел ИТОГИ. Кроме этого, важно в текст запроса включать поля представлений ссылочных полей, которые потом потребуется показывать в отчете. Если этого не сделать, то в выходной форме будут отображаться уникальные идентификаторы ссылок на объекты (что, скорее всего, огорчит пользователя). На следующем шаге необходимо предварительно нажать кнопку Заполнить (рис. 20.45). При определении полей запроса поля представлений автоматически (по нажатии кнопки Заполнить) не заполняются. Их необходимо настроить (добавить) вручную. При этом форма конструктора должна выгля- деть так же, как представленная на рисунке выше. Настройку списка выбранных полей не изменяем (не нужно вносить в этот список поля представлений, добавляемых в список полей запроса).
ТЁГ Поля запроса: || Назад 11| Вперед | Ц==Готобо==| || Отмена | Рис. 20.45. Окно конструктора формы отчета Следующим шагом может быть определение группировок строк и колонок. В нашем случае оставим все без изменений (рис. 20.46). Группировки строк_____________________________Группировки колонок: Поле Типпмппиюеки 1 II Л* 1 Поле 1 Типгочппиооеки 1 II Д°* 1 Скгид Элементы || Вверх! — — II Bl*° 1 II Вина | Рис. 20.46. Определение группировок строк и колонок На следующем шаге необходимо указать ряд настроек, важных с точки зрения размещения данных в отчетной форме (рис. 20.47). Рис. 20.47. Установка группировок Далее потребуется указать режим отображения отчета, определить коли- чество строк, отображаемых на странице. Не рекомендуется делать данную
величину очень большой, т. к. это затрудняет как получение данных, так и их просмотр (рис. 20.48). Рис. 20.48. Настройка вывода отчета На последней странице конструктора отмечается необходимость размещения дополнительных закладок, существенно расширяющих функциональность создаваемого веб-отчета. Можно сказать, что данные закладки реализуют такую же функциональность, как и табличные части построителя отчета в «1С:Предприятии 8». Назначение каждой закладки совпадает с одноименными табличными частями объекта «1С:Предприятия 8» построительОтчета (рис. 20.49). Конструктор формы отчета V8 -Закладки на форме * Р Выбранные поля Р отборы Р Группировки Р Порядок Рис. 20.49. Выбор состава закладок После последовательного выполнения всех указанных шагов будет создана необходимая веб-форма. Рассмотрим полученную веб-форму более подробно. Основу механизма веб-отчетов составляет элемент управления V8ReportSource. Элемент управления содержит свойства, аналогичные свойствам построителя отчета «ЮПредприятия 8»: Order - порядок; Filter - управление отбором; ColumnGroup - измерения колонок; RowGroup - измерения строк; SelectedFields - выбранные поля. Эти свойства могут быть интерактивно настроены пользователем, для чего в форме на каждое свойство определено по элементу управления V8EditGrid (аналог табличного поля «ЮПредприятия»). Профессиональная разработка в системе «1С:Предприятие 8»
Для отображения результата запроса служит объект V8ReportViewer. Связанный с ним элемент управления VBCommandPanel позволяет осущест- влять навигацию по полученному результату запроса (напоминаем, что в общем случае данные отображаются по указанному количеству строк). Состав и взаимосвязь элементов управления, расположенных на форме, можно схематически представить следующим образом (рис. 20.50). Рис. 20.50. Взаимосвязь объектов формы Элемент управления VBReportSource решает несколько задач: анализ текста запроса и выдача доступных полей для настроек пара- метров отчета, взаимодействие с кешем отчета, разбиение результата отчета на группы и страницы. Можно сказать, что этот элемент управления является своего рода сервисной оболочкой, которая избавляет разработчика от работы с дета- лями реализации механизма веб-отчетов. Однако при желании можно отказаться от использования данного объекта и воспроизвести его функ- циональность, работая с его составляющими. Дело в том, что объект VBReportSource для своей работы использует несколько других объектов и механизмов. Основными из них являются: V8ReportBuilder - используется для получения данных; V8ReportData - обработка полученных данных; механизм кеширования результата отчета; V8ReportFormatter - производит форматирование данных. В упрощенном виде взаимодействие перечисленных объектов можно представить следующей схемой (рис. 20.51). Том 2
Коротко схему можно пояснить следующим образом. Элемент управ- ления V8ReportSource создает объект V8ReportBuilder и передает ему все параметры и настройки, указанные пользователем (внесенные в соответствующие элементы управления V8EditGrid). В соответствии с этими параметрами (и текстом запроса отчета) объект V8ReportBuilder извлекает данные из информационной базы «ЮПредприятия 8» и возвращает их в виде объекта V8ReportData. Эти данные помеща- ются в кеш отчета, основанный на стандартном механизме кеширования ASP.NET. Из кеша данные извлекаются по мере необходимости, офор- мляются с помощью объекта V8ReportFormatter и передаются элементу управления V8ReportViewer. Использование расшифровок В ряде случаев при работе с полученными отчетными данными может потребоваться получение дополнительных (связанных с отображае- мыми) данных. К примеру, при просмотре остатков товаров нужно открыть форму элемента справочника. Может потребоваться из одного отчета перейти в другой. Например, работая с оборотно-сальдовой ведо- мостью, в которой каждая строка содержит данные об остатках по счету, приходу и расходу, по щелчку в строке желательно перейти в отчет, показывающий более детальную информацию по данному счету. Механизм получения таких дополнительных данных можно реализовать с помощью расшифровок. Расшифровки можно разделить на два типа: простые - когда необходимо получить форму объекта по представля- емой ссылке; сложные — когда из одного отчета необходимо перейти в другой отчет (с передачей нужных параметров). Оба варианта реализуются с помощью свойств Details и FieldFormat объекта V8ReportSource. Какой вариант используется - зависит от способа запол- нения этих свойств. Рассмотрим их реализацию подробнее. Считаем, что настраиваем расшиф- ровки у отчета, который создавался в предыдущем разделе.
Простые расшифровки Добьемся того, чтобы после формирования отчета из него можно было открыть форму элемента как справочника Номенклатура, так и справоч- ника Склады. Начать настройку расшифровок рекомендуется с настройки свойства Details объекта V8ReportSource. Необходимо создать новый элемент коллекции и настроить его так, как показано на рис. 20.52. Рис. 20.52. Коллекция элементов свойства Details Коллекцию DetailsParameters настраивать (для простых расшифровок) нет необходимости. В свойстве KeyFieldForElement выбирается поле (из полей отчета), содержащее ссылку объекта, форму элемента которого будем получать. В свойстве Name указываем имя расшифровки (его будем использовать при работе со свойством FieldFormat). С помощью свойства URLTarget определяем вариант получения формы элемента. После настройки свойства Details переходим к определению свойства FieldFormat. Заполнение этого свойства приведет к тому, что данные, выводимые в указанном поле, будут представлены в виде гиперссылки. Это свойство необходимо заполнить, как показано на рис. 20.53. В свойстве Details устанавливаем флажок использования расшифровки. В следующем поле из списка (предварительно должно быть определено свойство Details объекта V8ReportSource) выбираем нужную расшифровку. Для какого поля эта расшифровка, определяется полем Name. Расшифровка (была показана настройка расшифровки по номенклатуре) готова, осталось только откомпилировать приложение.
Номенклатура Properties: В Misc Backgroundcolor | Е Border BorderBottom sna BorderLeft BorderRight Е BorderTop DateFormat Detais True DetaisName Товар Е Font Height NumberFormat Номенклатура ▼ Textcolor Zl Width Рис. 20.53. Коллекция элементов свойства Field Format Сложные расшифровки Механизм сложных расшифровок позволяет настроить взаимосвязь сущес- твующих в веб-приложении отчетов. С его помощью можно значительно увеличить гибкость системы отчетности, используемой в приложении. Рассмотрим пример реализации связи отчета по остаткам товара с отчетом (его необходимо будет создать), показывающим движения выбранного товара понедельно. При создании нового отчета используется следующий запрос (листинг 20.25). Листинг 20.25. Запрос, используемый для создания отчета о движениях товара ВЫБРАТЬ Период, Номенклатура, Представление(Номенклатура) Как Товар, КоличествоПриход Как Поступление, КоличествоРасход Как Продажа ИЗ РегистрНакопления.УчетНоменклатуры.Обороты(,, Неделя) Так же как и для простых расшифровок, определение сложных произ- водится с помощью свойств Details и FieldFormat объекта V8ReportSource. Начнем с настройки свойства Details (рис. 20.54). В созданном элементе коллекции определяется его имя (оно будет исполь- зовано при определении свойства FieldFormat). С помощью свойства URL указывается путь к форме открываемого отчета. Для указания связи параметров вызывающего отчета с параметрами вызы- ваемого используется свойство DetailsParametrs. Его настройка показана на рис. 20.55. Профессиональная разработка в системе «1С:Предприятие 8»
VSReporlSoui c eDetai Is Collection Editor Товар Properties: В Misc DetafcParameters (Cdectton) KeyFfeldForElementForm Name Товар URL nomenoboroLaspM URLTarget Рис. 20.54. Коллекция Details Рис. 20.55. Коллекция DetailsParameters Выбирается вариант сравнения Equal (равенство), определяется имя пара- метра отчета, значение выбирается из выпадающего списка. Для того чтобы механизм заработал, остается настроить свойство FieldFormat (рис. 20.56). Рис. 20.56. Коллекция FieldFormat Том 2
К OHCTpyKTopiJilWe ЬЗрасширенияУдля1вебгприложени й В свойстве Details устанавливаем флажок использования расшифровки. В следующем поле из списка (предварительно должно быть определено свойство Details объекта VSReportSource) выбираем нужную расшифровку. Для какого поля эта расшифровка, определяется полем Name. Особенности реализации расшифровок Рассмотрим действие механизма расшифровок. Рассматривать будем на примере сложных расшифровок, определяемых в предыдущем разделе (реализация этого механизма как для простых, так и для сложных расшиф- ровок строится по одному принципу). Сформируем отчет по остаткам номенклатуры (рис. 20.57). | Отчет | Поля | Отбор | Группировки | Порядок |__________ | Сформировать | |Й) В|1 ](1) Перейти [►) (м) | Печать Склад Номенклатура Остаток Стиральные машины 32 Стиральные машины Ardo TL 1000 ЕХ-1 14 Стиральные машины Indesit WS 105 ТХ 18 Холодильники 29 Холодильники ELECTROLUX ER 9007 В 15 Холодильники Атлант МХМ 1704-00 14 Рис. 20.57. Пример отчета по остаткам номенклатуры Товар в данном отчете отражается в виде гиперссылок. С точки зрения исходного HTML-кода каждая ячейка таблицы (в которой отражается номенклатурная позиция) имеет следующую реализацию (листинг 20.26). Листинг 20.26. Фрагмент HTML-кода <td class-'Cell Detail ЯРНоменклатура ЯРНоменклатура"> <div class="pointer" onclick=''doDetailsClick(ReportViewer', 'Товар', '5', ")”> Атлант МХМ 1704-00 </div> </td> При щелчке мышью по такой ячейке вызывается функция JavaScript doDetailsClick, определенная в js файле. Подключение этого файла опреде- ляется следующей строкой HTML-кода (листинг 20.27). Листинг 20.27. Фрагмент HTML-кода <script language-javascript1 src='/aspnet_client/1CV8/V8ReportViewer.js'> </script> Сама функция имеет следующий вид (листинг 20.28).
Листинг 20.26. Функция doDetailsClick function doDetailsClick(wclD, name, rowGroup, columnGroup) { if (rowGroup == null || columnGroup == null || name == null) return; _doPostBack(wclD, "Details;" + name +”;" + rowGroup +";” + columnGroup); } В указанной функции производится проверка заполненности необхо- димых параметров вызова и производится вызов функции_____doPostBack, определенной в HTML-коде страницы (листинг 20.29). Листинг 20.29. Фрагмент HTML-кода «script language-’javascript" > <!- function _doPostBack(eventTarget, eventArgument) { var theform; if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) { theform = documentforms["Formr]; } else { theform = document.Form1; } theform._EVENTTARGET.value = eventTarget.split(,,$").join(":"); theform._EVENTARGUMENT.value = eventArgument; theform.submit(); } //-> </script> Данная процедура на основании полученных через параметры данных программно генерирует запрос к серверу (для сервера формируется событие Details, которое им в дальнейшем и обрабатывается). V 8 Chart Form Табличные данные отчета могут быть представлены графически, с помощью диаграмм. Для этого Web-расширение предоставляет возмож- ность создания веб-диаграмм, использующих в качестве своей основы механизм веб-отчетов. Шаблон V8 Chart Form как раз и предназначен для создания веб-форм, показывающих данные в виде диаграммы. Последовательность выполня- емых шагов при создании веб-диаграммы идентична последовательности (и особенностям заполнения) по созданию формы на основании шаблона V8 Report Form. Поэтому она в данном случае специально не рассматри- вается.
Единственной особенностью (кроме того факта, что выбирается другой шаблон) является необходимость выбора вида диаграммы на одном из этапов создания формы (рис. 20.58). Назад I Вперед I Готово I Отмена Рис. 20.58. Выбор вида диаграммы Основа механизма веб-диаграмм - элемент управления VSChartSource. Свойства, управляющие настройкой запроса, аналогичны свойс- твам V8ReportSource и табличным частям объекта ПостроительОтчета «1С:Предприятие 8»: Order - порядок; Filter - управление отбором; ColumnGroup - измерения колонок; RowGroup - измерения строк; SelectedFields - выбранные поля. Эти свойства могут быть интерактивно настроены пользователем в форме, для чего в ней располагается соответствующее количество (на каждое свойство по одному) элементов управления V8EditGrid. Для отображения полученных данных служит элемент управления V8ChartViewer и связанный с ним элемент управления V8CommandPanel (позволяющий в том числе выбирать вид диаграммы). Взаимосвязь элементов управления, расположенных в форме веб-диа- граммы, представлена на следующей схеме (рис. 20.59). Профессиональная разработка в системе «1С:Предприятие 8»
I SetectedFeHs~| VSChartSoutce | ColumnGtoups | | RowGtoups | | Onto | | Hta | Рис. 20.59. Схема взаимодействия объектов формы Элемент управления V8ChartSource решает задачи, связанные с построе- нием данных отчета: анализ текста запроса и выдача доступных полей для настроек пара- метров отчета (эта функциональность реализована в базовом элементе V8ReportBuilder); формирование и кеширование изображения диаграммы. Так же как и объект V8ReportSource, объект V8ChartSource для своей работы использует ряд других объектов. В упрощенном виде их схема взаимодействия выглядит следующим образом (рис. 20.60). Рис. 20.60. Схема взаимодействия объектов При создании диаграммы элементу управления V8ChartSource устанавли- вается: текст запроса, описание взаимосвязей полей запроса, отображаемый ресурс, серии - группировки строк, точки - группировки колонок, настройка упорядочивания и отбор, тип диаграммы, Том 2
графический формат диаграммы, размер изображения. Элемент управления V8ChartSource, используя механизм отчетов, полу- чает результаты выполнения запроса в объекте VSReportData. С помощью объекта V8ChartFormatter, с учетом настроек оформления диаграммы, эти данные преобразуются в описание диаграммы. Это описание пере- дается объекту V8ChartImageCreator, который формирует изображение диаграммы. Сформированное изображение помещается в кеш диаграммы, основанный на стандартном механизме кеширования ASP.NET. Для отображения диаграммы элемент управления V8ChartViewer размещает на веб-странице ссылку на форму по умолчанию для вывода изображений, которая извлекает изображение диаграммы из кеша по идентификатору, полученному от V8ChartSource. Кроме этого, объект V8ChartImageCreator формирует карту областей изображений (ImgMap), которая служит для поддержки механизма расшифровок и подсказок. Каждая область соот- ветствует определенному элементу изображения (например, подписи или сектору круговой диаграммы), к которому могут быть привязаны опреде- ленные параметры расшифровки и подсказка. Расшифровки диаграммы определяются точно таким же образом, как и для отчета. ДОСТУП К ДАННЫМ ЧЕРЕЗ ADO.NET С помощью ADO.NET компонента можно организовывать различную обработку данных: получение, изменение, удаление данных из информа- ционной базы данных «1С:Предприятие 8». Рассмотрим эти возможности на ряде простых примеров. Необходимо помнить, что рассматриваемые объекты (посредством которых будет организовываться доступ и модификация данных) в основном явля- ются специфическими для Web-расширения (определены в пространстве имен _1C.V8.Data). Также следует отметить, что приводимые ниже примеры (после соот- ветствующей корректировки) позволят адаптировать уже готовые веб- формы (созданные без использования Web-расширения) к работе с информационной базой «1С:Предприятия 8» (по этой причине ни в одном из примеров не задействован ни один серверный элемент управления из пространства имен _1C.V8.WebControls). 31SIISI
ЛлаваУ20ЯУУё1э?расширение] Получение данных Получить данные из информационной базы «1С:Предприятия 8» (из веб- формы) можно двумя способами (на самом деле это просто два варианта определения одного и того же объекта V8DbSelectCommand): по запросу, с указанием одной таблицы. Несмотря на наличие двух способов, общая схема (порядок использования объектов) получения данных для них одна и та же. Ее можно представить в следующем виде (рис. 20.61). Рис. 20.61. Алгоритм получения данных Для чтения в общем случае используются три объекта: V8DbConnection - предназначен для указания параметров подключения к базе данных и проведения этого подключения; V8DbSelectCommand - предназначен для указания параметров выборки и проведения выборки данных, получения объекта VSDataReader; VSDataReader - предназначен для получения данных и их обхода. Перейдем к рассмотрению реальных примеров. Получение данных запросом Поставим перед собой задачу: получить и отобразить в форме остатки номенклатуры. Предварительно необходимо создать новую веб-форму. При создании выбрать шаблон Web Form. В диалоге формы необходимо разместить элемент управления Table (он расположен в панели Toolbox, в группе Web Forms). Из этой же группы необходимо добавить в диалог элемент управления Button (кнопку).
В модуле формы необходимо добавить еще одно используемое пространство имен - _1C.V8.Data. Остается следующим образом определить обработчик нажатия кнопки (следует отметить, что переход к обработчику события кнопки можно осуществить по двойному щелчку по самой кнопке), листинг 20.30. Листинг 20.30. Обработчик события Click private void Button1_Click(object sender, System.EventArgs e) { V8DbConnection connection = new V8DbConnection(); connection.Database = "РНе=\"О:\\Конфигурации\\Т MnoBbieWDemoExchangeV';"; connection.User = "web"; connection.Password = "1234"; V8DbSelectCommand cmd = new V8DbSelectCommand(); cmd.CommandType = CommandType.Text; cmd.CommandText = ©"Выбрать Представление(Номенклатура) Как Наименование, КопичествоОстаток Как Остаток Из РегистрНакопления.УчетНоменклатуры.Остатки"; cmd.Connection = connection; TableRow row; TableCell cell; row = new TableRowf); cell = new TableCellf); cell.Text = "Номенклатура”; row.Cells.Add(call); cell = new TableCellf); cell.Text = "Количество"; row.Cells.Add(call); Tablei .Rows.Add(row); connection.Openf); try { using(V8DataReader reader = (V8DataReader)cmd.ExecuteReader()) { while (reader.Readf)) { string номенклатура = reader.GetString(O); decimal количество = reader.GetDecimalfl); row = new TableRowf); cell = new TableCellf); cell.Text = номенклатура; row.Cells.Addfcell); cell = new TableCellf); cell.Text = количество.ТоЗЬтпдО; row.Cells.Addfcell); Профессиональная разработка в системе «1С:Предприятие 8»
Tablei .Rows.Add(row); } } } finally { connection.Close(); } Page.Controls.Add(Table1); При создании подключения (V8DbConnection) помимо пути к базе данных указывается имя и пароль пользователя, в контексте которого необхо- димо обращаться к базе данных. В рассматриваемом случае эти данные указываются явно в коде формы (что не рекомендуется). Как это сделать по-другому, будет рассмотрено в следующем примере. При создании объекта V8DbSelectCommand указывается тип команды: CommandType.Text. В этом случае в свойство CommandText данного объекта можно записать текст запроса. При необходимости полу- чить данные с каким-либо отбором условие отбора определяется непосредственно в тексте запроса (параметр определяется с помощью символа &). При использовании параметров в условиях необходимо помнить: параметрам необходимо присваивать значения (<объект>.Рага- meters.Add(<ldMB>, <3начение>); типы данных «1С:Предприятия» и .Net могут различаться и требовать явного преобразования. У созданного объекта V8DbSelectCommand через свойство Connection устанавливается созданный объект V8DbConnection. Далее в коде производится работа с объектом Table. Отдельно созда- ется строка табличной части (row), отдельно ячейка (cell). Манипулируя данными объектами, определяется объект «Таблица». Сам процесс получения данных начинается с установления подключения (напомним, что одной из важных особенностей ADO.NET является отсутс- твие необходимости поддерживать постоянное подключение). В конструкции try (попытка) производится получение данных. Причем при создании объекта V8DataReader (при выполнении метода ExecuteReader()) используется конструкция using (по окончании блока кода все ресурсы будут гарантированно освобождены). Обход результата происходит в цикле. По окончании обхода соединение закрывается. С помощью рассмотренной модели можно одновременно получать данные из разных таблиц, но полученные таким образом данные нельзя модифицировать. Том 2
Доступ1к'даннй1мкчерез^АОО! N ETj Указание одной таблицы Поставим перед собой задачу: отображать данные документа Приходная накладная по введенному в форме номеру документа. Данный пример очень похож на предыдущий. Так же нужно создать новую веб-форму. В диалог формы необходимо поместить элемент управления TextBox (он расположен в панели Toolbox, в группе Web Forms). Из этой же группы необходимо добавить в диалог элемент управления Table (вывод данных будем производить именно в этот элемент управления) и Button (кнопка). В коде не забыть дописать использование пространства имен _1C.V8.Data. Обработчик события нажатия кнопки будет уже определен несколько по-иному (листинг 20.31). Листинг 20.31. Обработчик события Click private void Button1_Click(object sender, System.EventArgs e) { V8DbConnection connection = new V8DbConnection(); connection.Database="File=\,'D:\\Koнфиrypaции\\Tиnoвыe\\DemoExchange\,,;"; connection.User=Session["UserName’i.ToString(); connection.Password=Session["User₽assword'lToString(); V8DbSelectCommand cmd = new V8DbSelectCommand(); cmd.CommandType = CommandType.TableDirect; cmd.CommandText = "Документ.ПриходнаяНакладная"; cmd.Connection = connection; cmd.Fields = @”Номер, Пред ста вление(Контрагент), Состав.(Представление(Номенклатура), Количество)"; cmd.WhereClause = “Номер=&Номер"; cmd.Parameters.Add("HoMep'’, this.TextBox 1 .Text.ToString()); string номер; string контрагент; TableRow row; TableCell cell; row = new TableRowf); cell = new TableCellO; cell.Text = "Номер/Номенклатура”; row.Cells.Add(call); cell = new TableCellO; cell.Text = "Контрагент/Количество"; row.Cells.Add(call); Tablet .Rows.Add(row); ssy
ГлаваУ20У/УеЬЗрасширёние; connection.Openf); try { using(V8DataReader reader = (V8DataReader)cmd.ExecuteReader()) { while (reader.Read()) { номер = reader.GetString(O); контрагент = reader.GetString(l); row = new TableRowf); cell = new TableCellf); cell.Text = HOMep.ToStringO; row.Cells.Addfcell); cell = new TableCellf); cell.Text = контрагент; row.Cells.Add(cell); Tablei .Rows.Add(row); using(V8DataReader Товары = (V8DataReader)reader.GetData(2)) { while (Toeapbi.ReadO) { row = new TableRowf); cell = new TableCellf); cell.Text=ToBapbi.GetStringfO); row.Cells.Addfcell); cell = new TableCellf); cell.Text = ToBapbi.GetDecimal(l).ToStringf); row.Cells.Addfcell); Tablei .Rows.Add(row); } } } } } finally { connecdon.Closef); } Page.Controls.AddfTablel); } Рассмотрим отличия данного обработчика от приведенного ранее. При создании подключения имя пользователя и его пароль не пропи- сываются явно, а выбираются из параметров пользовательской сессии (объект Session[<klMH параметра?-]). За запись этих значений несет ответс- твенность сама система, но при желании подобную возможность можно использовать и в своих целях (более подробно это рассмотрено в разделе «Полезные средства .NET Framework» на стр. 567).
У объекта V8DbSelectCommand определен тип команды: CommandTy- pe.TableDirect. Исходя из этого, состав полей для выборки определен в свойстве Fields (указываются как реквизиты шапки документа, так и реквизиты вложенных таблиц). При необходимости наложить какой-либо отбор на данные, получаемые из таблицы, можно использовать свойство WhereClause (аналог раздела ГДЕ языка запросов «1С:Предприятия»), Значение параметра берется из элемента управления TextBox, разме- щенного в диалоге. Следует обращать внимание на типы полей. В нашем случае документ Приходная накладная имеет строковый номер. При попытке передать числовое значение ошибки бы не происходило, но к нужному результату (успешному нахождению документа) это не приводило бы. Последней особенностью является открытие подчиненной выборки для обхода данных табличной части документа. Добавление данных Поставим перед собой задачу - реализовать возможность добавления нового элемента в справочник Номенклатура. При добавлении данных работа ведется со следующими объектами: V8DbConnection - предназначен для указания параметров подключения к базе данных и проведения этого подключения; V8DbInsertCommand — предназначен для указания добавляемых данных и проведения самой операции добавления. Перейдем к рассмотрению примера. Необходимо создать новую веб-форму (используя при этом шаблон Web Form). В диалоге формы нужно разместить три элемента управления TextBox (для кода, наименования и закупочной цены номенклатуры). Также следует добавить в диалог кнопку (Button). При открытии формы необходимо заполнить текстовые поля и нажать определенную кнопку. После добавления данные в текстовых полях должны очиститься. В код формы нужно включить возможность использования пространства имен _1C.V8.Data. Для кнопки определим следующий обработчик события (листинг 20.32). Листинг 20.32. Обработчик события Click private void Button1_Click(object sender, System.EventArgs e) { V8DbConnection connection = new V8DbConnection(); connection.Database = "РНе=\''О:\\Конфигурации\\Типовые\\ОетоЕхсЬапде\";"; connection.User = Session[,,UserNamen].ToString(); connection.Password = Session["UserPassword"].ToString(); Профессиональная разработка в системе «1С:Предприятие 8»
V8DblnsertCommand updCmd = new V8DblnsertCommand(); updCmd.CommandType = CommandType.TableDirect; updCmd.CommandText = "Справочник.Номенклатура"; updCmd.Connection = connection; updCmd.Parameters.AddC'Kofl'', this.TextBoxI .Text.ToString()); updCmd.Рагате(егз.АЬЬ(''Наименование", this.TextBox2.TextToString()); updCmd.Рагате1егз.АЬЬ("ЗакупочнаяЦена", Convert.ToDecimal(this.TextBox3.Text.ToString())); connection.Openf); try { updCmd. ExecuteNonQueryf); } finally { connecdon.Closefl; } // Очищаем элементы управления. this.TextBoxI.Text = this.TextBox2.Text = this.TextBox3.Text = При создании объекта V8DbInsertCom mand в качестве типа команды можно использовать только CommandType.TableDirect. В свойство Text записыва- ется имя таблицы. Добавляемые данные должны соответствовать полям таблицы и определяются как параметры. После установки подключения производится выполнение метода ExecuteNonQuery() (метод ничего не возвращает). При успешном выпол- нении данные будут добавлены в базу данных «1С:Предприятия 8». Обратите внимание, что при обращении к элементу управления TextBox получаем значение типа Строка. Для его преобразования к числу (для закупочной цены) используется объект Convert. В самом конце функции в текст полей ввода записываются пустые строки. Обратите внимание, что в данной реализации полностью отсутствует реализация «защиты от дурака» (попытка добавить объект повторно, попытка добавить объект с незаполненными полями). В реальной жизни подобные проверки крайне желательно реализовывать. Изменение данных Поставим перед собой очередную задачу: необходимо «исправить» движения документа Приходная накладная (по указанному номеру доку- мента) по регистру накопления Учет номенклатуры. «Исправление» будет заключаться в том, что в ресурс «Количество» будет записываться значение единицы (независимо от реального наполнения документа). Том 2
Щ осту п1к#дан hGi мкнерезТДЬ(Э1 N ETj Для изменения данных (а речь идет именно об изменении существующих данных) используются следующие объекты: V8DbConnection - предназначен для указания параметров подключения к базе данных и проведения этого подключения; V8DbSelectCommand - предназначен для указания параметров выборки и проведения выборки данных, получения объекта V8Data Reader; V8DataReader - предназначен для получения данных и их обхода; V8DbUpdateCommand - предназначен для выполнения обновления данных. Схематично порядок работы при изменении данных можно показать следующим образом (рис. 20.62). Рис. 20.62. Алгоритм изменения данных Как и в предыдущих примерах, определим веб-форму. В диалоге разместим элемент управления TextBox (для ввода номера документа), кнопку (для запуска процесса изменения). Определим возможность использо- вания пространства имен _1 C.V8.Data. Обработчик нажатия кнопки имеет следующий вид (листинг 20.33). Листинг 20.33. Обработчик события Click private void Button1_Click(object sender, System.EventArgs e) { V8DbConnection connection = new V8DbConnection(); соппей1оп.Оа1аЬа8е=Т11е=\"О:\\Конфигурации\\Типовые\\ОетоЕхс11апде\";"; connection.User = "web"; connection.Password = ”1234"; DataTable table = new DataTableQ; table.Columns.Add(,'nepMOfl,',typeo1i(object));
ГлаваЛ20ЛУУеЬЗрасшир~ение; table.Columns.Add("HoMeHKnaTypa", typeof(object)); table.Columns.Addf'CKnafl", typeoffobject)); 1аЫе.Со1итпз.АЬЬ("Количество", typeoffdecimal)); V8DbSelectCommand cmd = new V8DbSelectCommand(); cmd.CommandType = CommandType.TableDirect; cmd.CommandText = "РегистрНакопления.УчетНоменклатуры”; cmd.Connection = connection; cmd.Fields = ©"Регистратор, Период, Номенклатура, Склад, Количество"; cmd.WhereClause = "Регистратор.Номер=&Номер"; cmd.Parameters.Add("HoMep", this.TextBoxI .Text.ToString()); ObjectRef регистратор = null; connection.Open(); try { using(V8DataReader reader = (V8DataReader)cmd.ExecuteReader()) { while (reader.Read()) { регистратор = (ObjectRef)reader.GetValue(O); DataRow row = table.NewRowfl; пм["Период"] = reader. GetValue(1); пм["Номенклатура"] = reader.GetValue(2); пм["Склад"] = reader.GetValue(3); row["KooH4ecTBo"] = 1; table.Rows.Add(row); } } } finally { connection.CloseO; ) V8DbUpdateCommand updCmd = new V8DbUpdateCommand(); updCmd.CommandType = CommandType.TableDirect; updCmd.CommandText = "РегистрНакопления.УчетНоменклатуры"; updCmd.Connection = connection; updCmd.Parameters.Add(,,PerncTpaTop", регистратор); updCmd.Parameters.Add("DataSet", table); connection.Open(); try { updCmd.ExecuteNonQueryf); } finally { connection.CloseO; } }
После создания объекта V8DbConnection производится определение и создание объекта DataTable. Дело в том, что изменения, которые по условию задачи необходимо провести, связаны с обработкой табличных данных (записей регистра накопления). В объекте DataTable будем накап- ливать набор записей, который в дальнейшем будет записан в базу данных «1С:Предприятия 8». Структура этого объекта совпадает с составом полей таблицы регистра накопления УчетНоменклатуры. Не считая работу с объектом DataTable, первая часть обработчика очень похожа на пример с получением данных. Это и понятно: данные, перед тем как будут изменены, должны быть прочитаны. После того как будущий набор записей сформирован, создается объект V8DbUpdateCommand (возможен только тип команды CommandType. TableDirect). При настройке параметров для набора записей регистра накопления (и ряда других регистров) необходимо обязательно указывать регистратор. Опять же для регистров добавляемый набор записей должен записываться в параметр с предопределенным именем DataSet. С помощью вызова метода ExecuteNonQuery() соответствующей команды выполняется изменение данных. Удаление данных В рассматриваемом примере будем удалять элементы справочника Номен- клатура по введенному в текстовое поле коду. Функция, отвечающая за удаление элемента справочника, имеет следу- ющий вид (листинг 20.34). Листинг 20.34. Обработчик события Click private void Buttonl_Click(object sender, System.EventArgs e) V8DbConnection connection = new V8DbConnection(); соппес11оп.Оа1аЬа8е="Р11е=\”О:\\Конфигурации\\Типовые\\ОетоЕхсЬапде\";"; connection.User = "web"; connection.Password = ”1234"; ObjectRef refer; V8DbSelectCommand cmd = new V8DbSelectCommand(); cmd.CommandType = CommandType.TableDirect; cmd.CommandText = "Справочник.Номенклатура"; cmd.Connection = connection; cmd.Fields = "Ссылка"; cmd.WhereClause = "Код=&Код"; cmd.Parameters.Addf'Kofl", this.TextBoxI .Text); connection.OpenQ; Г refer = (ObjectRef)cmd.ExecuteScalar(); Профессиональная разработка в системе «1С:Предприятие 8»
V8DbDeleteCommand delCmd = new V8DbDeleteCommand(); delCmd.Connection = connection; delCmd.CommandType = CommandType.TableDirect; delCmd.CommandText = "Справочник.Номенклатура"; delCmd.Parameters.Add("CcbinKa", refer); connection.Openf); try { delCmd.ExecuteNonQuery(); } finally { connecdon.Close(); } ,} После определения параметров подключения производится получение данных. Важно при операции чтения (в рассматриваемом случае) полу- чить ссылку на удаляемый объект. Так как ожидается получение одного значения, оно получается выполнением метода ExecuteScalar(). После получения ссылки создается и настраивается объект V8DbDeleteCommand. Удаление производится при вызове метода ExecuteNonQuery(). Следует отметить, что если объект, попытка удаления которого произво- дится, заблокирован, то выполнение метода приведет к ошибке. WEB-СЕРВИСЫ Отличие Web-сервиса от веб-приложения заключается в том, что веб-при- ложение предназначено для организации пользовательского интерфейса с использованием веб-браузера, в то время как Web-сервис предна- значен для организации программного доступа со стороны произвольных программных систем. С помощью веб-сервиса можно организовать доступ к механизмам «1С:Предприятия», отсутствующим в других частях распределенной системы. С точки зрения использования Web-сервис представляет собой некоторое множество методов, обращение к которым может быть организовано из любой программной системы, выступающей в качестве клиента Web- сервиса. В принципе создать на основе ASP.NET Web-сервис, осуществляющий доступ к информационной базе «1С:Предприятия 8», не слишком сложно. Но средства, предоставляемые Web-расширением, еще более упрощают эту задачу. Познакомимся с данной возможностью на примере создания Web-cep- виса, который возвращает сумму в рублях прописью, а также возвращает курс валюты по переданному коду валюты.
LWeblcepBHcGi Для начала создадим новый проект. При этом в качестве шаблона будем использовать V8 Web Service (рис. 20.63). Protect Types: Templates: г-Q Visual C* Projects Й'О Visual C++ Projects • Q Setup and Deployment Projects Й 'СЗ Other Projects 'СЗ Visual Studo Solutions ГП-sI VBWeb Application [pl @ Windows Smart Device Control Lbrary Appkation al A project for creating a V8 Web service Name: | MyService Location: | http;//tocai->ost/My5ervice v] Browse... [ Project wl be created at http://locahost/MyService. OK | Caned | Hdp Рис. 20.63. Шаблон V8 Web Service Web-сервис будет создан в виртуальном каталоге MyService. После нажатия кнопки ОК автоматически стартует утилита загрузки мета- данных (рис. 20.64). Информационные базы Курс 5-6 декабря Медкшнские челцгм Обменданнымн Демонстрационный пример #1 Основные объекты Приемник а а |Я1е"Т:\Конфигурации\ТиповыеЧ)етоЕясЬапде"; Имя |web Парогь |"“ Каталог ICMnetpiiKn^ooiWBWebBookMxi J Псевдоним ИБ | Создать I Выход Рис. 20.64. Утилита импорта метаданных Необходимо указать конфигурацию, которая будет использоваться сервисом, и параметры доступа (имя пользователя конфигурации и его пароль). В результате работы конструктора по выбранному шаблону будет создан ряд файлов (просмотреть их можно, используя Solution Explorer). Файл, содержащий методы сервиса, имеет имя Servicel .asmx. Исходный программный текст этого файла приводится ниже (листинг 20.35).
Глава>20лУУеЬ7расширениё Листинг 20.35. Пример файла Servicel .asmx using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Web; using System.Web.Services; using _1C.V8.Data; namespace MyService { III <summary> /// Summary description for Servicel. /// </summary> public class Servicel: System.Web.Services.WebService { public Servicel () { // CODEGEN: This cell is required by the //ASP.NET Web Services Designer. Initial izeComponentf); //region Component Designer generated code // Required by the Web Services Designer, private IContainer components = null; /// <summary> III Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void lnitializeComponent() /// <summary> /// Clean up any resources being used. Ill </summary> protected override void Dispose( bool disposing) { iffdisposing && components != null) { components.Disposef); base.Dispose(disposing); #endregion [WebMethod] public string RubleslnWords(decimal sum) { using (V8DbConnection conn = new V8DbConnection(System. Configuration. Configurationsettings. AppSettings[V8Consts.Database], System. Configuration. Configurationsettings. AppSettings[V8Consts.UserName],
System. Configuration. Configurationsettings. AppSettings[V8Consts.UserPassword])) conn.OpenQ; string ret = (string)V8.Call( conn, conn.Connection, "ЧислоПрописью”, new objectn {sum, "L = ru_RU", @"рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2"}); return ret; Метод RublesInWords() получает в качестве параметра число. Далее с помощью обращения к методу ЧислоПрописью() глобального контекста «1С:Предприягия 8» получает представление этого числа как суммы прописью в рублях на русском языке. Внутри самого метода первоначально производится установка соеди- нения с базой данных. Вызов метода глобального контекста производится методом Са11(). Параметры метода ЧислоПрописью() передаются массивом, который создается и инициализируется прямо в методе Са11(). Добавим в код реализацию метода, который будет по переданному коду (в соответствии со стандартным классификатором) возвращать курс валюты. Код метода приводится ниже (листинг 20.36). Листинг 20.36. Метод GetKurs() public string GetKursfint code) using (V8DbConnection conn = new V8DbConnection( System. Configuration. Configurationsettings. AppSettings[V8Consts.Database], System. Configuration. Configurationsettings. AppSettings[V8Consts.UserName], System. Configuration. Configurationsettings. AppSettings[V8Consts.UserPassword])) conn.OpenQ; string ret = (string)V8.Call( conn, conn.Connection, "ПолучитьКурс", code); return ret; Профессиональная разработка в системе «1С:Предприятие 8»
Следует отметить, что функциональность метода основана на функции ПолучитьКурс(), определенной в модуле внешнего соединения информационной базы «1С:Предприятие 8» (листинг 20.37). Листинг 20.37. Функция «ПолучитьКурс()» Функция ПолучитьКурс(КодВвлюты) Экспорт Валюта = Справочники.Валюты.НайтиПоКоду(КодВалюты); Отбор = Новый Структура("Ввлюта", Валюта); Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(, Отбор); Возврат(Запись.Курс); КонецФункции Перед тем как приступить к компиляции, рекомендуется определить пространство имен сервиса (листинг 20.38). Листинг 20.36. Определение пространства имен [WebServicefNamespace = ''http://name.name/WWWService/")] public class Servicel: System.Web.Services.WebService Обращение к Web-сервису из веб-формы Для того чтобы получить возможность работать с Web-сервисом из созда- ваемого веб-приложения, необходимо первоначально добавить ссылку на данный сервис. Для этой цели нужно выполнить команду главного меню Project-Add Web Reference (рис. 20.65). Add Reference... Add Wd) Reference... Set л* 4nrh In Prniftri- Рис. 20.65. Команда Add Web Reference В открывшемся после этого окне указать путь к файлу сервиса (в данном случае указывается путь к сервису, существующему на локальной машине). Далее следует нажать кнопку Go. Результат выполнения операции будет выведен в ту же форму (рис. 20.66). Navigate to a web service URL (asmx or wsd) and dck Add Reference to add al the avateNe services found at that URL, ©в«к О | О g| ffi т. -----------3 за Servicel The following operations are supported. For a formal definition, please review the Service Description. Web services found at this URL: 1 Service Fowd: | WebReference Add Reference Рис. 20.66 Добавление веб-ссылки
LWeblcepBHcGi В поле ввода Web Reference Name можно определить произвольное имя добавляемой веб-ссылки. Для обращения метода к сервису можно использовать код, подобный приведенному (листинг 20.39). Листинг 20.39. Пример обращения к Web-сервису private void Button1_Click(object sender, System.EventArgs e) { WebReference.WWWService ms = new WebReference.WWWServiceO; this.Labell .Text = ms.GetKurs(l); } ВЫЗОВ ПРОЦЕДУР, ФУНКЦИЙ. ПРЕОБРАЗОВАНИЕ ТИПОВ При создании (адаптации) веб-приложений и Web-сервисов может возник- нуть необходимость в использовании ряда ресурсов «1С:Предприятия 8»: работать с глобальными переменными (определенными в модуле внешнего соединения с использованием ключевого слова Экспорт); осуществлять вызов процедур, функций, определенных с использова- нием ключевого слова Экспорт как в модуле внешнего соединения, так и в общих модулях (с установленным флажком Внешнее соединение). Следует помнить, что очень часто при использовании указанных ресурсов будет возникать необходимость в конвертации данных из типов .NET в типы «1С:Предприятия 8» и наоборот. Для осуществления преобразо- вания можно использовать два метода (у каждого из них есть нестолько вариантов вызова): ConvertValueNetToV8 - преобразование типов .NET в типы «1С:Предприятия 8»; ConvertValueV8ToNet - преобразование типов «1С:Предприятия 8» в типы .NET. Предположим, что модуль внешнего соединения «1С:Предприятия» выглядит следующим образом (листинг 20.40). Листинг 20.40. Пример модуля внешнего соединения Перем глПользователь Экспорт; Функция ПолучитьДанныеДляДок(Номенклатура, Цена) Экспорт Запрос = Новый Запрос; Запрос.Текст =" |ВЫБРАТЬ | ЦеныНоменклатуры.Цена |ИЗ
___________________________________________________1 Регистре ведений.ЦеныНоменклатуры( Номенклатура = &Номен И ТипЦен = &ТипЦен) КАК ЦеныНоменклатуры"; Залрос.УстановитьПараметрС'Номен", Номенклатура); Запрос.УстановитьПараметр("ТипЦен", Справочники.ТипыЦен.НайтиПоКоду(1)); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Цена = Выборка.Цена; Возврат(Истина); Иначе Цена = 0; Возврат(Ложь); КонецЕсли; КонецФункции Функция ВозвращаемСтроку() Экспорт Возврат("Строка возврата"); КонецФункции глПользователь = "Некоторая переменная"; Рассмотрим примеры обращения к переменным, функциям, объявленным в представленном модуле внешнего соединения. Начнем с напоминания о том, что для обращения к базе данных необхо- димо произвести подключение к ней. Это можно сделать, создав объект V8DbConnection (листинг 20.41). Листинг 20.41. Подключение к информационной базе «ЮЛредприятия» V8DbConnection connection = new V8DbConnection(); connection.Database = "File=V,D:\\Koнфиrypaции\\Tиnoвыe\\DemoExchange\,,;"; connection.User = Session["UserName"].ToString(); connection.Password = Session["UserPassword"].ToString(); // Осуществление подключения. connection.OpenQ; Если в веб-форме определен какой-либо источник (специфический для Web-расширения, например), то подключение может выглядеть следу- ющим образом (листинг 20.42). Листинг 20.42. Установление соединения с информационной базой «ЮЛредприятия» protected V8ListDataSource ListDataSource; // Код формы. connection = ListDataSource.Connection; // Осуществление подключения. connection.OpenQ;
Следует отметить, что при знакомстве (через встроенную подсказку) с какими-либо методами нужно внимательно смотреть на тип исполь- зуемого объекта connection. В качестве параметров может указываться connection с типом V8DbConnection и connection с типом ComObject. Можно сказать, что объект V8DbConnection определяет параметры подключения (и производит открытие подключения). У данного объекта существует свойство Connection, которое (после выполнения метода Ореп()) и содержит ComObject. Для чтения значения переменной модуля внешнего соединения гл Пользо- ватель можно использовать следующий метод (листинг 20.43). Листинг 20.43. Пример чтения значения переменной string currUser = (string)V8.Get(connection, connection.Connection, "глПользователь"); th is.Label 1 .Text = currUser; Считаем, что в переменной connection находится объект типа V8DbConnection. Для обращения к функции ВозвращаемСтроку() можно использовать следующий код (листинг 20.44). Листинг 20.44. Пример обращения к функции object test = V8.Call(connection.Connection, "ВозвращаемСтроку"); this.Label2.Text - test.ToStringQ; Рассмотренная ранее функция ВозвращаемСтроку() не имела параметров. В том случае, если они есть (и параметр не один), для передачи значений в параметры можно использовать массив. Рассмотрим пример вызова функции, у которой определено два параметра (листинг 20.45). Листинг 20.45. Пример вызова функции с двумя параметрами objectfl args = {V8.ConvertValueNetToV8(NomenRef, connection), null); object test2 = V8.Call(connection.Connection, "ПолучитьДанныеДляДок", args); object ed = V8.ConvertValueV8ToNet(args[1], connection); this.Label2.Text = V8.ConvertValueV8ToNet(args[1], connection).ToString(); Первоначально формируется массив параметров args. При опреде- лении сразу же производится его инициализация. Первым значением будет значение ссылки на номенклатуру, преобразованное к типу «1С:Предприятия 8» (подобное значение можно получить при обращении к элементу управления V8TextBox с установленным соответствующим типом). Второй элемент массива ничего не содержит (Null). Далее (с помощью метода Са11()) производится вызов указанной функции (имя указывается вторым параметром). Третьим параметром передается созданный ранее массив. Профессиональная разработка в системе «1С:Предприятие 8»
Функция определена как возвращающая значение типа Булево (если цена номенклатуры найдена, то возвращается значение Истина, не найдена - Ложь). Кроме этого, возврат значения цены производится через массив параметров (параметры передаются по ссылке). После получения значения цены его необходимо преобразовать из типа «1С:Предприятия 8» в тип .NET. Полученное значение отображается в элементе управления Label2. НАСТРОЙКА ПРАВ ДОСТУПА Для контроля прав доступа к данным информационной базы «1С:Предприятия» предназначен класс V8Rights пространства имен _1C.V8.Data. Обращение к свойствам и методам данного класса позволяет проверить наличие разрешения на выполнение стандартных действий с данными информационной базы. К примеру, такая проверка автоматически добавляется в функцию-об- работчик загрузки формы, созданной на основе шаблона V8 Item Form (листинг 20.46). Листинг 20.46. Обработчик события Page_Load private void Page_Load(object sender, System.EventArgs e) { // Проверка прав на просмотр таблицы. if (!ltemDataSource.CheckAccessRight(V8Rights.View)) { V8WebUtil.RegisterShowErrorScript( _1C.V8.Data.V8.GetString("err_accessRightViolation"), this, true); Response.End(); return; } if (UsPostBack) Title.Text = ItemDataSource.Tablelnfo.Presentation; Следует отметить, что сами разрешения настраиваются в режиме Конфи- гуратор информационной базы «1С:Предприятие» (настройкой ролей пользователей). Какие роли действуют - определяется пользователем, в контексте которого производится обращение к базе данных. Существует и более универсальная возможность проверки прав поль- зователя. Она предоставляется методом AccessRight() класса V8Right. В качестве параметров этому методу передается строка с названием действия (например Read, Edit, Posting и т.д.), таблица (объект VSTableInfo), в отношении которой предлагается выполнение действия, и соединение (объект V8DbConnection). Том 2
Йдентификация1пол£зователя ИДЕНТИФИКАЦИЯ ПОЛЬЗОВАТЕЛЯ Информационная база данных «1С:Предприятия 8» может не предусмат- ривать никакой авторизации (что бывает, скорее всего, в исключительных ситуациях). В этом случае контроль прав доступа не производится, и задача идентификации пользователя на стороне веб-приложения/ сервиса, как правило, не возникает. Если авторизация в информационной базе присутствует, то с точки зрения веб-приложения/сервиса есть два варианта работы с ней: доступ к базе в контексте одного (как правило, специально создан- ного) пользователя; каждый посетитель ресурса проходит авторизацию и фактически может работать под личным логином (с индивидуальным набором прав). Недостатком первого варианта является явное «обезличивание» (с точки зрения базы данных) всех пользователей веб-приложения/сервиса. Второй вариант требует определения всех пользователей в самой инфор- мационной базе, что в случае большого количества пользователей может быть неприемлемо. На практике могут использоваться смешанные варианты. Тогда ресурс делится на две части. К одной доступ осуществляется в контексте како- го-либо «общего» пользователя, а к закрытой области (в которую может быть допущено намного меньше пользователей) требуется персональная идентификация. Следует отметить, что при обращении к веб-сервисам может исполь- зоваться вариант, когда параметры доступа указываются в качестве параметров вызываемой функции. Рассмотрим настройки веб-приложения/сервиса, связанные с правами доступа пользователей. Данные настройки распределены по нескольким файлам веб-приложения. Следует отметить, что при желании организовать идентификацию на основе форм следует произвести настройку всех указанных файлов. Файл Web.config В случае, если идентификация пользователей не производится либо не используется принудительная авторизация на основе форм, в этом файле определены следующие XML-элементы (листинг 20.47). Листинг 20.47. Фрагмент файла Web.config «authentication mode="Windows" /> <authorization> «allow users-1*1' /> «I- Allow all users -> «I-
~> «/authorization» «allow users-'[comma separated list of users]" roles="[comma separated list of roles]7> «deny users-'[comma separated list of users]" roles="[comma separated list of roles]"/» В данном варианте к веб-приложению могут обращаться любые пользова- тели, к веб-серверу разрешен анонимный доступ. Но даже при анонимном доступе обращение веб-приложения к информационной базе может осуществляться в контексте одного или нескольких пользователей. Конт- роль прав доступа к информационной базе данных (при необходимости) осуществляется обычно в обработчике события Load веб-форм. При этом проверяются права доступа к запрашиваемым данным именно с точки зрения пользователя, параметры которого указаны в разделе appSetting (или явно определены другим образом). Раздел appSettings имеет следующий вид (листинг 20.48). Листинг 20.48. Фрагмент кода <appSettings> «add key="Database" value-РНе="О:\Конфигурации\Т иповыеЮетоЕхсЬапде";' /> «add key="UserName" value="web" /> «add key="UserPassword" value="1234" /> «add key="PoolCapacity" value-'2" /> </appSettings> Как видно, помимо имени пользователя и пароля в этом же разделе опре- делен путь к информационной базе данных. В качестве отдельного варианта можно реализовать принудительную аутентификацию на основе форм. Особенность данного механизма заклю- чается в том, что после его определения первое обращение к абсолютно любому ресурсу приведет к открытию формы, ответственной за иденти- фикацию. Для того чтобы при таком варианте аутентификации организовать возмож- ность гостевого входа (случайный пользователь тоже смог бы обратиться к ресурсу), непосредственно в форме авторизации можно в явном виде прописывать гостевой логин. При настройке авторизации на основе форм разделы файла выглядят следующим образом (листинг 20.49). Листинг 20.49. Фрагмент кода «authentication mode="Forms"> «forms loginUri=''logon.aspx'' name-'AuthCookie" timeout=''60" path-T /> «/authentication» В значение атрибута loginUrl записывается путь к форме, которая будет вызы- ваться для проведения аутентификации пользователя (листинг 20.50).
Листинг 20.50. Фрагмент кода <authorization> «deny users-'?"/* «/authorization* Обратите внимание на тот факт, что для реализации аутентификации на основе форм недостаточно внести изменения в файл web.config. Потребуется еще создать форму, в которой будет осуществляться аутенти- фикация пользователя, и внести изменения в файл global.asax. Файл global.asax Настройка данного файла (можно сказать, что он используется в качестве «глобального модуля») необходима в случае реализации механизма авторизации на основе форм. Имеется в виду, что в других вариантах авторизации обычно этого не требуется (но работа с самим файлом может осуществляться для решения других задач). В определение используемых пространств имен следует добавить следу- ющие строки (листинг 20.51). Листинг 20.51. Определение пространств имен using _1C.V8.WebControls; using System.Web.Security; using System.Security.Principal; Также следует определить обработчик события AuthenticateRequest (листинг 20.52). Листинг 20.52. Обработчик события AuthenticateRequest protected void Application_AuthenticateRequest(Object sender, EventArgs e) { string cookieName = FormsAuthentication.FormsCookieName; HttpCookie authCookie = Context.Request.Cookies[cookieName]; if (authCookie == null) { return; } FormsAuthenticationTicket authTicket = null; try { authTicket = FormsAuthentication.DecryptfauthCookie.Value); } catch { return; } if (authTicket == null) return; } Formsldentity id = new Formsldentity(authTicket); GenericPrincipal princ = new GenericPrincipalfid, null); ContextUser = princ; Профессиональная разработка в системе «1С:Предприятие 8»
При любом запросе будет вызываться вышеописанный обработчик события. В нем и производится проверка: была ли успешно осуществлена авторизация текущего пользователя или нет (используется механизм cookie - возможность сервера записывать на стороне клиента какие-либо значения, характеризуемые именем, сроком жизни и т. п.). Форма, используемая для авторизации на основе форм Предположим, что существует форма с именем logon.aspx, отвечающая за авторизацию пользователей. В форме определены два текстовых поля ввода (TextBox) и кнопка, по нажатии которой производится проверка корректности авторизации пользователя. Обработчик нажатия кнопки имеет следующий вид (листинг 20.53). Листинг 20.53. Обработчик события Click private void Button1_Click(object sender, System.EventArgs e) { bool isLogin = false; using (V8DbConnection connection = new V8DbConnection( V8Metadata.GetDatabase(""), Name.Text, Password.Text ) ) { try { connection.Openf); Session[WebConsts.UserName] = Name.Text; Session[WebConsts.UserPassword] = Password.Text; isLogin = true; } catch { } } if (isLogin) { FormsAuthenticationTicket authTicket = new FormsAuthenticationTicketf 1, Name.Text, System.DateTime.Now, System. DateTime.Now.AddMinutes(30), false, string.Empty ); string encTicket = FormsAuthenticadon.Encrypt(authTicket); Response.Cookies.Add( new HttpCookie( FormsAuthentication.FormsCookieName, Tom 2
encTicket ) ); Response.Redirect( Form sAuthenti cation. GetRedirectUrl(Name.Text,false) ); } else { this.Labellnfo.Text = "Ошибка идентификации!"; } } Следует отметить, что если механизм авторизации на основе форм не используется (но все приложение работает в контексте одного пользователя), запись имени пользователя и его пароля в параметры объекта Session производится сервером автоматически. А если быть точнее - в файле global.asax определен следующий обработчик события, ответственный за это (листинг 20.54). Листинг 20.54. Обработчик события Start protected void Session_Start(Object sender, EventArgs e) { Session[WebConsts.UserName] = System. Configuration. Configurationsettings. AppSettings[V8Consts.UserName]; Session[WebConsts.User₽assword] = System. Configuration. Configurationsettings. AppSettings[V8Consts.UserPassword]; } РАБОТА С МЕТАДАННЫМИ Для того чтобы обрабатывать данные «1С:Предприятия», Web-расши- рение строит структуру метаданных информационной базы и создает описание типов, соответствующих данным, хранящимся в конкретной информационной базе. Этот процесс выполняется автоматически при создании нового проекта из шаблонов V8 Web Application или V8 Web Service. Если впоследствии конфигурация информационной базы будет изменена, следует вручную запустить генерацию метаданных для веб-приложения или Web-сервиса. Для этого используется команда главного меню Tools ► Импорт мета- данных. После выполнения команды откроется диалог следующего вида (рис. 20.67). В поле Каталог следует указать подкаталог \Ып каталога, в котором нахо- дится веб-приложение.
Информационные базы Курс 5-6 декабря HI Медицинские услуги Обмен данными. Демонстрационный пример #1 ш> Основные объекты _ Приемник Ml |Я1е='и:\Конфигурации\Типоеые\ОетоЕ «change"; Имя |web Пароль I™ Каталог |C:\lnetpub\rrMOOt\V8WebBook\br |J7j| Псевдоним ИБ 1 Создать | Выжп Рис. 20.67. Импорт метаданных Результатом генерации метаданных является файл 1ст8<псевдоним ИБ>.сШ, содержащий описание типов, присущих конкретной информационной базе. Одно веб-приложение может использовать несколько информаци- онных баз. Каждая информационная база имеет в веб-приложении свой уникальный псевдоним. Именно он указывается в поле Псевдоним ИБ при генерации метаданных. Эти псевдонимы также используются для указания связи с элементами управления, расположенными в форме (свойство IBAIias). Доступ к структуре метаданных информационной базы предоставляется классом V8Metadata пространства имен _1C.V8.Data. Следует отметить, что метаданные конфигурации по умолчанию опре- деляются в файл 1cv8.dll. При работе с Visual Studio данная библиотека подгружается системой. Если одновременно идет работа с разными проектами, но с одинаковыми именами данной библиотеки (в каждом веб-приложении, построенном с помощью Web-расширения, обязательно будет библиотека с таким именем), может возникнуть «наложение» мета- данных, которое приведет к ошибкам в создаваемом приложении. В связи с этим при переходе от одного проекта (построенного на одних метаданных) к другому рекомендуется полностью закрывать предыдущий проект. ПУЛ СОЕДИНЕНИЙ В процессе обращения к данным информационной базы создаются внешние соединения с «1С:Предприятием». Это происходит при использовании элементов управления - источников данных или при непосредственной работе с объектом V8DbConnection. Создание каждого такого соединения занимает определенную часть ресурсов сервера и требует некоторого времени.
Поэтому для ускорения работы Web-расширение может поддерживать пул соединений, в котором будут находиться уже открытые соединения. Разработчик имеет возможность настраивать пул соединений, указывая максимальное количество соединений, одновременно находящихся в пуле, и период, в течение которого соединение будет удерживаться в пуле. Настройка (инициализация) перечисленных параметров выполняется в файле GlobaLasax (листинг 20.55). Листинг 20.55 Пример настройки пула соединений protected void Application_Start(Object sender, EventArgs e) { V8Metadata.SetDatabase( tin System. Configuration. Configurationsettings. AppSettings[V8Consts.Database] ); string poolCapacityStr = System. Configuration. Configurationsettings. AppSettings[V8Consts.PoolCapacity]; if (poolCapacityStr != null) { try { int poolCapacity = int.Parse(poolCapacityStr, Culturelnfo.lnvariantCulture); V8DbConnection.PoolCapacity = poolCapacity; catch (FormatException) string poolTimeoutStr = System. Configuration. Configurationsettings. AppSettings[V8Consts.PoolTimeout]; if (poolTimeoutStr != null) { Г int poolTimeout = int.ParsefpoolTimeoutStr, Culturelnfo.lnvariantCulture); V8DbConnection.PoolTimeout = poolTimeout; } catch (FormatException) string maxConnectionsStr = System. Configuration. Configurationsettings. AppSettings[V8Consts.MaxConnections]; if (maxConnectionsStr != null) { try { Профессиональная разработка в системе «1С:Предприятие 8»
int maxConnections = int.Parse(maxConnectionsStr, Culturelnfo.lnvariantCulture); V8DbConnection.MaxConnections = maxConnections; } catch (FormatException) V8Config.SetConfig(,m, V8Config.MapFileName); Свойство PoolCapacity задает максимальное количество внешних соединений, одновременно находящихся в пуле. Значение данного свойства определяется в файле Web.config, в приведенном ниже разделе (листинг 20.56). Листинг 20.56. Фрагмент файла Web.config <appSettings> «add key-'Database” value-File-'О:\Конфигурации\Т иповыеМЭетоЕхсЬапде";' /> «add key="UserName" value="web" /> «add key=”UserPassword" value="1234" /> «add key="PoolCapacity” value-'2” /> </appSettings> Свойство PoolTimeout определяет период в секундах, в течение кото- рого соединение будет удерживаться в пуле для возможного повторного использования. Алгоритм работы пула следующий: когда пользователь закрывает соединение с базой данных, оно (если значение PoolCapacity отличается от нуля) помещается в пул; если при этом пул был заполнен (в пуле находилось максимальное количество соединений), будет вытеснено то соединение, которое дольше всего находится в пуле; повторно использовать соединение может только тот же пользователь, в контексте которого оно было создано; по окончании времени существования в пуле (свойство PoolTimeout) соединение удаляется из пула (либо оно вытесняется каким-либо новым соединением). Следует отметить, что в данном случае, когда говорится о каком-либо пользователе, подразумевается пользователь, в контексте которого произ- водится подключение к информационной базе «1С:Предприятия 8». В связи с этим использование пула соединений особенно эффективно, когда все веб-приложение работает в контексте одного пользователя (указанного в файле web.config). Свойство MaxConnection определяет максимальное число одновременно существующих внешних соединений. Данное число соединений включает также число соединений, находящихся в пуле. Значение по умолчанию равно 0 (без ограничений). Том 2
ВабЬта1с]метаданн^1ми| Это свойство можно использовать при желании ограничить количество лицензий платформы «1С:Предприятие 8», которые будут использоваться веб-приложением. Рассмотрим все это на примере. Пусть установлены следующие значения свойств: MaxConnection = 4; PoolTimeout = 60; PoolCapacity = 2. При таком значении параметров Web-приложение будет использовать максимум 4 лицензии, при этом в пуле максимально будут находиться два соединения. Соединение из пула будет удаляться либо по истечении 60 секунд после последнего его использования, либо при освобождении другого (созданного позже) соединения, которое не расположено в пуле (оно вытеснит из пула самое старое соединение). ПОЛЕЗНЫЕ СРЕДСТВА .NET FRAMEWORK В данном разделе рассмотрим ряд объектов (входящих в контекст ASP. NET), которые довольно часто используются при создании как веб-прило- жений, так и Web-сервисов. Данный раздел ни в коем случае не претендует на полное описание. При возникновении такой необходимости рекомен- дуем обращаться к специализированной литературе. Объект Response Данный объект позволяет серверу поддерживать связь с клиентом. Например, для включения в HTTP вывода произвольных данных (произвольного фрагмента HTML) можно использовать метод wtite(), листинг 20.57. Листинг 20.57. Пример использования метода Wtite() | Response. УУг11е("<Ь1>Здравствуй, мир!!!</Ы>"); Метод wtite() в качестве параметра может принимать только строковые значения. С помощью объекта Response можно управлять буферизацией вывода данных. Поясним понятие буферизации. Веб-формы (файлы aspx) факти- чески представляют собой программы, написанные (в нашем случае) на языке С#. При обращении к такой форме вызывается какая-либо функция, в результате работы которой формируется HTTP-ответ клиенту. Так вот, при включенной буферизации ответ не будет отправлен клиенту, пока не закончится исполнение формы. При отключенной буферизации
_________________________________________________1 данные отправляются по мере их формирования. Какой из вариантов использовать, определяется в каждом случае индивидуально. Для запрета буферизации можно использовать следующую конструкцию (листинг 20.58). Листинг 20.56. Пример запрета буферизации Response-Buffer = false; | Следует помнить, что если в HTTP-отклик уже помещены какие-либо данные, попытка отключения (или включения) буферизации приведет к ошибке. Методы объекта, позволяющие управлять буферизацией, перечислены в листинге 20.59. Листинг 20.59. Методы, позволяющие управлять буферизацией // Отсылает клиенту все, что на данный момент буферизировано. Response.Flushf); // Очищает все данные буфера. Response.Clear(); // Отсылает содержимое буфера, прекращает выполнение формы, // инициирует событие окончания запроса. Response.EndO; Объект может использоваться для перенаправления пользователей. К примеру, вы хотите, чтобы при первом обращении к ресурсу пользова- тель отправлялся на определенную стартовую страницу (независимо от запрашиваемого ресурса). С этой целью в файле global.asax можно опре- делить обработчик события (листинг 20.60). Листинг 20.60. Пример перенаправления protected void Session_Start(Object sender, EventArgs e) { Response.Redirect(url); .) Объект может использоваться для записи cookie (значений, записываемых на стороне клиента), листинг 20.61. Листинг 20.61. Пример использования cookie HttpCookie MyCookie = new HttpCookiefLastVisit"); DateTime now = DateTime.Now; MyCookie.Value = now.ToStringf); MyCookie.Expires = now.AddHours(1); Response.Cookies.Add(MyCookie);
Объект Request Данный объект позволяет поддерживать связь клиента с сервером. С помощью данного объекта можно производить чтение значений cookie (листинг 20.62). Листинг 20.62. Пример чтения cookie | ПоспеднийВизит = Request.Cookies["l astVisit"]; Также можно получать значения параметров, переданных в запросе. К примеру, обращение к ресурсу могло производиться следующим образом (листинг 20.63). Листинг 20.63. Пример обращения к ресурсу | Page.aspx?TableName = Справочник.Контрагенты Для извлечения значения параметра TableName можно использовать следующий подход (листинг 20.64) Листинг 20.64. Пример получения значения параметра | ИмяТаблицы = Request.Params["TableName"]; Объект Session Данный объект предназначен для хранения контекста работы пользо- вателя. Дело в том, что протокол HTTP не поддерживает возможности хранения состояния работы с пользователем (с его помощью нельзя хранить состояние пользовательской корзины, хранить значения, опреде- ляющие специфику работы данного пользователя и т. п.). Объект Session как раз и решает эти задачи. При первом обращении к любому ресурсу приложения для каждого пользователя создается объект сессии (каждый такой объект характеризу- ется неким уникальным идентификатором, защищенным от повторения). Как при старте сессии, так и при ее завершении инициируются события, обработчики которых могут быть определены в файле global.asax. Завершение сессии (и освобождение всех занятых ее ресурсов) можно вызвать принудительно (листинг 20.65). Листинг 20.65. Пример зааершения сессии | Session.Abandon(); Также завершить сессию можно по истечении определенного проме- жутка времени после последнего запроса. Этот промежуток времени устанавливается в параметрах веб-сервера (рис. 20.68). Профессиональная разработка в системе «1С:Предприятие 8»
Default Web Site Propel ties Directory Security f HTTP Headers II Custom Errors H Server Ex WebSite j ISAPI Filers | Home Directory ~| Росе [ Mappings^OpSw^l Debugginfl]________________ Local Pal □ Script Pl Read -Apptcation Configuration------------------------- 0 Enable session state Session timeout: liP~~l minutes Рис. 20.68. Настройка параметров веб-сервера Кроме этого, в объекте Session можно хранить значения, индивидуальные для каждого пользователя (листинг 20.66). Листинг 20.66. Пример записи и чтения значения // Запись значения. SessionfUserName"] = "web”; // Получение значения. Значение = Sessionf'UserName"]; ПОДГОТОВКА ВЕБ-ПРИЛОЖЕНИЯ К РАБОТЕ До сих пор, для того чтобы проверить, как работает та или иная созданная веб-форма, рекомендовалось установить ее как стартовую и запустить проект в режиме отладки. Когда все формы приложения будут готовы (а скорее всего, намного раньше), необходимо подумать о навигации по созданному приложению. Т. е. должен быть определен механизм, позво- ляющий пользователю спокойно переходить от одной формы к другой (без знания имен форм и путей до них). Реализация подобного механизма может строиться по-разному. Но чаще всего в основе лежит возможность использования гиперссылки. Примеры использования (код HTML) приведены в листинге 20.67. Листинг 20.67. Фрагмент HTML-кода <TA8LE id-ТаЫеГ style=”Z-INDEX: 102; LEFT: 1рх; WIDTH: 182рх; POSITION: absolute; TOP: 44px; HEIGHT: 108px; BACKGROUND-COLOR: yellow" cellSpacing-T cellPadding=”1" widtti="182” Tom 2
Параметр£|[автоформ border="1"> <TR> <TD style-'HEIGHT: 13px"><STR0NG>CnpaB04HMKM</STR0NG></TD> </TR> <TR> <TD><Ahref=”nomenlistaspx”>HoMeHMiaTypa</A></TD> </TR> <TR> <TD> <Ahref=''DefaultListFomi.aspx?TableName=CnpaBO4HMK.KoHTpareHTbr> Контрагенты </A> </TD> </TR> </TABLE> Обратите внимание на тот факт, что вторая гиперссылка определяет вызов формы списка справочника Контрагенты и при этом используется форма по умолчанию. Состав файлов В ходе создания веб-приложения в виртуальном каталоге были созданы: каталог Images. Он содержит картинки, используемые для оформления форм. Данный каталог необходимо оставить в готовом решении; каталог bin. Он содержит ряд файлов (этот каталог также в обязательном порядке должен включаться в работающее решение). В каталоге содер- жится dll-файл проекта и dll-файлы, содержащие описание метаданных используемых конфигураций; в корне виртуального каталога (если иное не определено явно) располагаются файлы *.aspx, *.aspx.cs. Файлы *.aspx.cs в рабочее решение можно не включать (но терять их не рекомендуется, т. к. они потребуются в случае возникновения необходимости исправления функционала, перекомпиляции веб-приложения). ПАРАМЕТРЫ АВТОФОРМ Веб-приложение, созданное при помощи различных шаблонов в среде Visual Studio .NET, содержит несколько автоформ (форм по умолчанию). Они используются приложением, когда происходит обращение к данным, для которых разработчик не создал собственных форм, при отработке некоторых стандартных действий. Управление работой автоформ осуществляется при помощи параметров, которые передаются либо в строке запроса, либо как переменные формы.
] Разработчик веб-приложения может явно использовать автоформы для выполнения необходимых действий, определяемых логикой приложения. Указать, какие действия должна выполнить автоформа, можно при помощи ее параметров, передавая значения следующим образом (листинг 20.68). Листинг 20.66. Пример передачи параметров в автоформу ууеЬТогт.азрх?параметр1=ЗначениеПараметра&параметр2=ЗначениеПараметра| Чтение переданных таким образом параметров осуществляется (в коде формы webform) с помощью объекта Request. Ниже приводится список параметров некоторых автоформ. Форма списка (DefaultListForm) DefaultListForm используется для отображения записей таблицы базы данных в виде списка. Также DefaultListForm применяется для выбора значений из списка записей. Эта форма имеет следующие параметры: IBAIias - имя информационной базы. Используется в том случае, если приложение работает с несколькими информационными базами данных. Значение по умолчанию - пустая строка; TypeName - имя типа. Задает таблицу базы данных, которая будет отоб- ражаться в списке. Вместо TypeName может использоваться параметр TableName; TableName - имя таблицы. Задает таблицу базы данных, которая будет отображаться в списке. Вместо TableName может использоваться пара- метр TypeName; ChoiceMode - режим выбора для иерархических таблиц. Допустимые значения: □ Items; □ Folders; □ FoldersAndltems. Если передано значение Folders, в списке будут отображаться только группы элементов: ControlName - идентификатор элемента управления, вызвавшего форму списка для выбора. Если передан параметр ControlName, форма пере- ходит в режим выбора из списка; TypeDescriptionNeeded - указывает на необходимость считывания описания типов для поддержки связи по типу. Возможные значения: □ true; □ false; SelectionName<N>, SelectionValue<N>, SelectionType<N> - отборы и пара- метры критериев отбора. В случае одного элемента отбора используется форма SelectionName, Selectionvalue, SelectionType. Если установлено
несколько отборов, то они задаются в параметрах SelectionNamel, SelectionValuel, SelectionTypel, Selection Name2, SelectionValue2, SelectionType2 и т. д. Нумерация начинается с единицы. □ SelectionName - имя поля; □ Selectionvalue - значение отбора; □ SelectionType - тип значения. Используется в случае составного типа; Assortment - задает режим подбора. В этом режиме после выбора значения форма остается открытой, предоставляя возможность продол- жения выбора. Должен быть задан параметр ControlName. Допустимое значение - true; Initialvalue - начальное значение. Содержит значение ключа записи. Если параметр задан, то список позиционируется на переданное значение. Форма элемента объектной таблицы (DefaultObjectForm) DefaultObjectForm используется для добавления, редактирования, копиро- вания или ввода на основании записи объектной таблицы. Режим формы определяется следующим образом: если передан параметр KeyValue, то форма переходит в режим редак- тирования; если передан параметр CopyKeyValue и задаваемая им таблица совпа- дает с таблицей из параметра TableName (или КеуТуре), то форма переходит в режим копирования; если передан параметр CopyKeyValue и задаваемая им таблица не совпадает с таблицей из параметра TableName (или КеуТуре), то форма переходит в режим ввода на основании; если параметры KeyValue и CopyKeyValue не заданы, то форма пере- ходит в режим добавления записи. Эта форма имеет следующие параметры: IBAIias - имя информационной базы. Используется в том случае, если приложение работает с несколькими информационными базами данных. Значение по умолчанию - пустая строка; КеуТуре - тип значения ключевого поля. Используется для опреде- ления таблицы, запись которой будет редактироваться (или в которую будет добавлена новая запись); KeyValue - значение ключевого поля. Задает значение ключа редакти- руемой записи; Профессиональная разработка в системе «1С:Предприятие 8»
TableName - имя таблицы. Задает таблицу базы данных, запись которой будет редактировать в форме (будет добавлена при помощи формы). Вместо TableName может использоваться параметр КеуТуре; CopyKeyType, CopyKeyValue - тип значения ключевого поля и значение ключевого поля копируемой записи. Передача этих параметров задает режим копирования; IsFolder - параметр ЭтоГруппа. Определяет режим редактирования (создания) группы; MasterName<N>, MasterValue<N>, MasterType<N> - предустановленные значения полей. Используется, например, для задания поля Владелец для подчиненных таблиц. В случае одного значения используется форма MasterName, MasterValue, MasterType. Если передано несколько значений, то они задаются в параметрах MasterNamel, MasterValuel, MasterTypel, MasterName2, MasterValue2, MasterType2 и т.д. Нумерация начинается с единицы. □ MasterName - имя поля; □ MasterValue - значение; □ MasterType - тип значения. Используется в случае составного типа; ControlName - идентификатор элемента управления, вызвавшего форму. Используется для обновления списка записей после записи изменений в форме; Parent - значение поля Родитель для иерархических таблиц. Форма записи регистра (DefaultRecordForm) DefaultRecordForm используется для редактирования, создания новой или копирования существующей записи регистра. Режим формы определяется следующим образом: если передан параметр KeyValue<N>, то форма переходит в режим редактирования; если передан параметр CopyKeyValue<N>, то форма переходит в режим копирования; если параметры KeyValue<N> и CopyKeyValue<N> не заданы, то форма переходит в режим добавления записи. Эта форма имеет следующие параметры: IBAIias - имя информационной базы. Используется в том случае, если приложение работает с несколькими информационными базами данных. Значение по умолчанию - пустая строка; TableName - имя таблицы регистра. Задает регистр, запись которого будет редактировать, в форме (будет добавлена при помощи формы); Том 2
Параметр£|[автоформ ControlName - идентификатор элемента управления, вызвавшего форму. Используется для обновления списка записей после записи изменений в форме; KeyName<N>, KeyValue<N>, KeyType<N> - значения ключевых полей редактируемой записи. В случае одного значения используется форма KeyName, KeyValue, КеуТуре. Если для таблицы задано несколько ключевых полей, то их значения задаются в параметрах KeyNamel, KeyValuel, KeyTypel, KeyName2, KeyValue2, KeyType2 и т.д. Нумерация начинается с единицы. □ KeyName - имя ключевого поля; □ KeyValue - значение ключевого поля; □ КеуТуре - тип значения ключевого поля. Используется в случае составного типа; CopyKeyName<N>, CopyKeyValue<N>, CopyKeyType<N> - значения ключевых полей копируемой записи. В случае одного значения используется форма CopyKeyName, CopyKeyValue, СоруКеуТуре. Если для таблицы задано несколько ключевых полей, то их значения зада- ются в параметрах CopyKeyNamel, CopyKeyValuel, CopyKeyTypel, CopyKeyName2, CopyKeyValue2, CopyKeyType2 и т. д. Нумерация начина- ется с единицы. □ CopyKeyName - имя ключевого поля; □ CopyKeyValue - значение ключевого поля; □ СоруКеуТуре — тип значения ключевого поля. Используется в случае составного типа. Форма строки табличной части (DefaultLineForm) DefaultLineForm предназначена для редактирования (добавления) строки табличной части. Эта форма имеет следующие параметры: IBAIias - имя информационной базы. Используется в том случае, если приложение работает с несколькими информационными базами данных. Значение по умолчанию - пустая строка; TableName - имя табличной части; ColumnsList - разделенный точкой с запятой список отображаемых полей строки табличной части; HiddenColumnsList - разделенный точкой с запятой список неотобража- емых полей строки табличной части; ControlName - идентификатор элемента управления, вызвавшего форму для редактирования (добавления) строки табличной части. Исполь- зуется для обновления отображения табличной части после записи изменений в форме.
9£S Г аинаа итэеа-дэдд^о^ jsaeLfj
Профессиональная разработка в системе «1С:Предприятие 8»
Глава 21. Поставка прикладных решений Выпуск тиражных прикладных решений влечет за собой целый ряд вопросов, которые обычно не возникают при создании заказных или индивидуальных систем. Если пользователь один, то разработчик может самостоятельно установить у него прикладное решение и, при необходи- мости, выполнить его обновление до новой версии. Теперь представим, что количество пользователей прикладного решения исчисляется сотнями и тысячами. Очевидно, что «дойти» до каждого из них разработчик просто физически не сможет (особенно если пользова- тели находятся в другом городе или другой стране). Значит, необходимо готовить какой-то дистрибутив прикладного решения, который пользо- ватель самостоятельно сможет запустить на своем компьютере и начать работать. Аналогично требуется некий механизм для того, чтобы существо- вала возможность легко обновить прикладное решение пользователя до новой версии. Сложность этого действия применительно к системе «1С:Предприятие» заключается в том, что прикладные решения «1С:Предприятия» не являются закрытыми - пользователь может модифи- цировать их под свои нужды. А это значит, что при обновлении возникнет необходимость совмещать изменения, выполненные пользователем, с изменениями, которые произвел разработчик. При большом количестве изменений это может стать для пользователя очень сложной задачей. Система «1С:Предприятие» содержит два механизма, которые в значи- тельной степени автоматизируют описанные выше процессы. Во-первых, это механизм поставки и поддержки прикладных решений. Этот механизм позволяет разработчику изменять прикладное решение, а пользователю автоматически или полуавтоматически принимать выпол- няемые изменения. Во-вторых, это механизм создания комплектов поставки. Этот меха- низм позволяет разработчику формировать дистрибутив, который, будучи запущен у пользователя, выполнит все необходимые действия самостоя- тельно. Совместное использование механизма поставки и поддержки и меха- низма создания комплектов поставки позволяет выполнять полный цикл поддержки прикладного решения у пользователя. В общем случае схема взаимодействия разработчика с пользователем выглядит следующим образом (рис. 21.1). Том 2
Рис. 21.1. Схема взаимодействия разработчика с пользователем Разработчик создает некоторое прикладное решение (версия 1). Теперь ему нужно позаботиться о двух вещах. Во-первых, о том, чтобы пользователи, купившие это прикладное решение, могли бы в дальнейшем легко обнов- лять его по мере выхода новых версий. Во-вторых, необходимо создать некоторый исполняемый файл, который пользователь сможет запустить на своем компьютере, и этот файл выполнит установку всех файлов, необ- ходимых для работы прикладного решения. Для решения первого вопроса разработчик использует механизм поставки и поддержки конфигурации, с помощью которого «сообщает» конфигу- рации о том, что она будет в дальнейшем получать обновления от этого разработчика и в каких пределах она может быть изменена пользова- телем. Затем разработчик использует механизм создания комплектов поставки для того, чтобы создать дистрибутив версии 1. Дистри- бутив может содержать не только непосредственно саму конфигурацию версии 1, но также и ряд других файлов, необходимых для установки
Гл~ава>21!!Поставка1прикладн£|х4решений на компьютере пользователя. Например, файл демонстрационной инфор- мационной базы, сопроводительные файлы, файлы документации, обучающие файлы, рекламные материалы и т. д. Как правило, дистрибутив копируется на некоторый физический носитель (например, CD-ROM). Пользователь приобретает прикладное решение и запускает на своем компьютере программу установки, входящую в состав дистрибутива. Эта программа выполняет установку всех файлов, содержащихся в дист- рибутиве. После того как установка закончена, пользователь может начать работу с прикладным решением и в том числе может модифицировать это прикладное решение под свои нужды. Благодаря механизму поставки и под держки пользователь может изменить только те части конфигурации, для которых разработчик не запретил изменение. Таким образом, в общем случае через некоторое время пользователь будет иметь уже доработанное прикладное решение версии 1, которое больше или меньше (в зависи- мости от стараний пользователя) отличается от оригинального (версия 1) прикладного решения. К этому моменту разработчик, например, исправил ряд ошибок, обна- руженных в версии 1 прикладного решения, и, используя возможности механизма создания комплектов поставки, выпустил обновление своего прикладного решения, позволяющее перейти с версии 1 на версию 2. Это обновление разработчик записал на физический носитель, а также выложил на доступный всем пользователям его прикладного решения FTP- или HTTP-ресурс. Предположим, пользователю нужно срочно полу- чить обновление своего прикладного решения, и он не может ждать, пока посылка с CD-ROM, содержащим обновление, дойдет к нему по почте. В этом случае пользователь, благодаря механизму поставки и поддержки, может обратиться к указанному FTP- или HTTP-ресурсу и обновить свое прикладное решение прямо с этого ресурса. Причем если пользователь не вносил никаких изменений в прикладное решение, обновление до версии 2 будет выполнено полностью автоматически. Если же изменения вноси- лись, то механизм поставки и поддержки попросит пользователя указать, как поступить с теми объектами конфигурации, которые были изменены одновременно, как разработчиком, так и пользователем. МЕХАНИЗМ ПОСТАВКИ И ПОДДЕРЖКИ ПРИКЛАДНЫХ РЕШЕНИЙ Суть механизма поставки и под держки заключается в том, чтобы обеспе- чить автоматическую или полуавтоматическую возможность обновления прикладного решения у пользователя. Еще раз обратим внимание на то, что особенностью обновления прикладных решений «1С:Предприятия» является то, что прикладные решения, после того как они выпущены разработчиком, могут быть изменены пользователем. Таким образом, в момент обновления любого из реквизитов объектов конфигурации может возникнуть одна из четырех ситуаций (табл. 21.1).
Таблица 21.1. Варианты действий разработчика и пользователя Разработчик Пользователь Не изменял Не изменял Не изменял Изменил Изменил Не изменял Изменил Изменил Очевидно, что в трех перечисленных вариантах можно принять одно- значное решение о том, какие действия нужно выполнить при обновлении прикладного решения (табл. 21.2). Таблица 21.2. Принятие решения о выполнении действий Разработчик Пользователь Действие Не изменял Не изменял Не изменять Не изменял Изменил Не изменять Изменил Не изменял Принять изменения разработчика Изменил Изменил ? В последнем случае, когда один и тот же реквизит объекта конфигурации был изменен как пользователем, так и разработчиком, никакого однознач- ного решения о том, что же делать, принять нельзя. Очевидно, что только пользователь может решить, каким образом его изменения должны соче- таться с изменениями, внесенными разработчиком. Поэтому одной из важных функций механизма поставки и под держки является возможность автоматически определить такие свойства и предоставить пользователю отфильтрованный список, для того чтобы он указал правило объединения в каждом конкретном случае. Чтобы сократить по возможности количество подобных объектов и облегчить тем самым обновление конфигурации, механизм поставки и поддержки позволяет задать для объектов конфигурации правила поставки и правила поддержки. Правила поставки задает разработчик, а пользователь действует в соот- ветствии с правилами поддержки и может изменять их (рис. 21.2). Разработчик Превила поставил Пользователь Превила померяю Рис. 21.2. Правила поставки и правила поддержки Для того чтобы конфигурация могла под держивать другие конфигурации, разработчик должен задать правила поставки. Правила поставки задаются разработчиком для каждого объекта конфигурации и не могут быть изме- нены пользователем. Они служат для того, чтобы запретить пользователю изменение отдельных объектов, а для других объектов сообщить инфор- Профессиональная разработка в системе «1С:Предприятие 8»
мацию о желательности или нежелательности внесения в них изменений. Правила поставки задаются только для объектов верхнего уровня, таких как справочники, документы, регистры. Для объектов метаданных, подчи- ненных им (таких как реквизиты, табличные части, формы, макеты), будут использоваться соответствующие правила родительских объектов. Существует четыре правила поставки: Изменения разрешены - означает, что пользователь может выполнять любые изменения этого объекта в своей конфигурации, то есть разра- ботчик полагает, что изменения, выполняемые пользователем в этом объекте, не окажут значительного влияния на основную функциональ- ность прикладного решения; Изменения не рекомендуются - означает, что пользователь может изменять этот объект, но при внесении изменений он должен быть внимателен, так как это может повлиять на значительную часть функ- циональности прикладного решения; Изменения запрещены - означает, что пользователь не может выполнять изменения этого объекта. С точки зрения разработчика это правило означает, что объект настолько важен для данного прикладного решения, что при любом его изменении пользователем разработчик не видит смысла в дальнейшей поддержке такого прикладного решения; Включение в конфигурацию не рекомендуется - это правило соответс- твует правилу Изменения разрешены и предназначено в основном для разработки объектов из библиотеки стандартных подсистем. При постановке конфигурации пользователя на поддержку путем сравнения/объединения с файлом поставки объекты, для которых установлено данное правило поставки, по умолчанию не помечаются к включению в конфигурацию пользователя. Правила поставки необходимы для того, чтобы в соответствии с ними сформировать правила поддержки. Правила поддержки формируются всегда, но не всегда используются. Это объясняется тем, что существует два режима поддержки конфигурации: полная под держка, под держка с возможностью изменения. Полная поддержка означает, что пользователю запрещено вносить изменения в конфигурацию. В том числе и добавлять новые объекты. Поддержка с возможностью изменения означает, что пользователь может изменять конфигурацию в соответствии с правилами поддержки, и при этом она продолжает находиться на под держке поставщика. При первоначальной установке прикладного решения из дистрибутива создается конфигурация, находящаяся на полной под держке. При желании пользователь может включить возможность изменения конфигурации - в этом случае начнут действовать правила поддержки, сформированные системой по умолчанию, на основании правил поставки. Том 2
Существует три правила поддержки: Объект поставщика не редактируется - это правило означает, что пользо- ватель не может вносить изменения в этот объект; Объект поставщика редактируется с сохранением поддержки - это правило означает, что пользователь может изменять объект, и при этом конфи- гурация продолжает оставаться на поддержке поставщика. Однако удалить объект пользователь не может; Объект поставщика снят с поддержки - означает, что объект не может быть обновлен с использованием механизма поставки и поддержки. Иными словами, пользователь может вносить любые изменения в этот объект (в том числе и удалять), а механизм поставки и поддержки просто его «не видит». По умолчанию правила поддержки устанавливаются следующим образом. Если разработчик установил правило поставки Изменения запрещены, то пользователю будет установлено правило поддержки Объект постав- щика не редактируется (рис. 21.3). В этом случае пользователь не сможет изменить данный объект конфигу- рации и правило поддержки. Превила поставки Превила поддержки Включеже в конфигурации не рекомендуется Изменения разрешены Объект поставщика онятс померяю Изменения не рекомендуются Объект поставщика редекпфуется с сохранением поддержки Изменежя еагдеещеж) Объект поставщика не редактируется Рис. 21.3. Установка правила поддержки Превила поставт Превила поддержи Рис. 21.4. Установка правил поддержки
Гл~ава>21!!Поставка1прикладн£|х4решений Если разработчик установил правило поддержки Изменения не реко- мендуются, Включение в конфигурацию не рекомендуются или Изменения разрешены, то соответствующими правилами поддержки, устанавливае- мыми по умолчанию, будут Объект поставщика не редактируется и Объект поставщика редактируется с сохранением поддержки (рис. 21.4). В дальнейшем пользователь сможет изменить при необходимости правило поддержки. Изменение режима поддержки Как уже было сказано выше, конфигурация пользователя может нахо- диться либо на полной поддержке, либо на поддержке с возможностью изменения. Пользователь может самостоятельно перейти с одного режима поддержки на другой или вообще снять свою конфигурацию с поддержки поставщика. Начальный режим поддержки Установить полную поддержку конфигурации можно двумя способами: выполнить установку дистрибутива и создать новую информационную базу из шаблона или выполнить загрузку файла поставки в существу- ющую информационную базу. Также можно установить в качестве начального режим поддержки с возможностью изменения. Для этого нужно выполнить сравнение/ объединение конфигурации с файлом поставки. Файл поставки представ- ляет собой специальным образом подготовленный файл конфигурации, о котором подробнее рассказывается в разделе «Файл поставки», стр. 592 (рис. 21.5). Режимы поддвриям конфигурации Конфигурация онята с поддврм»! Рис. 21.5. Установка различных режимов поддержки конфигурации
Полная поддержка - поддержка с возможностью изменения При желании пользователь может изменить режим поддержки конфигу- рации и включить возможность изменений. Для этого следует выполнить команду Конфигурация ► Поддержка ► Настройка поддержки... и в открыв- шемся окне настройки поддержки нажать кнопку Включить возможность изменения (рис. 21.6). Настройка поддержки Конфигурация находится на поддержке ________________________О_Х (ДГвключигь возможность изменения^ Конфигурация поставщика: [ЫправлениеТорговлей | Поставщик: [Фирма'ТС1 j Версия:[11.0.4.5 | -i и.- - Настройка правил поддержки объек I УправлениеТорговлей ,"% « Редактируется с сохранением поддержки Правила поставщика--------------------------------------------------------------------------------------- Объект редактируется Iq Объект не рекомендуется редактировать Объект не редактируется Правила пользователя------------------------------------------------------------------------------------- ® । Объект не редактируется । Объект редактируется с сохранением поддержки ) Объект снят с поддержки Открыть11 Сохранить в файл 11 Закрыть 11 Справка | Рис. 21.6. Включение возможности изменения конфигурации В этом окне также можно увидеть информацию о конфигурации поставщика, на поддержке которой находится данная конфигурация: название конфигурации, название поставщика и версию конфигурации поставщика. Кроме того, в этом окне отображаются правила поддержки, которые начнут действовать при включении возможности изменения конфигурации. Они установлены по умолчанию на основании правил поставки, заданных в конфигурации поставщика. Пользователь может сразу же (если это не запрещено поставщиком) настроить правила поддержки отличными от заданных по умолчанию или сделать это позже, в любое удобное время. Во многих случаях перед пользователем стоит задача выборочной моди- фикации конфигурации, то есть ему нужно немного отредактировать один или несколько объектов конфигурации, и пользователь боится при этом нарушить работу других объектов прикладного решения. В этом случае в момент включения возможности изменений и при последующих обнов- лениях конфигурации можно указать состав объектов, открытых для редактирования, и затем уже настраивать правила поддержки для этих объектов. Профессиональная разработка в системе «1С:Предприятие 8»
Поддержка с возможностью изменения - полная поддержка Следует обратить внимание на то, что переход к поддержке с возмож- ностью изменения прост, в отличие от перехода в обратную сторону, к режиму полной поддержки конфигурации. Это обусловлено тем, что в режиме полной поддержки конфигурация пользователя представляет собой практически копию конфигурации поставщика. Если же конфигурация находится в режиме поддержки с возможностью изменения и в информационной базе присутствует некоторая непустая база данных, то для перехода к полной под держке поставщика необхо- димо выполнить следующие действия: создать информационную базу с пустой базой данных и конфигурацией, находящейся на полной поддержке, а затем программными средствами перенести в эту базу данные из прежней информационной базы. Поддержка с возможностью изменения - снятие с поддержки Конфигурация, находящаяся в режиме поддержки с возможностью изме- нения, может быть полностью снята с поддержки. Для этого следует в окне настройки поддержки нажать кнопку Снять с поддержки. В результате конфигурация будет снята с поддержки поставщика, и пиктограммы рядом с объектами конфигурации, обозначающие правила поддержки, исчезнут. Конфигурация, не стоящая на поддержке, - поддержка с возможностью изменения Конфигурацию, которая не находится на поддержке, можно снова поставить на поддержку с возможностью изменения. Для этого следует выполнить сравнение/объединение этой конфигурации с файлом поставки. В начале сравнения будет выдано сообщение о том, что возможна постановка конфигурации на поддержку. При утвердительном ответе и выполнении сравнения и объединения с конфигурацией постав- щика конфигурация пользователя будет поставлена на поддержку с возможностью изменения. При этом будут установлены правила поддержки исходя из правил поставки, заданных в конфигурации поставщика. Том 2
^^^^ИМеханйзмТпо^авкйТйТподдержкйТпрйкладнБ1Хфешений Изменение правил поддержки Пользователь может изменять правила поддержки в том случае, если для объекта заданы правила поставщика, отличные от правила Изменения запрещены (рис. 21.7). Превила поддеряю Рис. 21.7. Изменение правил поддержки Установка правил «Объект поставщика редактируется с сохранением поддержки» и «Объект поставщика не редактируется» Если для объекта установлено правило Объект поставщика не редактиру- ется, то пользователь может изменить это правило на любое из других правил поддержки (рис. 21.8): Объект поставщика редактируется с сохранением поддержки, Объект поставщика снят с поддержки. Рис. 21.6. Изменение правила поддержки «Объект поставщика не редактируется»
Гл~ава>21!!Поставка1прикладн£|х4решений Для установки правил поддержки Объект поставщика редактируется с сохранением поддержки и Объект поставщика снят с поддержки следует воспользоваться окном настройки поддержки (рис. 21.9). Настройка поддержки □ X Конфигураций находится на поддержке с возможностью изменения 1 Редактируется с сохра ютом поддержки Установить правило поддержки % ° I Не редактируется % ® i Не редактируется % ® । На редактируется ® । Не редактируется КонФигуреиия поставщика: [УправлениеТорговлей ] Поставщик; [Фирма'ЧС" | Версия: [l1.0.4.5 ] | Снять с поддержки | [ Языки поддержки | - Н астройка правил поддержки объектов----------------------------------------------------------------- Объект | УправлениеТорговлей VJ УправлениеТорговлей $ Общие <+> В? Константы в1 ЙЦ Слраеоч-мки_______ ffl Банки •V = Реквизиты = КоррСчет = Город = Адрес = Телефоны Правила поставщика---------- Объект редактируется I ц Объект на рекомендуется редактировать Объект не редактируется Правила пользователя------------------------------------------------------------------------------------- в । Объект не редактируется « Объект редактируется с сохранением поддержки -j Объект снят с поддержки | Сравнить, объединить 11 Открыть 11 Сохранить в Файл 11 Закрыть 11 Справке | Рис. 21.9. Изменение правила поддержки Установив курсор на нужный объект, следует открыть окно настройки правил поддержки, которое предложит выбрать правило поддержки (рис. 21.10). Настройка правил поддержки - П рави ло------------------------------------------------- ® । О Объект поставщика не редактируется f ФРбьект поставщика редактируется с сохранением поддержки 1 ООбьекг поставщика снят с поддержки @ Установить для подчиненных объектов | ОК 11 Отмена 11 Справка | Рис. 21.10. Настройка правил поддержки Обратите внимание, иго правило может быть установлено рекурсивно, для всех подчиненных объектов. Таким образом, если одно и то же правило нужно установить, например, для всех справочников, необходимо первоначально установить курсор на ветку Справочники; если для всей конфигурации, то курсор нужно установить на корень конфигурации. Пиктограммы, соответствующие установленному правилу поддержки объекта конфигурации, отображаются также в дереве объектов конфигу- рации, справа от объекта.
Установка правила «Объект поставщика не редактируется» Процесс возврата к запрету редактирования объекта поставщика явля- ется более сложным, чем, например, снятие запрета редактирования или снятие объекта с под держки (рис. 21.11). Рис. 21.11. Установка правила поддержки «Объект поставщика не редактируется» Это связано с тем, что пока объекту было разрешено редактирование, он мог быть изменен пользователем. Поэтому для того чтобы запретить редактирование объекта и тем самым снова разрешить его автомати- ческое обновление, сначала требуется выполнить сравнение/объединение конфигурации пользователя с конфигурацией поставщика. Если объект был изменен, необходимо объединить его в режиме Взять из конфигу- рации поставщика. После того как объединение будет выполнено, следует запустить сравнение/объединение с конфигурацией поставщика еще раз и установить правило поддержки Объект поставщика не редактируется (рис. 21.12). При выборе в окне настройки поддержки правила Объект поставщика не редактируется будет предложено прежде всего выполнить сравнение/ объединение с конфигурацией поставщика. Для неизмененных объектов сразу же можно будет установить новое правило, нажав кнопку Изменить, а для измененных объектов сначала нужно будет выполнить обновление (рис. 21.13). Следует учитывать также, что подобная смена правила поддержки не может быть выполнена для группы объектов или рекурсивно. Поэтому, если, например, требуется установить это правило для всего справочника, следует отдельно устанавливать его для корня справочника, для каждого реквизита, для каждой табличной части, для каждой формы и для каждого макета. Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 21.12. Алгоритм установки правила «Объект поставщика не редактируется» П Сравнение, объединение Основная конфигурация - Конфигурацен поставщика УправлениеТорговлей 11.В.4.5 О X ' ЕД; Основная конфигурация ^1 е УправлениеТорговлей <+:• Общие '? 0QB Справочники ' Ь । Конфигурация поставщжа $ kJ УправлежеТорговлей Общие & ЙЙ Справочники ' Режим объединения и порядок подч.. «г 0= Реквизиты ^1 £ 0 = Город в 0 Свойства v = Реквизиты €• = Город 6- Свойства S 0 Значение заполнения Значение эапогнетя дзять из конфигурации поставщика^ • । II» Поставщик: | Изменения разрешены Пользователь: | Не редактируется ^Изменить - Статусы по соответствиям объектов-------------------------------------------------------------------------------------------- | | Совпадающие | | Различающиеся | | Неопределенные | | В основной | | В конфигурации... ИП Изменен порядок Статусы по истории объектов-------------------------------------------------------------------------------------------------- '__| Неизмененные ^Измененные ^Неопределенные Ф| Добавленные —| Удаленные Itl Изменен порядок Фильтр: [Показывать отличия в конфигурациях | | Действия -11 Настройка | | Выполнить 11 Закрыть 11 Справка | Рис. 21.13. Выполнение сраанения/объединения конфигураций и установка правила поддержки Поддержка на разных языках Конфигурация поставщика может быть многоязычной, то есть содер- жать строки на разных языках. При включенной возможности изменений механизм поставки и поддержки позволяет осуществлять выборочную поддержку конфигурации пользователя только на одном или нескольких языках. В данном случае «выборочность» относится только к строкам на разных языках, которые содержатся в конфигурации. Том 2
^^^^Механизм1поставки1и1поддержки1прикладн£|хфешений Например, конфигурация поставщика содержит два языка: Русский и Английский. Пользовательская конфигурация содержит только один язык - Русский. В этом случае, если установить режим поддержки только русского языка, строки, в которых значение на русском языке не измени- лось, не будут помечаться как различающиеся. Другая ситуация, в которой может использоваться поддержка только на некоторых языках, - когда пользователь самостоятельно редактирует интерфейс на английском, например, языке и хочет, чтобы при обнов- лении конфигурации строки интерфейса на английском языке оставались без изменений. Установить режим поддержки только выбранных языков можно из окна настройки поддержки по кнопке Языки поддержки (рис. 21.14). Языки поддержки конфигурации X 0 Использовать выборочную поддержку по языкам: Ц WMII............. □Й Английский | ОК 11 Отмена 11 Справка | Рис. 21.14. Выбор языков, для которых будет осуществляться поддержка Кроме этого, пользователь может управлять выбором языков поддержки и непосредственно в ходе обновления прикладного решения из окна обновления основной конфигурации конфигурацией поставщика по кнопке Настройка (рис. 21.15). Настройка сравнения конфигураций X - И стория конфигураций---------------- (•) Основная конфигурация нв связана с загружаемой О Загружаемая конфигурация является потомком основной ООсновная конфигурация является потомком загружаемой - Языки сравнения---------------------- 0 Использовать выборочное сравнение по леыкам: EEBHESSSSSSSSSSSS3 ОЙы! Атглйский .-Объекты основной конфигурации---------------------------. О Разрешить давление объектов основной конфигурации Объекты загружаемой конфигурации-------------------------- г-i Режим копирования объектов (не сохраняются внутренние ш идентификаторы объектов) | ОК 11 Отмена 11 Справка | Рис. 21.15. Выбор языков поддержки а процессе обновления конфигурации
Гл~ава>21!!Поставка1прикладн£|х4решений Особенности работы с конфигурацией в хранилище, если конфигурация стоит на поддержке Если конфигурация, находящаяся на поддержке поставщика, модифици- руется с использованием хранилища конфигурации, то следует учитывать некоторые особенности, накладываемые одновременным использованием этих двух механизмов. ПОДРОБНЕЕ Раздел «Групповая разработка прикладных решений», стр. 624. Редактирование объектов Для того чтобы осуществить редактирование объекта конфигурации, необ- ходимо не только захватить требуемый объект в хранилище, но и сделать его доступным для редактирования средствами механизма поддержки (то есть установить нужное правило поддержки). Настройка поддержки Для настройки поддержки необходимо захватить в хранилище корневой объект конфигурации. Вся настройка поддержки конфигу- рации хранится в корне конфигурации. Изменения, произведенные в параметрах поддержки, станут доступны другим разработчикам данной конфигурации только после помещения корневого объекта в хранилище конфигурации. Обновление конфигурации Для выполнения обновления конфигурации настоятельно рекомендуется захватывать в хранилище всю конфигурацию. Настройка поставки Как уже говорилось в самом начале главы, перед тем как создать дистрибутив своего прикладного решения, разработчику следует настроить правила поставки и некоторые другие свойства конфигурации, относящиеся к поставке. Эти действия удобно выполнять для каждого отдельного объекта конфи- гурации в окне Дополнительно, или же правила поставки можно настроить для всех объектов сразу в окне настройки поставки, которое может быть открыто по команде Конфигурация ► Поставка конфигурации ► Настройка поставки... (рис. 21.16). §82
Дополнительно: Контрагенты & п tn £ Ф —' О й п i к Правило-------------------------------------- ®Йзменения разрешен^ ОИзменения не рекомендуются ОИзменения запрещены Э ОВключениевконфигурацию не рекомендуется Поставка модулей объекта--------------------- @ Включать в поставку исходный текст модулей объекта ___Х а» ;(ън 1 Настройка поставки & Изменить $_аИзменитьподчиненные Объект ' Правило О V/еЬСервисы Ф *• Общие £ В? Константы Щ Справочники ОШНВЯЕВЯБЗВд и и и и и ' Поставка модулей объекта О Включать тексты модулей объекта Номенклатура Изменения разрешены] Igl Включать тексты модулей объекта Организации__________Изменения разрешены] Ijl Включать тексты модулей объекта Подразделен Настройка правил поставщика Xтекстов модулей X ста Пользоеател Склады Физические/ 'i Д Документы Q РасходнаяНа □ ПримднаяНа |—। Qmrtpдьтдрд .-Поставка модулей объекта------------------------------ |—। дплета | 0 Включать в поставку исходный текст модулей объекта * ISl Отчеты - Правило---------------------------------- ®Мзменёнияразрешень1 !q ОИзменения не рекомендуются ОИзменения запрещены -j ОВключениевконфигурацию на рекомендуется ста ста ОК || Отмена 11 Спревка | 0Файл поставки может ИСИМЬМЫ1ГЬЫДЛЯ МНббЛёНМ | Закрыть 11 Правка | Рис. 21.16. Настройка поставки По умолчанию для любой конфигурации система назначает всем объектам правило Изменения разрешены. Разработчик при необходимости может изменить это правило. При этом следует учитывать, что правило поставки задается не для каждого объекта конфигурации, который будет анализи- роваться в процессе обновления, а только для прикладных объектов: справочников, документов, регистров и т.д. Правила для подчиненных объектов - реквизитов, табличных частей, форм, макетов и т.д. - будут установлены такими же, какие установлены для родительского объекта. При настройке поставки также можно указать, включать или не вклю- чать тексты модулей конкретного объекта в конфигурацию поставщика. Если исходный текст модуля не включается, это означает, что в файл конфигурации поставщика будет включен скомпилированный образ модуля. Такая возможность является элементом защиты интеллектуальной собственности поставщика и, возможно, элементом защиты логической целостности конфигурации от последующих модификаций пользова- телем. Влияния на быстродействие конфигурации это не оказывает. Также в диалоге настройки поставки присутствует флажок Файл поставки может использоваться для обновления. Смысл использования этого флажка будет подробно рассмотрен в разделе «Создание файла поставки», стр. 592. Профессиональная разработка в системе «1С:Предприятие 8»
Обновление конфигурации, находящейся на поддержке Обновление в автоматическом режиме Когда конфигурация находится на полной поддержке, обновление выпол- няется в автоматическом режиме. От пользователя требуется только инициировать этот процесс - все остальные действия (поиск доступных обновлений, изменение конфигурации) система выполнит самостоя- тельно. Обновление в режиме поддержки с возможностью изменения Если конфигурация находится на поддержке с возможностью изменения, система пытается по максимуму, на основе имеющейся у нее информации, сформировать правила объединения. Наряду с этим она предоставляет разработчику возможность скорректировать те случаи, когда нельзя принять однозначного решения о том, каким же образом выполнять обновление. Этот процесс очень напоминает обычное сравнение/объеди- нение конфигураций, но имеет некоторые особенности. Как говорилось в самом начале раздела, в общем случае существует три ситуации, которые возникают при анализе изменений одного и того же объекта конфигурации, выполненных как пользователем, так и постав- щиком: когда ни один из них не менял объект, когда объект изменен одним из них, и когда они оба изменили объект. Кроме этого, в конфигурации пользователя существует три правила поддержки, которые определяются разработчиком и могут быть дополнительно настроены пользователем. В результате при сравнении конфигураций могут возникнуть десять различных ситуаций, девять из которых разрешаются однозначно (рис. 21.17). На приведенном рисунке показаны три правила поддержки. Для каждого правила указаны возможные ситуации с изменением объекта: серый цвет обозначает, кто (пользователь или поставщик) вносил изменения в объект. Большой прямоугольник снаружи показывает, чьи изменения будут в результате приняты по умолчанию. Если объект не изменялся или изменялся только в конфигурации поль- зователя (первая и вторая строки), тогда будет использовано правило объединения Взять из конфигурации пользователя. Если объект изменялся в конфигурации поставщика, то будет использовано правило Взять из новой конфигурации поставщика, за исключением случая, когда объект снят с поддержки. В этом случае - Взять из конфигурации пользователя. Если объект был изменен в обеих конфигурациях, но снят с подде- ржки, тогда тоже будет использовано правило Взять из конфигурации пользователя. Том 2
^^^^Механизм1поставки1и1поддержки1прикладн£|хфешений Объект поставщика не редактируется =1________________ Пл» Пет Объект Объект поставщика редактируется с сохранением поддержи ________________ Пл» Пет Объект Объект поставщика снят с под держи __________ Пл» Пет Объект Пл» 061 Пл» Пет Объект Рис. 21.17. Варианты действий при обновлении конфигурации пользователя Таким образом, остается один спорный момент, когда объект был изменен в обеих конфигурациях и он находится на поддержке поставщика с возможностью обновления. В этом случае по умолчанию устанавлива- ется правило обновления Взять из новой конфигурации поставщика. Для того чтобы пользователю было легче разобраться в отличиях, сущес- твующих в конфигурациях, окно объединения конфигураций имеет дополнительные возможности (рис. 21.18). Г*1 Обновление Основная конфигурация - Новая конфигурация поставщика - □ X Основная конфигурация I I Новая конфигурация постав... ' Режим объединения и порядок подчинена.. I S О’--' УправлениеТорговлей t.J УправлениеТорговлей $ 0 Свойства $ Свойства @ Поставщик Поставщик Взять из новой конфигурации поставщика^ JZI 0 Версия ^1 Версия Взять из новой конфигурации поставщика j Ue* Общие I 'Э Общие ЯЗЫКИ | 'У ЙЗ Языки I Поставщик: [Измеие1ыя разрешены | Статусы по соответствиям объектов----------------------------------------------------------------------------- | |Совпадающие | [Различающиеся | [Неопределенные | |В основной | | В новой конфигу... 1Й1 Изменен порядок Статусы по истории объектов----------------------------------------------------------------------------------- !_| Неизмененные ^Измененные ^Неопределенные +J Добавленные ~1 Удаленные Itl Изменен порядок | Действия -11 Фильтр 11 Настройка | | Выполнить | [ Закрыть 11 Справка | Рис. 21.16. Окно объединения конфигураций so
Гл~ава>21!!Поставка1прикладн£|х4решений Прежде всего, это информация о статусах по истории объектов, пред- ставленная в виде пиктограмм. Эта информация помогает понять, какие изменения и в какой конфигурации были выполнены для данного объекта. Например, на приведенном рисунке видно, что группы объектов конфигурации Свойства и Общие различаются. И пиктограммы статусов по истории объектов помогают понять, что свойство Версия было изменено в новой конфигурации поставщика, свойство Поставщик было изменено в обеих конфигурациях, а в конфигурации пользователя в группу Языки был добавлен новый объект Английский. Система автоматически включит объекты Версия и Поставщик в число объединяемых объектов и уста- новит режим объединения для этих объектов Взять из новой конфигурации поставщика. Кроме информации о статусах по истории объектов, разработчик имеет возможность подробно настраивать фильтр (кнопка Фильтр, см. рис. 21.18), позволяющий просматривать различные изменения и отличия в конфигу- рациях (рис. 21.19). Настройка фильтров просмотра -Основнаяконфигурация <• Новая конфигурация поставщика----------------- Конфигурация:_________________________ ? « Конфигурация:__________ [УправлениеТорговлей] [^правление!орговлей Поставщик: [фирма "1С" ] ПостаВ|ЦИК: [Фирма "1 С" Версия [11,0.24 | Версия: [11,0.25 Фшътр: [Нят - Основная конфигурация <• Старая конфигурация поставщика------------ Конфигурация:_________________________ В j Конфигурация:__________ [УгравлежеТорговлей ] [УправлежеТорговлей Поставщик: [Фирма "1С" ] ПостаВ|Цик: [Фирма ”1 С" Версия [П.0,24 ] Версия [11,0.24 Фильтр: [Показывать отличия в конфигурациях - Новая конфигурация поставщика <• Старая конфигурация поставщика---- j* । Конфигурация__________________________ В ц Конфигурация:__________ [УгравлежеТорговлей | [УправлежеТорговлей Поставщик: [фирма "1С" ] pf^p Поставщик: [Фирма"IC"* Версия [11.0.25 | Версия [11,0.24 Фильтр: [Показывать отличия в конфигурациях О Показывать только дважды измененные свойства ОК 11 Отмена 11 Справка | Рис. 21.19. Настройка фильтров просмотра Для того чтобы понять назначение этого фильтра, забежим немного вперед и поясним, что происходит при обновлении конфигурации, стоящей на поддержке. В процессе обновления конфигурации, находящейся на поддержке, помимо основной конфигурации и новой конфигурации поставщика, участвует также и старая конфигурация поставщика, которая хранится в информационной базе (рис. 21.20).
Информационная база Рис. 21.20. Конфигурации, участвующие в обновлении В ходе обновления основной конфигурации новая конфигурация поставщика перезапишет собой старую конфигурацию поставщика. Таким образом, разработчик всегда имеет возможность сравнить основную конфигурацию с конфигурацией поставщика (Конфигурация ► Сравнить конфигурации). При выполнении обновления фильтр как раз и предоставляет возможность отобразить в различных сочетаниях любые изменения, присутствующие в этих трех конфигурациях (рис. 21.21). Рис. 21.21. Изменения, отображаемые с помощью фильтров просмотра Помимо ручной настройки фильтров для каждой пары сравниваемых конфигураций настройка фильтров позволяет использовать несколько готовых шаблонов, отображающих следующие ситуации. Отличие основной и новой конфигурации поставщика от старой конфи- гурации поставщика. Этот шаблон фильтров позволяет понять, насколько изменения, вносимые в конфигурацию с обеих сторон, изменят преды- дущую версию конфигурации поставщика (рис. 21.22). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 21.22. Отличие основной и новой конфигурации поставщика от старой конфигурации поставщика Отличие основной конфигурации от новой конфигурации поставщика. Этот шаблон фильтров позволяет понять, как изменится основная конфи- гурация после обновления (рис. 21.23). Рис. 21.23. Отличие основной конфигурации от новой конфигурации поставщика Отличие основной конфигурации от старой конфигурации поставщика. Этот шаблон фильтров позволяет понять, насколько конфигурация постав- щика изменена пользователем (рис. 21.24). Рис. 21.24. Отличие основной конфигурации от старой конфигурации поставщика Том 2
^^^^Механизм1поставки1и1поддержки1прикладн£|хфешений Отличие новой конфигурации поставщика от старой конфигурации поставщика. Этот шаблон фильтров позволяет понять, какие изменения в конфигурацию внес поставщик по сравнению с предыдущей версией (рис. 21.25). Рис. 21.25. Отличие новой конфигурации поставщика от старой конфигурации поставщика При настройке фильтров просмотра пользователь может установить флажок Показывать только дважды измененные свойства. Назначение этого флажка состоит в том, чтобы показать только те свойства, которые одно- значно требуют ручной настройки объединения. Как уже говорилось выше, в 9 случаях из 10 механизм поставки и под держки может однозначно сфор- мировать правила объединения конфигураций. Единственный случай, который требует вмешательства человека, — когда один и тот же объект был изменен и в конфигурации пользователя, и в конфигурации постав- щика. Для выделения только таких отличий и предназначен этот флажок. Среди прочих отличий они отображаются жирным шрифтом, а при уста- новленном флажке - отображаются только эти свойства (рис. 21.26). Г) Обновление Основная конфигурация - Новая конфигурация поставщика □ X I Основная конфигурация I ' Новая конфигурация постав... I Режим объединения и поряаох подчиненн... । S Э @i) УправлениеТорговлей •£ <_> УправлениеТорговлей S @ Поставщик Поставщик Взять из новой конфигурации поставщика Редактирование: [ | Поставщик: [Изменения резрешены ] Статусы по соответствиям объектов------------------------------------------------------------------------------- | [Совпадающие | [Различающиеся | [Неопределенные | |В основной | | В новой конфн-ц.. 1ТТ| Изменен порядок Статусы по истории объектов------------------------------------------------------------------------------------- ___I Неизмененные ^[Измененные ^Неопределенные +1 Добавленные -I Удаленные Itl Изменен порядок | Действия -11 Фильтр 11 Настройка | | Выполнить 11 Закрыть 11 Спревка | Рис. 21.26. Отображение дважды измененных свойств Правила, заданные пользователем при обновлении объектов конфигурации, находящейся на поддержке с возможностью изменения, запоминаются и автоматически устанавливаются при следующем обновлении конфигу- рации.
Гл~ава>21!!Поставка1прикладн£|х4решений Особенности обновления Добавление объектов поставщиком При выполнении сравнения конфигураций в процессе обновления выпол- няется установка соответствия объектов конфигурации поставщика объектам конфигурации пользователя. Это соответствие устанавливается по внутренним идентификаторам объектов, которые не доступны разра- ботчику для редактирования. При добавлении поставщиком нового объекта и последующем обнов- лении этот объект будет создаваться также и в конфигурации пользователя, причем стандартно, с тем же самым идентификатором, что и в конфигу- рации поставщика. Удаление объектов поставщика пользователем Для того чтобы пользователь мог удалить в своей конфигурации объект поставщика, он должен предварительно снять его с под держки, установив для него соответствующее правило под держки. Причем снят с под держки должен быть как сам объект непосредственно, так и все его подчиненные объекты. Возврат к объекту поставщика Иногда требуется вернуться к тому объекту, который был удален. Рассмотрим следующую ситуацию: пользователь снял с поддержки и удалил объект поставщика. В этот момент он понял, что ошибся, и решил восстановить объект поставщика обратно. В такой ситуации в принципе существует два возможных решения: вернуться к конфигурации базы данных (Конфигурация ► Конфигурация базы данных ► Вернуться к конфигурации БД) и выполнить сравнение/объеди- нение с конфигурацией поставщика (Конфигурация ► Сравнить, объединить с конфигурацией из файла). Рекомендуется использовать второй способ - сравнение/объединение с конфигурацией поставщика. Удаление объектов поставщика поставщиком В процессе выпуска новых версий конфигурации поставщик может удалить некоторые объекты конфигурации, которые больше не пред- полагается использовать. Если конфигурация пользователя находится на полной поддержке, эти объекты будут автоматически удалены и в конфигурации пользователя. Если же конфигурация пользователя находится на поддержке с возмож- ностью изменения, то эти объекты будут удалены только в том случае, если они идентичны объектам поставщика, то есть если пользователь не изменял их в своей конфигурации. В противном случае они не будут помечены для участия в обновлении, но пользователь может установить эту пометку вручную при необходимости.
Обновление модулей При обновлении конфигурации пользователя система никогда по умол- чанию не устанавливает правило объединения Объединять... Однако такое правило может быть установлено пользователем в том случае, когда, например, изменение модуля выполнялось как поставщиком, так и поль- зователем. О такой возможности нужно помнить при модификации тиражных решений и соблюдать некоторые правила, которые облегчат пользователю обновление конфигурации. Во-первых, нужно помнить о том, что при объединении модулей соот- ветствие между процедурами и функциями устанавливается по именам, однако процедура по умолчанию не будет сопоставлена функции, имеющей то же имя, и наоборот. Поэтому в ситуации, когда процедуру необхо- димо преобразовать в функцию, следует изменять и имя новой функции. При этом старая процедура будет удалена, а новая функция (с новым именем) создана в конфигурации пользователя. В противном случае, если пользователь выберет режим Объединять... и не установит ручное соот- ветствие процедур и функций, в результате объединения в модуле может оказаться как старая процедура, так и новая функция с тем же именем, что нарушит работоспособность конфигурации. Во-вторых, если в конфигурации поставщика экспортируемая функция была перенесена из одного общего модуля в другой, то ей также следует дать новое имя. В противном случае, если пользователь редактировал эти модули и выбрал для них правило объединения Объединять..., перене- сенная процедура после обновления, возможно, окажется в обоих модулях, что также нарушит работоспособность конфигурации. Обновление конфигурации поставщика Иногда может потребоваться при обновлении конфигурации, стоящей на под держке с возможностью изменения, обновить только старую конфи- гурацию поставщика, хранящуюся в информационной базе, не изменяя при этом основную конфигурацию. Такая возможность может понадобиться, если конфигурация поставщика используется, например, в качестве некой справочной конфигурации, с которой постоянно выполняется сравнение, а изменения в основную конфигурацию вносятся только вручную. В этом случае можно выпол- нить обновление конфигурацией поставщика и в окне сравнения с конфигурацией поставщика снять все флажки участия в объединении. Тогда объединение с основной конфигурацией выполнено не будет, но новая конфигурация поставщика будет сохранена в информационной базе. Профессиональная разработка в системе «1С:Предприятие 8»
Рекомендации по модификации конфигурации поставщика Модифицируя конфигурацию поставщика, всегда следует соблюдать нестолько рекомендаций, которые помогут упростить ее обновление в дальнейшем. Снятие объектов с поддержки Без особой необходимости не рекомендуется снимать объекты с подде- ржки. Снятие объекта с поддержки наверняка требуется в том случае, когда нужно удалить этот объект. Также снятие объекта с поддержки может потребоваться, если дальнейшее развитие объекта предполагается производить собственными силами. В остальных случаях нормальным правилом для объекта является Объект поставщика редактируется с сохра- нением поддержки. Удаление объектов поставщика К удалению объектов поставщика следует относиться осторожно, как к любому другому удалению. Алгоритмы конфигурации могут использо- вать эти объекты «для внутренних нужд», и их удаление может привести к нарушению логической целостности конфигурации. Перед удалением следует убедиться, что эти объекты действительно не задействованы больше в логике конфигурации. Сортировка объектов метаданных Серьезное изменение порядка поддерева объектов может привести к тому, что выбор правила Порядок из конфигурации поставщика не гарантирует полного сохранения порядка после объединения. Если сохранение данного порядка представляется критичным, можно после обновления конфигу- рации выполнить объединение с конфигурацией поставщика, вызываемое из диалога настройки поддержки (Конфигурация ► Поддержка ► Настройка поддержки... кнопка Сравнить, объединить). Повторное выполнение объединения (после обновления) приведет к полному восстановлению порядка. Сопоставление новых объектов Если есть необходимость, новым объектам поставщика можно поставить в соответствие объекты, существующие в конфигурации пользователя. Например, не дожидаясь выхода новой версии конфигурации, пользова- тель самостоятельно добавил новый документ, который затем появился в конфигурации поставщика. В этом случае при обновлении пользователь может сопоставить новый документ поставщика тому документу, который уже существует в его конфигурации. Однако следует очень аккуратно относиться к этой процедуре, поскольку впоследствии изменить данное соответствие будет невозможно. Том 2
^^^^Механизм1поставки1и1поддержки1прикладн£|хфешений Переименование объектов Не рекомендуется без серьезной необходимости переименовывать объекты метаданных, процедуры и функции. Следует помнить, что имя, используемое в модуле для доступа к какому-либо объекту, может формироваться динамически, и обнаружение и исправление таких мест могут представлять собой сложную задачу. Объединение объектов Следует помнить, что действительное объединение таких объектов, как формы, макеты или интерфейсы, то есть установка для них правил Объединять с приоритетом..., является достаточно сложным процессом и требует обязательного ручного контроля результатов. Рекомендуется пользоваться средствами формирования визуального отчета о сравнении таких свойств для анализа различий. Иногда может оказаться целесооб- разным отказаться от объединения и заново внести доработки в новую версию формы поставщика. изменение общих модулей При разработке собственных универсальных процедур рекомендуется располагать их в новых модулях, а не помещать в модули поставщика. Если возникает необходимость модификации модулей поставщика, при обновлении следует помнить о возможности настройки объединения на уровне отдельных процедур. По аналогии с модификацией модулей рекомендуется по возможности добавлять новые процедуры и функции, а не изменять существующие. Если подобное невозможно (например, требуется модификация обра- ботчика события), следует оформлять добавляемый код в отдельную процедуру, а в процедуре поставщика вставлять только ее вызов. Использование буфера обмена Не следует обновлять объекты, используя копирование через буфер обмена. Это не только нарушит нормальное функционирование механизма поддержки, но может привести к нарушению логической целостности конфигурации и потере данных. Общие технологические сведения о поддержке Конфигурация, стоящая на поддержке, всегда содержит в себе конфигу- рацию поставщика. Если конфигурация находится на полной поддержке, это фактически означает, что конфигурация пользователя полностью совпадает с конфигурацией поставщика. В этом случае считается, что конфигурация, находящаяся на полной поддержке, и является в то же время конфигурацией поставщика. Из этого также следует, что
конфигурация, находящаяся на полной поддержке, может находиться на поддержке только у одного поставщика. Если пользователь включает возможность изменения, это означает, что конфигурация пользователя теперь может отличаться от конфигурации поставщика. Поэтому при включении возможности изменения конфигу- рация поставщика создается в явном виде и становится частью основной конфигурации пользователя (рис. 21.27). Рис. 21.27. Хранение конфигурации поставщика в информационной базе После выполнения обновления конфигурации базы данных конфигурация поставщика также будет присутствовать и в конфигурации базы данных (рис. 21.28). Рис. 21.26. Хранение конфигурации поставщика в информационной базе Очевидно, что это приведет к определенному росту объема информа- ционной базы. Также это приведет, например, к росту объема файла конфигурации (*.cf), постольку фактически теперь будет выгружаться не одна, а две конфигурации: основная конфигурация и конфигурация поставщика (рис. 21.29). Конфигурация поставщика является неотъемлемой частью основной конфигурации, и единственный случай, тогда основная конфигурация будет отделена от конфигурации поставщика, - это формирование файла
поставки. Поддержка конфигураций «не наследуется», поэтому если из конфигурации, стоящей на поддержке, будет сформирован файл поставки, то в него будет включена только основная конфигурация, без конфигурации поставщика (рис. 21.30). Рис. 21.29. Конфигурация поставщика выгружается вместе с основной конфигурацией Рис. 21.30. Файл поставки не содержит конфигурацию поставщика В общем случае конфигурация может находиться одновременно на подде- ржке нескольких конфигураций поставщиков. Это значит, что основная конфигурация будет хранить в себе также и конфигурацию каждого поставщика, на поддержке которой она находится (рис. 21.31). Информационная база Рис. 21.31. Хранение конфигураций поставщиков в информационной базе Профессиональная разработка в системе «1С:Предприятие 8»
В информационной базе конфигурации поставщиков хранятся в сжатом виде, и при снятии конфигурации с поддержки соответствующая конфи- гурация поставщика удаляется из информационной базы. Однако особенность работы файловой базы данных «1С:Предприятия» заключается в том, что при этом размер файла ‘.1CD не уменьшается. Свободное место, появившееся в результате удаления конфигурации поставщика, будет использовано в дальнейшем для размещения, например, данных базы данных и для других целей. То, что объем конфигурации уменьшился, можно заметить по файлу выгрузки конфигурации (*.cf). Сценарии поддержки Теперь рассмотрим несколько сценариев использования механизма поставки и поддержки прикладных решений. Вертикальная поддержка Сценарий вертикальной поддержки является одним из самых простых и заключается в следующем. Поставщик 1 создает некоторое типовое решение. Поставщик 2 ставит свою конфигурацию на поддержку конфи- гурации поставщика 1 (с возможностью изменения) и дорабатывает в соответствии с пожеланиями конечного пользователя. Конечный поль- зователь работает в конфигурации, стоящей на полной поддержке поставщика 2 (рис. 21.32). Рис. 21.32. Вертикальная поддержка Типичный пример применения такого сценария: партнер поставляет поль- зователям доработанное типовое решение фирмы «1С» (рис. 21.33). Том 2
Рис. 21.33. Пример использования вертикальной поддержки В этом случае партнер ставит свою рабочую конфигурацию на поддержку типового решения фирмы «1С» и вносит в нее необходимые доработки. По мере готовности своих версий и релизов партнер формирует файлы обновления для клиента. При выходе обновления типового решения фирмы «1С» партнер сначала обновляет свою рабочую конфигурацию, а затем из своей обновленной рабочей конфигурации формирует файл обновления для клиента. В силу своей простоты такой способ поддержки является наиболее приемлемым для конечного пользователя: от конечного пользователя не требуется усилий по объединению изменений, выполняемых каждым из поставщиков. От поставщика 2 он получает полностью готовое прикладное решение, которое обновляется в автоматическом режиме, так как стоит на полной поддержке. С другой стороны, такой сценарий поддержки удобен и для поставщика 2: поскольку пользователь не имеет возможности вносить изменения в прикладное решение, поставщик 2 может быть уверен, что у пользователя не возникнет сложностей при его обновлении. Потенциальным минусом такого сценария является необходимость после- довательного «спуска» изменений сверху вниз. Изменения, внесенные поставщиком 1, сначала должны быть приняты на более низком уровне - на уровне поставщика 2, и только после этого поставщик 2 сможет пере- дать их на уровень пользователя. Очевидно, что если поставщик 2 внес значительные изменения в конфигурацию поставщика 1, то очередное обновление не всегда может быть выполнено достаточно оперативно.
_____________________1 Последовательность установки вертикальной поддержки Для того чтобы установить вертикальную поддержку для прикладного решения пользователя, нужно выполнить следующую последователь- ность действий (рис. 21.34). Рис. 21.34. Последовательность установки вертикальной поддержки Поставщик 2 устанавливает у себя дистрибутив прикладного решения поставщика 1 и создает информационную базу с конфигурацией, стоящей на полной поддержке поставщика 1. После этого он переводит конфигу- рацию в режим поддержки с возможностью изменения и модифицирует прикладное решение. Затем поставщик 2 создает дистрибутив своей рабочей конфигурации, который и передает пользователю. Горизонтальная поддержка Сценарий горизонтальной поддержки является более сложным для поль- зователя, но зато и более оперативным. Суть его заключается в том, что конфигурация пользователя находится на поддержке у двух поставщиков одновременно (рис. 21.35). Сложность такой схемы для пользователя заключается в том, что его конфигурация может находиться только на поддержке с возможностью изменения. А это требует от него определенных усилий по правильной настройке правил поддержки и непосредственного участия в процессе обновления, так как оно будет выполняться только в полуавтоматическом режиме. Зато неоспоримым преимуществом является оперативность внесения изменений. В отличие от сценария вертикальной поддержки, пользова- телю не нужно ждать, пока один поставщик внесет в свою конфигурацию изменения другого поставщика и сформирует для пользователя файл обновления. При горизонтальной поддержке пользователь может полу-
чать и устанавливать обновления от каждого из поставщиков независимо (рис. 21.36). Рис. 21.35. Горизонтальная поддержка Рис. 21.36. Обновление при горизонтальной поддержке Последовательность установки горизонтальной поддержки Для того чтобы установить горизонтальную поддержку для прикладного решения пользователя, нужно выполнить следующую последователь- ность действий (рис. 21.37). Рис. 21.37. Последовательность действий для установки горизонтальной поддержки Профессиональная разработка в системе «1С:Предприятие 8»
Пользователь устанавливает у себя дистрибутив прикладного решения поставщика 1 и создает информационную базу с конфигурацией, стоящей на полной поддержке поставщика 1. После этого он пере- водит конфигурацию в режим поддержки с возможностью изменения. Затем он устанавливает дистрибутив поставщика 2 и выполняет сравнение/ объединение текущей конфигурации с файлом поставки, содержащимся в дистрибутиве поставщика 2. При выполнении сравнения/объеди- нения будет задан вопрос о возможности постановки конфигурации на поддержку поставщика 2, на который нужно ответить утвердительно. После завершения сравнения/объединения текущая конфигурация будет находиться на поддержке двух поставщиков одновременно с возмож- ностью изменения. Особенности горизонтальной поддержки Установка соответствия объектов Как правило, конфигурации поставщиков, на поддержку которых ставится текущая конфигурация, имеют логически совпадающие объекты. Поэтому важно убедиться, что они будут связаны с одним и тем же объектом текущей конфигурации. Особенность заключается в том, что при первичном выполнении сравнения/объединения с конфигурацией поставщика сопоставление объектов конфигураций будет выполняться только по именам объектов, которые в разных конфигурациях постав- щиков могут различаться. Если это так, то следует выполнить ручную установку соответствий объектов конфигураций. Сделать это нужно именно при первичном объединении, поскольку в дальнейшем это соот- ветствие изменить будет невозможно. Настройка поддержки Основной сложностью горизонтальной поддержки является то, что режим поддержки объекта задается относительно каждой конфигурации постав- щика, в которой он присутствует (рис. 21.38). Поддержка корневого объекта Прежде всего, нужно решить, на поддержке какой конфигурации поставщика будет находиться корневой объект текущей конфигурации. Соответственно, при первичном объединении с другими конфигура- циями следует снимать флажок со свойств конфигурации и в дальнейшем устанавливать для корня конфигурации (отключив рекурсию) режим поддержки Снят с поддержки. Том 2
^^^^Механизм1поставки1и1поддержки1прикладн£|хфешений Настройка поддержки □ X Конфигурация находится на поддержке с возможностью иеменения I J [ Снять с поддержки 11 Явыки поддержки | Конфигурация поставщика: Поставщик: [Поставщик 2 Версия: [11,0.4.6 - Н астройка правил поддержки объектов - Объект I УправлениеТорговлей I Управле...' Управле... О УправлениеТорговлей х Редактируется с сохра ciudm ... 1 $ *• Общие в' В? Константы За АдресатыПолученияОтчетаПоЖур... [ i Редактируется с сохра ciudm ... ] э 1 В? АрхивироватьЧекиККМПриЗакрыг... » Редактируется с сохранением... I Ва ВалютаРегламенгироеанногоУчята Э Снят с поддержки 8 В? ВалютаУправленческогоУчета е Редактируется с сохра юн см... а а Ва ВедетсяРаботаЧереэТорговыхПр... » Редактируется с сохранением... а а За ВидМаксимальноДопуспмнхЦен... i Редакгцэуется с сохранением... i • В? ВидМаксимальноДопуспмнхЦен... » Редактируется с сохранением... « Правила поставщика--------------------------------------------------------------------------------------- Объект редактируется > • Объект на рекомендуется редактировать Объект на редактируется Правила пользователя------------------------------------------------------------------------------------- । Объект не редактируется * Объект редактируется с сохранением поддержки -j Объект снят с поддержки | Сравнить, объединить 11 Открыть 11 Сохранить в Файл | [ Закрыть 11 Справка | Рис. 21.38. Настройка поддержки нескольких поставщиков Поддержка пересекающихся объектов С большой долей вероятности часть объектов будет присутствовать одно- временно в нескольких конфигурациях поставщиков. В этом случае следует настроить правила поддержки исходя из перечисленных вари- антов: Объект должен полностью соответствовать одной из конфигураций поставщика. В этом случае для данной конфигурации устанавливается правило под держки Объект не редактируется, а для остальных - Объект снят с поддержки; Объект должен редактироваться с сохранением поддержки одной из конфигураций. В этом случае для этой конфигурации устанав- ливается правило Объект редактируется с сохранением поддержки, а для остальных - Объект снят с поддержки; Объект должен редактироваться и иметь возможность поддержки разных конфигураций. В этом случае для всех конфигураций устанав- ливается правило Объект редактируется с сохранением поддержки; Поддержка объекта не требуется. В этом случае для всех конфигу- раций устанавливается правило Объект снят с поддержки. При установке правил поддержки следует учитывать, что так как объект связан с объектами нескольких конфигураций поставщиков, то, для того чтобы в одной из них установить правило Объект поставщика не редак- тируется, нужно сначала в остальных конфигурациях снять этот объект с поддержки.
_____________________1 МЕХАНИЗМ СОЗДАНИЯ КОМПЛЕКТОВ ПОСТАВКИ Для того чтобы пользователь мог установить у себя прикладное решение, разработчик должен передать ему необходимые файлы. Состав этих файлов может быть самым разным, так же как и их назначение. Одни файлы могут предназначаться для того, чтобы обеспечивать обновление или установку прикладного решения. Другие просто могут содержать справочную информацию и отображаться в специальных случаях. Третьи могут предназначаться для того, чтобы пользователь самостоятельно использовал их при необходимости. Механизм создания комплектов поставки позволяет автоматизировать работу по созданию наборов таких файлов и размещению их на компью- тере пользователя. Основными файлами, участвующими в поддержке прикладного решения пользователя, являются файл поставки и файл обновления. Файл поставки Файл поставки представляет собой файл конфигурации *.cf, сформиро- ванный специальным образом в информационной базе разработчика. В общем случае файл поставки имеет два назначения: постановка конфи- гурации на под держку и обновление конфигурации, стоящей на под держке поставщика. Постановка конфигурации на поддержку с помощью файла поставки возможна двумя способами (рис. 21.39). Рис. 21.39. Постановка на поддержку с помощью файла поставки Во-первых, можно загрузить файл поставки в произвольную информаци- онную базу командой Конфигурация к Загрузить конфигурацию из файла... В этом случае текущая конфигурация информационной базы будет
полностью заменена новой конфигурацией, которая стоит на полной поддержке конфигурации поставщика. Во-вторых, можно выполнить сравнение/объединение текущей конфигу- рации с файлом поставки командой Конфигурация ► Сравнить, объединить с конфигурацией из файла... Полученная в этом случае конфигурация будет также стоять на поддержке конфигурации поставщика, но уже с возмож- ностью изменения. Постановку на поддержку можно выполнить только с помощью файла поставки. Можно сказать, что файл поставки является основным инстру- ментом, с помощью которого осуществляются действия по поддержке пользовательских конфигураций. Как уже говорилось, этот файл может быть использован не только для постановки на поддержку, но и для обновления конфигурации пользователя, то есть для перехода с одной версии конфигурации, стоящей на поддержке, на версию файла поставки. Он содержит в себе полную конфигурацию поставщика и дополни- тельные данные, необходимые для поддержки. Поэтому обновление с помощью файла поставки возможно с любой версии конфигурации до версии файла поставки, в том числе с более поздней версии до более ранней (рис. 21.40). Рис. 21.40. Использование файла поставки Создание файла поставки Файл поставки формируется в информационной базе разработчика. Перед тем как сформировать файл поставки, следует настроить поставку. ПОДРОБНЕЕ Раздел «Настройка поставки», стр. 582. После этого нужно выполнить команду Конфигурация ► Поставка конфигурации ► Создать файлы поставки и обновления конфигурации... В открывшемся окне нужно указать имя и размещение файла поставки и нажать кнопку Выполнить (рис. 21.41). Профессиональная разработка в системе «1С:Предприятие 8»
Создание файлов поставки и обновления конфигурации □ X Файл поставки-------------------------------------------------------------------------- ® Создать Файл поставки Имя Файла поставки |D:\DistributeVI1.0.4.5VICv8.cf |„,| - Файл обновления конфигурации------------------------------------------------------------ ® Создать Файл обновления конфигурации Имя Файла обновления: [D:\DistributeVI1.0.4.5VICv8.cfu |„,| Конфигурации для обновления:_________________^Добавить из предыдущих версий ф % Имя I Версия I Имя Файла |i Каталог файлов поставки ;| [ Выполнить 11 Отмена 11 Справка | Рис. 21.41. Создание файлов поставки и обновления Механизм поставки и поддержки обеспечивает определенную схему размещения файлов поставки и обновления на диске. По умолчанию они располагаются в подкаталогах, имеющих имена, соответствующие свойству Версия конфигурации (рис. 21.42). Свойства X 51X^1 " "______________________________________________ ▼Разработка: 4 Поставщик!____________________ Версия 11.0.4.4 Адрес каталога обновлений http://downloads.v8.1 c.ruAmpfcs/ ▼ Справочная информация: ’ Свойства X glX’Zi ~ *_________________________________ ▼ Разработка: л hiAiwiiiim тд^иик! । Версия 111.0.4.5| Адрес каталога обновлений | http://downJoads.vB-l c-ru/tmph/ | ▼ Справочная информация: ’ Рис. 21.42. Структура каталогов поставки и обновления Корневой каталог поставки можно задать с помощью кнопки Каталог файлов поставки. Следует иметь в виду, что корневой каталог поставки не сохраняется внутри самой конфигурации и будет изменен, например, при переносе файла информационной базы *.lcd на другой компьютер. Также следует сделать дополнение к процессу настройки поставки, который описан в разделе «Настройка поставки», стр. 582. В окне настройки поставки существует флажок Файл поставки может использо- ваться для обновления. По умолчанию этот флажок установлен, то есть по умолчанию с помощью этого файла можно как поставить конфи- гурацию на поддержку, так и обновить конфигурацию, уже стоящую на поддержке, до версии файла поставки. Том 2
Однако есть случаи, в которых требуется использовать файл поставки, не допускающий выполнение обновлений. Подобные случаи возникают, когда переход на новую версию конфигурации требует сложной обра- ботки базы данных. Рассмотрим одну из возможных ситуаций. Пусть при разработке очередной версии конфигурации было решено поменять тип реквизита РеквизитА справочника СправочникА с типа Строка на тип ссылки на справочник СправочникБ. Такую процедуру нельзя выполнить в рамках одного изменения структуры базы данных с предшествующим и/или последующим выполнением служебной обработки. Требуется сначала переход к некоторой промежуточной конфигурации, выполнение служебной обработки, а затем уже переход к конфигурации новой версии. Переход на новую версию будет представ- лять собой следующую последовательность действий: создание справочника СправочникБ; создание в справочнике СправочникА нового реквизита РеквизитНовый с типом ссылки на справочник СправочникБ; выполнение в полученной промежуточной конфигурации служебной обработки, которая для каждого элемента справочника СправочникА создаст новый (или выберет существующий) элемент справочника СправочникБ, присвоит реквизиту РеквизитНовый ссылку на него и очистит значение реквизита РеквизитА; удаление реквизита РеквизитА справочника СправочникА; переименование реквизита РеквизитНовый в РеквизитА. Таким образом, для выполнения этой последовательности действий потребуется создание двух комплектов обновления: для перехода к проме- жуточной версии и с промежуточной на конечную версию. Кроме этого, очевидно, потребуется и файл поставки для установки новой версии новыми пользователями. В этом случае такой файл поставки формируется со снятым флажком Файл поставки может использоваться для обновления, чтобы он случайно не мог быть использован для обновления в данной ситуации. Однако следует учитывать недостаточную гибкость этого средства. При снятии этого флажка пользователь не сможет при необходимости выполнить «обратное обновление» с более поздней версии с помощью такого файла поставки. Файл обновления Файл обновления представляет собой специальный файл *.cfu, форми- руемый также в информационной базе разработчика. Назначение файла обновления состоит лишь в том, чтобы выполнить обновление с неко- торых определенных версий конфигурации до версии файла обновления (рис. 21.43).
Гл~ава>21!!Поставка1прикладн£|х4решений Рис. 21.43. Использование файла обновления В отличие от файла поставки, файл обновления позволяет выполнять обновления только с тех версий, которые были указаны при его формиро- вании. Кроме того, файл обновления не позволяет выполнять обновление с более поздних версий до более ранних. Это связано с тем, что файлы обновления включают в себя не всю конфи- гурацию, а только те изменения, которые существуют между версией файла обновления и версиями, указанными при его формировании. За счет малого количества информации и дополнительного сжатия данных, которое используется в файлах обновления, они оптимальны для доставки обновления пользователям по низкоскоростным каналам связи. Создание файла обновления Для формирования файла обновления необходимо открыть окно создания файлов поставки и обновления командой Конфигурация ► Поставка конфи- гурации ► Создать файлы поставки и обновления конфигурации... Создание файла обновления требует обязательного указания файлов поставки предыдущих версий, для которых предназначено данное обновление (рис. 21.44). Создание файлов поставки и обновления конфигурации О X - Файл поставки-------------------------------------------------------------------- ЙСоздать файл поставки Имя файла поставки [П.0.26МСу8с1 ,~| - Файл обновления конфигурации----------------------------------------------------- @ Сознать Файл обновлена! конФигуреиии Имя Файла обновления [n.0.26MCv8cfu Конфигурации для обновления:__________________Ц Добавить из предьиаших версий fe) Имя Версия Имя Файла УправлениеТорговлей 11.0.24 11.a24MCv8.cf УправлениеТорговлей 11.Q25 11.a26MCv8.cf | Каталог Файлов поставки | | Выполнить 11 Отмена 11 Справка | Рис. 21.44. Создание файла обновления Файлы поставки предыдущих версий можно добавить вручную, если они находятся в произвольном месте, или воспользоваться возможностью
автоматического подбора, исходя из структуры каталогов поставки. Для этого нужно нажать кнопку Добавить из предыдущих версий (рис. 21.45). Список конфигураций X Имя Версия Имя Файла УправлениеТорговлей 11.0124 11.0.24VI Cv8.cl УправлениеТорговлей 11.0125 11.0.26\1Cv8.cf [ ОК | [ Отмена 11 Справка | Рис. 21.45. Добавление файлов поставки предыдущих версий Технологические особенности использования файлов поставки и обновления Обновление конфигурации, стоящей на под держке, может быть выполнено как с помощью файла поставки, так и с помощью файла обновления. Объем файла обновления меньше, чем объем файла поставки, но процесс обновления с помощью файла обновления не может выполняться быстрее, чем с помощью файла поставки. Дело в том, что при использовании файла обновления сначала на основе старой версии конфигурации поставщика и файла обновления созда- ется новая версия конфигурации поставщика. После этого выполняется сравнение/объединение текущей конфигурации с новой конфигурацией поставщика (рис. 21.46). Рис. 21.46. Выполнение обновления с помощью файла обновления При использовании файла поставки сразу же выполняется сравнение/ объединение. Поэтому в общем случае такой вариант обновления выполняется не медленнее, чем при использовании файла обновления (рис. 21.47). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 21.47. Выполнение обновления с помощью файла поставки При завершении процесса сравнения/объединения новая конфигу- рация поставщика замещает старую версию конфигурации поставщика. Если процесс сравнения/объединения будет прерван, то старая конфигу- рация поставщика не изменится. В платформе «1С:Предприятие» реализована очистка конфигурации от лишней информации, которая могла попадать в файлы поставки и обновления, существенно увеличивая их размер. Эта очистка выполняется в режиме проверки конфигурации (Конфигурация ► Проверка конфигу- рации...) при установленном флажке Проверка логической целостности конфигурации. Также возможно выполнение этой очистки из коман- дной строки. Для этого используется параметр /CheckConflg с ключом -ConfigLogicallntegrity. Если очистка выполняется для конфигурации, подключенной к хранилищу, то обязательно должен быть захвачен корень, в противном случае изменения сохранены не будут. Файл информационной базы Может возникнуть ситуация, когда пользователю для первоначальной установки прикладного решения необходимо передать не файл поставки, а непосредственно файл информа- ционной базы *.lcd, содержащий, например, готовую к работе, но пустую базу данных. В этом случае можно создать пустую информационную базу в файловом режиме работы, загрузить в нее файл поставки (Конфигурация ► Загру- зить конфигурацию из файла...) и передать пользователю файл *.lcd (рис. 21.48). Рис. 21.48. Формирование файла информационной базы Том 2
МеханизмГсоздания1комплектов1поставки Файл выгрузки информационной базы В процессе поставки не исключена ситуация, когда помимо файла поставки пользователю понадобится и демонстрационная информаци- онная база, стоящая на поддержке поставщика. В этом случае можно использовать некоторую информационную базу, содержащую демонс- трационные данные. Конфигурация этой базы не обязательно должна быть полностью идентична конфигурации разработчика, но расхождения между ними должны позволять производить обновление конфигурации базы данных (и самих данных) без проблем. Следует загрузить в эту базу файл поставки (Конфигурация ► Загрузить конфигурацию из файла...) и затем выгрузить информационную базу (Администрирование ► Выгрузить инфор- мационную базу...), рис. 21.49. Рис. 21.49. Формирование файла аыгрузки информационной базы Шаблоны конфигураций Система «1С:Предприятие» предоставляет пользователю возможность самостоятельно создавать информационные базы, содержащие необхо- димые конфигурации. Для этого «1С:Предприятие» поддерживает работу с каталогами шаблонов конфигураций. При создании новой информаци- онной базы пользователю открывается список шаблонов. В этом списке он может выбрать один из имеющихся шаблонов, который будет исполь- зован при создании информационной базы (рис. 21.50). Подобный подход позволяет создавать как пустые информационные базы с требуемой конфигурацией, так и информационные базы, содержащие определенный состав данных (например, демонстрационные базы).
Гл~ава>21!!Поставка1прикладн£|х4решений Добавление информационной базы/группы (•) Создание информациоююй базы из шаблона Выберите поставляемую конфигурацию для немала работы или демонстрационный пример для ознакомления СД Кмга "Разработка управляемого интерфейса" Ф LJ Демонстрационные конфигурации управляемого приложе •'? СО 1С:Управлениеторговлей ? СО УправлениеТорговлей ЦЙ 11-0-4.5 •S' СО У правление торговлей [демо] ® СО Демонстрационные конфигурации 8.1 Ф СО Профессиональная разработка в системе 1С:Предлрияти< I ~ПУ О Создание информационной базы без конфигурации для разработки новой конфигурации или загрузки выгруженной ранее информационной базы | < Назад ~| | Отмена | Рис. 21.50. Список шаблонов Каталогов шаблонов конфигураций может быть несколько. Пути к каталогам шаблонов конфигураций и обновлений хранятся в конфигу- рационном файле программы запуска - ICEStart.cfg. ПОДРОБНЕЕ Документация «1С:Предприятие 8.2. Руководство администратора», Приложение 3.5 «Описание и расположение служебных файлов - ICEStart.cfg». Изначально после установки платформы каталог шаблонов конфигураций не определен. При первой установке шаблона конфигурации программа установки будет предлагать установить ее в стандартный каталог C:\Documents and Settings\<PlMH попьзователя>\АррПсайоп Data\1C\1Cv82\ tmplts. Если при первом запуске выполнялся еще и импорт списков информационных баз версий 8.0 и 8.1, то сначала добавляются существу- ющие на компьютере каталоги шаблонов конфигураций для этих версий, а затем каталог C:\Documents and Settings\<HMB пользователя>\АррНсайоп Data\1 С\1 Cv82\tmplts. Поскольку каталогов шаблонов может быть нестолько, в настройке диалога запуска системы можно указать сразу несколько каталогов шаблонов конфигураций и обновлений. При этом пользователь может добавить в этот список и свои собственные каталоги. Это выполняется в диалоге настройки запуска, вызываемом по кнопке Настройка... в окне запуска (рис. 21.51). Если в диалоге настройки указано несколько каталогов шаблонов, то при установке новой конфигурации платформа будет предлагать устанав- ливать ее шаблон в тот каталог, который указан в этом списке первым. По этой причине порядок следования каталогов имеет значение. При необходимости его можно поменять, поставив нужный каталог шаблонов на первое место. Каталог шаблонов может иметь произвольную структуру, но рекоменду- ется придерживаться следующей иерархии подкаталогов (рис. 21.52).
Настройка диалога запуска Настройка отображений списка информационных баз: О Отображать в виде дереве @ Сортировать по неименованно Q Показывать последние выбранные информационные базы X каталоги шаблонов конфигураций и обновлений: ф X I О DA1C\e2\cfema C:\nogr аю FfesMcvol Mmp*$ Списки общих информационных баз: Используемые версии Для версии Испогьзовапъ версию 0 Использовать аппаратную лицензию (ключ защиты)___________ [ ОК 11 Отмена | Рис. 21.51. Настройка расположения списка шаблонов Рис. 21.52. Структура каталога шаблонов Профессиональная разработка в системе «1С:Предприятие 8»
Например, реальный каталог шаблонов «ЮЛредприятия» может выгля- деть следующим образом (рис. 21.53). ] Файл Правка Вид Избранное Сервис Справка ] ф Назад ’ * $ | Поиск Папки | ]Afl^cT|^n^oairn»i^n^etft^V^№^pplicationDateUCUCvK\bTpteUc\frade\l^^^ □ал I Задачи для файлов и гы * '{$ Создать новую папку 0 Опубликовать папку в ЁЗ Открыть общий доступ к этой папке Имя А Е) AddDoc £)ConvlO_3 & Exchange ЙМАрр BlCvS.cf HlCvS.dt BlcvS.mft 1Ю ReadMe Размер | Тип Папка с файлами Папка с файлами Папка с файлами Папка с файлами Файл "CF" Файл"DT* Файл "MFT" Текстовый документ 70 857 КБ 73 958 КБ 1КБ 7КБ Ча Переход | Изменен 04.08.2010 11:45 04.08.2010 11:45 04.08.2010 11:45 04.08.2010 11:45 23.07.2010 14:52 23.07.2010 14:55 23.07.2010 14:52 23.07.2010 14:49 Другие места Й trade iQ Мои документы Й Общие документы 3 Мой компьютер S3 Сетевое окружение у| Рис. 21.53. Каталог шаблонов В корне каталога шаблонов находятся папки поставщиков. Каждый поставщик самостоятельно может выбрать имя для своего каталога, но для исключения повторений фирма «1С» регистрирует названия разработчиков - поставщиков прикладных решений (конфигураций). Регистрируется название для использования в наименованиях шаблонов конфигураций и название для использования в именах файловых каталогов. Рекомендуется выбирать имена каталогов в формате MS-DOS (8.3). Например, если организация поставщика называется Фирма «Сервис», то каталог поставщика может иметь название Service. Каталог поставщика Фирма «1С» имеет название 1С. В каталоге поставщика могут быть расположены каталоги, соответс- твующие прикладным решениям, выпускаемым поставщиком. Каждый каталог имеет свое уникальное название. Например, если прикладное решение называется Издательство, то каталог этого прикладного решения может называться Publishing. В каталоге прикладного решения содержатся каталоги версий этого прикладного решения. Каждый каталог версии имеет имя, формируемое на основе номера версии этого прикладного решения, в котором символы точка «.» заменяются символами подчеркивания «_». Например, каталог версии 1.0.6.1 может иметь имя 1_0_6_1. Внутри каталога версии может находиться набор файлов, которые имеют отношение к данной версии прикладного решения. Эти файлы по сути дела представляют собой набор файлов поставки и применительно к данной структуре называются шаблоном. В составе этих файлов есть файл *.mft, который называется манифестом и описывает, каким образом Том 2
система «1С:Предприятие» может использовать файлы, содержащиеся в шаблоне. Возможны следующие способы использования: во-первых, файл поставки (*.cf) может быть использован для создания новой информационной базы с конфигурацией, стоящей на полной под держке поставщика. Для этого он должен быть соответствующим образом описан в манифесте; во-вторых, файл выгрузки базы данных (*.dt) может быть использован для создания демонстрационной информационной базы с конфигура- цией, стоящей также на полной под держке поставщика. Для этого он должен быть соответствующим образом описан в манифесте; в-третьих, файл обновления (*.cfu) может быть использован системой для автоматического (или полуавтоматического) обновления приклад- ного решения. Для этого в каталоге шаблонов, где находится файл обновления, должен существовать манифест, содержащий опреде- ленную информацию. Остальные файлы (кроме *.cf, *.cfu и *.dt), содержащиеся в шаблоне, предназначены для ручного использования - они могут содержать допол- нительную информацию об устанавливаемой версии, вспомогательные файлы и обработки и т. д. Манифест Файл манифеста используется системой «1С:Предприятие» при формиро- вании списка шаблонов и при поиске доступных обновлений прикладного решения. Файл манифеста может иметь произвольное имя и расширение mft Манифест является текстовым файлом, использующим кодировку UTF-8 для поддержки нескольких языков. Структура манифеста включает использование зарезервированных пара- метров и секций. В общем виде манифест имеет следующую структуру: Vendor=... Name=... Version=... AppVersion = ... [Config 1] Catalog=... Destinations.. Sources.. [Config2]
Гл~ава>21!!Поставка1прикладн£|х4решений В начале манифеста содержатся четыре параметра: Vendor - имя поставщика. Совпадает со значением свойства конфигу- рации Поставщик; Name - наименование прикладного решения. Совпадает со значением свойства конфигурации Имя; Version - версия конфигурации. Совпадает со значением свойства конфигурации Версия; AppVersion - версия платформы, например, 8.2. За этими параметрами могут следовать одна или нестолько секций, имеющих стандартные имена Config 1, Config2 и т.д. Каждая из этих секций, в свою очередь, описывает для «1С:Предприятия» отдельный шаблон, который может быть использован пользователем при создании новой информационной базы (рис. 21.54). Ifr lrv8Блокнот Файл Правка Формат Вид Справка □Ю1 ifendor-Фмрма "IC" На»е=УправлениеТорговлей AppVersion-8.2 [Configl]^ Сеса1одж1С*!кХправление торговлей/Управление торговлей Dest inat ion=W\Trade Source=lCve.cf S, [Соп±1д2]чъ Catalog-1C :<Ущ>авление торговлей/Управление торговлей |демо) Destination=lCV<l₽reoTrd Source-ICve.dt *». S, ___________ Добавление информационной бавы/группы (*) Создание информационной базы ие шаблона Выберите поставляемую конфигурацию для немала работы или демонстрационный пример для ознакомления Ф Q Кни*а'Разработка убавляемого жтерфейса" л <+> СЗ Демонстрационные конфигурации управляемого прилс_ О S..L3 Управленнеторговлей 11.0.4.5 L3 Управлениэторго8лей(аемо) *"Ч±1Й1 11.0.4.5 •£' СЭ Демонстрационньв конфигурации 8.1 $ СЗ Профессиональная разработка в системе 1С:Предпри5 — X О Создание информационной базы баз конфигурации для разработки новой конфигурации или вегрузки выгруженной ренве информационной базы I < Назад ~~| | Отмена | Рис. 21.54. Файл манифеста Например, на приведенном рисунке видно, что секция Config2 использу- ется для описания шаблона демонстрационной базы Управление торговлей версии 11.0.4.5, а секция Configl описывает шаблон Управление торговлей версии 11.0.4.5. Каждая секция содержит три параметра. Catalog - определяет наименование прикладного решения в списке шаблонов. В наименовании прикладного решения указывается полное
название (с учетом иерархии) ветки списка шаблонов, в которой будет располагаться данный шаблон. Название одного уровня иерархии отде- ляется от названия другого уровня иерархии символом «/». Например, название Управление торговлей/Управление торговлей означает, что в папке Управление торговлей будет отображаться папка Управление торговлей, в которой уже и будет находиться шаблон указанной версии прикладного решения (рис. 21.55). Добавление информационной базы/группы X ® Создание информационной базы из шаблона Выберите поставляемую конфигурацию для начала работы или демонстреционный пример для оэнекомления L3 Демонстрационные конфигурации "1С:Предприятия 8" СЭ Кни*а "Разработка управляемого интерфейса” L3 Демонстрационные конфигурации управляемого приложе L3 1С:У правление торговлей $ СЭ УправлениеТорговлей iiflUIBI Ф СЭ УправлениеТорговлей (демо) L3 Демонстрационные конфигурации В.1 СЭ Профессиональная разработка в системе 1С:Предприяти( I —ПУ О Создание информационной базы бвз конфигурации для разработки новой конфигурации или загрузки выгруженной ранее информационной базы | < Назад || Далее > | | Отмена | Рис. 21.55. Отображение прикладного решения в списке шаблонов В общем случае параметр Catalog имеет синтаксис Са1а1од_<суффикс языка>. Например, Catalog_ru или Catalog_en. Задание суффикса языка использу- ется для того, чтобы отображать название прикладного решения на языке интерфейса платформы «1 С:Предприятие». Если суффикс языка не указан, то значение этого параметра используется для всех языков интерфейсов платформы, кроме тех, для которых в данной секции указан параметр Catalog с нужным суффиксом. Например, в предыдущем примере в секцию Configl можно добавить пара- метр Catalog_en (рис. 21.56). IcvB - Ьлок! ют i Файл Правка Формат Вид Справка □дИ Vendor-Фирма "1С" Мате-УправлениеТорговлей Version-11.0.4.5 AppVers ion-B.2 [Configl] Catalog-1CsУправление торговлей/Управление торговлей Catalog en-lC:Trade/Trade~^ Destination-lCXTfcad^^^^^ Source-ICvB.cf [ConfigZ] Catalog-1C:Управление торговлей/Управление торговлей (демо) Destinat ion-1C\DemoTrd Source-ICvB.dt Рис. 21.56. Использование параметра Catalog для разных языков Профессиональная разработка в системе «1С:Предприятие 8»
Тогда при работе с английским языком интерфейса платформы список шаблонов будет выглядеть следующим образом (рис. 21.57). Addlnfobase/group X (•) Create infobase from template Select the standard configuration to start working, or the demonstration example for examination <*' LD ДемонстрациомныеконФигурацмг'ЮПреаприягияб" 8 CD Книга 'Разработка управляемого интерфейса" CD Демонстрационные конфигурации управляемого приложе 'С** CD 8 CD Trade 11.0.4.5 8 CD 1СУ правление торговлей •8 CD УправлениеТорговлей (демо) [Й 110.4.5 I ‘ I 1> О Create an infobase without configuration to develop a new configuration or restore a previous^ dumped infobase | < Back | • • | Cancel | Рис. 21.57. Вид списка шаблонов при запуске с английским языком интерфейса платформы Для указанной нами версии прикладного решения будет выведено ее английское название, в то время как для остальных версий будут использо- ваны русские названия, указанные в параметрах Catalog соответствующих манифестов. На момент написания данной книги «1С:Предприятие» использует следу- ющие суффиксы языков (табл. 21.3). Таблица 21.3. Языки интерфейса платформы Язык интерфейса Код языка Английский Ел Болгарский Вд Вьетнамский Vi Грузинский Ка Казахский Кк Латышский Lv Литовский Lt Немецкий De Польский PI Румынский Ro Русский Ru Украинский Uk Турецкий Tr ПОДРОБНЕЕ Точный список доступных кодов языков интерфейса содержится во встроенной справке конфигуратора: 1С:Предприятие к Запуск 1С:Предприятие 8 и параметры запуска ► Общие параметры запуска - /L <код языка>. Том 2
Destination - рекомендуемый подкаталог, в котором будет создаваться новая информационная база на основании данного шаблона. По умолчанию система «1С:Предприятие» предлагает создавать новые информационные базы в каталоге C:\Documents and Settings\<Karanor локального пользо- вателя>\Му Documents\. Параметр Destination определяет дальнейшую структуру подкаталогов относительно этого каталога. Параметр Destination рекомендуется указывать в формате <каталог разработчика>\<каталог информационной базы>, например, Service\Publish для прикладного решения Издательство разработчика Фирма «Сервис». Если в процессе создания новой информационной базы выяснится, что такой каталог уже существует, то к указанному имени автоматически будет добавлен символ 1, затем 2 и т.д. (Service\Publish1, Service\Publish2,...). Source - имя файла поставки (*.cf) или файла выгрузки информационной базы (*.dt). Эти файлы должны находиться в том же каталоге, что и мани- фест. При формировании списка шаблонов система проверяет наличие файла, указанного в параметре Source. Если такой файл отсутствует, соот- ветствующая этой секции ветка в списке шаблонов не отображается. Использование манифеста для автоматического поиска обновлений Файлы обновления (*.cfu) не описываются в манифесте, так как вся информация, необходимая собственно для обновления, может быть полу- чена непосредственно из самого файла обновления. Однако для того, чтобы система «1С:Предприятие» отобразила файл *.cfu как доступное обновление, в каталоге шаблонов должен обязательно присутствовать манифест со значениями параметров Vendor, Name и Version, совпадаю- щими со значениями, указанными в файле обновления. Не обязательно файл обновления и соответствующий манифест должны находиться в одной и той же папке каталога шаблонов, но такое размещение реко- мендуется. Кроме этого, манифест должен обязательно содержать одну секцию с параметрами Catalog, Destination и Source. Из параметра Catalog будет взято отображаемое название обновления, параметры Destination и Source в данном случае использоваться не будут, но должны быть заданы (можно задать произвольные значения), иначе обновление не будет найдено автоматически. Кроме этого, при обновлении прикладного решения система может использовать специальный файл, содержащий дополнительную инфор- мацию о данном обновлении. Такой файл имеет стандартное имя 1cv8upd и одно из четырех расширений: *.htm, *.html, *.txt или *.mxl. Этот файл будет отображен при нажатии кнопки Информация об обновлении в диалоге обновления конфигурации (рис. 21.58).
Гл~ава>21!!Поставка1прикладн£|х4решений Обновление конфигурации X 1 Укажите Файл обновлена [D:\Dbtribule\Pack\Dbtrn\SeMceKPuMBhhgK1CvB.cfu |.„| || Информация об обновлении ;| | < Назад || Готово | | Отмена | | Справка | Рис. 21.58. Диалог обновления конфигурации Файл 1cv8upd.* должен находиться в том же каталоге, что и соответству- ющий файл обновления. Удаленный каталог шаблонов Обновление конфигурации, стоящей на поддержке поставщика, выпол- няется с помощью команды Конфигурация ► Поддержка ► Обновить конфигурацию. При выполнении обновления прикладного решения пользователю предо- ставляется возможность выбрать один из двух вариантов выполнения этого действия: автоматический поиск обновлений и указание нужного файла обновления вручную (рис. 21.59). Обновление конфигурации X Выберите источник обновлений конфигурации ®Роиск доступных обновлений [рекомендцегся] Поиск доступных обновлений может осуществляться в указанных каталогах, включая каталоги на съемных носителях и серверах в интернете. О Выбор файла обновлена! Файл обновления поставляется как отдельный Файл для обновления конфигурации | Далее) | | Отмена | ( Справка | Рис. 21.59. Выбор источника обновления Если пользователь выбирает автоматический поиск обновлений, то система будет выполнять поиск (по умолчанию) в нескольких ката- логах (рис. 21.60). Для того чтобы система отобразила находящиеся в них файлы обновления, они должны быть сформированы по правилам, описанным в разделе «Использование манифеста для автоматического поиска обновлений», стр. 599. Все представленные на этом рисунке каталоги можно разделить на две группы: каталоги шаблонов и просто каталоги, содержащие обновления. К простым каталогам относится каталог а:\ (дискета) и каталог e:\v8updates (CD-ROM). Кроме этих каталогов пользователь может добавлять и другие каталоги, в которых могут находиться обновления.
Обновление конфигурации X Выберите область поиска файлов обновлений: @ Искать в текущим каталогах шаблонов и обновлений: C:\DocunrtenH and SettingsMJSERVAppRcatton DataMCVI Cv82\tmpL. 0|Йскагь обновления в каталогах! 0http://downloacfe.v8.1c.ruAmplts/ (дискета) 0eAv8updates (CD-ROM) 0fAv8updates | CD-RDM) | < Назад || Далее > | | Отмена | | Справка | Рис. 21.60. Выбор области поиска обновлений Наряду с этим механизм поставки и поддержки позволяет выполнять полностью автоматический поиск обновлений, при котором от пользова- теля не требуется указания даже местонахождения файлов обновления. Для этого используются локальный и удаленный каталоги шаблонов. Путь к локальному каталогу шаблонов берется из настроек системы, и по умолчанию флажок поиска в локальном каталоге шаблонов уста- новлен. Таким образом, все подходящие обновления, которые были получены пользователем в процессе установки дистрибутивов прикладных решений, будут найдены в локальном каталоге шаблонов. Кроме этого, в свойстве поставляемой конфигурации Адрес каталога обнов- лений разработчик может указать адрес удаленного каталога шаблонов (FTP- или HTTP-ресурс), в котором система также будет выполнять поиск доступных обновлений. Благодаря этому поддерживается возмож- ность удаленного обновления прикладного решения у пользователя: при формировании комплекта поставки разработчик указывает в нем адрес удаленного каталога обновлений и передает пользователю логин и пароль для этого ресурса. В дальнейшем пользователь при необ- ходимости выполняет команду Конфигурация ► Поддержка ► Обновить конфигурацию, вводит логин и пароль, и система выполняет автоматическое (если конфигурация находится на полной поддержке) или полуавтомати- ческое обновление прикладного решения. Файл списка шаблонов Особенностью удаленного каталога шаблонов является наличие файла списка шаблонов. Этот файл должен располагаться в корне удаленного каталога и содержать описание всех шаблонов, находящемся в этом удаленном каталоге. Как правило, для создания удаленного каталога шаблонов исполь- зуется следующая последовательность действий. Сначала структура папок и файлов удаленного каталога создается на локальном компью- тере. После этого открывается окно редактирования каталога шаблонов конфигураций (Конфигурация ► Поддержка ► Шаблоны конфигураций и обнов- лений...). В этом окне открывается корень структуры каталога шаблонов, который мы готовим на локальном компьютере, и в нем создается файл Профессиональная разработка в системе «1С:Предприятие 8»
списка шаблонов (кнопка Создать файл списка шаблонов). В корне ката- лога шаблонов будет создан файл v8cscdsc.lst - это и есть файл списка шаблонов. После этого вся созданная локально структура каталогов и файлов копируется на удаленный ресурс. Создание комплектов поставки Как говорилось в начале главы, механизм создания комплектов поставки позволяет автоматизировать процесс подготовки всех необходимых файлов для передачи пользователю. Кроме этого, он позволяет создать из этих файлов дистрибутив - файл архива 1cv8.efd и инсталлятор setup.exe. Пользователь запускает инсталлятор, и все файлы, содержа- щиеся в архиве, устанавливаются в локальный каталог шаблонов. Для того чтобы формирование комплекта поставки можно было выпол- нять неоднократно, вся информация о комплекте поставки хранится в файле описания комплекта поставки. Такой файл имеет расширение .edf. При создании нового комплекта поставки разработчик создает новый файл описания этого комплекта поставки, который затем может сохранить на диске и использовать в дальнейшем для редактирования состава комп- лекта поставки или для формирования новых версий файлов поставки. Для создания нового комплекта поставки следует выполнить команду Конфигурация ► Поставка конфигурации ► Комплект поставки... (рис. 21.61). Выбор описания комплекта поставки X Выберите описание комплекта поставки (•^Открыть описание комплекта поставки;_ |Р:\РвЬ1х*е\Раск\Комплект поставки!.ed |„.| О Создать новое описание комплекта поставки [ ОК |[ Отмена 1| Справка | Рис. 21.61. Выбор описания комплекта поставки Система предложит открыть один из сохраненных файлов описания комп- лекта поставки или создать новый. Когда создается новый комплект поставки, нужно указать наименование будущей поставки и наименование поставщика (рис. 21.62). Создание описания комплекта поставки X Укажите наименование поставки и поставщика: Наименование: [ИИЯНИЯНИЯИ1ИЯИЕ | Поставщик: [Фирма "Сервис" | Указанные наименование поставки и посгавщж будут использоваться в интерфейса программы установки л | Далее > 11 Готово 11 Отмена 11 Справка | Рис. 21.62. Ввод наименования поставки и поставщика Том 2
МеханизмГсбзданияТкомплектовТпоставки По умолчанию система указывает в этих полях значения свойств Синоним и Поставщик текущей конфигурации, однако совсем не обязательно, что именно они и должны быть заданы для формируемого комплекта поставки. Во-первых, создание, редактирование файлов описания комплектов поставки могут выполняться, вообще говоря, в любой произвольной информационной базе, поэтому наименование поставляемого приклад- ного решения может отличаться от того, которое содержится в текущей информационной базе. Во-вторых, комплект поставки может включать в себя шаблоны разных прикладных решений, поэтому название комп- лекта поставки может быть вообще не связано с конкретным прикладным решением. На следующем шаге создания описания комплекта поставки предо- ставляется возможность использовать текущую информационную базу в качестве «источника данных» для создаваемого комплекта (рис. 21.63). Создание описания комплекта поставки X Укажите параметры шаблона: @ Определять параметры по текущей конфигурации Поставщик: Фирма "Сервис" Имя: Версия: Путь: Параметры шаблона записываются в манифест шаблона, входящего в комплект поставки. Издательство 1.4.2.2 [КаталотПоставщика [ < Назад ||Г Далее >11 Готово |[ Отмена I [ Справка I _ __ .. _ ------------------------------- рис. 21.63. Указание параметров шаблона Эта возможность также не является обязательной, но по умолчанию она включена. Ею удобно пользоваться, например, когда нужно быстро создать комплект поставки для текущего прикладного решения. Тогда значения свойств Поставщик, Имя и Версия текущей конфигурации будут использованы как значения параметров Vendor, Name и Version созда- ваемого манифеста. Однако если комплект поставки будет содержать шаблоны нескольких прикладных решений, тогда в остальных шаблонах эти значения нужно будет изменить вручную, в процессе редактирования файла описания комплекта поставки. Также на этом шаге создания описания комплекта поставки можно задать путь, по которому будут установлены файлы комплекта поставки (то есть папка каталога шаблонов, в которую будут помещены файлы комплекта поставки у пользователя). Если в поставке будет содержаться несколько прикладных решений, то для остальных этот путь можно будет также отредактировать вручную. Следующий шаг создания описания поставки предлагает использо- вать файлы текущей конфигурации в создаваемом комплекте поставки (рис. 21.64).
Гл~ава>21!!Поставка1прикладн£|х4решений Создание описания комплекта поставки X Выберите файлы шаблона: @ Т екущая конфигурация Файл с текущей конфигурацией может использоваться для создания новой информационной базы не содержащей данных. 0 Т екущая информационная база Файл с текущей информациожой базой может использоваться для создания новой информационной базы как копии текущей. Q Каталог допотигельных Файлов: I 1-1 Дополнительно в шаблон могут быть включены Файлы, находящиеся в указанном каталоге и подкаталогах этого каталога. I < Назад I Ц Готово i|| Отмена || Справка I _ -. - . — ~ w _ -------- ----------------------- Рис. 21.64. Подбор файлов шаблона Опять же это не обязательно, но удобно, если комплект поставки форми- руется только для текущего прикладного решения. В этом случае автоматически в комплект поставки можно включить следующие файлы: файл текущей конфигурации (*.cf) можно включить как просто в виде файла конфигурации (для использования как есть), так и в виде файла поставки (для создания конфигурации, стоящей на поддержке или для обновления версий); файл выгрузки информационной базы (*. dt) тоже можно включить как есть или в виде выгрузки информационной базы, конфигурация которой стоит на полной поддержке текущей конфигурации. Кроме этого, в поле Каталог дополнительных файлов можно указать каталог, файлы которого будут включены в комплект поставки (например, каталог с файлами сопроводительной документации). После нажатия кнопки Готоао открывается окно редактирования описания комплекта поставки (рис. 21.65). Комплект поставки2 ' □ X Действия ’ I Lv I & । Создать комплект | Создать файлы комплекта €> Л. Шаблоны конфигураций Л. Издательство(Фирма"Сервис".версия1.4.2.2) QjjJ Файл выгрузки информационной базы ЦЦ Файл конфи-урации в- ф Варианты поставки Q Погиый z- Базовые каталоги €> Йй Языки Йй По умолчанию Рис. 21.65. Редактирование комплекта поставки Описание комплекта поставки состоит из четырех составляющих: шаблоны конфигураций, варианты поставки, базовые каталоги и языки.
Общие свойства описания комплекта поставки Сам по себе комплект поставки обладает тремя свойствами, которые отображаются в палитре свойств: Наименование, Постаащик и Описание (рис. 21.66). Комплект поставки2 ” Действия-*-1 LV .-1 I I Создать комплект | Создать Файлы комплекта Л. Издательство (Фирма "Сервис", версия 1.4.22) Файл выгрузки информационной базы Файл конфигурации Q Варианты поставки Q Полный з- Базовые каталоги -г- Языки ЙЙ По доолчагмо Свойства: Комплект установки ;i । х *___________________ ▼Основные: Поставщик [Фирма'Сервис" Описание Редактировать э ja| Рис. 21.66. Свойства комплекта поставки Свойства Наименование и Поставщик используются программой установки для отображения наименования прикладного решения и наименования поставщика в процессе установки прикладного решения. Программа установки, исходя из настроек операционной системы, выбирает один из возможных языков интерфейса платформы для отображения наименования и поставщика. Поэтому, нажав кнопку со значком лупы, для каждого из этих свойств может быть задано значение на соответствующем языке (рис. 21.67). Строки на разных языках Английски (значение по умолчанию) [Издательство, редакция 1.4 Русский [Издательство, редакция 1.4 Украинский [Видавницво, редакция 1.4 Латышский I ок Отмена Рис. 21.67. Ваод наименования и описания на разных языках В результате, если установка дистрибутива, сформированного из этого комплекта поставки, будет выполняться в операционной системе с украинскими региональными настройками, то программа установки будет иметь следующий вид (рис. 21.68). Свойство Описание предназначено исключительно для разработчика и может содержать некоторую служебную информацию, относящуюся к данному описанию комплекта поставки. Профессиональная разработка в системе «1С:Предприятие 8»
Cf Установка конфнгурацп Ласкаво просимо у програиу установки продукту Видавницво, редакция 1.4 (<Ирма "Сервис"). < Попвредня | |Наступна>!| Вшганити Рис. 21.68. Окно программы установки Шаблоны конфигураций Комплект поставки может содержать один или несколько шаблонов конфигураций. Каждый шаблон описывается отдельной веткой в дереве описания комплекта поставки. Если поставляется одна версия приклад- ного решения, то, как правило, описание комплекта поставки содержит один шаблон. Несколько шаблонов могут использоваться, например, когда поставляется несколько различных прикладных решений или несколько версий одного и того же прикладного решения. Каждое описание шаблона содержит перечень файлов, входящих в этот шаблон. Разработчик имеет возможность добавлять и удалять шаблоны, добавлять и удалять файлы шаблонов. Для этого следует выделить нужный элемент в дереве описания комплекта поставки и нажать кнопку Добавить. При добавлении файлов в шаблон система, помимо собственно указания добавляемого файла или добавляемого каталога файлов, предостав- ляет возможность добавить также файл текущей конфигурации и файл выгрузки текущей информационной базы (рис. 21.69). Выбор элемента шаблона X Выберите добавляемыйэлемент шаблона: ® (Текущая конфигурация О Т екущая информационная база_______________________________ О Отдельный Файл: [ |„.| О Набор Файлов Каталог: Маски Файлов: @ Включать подкаталоги ^1 2SI [ ОК 11 Отмена 11 Справка | Рис. 21.69. Добавление файлов в шаблон Том 2
МеханизмГсозданияТкомплектовТпоставки Свойства шаблона Для каждого шаблона, содержащегося в описании комплекта поставки, могут быть заданы следующие свойства (рис. 21.70). Свойства: Шаблон ' X ▼Основные: Поставщик Фирма "Сервис" Имя Издательство Версия 1.4.2.2 Размещение манифеста | Servee/PuHishing | Рис. 21.70. Свойства шаблона Свойства Поставщик, Имя и Версия задают те значения, которые будут указаны в параметрах Vendor, Name и Version создаваемого манифеста. Флажок Текущая конфигурация позволяет взять значения этих свойств из текущей конфигурации или задать вручную. Свойство Размещение манифеста определяет папку каталога шаблонов, в которую будет установлен манифест и все файлы, содержащиеся в данном шаблоне. Свойства файлов комплекта поставки В общем случае для файла, содержащегося в шаблоне описания комп- лекта поставки, могут быть заданы следующие свойства (в зависимости от вида файла некоторые свойства могут быть недоступны), рис. 21.71. Файл/каталог Поставить на поддержку @ ▼ Шаблон: Включать в манифест @_____________________________ Наименование в шаблоне |Иадательство,рыакция1.4(демо) | Размещение | | Наименование для обновлений О Рис. 21.71. Свойства файлов комплакта поставки В свойстве Наименование задается представление этого файла, отобража- емое в описании комплекта поставки. Оно помогает разработчику понять назначение каждого файла, входящего в шаблон. В свойстве Данные задается вид файла: Файл, Текущая конфигурация или Текущая информационная база. Значение Текущая информационная база
Гл~ава>21!!Поставка1прикладн£|х4решений указывает, что в шаблон должен быть включен файл выгрузки текущей информационной базы (*.dt). Значение Текущая конфигурация указывает, что в шаблон должен быть включен файл конфигурации текущей инфор- мационной базы (*.cf) . Значение Файл указывает, что в шаблон должен быть включен указанный файл. Свойство Базовый каталог определяет каталог, относительно которого указываются пути к файлам, входящим в комплект поставки. Подробнее о базовых каталогах написано в разделе «Базовые каталоги», стр. 604. Флажок Постааить на поддержку доступен только для видов файлов Текущая конфигурация и Текущая информационная база и означает, что должны быть сформированы, соответственно, файл поставки и файл выгрузки информационной базы с конфигурацией, стоящей на поддержке текущей конфигурации. Группа свойств Шаблон также доступна только для файлов вида Текущая конфигурация и Текущая информационная база. Флажок Включать а манифест определяет, что для данного файла должна быть создана соответствующая секция в манифесте. В противном случае информация об этом файле не будет отображаться в списке шаблонов «1 С:Предприятия». Свойство Наименование в шаблоне содержит значение, которое будет присвоено параметру Catalog манифеста. Причем если описание шаблона содержит несколько языков, это свойство будет представлять собой строку на разных языках, которая позволяет задать значение для каждого языка отдельно. В таком случае эти значения будут установлены соответству- ющим параметрам Са1а1од_<суффикс языка> манифеста. Флажок Наименование для обновлений указывает, по сути, какая из секций данного шаблона будет идти первой. Этот флажок может быть установлен только у какого-либо одного файла вида Текущая конфигурация или Текущая информационная база, входящего в данный шаблон. В случае, если мани- фест используется системой при автоматическом поиске обновлений (*.cfu), именно из параметра Catalog этой секции (свойство Наименоаание а шаблоне в описании комплекта поставки) будет браться наименование обновления. Базовые каталоги Базовые каталоги предназначены для удобства указания путей к файлам в описании комплекта поставки. Например, разработчик может иметь для каждого прикладного решения одинаковую структуру каталогов, в которой хранятся файлы, использу- емые в поставке. Тогда, задавая в описании комплекта поставки базовые каталоги, он может легко создать из описания поставки одного приклад- ного решения описание поставки другого, просто указав в нем другой базовый каталог в путях к файлам.
Или другой пример: путь к каталогам, в которых находятся исходные файлы, может быть очень длинным и нечитаемым. В этом случае его также можно задать как базовый каталог описания комплекта поставки, а пути к используемым файлам указывать относительно базового каталога. Варианты поставки Описание каждого комплекта поставки может содержать несколько вари- антов поставки. По умолчанию всегда существует вариант поставки Полный, включающий в себя все файлы, перечисленные в описании комплекта поставки. Наряду с этим разработчик может определить допол- нительно необходимое количество других вариантов поставки и для каждого из них задать состав файлов, входящих в тот или иной вариант. В общем случае для варианта поставки могут быть заданы следующие свойства (в зависимости от вида варианта поставки некоторые свойства могут быть недоступны), рис. 21.72. Свойства: Вариант поставки ?! Mlfii х - X ▼ Основные: 11Е!ВЯНЯЖВВ^^^^^^Л8ММИЯ!ЯИННЯ1Д 1 Поставляемые Файлы Редактировать Файл описания поставки | Описание версии ▼ Комплект поставки: Базовый каталог | <Не использовать> ’1 Каталог | J ^Набор файлов поставки: Базовый каталог | <Не использовать> ’J Каталог 1 -J ----------------------------------- Рис. 21.72. Свойства варианта поставки Наименоаание - это представление данного варианта поставки в описании комплекта поставки. Свойство Поставляемые файлы содержит список файлов, которые включа- ются в данный вариант поставки (рис. 21.73). Вариант построения Выберите Файлы, входящие в вариант построения: Ж Издательство (Фирма "Сервис", версия 1.4.2.2) Описание версиям ОЕ) Описание обновления txt 0Й1 Файл выгрузки информационной базы ОЦЦ Файл конфигурации X I I | Отмена | |Справка| Рис. 21.73. Список файлов, включаемых в вариант поставки В свойстве Описание версии указывается один из файлов, включаемых в комплект поставки. Этот файл будет открыт после завершения уста- новки дистрибутива на компьютере пользователя (рис. 21.74). Профессиональная разработка в системе «1С:Предприятие 8»
Рис. 21.74. Использование описания версии Так как программа установки выбирает один из языков интерфейсов плат- формы при своей работе, то и файл описания версии можно указывать свой для каждого из возможных языков интерфейса (рис. 21.75). Выбор описания поставки X Английский (значение по умолчанию} j' | I !.Тх| I——-----------1 -------------------------------------------- | Отмена | Русский: Украинский: I !-*) - Рис. 21.75. Использование файлов описания для разных языков Группы свойств Комплект постааки и Набор файлов постааки предназна- чены для указания каталогов по умолчанию, в которых будет выполняться сохранение соответственно дистрибутива поставки и набора файлов поставки при их формировании из описания комплекта поставки. Языки В описании комплекта поставки может быть задано несколько языков, которые будут использоваться при формировании представления файлов шаблона в списке шаблонов. По сути, языки, задаваемые в описании комплекта поставки, определяют суффиксы языков, которые будут исполь- зоваться в параметрах Са1а1од_<суффикс языка> манифестов. Для каждого языка задается его представление в описании поставки и его суффикс (рис. 21.76). Рис. 21.76. Свойства языка Том 2
Создание комплекта поставки Комплект поставки может быть создан в виде дистрибутива (Создать комплект) и в виде отдельных файлов (Создать файлы комплекта). Результатом создания дистрибутива будут являться два файла: setup.exe, содержащий программу установки, и 1cv8.efd, содержащий архив файлов поставки. Результатом создания файлов поставки будет структура каталогов, указанная в свойствах шаблонов описания комплекта поставки Размещение манифеста. В каждой ветке будут содержаться файлы соответствующего шаблона и сформированный файл манифеста. Типичные сценарии создания комплектов поставки Прежде чем приступить к рассмотрению нескольких типовых сценариев создания комплектов поставки, следует заметить следующее: несмотря на то, что механизм создания комплектов поставки позволяет прямо из рабочей информационной базы формировать файлы поставки (*.cf), настоятельно рекомендуется создавать и хранить отдельно готовые файлы поставки для каждой версии прикладного решения. В дальнейшем это упростит создание обновлений и комплектов поставки, так как не всегда под рукой может быть рабочая информационная база нужной версии, а выбрать нужный файл поставки из сохраненных гораздо проще. К тому же если возникнет необходимость сформировать комплект поставки, содержащий разные прикладные решения или несколько версий одного прикладного решения, то без соответствующих файлов поставки просто не обойтись. Поэтому в дальнейшем будем исходить из предположения, что у разработ- чика на диске D: существует некоторая структура каталогов (рис. 21.77). □ Distrbute j--© 1.4.2.1 1,4.2.2 B-I&I Раск T^AddRtes | Distr ieitsswi Рис. 21.77. Структура рабочих каталогов В этой структуре каталог D:\Distribute используется как каталог файлов поставки в механизме поставки и поддержки. Таким образом, он содержит структуру каталогов версий прикладного решения с соответствующими им файлами поставки и обновления. Эти файлы формируются по мере выпуска очередных версий прикладного решения с помощью механизма поставки и поддержки (Конфигурация к Поставка конфигурации к Создать файлы поставки и обновления конфигурации...). Кроме этого, для удобства формирования комплектов поставки в этом же каталоге содержится папка Раск, в которой, в папке AddFiles,
находятся сопроводительные файлы (описания поставки на нужных языках, описания изменений и пр.). Также в каталоге Раск находятся папки Distr и DistrFil соответственно для готовых дистрибутивов и файлов комплекта поставки. Создание комплекта поставки версии прикладного решения Сформулируем задачу: необходимо создать описание комплекта поставки, с помощью которого сформировать два дистрибутива нашего прикладного решения - русскоязычный и англоязычный. Часть необходимых файлов подготовлена заранее: файлы описания версии прикладного решения (на русском и английском языках), файл поставки англоязычной версии (*.cf) и файл выгрузки демонстрационной англо- язычной базы (*.dt). Мы находимся в конфигураторе демонстрационной русскоязычной инфор- мационной базы, содержащей поставляемую версию конфигурации. Создаем новый комплект поставки, в процессе создания указываем каталог размещения файлов в каталоге шаблона пользователя (Service/Publishing), рис. 21.78. Создание описания комплекта поставки Укажите параметры шаблона: ©Определять параметры по текущей конфигурации Поставщик: Фирма "Сервис" Имя: Издательство Версия: 1.4.2.2 Путь: |Sernce/Pubfehing ] Параметры шаблона записываются в манифест шаблона, входящего в комплект поставки. [[ < Назад^| | Далее > | [ Готово 11 Отмена 11 Справка | Рис. 21.78. Указание каталога размещения файлов Задаем наименование комплекта поставки и наименование поставщика на русском и английском языках (рис. 21.79). Строки на разных языках Английский (значение по умолчанию) X I I | Pubfehino. release 1.4 | | Отмена | Русский * | Издательство, редакция 1.4 | Украинский I I Рис. 21.79. Указание наименований на разных языках Строки на разных языках X Английский (значение по умолчанию) I I | Сервис Company | | Отмена Русский | Фирма "Сервис" | Украинский ( I ▼ <oj(0)(oj
Добавляем английский язык с суффиксом еп (рис. 21.80). Комплект поставки! ” _ О X Действия*| (ф L^l X I I Создать комплект | Создать Файлы комплекта $ Комплект установки •9 Л. Шаблоны конфигураций •9 Л. Издательство (Фирма "Сервис", версия 1.4.2.2) ЦЦ Файл выгрузки информационной базы ЦЦ Файл конфигурации 9 Q Варианты поставки Q Полный Базовые каталоги '9 Языки ЙЙ Поумолчатио ЙНВМННЫ впиплвипп Свойства: Язык X “i №х '____________________________ ▼Основные: ЕНШИПа^лийск^ ] Каталог ресурсов [еп ] Рис. 21.80. Добавление английского языка На этом языке будет отображаться наименование конфигурации в списке шаблонов при использовании англоязычного интерфейса платформы «1С:Предприятие». В остальных случаях по умолчанию название будет отображаться на русском языке. В русскоязычный дистрибутив добавляем файл описания поставки на русском языке (рис. 21.81). Комплект поставки! ” _ □ X Действия ▼ | <££) X I & I Создать комплект I Создать файлы комплекта 9 Комплект установки Л. Шаблоны конфигураций 9 Издательство (Фирма "Сервис", версия 1.42.2) □ QBBBI (1^ Файл выгрузки информационной бавы ЦЙ Файл конфигурации Варианты поставки ----------------------------------------------------------- Полный Свойства: Файл конфигурации X Базовые каталоги ;!|йЩ|х у ________________________________________________ ЙД Языки ▼Основные:________________________________________________ По доолчаюю ] Ангтмйский ▼Источник: _________________________________________ Данные [Файл ▼ [ Базовый каталог [<Не использовать» ▼ | Файл/кагалог |D:\Distia>jteKPack\AddFies\ReadMe.btt Поставить на поддержку ▼ Шаблон: Включать в манифест Наименование в шаблоне Размещение Наименование для обновлений Рис. 21.61. Добавление файла описания поставки Задаем наименование в шаблоне конфигураций для файла выгрузки русскоязычной демонстрационной базы. Поскольку этот файл будет присутствовать только в русскоязычной поставке, наименование на английском языке можно не задавать (рис. 21.82). Профессиональная разработка в системе «1С:Предприятие 8»
Строки на разных языках X По умолчанию I ОК | |Сереис:Иадательство/Иадательство (демо) | | Отмена | Английский Рис. 21.82. Наименование в шаблоне Также задаем желаемый каталог, в котором будет создана новая информационная база на компьютере пользователя из этого шаблона - Service/PublishingDemo (рис. 21.83). Свойства: Файл конфигурации X 'Основные: Наименование [Файл выгрузки информационной базы 'Источник: Данные Базовый каталог [Т екущая информационная база <Не использовать) Файл/каталог Поставить на поддержку @ г Шаблон: В ключагь в манифест_@________________________________ ЩИДИИДШП^Г-"“ИздагельствоЛ1адательство(демо) |Q| Размещение Наименование для обновлений О [Seivice/PubfehingDemo Рис. 21.83. Размещение информационной базы Аналогичным образом задаем наименование в шаблоне и размещение для русскоязычного файла поставки (рис. 21.84). Свойства: Файл конфигурации X ;i pili х у___________________________________________________ ▼Основные: Наименование [Файл конфигурации | ▼Источник: Данные [Текущая конфигурация ▼! Базовый каталог <Не использовать) Файл/каталог Поставить на поддержку @ ▼ Шаблон: Включать в манифест @ Наименование в шаблоне [СервисИадательство/Издагетьство Q | _11МЙ—liMMHIB ] Наименование для обновлений @ Рис. 21.84. Свойства файла поставки Добавляем новый шаблон в описание комплекта поставки для перечис- ления англоязычных файлов (рис. 21.85). Том 2
МеханизмГсбзданияТкомплектовТпоставки Комплект поставки! “ X Действия ж I X I I Создать комплект | Создать Файлы комплекта •9 Комплект установки 9 Ж Шаблоны конфигураций 9> Ж Издательство (Фирма "Сервис", версия 1.4.2.2) El ReadMe.txt Файл выгрузки информационной базы ЦЦ Файл конфигурации ж ^ц^ууццо3199О9ЯВ11ЕЗВВВЕН99198ВИ1В&бВЕЗВЕ11ВЕВ •9 Варианты поставки Полный _________________ Базовые каталоги 9 Языки ДЗ По доолчанию Английский Свойства: Шаблон sigg^iх" ▼ Основные: Текущая конфигурация О ^^^^^^^^^^^^Дфирма "Сервис'1 Имя [Издательство (англ) Версия [1,42,2 Размещение манифеста [Service/Publishinfl en Рис. 21.65. Шаблон для файлов англоязычной поставки В англоязычный шаблон добавляем файл описания поставки на англий- ском языке (рис. 21.86). Комплект поставки! Действия ’ I X I & I Создать комплект | Создать Файлы комплекта □ х 9 Комплект установки 9 Ж Шаблоны конфигураций 9 Ж Издательство (Фирма "Сервис", версия 1.4.2.2) Cl ReadMe.brt 1'^ Файл выгрузки информационной базы ЦЙ Файл конфигурации 9 Ж Издательство (англ) (Фирма "Сервис", версия!. 4.2.2) с ]ЯЯ03ОЯ1 Q Варианты поставки Q Полный Базовые каталоги ЙЙ Языки По доолчагмо ДЗ Анггыйский Свойства: Файл конфигурации г Основные: гИствчник: Данные Бавовый каталог Файл/каталог Поставить на поддержку ' Шаблон: Включать в манифест Наименование в шаблоне Размещение Наименование для обновлений |Файл ~ |<Не использовать» | D:\Distribute\Pack\AddFies\ReadMe en. txt X Рис. 21.86. Файл описания постааки на английском языке В англоязычный шаблон добавляем файл выгрузки англоязычной демонс- трационной базы, задаем его название в файле описания комплекта поставки и указываем, что этот файл должен быть включен в шаблон (рис. 21.87).
- □ X Комплект поставки! Действия ф) Qj X I & I Создать комплект | Создать Файлы комплекта $ Комплект установки '? Л Шаблоны конфигураций т> Ж Издательство (Фирма "Сервис", версия 1.4.22) El ReadMe.M Файл выгрузки информационной базы ЦЦ Файл конфигурации Ж Издательство (англ) (Фирма "Сервис", версия 1.4.2.2) [7] ReadMe_en.M Ct Варианты поставки Q Полный h- Базовые каталоги £cl Языки По доолчаюю Английский Свойства: Файл конфигурации 81И1Й1 х * ’Основные: Наименование [Демонстрационная база (англ) ’Источник: Данные Базовый каталог Файл/каталог Поставить на поддержку [Файл |<Не использовать» |DADistribute\1.4.22\1C¥8 en^F ▼ Шаблон: Наименование в шаблоне [Q] Размещение [ ] Наименование для обновлений О X Рис. 21.87. Англоязычная демонстрационная база Задаем наименование этого файла в шаблоне на русском и на английском языках. Наименование на русском языке, скорее всего, использоваться не будет, так как мы предполагаем, что англоязычную версию поставки будет использовать клиент, работающий с английским интерфейсом плат- формы. Однако лучше его задать как наименование по умолчанию, потому что в противном случае, если клиент запустит «1С:Предприятие» с любым другим интерфейсом, в списке шаблонов наименование нашего приклад- ного решения будет отображено пустой строкой (рис. 21.88). Строки на разных языках X По умолчанию I QK I |НЯЯМЕИИЙЙМЁЙИЙЙН!1НЯИМ ] ] Отмена | Английский [CepBwc:Pubishing/Pubishing(dento) ] Рис. 21.68. Наименование файла в шаблоне Задаем желаемый каталог, в котором будет создана новая информационная база на компьютере пользователя из этого шаблона - Service/PublishingDemo (рис. 21.89).
Свойства: Файл конфигурации si mх '__________________________________________________________ ▼Основные: Наименование [Демонстрационная база (англ) ] ▼Источник: Данные Файл ’1 Базовый каталог | <Не использовать» ’1 Файл/каталог [D:\Distribute\1.4.2.24 Cv8._en.dt •J Поставить на поддержку ▼Шаблон: Включать в манифест @ Наименование в шаблоне [СереисИздагельство/Иадательство(демо) |Q| ~] Наименование для обновлений О Рис. 21.89. Размещение информационной базы Аналогичным образом добавляем англоязычный файл поставки и задаем для него наименование в шаблоне и размещение (рис. 21.90). Свойства: Файл конфигурации ▼Основные: ▼Источник: Данные [файл_______________________ Б азовый каталог |<Не использовать» Файл/каталог [D:\Distfbute\1.4.2.2MCv8 en.cf Поставить на поддержку ▼Шаблвн: 0_____________________________ [СервисИздагельство/Издагельство [Serrice/Pubfehing □ В ключагь в манифест Наименование в шаблоне Размещение Наименование для обновлений Рис. 21.90. Свойства англоязычного файла поставки Создаем вариант поставки Русскоязычный (рис. 21.91). D:Wistribute\Pack\KoMnABKT поставки! .edf в _□ X Действия ф) Г" X I & I Создать комплект | Создать Файлы комплекта €> Комплект установки < ?' Л. Шаблоны конфигураций в' Л Издательство (Фирма "Сервис", версия 1.42.2) С) ReadMe.txt ЦЦ Файл выгрузки информационной базы ЦЙ Файл конфигурации Л. Издательство (англ) (Фирма "Сервис", версия!.4.2.2) □ Файл поставки (англ) D ReadMe_en.M □ Демонстрационная база (англ) V Q Варианты поставки Q Полный (I Базовые каталоги Э Языки По умолчанию Английский Рис. 21.91. Вариант поставки «Русскоязычный» Профессиональная разработка в системе «1С:Предприятие 8»
Определяем состав файлов, входящих в этот вариант поставки (рис. 21.92). Вариант построения В ыбериге Файлы, входящие в вариант построения: •S- Л. Шаблоны конфигураций ? Л Иадзтегьство (Фирма "Сервис", версия 1.4.2.2) ReadMe.M Файл выгрузки информационной базы ё Л. Издаге1ъство (англ) (Фирма "Сервис",версия!.4.22) ОЕ) ReadMe_en.brt О£) Демонстрационная база (англ) О£] Файл поставки (англ) I I | Отмена | |Справка| Рис. 21.92. Состав файлов русскоязычного варианта поставки Задаем файл описания варианта поставки. При любых установках опера- ционной системы пользователя будет использоваться русскоязычное описание поставки (рис. 21.93). Выбор описания поставки Английский (значение по умолчанию} Русский: I |-*| X I РК I I Отмена | Украинский: I |-*| Рис. 21.93. Файл описания русскоязычного варианта поставки Создаем вариант поставки Англоязычный и определяем состав поставля- емых файлов (рис. 21.94). Вариант построения X Выберите Файлы, входящие в зариамт построения: <ё Л. Шаблоны конфигураций ё Л. Издательство (Фирма "Сервис", версия 1.4.2.2) 0D S9DS0BI ОЦЦ Файл выгрузки информационной базы □ЦЙ Файл конфигурации €• Л. Издательство (англ) [Фирма "Сервис", версия!.4.2.2) ReadMe_en.M @0 Демонстрационная база (англ) Файл поставки (англ) I I |Отмена| | Справка | Рис. 21.94. Состав файлов англоязычного варианта поставки Задаем файл описания варианта поставки. При русскоязычных установках операционной системы пользователя будет использоваться русскоязычное описание, в остальных случаях - англоязычное описание (рис. 21.95). Том 2
МеханизмГсбзданияТкомплектовТпоставки Выбор описания поставки X Английский (значение по умолчанию): | рц | _ IfieadMe ейм I... х| ,-----------. -------------------------------------------- | Отмена | Русский: Украинский: I 1...Й1 Рис. 21.95. Файлы описания англоязычного варианта поставки Сохраняем файл описания комплекта поставки (Файл ► Сохранить). Формируем русскоязычный дистрибутив (Создать комплект ► Русско- язычный). Формируем англоязычный дистрибутив (Создать комплект ► Англоязычный). Создание комплекта поставки обновления для удаленного каталога шаблонов Сформулируем задачу: необходимо создать набор файлов поставки, который позволит выполнить только обновление прикладного решения с использованием удаленного каталога шаблонов. Заранее подготовлен файл описания обновления (1cv8upd.txt). Мы находимся в конфигураторе рабочей информационной базы, содер- жащей поставляемую версию конфигурации. Создадим файл обновления (*.cfu) с нужной версии нашего прикладного решения. Для этого выполним команду Конфигурация ► Поставка конфигу- рации ► Создать файлы поставки и обновления конфигурации... Откажемся от создания файла поставки, а для файла обновления выберем файл поставки предыдущей версии. Таким образом, создаваемое нами обнов- ление позволит пользователю перейти с версии 1.4.2.1 на версию 1.4.2.2 (рис. 21.96). Создание файдов поставки и обновления конфигурации □ X - Файл поставки------------------------------------------------------------------------ О Создать Файл поставки Имя Файла поставки: D:\Disltibule\1.4.2.2М Cv8.cf - Файл обновления конфигурации--------------------------------------------------------- @ Создать Файл обновления конфигурации Имя Файла обновления: [D:\Distribute\1.4-2.2MCv8.cfu ~| Конфигурации для обновления: 4$ Добавить из предыдущих версий Имя ' Версия I Имя файла Издательство 1.4.2.1 O:\Distribute\1.4.2.1М Cv8.cf |( Каталог Файлов поставки ij | Вьтюлнить 11 Отмена 11 Справка | Рис. 21.96. Создание файла обновления Создадим новое описание комплекта поставки. Зададим путь в каталоге шаблонов - Service/Publishing (рис. 21.97).
Гл~ава>21!!Поставка1прикладн£|х4решений Создание описания комплекта поставки X Укажите параметры шаблона: @ Определять параметры по текущей конфигурации Поставщик: Фирма "Сервис" Имя: Издательство Версия: 1.4.2.2 Путь. [ Set vice/Pubfchrig | Параметры шаблона записываются в манифест шаблона, входящего в комплект поставки | < Назад i| | Далее > | [ Готово 11 Отмена 11 Справка | Рис. 21.97. Описание комплекта поставки На следующем шаге откажемся от включения в комплект поставки файла информационной базы. По большому счету и файл конфигурации нам также не будет нужен, однако мы оставим его для того, чтобы была сфор- мирована одна секция в манифесте. В дальнейшем мы исключим этот файл из числа поставляемых файлов (рис. 21.98). Создание описания комплекта поставки X Выберите Файлы шаблона: 0 Текущая конфигурация Файл с текущей конфигурацией может использоваться для создания новой информационной базы не содержащей данных. ДГекущая информационная база! Файл с текущей информационной базой может использоваться для создания новой информационной базы как копии текущей. □ Каталог дополнительных Файлов: Дополнительно в шаблон могут быть включеш Файлы, находящиеся в указанием каталоге и подкаталогах этого каталога. [ < Назад | | Гогово 11 Отмена 1[Справка | Рис. 21.98. Состав файлов шаблона Добавим в описание шаблона сформированный ранее файл обновления и файл 1cv8upd.txt (рис. 21.99). Комплект поставки2 * _ □ X Действия » । С J X I & I Создать комплект | Создать файлы комплекта в- Комплект установки ? Л. Шаблоны конфигураций Ж Издательство (Фирма "Сервис", версия 1.42.2) 1Cv8.cfu D 1cv8upd.txt Q Варианты поставки Q Полный Базовые каталоги Э Языки ЙЙ Поумолчагио Рис. 21.99. Файлы в описании шаблона Для файла конфигурации зададим наименование в шаблоне и размещение (рис. 21.100).
Рис. 21.100. Свойства файла конфигурации Создадим вариант поставки Обновление и зададим состав поставляемых файлов (рис. 21.101). Вариант построения Выберите файлы, входящие в вариант построения: v Л. Шаблоны конфигураций v Л. Иэдательство(Фирма"Сереис",версия1.4.2.2) Sigil 1Cv8.cfu 00 HBOflBI ОЙ1 Файл конфигурации I РК I | Отмена ] |Справка| Рис. 21.101. Состав файлов варианта поставки «Обновление» Создадим комплект файлов обновления (Создать файлы комплекта ► Обнов- ление). В результате будет создана структура каталогов Service - Publishing, в которой будут содержаться файлы обновления (рис. 21.102). Имя ж Й1ст8 ICvfl.du |д) IcvBipd J_________Размер | Тип_____________ 1КБ Файл’МГГ" 2 КБ Файл “CFU1 7 КБ Текстовый документ Рис. 21.102. Состав файлов обновления При этом файл манифеста будет иметь следующее содержание (рис. 21.103). 1^1 Блокнот I-1D|X| Файл Правка Формат Вид Справка Уепйог^Фирма "Сервис” НашевИзлательство Version=1.4.2.2 AppVersion"8.2 [Configl] Catalog=CepBMC:Издательство/Иэдательство Destination_Service/Publishing J Source-ICvB.cf Ш •if/ Рис. 21.103. Содержание файла манифеста Профессиональная разработка в системе «1С:Предприятие 8»
Создадим файл списка шаблонов. Для этого откроем окно редактирования каталога шаблонов конфигураций (Конфигурация ► Поддержка ► Шаблоны конфигураций и обновлений...). Выберем корень созданной структуры ката- логов (Service). В окне будут отображены обновления, содержащиеся в созданном нами каталоге (рис. 21.104). Каталоги шаблонов конфигураций Каталоги ^Добавить £ Изменить ££ Удалить | ф Q C:\Proflram FitesM cvBI Mrnpls C:\Proflram Flet\1Cv8\lmpk$ X Шаблоны ________________ ^Добавить ££ Удалить ^Создать Файл сгмска । О СервисИздательство 1.4.2.2 (обновление) | Закрыть 11 Справка | Рис. 21.104. Создание файла списка шаблонов Выполним команду Создать файл списка шаблонов. В результате в корне нашего каталога шаблонов будет создан файл v8cscdsc.lst (рис. 21.105). ШЯ * |к)»езайс Радио I Ти1 1 Пю»сфЫл|м« 1КБ ФайлТЗТ" Рис. 21.105. Файл списка шаблонов Теперь эту структуру каталогов можно выложить на FTP- или HTTP-ресурс, являющийся удаленным каталогом шаблонов для данной конфигурации. В результате при обновлении приклад- ного решения пользователю будет отображена следующая информация (рис. 21.106). Обновление конфигурации X Выберите необходимое o6i юела не:__________________ ф i~~i ддддцдддддд~~ S- О Издательство 1.4.2L2 (обновление) @Показыватькокфи-урашы i. - • • | < Назад | | Отмена | | Справка | Рис. 21.106. Окно обновления конфигурации При нажатии кнопки Информация об обновлении будет открыт файл 1cv8upd.txt. Том 2
пользов^^л^^5йТЗббл^йи1д^ск5шпВст5Н^ ПРИЛОЖЕНИЕ AUTORUN ДЛЯ СОЗДАНИЯ ПОЛЬЗОВАТЕЛЬСКОЙ ОБОЛОЧКИ ДИСКОВ ПОСТАВКИ Как уже говорилось в начале этой главы, с помощью механизма поставки и поддержки прикладных решений разработчиком в конфигурации опре- деляются правила поддержки и поставки прикладного решения, которое будет находиться на под держке у поставщика. Затем с помощью механизма создания комплектов поставки и механизма создания файлов поставки и обновления разработчик подготавливает дистрибутив прикладного решения для передачи его пользователю. В общем случае схема взаимодействия разработчика с пользователем выглядит следующим образом (рис. 21.107). Построение комплекта обноплсмий ИСПОЛЬЗОВАНИЕ ПОСТАВКА Рис. 21.107. Схема взаимодействия разработчика с пользователем После разработки очередной версии прикладного решения разработчиком создается комплект поставки, который записывается на некоторый физи- ческий носитель, как правило, CD-ROM. В процессе доработки прикладного решения разработчиком выпускаются обновления, которые выкладываются на доступный всем пользователям его прикладного решения FTP- или HTTP-ресурс, а также записываются на физический носитель. ПОДРОБНЕЕ Возможность удаленного доступа к файлам обновления мы рас- сматривали в разделе «Создание комплекта поставки обновления для удаленного каталога шаблонов» на стр. 609. Рассмотрим теперь процесс создания CD-ROM для пользователя, содер- жащего дистрибутив прикладного решения. Дело в том, что, как правило, в составе прикладного решения поставляется несколько конфигу- раций, дополнительные файлы, какие-то сопроводительные документы, рекламные материалы и т.д. ®ии
Гл~ава>21!!Поставка1прикладн£|х4решений Чтобы не заставлять пользователя разбираться во всех этих папках и файлах, самостоятельно искать и запускать установочные файлы, существует приложение Autorun. Оно позволяет сделать готовый диск, в котором запускается удобное пользовательское меню с разными пунк- тами установки тех или иных конфигураций, просмотра дополнительных файлов и пр. ПРИМЕЧАНИЕ Программы Autorun и Setupv8 можно найти на диске ИТС, в разделе Технологическая поддаржка - Методическая поддержка 1С:Предприятия 8 - Дополнительные программные средства - Использование приложения Autorun или на веб-ИТС: http://its.1c.rU/db/metod81#content:3223:1. Пользовательский интерфейс представляет собой диалог, содер- жащий заголовок, картинку, список и описание запускаемых программ, а также кнопку выхода. Все части диалога настраиваемы и локализуемы. Для локализации диалога используется список языков и соответству- ющие каждому языку из этого списка локализованные части диалога. Если в списке языков присутствует более одного языка, то в диалоге появляется выпадающий список для выбора пользователем одного из определенных в настройках диалога языков (рис. 21.108). Рис. 21.106. Диалог приложения Autorun Настройки диалога помещаются в файл autorun.1st. Этот файл имеет формат, аналогичный формату ini-файлов, и записывается в кодировке UTF-8. Файл должен находиться в одном каталоге с исполняемым файлом autorun.exe. Формат файла имеет следующую структуру: секция [Main] содержит параметры, относящиеся ко всему диалогу: □ Caption - заголовок диалога автозапуска; ФИ2
□ Picture - картинка фона диалога. Размер диалога подстраивается под размеры картинки; □ ExitText - текст кнопки выхода; секция [Language] описывает один из языков установки: □ Locale - идентификатор языка установки; □ Name - наименование языка установки; секция [Element] описывает один из элементов списка запускаемых программ: □ Name - строка для списка запускаемых программ; □ Description - описание запускаемой программы; □ Command - командная строка для запуска программы. Коман- дная строка исполняется последовательно с прибавлением в начале наименования диска, с которого запущен автозапуск, затем с прибавлением в начале наименования диска и каталога автозапуска и затем без добавлений - как есть; □ Marker - отметка элемента списка. Может принимать строчные значения Primary и Secondary. Определяет выделенную по умол- чанию строку списка. Для локализации той или иной строки достаточно добавить к наимено- ванию элемента символ подчеркивания «_» и идентификатор (Locale) нужного языка. Элементы с наименованиями без суффиксов считаются универсальными и могут быть использованы для любого языка в случае отсутствия локализованной для этого языка строки. Описанные правила не относятся к наименованиям секций и параметрам Locale, Command и Marker. Можно создать вложенный список пунктов. Для этого необходимо в файле autorun.lst создать элемент, который содержит дополнительный список пунктов выбора, например (листинг 21.1): Листинг 21.1. Пример перехода к списку выбора [Element] Name = Выборочная установка... Description = Выборочная установка компонент Marker = Secondary Command = autorunfull.lst В этом примере в команде Command используется autorunfull.lst - файл настроек, содержащий другой набор элементов выбора. Вложенность дополнительных списков пунктов выбора неограниченна. Возврат к нужному списку выполняется как один из пунктов дополни- тельного списка с указанием нужного файла настроек. Так, для возврата в основной список выбора нужно в файле autorunfull.lst (из предыдущего примера) создать следующий элемент (листинг 21.2). Профессиональная разработка в системе «1С:Предприятие 8»
Листинг 21.2. Пример возврата к предыдущему списку [Element] Name = Назад... Description = Возврат к предыдущему списку Marker = Secondary Command = autorunfull.lst Приложение SetupV8 Приложение SetupV8.exe позволяет в автоматическом режиме устано- вить платформу «1С:Предприятие 8», установить шаблон конфигурации и создать информационную базу на основе установленного шаблона, а также запустить установленную систему. Для настройки особенностей поведения при выполнении этих действий используется специальный конфигурационный файл, который нужно указать в качестве параметра при запуске приложения SetupV8.exe: SetupV8.exe @Folder\ConfigFileName.cfg. Если параметр не указан, то прило- жение SetupV8.exe будет использовать файл SetupV8.cfg, который должен быть расположен в каталоге, откуда выполняется запуск SetupV8.exe. Конфигурационный файл имеет формат, аналогичный формату ini-файлов, и записывается в кодировке UTF-8. Ниже перечислены элементы формата конфигурационного файла. Секция [Platform] описывает настройки установки платформы «1С:Предприятие 8»: Location - указывает местоположение дистрибутива платформы отно- сительно каталога, в котором расположена программа SetupV8.exe; CmdLine - строка, содержащая параметры, передаваемые программе установки платформы; UI - определяет, насколько подробным будет графический интерфейс программы установки: 3 - будет отображаться только индикатор уста- новки (прогресс-бар); 5 - будет использоваться обычный (полный) интерфейс программы установки; PackageName - имя установочного пакета платформы; MsiVersion - минимальная требуемая версия компонента Microsoft Installer, необходимая для запуска программы установки платформы; MsiW - имя установочного файла компонента Microsoft Installer, который будет запущен, если на компьютере установлена старая версия этого компонента (относительно указанной в параметре MsiVersion); Идентификатор сообщения - указывает, какое сообщение должна выво- дить программа SetupV8.exe во время работы. Таких параметров может быть несколько. Подробное описание идентификаторов приводится в секции <Язык>. Том 2
пользов^^л^^5йТЗббл^йи1д^ск5шпВст5Н^ Ниже приводится пример заполнения секции (листинг 21.3). Листинг 21.3. Пример секции Platform [Platform] Msg BeforePlatform Locations CV8 CmdLine=REINSTALLMODE=vomus REINSTALL=ALL LAUNCHREADME=No READMEFILETOLAUNCHATEND=0 SHOWLAUNCHREADME=0 HASPInstall=no DEFLANGUAGE=RU Ul=3 PackageName=1CEnterprise 8.2.msi MsiVersion=2.0.2600.2 MsiW=Windowslnstaller-KB893803-x86.exe MsgAfterPlatform Секция [CFG] описывает настройки установки конфигурации (приклад- ного решения): Location - указывает местоположение дистрибутива прикладного решения относительно каталога, в котором расположена программа SetupV8.exe; Destination - каталог установки шаблона прикладного решения. Зада- ется при подготовке поставки прикладного решения; Version - версия устанавливаемого прикладного решения; Configl - признак необходимости создания новой информационной базы прикладного решения после завершения установки шаблона. Может принимать значения: 0 — не создавать информационную базу или 1 - создавать информационную базу; Config2 - признак необходимости создания демонстрационной инфор- мационной базы прикладного решения после завершения установки шаблона. Может принимать значения: 0 - не создавать информаци- онную базу или 1 - создавать информационную базу; Идентификатор сообщения - указывает, какое сообщение должна выво- дить программа SetupV8.exe во время работы. Таких параметров может быть несколько. Подробное описание идентификаторов приводится в секции <Язык>. Ниже приводится пример заполнения секции (листинг 21.4). Листинг 21.4. Пример сакции CFG [CFG] Location=configs\smallbusiness Destination^ Ctemallbusiness version=1.0.0.0 Configl=1 Config2=1 MsgBefbreCFG MsgAfterCFG MsgBeforelB MsgAfterIB
Гл~ава>21!!Поставка1прикладн£|х4решений Секция [<Язык>] содержит локализованные строки для информирования пользователя. Секций может быть несколько. В качестве имени секции указывается английское написание языка. <Язык> - определяет язык локализации. Может иметь следующие значения: □ Russian - русский; □ Ukrainian - украинский; □ English - английский; □ Latvian - латвийский; □ Lithuanian - литовский; □ Bulgarian - болгарский; □ German - немецкий; □ Romanian - румынский; □ Georgian - грузинский; □ Kazakh - казахский; □ Vietnamese - вьетнамский; □ Polish - польский; □ Turkish - турецкий; Title - заголовок окна программы установки; IBCreate - сообщение о создании информационной базы в анимиро- ванном диалоге; AppLaunch - сообщение о запуске платформы в анимированном диалоге; CFGLoad - сообщение о подготовке к запуску установки конфигурации в анимированном диалоге; CFGError - сообщение об ошибке при подготовке установки конфигу- рации в анимированном диалоге; MsgBeforePlatform - сообщение о начале установки платформы; MsgAfterPlatform - сообщение о завершении установки платформы; MsgBeforeCFG - сообщение о начале установки конфигурации; MsgAfterCFG - сообщение о завершении установки конфигурации; MsgBeforelB - сообщение о начале создания информационной базы; MsgAfterIB - сообщение о завершении создания информационной базы. Ниже приводится пример заполнения секции (листинг 21.5). Листинг 21.5. Пример секции <Язык> [Russian] Т1(1е=Программа установки 1ВСгеа1е=Выполняется создание информационной базы %1. Это может занять несколько минут. Арр1аипсЬ=Выполняется запуск 1С:Предприятия...
CFGI-оаскВыполняется подготовка к установке конфигурации... СР6Еггог=Ошибка записи в каталог шаблонов. Возможно, недостаточно прав для записи. MsgBeforeCFG=flns продолжения установки, пожалуйста, подключите ключ защиты, который включен в поставку, в порт USB компьютера. МздААег1В=Установка успешно завершена. Нажмите ОК для запуска 1С:Предприятия. Пример использования приложения Autorun Предположим, CD-ROM для пользователя, содержащий дистрибутив прикладного решения, имеет следующие файлы и папки (рис. 21.109). Имя А______________________________[ (^accounting (^Additional (£)PictJLree (^platform Ismail £3 allinstall autorun 3* autorun я) autorun я] autorunfull gdplus.dll (j^SetupVB □W!ndowsInstaller-KB893803-¥2-xe6 Раэмер| Тип_______________________ Папка с файлами Папка с файлами Папка с файлами Папка с файлами Папка с файлами 2 КБ Файл конфигурации Micro... 715 КБ Application 1 КБ Сведения для установки 2 КБ Файл "LST“ 2 КБ Файл 1ST' 1607 КБ Компонент приложения 2 270 КБ Application 2 526 КБ Application Рис. 21.109. Содержимое CD-ROM В папке Pictures содержатся картинки, определяющие фон для разных языков локализации диалога. В папке Platform содержатся установочные файлы платформы «1С:Предприятие», в папках Accounting и Small нахо- дятся дистрибутивы прикладных решений (файлы: setup.exe и 1cv8.efd) «Бухгалтерия предприятия» и «Управление небольшой фирмой» соответс- твенно. В папке Additional содержатся различные дополнительные файлы, например, update.htm. В корень содержимого CD-ROM помещается само приложение autorun. ехе, файл для его автоматического запуска autorun.inf и файлы, содер- жащие, собственно, сами настройки диалога autorun.1st и autorunfull.1st, а также конфигурационный файл allinstall.cfg, содержащий настройки для быстрой установки платформы и конфигураций. Файл autorun.lst заполнен следующим образом (листинг 21.6). Листинг 21.6. Пример файла autorun.lst [Main] Сар(1оп=1С:Предприятие 8.2. Установка Caption_en=1C:Enterprise 8.2. Installation Picture=Pictu res\autorun_ru.bmp Picture_en=Pictures\autorun_en.bmp ExitText=Bbixofl ExitText_en=Exit Профессиональная разработка в системе «1С:Предприятие 8»
[Language] Locale=ru №те_ги=Русский Name_en=Russian [Language] Locale=en №те_ги=Английский Name_en=English [Element] Мате_ги=Быстрая установка и запуск (рекомендуется) Description_ru=ycTaHOBKa платформы 1С:Предприятие 8.2, конфигурации, информационных баз с демонстрационными данными и информационной базы для начала работы. Name_en=Platform installation Description_en=Platform installation CommanckSetupV8.exe @allinstall.cfg [Element] №те_ги=Выборочная установка... Description_iu=Bbi6opo4Haa установка содержимого диска. После выборочной установки необходимо самостоятельно выполнить установку информационных баз. Name_en=Selective installation... Description_en=Selective installation. Marker=Secondary Command=autorunfull.lst [Element] №те_ги=Описание изменений платформы Description_ru=OnHcaHHe изменений платформы Name_en=Description of platform changes Description_en=Description of platform changes Marker=Secondary Command=Additional\update.htm [Element] №те_ги=Дополнительно Description_ru=flononHHTenbHb)e файлы Name_en=Advanced Description_en=Advanced files Marker=Secondary Command=Additional\ В файле описаны два варианта локализации диалога - на русском и английском языках. Секций Language должно быть столько, сколько языков настроено для диалога. Файл содержит четыре секции Element. Первая описывает настройки для быстрой установки платформы «1С:Предприятие 8.2», конфигурации, информационных баз с демонс- трационными данными и пустой информационной базы для начала работы. Вторая секция описывает переход к вложенному списку выбора, содер- жащемуся в файле autorunfull.lst, для выборочной установки содержимого диска. Том 2
пользов^^л^^5йТЗб6л^йи1д^ск5шпВст5Н^ Третья секция содержит команду для открытия файла, описывающего изменения в платформе. И последняя секция инициирует открытие для просмотра каталога Additional, содержащего дополнительные файлы. Файл allinstall.cfg содержит настройки для быстрой установки платформы и конфигураций (листинг 21.7). Листинг 21.7. Пример файла allinstall.cfg [Platform] Location=platfbrm CmdLine=REINSTALLMODE=vomus REINSTALL=ALL LAUNCHREADME=No READMEFILETOLAUNCHATEND=0 SHOWLAUNCHREADME=0 DEFLANGUAGE=RU Ul=3 PackageName=1CEnterprise_8.2_(training).msi MsiVersion=2.0.2600.2 MsiW=Windowslnstaller-KB893803-x86.exe MsgAfterPlatform [CFG] CFGLoad Location=small Destination^ c\smallbusiness\1 _0_3_9 version=1.0.3.9 Configl=1 Config2=1 MsgAfterIB [Russian] Title=nporpaMMa установки 1ВСгеа1е=Выполняется создание информационной базы %1. Это может занять несколько минут. Арр!_аипсЬ=Выполняется запуск 1С:Предприятия... СРС!_оаб=Выполняется подготовка к установке конфигурации... СРЭЕггорОшибка записи в каталог шаблонов. Возможно, недостаточно прав для записи. MsgBeforePlatfonn=Ha4ano установки. MsgBeforeCFG=flnn продолжения установки, пожалуйста, подключите ключ защиты, который включен в поставку, в порт USB компьютера. МздАЛег1В=Установка успешно завершена. Нажмите ОК для запуска ЮЛредприятия. Содержимое конфигурационного файла подробно рассматривалось в разделе «Приложение SetupV8», стр. 613. Файл autorunfull.lst заполнен следующим образом (листинг 21.8). Листинг 21.8. Пример файла autorunfull.lst [Main] Сарйоп=1СЛредприятие 8.2. Установка Caption_en=1C:Enterprise 8.2. Installation Picture=Pictu res\autorun_ru.bmp Picture_en=Pictures\autorun_en.bmp ExitText=Bbixofl ExitText en=Exit
Гл~ава>21!!Поставка1прикладн£|х4решений [Language] Locale=ru №те_ги=Русский Name_en=Russian [Language] Locale=en №те_ги=Антийский Name_en=English [Element] №те_ги=Платформа 1С:Предприятие8.2 Description_ru=ycraHOBi<a платформы 1С:Предприятие 8.2. Name_en=Platfonn installation Description_en=Platform installation Command=platform\setup.exe [Element] №те_ги=Конфигурация "Бухгалтерия предприятия" Ое8спрАоп_ги=Конфигурация "Бухгалтерия предприятия". После установки необходимо самостоятельно создать информационные базы. Name_en=Accounting Description_en=Accounting Marker=Secondary Command=accounting\setup.exe [Element] №те_ги=Конфигурация "Управление небольшой фирмой" Description_ru= Конфигурация "Управление небольшой фирмой". После установки необходимо самостоятельно создать информационные базы. Name_en=Management of small Ann Description_en=Management of small Ann Marker=Secondary Command=small\setup.exe [Element] №те_ги=Назад... Description_ru=Bo3BpaT к предыдущему списку. Name_en=Back... Description_en=Retum to the previous list. Marker=Secondary Command=autorun,lst В файле настроек первая секция Element описывает установку плат- формы «1С:Предприятие» на основании настроек, содержащихся в файле setup.ini, в каталоге platform. Вторая и третья секции описывают установку шаблонов конфигураций «Бухгалтерия предприятия» и «Управление небольшой фирмой» в локальный каталог шаблонов. И последняя секция инициирует возврат назад к исходному списку, содержащемуся в файле autorun. 1st. В результате запуска приложения Autorun с описанными настройками выдается диалог, в котором пользователь может быстро установить плат- форму «1С:Предприятие» и конфигурации «Бухгалтерия предприятия»
и «Управление небольшой фирмой» или произвести выборочную уста- новку этих элементов, а также просмотреть различные сопроводительные файлы, содержащиеся на диске (рис. 21.110, 21.111). О 1C:I IpeflnpzqTze 8.2. Установка и й<^= ^ПРЕДПРИЯТИЕ 8.2 О Быстрая установка и яапмгм (рекомендуется) С Выборочная установка... С Описание изменении платформы С Дополнительно f'p~. Установка платформы 1С:Предприятие 6.2, конфигурации, информационных баз с демонстрационными данными и информационной базы для ночала работы. Выход О Рис. 21.110. Диалог приложения Autorun О 1С:Пред| 1])ияize 8.2. У( [анонка а il<^= 1С:ПРЕДПРИЯТИЕ 9Л О Платформа 1СЛредг<)иятие В.2 С Конфигурация “Бухгалтерия предприятия* С Конфигурация "Угдевлегые небольшой фирмой* С Назад... Конфигурация 'Бухгалтерия предприятия”. После установки - необходимо самостоятельно создать информационные базы. Рис. 21.111. Диалог приложения Autorun Создание файлов поставки и обновления из командной строки Система «1С:Предприятие» может быть запущена в режиме Конфигу- ратор из командной строки. Такой режим запуска позволяет выполнять различные действия, в том числе и создание файлов поставки и обнов- ления. Для этого в строке запуска используется параметр CreateDistributionFiles и ключи cffile и cfufile. Профессиональная разработка в системе «1С:Предприятие 8»
Для создания файла поставки следует использовать параметр CreateDistributionFiles с ключом cffile, после которого указывается имя создаваемого файла *.cf (листинг 21.9). Листинг 21.9. Примар создания файла поставки (текст команды должен быть записан в одну строку) "C:\Program Files\1cv82\8.2.15.31 O\bin\1 cv8.exe” DESIGNER IF "C:\Documents and Settings\User\My Documents\lnfbBase4" /CreateDistributionFiles -cffile D:\Publishing.cf Для создания файла обновления следует использовать параметр CreateDistributionFiles с ключом cfufile, после которого указывается имя создаваемого файла *.cfu. Кроме этого, необходимо задать также и файлы поставки предыдущих версий, для которых будет формироваться обнов- ление. Это можно сделать двумя способами. Во-первых, с помощью явного указания пути к файлу поставки преды- дущей версии. В этом случае для указания имени файла используется ключ f (листинг 21.10). Листинг 21.10. Пример создания файла обновления (текст команды должен быть записан в одну строку) "C:\Program Files\1cv82\8.2.15.310\Ып\1 cv8.exe” DESIGNER /F "C:\Documents and Settings\User\My Documents\lnfbBase4" /CreateDistributionFiles -cfufile D:\Publishing.cfu -f D:\Distribute\1.4.2.1 \1Cv8.cf Во-вторых, задать нужные файлы поставки предыдущих версий можно указанием их версии. В этом случае система будет использовать каталог Том 2
пользов^^л^^5йТЗббл^йи1д^ск5шпВст5Н^ файлов поставки, назначенный в данной конфигурации, и брать файл поставки из папки с указанным номером версии. Для указания номера версии используется ключ v (листинг 21.11). Листинг 21.11. Пример создания файла обновления (такст команды должен быть записан в одну строку) "C:\Program Files\1cv82\8.2.l5.3lO\bin\1cv8.exe" DESIGNER IF "C:\Documents and Settings\User\My Documents\lnfoBase4" /CreateDistributionFiles -cfufile D:\Publishlng.cfu -v 1.4.2.1 Если файл обновления формируется для нескольких предыдущих версий, то в командной строке должно быть указано соответствующее количество ключей f или v. В следующем примере для информационной базы в файловом режиме создается файл поставки и файл обновления с предыдущей версии. Резуль- таты выполнения сохраняются в файле Report.txt (листинг 21.12). Листинг 21.12. Пример создания файлов поставки и обновления (текст команды должен быть записан в одну строку) "C:\Program Files\1cv82\8.2.15.310\bin\1cv8.exe" DESIGNER IF "C:\Documents and Settings\User\My Documents\lnfoBase4” /N Administrator IP Password /CreateDistributionFiles -cffile D:\Publishing.cf -cfufile D:\Publishing.cfu -f D:\Distribute\1.4.2.1\1Cv8.cf /Out D:\Report.txt
Глава 21? Поставка прикладных-решений J SU8
Профессиональная разработка в системе «1С:Предприятие 8»
Глава 22. Методика разработки ЖИЗНЕННЫЙ ЦИКЛ ПРИКЛАДНОГО РЕШЕНИЯ Технологическая платформа «1С:Предприятие» позволяет разрабаты- вать прикладные решения самого разного масштаба. Это могут быть как несложные решения для одного или нескольких пользователей, так и сложные многопользовательские тиражные решения, обладающие широкой функциональностью и обрабатывающие большие объемы данных. Важным моментом является то, что состав задач, решаемых разработ- чиком в одном и другом случае, существенно отличается. При реализации сложных многофункциональных проектов на первый план выходит целый ряд задач, которые для простых конфигураций не являются критичными и решаются обычно минимальными производственными затратами. Чтобы лучше понять особенности индустриальной разработки, рас- смотрим полный жизненный цикл прикладного решения (рис. 22.1). Рис. 22.1. Жизненный цикл прикладного решения Том 2
Проектирование Можно сказать, что собственно создание будущего прикладного решения начинается с его проектирования. Предполагается, что к этому моменту задача, стоящая перед будущим прикладным решением, уже полно- стью сформулирована: заказчик изучен, формализованы требования, выработано техническое задание и получена полная информация, которая необходима для того, чтобы начать непосредственное создание конфигурации. Уже на этом этапе начинаются серьезные отличия. При создании простых прикладных решений собственно процесс проектирования может зачастую вообще отсутствовать. Это связано с тем, что структура объектов метаданных позволяет разработчику мыслить не таблицами и полями, а объектами, описывающими сущности конкретной прикладной области. Поэтому зачастую термины предметной области однозначно и полно- стью могут быть перенесены в структуру метаданных. Например, если заказчик использует каталог товаров и два документа, которые регист- рируют поступление и расход товаров, то ровно таким же образом эта структура может быть перенесена и в прикладное решение: один спра- вочник и два документа. Если требуемая функциональность решения невелика, то разработчик вполне может держать структуру метаданных в голове, и запись ее на бумаге может потребоваться лишь для отражения в документации. Совершенно другая картина возникает, когда начинается разработка круп- ного проекта. Здесь уже требуются усилия нескольких человек, как для постановки задачи, так и для проектирования. Причем в процессе проек- тирования приходится решать ряд дополнительных задач. Прежде всего, это решение вопроса о том, каким образом будет реализо- вываться та или иная функциональность будущей системы. В крупных решениях, как правило, всегда присутствует большое количество функ- циональности, которая не может быть реализована только каким-либо одним объектом конфигурации. Возникает необходимость задействовать несколько различных объектов, причем далеко не всегда можно одно- значно, без внимательного рассмотрения, сказать, какие именно объекты конфигурации лучше использовать в данном случае. Одна и та же задача в принципе может быть решена с использованием различных объектов конфигурации, поэтому вопрос правильного выбора используемых объектов и построения эффективной структуры метаданных приобретает первостепенное значение. ©и®
Ела ва>22Д Метод и ка] разработки! Если бы важность правильного выбора объектов метаданных была бы обусловлена только этой причиной, одно это явилось бы достаточно серь- езным поводом, чтобы уделить процессу проектирования значительное внимание. Однако есть еще целый ряд факторов, которые еще больше поднимают значимость этапа проектирования. Если в простой конфигурации при проектировании метаданных будет допущена ошибка, то это, конечно, неприятный факт, но не катастро- фический. При определенных условиях даже полная переделка всего прикладного решения может быть выполнена в разумные сроки и разум- ными средствами. Однако если ошибка в проектировании метаданных будет допущена в крупном проекте, это может стать полной катаст- рофой, поскольку потребует огромных ресурсов для ее исправления и «встраивания» новых объектов и новых алгоритмов в уже существующее прикладное решение. Другим важным аспектом правильного проектирования структуры мета- данных является производительность системы. Производительность простых прикладных решений, как правило, «непроизвольно» тестируется самим разработчиком в процессе проверки правильности реализуемых алгоритмов. Таким образом, он сразу видит, например, что тот или иной отчет работает медленно, и может, как уже говорилось, даже изменить структуру метаданных без особых затрат времени и сил. В отличие от этой ситуации, большие проекты, как правило, рассчитаны на интенсивную многопользовательскую работу, поэтому, помимо собственно быстродейс- твия, они должны обеспечивать также высокую параллельность работы пользователей. А значит, при проектировании метаданных следует внима- тельно анализировать создаваемую структуру на предмет возникновения узких мест при одновременной работе большого количества пользова- телей. Как говорится, «гладко было на бумаге, да забыли про овраги». Это тем более важно, поскольку быстродействие системы, которое видит разработчик в процессе отладки создаваемых алгоритмов, совершенно не имеет ничего общего с реальным быстродействием системы при полной нагрузке. Простой пример: разработчик создал документ и убедился, что он проводится быстро и правильно. Но когда несколько пользователей стали одновременно интенсивно создавать эти документы, выяснилось, что их одновременная работа просто невозможна, поскольку структура объектов метаданных, задействованных в алгоритме проведения, такова, что, проводя эти документы, пользователи блокируют одни и те же записи в таблицах базы данных. Разработка После того как проектирование будущего прикладного решения завер- шено, начинается этап разработки, на котором создаются объекты метаданных и описываются алгоритмы функционирования. На этом этапе главной особенностью разработки больших проектов является то, что решение создается не одним разработчиком, а группой параллельно рабо-
тающих сотрудников. А это выдвигает на первый план необходимость согласованного внесения изменений в создаваемое прикладное решение, обеспечения конкурентного доступа к произвольным частям конфи- гурации, необходимость хранения и отслеживания различных версий создаваемой конфигурации, возможность отката к произвольной версии и целый ряд других задач. Платформа «1С:Предприятие 8» содержит специальный механизм, обеспе- чивающий групповую разработку прикладного решения (более подробно о механизме рассказано в разделе «Групповая разработка прикладных решений», стр. 624). И если один разработчик может использовать этот механизм «по желанию» (например для того, чтобы иметь возмож- ность версионирования своей разработки), то для группы разработчиков этот механизм становится просто необходимым. Функциональное тестирование Этап функционального тестирования так или иначе присутствует при разработке прикладного решения любой сложности. В самом простом варианте функциональное тестирование прикладного решения выпол- няется разработчиком в процессе создания отдельных алгоритмов. Функциональное же тестирование больших проектов представляет собой отдельную задачу, для реализации которой требуется целый ряд мероп- риятий: создание тестовых баз, разработка тестов, анализ получаемых результатов и т. д. Такое тестирование выполняется уже группой сотруд- ников, и каждый, как правило, тестирует лишь отдельную часть или подсистему прикладного решения. Нагрузочное тестирование Этап нагрузочного тестирования, как правило, отсутствует при создании простых прикладных решений. Это связано с тем, что технологические возможности платформы в подавляющем большинстве случаев обес- печивают нужную производительность и параллельность работы при небольшом количестве пользователей даже тогда, когда решение спроек- тировано неоптимальным образом. Исключение составляют лишь случаи, когда разработчиком допускаются грубые ошибки проектирования. Если же создается тиражируемое решение, предполагающее одновре- менную работу большого количество пользователей, то нагрузочное тестирование по своей важности становится в один ряд с задачей правильной реализации функциональности. В самом деле, какую ценность для пользователя будет иметь замечательная, функциональная, удобная программа, если он просто не сможет в ней работать из-за постоянных блокировок или очень большого времени реакции системы на его действия? Профессиональная разработка в системе «1С:Предприятие 8»
Поэтому нагрузочное тестирование призвано прежде всего дать оценку производительности системы при одновременной работе большого количества пользователей и выявить узкие места системы, снижающие параллельность работы. Для нагрузочного тестирования и последующего сопровож- дения крупных корпоративных систем существует специальный продукт-<<1 С корпоративный инструментальный пакет». Этот продукт предназначен для повышения производительности, масштабируемости и надежности информационных систем на платформе «1С:Предприятие». Он включает в себя следующие инструменты: Центр управления производительностью (ЦУП) - инструмент мони- торинга и анализа производительности информационных систем на платформе «1С:Предприятие 8». Этот инструмент предназначен для оценки производительности системы, анализа узких мест системы и ее оптимизации; Тест-центр — инструмент автоматизации многопользовательских нагрузочных испытаний информационных систем на платформе «1С:Предприятие 8». С его помощью можно моделировать работу предприятия без участия реальных пользователей; Центр контроля качества. Инструмент предназначен для повышения качества работы системы, которое складывается из таких показателей, как производительность системы, ее масштабируемость и устойчи- вость за счет обеспечения своевременного и правильного технического обслуживания системы; Сценарное тестирование. Инструмент предназначен для автома- тизации сценарного тестирования любых конфигураций системы «1С:Предприятие». С его помощью на основе сценария теста, описы- вающего порядок действий пользователя с данными в программе, можно проверить, правильно ли работает программа при вводе в нее пользователем разных хозяйственных операций. В помощь Неспециалистам существует тренинг «1С:Эксперт по техно- логическим вопросам». В результате изучения данного курса достигается знание методик проектирования и разработки информационных систем, рассчитанных на одновременную работу большого количества пользова- телей; владение методиками и технологиями нагрузочного тестирования систем на платформе «1С:Предприятие 8»; умение администрировать информационную систему с целью достижения максимальной произ- водительности и пропускной способности; умение оценивать эффективность работающей системы, производить мониторинг проблем и узких мест и пр. Том 2
гЖизненныи1цикл1прикладного]рёшения Внедрение Процесс внедрения простого прикладного решения сводится, как правило, к созданию информационной базы и краткому инструктажу пользователя. При наличии подробной справки и документации пользователь может освоить работу в прикладном решении и самостоятельно, без посто- ронней помощи. Можно сказать, что в большинстве случаев внедрение является завершающим моментом в разработке, не требующим каких-то особенных затрат сил и средств. Это своего рода точка, которую ставит разработчик. Все, работа выполнена, пользователь доволен. Для крупных проектов все обстоит с точностью до наоборот. Наибольшее количество сложностей и проблем возникает именно на этапе внедрения проекта у заказчика. Причем эти трудности в подавляющем большинстве не относятся к конкретному внедряемому решению, а имеют общий характер, одинаковый для разных решений и для разных заказчиков. Необходимость поэтапного внедрения, обучение большого количества новых пользователей за короткое время, согласованный перенос данных и параллельная работа с существующей системой автоматизации, преодо- ление сознательного и подсознательного противодействия внедрению новой системы, получение адекватной оценки результатов внедрения - вот лишь неполный список задач, которые приходится решать при любом крупном внедрении. Очевидно, что для успешного выполнения задачи требуется уже не просто настойчивость и умение, а владение отлаженной технологией внедрения, в которой задействовано большое количество специалистов различного профиля. Сопровождение в процессе эксплуатации Процесс сопровождения прикладного решения также значительно отли- чается в одном и другом случае, вплоть до того, что простое прикладное решение может вообще не требовать какого-либо сопровождения. Оно просто и понятно в использовании, обладает необходимой функцио- нальностью и полностью устраивает пользователя. Если же мы говорим о крупном решении и тем более о решении тиражном, подразумевающем продажу большого количества копий, то здесь вопрос качественного сопровождения выпущенного прикладного решения стано- вится одним из важных факторов, который будет обеспечивать дальнейший рост продаж. Пользователь должен иметь возможность самостоятельно установить прикладное решение. Для этого платформа «1С:Предприятие» содержит инструмент создания дистрибутивов. Затем нужно обеспечить обновление существующих у пользователя версий прикладного решения на новые, которые будут выпускаться по мере необходимости. Для этих целей платформа также содержит механизм поддержки прикладных решений, который позволяет пользователю обновлять версию своего прикладного решения, как в ручном, так и в автоматическом режиме.
Ела ва>22Д Метод и ка] разработки! Выводы Прежде чем перейти к более подробному рассмотрению возможностей системы, обеспечивающих индустриальную разработку прикладных решений, хочется еще раз акцентировать внимание на том, что разработка крупных решений требует не только умения пользоваться соответству- ющими механизмами и инструментами платформы, но и гораздо более взвешенного, внимательного и тщательного подхода к вопросу разра- ботки вообще. Это объясняется тем, что платформа обладает довольно широкими возмож- ностями, которые, однако, следует использовать с умом. Например, система позволяет разработать очень сложный, но эффективный запрос и в то же время допускает создание простого, но очень неэффективного запроса. Предоставив разработчику большую свободу для творчества, система уже не может однозначно определить, является ли данное решение, принятое разработчиком, ошибочным, или, наоборот, это сознательное использо- вание некоторой конкретной возможности системы. Поэтому вопросам проектирования структуры метаданных, параллельности работы, эффек- тивности запросов, способов реализации функциональности следует уделять больше внимания, по сравнению с предыдущими версиями плат- формы, а при разработке крупных решений - особенно. ПРОЕКТИРОВАНИЕ СТРУКТУРЫ МЕТАДАННЫХ Как уже говорилось выше, этап проектирования структуры метаданных имеет одно из первостепенных значений при разработке крупных прикладных решений. Однако и для более простых решений создание правильной структуры объектов является важным и ответственным этапом разработки. От правильно принятого решения зависит не только удобство разработки и производительность создаваемого прикладного решения, но и возможность его развития и адаптации к возможным изме- нениям состава решаемых задач. В большинстве случаев выбор подходящего объекта конфигурации не представляет большой сложности, так как для каждого вида объекта конфигурации определено основное назначение и имеется достаточно примеров, как в методических материалах, так и в типовых конфи- гурациях. Однако, разумеется, состав видов объектов конфигурации, предоставляемый платформой, как любая классификация, не может одно- значно определять выбор подходящего объекта во всех случаях. Поэтому в спорных ситуациях, когда выбор вида объекта конфигурации неоче- виден, нужно внимательно проанализировать все особенности устройства и поведения объектов соответствующего вида.
Выбор между объектными и необъектными данными Например, одним из типичных вопросов, возникающих в сложных случаях, является выбор между объектными и необьектными данными. К объектным данным относятся данные справочников, документов, планов видов характеристик, планов счетов, планов видов расчета, бизнес-про- цессов, задач, планов обмена. К необъектным данным относятся данные регистров сведений, регистров накопления, регистров бухгалтерии, регис- тров расчета, перерасчетов, последовательностей и констант. Чаще всего это выбор между справочником и регистром сведений. Здесь рекомендуется прежде всего обратить внимание на природу данных предметной области. Если сами данные являются по сути перечнем уникальных объектов, то рекомендуется использовать объектные данные. Важным моментом проектирования структуры метаданных является то, что выбор вида объекта конфигурации не может производиться для каждой сущности предметной области отдельно. Необходимо обязательно анализировать всю совокупность сущностей, отражаемых в конфигурации на текущий момент, а также учитывать возможное включение новых сущностей в дальнейшем. Поэтому о правильности принятия решения можно говорить только с учетом состава задач, решаемых при разработке конкретной конфигурации. Например, в одном прикладном решении состав сотрудников органи- зации будет правильно отражать в справочнике, так как с точки зрения этой конфигурации сотрудник является объектом. Однако в другой конфи- гурации, содержащей более широкую функциональность (например, многофирменность), может быть принято решение в справочнике отра- жать такую сущность, как физические лица, как более общее понятие. А информация о сотрудниках в этом случае может храниться в регистре сведений. Фактически регистр сведений будет отражать факт работы конкретного физического лица в конкретной организации, реализуя таким образом связь «многие ко многим». Но может быть принято решение в пользу хранения и в этом случае сотрудников в справочнике, факти- чески отражая в справочнике в качестве объектов не физическое лицо, а трудовой договор, в котором указывается физическое лицо и органи- зация. Тогда справочник будет не просто связывать физические лица и организации, а описывать объекты - трудовые договоры, имеющие свойство уникальности в пространстве и времени. Для отражения информации, связанной с объектом (например, с элементом справочника), но не имеющей собственной объектной сущности, реко- мендуется использовать табличную часть. Например, для справочника Тоаары может быть создана табличная часть ЕдиницыИзмерения. Однако следует помнить, что при использовании табличной части уже нельзя будет ссылаться на строки табличной части, то есть нельзя будет Профессиональная разработка в системе «1С:Предприятие 8»
создать реквизит, соответствующий понятию «строка табличной части». Например, если для справочника Сотрудники завести табличную часть Образование (вместо подчиненного справочника), то для реквизитов доку- ментов нельзя будет выбрать тип, аналогичный понятию «место учебы сотрудника». Это следует учитывать при выборе между подчиненным справочником и табличной частью. Если даже в перспективе может возникнуть потребность ссылаться на подчиненные объекты, например, создавать ссылающиеся на них рекви- зиты документов или других справочников, то лучше сразу завести подчиненный справочник. Если же ссылка на такие сведения не имеет смысла и никогда не может быть типом какого-либо реквизита, тогда можно завести табличную часть. Таким образом, при проектировании состава объектов конфигурации разработчику очень важно четко представлять, какую сущность пред- метной области будет отражать конкретный объект. Анализ логики работы прикладных объектов с данными Важно учитывать, что объекты конфигурации того или иного вида описы- вают не просто таблицы базы данных с некоторым набором полей, а обеспечивают определенную логику работы с данными. Эта логика определяет и состав возможностей, автоматически предоставляемых разработчику, и набор ограничений, и параметры производительности тех или иных операций с данными. Типичной ошибкой, например, является использование регистра сведений в качестве простой таблицы для записи некоторых данных. Регистр сведений предназначен для хранения сведений, соответствующих опре- деленным комбинациям значений измерений. Соответственно, одним из основных его свойств является обеспечение уникальности записей по составу измерений и периоду (для периодического регистра). Поэтому при каждой записи регистр сведений выполняет в обязательном порядке удаление существующих записей с такой комбинацией значений измерений или проверку уникальности (в зависимости от способа записи). Если при этом выполняется добавление одиночных записей с помощью менеджера записи, то такая операция будет приводить к доста- точно большим накладным расходам, особенно если имеется большое количество измерений. Таким образом, если отражаемая сущность пред- метной области не подходит по своей природе под регистр сведений, то следует рассмотреть целесообразность использования регистра сведений (особенно с учетом предполагаемого объема хранимой информации). В случае хранения подчиненной информации в табличной части справоч- ника необходимо помнить, что при обращении к элементу справочника он весь, вместе со всеми табличными частями считывается из базы данных Том 2
в память, независимо от того, отображаются данные табличных частей или нет. Если табличная часть содержит достаточно большое количество строк, это может заметно сказаться на производительности системы. Анализ производительности Еще одним аспектом, который следует рассматривать при выборе вида объекта конфигурации, является необходимость учета технологических особенностей работы платформы с данными, поддерживаемыми этим объектом. Состав прикладных объектов конфигурации должен макси- мально соответствовать реальному составу сущностей предметной области, однако при его проектировании необходимо рассматривать и технологические вопросы. В некоторых случаях даже в правильно спроектированную структуру объектов необходимо внести коррективы, диктуемые технологическими особенностями. Например, если в составе информации об объекте необходимо хранить большие объемы бинарных данных (картинки, файлы и т. д.), то для этой цели рекомендуется заводить отдельные объекты метаданных (спра- вочники или регистры сведений), связанные с данным объектом, чтобы исключить обязательное считывание больших объемов информации при считывании объекта. Если речь идет о структурах данных, предполагающих хранение боль- шого объема информации или интенсивное использование, то для оценки эффективности принятого решения можно рекомендовать провести экспе- рименты, в которых на объемах данных, сопоставимых с реальными, сравнить производительность одних и тех же операций с разными вари- антами структуры. Анализ возможностей использования обмена данными В качестве еще одной рекомендации можно предложить учитывать в процессе проектирования возможное использование в данной конфи- гурации механизмов обмена данными. Хотя такая потребность не всегда определена заранее, но можно предположить, что она возникнет в ходе эксплуатации системы. Поэтому полезно при проектировании основных объектов конфигурации подумать о возможных вариантах обмена с точки зрения принимаемых решений по организации структуры данных. Например, следует учитывать, что табличная часть объекта явля- ется его неотъемлемой частью при всех операциях добавления, записи и удаления. Соответственно, при организации распределенной системы обмен данными объекта будет происходить, включая все его табличные части. С другой стороны, данные регистров и подчиненных справоч- ников участвуют в обмене самостоятельно, что позволяет управлять
Ела ва>22Д Метод и ка] разработки! их миграцией независимо от объектов, с которыми они связаны. Например, может передаваться элемент справочника, но не передаваться регистр сведений, хранящий связанную с ним информацию. Анализ параллельности работы Параллельность работы пользователей - важный вопрос при создании многофункциональных прикладных решений. На этапе проектирования закладывается база для эффективной и успешной работы прикладного решения в многопользовательской среде. Поэтому нужно внимательно относиться к алгоритмам взаимодействия различных объектов конфигурации, которые планируется реализовывать. Следует помнить о том, что такой алгоритм может выполняться одновре- менно несколькими пользователями. Это поможет избежать возникновения узких мест прикладного решения в результате неудачного взаимодействия объектов конфигурации между собой. Также следует уделять достаточное внимание вопросам оптимального индексирования объектов конфигурации, поскольку это позволяет в даль- нейшем существенно сократить диапазон блокировок и вероятность возникновения взаимных блокировок при конкурентной работе пользо- вателей. ГРУППОВАЯ РАЗРАБОТКА ПРИКЛАДНЫХ РЕШЕНИЙ Рост функциональности создаваемого прикладного решения приводит к тому, что требуется одновременная работа нескольких разработчиков для того, чтобы прикладное решение было создано в разумные сроки. При этом каждый из разработчиков, как правило, создает отдельную функционально законченную часть прикладного решения, которая взаимо- действует с другими частями прикладного решения, созданными другими разработчиками. Сложность организации подобного процесса разработки заключается в том, что, как правило, одни и те же объекты конфигурации задейство- ваны в различных функциональных частях прикладного решения. Поэтому изменения, вносимые разными разработчиками в одни и те же объекты, должны быть очень хорошо согласованы между собой, иначе неизбежно появление большого количества ошибок. Для того чтобы упростить и автоматизировать процесс разработки приклад- ного решения коллективом разработчиков, платформа «1С:Предприятие» содержит специальный механизм, позволяющий вести групповую разра- ботку решений.
Используемая терминология Прежде чем перейти к дальнейшему рассмотрению методики работы с хранилищем конфигурации, следует определиться с терминами, которые будут использоваться в ходе изложения. Режим работы с подключением к хранилищу - это основной способ работы с хранилищем конфигурации, при котором в информационной базе сохраняется информация о подключении к хранилищу, а в храни- лище сохраняется информация о подключении информационной базы. Этот режим может быть завершен только в результате выполнения команды отключения от хранилища; закрытие окна конфигуратора не приводит к отключению от хранилища. Таким образом, редактирование конфигу- рации может выполняться и без непосредственной связи с хранилищем конфигурации. В этом режиме доступны все операции с хранилищем конфигурации. Режим работы без подключения к хранилищу — это вспомогательный способ работы с хранилищем конфигурации, при котором можно выпол- нять все действия, за исключением захвата, получения и помещения объектов в хранилище. Для завершения этого режима можно выполнить команду закрытия хранилища или просто закрыть окно конфигуратора. Работа в этом режиме возможна только при непосредственной связи с хранилищем конфигурации. Этот режим предназначен в основном для того, чтобы иметь возможность выполнять административные и неко- торые другие действия с хранилищем на любом компьютере, на котором установлено «1 (^Предприятие». Подключение к хранилищу — это процесс, в результате которого информа- ционная база, которая еще не подключена к хранилищу конфигурации, подключается к нему в режиме работы с подключением. Отключение от хранилища - это процесс, позволяющий завершить режим работы с подключением к хранилищу. Информационная база снова стано- вится не подключенной к хранилищу конфигурации. Соединение с хранилищем - процедура соединения информационной базы, ранее подключенной к хранилищу конфигурации, с хранилищем конфи- гурации. Эта процедура выполняется системой как отдельно (например, после открытия в конфигураторе информационной базы, подключенной к хранилищу), так и в процессе подключения к хранилищу конфигу- рации. Открытие хранилища - это процесс, позволяющий соединиться с храни- лищем конфигурации в режиме работы без подключения к хранилищу. Закрытие хранилища — это процесс, позволяющий завершить режим работы без подключения к хранилищу. Профессиональная разработка в системе «1С:Предприятие 8»
Общие сведения о хранилище конфигурации Основу механизма групповой разработки составляет хранилище конфи- гурации. Хранилище создается на каком-либо общем сетевом ресурсе, и в него помещается конфигурация, которую предполагается разрабаты- вать. Каждый из разработчиков создает на своей рабочей станции тестовую информационную базу и подключает ее к хранилищу. При подключении к хранилищу конфигурация тестовой базы автоматически заменяется конфигурацией, содержащейся в хранилище, и все объекты метаданных становятся недоступными для редактирования. Таким образом, каждый из разработчиков имеет возможность тестировать и отлаживать текущую разрабатываемую конфигурацию на своей рабочей станции и на своих тестовых данных, независимо от других разработчиков (рис. 22.2). Рис. 22.2. Использование хранилища конфигурации Ключевым моментом здесь является то, что, не предприняв специальных действий, разработчик не имеет возможности редактировать объекты конфигурации. Дальнейшая работа строится следующим образом: если разработчику необходимо изменить какой-либо объект конфигурации, он захватывает его в хранилище, вносит изменения и затем помещает обратно в храни- лище (рис. 22.3). Таким образом, обеспечивается блокировка одновременного изменения объекта несколькими разработчиками: разработчик может захватить в хранилище только те объекты, которые не захвачены другими пользователями. Другими словами, захват объектов в хранилище выпол- няется эксклюзивно, и, захватив объект, разработчик может быть уверен, что этот объект не будет изменен другими разработчиками до тех пор, пока он не поместит его в хранилище и/или не отменит захват в храни- лище (рис. 22.4). Том 2
Захват объектов в хранилище Редактирование объектов в отладочной баае и отладка Помещение в хратммце и освобождение объектов Рис. 22.3. Захват и помещение объектов в хранилище Рис. 22.4. Монопольный захват объектов в хранилище Помимо обеспечения захвата и блокировок объектов конфигурации, хранилище предоставляет целый ряд сервисных функций, которые упро- щают ведение разработки и делают ее более автоматизированной.
Прежде всего, это возможность версионирования разработки и ведения истории изменения версий. Хранилище позволяет не только просмат- ривать список версий, но и выводит отчеты в различных разрезах: по версиям, по объектам разработки, по комментариям к версиям. Поддерживается возможность отката назад и удаления ненужных версий, опубликованных в хранилище, а также возможность удаления самых ранних ненужных версий путем сокращения до нужной версии. Также хранилище позволяет разработчику просмотреть любую из версий, находящихся в хранилище, сравнить различные версии, загру- зить выбранную версию в локальную отладочную базу, с которой работает разработчик, или сохранить в файл на диске. Создание хранилища конфигурации Процесс создания хранилища конфигурации подробно описан в докумен- тации и не представляет сложностей. Стоит лишь заметить, что хранилище может располагаться как на том же компьютере, который используется разработчиком (в случае, если хранилище используется только одним разработчиком) (рис. 22.5), так и на общем сетевом ресурсе, если храни- лище используется группой разработчиков (рис. 22.6). Рис. 22.6. Расположение хранилища на общем сетевом ресурсе
Пользователи хранилища Хранилище конфигурации позволяет определить необходимое количество пользователей хранилища, задать имя пользователя, пароль и опреде- лить права пользователя. При создании хранилища система обязательно создает пользователя хранилища, обладающего полным набором прав, и предлагает задать имя пользователя (по умолчанию Администратор) и пароль. Пользователи хранилища создаются в окне администрирования хранилища конфигурации, вызываемом по команде Конфигурация ► Храни- лище конфигурации ► Администрирование хранилища... Права пользователей Каждому пользователю хранилища может быть назначен индивидуальный набор прав, определяющий действия, которые данный пользователь может выполнять с хранилищем конфигурации. Существуют три права: Адми- нистративные функции, Изменение состава версий и Захват объектов: право Администратианые функции позволяет создавать, изменять и удалять пользователей хранилища, отключать пользователей, подключенных к хранилищу, и отменять захват объектов хранилища, выполненный другими пользователями; право Изменение состава версий позволяет выполнять откат, сокра- щение и объединение версий конфигураций в хранилище; право Захват объектов позволяет захватывать объекты в хранилище и вносить изменения в конфигурацию хранилища. Все эти права связаны друг с другом. Установка права Администратианые функции подразумевает, что пользователь может выполнять любые дейс- твия с хранилищем, поэтому при установке этого права устанавливаются также и права Изменение состава версий и Захват объектов. Установка права Изменение состава аерсий требует, чтобы пользователь имел возможность захвата и изменения объектов, поэтому вместе с этим правом устанавливается и право Захаат объектов. Таким образом, возможны четыре различных сочетания прав (табл. 22.1). Таблица 22.1. Сочетания прав пользователей хранилища Установленные права Действия пользователя Административные функции Изменение состава версий Захват объектов Пользователь может выполнять любые действия с хранилищем Изменение состава версий Захват объектов Пользователь может выполнять любые действия, кроме административных Захват объектов Пользователь может выполнять только захват, изменение объектов, помещение их в хранилище и отказ от захвата объектов Нет установленных прав Пользователь может только просматривать объекты хранилища Профессиональная разработка в системе «1С:Предприятие 8»
Подключение к хранилищу Процесс подключения информационной базы к хранилищу заключается в том, что между информационной базой и хранилищем устанавлива- ется связь, которая будет поддерживаться до тех пор, пока база не будет отключена от хранилища. Информация о подключении хранится как в подключаемой базе, так и в хранилище. Профиль информационной базы хранит информацию о местонахождении хранилища и пользова- теле хранилища, от имени которого выполняется подключение. В свою очередь, в хранилище для данного пользователя записывается информация о подключенной информационной базе и ее расположении (рис. 22.7). Рис. 22.7. Подключение к хранилищу Такой способ установки связи определяет некоторые особенности работы с хранилищем. Так, например, для каждого пользователя хранилища в каждый момент времени может быть подключена только одна информа- ционная база. С другой стороны, если информационная база была подключена к храни- лищу от имени некоторого пользователя, то каждый раз при открытии ее в конфигураторе система будет предлагать соединиться с хранилищем от имени этого пользователя. Если по каким-либо причинам требу- ется выполнить соединение от имени другого пользователя, то сначала нужно отключить базу от хранилища (при этом в хранилище для данного пользователя будет очищена информация о подключении), а затем уже выполнить новое подключение от имени другого пользователя хранилища. Смена пользователя, от имени которого выполняется подключение, на лету не поддерживается. При подключении информационной базы к хранилищу выполняется аутен- тификация пользователя в хранилище конфигурации, и затем, возможно, Том 2
выполняется непосредственно процедура подключения информационной базы к хранилищу. При этом возможны две ситуации. Ситуация первая-, аутентификация пользователя хранилища выпол- нена (рис. 22.8), но для этого пользователя нет информации о подключенной базе. В этом случае производится подключение и устанавливается связь (рис. 22.9). Рис. 22.9. Подключение к хранилищу выполнено Рис. 22.8. Подключение к хранилищу Ситуация вторая', аутентификация пользователя хранилища выпол- нена, но для данного пользователя хранилища уже имеется информация о подключенной информационной базе (например, этот пользователь пытается подключиться с другой рабочей станции), рис. 22.10. Подключение информационной базы 2 к хранилищу Рис. 22.10. Подключение к хранилищу с другого компьютера
В этом случае еще на этапе аутентификации проверяется наличие соеди- нения данного пользователя с хранилищем. Если соединения нет, то система предоставляет возможность подключиться, предупреждая, однако, о том, что для данного пользователя хранилища уже имеется информация о другой подключенной информационной базе. Если в этом случае разработчик все равно решит подключиться, то система выполнит новое подключение, и в хранилище изменится информация о подклю- ченной информационной базе для данного пользователя (рис. 22.11). После подоючежя жформедя в хрелимце измежтся для этого пользователя Рис. 22.11. Выполнено подключение со второго компьютера Это приведет к тому, что при открытии в конфигураторе старой инфор- мационной базы система предложит соединиться с хранилищем конфигурации, основываясь на той информации, которая хранится в этой базе (рис. 22.12). ИБ1 будетгъггатъсяподоточпъсякхранилнцу, небезуспешно, тх. информация о подключении на совпадает Рис. 22.12. Попытка соединения прежней информационной базы с хранилищем
При этом будет запрошен диалог аутентификации, однако соединиться с хранилищем уже не удастся. Как говорилось выше, смена пользователя на лету не поддерживается, поэтому необходимо сначала отключить базу от хранилища, а затем произвести повторное подключение, если в этом есть необходимость (рис. 22.13). После отключения ИБ1 от хранилища жформацря о подключении будет очищена, и базу моиио подключить заново Рис. 22.13. Состояние посла отключения от хранилища Действия, выполняемые системой при подключении к хранилищу При подключении к хранилищу конфигурации система получает из хранилища конфигурацию, заменяет основную конфигурацию инфор- мационной базы на ту конфигурацию, которая получена из хранилища, и сохраняет основную конфигурацию информационной базы. После этого выполняется процедура соединения с хранилищем конфигурации. Действия, выполняемые системой при соединении с хранилищем В процессе соединения с хранилищем аутентифицируется пользова- тель хранилища, проверяется соответствие информации о подключении в информационной базе и в хранилище конфигурации. Затем выполняется проверка информации о захвате объектов в хранилище и в информаци- онной базе. Если выясняется, что информация не синхронизирована (например, объект захвачен в хранилище, но в информационной базе нет информации о захвате этого объекта), то выполняется синхронизация этой информации на основании того, какое состояние объекта указано в хранилище конфигурации. Если в хранилище объект захвачен, он будет помечен как захваченный и в информационной базе. Если в хранилище объект не захвачен, в информационной базе будет снята отметка о захвате этого объекта. Профессиональная разработка в системе «1С:Предприятие 8»
Отображение состояния объектов конфигурации Для выполнения операций с хранилищем конфигурации предназначено окно хранилища конфигурации. Из этого окна можно выполнить все операции, доступные с хранилищем конфигурации. Кроме этого, большой ряд операций с хранилищем доступен и из окна конфигурации. Для того чтобы разработчик мог видеть текущее состояние объектов конфигурации, и в том и в другом окне выводится информация о состоянии объектов в виде пиктограмм. ® - Закрытый замок синего цвета обозначает объект, который не захвачен ни одним пользователем хранилища. Разработчик не может редак- тировать такой объект, но может выполнить захват такого объекта, после чего редактирование станет возможным. * - Закрытый замок синего цвета с отметкой красного цвета обозначает объект, который захвачен разработчиком. Такой объект разработчик может редактировать, но другие разработчики, подключенные к хранилищу, захватить этот объект не могут. & - Закрытый замок синего цвета с пиктограммой красного цвета обоз- начает объект, который захвачен другим пользователем хранилища. Разработчик не может редактировать этот объект, но, при необходи- мости, может получить этот объект (например, если ему необходимо видеть текущую версию этого объекта, находящуюся в хранилище конфигурации). v — Отметка красного цвета обозначает объект, который добавлен разработчиком в отладочной конфигурации, но еще отсутствует (не помещен) в хранилище конфигурации. Также этой пиктог- раммой обозначается объект, который удален из хранилища, но еще присутствует в отладочной конфигурации разработчика. Кроме перечисленных пиктограмм для обозначения состояния объектов конфигурации используются еще четыре похожие пиктограммы, имеющие меньший размер и дополнительное изображение дерева рядом с пиктог- раммой (рис. 22.14). s Рис. 22.14. Пиктограммы подчинанных объектов Эти пиктограммы имеют тот же самый смысл, что и перечисленные выше, но присутствуют у тех объектов конфигурации, которые не могут быть захвачены в хранилище самостоятельно, а только в составе родительского объекта. Такими объектами являются, например, реквизиты, табличные части, реквизиты табличных частей, значения перечислений, измерения, ресурсы и некоторые другие объекты конфигурации. Формы и макеты могут быть захвачены самостоятельно. Том 2
Групповая1разработка]прикладнй1хфешений Просмотр состояния объектов Зачастую возникает необходимость просмотреть, какие объекты захва- чены в хранилище и какой пользователь выполнил захват. Для этого можно использовать различные способы. Прежде всего, можно использовать окно конфигурации и посмотреть на пиктограммы, которые показывают состояние объектов конфигурации. Если объект захвачен другим пользователем хранилища, то при наве- дении курсора на пиктограмму система выведет подсказку с подробной информацией о пользователе, дате и времени захвата объекта, компью- тере, с которого выполнен захват, и пути к отладочной базе разработчика (рис. 22.15). Конфигурация <!> О X Действия & О ДемонстрациожаяКонфигурациАМправляе... '* Общие <£ Эа Константы <т' fflj Справочники * Щ] Товары $ НИ Контрагенты * fflj Склады «• аи ддщ fflj Регионы Ф fflj ВидыЦен • ¥• fflj РасчегныеСчетаКонграгентов fflj ЗначенийКарактерисгик '¥• fflj Бант fflj РасчегныеСчета fflj ХранмшеФайлы fflj НастройкиТорговогоОборуоования & fflj ХранилищеВарианговОтчетов fflj Организации Ф fflj ВходящиеПисьма fflj ИсходящиеПисьма fflj ПочговыеВложения □ Документы О Журналы документов & & & & & & & & & & & & & а Объект захвачен другим пользователем в хранилище конфигурации Пользователь: Исаев Дата захвата: 16.02.2011 20:36:11 Комгъетер: WORK Информациожая база: d:\Docuntents and Sellng$MJSER\MoH документы\1п(оВа$е4 Рис. 22.15. Состояние захваченного объекта Такой способ может быть удобен для небольших конфигураций, однако если конфигурация содержит большое количество объектов, то найти нужный среди нескольких сотен объектов бывает нелегко. В этом случае можно использовать другой способ, который предостав- ляет окно хранилища конфигурации. Чтобы открыть это окно, нужно выполнить команду Конфигурация ► Хранилище конфигурации ► Хранилище. Окно хранилища конфигурации по умолчанию отображает конфигурацию в виде дерева с отключенным отбором. Для удобства следует переклю- чить представление данных в этом окне с дерева на список (команда меню Вид ► Список), а затем установить отбор Все захваченные (команда меню Действия ► Отбор), рис. 22.16.
I Гл а ваУ22Я Метод и ка] разработки Хранилище конфигурации О X Рис. 22.16. Просмотр захваченных объектов в окне хранилища конфигурации В результате будет отображен список всех объектов, которые захва- чены пользователями хранилища, с указанием имени пользователя, даты и времени захвата, имени компьютера, с которого произведен захват, и пути к отладочной базе (на рисунке колонки Дата, Компьютер и Инфор- мационная база скрыты). При необходимости можно детализировать список захваченных объектов и вывести объекты, захваченные только одним из пользователей. Для этого нужно установить соответствующие параметры отбора списка (рис. 22.17). Отбор объектов хранилища X Отображать: ОВсе объекты ОВсе захваченные | ОК | j Отмена ] | Справка | Рис. 22.17. Отбор объектов хранилища Обновление информации о состоянии объектов конфигурации При выполнении разработчиком действий с хранилищем (например, захват, помещение объектов и др.) информация о состоянии объектов конфигурации, отображаемая в открытых окнах его отладочной базы, обновляется автоматически, после выполнения каждого действия, так как в этот момент выполняется обмен информацией с хранилищем. В остальное время непосредственная связь с хранилищем не требуется, и разработчик работает автономно. Поэтому изменения, производимые в это время другими пользователями хранилища, автоматически не отоб- ражаются. Для того чтобы получить актуальную информацию о захвате объектов конфигурации, следует использовать команду меню окна конфи- гурации Конфигурация ► Хранилище конфигурации ► Обноаить статусы или команду меню окна хранилища Дейстаия ► Обновить статусы, которая обновляет информацию о захваченных объектах. о®
Захват и помещение объектов в хранилище Как уже упоминалось в начале этой главы, для того чтобы изменить объект конфигурации, разработчику необходимо выполнить следующую последовательность действий: 1. Захват объекта. 2. Изменение объекта. 3. Помещение объекта в хранилище. Однако в процессе разработки могут возникать различные промежуточные ситуации, которые требуют получения актуальных данных из хранилища или управления захватом и освобождением объектов. Поэтому кроме команд Захватить в хранилище и Поместить в хранилище существуют еще две команды: Отменить захаат а хранилище и Получить из хранилища. Рассмотрим каждую из этих команд подробнее. Захват в хранилище Команда Захватить в хранилище позволяет разработчику захватить объект, который еще не был захвачен другими разработчиками. Захват может быть осуществлен как в окне конфигурации (из контекстного меню), так и в окне хранилища конфигурации. Выбор того или иного способа - дело вкуса разработчика, однако захват объектов в окне хранилища конфигу- рации позволяет выполнить множественный захват объектов, чего нельзя сделать в окне конфигурации. В ходе выполнения команды Захватить а хранилище система выводит список захватываемых объектов. Остановимся подробнее на информации, которая содержится в этом списке (рис. 22.18). Захват объектов в хранилища конфигурации X I Объект I Захватить И fflj Сгравочинк-ВхопящиеПисьма 0 0 fflj СправочннкИсхсаящиеПисьма 0 □ Выполнять рекурсивно О Разрешать получать захваченные I ОК 11 Отмена ] | Справка | Рис. 22.18. Захаат объектов в хранилище конфигурации В первой колонке указывается признак получения объекта из хранилища. По умолчанию для всех захватываемых объектов будет выполняться полу- чение этих объектов из хранилища. Вторая колонка списка отображает состояние объекта. Возможны четыре состояния (табл. 22.2). Профессиональная разработка в системе «1С:Предприятие 8»
Таблица 22.2. Состояния объектов Состояние Пиктограмма Описание Объект не будет изменен Нет пиктограммы Объект не будет изменен в отладочной конфигурации Объект будет изменен Объект в отладочной конфигурации будет изменен Объект будет добавлен +J Объект будет добавлен в отладочную конфигурацию Объект будет удален d Объект будет удален из отладочной конфигурации Состояние Объект не будет изменен говорит о том, что объект, захваты- ваемый в хранилище, совпадает с объектом, находящимся в отладочной базе. Состояние Объект будет изменен говорит о том, что объект, захватыва- емый в хранилище, отличается от объекта, находящегося в отладочной базе. Такая ситуация может возникать, например, после того, как разра- ботчик поместил объект в хранилище, этот объект был захвачен, изменен и помещен в хранилище другим разработчиком. Тогда при новом захвате этого объекта система сообщит разработчику, что объект, находящейся в его отладочной базе, отличается от того, который находится в хранилище. Состояние Объект будет удален говорит о том, что объект, который разработчик хочет захватить, отсутствует в конфигурации хранилища. Например, он был удален другим разработчиком, который посчитал этот объект лишним. Состояние Объект будет добавлен говорит о том, что из хранилища будет получен объект, который отсутствует в отладочной конфигурации. Здесь следует объяснить одну особенность захвата и помещения объектов. Помимо непосредственно тех объектов, которые указывает разработчик для захвата (или помещения в хранилище), система будет анализиро- вать также необходимость выполнения этой операции и над другими объектами, связанными с указанными явным или неявным образом. Например, если другой разработчик добавил новую форму к справочнику, то при захвате этого справочника система предложит также получить и добавленную форму этого справочника, которая отсутствует в отладочной конфигурации, но которая непосредственно связана с захватываемым справочником. И в этом случае для формы и будет как раз указано состо- яние Объект будет добавлен (рис. 22.19). Захват объектов в хранилище конфигурации | ' Объект | Захватить 0 fflj Справочник.Контрагенты а 0 3 Е Справочник.Контрагенгы.Форма.ФормаВыбораГруплы □ ОВыполнягь рекурсиеис О Разрешать получать захваченные [ ОК 11 Отмена 11 Справка | Рис. 22.19. Захват связанных объектов Том 2
Третья колонка показывает полное имя объекта метаданных, а в четвертой колонке отображается признак захвата объекта в хранилище конфигу- рации. Он также установлен по умолчанию (в большинстве случаев), однако разработчик может и сбросить его, если, например, требуется только получить объект из хранилища, а изменять его он не собирается. Также в диалоге захвата объектов хранилища разработчику предостав- ляется возможность определить два свойства, относящихся ко всем захватываемым объектам. Выполнять рекурсивно - указывает, что помимо тех объектов, которые перечислены в списке, следует также захватить и все их подчиненные объекты, которые могут быть загружены независимо (подчиненные объекты, которые не могут быть загружены независимо от родительского объекта, всегда будут получены вместе с родительским объектом). Например, если при захвате справочника не выполнять загрузку рекур- сивно, то из подчиненных объектов будут захвачены только реквизиты и табличные части справочника (рис. 22.20). Конфигурация <l> X Действия^ & __ г/ < J *в I* = Реквизиты в Регион £ “ Индекс £ = Страна £ = Город £ “ Улица £ = Дом £ = Телефон д = ЭлектроннаяПочта £ = Факс £ “ ВебСайт д = ВидЦен £ “ ДополнигельнаяИнФормация д = КонгакгноеЛмцо £ Ш Табличные части £• Формы ФормаЭлеменга в |F| ФормаВыбора в ФормвСгмска в ФормаВыбораГруппы в О Команды [ж] Макеты Рис. 22.20. Захват без рекурсивной загрузки Если же выполнить захват рекурсивно, то также будут захвачены и те объекты, подчиненные справочнику, которые могут быть захвачены отде- льно от него: формы и макеты (рис. 22.21). Флажок Разрешать получать захваченные позволяет при загрузке получить и те объекты, которые захвачены данным пользователем. Такая возмож- ность может потребоваться, например, когда нужно вернуться к состоянию хранилища, не отменяя захват объекта, а продолжая его редактирование.
I Гл а ваУ22Я Метод и ка] разработки Конфигурация <!> • X Действия'’ . & хг О . 5"ан *& |< $ = Реквизиты = Регион £ “ Индекс £ " Сгрена £ = Город £ " Улица £ = Дом £ = Телефон £ = ЭлектроннаяПочга £ = Фекс £ " ВебСайг д “ ВидЦен £ “ ДополгыгельнаяИнФормация £ “ КонгакгноеЛицо £ Ш Табличные части <у Формы ФормаЗлеменга "£) ФормаВыбора *В ФормаСписка *В ФормаВыбораГруппы *В О Команды [S5] Макеты Рис. 22.21. Захват с рекурсивной загрузкой Однако использовать этот флажок нужно внимательно, поскольку среди объектов, получаемых из хранилища, могут оказаться объекты, захва- ченные самим разработчиком ранее и уже измененные им в своей отладочной конфигурации. В этом случае изменения таких объектов, сделанные разработчиком в своей отладочной конфигурации, будут поте- ряны. Рассмотрим возможную ситуацию. Разработчик захватил и редактирует справочник СправочникА. Он добавляет в него реквизит, ссылающийся на справочник СпрааочникБ (рис. 22.22). Пользовател» Эфажлище Рис. 22.22. Действия первого пользователя OS
В это время другой пользователь также редактирует конфигурацию и решает удалить справочник СпрааочникБ. После этого помещает выпол- ненные изменения в хранилище (рис. 22.23). Рис. 22.23. Действия второго пользователя Теперь первый пользователь решает поместить изменения справоч- ника СправочникА в хранилище. Ему не удастся этого сделать, поскольку система попросит его поместить в хранилище и справочник СправочникБ, так как иначе в хранилище окажется ссылка на справочник, который там отсутствует. Поэтому система предложит пользователю захватить корень конфигурации, чтобы получить из хранилища нужные данные. Однако так как в хранилище уже отсутствует справочник СправочникБ, то система будет требовать получения и данных справочника СпрааочникА, иначе в конфигурации пользователя окажется ссылка на несуществующий справочник СправочникБ. В этом случае и потребуется установка флажка Разрешать получать захваченные. Однако при этом изменения, внесенные пользователем в справочник СправочникА, будут потеряны. Помещение в хранилище Процесс помещения объектов в хранилище прямо противоположен захвату их в хранилище. В ходе выполнения команды Поместить в храни- лище выдается аналогичный диалог, за тем лишь исключением, что первая колонка является признаком помещения объекта в хранилище, последняя колонка отсутствует (Захватить), и нет флажка Разрешать получать захва- ченные. Однако в диалоге присутствует другой флажок - Оставить захваченными, который позволяет не «расставаться» с объектами, перечисленными в списке, а лишь поместить их в хранилище. Таким образом, например, другие разработчики смогут получить эти объекты, чтобы узнать их актуальное состояние, а данный разработчик сможет продолжить их модификацию, не выполняя заново их захват в хранилище. Профессиональная разработка в системе «1С:Предприятие 8»
Версии конфигурации Если в результате выполнения команды Поместить а хранилище объекты хранилища были изменены, создается новая версия конфигурации в хранилище. Для идентификации каждой версии конфигурации в храни- лище сохраняется следующая информация: Порядковый номер версии - генерируется системой автоматически; Версия конфигурации - значение свойства Версия конфигурации; Дата - дата и время публикации изменений в хранилище конфигу- рации; Пользователь - имя пользователя, внесшего изменения; Комментарий - комментарий к выполненным изменениям; Метка - краткое описание некоторого крупного этапа разработки конфигурации (например, выпуск новой версии, подготовка поставки и т.д.); Комментарий метки - расширенное описание, комментирующее метку. Методология использования хранилища конфигурации предполагает, что каждая версия должна содержать какое-либо одно цельное изменение конфигурации. Например, исправление одной ошибки или одну доработку. В этом случае комментарий к этой версии будет описывать одно изме- нение, и это описание будет относиться ко всем объектам, измененным в данной версии. Такой порядок работы позволяет получить стройную и понятную структуру версий конфигурации, с которой в дальнейшем будет легко работать. Рекомендуется каждое такое изменение (все захваченные объекты мета- данных) помещать в хранилище за один прием, создавая только одну новую версию конфигурации. Если все же приходится помещать такие изменения в несколько приемов (создавая несколько версий), желательно указывать полностью идентичный комментарий ко всем таким измене- ниям. При написании комментария к версии следует учитывать, что этот коммен- тарий может быть использован при подготовке документации к очередной версии разрабатываемой конфигурации, в частности, выведен в отчет по версиям хранилища. Если в комментариях к версиям присутствует служебная информация, то ее лучше располагать после символов «//» (два слеша). В дальнейшем при формировании отчета эту информацию можно будет автоматически исключить из отчета. Если с символов «//» начинается строка, то вся эта строка может быть исключена из отчета. Если символы «//» располагаются в середине строки, то можно исключить часть строки, начиная с символов «//» и до конца строки. Том 2
Г ру п п б вая I раз ра ботка1прикладнй1х]решени й Отмена захвата Команда Отменить захаат а хранилище позволяет освободить объект в хранилище и получить из хранилища текущую версию объекта. Эта возможность может потребоваться, например, когда разработчик окончательно запутался в изменениях, которые он вносил в объекты, и хочет просто отпустить захваченные объекты, не изменяя их в храни- лище, чтобы начать работу заново или чтобы другие разработчики могли внести в них изменения. Получение объекта из хранилища Команда Получить из хранилища позволяет получить объект, не осущест- вляя его захват. Такая возможность может понадобиться, например, для того, чтобы посмотреть актуальное состояние объекта, который изменя- ется (или изменялся) другим разработчиком. Обновление конфигурации из хранилища Обновление конфигурации из хранилища - это получение изменений всех объектов из хранилища (за исключением захваченных данным пользова- телем). Для этого нужно выполнить команду меню окна конфигурации Конфигурация ► Хранилище конфигурации ► Обновить конфигурацию из храни- лища. Эта команда является сервисной, реализована для более удобной синхронизации конфигурации отладочной базы с последней версией конфигурации хранилища и позволяет в ряде случаев обойтись без допол- нительного подтверждения получения объектов из хранилища. Действия, выполняемые при обновлении конфигурации из хранилища, аналогичны действиям, выполняемым при получении объектов из храни- лища. Если сравнивать эту команду с получением объектов из хранилища, то можно сказать, что обновление конфигурации из хранилища приведет к тем же самым результатам, что и получение корневого объекта конфи- гурации с установленным признаком Выполнять рекурсивно. Администрирование хранилища Администрирование хранилища конфигурации может быть выпол- нено как в режиме работы с подключением, так и в режиме работы без подключения (естественно, если пользователь хранилища обладает административными правами). Для этого используется команда меню окна конфигурации Конфигурация ► Хранилище конфигурации ► Администрирование хранилища... или команда меню окна хранилища Дейстаия ► Администрирование хранилища... о®
Глава>22ЯМётодика1разработки В результате выполнения этой команды открывается окно администриро- вания хранилища, которое позволяет выполнять три группы действий: просмотр, создание, изменение и удаление пользователей хранилища; просмотр подключений, зарегистрированных в хранилище, и отклю- чение информационных баз от хранилища; просмотр объектов, захваченных в хранилище другими пользовате- лями, и отмена захвата объектов. Администрирование пользователей хранилища подробно описано в доку- ментации и не требует отдельных пояснений. Поэтому остановимся подробнее на просмотре подключений и захваченных объектов. На закладке Подключения система выводит список пользователей храни- лища, для которых есть информация о подключенных информационных базах. Список содержит имя пользователя, имя компьютера, с которого осуществлено подключение к компьютеру, и путь к информационной базе. Подключения, активные в данный момент (то есть те информационные базы, которые открыты пользователями в конфигураторе), выделя- ются жирным шрифтом. Администратор хранилища имеет возможность отключить выбранную информационную базу от хранилища, но лишь при условии, что эта база не открыта в данный момент в конфигураторе. То есть отключить можно только те подключения, которые не выделены жирным шрифтом. На закладке Отмена захаата отображается список объектов, захваченных конкретным пользователем. Здесь администратор хранилища также имеет возможность отменить захват каждого из объектов, но лишь в том случае, если отладочная база разработчика, захватившего данный объект, не открыта в режиме Конфигуратор. Такое отключение может понадобиться, например, если разработчик, уходя в отпуск, забыл поместить захваченные объекты в хранилище. В этом случае команда разработчиков, отменив захват его объектов, все же сможет продолжить работу с этими объектами. Также есть одна особенность отображения захваченных объектов на этой закладке: отображаются только объекты, захваченные другими пользова- телями. Объекты, захваченные текущим разработчиком, не отображаются. То есть просматривать и отменять захват «своих» объектов можно в окне хранилища конфигурации или в дереве конфигурации. Сравнение и сохранение текущей конфигурации хранилища Конфигурацию отладочной базы можно сравнить/обьединить с текущей конфигурацией хранилища, можно сравнить текущую конфигурацию хранилища с конфигурацией из файла, а также можно сохранить текущую конфигурацию хранилища в файл. Все эти действия доступны как в режиме работы с подключением, так и в режиме работы без подключения к хранилищу.
Также следует отметить, что хранилище позволяет сравнивать не только конфигурацию целиком, но и отдельные объекты хранилища с объек- тами конфигурации. Для этого используется команда окна хранилища конфигурации Действия ► Сравнить с объектом конфигурации. Выполнение этой команды сводится к получению отчета о сравнении конфигураций по выбранному объекту. В процессе выполнения этой команды разра- ботчик может открыть или не открывать стандартный диалог сравнения/ объединения конфигураций. Работа с версиями хранилища конфигурации Как уже говорилось ранее, при помещении измененных объектов в храни- лище система создает новую версию конфигурации хранилища, которую можно сопроводить дополнительной информацией. ПОДРОБНЕЕ Состав сопроводительной информации описан в разделе «Версии конфигурации», стр. 633. Для работы с версиями конфигурации следует выполнить команду окна конфигурации Конфигурация ► Хранилище конфигурации ► История храни- лища или команду меню окна хранилища Дейстаия ► История хранилища. Система откроет окно истории хранилища конфигурации, в котором будет представлена информация об имеющихся версиях (рис. 22.24). ^3 История хранилища Действия ’ | I Ei I I О N | Версия конф... I Дата Пользователь Метка 11.0.8.1 116022011 20:04:57 ^исгрэтор * 2 1.0.8.1 16-02.2011 Администратор Релиз 0.1 I Объект S fflj Справочннк-Конграгенгы 3 S Справочник. Контрагенты Форма. ФормаВыбораГруплы 4 1.0.0.1 17.02.2011... Администратор 5 1 .0.8.1 17-02.2011 _. Исаев Комментарий: Добавлена форма выбора группыдля справочника 'Контрагенты" Рис. 22.24. История хранилища Хочется обратить внимание, что в состав информации, отображаемой для каждой версии, входит комментарий к версии, комментарий к метке, а также состав объектов, измененных в этой версии. Метка предназна- чена для указания крупных этапов разработки и имеет поле комментария к метке для расширенного описания каждого этапа. Список измененных объектов содержит пиктограммы, которые позволяют определить состо- яние измененных объектов (был ли объект просто изменен, добавлен или удален). Контекстное меню позволяет открыть указанную версию объекта для просмотра, просмотреть историю изменения объекта за все время Профессиональная разработка в системе «1С:Предприятие 8»
или только за указанный период, а также сравнить версию объекта с текущей версией хранилища. Текущей версией хранилища является последняя версия в списке (имеющая максимальный номер). Для удобства можно выделить одновременно несколько версий - тогда будут показаны все объекты, измененные в этих версиях, а в поле Коммен- тарий выведены комментарии ко всем выделенным версиям. Для каждой версии можно изменить некоторую информацию о версии: метку, комментарий и комментарий метки. Каждую версию можно открыть для просмотра, загрузить в отладочную базу, сравнить/обьединить с конфигурацией отладочной базы, сравнить с конфигурацией из файла или сохранить в файл. Любые две версии хранилища можно сравнить между собой. Установка отбора в окне истории хранилища Версии, отображаемые в окне истории, могут быть отобраны по различным критериям при помощи команды Действия ► Отбор (рис. 22.25). Отбор версий хранилища X Я fl В«- я fl Объект - ДемонстрационнаяКонФигурацияУправляемоеПрил *• Общие • £ Константы Ф fflj Справочшки ¥• □ Документы Ф Журналы документов Перечисления £ |Д] Отчеты — $ Обработки S- S Планы видов характеристик ▼ |— -Диапазон версий хранилища--------------------------------------------------------- ОС версии О X ; ОПо версию О х С ®Сдагы | . . : : |... х| ®Подету [ . . : : ... х| |77| -Дополнительно--------------------------------------------------------------------- 0 Выводить метки Версия конфигурации: □ В ыеодить только метки [ х | | ОК 11 Отмена 11 Справка | Рис. 22.25. Отбор версий хранилища Например, можно выполнить отбор по одному или нескольким пользо- вателям хранилища. В этом случае будут отображены только те версии, которые создавались выбранными пользователями. Также можно установить отбор по определенным объектам конфигурации. В этом случае будут показаны те версии, которые содержат изменения выбранных объектов. Том 2
Кроме этого, можно ограничить диапазон отображаемых версий, как в терминах версий, так и в терминах календарных дат. Флажок Выводить метки позволяет отображать версии, отмеченные метками. Если этот флажок снять, то будут показаны только те версии, которые не отмечены метками. Флажок Выводить только метки позволяет отображать только версии, отме- ченные метками. Если оба флажка установлены, то будут показаны только те версии, которые отмечены метками. В поле Версия конфигурации можно указать нужную версию (колонка Версия конфигурации), и тогда будут отображены только те версии конфи- гурации хранилища, для которых значение этого поля соответствует указанному. Откат к предыдущей версии Хранилище предоставляет возможность откатиться от текущей версии к любой предыдущей. При этом из хранилища удаляются все версии конфигурации, расположенные после указанной. Такая возможность может понадобиться, если в хранилище были опубли- кованы ненужные версии конфигурации. Сокращение до выбранной версии Хранилище конфигурации можно сократить до любой выбранной версии. В этом случае из хранилища удаляются все версии конфигурации, распо- ложенные ранее указанной. Такая возможность может понадобиться, когда ранние версии конфигу- рации становятся ненужными. Объединение версий Несколько последовательных версий хранилища могут быть объединены в одну. В результате будет сформирована одна сводная версия, включа- ющая в себя изменения всех выбранных версий. Отчеты по истории хранилища Хранилище конфигурации позволяет выполнять несколько видов отчетов по истории хранилища. Такие отчеты имеют двоякое назначение: с одной стороны, они могут использоваться для внутренних целей (например, для отслеживания хода разработки), а с другой стороны - для формирования сопроводительной документации к выпускаемым версиям конфигурации. Создать отчет по истории хранилища можно при помощи команды Действия ► Отчет по истории хранилища (рис. 22.26).
I Пл а ва}22Я Метод и ка! разработки Отчет по истории хранилища X - Отчет по:------------------------------- Фёёрсиям хранилища О Объектам разработки О Комментариям к версиям хранилища Выводить в:----------------------------- D О Текстовый документ ® Табличный документ - Параметры------------------------------- 0 Не выводить строки комментария начинающиеся с □Не включать версии с пустыми коммеиг ариями | Отбор | | ОК 11 Отмена 11 Справка | Рис. 22.26. Отчет по истории хранилища Отчет по версиям хранилища Отчет по версиям хранилища показывает информацию о версиях в хронологическом порядке, включая комментарии к версии и пере- чень измененных объектов, с указанием их статуса (добавлены, удалены и т. д.). Отчет по объектам разработки Отчет по объектам разработки показывает объекты конфигурации в алфа- витном порядке, включая комментарии к версиям, в которых эти объекты изменялись. Отчет по комментариям к версиям хранилища Отчет по комментариям к версиям хранилища показывает комментарии к версиям в хронологическом порядке версий, включая перечень изме- ненных объектов с указанием их статуса (добавлены, удалены и т. д.). Существует возможность выводить перечисленные отчеты, как в текс- товый, так и в табличный документ, скрывать служебные комментарии (начинающиеся с «//»), исключать версии с пустыми комментариями и устанавливать отбор версий, по которым будет строиться отчет. Установка отбора аналогична тому, как устанавливается отбор версий в окне истории хранилища конфигурации (см. раздел «Работа с версиями хранилища конфигурации», стр. 634). Варианты использования хранилища конфигурации Поскольку разработка прикладного решения - процесс творческий, различные группы разработчиков могут организовывать свою совмес- тную работу над проектом совершенно по-разному. Рассмотрим несколько вариантов использования хранилища конфигурации разработчиками. <oj^(oj
Локальная группа разработчиков Наиболее типовой и наиболее распространенной схемой работы с храни- лищем является схема, при которой хранилище расположено в локальной сети, к нему подключена группа разработчиков, и периодически выполня- ется архивирование хранилища (рис. 22.27). Рис. 22.27. Локальная группа разработчиков Каждый разработчик действует по следующей схеме: захватил объекты - внес изменения - поместил объекты в хранилище. С нужной периодичностью выполняется архивирование хранилища конфигурации. Для этого файл хранилища 1cv8ddb.1CD просто копиру- ется в архив, расположенный, как правило, на другой рабочей станции или на сменном носителе. В случае каких-либо сбоев в работе храни- лища с помощью утилиты ChDBFI, входящей в комплект поставки «1С:Предприятия», можно проверить файл хранилища на наличие ошибок. Однако выполнять исправление хранилища с его помощью не рекомен- дуется, поскольку при этом логическая целостность данных хранилища может быть нарушена, что приведет к потере его работоспособности. Для восстановления хранилища конфигурации следует использовать резервные копии хранилища. После того как разработка прикладного решения завершена, на основе текущей версии хранилища создается комплект поставки (дистрибутив) решения. ПОДРОБНЕЕ Раздел «Механизм создания комплектов поставки», стр. 592. Один разработчик Хранилище конфигурации как механизм, автоматизирующий процесс разработки прикладного решения, может быть использован не только группой разработчиков, но и одним разработчиком, который полностью самостоятельно ведет разработку (рис. 22.28). В этом случае, очевидно, возможности разделения доступа к редактиру- емым объектам использованы не будут, однако все остальные функции Профессиональная разработка в системе «1С:Предприятие 8»
хранилища (версионирование разработки, возможность формирования отчетов и т. д.) будут полезны для контроля процесса разработки. Разра- ботка конфигурации должна вестись по правилам работы с хранилищем (захват объектов, изменение, помещение в хранилище). Но так как других пользователей, работающих с хранилищем, нет, то при помещении объектов в хранилище можно всегда устанавливать признак Остааить захваченным. Рис. 22.28. Один разработчик Разработчики, работающие удаленно Хранилище конфигурации позволяет работать без непосредственной с ним связи. Основная суть данной методики в том, чтобы предвари- тельно произвести захват нужных объектов конфигурации. После этого захваченные объекты можно редактировать, не соединяясь с хранилищем (рис. 22.29). Рис. 22.29. Офпайн-разработчики Таким образом, возможна следующая схема работы: разработчик подклю- чается к хранилищу, захватывает нужные ему объекты, а работает с ними или дома, или на вызове у клиента с локальным ключом. Потом возвра- щается в свой офис, соединяется с хранилищем, помещает в хранилище захваченные им объекты и получает из хранилища объекты, измененные другими разработчиками. Преимущество данной методики в том, что разработчик забирает «свою» часть объектов и работает с ней, гарантированно не пересекаясь с коллегами. В этом же заключается и недостаток подобного подхода: необходимо заранее знать, в какие объекты конфигурации предстоит вносить изме- нения, что возможно далеко не всегда. Том 2
Разработка на территории заказчика Зачастую завершающая часть разработки прикладного решения (а иногда и вся разработка целиком) выполняется непосредственно на территории заказчика. В этом случае для упрощения процесса обновления инфор- мационной базы клиента она может быть подключена непосредственно к хранилищу конфигурации (рис. 22.30). Рис. 22.30. Разработка на территории заказчика При этом, как правило, создается специальный пользователь хранилища, имеющий права только на чтение и получение данных из хранилища. Под этим пользователем рабочая база клиента подключается к хранилищу. Удаленный заказчик Зачастую возникает необходимость взаимодействовать с заказчиком, который расположен на другой территории (например, на другом конце города или в другом городе). В этом случае для обновления рабочей конфигурации заказчика можно использовать механизм поставки и подде- ржки конфигураций (подробнее об этом механизме можно прочитать в разделе «Механизм поставки и поддержки прикладных решений», стр. 576), рис. 22.31. Рис. 22.31. Удаленный заказчик
Последовательность взаимодействия с заказчиком в этом случае заключа- ется в следующем: на определенном этапе разработки создается комплект поставки, который передается заказчику, и заказчик устанавливает его у себя (создается рабочая база заказчика). Конфигурация, установленная у заказчика, стоит на полной поддержке, и по мере необходимости разра- ботчиками формируется комплект обновления на основании текущей версии конфигурации. Этот комплект обновления выкладывается на FTP- или HTTP-ресурс, с которого заказчик самостоятельно в автома- тическом режиме выполняет обновление своей рабочей конфигурации. Таким образом, заказчик имеет возможность выполнять тестирование разрабатываемой конфигурации, а разработчики могут выполнять удаленное обновление конфигурации заказчика. Удаленная работа с хранилищем конфигурации Платформа «1 (^Предприятие» предоставляет возможность удаленной работы с хранилищем конфигурации, что существенно расширяет возмож- ности групповой разработки конфигурации. Это происходит за счет того, что разработчики могут иметь доступ к хранилищу конфигурации по локальной сети (по протоколу tcp) и через Интернет (по протоколу http). При этом хранилище конфигурации может быть расположено на компьютере, работающем под управле- нием различных операционных систем, таких как Windows или Linux. Таким образом, разработчики, находящиеся в другом городе или даже стране, используя Интернет, могут участвовать в групповой разработке конфигурации. Удаленную работу с хранилищем конфигурации обеспечивает специ- альное приложение - сервер хранилища конфигурации (crserver.exe). Компьютер, на котором функционирует приложение crserver.exe, также называется сервер хранилища конфигурации. Рис. 22.32. Удаленное хранилище
Для удаленного доступа к хранилищу конфигурации могут применяться различные протоколы передачи данных (top или http). В зависимости от этого используются различные схемы удаленного взаимодействия клиентского приложения и хранилища конфигурации. При этом обеспечи- вается одновременная работа с хранилищем конфигурации как удаленно, так и локально, как с общим файловым ресурсом (рис. 22.32). Общая схема работы с хранилищем конфигурации В общем случае система «1С:Предприятие» обеспечивает одновременную работу с хранилищем конфигурации с использованием всех трех прото- колов доступа к хранилищу: файловый доступ, протокол tcp, протокол http (рис. 22.33). Рис. 22.33. Взаимодействие с удаленным хранилищем Один и тот же сервер хранилища конфигурации позволяет разработчикам работать с различными хранилищами конфигурации. Однако при этом все хранилища должны быть расположены в одном корневом каталоге (рис. 22.34). Рис. 22.34. Расположение различных файлов хранилищ Профессиональная разработка в системе «1С:Предприятие 8»
Взаимодействие по протоколу tcp В случае использования протокола tcp клиентское приложение взаимо- действует с сервером хранилища конфигурации, который, в свою очередь, взаимодействует непосредственно с самим хранилищем конфигурации (рис. 22.35). Рис. 22.35. Взаимодействие по протоколу tcp Взаимодействие по протоколу http В случае использования протокола http клиентское приложение взаимо- действует с веб-сервером по протоколу http. Веб-сервер по протоколу tcp взаимодействует с сервером хранилища конфигурации, который, в свою очередь, взаимодействует непосредственно с самим хранилищем конфи- гурации (рис. 22.36). Рис. 22.36. Взаимодействие по протоколу http ПОДРОБНЕЕ О запуске сервера хранилища конфигурации и подключении к нему из командной строки можно прочитать в документации «^Пред- приятие 8.2. Руководство разработчика», ч. 2, гл. 24 «Групповая разработка конфигурации». Том 2
Работа с хранилищем конфигурации из командной строки Система «1С:Предприятие» может быть запущена в режиме Конфигу- ратор из командной строки. Такой режим запуска позволяет выполнять различные действия, в том числе и выгрузку, и обновление версий конфи- гурации в хранилище. Для соединения с хранилищем используются параметры Configurati- onRepositoryF, Configuration Repository N и ConfigurationRepositoryP, задающие, соответственно, каталог хранилища, имя пользователя и пароль. Для сохранения версии конфигурации хранилища в файл используется параметр ConfigurationRepositoryDumpCfg с ключом v. Ключ v задает номер версии, которая должна быть выгружена из хранилища. Если ключ v не задан или его значение равно -1, тогда будет сохранена текущая версия хранилища (листинг 22.1). Листинг 22.1. Сохранение версии конфигурации хранилища в файл (текст команды должен быть записан в одну строку) "C:\Program Files\1cv82\8.2.15.310\bin\1 cv8.exe” DESIGNER IF "C:\Documents and Settings\User\My Documents\lnfoBase4" /ConfigurationRepositoryDumpCfg D:\1\Publishing.cf -v 9 Для обновления конфигурации информационной базы из хранилища используется параметр ConfigurationRepositoryUpdateCfg с ключами v, revised и force. Ключ v задает номер версии, которая должна быть использована для обновления. Ключ revised позволяет получать захваченные объекты, если это требуется (листинг 22.2). Листинг 22.2. Обновление конфигурации информационной базы из хранилища (текст команды должен быть записан в одну строку) ''C:\Program Files\1cv82\8.2.15.310\bin\1 cv8.exe" DESIGNER IF "C:\Documents and Settings\User\My Documents\lnfoBase4" /ConfigurationRepositoryDumpCfg D:\1\Publishing.cf -revised Следует учитывать, что если конфигурация подключена к хранилищу, то ключ v будет проигнорирован, так как в этом случае возможно обнов- ление только текущей версией конфигурации хранилища. Также если конфигурация не подключена к хранилищу, то будет проигнорирован ключ revised, так как в режиме работы без подключения к хранилищу захват и получение отдельных объектов невозможны. Также для пакетного режима работы реализован ключ force. Он исполь- зуется для подтверждения пользователем выполнения таких операций, как получение новых объектов конфигурации или удаление существу- ющих, в пакетном режиме. Если параметр не указан, действия выполнены не будут.
Глава}22ЯМётодика1р'а'зр'аботки| Обновление конфигурации из хранилища может быть использовано, например, для того, чтобы затем сформировать файлы поставки и обнов- ления. ПОДРОБНЕЕ Раздел «Создание файлов поставки и обновления из командной строки», стр. 616. Для отключения конфигурации от хранилища в пакетном режиме используется параметр ConfigurationRepositoryUnbindCfg с ключом force. У пользователя должны быть административные права в данной инфор- мационной базе. Если пользователь аутентифицируется в хранилище (интерактивно или через параметры командной строки), то отключение конфигурации от хранилища также отражается в самом хранилище конфи- гурации (информация о подключении удаляется). Если же пользователь не аутентифицировался в хранилище, то производится только локальное отключение конфигурации от хранилища (листинг 22.3). Листинг 22.3. Отключение конфигурации от хранилища (текст команды должен быть записан в одну строку) "C:\Program Files\1cv82\8.2.15.31 O\bin\1 cv8.exe" DESIGNER IF "C:\Documents and Settings\User\My Documents\lnfoBase4" /ConfigurationRepositoryUnbindCfg-force Ключ force служит для форсирования отключения от хранилища (пропуск диалога аутентификации, если не указаны параметры пользователя храни- лища, игнорирование наличия захваченных и измененных объектов). Для получения отчета по истории хранилища используется параметр ConfigurationRepositoryReport с ключами Nbegin, Nend, GroupByObject и GroupByComment. Ключи Nbegin, Nend задают интервал версий, по которым строится отчет. Ключи GroupByObject и GroupByComment задают признак формирования отчета по версиям с группировкой по объектам или по комментариям соответственно (листинг 22.4). Листинг 22.4. Построение отчата по истории хранилища (текст команды должен быть записан а одну строку) "C:\Program Files\1cv82\8.2.l5.3lO\bin\1cv8.exe" DESIGNER IF "C:\Documents and Settings\User\My Documents\lnfbBase4" /ConfigurationRepositoryReport "D:\ByComment.mxl" -NBegin 1 -NEnd 2 -GroupByComment ПОДРОБНЕЕ О параметрах командной строки режима работы с хранилищем кон- фигурации можно прочитать во встроенной справке конфигуратора: 1С:Предприятие ► Запуск 1С:Предприятие 8 и параметры запуска к Пара- метры командной строки пакетного режима запуска к Параметры работы с хранилищем конфигурации.
ОТЛАДКА ПРИКЛАДНЫХ РЕШЕНИИ Каждому разработчику известно, что практически невозможно напи- сать код на встроенном языке без ошибок, с первого раза, особенно для сложных конфигураций. Речь идет не о синтаксических ошибках, а об ошибках в программной логике при реализации функциональности прикладного решения. Поэтому одним из важных этапов разработки прикладного решения является отладка, в процессе которой проис- ходит обнаружение, локализация и устранение ошибок в конфигурации. Для этого в платформе «1С:Предприятие» существует специальный инструмент - отладчик. С помощью отладчика разработчик может отлаживать код как в файловом, так и в клиент-серверном варианте работы «1С Предприятия»; расставлять точки останова сразу в нескольких модулях одновременно и анализиро- вать значения и тип интересующих его выражений и объектов в момент остановки; выполнять пошаговое выполнение модуля; просматривать стек вызовов процедур и функций; редактировать текст модуля в процессе отладки и т. д. Основным понятием для отладчика является понятие предмета отладки. Предмет отладки - это контекст встроенного языка, характеризуемый совокупностью параметров: имя пользователя, от имени которого исполняется код на встроенном языке; тип предмета отладки; сетевое имя компьютера, на котором исполняется код на встроенном языке; номер используемого сеанса; номер IP-порта, через который отладчик управляет работой предмета отладки. К типам предметов отладки относятся: тонкий клиент - код на встроенном языке, исполняемый в тонком клиенте; веб-клиент - код на встроенном языке, исполняемый в веб-клиенте; сервер - код на встроенном языке, исполняемый на сервере; сервер (файловый вариант) - код на встроенном языке, исполняемый на сервере в файловом варианте; СОМ-соединение - код на встроенном языке, исполняемый через внешнее соединение; Web-сервис - код на встроенном языке, в котором обрабатываются вызовы методов Web-сервисов; фоновое задание - код на встроенном языке, в котором обрабатыва- ются фоновые задания; Профессиональная разработка в системе «1С:Предприятие 8»
толстый клиент - код на встроенном языке, исполняемый в толстом клиенте. ВНИМАНИЕ! Хотя в процессе отладки возможно редактирование отлаживае- мого модуля, отладчик не производит компилирование измененного кода - продолжается отладка кода конфигурации базы данных (на момент запуска отладчика или подключения). Для отладки изме- нений, внесенных в конфигурацию, необходимо выполнить обновление конфигурации базы данных. Подключение предметов отладки Для того чтобы выполнять отладку модуля, нужно, чтобы предмет отладки был подключен к отладчику. В ряде случаев, как описано ниже, предмет отладки подключается автоматически. Чтобы подключить предмет отладки вручную, а также управлять подключением, необходимо выпол- нить команду меню конфигуратора Отладка - Подключение... В открывшемся диалоге Предметы отладки вверху находится список доступных предметов отладки, с которыми допустимо выполнение отладки. Это те предметы отладки, которые относятся к отлаживаемой информационной базе и для которых включена возможность отладки. В нижней части окна содержится список подключенных предметов отладки. Это те предметы отладки, которые были подключены автомати- чески или которые могут быть подключены вручную из верхнего списка. Например, если запустить отладочный сеанс «1С:Предприятия» из конфи- гуратора (нажав клавишу F5), в файловом варианте в режиме тонкого клиента, а затем запустить это же клиентское приложение, в котором разрешена отладка, в режиме толстого клиента, то окно подключения предметов отладки будет выглядеть следующим образом (рис. 22.37). Предметы отладки X Подключить । О Доступные предметы отладки Ойскэть предметы отладки на удаленном компьютере: Подключенные предметы отладки Отключить । Q Q Пользователь Администратор | Тип Сервер (Файловый вариант) | Настройка... 11 Автоматическое подключение. | Закрыть 11 Справка | Рис. 22.37. Подключение предметов отледки Том 2
В данном примере предметы отладки - тонкий клиент и сервер (файловый вариант) - автоматически подключились для отладки при запуске отла- дочного сеанса из конфигуратора по команде Отладка ► Начать отладку (F5). А клиентское приложение, запущенное в режиме «1С:Предприятие» (толстый клиент), в котором разрешена отладка (флажок Отладка а текущем сеансе разрешена установлен), доступно для отладки, и его можно вручную подключить к отладчику. ПРИМЕЧАНИЕ О различных сценариях запуска и настройках отладочного сеанса рассказывается в разделе «Настройка приложения для работы в отла- дочном режиме», стр. 642. Чтобы подключить к отладчику предмет отладки, необходимо выбрать нужную строку в списке доступных предметов отладки и нажать кнопку Подключить. После этого предмет отладки будет перенесен из списка доступных в список подключенных предметов отладки. Чтобы отключить предмет отладки от отладчика, необходимо выбрать нужную строку в списке подключенных предметов отладки и нажать кнопку Отключить. После этого предмет отладки будет перенесен из списка подключенных в список доступных предметов, и к нему можно в дальнейшем повторно подключиться. При этом точки останова, уста- новленные в отключенных предметах отладки, не будут «срабатывать» при прохождении выполнения программы через них. Если отладка какого-либо предмета отладки больше не нужна, можно закрыть его, выделив в списке подключенных предметов отладки и нажав кнопку Завершить. При этом предмет отладки будет удален из списка подключенных и доступных предметов отладки, и повторно подключиться к нему будет нельзя, а само приложение, запущенное в режиме отладки, будет закрыто. Для останова предмета отладки в месте выполнения нужно нажать кнопку Остановить (кнопки Остановить и Завершить отображены в виде соответствующих пиктограмм рядом с кнопкой Отключить). Чтобы отлаживать предметы отладки на удаленном компьютере, следует установить флажок Искать предметы отладки на удаленном компьютере и в поле, расположенном справа от флажка, ввести имя компьютера (или его сетевой адрес). При этом в список доступных предметов отладки будут добавлены предметы отладки, найденные на удаленном компьютере. Список подключенных предметов отладки будет содержать те предметы отладки, которые уже подключены к отладчику.
I Гл а ва!22Я Метод и ка! разработки Настройка диапазона портов Стандартно для поиска предметов отладки отладчик использует диапазон портов 1560-1591. Чтобы его изменить, нужно нажать кнопку Настройка... В диалоге настройки определяются границы диапазона портов, в рамках которых отладчик ищет предметы отладки на текущем или указанном компьютере (рис. 22.38). Настройки отладчика X Начальный комар порта сканирования: [ 1 560| С | Конечный номер порта сканирования: [ 1 5911 * | Отладчик: tcp:/AV0RK:1560 | ОК 11 Отмена 11 Справка | Рис. 22.38. Настройка отладчика В поле Отладчик диалога содержатся настройки текущего отладчика, которые можно использовать, например, в командной строке при запуске клиентского приложения в качестве значения параметра командной строки debuggerURL или в xml/vrd-файле с настройками отладки для внешнего соединения или Web-сервиса. Если все порты для подключения в стандартном диапазоне заняты, можно задать дополнительный диапазон. Этот диапазон настраивается в файле debugcfg.xml, который располагается в каталоге конфигурационных файлов (по умолчанию C:\Program Files\1Cv82\conf). Если файл не найден, то для отладки используются порты из стандартного диапазона (1560-1591). Предметы отладки на сервере используют те же порты, что и процессы сервера: гтпдг и rphost. Указание дополнительных диапазонов портов для предметов отладки на сервере не требуется (листинг 22.5). Листинг 22.5. Пример файла debugcfg.xml <config xmlns="http://v8.1c.ru/v8/debugcfg"> <debugports range="1540:15507> </config> ПОДРОБНЕЕ О файле debugcfg.xml можно прочитать в документации «1С:Пред- приятие 8.2. Руководство администратора». Автоматическое подключение типов предметов отладки Предметы отладки доступны для подключения на протяжении интер- вала времени существования сеанса, в рамках которого они работают. Например, конкретное фоновое задание, Web-сервис или внешнее соеди- нение попадают в список доступных предметов отладки только в тот момент времени, когда выполняется соответствующий код. Поскольку выполнение может занимать очень незначительное время, можно восполь- зоваться настройкой автоматического подключения предметов отладки.
Для автоматического подключения предметов отладки на сервере системы «1С:Предприятие», работающем в отладочном режиме, нужно открыть диалог Автоматическое подключение, вызывающийся по соответствующей кнопке, и отметить в нем соответствующие типы предметов отладки (рис. 22.39). Автоматическое подключение Автоматически подключать на сервере: □ Клиентские и внешние соединения QWEB-сервисы Р^Роноеые задания X | ОК | | Отмена 11 Справка | Рис. 22.39. Настройка автоматического подключения Настройка приложения для работы в отладочном режиме Чтобы иметь возможность отлаживать код на встроенном языке, нужно обеспечить запуск приложения, в котором исполняется код, в отладочном режиме. Отладка клиентского приложения Для установки отладочного режима клиентского приложения можно использовать следующие варианты запуска. Запуск отладочного сеанса из конфигуратора 1. Для того чтобы запустить «1С:Предприятие» из конфигуратора в отладочном режиме, необходимо выполнить команду меню Отладка ► Начать отладку, нажать соответствующую кнопку на панели инструментов или нажать клавишу F5. При этом будет запущен и автоматически подключен в качестве предмета отладки тот тип клиента, который определен исходя из настроек конфигуратора (Сервис ► Параметры ► Запуск 1С:Предприятия ► Основные) и свойства конфигурации Основной режим запуска. То есть если теперь перейти в режим Конфигуратор (не закрывая «1С:Предприятие») и выполнить команду Отладка ► Подключение..., то мы увидим, что для отладки подключен тонкий клиент, так как в настройках конфигуратора (Сервис ► Параметры ► Запуск "^Пред- приятия ► Основные), в группе параметров Приложение отмечена опция Выбирать автоматически, и свойство конфигурации Основной режим запуска установлено в значение Управляемое приложение (рис. 22.40). Профессиональная разработка в системе «1С:Предприятие 8»
Предметы отладки X Доступна предметы отладки: Подключить । О Пользователь 1 Тип 1 Компьютер Сеанс ' Порт ОИскать предметы отладки на удаленном компьютере: Подключение предметы отладки Пользователь । Тип Администратор Сервер (Файловый вариант) | Настройка.. 11 Автоматическое подключение... | Отключить | Э [J | Закрыть 11 Справка | Рис. 22.40. Подключенные предметы отледки Наряду с тонким клиентом, в случае использования файлового режима работы, также автоматически включается режим отладки для серверной части файлового варианта информационной базы, расположенной на том же компьютере. 2. При запуске клиентского приложения в режиме отладки можно выбрать тип клиента для отладки, выполнив команду меню Отладка ► Начало отладки (рис. 22.41). '‘К1 Начать отладку F5 | Начало отладки ► /у Тонкий клиент, качать отладку Остановка по ошибке... Веб-клиент: начать отладку Подключение... |.«^> Толстый клиент (управляемое приложение): начать отладку Убрать все точки останова Отключить все точки останова Список точек останова... AH+F9 (5 Замер производительности Рис. 22.41. Выбор клианта для отладки При этом будет запущено «1С:Предприятие» в режиме выбранного клиента, и этот клиент будет автоматически подключен в качестве предмета отладки (рис. 22.42). Предметы отладки Доступные предметы отладки Подключить | О Пользователь 1 Тип ' Компьютер I Сеанс I Порт ОИскагь предметы отладки на удаленном компьютере: | Настройка.. 11 Автоматическое подключение. Т| | Закрыть 11 Справка | Рис. 22.42. Подключенные предметы отледки Том 2
Отл адка] п ри кладн iSix] решён и й 3. Можно также в настройках конфигуратора (Сервис ► Параметры ► Запуск 1С:Предприятия ► Дополнительные) установить флажок Устанавливать режим разрешения отладки и запустить «1С:Предприятие» командой Сервис ► 1С:Предприятие (Ctrl + F5), рис. 22.43. Параметры X Общие Тексты Модули [ Запуск 1 С: Предприятия | Справка Основные | Дополнительные ]________________________________________________ - Файл служебных сообщений------------------------------------------------- I -х| □ Не очищать Файл перед запуском Язык интерфейса системы: [ Н *| Код локализации сеанса: [ Н *| 0 Не выдавать предупреждения при запуске станавт«атьрвжимразреше>ця отладкиХ ^Начинать отладку при запуске J 0 Отображать показатели производительности 0 Отображать команду <Все Функции» | ОК | | Отмена | | Приметить] | Справка | Рис. 22.43. Установка параметров в режиме «Конфигуратор» Затем перейти в режим Конфигуратор (не закрывая «1С:Предприятие»), выполнить команду Отладка ► Подключение... и произвести подклю- чение предмета отладки (рис. 22.44). Рис. 22.44. Доступные предметы отладки
Глава}22ЯМётодика1р'а'зр'аботки| Чтобы подключить к отладчику предмет отладки, необходимо выбрать нужную строку в списке доступных предметов отладки и нажать кнопку Подключить. ПОДРОБНЕЕ Раздел «Подключение предметов отладки», стр. 641. 4. Можно также в настройках конфигуратора (Сервис ► Параметры ► Запуск 1С:Предприятия ► Дополнительные) установить флажок Начинать отладку при запуске (см. рис. 22.43). В этом случае при запуске системы «1 С:Предприятие» командой Сервис ► 1 С:Предприятие (Ctrl + F5) подклю- чение предмета отладки будет выполнено автоматически. Подключение к работающему клиентскому приложению Для того чтобы подключить к отладчику уже работающее клиентское приложение, необходимо выполнить следующие действия: Разрешить отладку в исполняемом экземпляре «1С:Предприятия». Для этого в окне настройки параметров (Глааное меню ► Сераис ► Пара- метры) нужно установить флажок Отладка а текущем сеансе разрешена. Данное действие недоступно в веб-клиенте (рис. 22.45). Параметры ^*0 Отладка в текущем сеансе разрешена <.С^станавливвть режим разрешения отладки при запуску □ Отображтъпоказагелифоизёадйгельносп^^^^^™ О Имитировать задержку при вызовах сервера: Задержка при вызове (с.) [ 1,4б| С | Задержка при передаче данных (с./Кбайт) [ 0,45| t1 Задержка при получении данных (с./Кбайт) [ 0,15|С| 0 Отображать команду <Все Функции» | DK | | Отмена | | Применить | | Справка | Рис. 22.45. Устаноака параметров в ражиме «1С:Предприятие» Можно установить возможность отладки только для следующего запуска приложения. Для этого нужно в окне настройки параметров (Главное меню ► Сервис к Параметры (см. рис. 22.45) установить флажок Устанавливать режим разрешения отладки при запуске.
Необходимо определить номер сеанса, который будет отлаживаться. Для этого сначала нужно включить отображение команды Все функции (в окне настройки параметров (Главное меню ► Сервис ► Параметры) установить флажок Отображать команду «Все функции»). Затем открыть список активных пользователей (Глааное меню ► Все функции ► Стан- дартные ► Активные пользователи) и запомнить значение колонки Сеанс для выделенного пользователя (текущий пользователь). Для просмотра списка активных пользователей у пользователя должно быть доступно соответствующее право доступа (рис. 22.46). @ ' yj’ 1 Активные пользователи • Web-сервисы (1С:Преаприягие) Активные пользователи И .0 О (ДНайти... | Гц, Вседействия- | (?) Пользователь 1 Приложение 1 Начало работы ' Компьютер I Сеанс _ Администратор i Тонкий клиент 31.03.2011 13:24:21 WORK а Менеожер Толстый клиент 31.03.2011 13:1315 WORK 30 1г Количество: 2 Рис. 22.46. Список активных пользователей Затем необходимо с помощью конфигуратора открыть информаци- онную базу, которую требуется отлаживать. Далее следует открыть окно подключения к предметам отладки, выполнив команду Отладка ► Подключение..., и подключить тот предмет отладки, у которого значение колонки Сеанс равно значению колонки Сеанс из списка активных пользователей (см. выше), рис. 22.47. Рис. 22.47. Подключение предмета отледки Профессиональная разработка в системе «1С:Предприятие 8»
Запуск клиентского приложения в режиме отладки из командной строки Для установки отладочного режима можно открыть информационную базу в режиме 1С:Предприятие с параметром командной строки Debug (листинг 22.6). Листинг 22.6. Запуск клиентского приложения в режиме отладки "C:\Program Files\1Cv82\8.2.15.31 O\bin\1 cv8.exe" ENTERPRISE IF "D:\Documents and Settings\User\MoM документы\1п/оВазе4" /N Administrator IP Password /Debug Затем нужно открыть информационную базу в конфигураторе, выполнить команду Отладка ► Подключение... и произвести подключение предмета отладки. Отладка кода на сервере Сервер «1С:Предприятия» может работать в двух режимах. В основном режиме, предназначенном для реальной работы пользователей, и в отладочном режиме, когда происходит отладка кода, исполняющегося на сервере. В нем тоже возможна реальная работа, но она будет происхо- дить медленнее, так как часть ресурсов сервера будет занята обеспечением отладки. Поэтому не рекомендуется использовать отладочный режим работы сервера для реальной работы пользователей. Переключить эти режимы на лету нельзя. Поэтому, как правило, сервер работает в основном режиме, без возможности отладки кода, исполняю- щегося на нем. Чтобы отладка стала возможна, сервер нужно остановить и заново запустить, но уже в отладочном режиме. Для этого следует запус- тить сервер системы «1С:Предприятие» с параметром командной строки Debug (листинг 22.7). Листинг 22.7. Установка отладочного режима на сервера ragentexe /Debug | ПОДРОБНЕЕ О параметрах командной строки запуска сервера «1С:Предприятия» можно прочитать в документации «1 С:Предприятие 8.2. Клиент-сер- верный вариант. Руководство администратора». Отладка внешнего соединения Для запуска внешнего соединения в отладочном режиме используются настройки, размещенные в xml-файле comcntrcfg.xml, который распо- ложен в каталоге конфигурационных файлов системы «1С:Предприятие» (по умолчанию C:\Program Files\1Cv82\conf). Если файл не найден, прило- жение открывается в обычном режиме (листинг 22.8). Том 2
Отл адка] п ри кладн tSix] решён и й Листинг 22.6. Пример файла comcntrcfg.xml <conflg xmlns="http://v8.1c.ru/v8/comcntrcfg"> <debugconfig debug="true" debuggerURL="tcp://localhost7> </config> ПОДРОБНЕЕ О файле comcntrcfg.xml можно прочитать в документации «1С:Пред- приятие 8.2. Руководство администратора». Отладка Web-сервиса Для запуска Web-сервиса в отладочном режиме (только для файлового варианта информационной базы) используются настройки, размещенные в файле default.vrd, который располагается в каталоге виртуального прило- жения. В этом файле необходимо указать элемент debug (листинг 22.9). Если этот элемент отсутствует или атрибут enable = "false", отладка Web-сервиса будет невозможна. Листинг 22.9. Пример элемента debug из файла default.vrd | <debug enable="true" url=tcp://localhost"/> ПРИМЕЧАНИЕ Чтобы применить изменения в файле defaultvrd, нужно перезапустить веб-сервер, обеспечивающий доступ к веб-сервису. ПОДРОБНЕЕ О файле default.vrd можно прочитать в документации «1 (^Пред- приятие 8.2. Руководство администратора». Для отладки Web-сервиса в клиент-серверном варианте информационной базы следует включить режим отладки на сервере с помощью параметра командной строки Debug. Отладка веб-клиента Для установки отладочного режима информационной базы, для которой опубликован веб-клиент, можно использовать следующие варианты запуска: В режиме Конфигуратор в форме настроек (Сераис ► Параметры ► Запуск 1С:Предприятия ► Дополнительные) установить флажок Уста- навливать режим разрешения отладки, а также в группе Приложение основных настроек (Сервис ► Параметры ► Запуск 1С:Предприятия ► Основные) включить опцию Веб-клиент и запустить «1С:Предприятие» командой Сервис ► 1С:Предприятие (Ctrl + F5). Затем перейти в режим
Глава}22ЯМётодика1р'а'зр'аботки| Конфигуратор, выполнить команду Отладка ► Подключение... и произ- вести подключение предмета отладки. Также можно установить флажок Начинать отладку при запуске. В этом случае при запуске системы «1С:Предприятие» подключение веб-клиента в качестве предмета отладки будет выполнено автомати- чески (рис. 22.48). Предметы отладки X Доступные предметы отладки: Подключить | О Пользователь I Тип Компьютер Сеанс Порт ОИскеть предметы отладки на удаленном компьютере: Рис. 22.48. Подключенные предметы отладки Выполнить команду меню конфигуратора Отладка ► Начало отладки ► Веб-клиент: начать отладку. При этом веб-клиент будет автоматически подключен в качестве предмета отладки. Открыть информационную базу в режиме 1С:Предприятие с пара- метром командной строки debug (отладочный режим), например, http://localhost/demo?debug. Затем нужно открыть информационную базу в конфигураторе, выполнить команду Отладка ► Подключение... и произвести подключение предмета отладки. Открыть информационную базу в режиме 1С:Предприятие с пара- метрами командной строки debug и debuggerurl=«ip-aflpec»: http://localhost/demo?debug&debuggerurl="127.0.0.1". ip-адрес - это адрес отладчика. В случае такого запуска отладчик, расположенный по адресу 127.0.0.1, выполнит автоматическое подключение предметов отладки (отладчик должен быть запущен по указанному адресу). Отладку серверной части файлового варианта информационной базы можно включить двумя способами: запустить отладку непосредственно из конфигуратора, как указано выше. В этом случае режим отладки для серверной части файлового варианта, расположенной на компьютере с веб-клиентом, включится автоматически (см. рис. 22.48);
включить режим отладки с помощью файла defaultvrd, который должен располагаться в каталоге виртуального приложения. В этом файле необходимо указать элемент debug (листинг 22.10). Если этот элемент отсутствует или атрибут enable = "false", отладка серверной части веб- клиента будет невозможна. Листинг 22.10. Пример элемента debug из файла default.vid | <debug enable="true' url="tcp://localhost"/> ПРИМЕЧАНИЕ Чтобы применить изменения в файле defaultvrd, нужно перезапустить веб-сервер. Следует учитывать, что в отладочном режиме производительность системы будет ниже, чем при обычной работе. Поэтому не рекомендуется использовать отладку веб-клиента на низкоскоростных каналах связи. Для отладки веб-клиента (в том числе и клиентского программного кода) в клиент-серверном варианте необходимо, чтобы сервер «^Пред- приятия» был запущен в отладочном режиме (параметр debug). После подключения предметов отладки перечисленными выше спосо- бами в процессе отладки начинают работать точки останова, управление переходит к отладчику, и становится возможным отлаживать програм- мный код. ПОДРОБНЕЕ Документация «1 С:Предприятие 8.2. Руководство разработчика», ч. 2, тл. 26 «Отладка прикладных решений». МНОГОЯЗЫЧНЫЕ ПРИКЛАДНЫЕ РЕШЕНИЯ Система «1С:Предприятие» позволяет использовать различные языки как при разработке прикладного решения, так и при работе пользователей прикладного решения. Благодаря механизмам интернационализации стано- вится возможным создание прикладных решений на языках, отличных от русского, а также многоязычных прикладных решений. Многоязычные прикладные решения позволяют каждому пользователю работать с интер- фейсом на привычном ему языке. Можно сказать, что благодаря механизмам интернационализации одно и то же прикладное решение способно различным образом представ- лять одни и те же строки интерфейса, одни и те же логические элементы прикладного решения. Например, значение даты 10:56:35 20 августа 2010 может быть представлено как 2010 20 08, ЗьбьЬзддо 10:56:35 для грузинского пользователя и как Параокеит), 20 Аиуаиотоо 2010 Профессиональная разработка в системе «1С:Предприятие 8»
10:56:35 тгц для пользователя из Греции. Одна и та же надпись пункта меню Найти может быть представлена как Табу для пользователя из Казах- стана, и как Suchen для пользователя, разговаривающего на немецком языке. Система «1С:Предприятие», работающая на компьютере пользователя, имеет четыре источника, которые могут вызывать проявление опреде- ленных региональных особенностей в процессе работы пользователя: операционная система, информационная база «1С:Предприятия», платформа «1С:Предприятие», конфигурация. Каждый из перечисленных источников (за исключением операционной системы) имеет свои собственные средства, благодаря которым стано- вится возможным отображение в прикладном решении различных региональных особенностей и языков. Операционная система Влияние операционной системы сказывается при установке системы «1С:Предприятие» и при установке дистрибутивов прикладных решений, созданных в системе «1С:Предприятие». Система «1С:Предприятие» использует региональные настройки операционной системы для выбора наиболее подходящего языка программы установки. Региональные настройки операционной системы также могут влиять на представление чисел и дат прикладного решения. Подробнее об этом рассказывается в разделе «Информационная база», стр. 648. Информационная база Информационная база «1С:Предприятия» имеет региональные установки, похожие на настройки операционной системы. Их просмотр и изменение могут быть выполнены командой Администрирование ► Региональные устаноаки информационной базы... (рис. 22.49). Важным моментом здесь является то, что все эти свойства можно не указывать, за исключением свойства Язык (Страна). Если другие регио- нальные установки информационной базы не указаны в явном виде, они будут определяться установками, принятыми в «1С:Предприятии» для указанного языка/страны по умолчанию, если при этом флажок Исполь- зовать региональные устаноаки текущего сеанса не установлен. Подробнее об этом рассказывается в разделе «Информационная база», стр. 648. При необходимости администратор может задать собственные представ- ления, отличающиеся от тех, которые приняты в «1С:Предприятии» для этого языка/страны. Платформа «1 С: Предприятие» Платформа «1С:Предприятие» влияет на прикладное решение благо- даря тому, что позволяет использовать различные языки интерфейса Том 2
Многояз^1нн^1е]прикладн^1е]решения платформы. При запуске клиентского приложения пользователь может указать язык, который будет использоваться для вывода системных меню, диалогов, сообщений, справки и т. д. Таким образом, та часть интерфейса прикладного решения, которая обеспечивается непосредственно плат- формой, будет отображаться на выбранном языке. Поскольку каждый пользователь запускает свой экземпляр клиентского приложения, плат- форма «1С:Предприятие» будет оказывать влияние уже на каждого пользователя в отдельности. Региональные установки информационной базы X Язык (Страна) [русский (Россия) <^1Йспользоеагь региональные установки текущего сзанса^ Разделитель дробной части | 11 х] Разделитель групп | | [ ▼ х] Группировка | ж х| Представление отрицательных ween [Авто Формат даты [ ▼ х] Формат времени [ х | Логическое ложь [ | Логическое истина [ -Примеры:---------------------------------------- [-987 654,320999991...| О [-987 654,320999999 | [ 10.03.20111.„ х| О [l 0.03.2011 | [ 1256:56lx| £ [12:5656 | | 0К ~11 Отмена | Рис. 22.49. Региональные установки информационной базы Конфигурация На уровне конфигурации основным средством, позволяющим интерна- ционализировать прикладное решение, являются объекты конфигурации Язык. Благодаря тому, что в прикладном решении может быть определено необходимое количество языков, каждый пользователь может использо- вать интерфейс прикладного решения на своем родном языке (ту его часть, которая обеспечивается конфигурацией). Кроме этого, встроенный язык, а также и некоторые другие механизмы системы могут использовать языки конфигурации для управления отображением данных. На уровне конфи- гурации региональные особенности могут проявляться уже не только для каждого конкретного пользователя, но и для одного и того же пользова- теля в зависимости от логики прикладного решения. Например, печатная форма отчета может быть получена пользователем на его родном языке, а также на языке, который он выберет при формиро- вании отчета. Рассмотрим подробнее, какое влияние на прикладное решение оказывает каждое из перечисленных средств интернационализации и какие сущест- вуют особенности на каждом уровне.
Глава}22ЯМётодика1р'а'зр'аботки| Информационная база Региональные установки информационной базы определяют пред- ставление данных примитивных типов - Число, Дата, Булево. Формат представления чисел, дат и логического типа используется в пользова- тельском интерфейсе, а также при преобразовании соответствующих значений в строку. Если флажок Использовать региональные устаноаки текущего сеанса не установлен и никакие свойства, кроме языка/страны, не установлены, то форматы отображения чисел, даты и времени будут определяться уста- новками по умолчанию, принятыми в «1С:Предприятии» для выбранного языка (страны). Таким образом, для всех пользователей, подключенных к информационной базе, формат представления чисел и дат будет одина- ковым. Однако если с информационной базой одновременно работают пользова- тели из разных стран, то удобно, когда каждый из них видит даты, числа и логические константы такими, как это принято для его языка/страны. В этом случае устанавливается флажок Использовать региональные уста- новки текущего сеанса, и если язык (страна) специально для сеанса не задан, тогда данные прикладного решения будут представляться для этого пользователя в соответствии с теми региональными установками, которые есть на его компьютере. Если же пользователю требуется другое представление данных, не такое, как на его компьютере, то он может указать нужный язык/страну при запуске клиентского приложения с помощью ключа командной строки /VL или параметра Код локализации сеанса в настройках конфигуратора (Сераис ► Параметры ► Запуск 1С:Предприятия ► Дополнительные), листинг 22.11. Листинг 22.11. Указание языка текущего сеанса в командной строке "C:\Program Files\1Cv82\8.2.15.31 O\bin\1 cv8.exe" /VL It | Значения типа Булеао отображаются в соответствии с языком интерфейса платформы, если при этом в диалоге Региональные установки информаци- онной базы (см. рис. 22.49) флажок Использоаать региональные устаноаки текущего сеанса установлен. Если же этот флажок снят, то значения типа Булево отображаются в соответствии с региональными установками информационной базы, а также могут быть заданы администратором по своему усмотрению. Язык интерфейса платформы либо выбирается по умолчанию при уста- новке системы «1С:Предприятие», либо указывается в ключе командной строки /L при запуске системы пользователем (листинг 22.12). Листинг 22.12. Указание языка интерфейса платформы в командной строке "C:\Program Files\1Cv82\8.2.15.31 O\bin\1 cv8.exe" /L It |
Подробнее об этом рассказывается в разделе «Платформа «1 (^Пред- приятие», стр. 649. Кроме этого, региональные настройки информационной базы влияют на представление встроенного календаря и на порядок сортировки строк. Встроенный календарь Встроенный календарь может быть вызван по команде Сервис ► Кален- дарь. Он используется системой при редактировании значений полей ввода, имеющих тип Дата, и доступен в формах как элемент управления ПолеКалендаря. При отображении календаря система всегда будет использовать реги- ональные установки информационной базы. Например, при указании региональной установки Английский (Великобритания) для всех пользова- телей информационной базы календарь будет отображаться следующим образом (рис. 22.50). «4 Match 2011 ►» Mon Tue Wed Thu Fri Sat Sin 26 1 2 3 4 5 6 7 8 9 Щ 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 10 March 2011 ▼ Рис. 22.50. Капандарь при региональной установке «Английский (Великобритания)» Если будет выбрана, например, региональная установка Немецкий (Германия), календарь примет такой вид (рис. 22.51). «4 Мага 2011 ►» Mo. Qi Mi Do. Ft. Sa. So. 28 1 2 3 4 5 6 7 В 9 Щ 11 12 13 14 16 16 17 1B 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 3 4 5 6 7 8 9 10 10. Marz 2011 ▼ Рис. 22.51. Капандарь при региональной установке «Немецкий (Гармания)» Порядок сортировки строк Порядок сортировки строк определяет правила сравнения строк для того или иного языка и, соответственно, порядок сортировки строк в базе данных. Забегая вперед, скажем, что внутри платформы «1С:Предприятие» все строки хранятся в формате Unicode. Строковые данные в базах данных также сохраняются в Unicode. Соответственно, и все индексы в базах данных строятся на основе Unicode-представлений. Профессиональная разработка в системе «1С:Предприятие 8»
Стандартом определен некоторый генеральный порядок сортировки для Unicode. Но он подходит не для всех языков. Поэтому для некоторых языков в упомянутый генеральный порядок внесены минимальные изме- нения для обеспечения соответствия конкретному языку. Например, отличается порядок сортировки для русского и украинского языков. Порядок сортировки для русского соответствует генеральному, а в укра- инском алфавите, например, буква Ь (мягкий знак) является последней. Также, например, не соответствует генеральному порядок сортировки для латышского языка. Если отсортировать строки аса, acb, аса и acb при региональных установках для русского и латышского языков, то будет наблюдаться следующая разница (табл. 22.3). Таблица 22.3. Сортировка строк при различных региональных настройках Русский язык Латышский язык Аса Аса Аса Acb Acb Аса Acb Acb Порядок сортировки строковых значений, принятый в конкретном регионе, определяет параметр Язык/Страна, выбранный в диалоге Регио- нальные установки информационной базы. Таким образом, все пользователи информационной базы имеют одина- ковый порядок данных при просмотре списков и при формировании отчетов. Платформа «1С Предприятие» Основным средством, реализующим возможность интернационализации на уровне платформы, являются языки интерфейса технологической плат- формы. Существует определенный набор языков, из которых пользователь может выбрать один для запуска системы в режиме 1С:Предприятие или Конфигуратор. Стандартная поставка «1С:Предприятия» содержит все доступные языки интерфейсов платформы (рис. 22.52). При установке системы «1С:Предприятие» предоставляется возмож- ность выбрать один или несколько дополнительных языков интерфейсов платформы, которые будут установлены на компьютере пользователя. После завершения установки в каталоге программных файлов (по умол- чанию C:\Program Files\1cv82\<HOMep версии>\геадте) будут созданы соответствующие файлы, описывающие особенности платформы «1С:Предприятие» для различных языков интерфейса платформы (рис. 22.53). Том 2
Многояз^1нн^1е]прикладн^1е]решения 1*1 Выборочная установка Выберите компоненты программы, которые необходимо установить. il@= щежнтге значок в сгмске ниже, чтобы изменить способ установки компонента. •Описание компонента- Латышский интерфейс 1С:Предприятия Папка: Для данного компонента требуется ОКб на жестком диске. Изменить... Справка | Диск | < Назад | Далее > ~| Отмена | Рис. 22.52. Языки интерфейса платформы J Файл Правка Вид Избранное Сервис Справка ] Назад ” Поиск £4 Папки | ГПП^ ]Адрес: |&С-^вдгагпН^йсу^В^ИЛ99Увас1т^^" | аг ТГа Переход Задачи для файлов и пат * Создать новую папку 0 Опубликовать папку в вебе ЁЗ Открыть общий доступ к этой палке Другие места * £2) В.2.13.199 О Мои документы Общие документы 3 Мойка-тьютер Сотое ос окружение Подробно * readme Папка с файлами Изменен: 2 декабря 2010 г., 15:07 readme_bg ОршЛ HTML-документ 2 КБ readme_en ОршЛ HTML-документ 2 КБ readmejdc Орм HTML-документ 2КБ readmejv Орм HTML-документ 1КБ readme_ro Орм HTML-документ 2КБ readmejr Орм HTML-документ 2КБ readme_vl Орм HTML-документ 2 КБ readme_de oai HTML-документ 2 КБ readme_ka Орм HTML-документ 3 КБ readmejt ^рм HTML-документ 2 КБ readme_p) ^рм HTML-документ 1 КБ readme_ru OA> HTML-документ 2 КБ readme_uk OA> HTML-документ 2 КБ Рис. 22.53. Файлы Readme для различных языков интерфейса платформы На момент написания данной книги поставка «1С:Предприятия» содержит следующие языки интерфейса (табл. 22.4).
Глава}22ЯМётодика1р'а'зр'аботки| Таблица 22.4. Языки интерфейса платформы Язык интерфейса Код языка Английский Еп Болгарский вд Вьетнамский Vi Грузинский Ка Казахский Кк Латышский Lv Литовский Lt Немецкий De Польский PI Румынский Ro Русский Ru Украинский Uk Турецкий Tr Язык интерфейса платформы определяет, на каком языке будут отобра- жаться системные меню, системные диалоги, системные сообщения, справка и т.д. Для каждого пользователя информационной базы это может быть свой язык. Более того, на одном и том же клиентском компьютере может быть запущено несколько клиентских приложений, работающих с одной и той же информационной базой и имеющих разные языки интер- фейсов платформы. Для запуска системы с тем или иным языком интерфейса можно исполь- зовать несколько способов. Во-первых, запуск с нужным интерфейсом может быть выполнен из командной строки. Для этого используется ключ командной строки /L, после которого указывается код нужного языка. Например, строка запуска системы с казахским языком интерфейса может выглядеть следующим образом: "C:\Program Files\1Cv82\8.2.15.310\bin\1cv8.exe" Enterprise /LKk Во-вторых, для того чтобы система по умолчанию при запуске исполь- зовала один из языков интерфейсов, в каталоге программных файлов (например, C:\Program Files\1CvB2\conf) находится файл, имеющий расширение res. Имя этого файла соответствует коду одного из языков интерфейсов платформы. Этот язык будет использоваться системой, если в командной строке не содержится явного указания. Первоначально файл *.res создается при установке системы «1С:Предприятие», и его имя соот- ветствует коду языка, выбранного как язык интерфейса по умолчанию (рис. 22.54). В дальнейшем можно просто переименовать этот файл, выбрав другой код языка. Содержимое файла значения не имеет, файл может быть пустым. Кроме того, можно задать параметр Язык интерфейса платформы в настройках конфигуратора (Сераис ► Параметры ► Запуск 1С:Предприятия к Дополнительные).
Язык интерфейса по умолчанию Установите язык интерфейса по умолчанию il@= Выберите язьк интерфейса, используемый по умолчанию: Русский "П Системные установки Болгарский Немецкий Английский Казахский Литовский Латышский Польсти Украинский Вьетнамский < Назад | Далее > | Отмена Рис. 22.54. Язык интерфейса платформы по умолчанию Помимо того, что языки интерфейса платформы отображают системную часть интерфейса прикладного решения на нужном языке, они использу- ются в других частях системы и прикладного решения. Программа установки шаблонов конфигураций Языки интерфейса платформы используются программой установки шаблонов конфигураций системы «1С:Предприятие» для того, чтобы выводить сообщения на языке, наиболее подходящем пользователю. При запуске программы установки определяются региональные настройки операционной системы компьютера, на котором она запущена. Если есть язык интерфейса платформы, который соответствует этим региональным настройкам, вывод сообщений осуществляется на этом языке. Если такого языка нет, по умолчанию используется английский язык. Все вышесказанное относится не только к текстам самой программы установки, но и к той информации, которая отличается для различных комплектов поставки: наименование прикладного решения, наимено- вание фирмы. Например, при формировании комплекта поставки можно указать наименование прикладного решения на каждом языке интерфейсов технологической платформы. Аналогичным образом можно включить в комплект поставки сопроводительный файл также на каждом языке интерфейсов платформы. При окончании установки пользователь сможет просмотреть справочный файл на том языке, который наиболее подходит для региональных установок операционной системы на его компьютере. ПОДРОБНЕЕ Раздел «Механизм создания комплектов поставки», стр. 592. Профессиональная разработка в системе «1С:Предприятие 8»
Каталог шаблонов Отображение названий шаблонов прикладных решений в каталогах шаблонов выполняется также в соответствии с выбранным языком интер- фейса платформы. После запуска системы пользователь может создать новую информа- ционную базу. При этом ему предоставляется возможность создать ее на основе одного из существующих шаблонов, которые отображаются в списке шаблонов (рис. 22.55). Добавление информационной баэы/группы X ® Создание информационной базы из шаблона Выберите поставляемую конфигурацию для начала работы или демонстрационный призер для ознакомления $ CJ Кни*а "Разработка управляемого ичгерфейса" L3 Демонстрационные конфигурации управляемого приложе ИЗ ЮУпраелениеторгоелей ? ИЗ УправлежеТорговлей НА 11.0.4.5 ИЗ УправлежеТорговлей (демо) 4:- L3 Демонстрационные конфигурации 8.1 £ ИЗ Профессиональная разработка в системе ЮПредприяти! I ~ПУ О Создание информационной базы без конфигурации для разработки новой конфигурации или загрузки выгруженной ранее информационной базы | < Назад | "... | Отмена | Рис. 22.55. Список шаблонов Кроме этого, любой из каталогов шаблонов может быть открыт по команде Конфигурация ► Поддержка ► Шаблоны конфигураций и обновлений... Также наименования шаблонов используются при выборе обновления прикладного решения. Структура манифеста (файла, описывающего шаблон прикладного решения) позволяет задать наименование прикладного решения на каждом из возможных языков интерфейса платформы. Таким образом, пользова- тель может просматривать списки шаблонов на привычном ему языке. ПОДРОБНЕЕ Раздел «Шаблоны конфигураций», стр. 595. Журнал регистрации Сообщения журнала регистрации отображаются на языке интерфейса платформы. Если к одной и той же информационной базе подключены, например, пользователи с русским и казахским языком интерфейса, то, просматривая журнал регистрации, один будет видеть его на русском языке (рис. 22.56), в то время как другой - на казахском (рис. 22.57). Том 2
Многояз^1нн^1е]прикладн^1е]решения Рис. 22.56. Журнал регистрации на русском языке Рис. 22.57. Журнал регистрации на казахском языке
Глава}22ЯМётодика1р'а'зр'аботки| Встроенный язык Некоторые функции встроенного языка формируют представление своих данных в соответствии с языком интерфейса платформы. Например, такие функции сеанса работы, как ПредставлениеПриложения() и ПредставлениеСобытияЖурналаРегистрации(). Функция ПредставлениеПриложения() позволяет получить название приложения на языке, который соответствует языку интерфейса плат- формы. Это может понадобиться, например, при анализе подключений к текущей информационной базе. В качестве примера следующий код позволяет вывести в окно сообщений имя пользователя, подключенного к информационной базе, и название приложения, которое он использует (листинг 22.13). Листинг 22.13. Получение списка активных пользователей Соединения = ПопучитьСоединенияИнформационнойБазы(); Для Каждого Соединение из Соединения Цикл Пользователь = Соединение.Пользователь.Имя; Приложение = ПредставлениеПриложения(Соединение.ИмяПриложения); Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = Пользователь + ” - ” + Приложение; Сообщение.Сообщить(); КонецЦикла; При использовании русского языка интерфейса платформы будут введены, например, следующие сообщения (рис. 22.58). Сообщения X Рис. 22.58. Список активных пользователей по-русски Если для этой же информационной базы запустить «1С:Предприятие» с литовским языком интерфейса платформы, то вид сообщения изменится (рис. 22.59). Pranesimai (©[ФедориЕ. Д В - Korifigurdlorius' I ф Федоров А.В - Fionas kKentas I ф Семенов В.П - Stores kKentas Рис. 22.59. Список активных пользователей по-литовски Функция ПредставлениеСобытияЖурналаРегистрацииО позволяет полу- чить название события на языке, который соответствует языку интерфейса
платформы. Это может понадобиться, например, при программном анализе выгруженного журнала регистрации. Также в соответствии с языком интерфейса платформы отображаются значения типа Булево. Язык интерфейса платформы также определяет представление значений системных перечислений и системных наборов значений. Например, значение системного перечисления ГоризонтальноеГ1оложение.Лево будет иметь различные представления для разных языков интерфейса плат- формы (табл. 22.5). Таблица 22.5. Представление значения системного перечисления «ГоризонтальноеПоложениеЛево» для разных языков платформы Язык Значение Английский Left Болгарский Ляво Русский Прижать влево Аналогичным образом, например, значение системного набора значений \Мпс1о\л/5Цвета.ГраницаАктивногоОкна также будет иметь различные пред- ставления для разных языков интерфейса платформы (табл. 22.6). Таблица 22.6. Представление значения системного набора значений «WindowsL|Bera. ГраницаАктивногоОкна» для разных языков интерфейса платформы Язык Значение Английский Active window border Болгарский Граница на акгивния прозорец Русский Граница активного окна Unicode Помимо набора языков интерфейса, платформа «1С:Предприятие» обла- дает еще одним важным в плане интернационализации свойством. Она обеспечивает хранение всех строк и текстов в формате Unicode. Этот формат позволяет включать в любую текстовую информацию одно- временно символы различных языков. Таким образом, пользователь может вводить данные на разных языках, например, если описание товара или текст договора нужно включить на языке страны-производителя. Аналогичным образом разработчик может при создании интерфейса системы использовать тексты на разных языках для наименования пунктов интерфейса, надписей формы или подсказок. Профессиональная разработка в системе «1С:Предприятие 8»
Конфигурация Основным средством, реализующим возможность интернационализации на уровне конфигурации, являются прикладные объекты конфигурации Язык. Они используются для идентификации строк интерфейса, которые должны быть использованы в том или ином случае. Общая идеология работы с языками конфигурации заключается в следующем. В любом прикладном решении существует один объект конфигурации - Язык. Этот объект создается при создании новой информационной базы и соответствует языку интерфейса платформы, с которым она была запущена. Например, если платформа запускалась с русским языком интерфейса, то будет создан язык Русский с кодом ru; если с литовским, то Lietuvin с кодом It. При сохранении конфигурации каждому непустому свойству конфигурации, которое может быть пред- ставлено строками на разных языках, ставится в соответствие код этого языка и собственно значение строки. В дальнейшем разработчик может добавить необходимое количество языков в конфигурацию и задать значения свойств конфигурации на нужных языках. Таким образом, в общем случае любое «многоязычное» свойство конфигурации связано с массивом элементов, каждый из которых хранит код языка и значение свойства конфигурации на этом языке. ВНИМАНИЕ! Код языка сохраняется вместе со значением строки, которое указано для этого языка. Если затем код языка в конфигурации будет изменен, автоматическая «перепривязка» существующих строк к новому коду языка не производится. Таким образом, все строки, привязанные к ста- рому коду, будут недоступны. С другой стороны, для каждого пользователя информационной базы можно задать язык (один из объектов конфигурации). Если для пользо- вателя язык не задан, то при его работе с системой будет использован основной язык конфигурации. Таким образом, при формировании меню, форм, диалогов и других элементов прикладного интерфейса будут использованы те значения «многоязычных» свойств конфигурации, код которых совпадает с кодом языка, заданного для пользователя. В резуль- тате пользователь будет работать с интерфейсом прикладного решения на том языке, который для него установлен. На следующем рисунке представлен пример формирования надписи на кнопке (рис. 22.60). В информационной базе существует пользователь Иванов, для которого в свойстве язык указан язык Русский, имеющий код ru. После того как пользователь будет аутентифицирован в информационной базе, система приступит к формированию командного интерфейса, и при выводе, например, элемента управления кнопка будет использовать то значение ее свойства Заголовок, которое соответствует коду ru, то есть Выполнить. Том 2
Многояз^1нн^1е]прикладн^1е]решения Рис. 22.60. Пример формирования надписи Использование языков в режиме «Конфигуратор» При конфигурировании прикладного решения система «1С:Предприятие» с помощью различных инструментов (в окне редактирования объекта конфигурации, в палитре свойств, в форме и т.д.) отображает значения свойств конфигурации - для каждого свойства указывается его значение. Очевидно, что для строк на разных языках не имеет смысла отображать одновременно все возможные значения на каждом языке. Во-первых, в этом нет практической необходимости, так как в один момент времени выпол- няется редактирование интерфейса только на одном языке, а во-вторых, это значительно ухудшило бы эргономику и читаемость разрабатываемых форм. Поэтому в каждый момент времени при работе в конфигураторе система отображает значения строк только на одном языке. Текущий язык, используемый для отображения многоязычных строк, устанавливается командой Конфигурация к Язык редактирования конфигурации (рис. 22.61). Язык редактирования конфигурации X ftTQBHQ I ~~1 Английски* | отмена | |Справка| Рис. 22.61. Выбор языка редактирования конфигурации Кроме этого, текущий язык редактирования конфигурации отобража- ется в панели состояния и там же может быть оперативно переключен (рис. 22.62).
Гл а ва>22Я Метод и ка] разработки Н Конфигуратор - Web-сервисы I £айл Правка Конфигурация Отладка Администрирование Сервис Окна Справка ♦its 0.1 н-а а । о । * г в <у, I - ®1аш1®,1жхч, :-&'Д.£'|Е1Я i.Jiltoo „.lie м_ |s| Обработка ПолучитьОтчетПоТоварам: Форма ф X I 3- lEE_________________________________ В Форма $ ™ Командная панель ("3 ФормаСформировать $• LZI Группа! " ДатаНачала “ ДатаОкончания “ Результат Свойства: Кнопка 'Основные: Имя Сфорюфовагь [КнопкаПечагь Печать Я Элементы | § Командньй интерфейс 1 1 Сформировать Датаначала: [ , . Результат: [Я| Дагаоконч< [Обычная кнопка [Команда! 0 0 Вид ИмяКоманды Доступность Видимость Пользовательская видимость Открыть Т олькобоВсехДействияк Отображение Картинка КнопкаПоУ молчанию ПропускатьПргёводе АктмвиэироватьПоУмолчанию Q |Авго [Авто □ |Авго Для получения подсказки нажмите F! CAP NUMQu9 ** ru Русский еп Английский Рис. 22.62. Оперативное переключение языка редактирования конфигурации В дополнение к этому каждая строка на разных языках имеет (если в конфи- гурации определено более одного языка) кнопку открытия (рис. 22.63). Рис. 22.63. Кнопка открытия Эта кнопка позволяет просмотреть и изменить все значения этого свойства для языков, определенных в данной конфигурации (рис. 22.64). Строки на разных языках Русский X 1 1 Печать | Отмена | Английский Print Рис. 22.64. Ввод строк на разных языках
Элементы системного интерфейса, использующие языки конфигурации Свойства объекта конфигурации, такие как Синоним, Представление объекта, Представление списка и т. и., влияющие на представление объекта в интерфейсе «1С:Предприятия», также могут быть заданы строками на разных языках (рис. 22.65). П Документ РасходнаяНакладная □ X Рис. 22.65. Свойства объекта для представления в интерфейсе «1С:Предприятия» Таким образом, например, для пользователя с английским языком будут выведены английские синонимы, представления списков и т.п. справоч- ников конфигурации, а для пользователя с русским языком - русские. Если значение на указанном языке отсутствует, будет выведено имя объекта конфигурации. Интернационализация во встроенном языке Два варианта встроенного языка Все операторы встроенного языка имеют как русское, так и англоязычное написание, которое можно использовать одновременно в одном исходном тексте. Для этого не требуется изменения каких-либо настроек конфигу- ратора - система будет правильно воспринимать операторы, написанные на обоих языках. Документация и синтакс-помощник содержат русско- язычный и англоязычный синтаксис и синонимы для всех конструкций встроенного языка. Профессиональная разработка в системе «1С:Предприятие 8»
Использование языков конфигурации «Функция нстрО» Функция НСтр() позволяет получить строку на указанном языке или языке, определенном для текущего пользователя прикладного решения (листинг 22.14). Листинг 22.14. Пример использования функции «НСтр()» Текст = "in = ""Добрый вечер!'”; en = ""Good Evening!"""; Сообщение = Новый СообщениеПользоватепю(); Сообщение.Текст = НСтр(Текст, "еп"); Сообщение.Сообщить(); В результате выполнения приведенного примера в окно сообщений будет выведена следующая строка: Good Evening! Если второй параметр метода опущен, будет возвращена строка на языке текущего пользователя. Если код языка текущего пользователя отсутс- твует, в первом параметре будет возвращена пустая строка. Получение макетов на указанном языке Текстовый документ Текстовый документ содержит свойство КодЯзыкаМакета. В этом свойстве указывается код языка, который будет искаться в названиях областей текс- тового макета при работе с ними. В случае, когда это свойство содержит значение Неопределено, язык макета будет определяться языком, установ- ленным для текущего пользователя. Если текущему пользователю язык не назначен, тогда язык макета будет определяться свойством Основ- нойЯзык конфигурации. Например, текстовый документ может содержать области на разных языках для того, чтобы формировать выходную форму на каждом из языков. Для каждой области текстового макета можно указать язык, к которому «относится» эта область. После этого, используя один и тот же алгоритм вывода документа, можно просто менять значение КодЯзыквМакета и получать области макета на нужном языке. Табличный документ Табличный документ содержит свойство КодЯзыкаМакета. В этом свойстве указывается код языка, строки на котором будут использоваться для вывода данного табличного документа в другой табличный документ. В случае, когда это свойство содержит значение Неопределено, язык макета будет определяться языком, установленным для текущего пользо- вателя. Если текущему пользователю язык не назначен, тогда язык макета будет определяться свойством ОсноанойЯзык конфигурации. Том 2
Многояз^1нн^1е]прикладн^1е]решения Табличный документ предполагает более тонкое использование интерна- ционализации, по сравнению с текстовым документом. Шаблон табличного документа может содержать строки на разных языках. Это может быть текст ячейки или шаблона, а также форматная строка. Указывая значение свойства КодЯзыкаМакета, можно одним и тем же алго- ритмом получать выходную форму на разных языках. Использование региональных установок ПредставлениеПериодаО Эта функция позволяет формировать внешнее представление периода, заданного датами начала и окончания на одном из языков, для которых поддерживается локализация. Формирование представления периода поддерживается для следующих языков (табл. 22.7). Таблица 22.7. Региональные установки, используемые в функции «ПредставлениеПериодаО» Код Язык (страна) en_US Английский (США) be_BY Белорусский (Белоруссия) bg_BG Болгарский (Болгария) vi_VN Вьетнамский(Вьетнам) ka_GE Грузинский(Грузия) kk_KZ Казахский (Казахстан) Lv_LV Латышский (Латвия) Lt_LT Литовский (Литва) de_DE Немецкий (Германия) pl_PL Польский (Польша) ro_RO Румынский (Румыния) ru_RU Русский (Россия) uk_UA Украинский(Украина) Fi_FI Финский (Финляндия) et_EE Эстонский (Эстония) tr_TR Турецкий(Турция) ПОДРОБНЕЕ Точный список доступных региональных настроек, используемых в этой функции, можно посмотреть в синтакс-помощнике Глобальный контекст - Функции форматирования. Пример использования функции ПредставлениеПериодаО показан в листинге 22.15.
Глава}22ЯМётодика1р'а'зр'аботки| Листинг 22.15. Пример использования функции «ПредставлениеПериодаО» Начало = ’20110301000000’; Конец = КонецМесяца( ’20110301000000’); Результат = ПредставлениеПериода(Начало, Конец, "L = uk_UA“); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = Результат; Сообщение.Сообщить(); В результате выполнения этого кода будет получено представление периода - март 2011 года по-украински: Березень 2011 р. Приведем другой пример использования этой функции (листинг 22.16). Листинг 22.16. Пример использования функции «ПредставлениеПериодаО» Начало = ’20110101000000’; Конец = КонецМесяца( ’20110301000000’); Результат = ПредставлениеПериода(Начало, Конец, "L = fi_FI"); Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = Результат; Сообщение.Сообщить(); В результате выполнения этого кода будет получено представление первого квартала 2011 года по-фински: 1 vuosineljannes 2011 v. Третий пример показывает возможность вывода так называемых финан- совых периодов - например, первых девяти месяцев года (листинг 22.17). Листинг 22.17. Пример использования функции «ПредставлениеПериодаО» Начало = НачалоМесяца(’201Ю101000000’); Конец = КонецМесяца(’20110901000000’); Результат = ПредставлениеПериода(Начало, Конец, "L = kk_KZ; ФП = Истина"); Сообщение = Новый СообщениеПопьзователю(); Сообщение.Текст = Результат; Сообщение.Сообщить(); В результате выполнения этого кода будет получено представление периода - девять месяцев 2011 года по-казахски: 9 ай 2011 ж. ЧислоПрописьюО Эта функция позволяет формировать представление числа прописью в соответствии с форматной строкой и на одном из языков, для которых поддерживается локализация. Формирование представления числа прописью поддерживается для следу- ющих региональных установок (табл. 22.8).
Таблица 22.8. Региональные установки, используемые в функции «ЧислоПрописьюО» Код Язык (страна) en_US Английский (США) be_BY Белорусский (Белоруссия) bg_BG Болгарский (Болгария) vi_VN Вьетнамский (Вьетнам) ka_GE Грузинский(Грузия) kk_KZ Казахский (Казахстан) lv_LV Латышский (Латвия) lt_LT Литовский (Литва) de_DE Немецкий (Германия) plpl Польский (Польша) ro_RO Румынский (Румыния) ru_RU Русский (Россия) uk_UA Украинский (Украина) VI Финский (Финляндия) et_EE Эстонский (Эстония) tr_TR Турецкий(Турция) ПОДРОБНЕЕ Точный список доступных региональных настроек, используемых в этой функции, можно посмотреть в синтакс-помощнике Глобальный контекст - Функции форматирования. Пример использования функции ЧислоПрописьюО показан в лис- тинге 22.18. Листинг 22.18. Пример использования функции «ЧислоПрописьюО» Результат = ЧислоПрописью(1457.25, "L = de_DE; FS = Истина", "EURO, EURO, М, Cent, Cent, М, 2"); Сообщение - Новый СообщениеПользоватепю(); Сообщение.Тексг = Результат; Сообщение.Сообщить(); В результате выполнения этого кода будет получено представление суммы 1457 евро 25 центов по-немецки: Eintausendvierhundertsiebenundfunfzig EURO und funfundzwanzig Cent Формат() Эта функция формирует удобное для чтения представление значений. Представление может формироваться с учетом стандартного форматиро- вания выбранного языка или страны. С помощью функции Формат() представления значений могут быть получены для одной из более чем 80 региональных установок, которые перечислены в документации. Приведем некоторые примеры использо- вания этой функции. Профессиональная разработка в системе «1С:Предприятие 8»
Истина по-французски: Сообщить(Формат(Истина, "L = fr_FR")); Результат: Oui Ложь по-чешски: Сообщить(Формат(Ложь, "L = cs_CZ")); Результат: Ne 20 августа 2010 г. 10:56:35 по-латышски: СообщитьСФорматСгОИОвгОЮЗбЗЗ', "L = lv_LV; ДЛФ='ДД+В"')); Результат: 2011. gada 20. augusta 10:56:35 Редактирование текстов интерфейса Платформа «1С:Предприятие» содержит инструмент, позволяющий автоматизировать процесс редактирования строк на разных языках, содер- жащихся в конфигурации. Данным режимом удобно пользоваться даже тогда, когда в конфигурации определен только один язык, так как он позволяет автоматизировать поиск мест, где необходимо ввести текст на требуемом языке. Окно редактирования текстов интерфейса позволят находить в конфигу- рации все строки на разных языках, группировать их по совпадающим значениям на каком-либо языке, копировать значения из одного языка в другой, а также выгружать значения строк из одной конфигурации и загружать их в другие. По команде Правка ► Редактирование текстов интерфейса... открывается окно настройки поиска (рис. 22.66). Настройка редактирования текстов интерфейса Область поиска: Конфигурации | Файлы Модули I Искать I | Закрыть | |Справка| Рис. 22.66. Настройка редактирования текстов интерфейсов Поиск возможен в основной конфигурации, в конфигурации базы данных, в файлах на диске, в открытых документах и в модулях в функциях НСтр(). Также можно задать область поиска, выбрав строку Вся конфигурация или указав определенные объекты для поиска. В поле Область поиска можно Том 2
Многояз^1нн^1е]прикладн^1е]решения указать наименование текущих установок и запомнить состав объектов, реквизитов, файлов для поиска. При новом поиске достаточно выбрать нужную строку из списка областей и выполнить поиск. После нажатия кнопки Искать открывается окно, содержащее результаты поиска (рис. 22.67). Редактирование текстов интерфейса Действия v | Сворачивать: [Совпадающие на всех языках & Расположение ' Русский (ru) • | Английский (еп) «Вхождений 360> kJ Основная конфигурация Ко... У/еЬ-сервисы V Основная конфигурация Ро... Администратор Ю Основная конфигурация Сл... Адрес картинш £3 Основная конфигурация Яз... Английскрй = Основная конфигурация Сл... Артикул Article & < В хождений 2> Данные отчета Data reports '*• «Вхождений 2> Дата начала Start date «Вхождений 2> Дата окончания End date = Основная конфигурация Сл... Единица измерения “ Основная конфигурация Сл... Закупочная цена Price ™ Основная конфигурация Сл... Картинка________________________Picture •S «Вхождений 3> Количество ||^Е (ПЗ Основная конфигурация Отч.. Конецпериода S «Вхождений 3> Контрагент QD Основная конфигурация Сл... Контрагенты "f Основная конфигурация Ро... Менеджер [®] Основная конфигурация Отч.. Началопериода Ф «Вхождений 3> Номенклатура Рис. 22.67. Редактирование текстов интерфейса Все найденные строки располагаются в таблице. Первая колонка пока- зывает объект конфигурации, содержащий данную строку. Следующие колонки соответствуют всем кодам языков, которые заданы в конфи- гурации, плюс всем кодам, найденным при поиске. На пересечении находятся значения строк. Таблица может быть сгруппирована по значениям, совпадающим на всех языках или только на языке, по которому выполнена сортировка. Это облегчает чтение и редактирование таблицы. Значения строк на разных языках можно редактировать прямо в этой таблице. Значение, введенное для группы строк, автоматически дублиру- ется в каждую строку, входящую в группировку. Копирование строк из одного языка в другой Копирование строк из одного языка в другой может понадобиться, например, при использовании внешних обработок, созданных в других информационных базах, или при частичном переводе интерфейса, когда непереведенные строки нужно заполнить из другого языка. Дело в том, что в различных информационных базах код языка, используемого по умолчанию, может быть разным. Например, в одной базе для русского языка был задан код ru_RU, а в другой базе - ru. Тогда внешняя обработка,
I Пл а ва}22Я Метод и ка! разработки созданная в первой базе, будет содержать код ru_RU для всех строк обра- ботки. Если такую обработку открыть во второй информационной базе, то ни одна строка интерфейса отображена не будет (рис. 22.68). Рис. 22.66. Отсутствие строк интерфейса на нужном языке На приведенном рисунке отображаются не синонимы и другие интер- фейсные свойства объектов, а их имена в том виде, как они заданы в конфигураторе. В этом случае можно запустить редактирование текстов интерфейса для открытой обработки (рис. 22.69). Рис. 22.69. Редактирование текстов интерфейсов Командой Действия к Копировать тексты... выполнить копирование текстов языка с кодом ru_RU в язык с кодом ru (код языка Русский в текущей базе), рис. 22.70.
Редактирование текстов интерфейса X Действия ’ । Сворачивать: [Совпадающие но всех языках |-*| 0 Расположение ' Русский (ru) r I Английский (en) ' ru_RU А $ <В хождений 3> Номенклатура Ш Основная конфигу... Номенклатура Nomenclature Основная конфигу... Организация [ЙЗ Основная конфигу... Основная схема компоно... й Основная конфигу... Остатки номенклатуры |S| Основная конфигу... Остагкитоеаров_________________________________________________________________ Основная конфигу... Отправить почту Отправить почту _____ " Основная конфигу... Полное наименование О Основная конфигу... Получить организацию О Основная конфигу... Получить организацию по... *> Основная конфигу... Получить отчет tgz Основная конфигу... Получить отчет потоварам IF1 Основная конфигу... Получить почту Получить почту О Основная конфигу... Приходная накладная Q Основная конфигу... Приходные накладные Основная конфигу... Работа с почтой Работа с почтой Q Основнаяконфигу... РасходнаяНакладная С] Основная конфигу... Расходные накладные ____ IF1 Основная конфигу.,, Результат т Рис. 22.70. Копирование текстов интерфейса для другого языка В результате этих действий надписи интерфейса будут корректно отобра- жены при текущем коде языка Русский (рис. 22.71). Рис. 22.71. Тексты интерфейса скопированы для нового языка Удаление строк на выбранном языке По разным причинам конфигурация может содержать строки, соот- ветствующие языку, который отсутствует в конфигурации. Это может происходить как в результате изменения кода существующего языка, так и в результате копирования объектов из других конфигураций. Для того чтобы удалить из конфигурации такие строки, можно использо- вать команду Действия ► Очистить тексты... окна редактирования текстов интерфейсов. В результате строки, соответствующие выбранному языку, будут удалены из конфигурации. Профессиональная разработка в системе «1С:Предприятие 8»
Перенос текстов интерфейса из одной базы в другую Перенос текстов интерфейса из одной информационной базы в другую может понадобиться в том случае, когда выполняется локализация интер- фейсов функционально пересекающихся между собой прикладных решений. Например, если интерфейс «Бухгалтерии предприятия» пере- веден на английский язык, то с большой вероятностью аналогичные строки интерфейса будут встречаться и в прикладном решении «Управ- ление производственным предприятием». Поэтому можно просто выгрузить строки интерфейса из прикладного решения «Бухгалтерия предприятия» и загрузить их в «Управление произ- водственным предприятием». При выполнении такой выгрузки-загрузки следует учитывать неоднознач- ность перевода. Одна и та же строка на русском языке может иметь различный перевод на английском. Например, русское слово Счет может быть переведено на английский как Invoice, если речь идет о торговле, и как Account, если речь идет о бухгалтерии. Поэтому, чтобы обеспечить однозначность переноса строк из одной конфигурации в другую, следует в исходной конфигурации создать новый объект конфигурации Язык и назвать его, например, Служебный. Этот язык нужно использовать для уточнения толкования терминов. Тогда, например, для русских названий Счет в служебном языке необхо- димо указать различные толкования, например, Счет бухгалтерия и Счет торговля (рис. 22.72). Редактирование текстов интерфейса X Действия •» । Сворачивать: | .0 1 Расположение Русский (ru) ’ Английский (еп) Служебньй (d) " Основная конфиу.. Счет Account Счет бухгалтерия = Основная конфиу.. Счет Invoice Счетторговля Рис. 22.72. Использование служебного языка в базе-источнике Во второй информационной базе следует также создать язык Служебный и придерживаться тех же правил указания различных толкований одного и того же слова (рис. 22.73). Редактирование текстов интерфейса X Действия т । Сворачивать: | Совпадающие но всех языках▼! ф Расположение Русский (ru) ' Служебный ($1) = Основная конфигурация Докум... Счет Счет бухгалтерия “ Основная конфигурация Докум... Счет Счетторговля Рис. 22.73. Использование служебного языка в базе-приемнике Том 2
Многояз^1нн^1е]прикладн^1е]решения Для того чтобы выгрузить из первой конфигурации тексты на разных языках в файл, необходимо выполнить команду Действия к Экспорт в табличный документ... (рис. 22.74). Экспорт в табличный документ X Гйключать расположение! 0Не включать пустые строки Имя Файла:___________________________ | Ф\ИнтерФейсные тексты, mxl | | ОК || Отмена 11 Справка | _ _ _ _ л л _ ---------------------------Рис. 22.74. Экспорт в табличный документ Флажок Включать расположение позволяет вывести в файл также и название объекта конфигурации, которому соответствуют строки. Для выполнения переноса в другую базу это не нужно, поэтому этот флажок следует снять. Флажок Не включать пустые строки имеет смысл установить, хотя это не является обязательным требованием. В результате будет сформирован табличный документ, имеющий следу- ющую структуру (рис. 22.75). бАИнгерФеДсные тексты, mxl _П X i 1112 1 3 русский (ru) |Анпвысхий (еп) Служебный (sD 2 3 |Счет |Счет Accoirt Invoice Счет бухгалтерия Счет торговля 5 1 .1 I» Рис. 22.75. Выгруженный табличный документ Для того чтобы этот табличный документ можно было использовать в качестве файла соответствий для загрузки в другую информационную базу, его следует немного отредактировать. Дело в том, что формат файла соответствий практически совпадает с форматом этого табличного доку- мента, за исключением того, что в первой строке файла соответствий должны содержаться только коды языков. Поэтому доработка должна заключаться в удалении из первой строки этого документа названий языков и скобок. После этого в другой информационной базе необходимо добавить язык Английский с кодом еп и открыть окно редактирования текстов интер- фейсов (рис. 22.76). Редактирование текстов интерфейса X Действия»!^ Сворачивать: [Совпадающие но всех язьках 0 | Расположение Русский (ru) » Служебный ($0 Английский (еп) " Основная конф... Счет Счет бухгалтерия = Основная конф... Счет Счетторговля Рис. 22.76. Тексты интерфейса в базе-приемнике
Глава}22ЯМётодика1р'а'зр'аботки| Затем следует выполнить команду Действия ► Заполнить тексты... (рис. 22.77). Заполнить тексты X Файл соответствия текстов: |Р:\ИнгерФейсные тексты, nad | По языку: Русский (м) В языки @ Заполнять только незаполненные | ОК || Отмена 11 Справка | Рис. 22.77. Заполнить тексты В окне настройки необходимо указать исходный язык, по которому будет осуществляться установка соответствия загружаемых текстов сущест- вующим в этой информационной базе. В нашем случае это будет язык Русский. Также следует отметить язык, в который будет осуществляться загрузка текстов из файла соответствий. В нашем случае это будет язык Английский. Для языка Служебный отметку нужно снять. Дело в том, что при поиске необходимого соответствия учитывается не только исходный язык, но и все языки, присутствующие и в конфигурации, и в файле и не помеченные на заполнение. Таким образом, в установке соответствий (кроме значений на русском языке) будут принимать участие и наши уточняющие толкования неоднозначных русских слов. После загрузки тексты на разных языках во второй конфигурации будут иметь следующий вид (рис. 22.78). Редактирование текстов интерфейса X Действия ’ । Сворачивать: [Совпадающие на всех язьках▼ | .0 | Расположение Русский (ru) ’ Служебный ($1) Английский (еп) = Основная конф... Счет Счет бухгалтерия Account " Основная конф... Счет Счет торговля Invoice Рис. 22.76. Результат загрузки Редактирование строк, используемых в функции «НСтр()» Строки на разных языках могут формироваться программно, с помощью функции НСтр() (подробнее см. раздел «Функция НСтр()», стр. 655). При этом нужно строго соблюдать синтаксис при написании строк на разных языках. Особенность реализации функции НСтр() состоит в том, что ни при синтаксической проверке модулей, ни при исполнении
никакой ошибки выдано не будет, если есть ошибка в синтаксисе. Функция просто вернет пустую строку. Поэтому для редактирования сложных строк, используемых в функции НСтр(), надежнее использовать механизм редактирования текстов интер- фейса. По умолчанию поиск в вызовах функции НСтр() не производится. Для его включения требуется установить соответствующий флажок в диалоге настройки редактирования текстов интерфейса (рис. 22.79). Рис. 22.79. Флажок поиска в функциях «НСтрО» При этом нужно соблюдать одно правило. Если необходимо сформиро- вать сложную строку как результат нескольких вызовов функции НСтр(), то рекомендуется располагать эти вызовы в разных строках модуля. Например, вместо строки (листинг 22.19) рекомендуется использовать вариант, представленный в листинге 22.20. Листинг 22.19. Неправильное использование вызовов функции «НСтрО» | НСтр("ш='Документ") +"" + НСтр("ш='Накледная’"); Листинг 22.20. Правильное использование вызовов функции «НСтрО» НСтр("ш-Документ”) +"" + НСтр(''ш='Накладная'"); Если несколько вызовов функции НСтр() расположены в одной строке, это может привести к ошибкам в работе механизма редактирования текстов интерфейса. При первичном редактировании строк с помощью этого механизма все вызовы НСтр() будут обработаны правильно. Однако при последующем редактировании тексты, соответствующие функциям НСтр(), располо- женным не первыми в строке, будут недоступны. Для решения этой проблемы достаточно заново произвести поиск интер- фейсных текстов, но лучше не допускать возникновения подобной ситуации и располагать вызовы функции НСтр() на разных строках. Профессиональная разработка в системе «1С:Предприятие 8»
Приложение. Хранение данных РАЗМЕЩЕНИЕ ДАННЫХ СИСТЕМЫ «1С:ПРЕДПРИЯТИЕ» Разработка прикладных решений в системе «1С:Предприятие» ведется в терминах объектов метаданных. Благодаря этому разработчик избавлен от необходимости вникать в то, каким образом данные того или иного объекта будут храниться в той или иной базе данных. Система самостоя- тельно создает необходимые структуры данных и работает с ними. Кроме удобства разработки, такой подход гарантирует единообразную работу с создаваемыми структурами данных, т.к. за все операции с данными на уровне СУБД отвечает сама система. В частности, это позволяет в значительной мере гарантировать целостность и непроти- воречивость данных, хранимых в базе данных. Однако в редких ситуациях разработчику или администратору информа- ционных баз «1С:Предприятия» все же может потребоваться информация о расположении данных, используемых системой. При этом нужно отда- вать себе отчет в том, что такая информация может быть использована только для понимания расположения и состава данных, используемых системой. Непосредственная работа с данными должна выполняться исключительно средствами «1С:Предприятия». Все данные, которые использует система «1С:Предприятие», можно условно разделить на 5 групп в соответствии с их назначением и значи- мостью. Данные информационной базы Это наиболее ответственная информация, включающая конфигурацию, все данные о хозяйственной деятельности предприятия, а также админис- тративную информацию. Все данные, относящиеся к информационной базе, объединяются в базу данных. Потеря или искажение каких-то данных информационной базы могут привести к потере работоспособ- ности системы, построенной на базе «1С:Предприягия». Данные хранилища конфигурации Хранилище конфигурации содержит текущую конфигурацию и историю ее разработки при использовании в конфигураторе средств групповой разработки. При разработке конфигурации эта информация также явля- ется жизненно важной. Том 2
Данные журнала регистрации Журнал регистрации содержит список операций, совершенных над данной информационной базой. Эта информация не является необходимой для работы системы на базе «1С:Предприятия», но может быть важной с организационной точки зрения. Вспомогательные данные К вспомогательным данным относятся такие данные, которые служат для удобства пользователя и не влияют на логику работы системы на базе «1С :Предприятия». Основная часть вспомогательных данных хранится в профайлах. Профайлы содержат информацию о расположении окон, текущих позициях, состоянии диалогов и других настройках, позволяющих пользователю работать наиболее комфортно. Различные конфигурации могут хранить в профайлах и другую информацию, которая может быть полезной, но не является необходимой. Также используются и другие вспомогательные данные. К ним отно- сятся списки информационных баз, зарегистрированных на клиенте или на сервере, и некоторые другие данные. Временные данные Эти данные использует приложение «1С:Предприятия» для служебных целей. Они актуальны только в пределах одного сеанса работы и после его завершения уничтожаются. Информационные базы Данные, которые определяют логику функционирования системы на базе «1С:Предприятия», относятся к информационной базе. Хранение инфор- мационной базы осуществляется в базе данных в виде набора таблиц. Для этого «1С:Предприятие 8» может использовать одну из пяти систем управления базами данных (СУБД): Встроенную в «1С:Предприятие 8» (файловый вариант информа- ционной базы). В этом случае все данные информационной базы хранятся в файле с именем 1cv8.1cd. Этот файл имеет двоичный формат и по сути является базой данных для встроенной в «1С:Пред- приятие 8» СУБД;
ПриложениеЭХранениеУданн^1х< Microsoft SQL Server (клиент-серверный вариант информационной базы). Все данные информационной базы хранятся в базе данных Microsoft SQL Server; PostgreSQL (клиент-серверный вариант информационной базы). Все данные информационной базы хранятся в базе данных PostgreSQL; IBM DB2 (клиент-серверный вариант информационной базы). Все данные информационной базы хранятся в базе данных IBM DB2; Oracle Database (клиент-серверный вариант информационной базы). Все данные информационной базы хранятся в базе данных Oracle Database. На уровне объектов базы данных (таблиц, полей, индексов и т.п.) как файловый, так и клиент-серверный вариант информационной базы имеет сходный формат (отличающийся несущественными деталями). Обязательные таблицы информационной базы Существует ряд таблиц, которые обязательно присутствуют в любой информационной базе «1С:Предприятия». Наличие этих таблиц проверя- ется при старте системы. Если какая-либо из таблиц отсутствует, выдается сообщение об ошибке. Если отсутствуют все обязательные таблицы, то считается, что такая база данных не является информационной базой (в терминах «1С:Предприятия»). В этом случае перечисленные ниже таблицы будут созданы в указанной базе данных. Перечислим обязательные таблицы информационной базы. Config - в этой таблице хранится конфигурация базы данных. Конфигурация базы данных соответствует реальной структуре данных и используется системой «1С:Предприятие» в режиме работы 1 С:Предприятие. ConflgSave - в этой таблице хранится основная конфигурация. Основная конфигурация предназначена для непосредственного редактирования в режиме Конфигуратор. Files - эта таблица содержит служебную информацию, например, о работе с хранилищем конфигурации. Params - эта таблица содержит параметры информационной базы. Параметры информационной базы включают в себя национальные уста- новки информационной базы, таблицу соответствия объектов метаданных и объектов базы данных (таблицы, поля, индексы), а также некоторую другую информацию. _YearOffset - эта таблица создается только в клиент-серверном варианте работы системы и содержит смещение дат в базе данных.
DBSchema - эта таблица содержит информацию о структуре базы данных «1С:Предприятия» и определяет другие объекты базы данных, использу- емые данной информационной базой. \78users - эта таблица содержит список пользователей информационной базы. _UsersWorkHistory - в этой таблице хранится история работы пользова- телей. _SystemSettings - эта таблица содержит хранилище системных настроек; _RepSettings - эта таблица содержит хранилище настроек отчетов. _RepVarSettings - эта таблица содержит хранилище настроек вариантов отчетов. _CommonSettings - эта таблица содержит хранилище общих настроек. _FrmDtSettings - эта таблица содержит хранилище настроек данных форм. Таблицы информационной базы, определяемые структурой метаданных Помимо обязательных таблиц информационная база, как правило, содержит ряд таблиц, которые предназначены для хранения данных объектов, описанных в конфигурации. Каждому объекту конфигурации соответствует одна или несколько таблиц информационной базы в зависи- мости от вида объекта и его структуры (наличия табличных частей и пр.). Количество этих таблиц напрямую зависит от количества и «сложности» объектов конфигурации и может быть достаточно большим. В штатном режиме «1С:Предприятие» не выполняет проверку наличия этих таблиц. Также не проверяется целостность и непротиворечивость данных, которые содержатся в этих таблицах. Поэтому важно, чтобы база данных, в которой размещена информационная база «1С :Предприятия», была защищена от несанкционированного доступа и ее модификация выполнялась только средствами «1С:Предприягия». Выполнить проверку информационной базы можно в режиме Конфигу- ратор командой Администрирование к Тестирование и исправланиа. Также важным моментом является то, что резервное копирование и восстановление базы данных, хранящей информационную базу, должны выполняться только целиком. В зависимости от варианта работы «1С:Предприятия» (файловый или клиент-серверный) можно рекомендовать следующие способы создания резервной копии информа- ционной базы. В файловом варианте работы достаточно скопировать файл 1CV8.1CD в отдельный каталог. Это можно выполнить как ручным копированием, так Профессиональная разработка в системе «1С:Предприятие 8»
и с использованием программного обеспечения для резервного копиро- вания и восстановления данных. При этом нужно учесть, что на время копирования работа пользователей с информационной базой должна быть запрещена. Это необходимо для обеспечения целостности и согласован- ности данных во время создания резервной копии. В клиент-серверном варианте работы следует создавать резервные копии информационной базы средствами СУБД, под управлением которых рабо- тает информационная база «1С:Предприятия». Эти СУБД позволяют выполнять резервное копирование данных в то время, когда база данных находится в многопользовательском режиме и доступна для всех пользо- вателей. Использование этих способов дает максимально точную копию состояния информационной базы, что не всегда может быть получено при использо- вании, например, режима загрузки/выгрузки информационной базы. Если в базе данных есть нарушения, то при выгрузке некоторая информация может быть не выгружена, в то время как при копировании будет сохра- нена вся информация и после восстановления можно будет выполнить исправление базы данных. Также существенно уменьшается время нахождения информационной базы в однопользовательском режиме в случае файлового варианта работы «1С:Предприятия», а в случае клиент-серверного варианта однопользова- тельский режим вообще не используется. Кроме этого, положительным моментом является то, что при исполь- зовании перечисленных способов можно применять различные специализированные программные средства для создания резервных копий. Таблицы информационной базы, определяемые структурой метаданных, имеют имена, создаваемые по одному и тому же правилу. Имя таблицы начинается с буквенного префикса, который обозначает принадлежность таблицы определенному виду объектов конфигурации и может уточнять функциональное назначение таблицы «внутри» этого вида. Например, префикс _AccumRg означает, что это таблица некоторого регистра накоп- ления, а префикс _AccumRgT означает, что это таблица итогов некоторого регистра накопления. После префикса следует номер (далее обозначается <п>), который позво- ляет различать таблицы объектов одинакового вида. Например, если в конфигурации определены два регистра накопления, то в информа- ционной базе могут содержаться таблицы с именами _AccumRg4012 и _AccumRg4018. Таблицы, в которых хранятся записи табличных частей, также обозна- чаются одинаковым образом. После префикса и номера, определяющих принадлежность к некоторому объекту конфигурации, идет префикс _VT, указывающий, что это таблица табличной части, и номер (далее обозна- чается <к>), позволяющий различить несколько табличных частей одного и того же объекта конфигурации. Том 2
ЕазмещениеУданн£|х{систем£|С<<1С: Предприятие»! Например, для документа, имеющего две табличные части, могут быть созданы таблицы с именами _Documentl04_VT2061 и _Documentl04_ VT2076. Если в конфигурации определен хотя бы один план обмена с установ- ленным флажком Распределенная информационная база, то будут созданы следующие таблицы: _ConflgChangeRec - таблица регистрации изменений объектов конфи- гурации; _ConflgChangeRec_ExtProps - таблица имен файлов измененных внешних свойств объектов конфигурации. Перечислим, какие таблицы создаются для каждого из прикладных объектов конфигурации. Константы _Consts - таблица констант. Все значения констант, определенных в конфигурации, хранятся в одной таблице. _ConstsChngR - таблица регистрации изменений констант. Создается, если хотя бы одна константа участвует хотя бы в одном плане обмена. Планы обмена _Node<n> - основная таблица плана обмена. _Node<n>_VT<k> - табличная часть плана обмена. Таблицы, содержащие табличные части плана обмена, имеют тот же номер <п>, что и основная таблица плана обмена. Например: _Node62 _Node62_VT63 Справочники _Reference<n> - основная таблица справочника. _Reference<n>_VT<k> - табличная часть справочника. Таблицы, содержащие табличные части справочника, имеют тот же номер <п>, что и основная таблица справочника. Например: _Reference54 _Reference54_VT600
ПриложениеЭХранениеУданн£|х< _Reference54_VT605 _ReferenceChngR<n> - таблица регистрации изменений справочника. Создается, если справочник участвует хотя бы в одном плане обмена. Документы _Document<n> - основная таблица документа. _Document<n>_VT<k> - табличная часть документа. Таблицы, содержащие табличные части документа, имеют тот же номер <п>, что и основная таблица документа. Например: _Documentl44 _Documentl44_VT3409 _Documentl44_VT3416 _Documentl44_VT3420 _DocumentChngR<n > - таблица регистрации изменений документа. Созда- ется для каждого объекта метаданных Документ, который участвует хотя бы в одном плане обмена. Поел едовател ьн ости _Seq<n> - таблица регистрации документов в последовательности. _SeqB<n> - таблица границ последовательности. Эти таблицы имеют сквозную нумерацию, поэтому для одной последова- тельности могут быть созданы, например, таблицы с именами: _Seq4504 _SeqB4505 _SeqChngR<n> - таблица регистрации изменений последовательности. Создается для каждой последовательности, которая участвует хотя бы в одном плане обмена. Журналы документов _DocumenUouma!<n> - таблица журнала документов. Перечисления _Enum<n> - таблица перечисления. Планы видов характеристик _Chrc<n> - основная таблица плана видов характеристик.
_Chrc<n>_VT<k> - табличная часть плана видов характеристик. Таблицы, содержащие табличные части плана видов характеристик, имеют тот же номер <п>, что и основная таблица плана видов характеристик. Например: _Chrc262 _Chrc262_VT4513 _ChrcChngR<n> - таблица регистрации изменений плана видов харак- теристик. Создается, если план видов характеристик участвует хотя бы в одном плане обмена. Планы счетов _Асс<п> - основная таблица плана счетов. _Acc<n>_ExtDim<k> - таблица видов субконто плана счетов. Эта таблица создается в том случае, если максимальное количество субконто больше нуля. _Acc<n>_VT<k> - табличная часть плана счетов. Таблицы, содержащие табличные части плана счетов, и таблица видов субконто имеют тот же номер <п>, что и основная таблица плана счетов. Например: _Асс65 _Acc65_ExtDim70 _Acc65_VT66 _AccChngR<n> - таблица регистрации изменений плана счетов. Созда- ется, если план счетов участвует хотя бы в одном плане обмена. Планы видов расчета _CKind<n> - основная таблица плана видов расчета. _CKind<n>_BaseCK - таблица базовых видов расчета. Эта таблица созда- ется, если у плана видов расчета свойство Зависимость от базы имеет значение, отличное от Не зависит. _CKind<n>_DisplacedCK - таблица вытесняемых видов расчета. Эта таблица создается в случае, если для плана видов расчета установлен флажок Использует период действия. _CKind<n>_LeadingCK - таблица ведущих видов расчета. _CKindDN<n> - вспомогательная таблица для порядка вытеснения. Эта таблица создается в случае, если у плана видов расчета установлен флажок Использует период действия. Профессиональная разработка в системе «1С:Предприятие 8»
_CKind<n>_VT<k> - табличная часть плана видов расчета. Все таблицы плана видов расчета имеют один и тот же номер <п>, за исключением вспомогательной таблицы для порядка вытеснения. Для нее используется сквозная нумерация. Например: _CKind71 _CKind71_BaseCK _CKind71_Disp!acedCK _CKind71_LeadingCK _CKind71_VT72 _CKindDN74 _CKindChngR<n> - таблица регистрации изменений плана видов расчета. Создается, если план видов расчета участвует хотя бы в одном плане обмена. Регистры сведений _InfoRg<n> - таблица движений регистра сведений. _InfoRgChngR<n> - таблица регистрации изменений регистра сведений. Создается, если регистр сведений участвует хотя бы в одном плане обмена. Регистры накопления _AccumRg<n> - таблица движений регистра накопления. _AccumRgT<n> - таблица итогов регистра накопления. Эта таблица созда- ется в случае, если регистр накопления поддерживает остатки. _AccumRgTn<n> - таблица оборотов регистра накопления. Эта таблица создается, если регистр поддерживает обороты. _AccumRgOpt - таблица настроек хранения итогов регистров накопления. Эта таблица создается одна на все регистры накопления. _AccumRgAgg<n> - таблица агрегатов регистра накопления. _AccumRgAggOpt - таблица опций сети агрегатов. _AccumRgSt<n> - таблица статистики регистра накопления. _AccumRgBf<n> - таблица буфера новых оборотов регистра накопления. _AccumRgDI<n> - таблица новых оборотов регистра накопления. _AccumRgAggDims - таблица кодов измерений регистра накопления. _AccumRgAggGrid - таблица сети агрегатов. Том 2
Вазмещение7данн^1х{систем^1С«11.С: Предприятие»! Эти таблицы имеют сквозную нумерацию, поэтому для одного регистра накопления могут быть созданы, например, следующие таблицы. Регистр накопления остатков: _AccumRg4012 _AccumRgT4017 Оборотный регистр накопления: _AccumRg4047 _Accu m RgT n4064 _AccumRgChngR<n> - таблица регистрации изменений регистра накоп- ления. Создается, если регистр накопления участвует хотя бы в одном плане обмена. Регистры бухгалтерии _AccRg<n> - таблица движений регистра бухгалтерии. _AccRgED<n> - таблица значений субконто регистра бухгалтерии. Эта таблица создается в том случае, если регистр бухгалтерии ссылается на план счетов, у которого максимальное количество субконто больше нуля. _AccRgATO<n> - таблица остатков и оборотов по счетам и субсчетам. _AccRgAT<ixn> - таблица остатков и оборотов по счетам, субсчетам и субконто. Эти таблицы создаются в том случае, если регистр бухгал- терии ссылается на план счетов, у которого максимальное количество субконто больше нуля. Номер i изменяется от 1 до максимального коли- чества субконто. _AccRgCT<n> - таблица итогов оборотов между счетами. Эта таблица создается только для регистра бухгалтерии, поддерживающего коррес- понденцию. _AccRgOpt - таблица настроек хранения итогов. Эта таблица создается одна на все регистры бухгалтерии. Все таблицы регистра бухгалтерии имеют сквозную нумерацию, поэтому для регистра бухгалтерии, под держивающего корреспонденцию и связан- ного с планом счетов, у которого максимальное количество субконто равно 3, могут быть созданы, например, следующие таблицы: _AccRg83 _AccRgED98 _AccRgAT085 _AccRgAT195 _AccRgAT296 <£)(£) el)
ПриложениеЭХранениеУданн£|х< _AccRgAT397 _AccRgCT92 _AccRgChngR<n> - таблица регистрации изменений регистра бухгал- терии. Создается, если регистр бухгалтерии участвует хотя бы в одном плане обмена. Регистры расчета _CRg<n> - таблица движений регистра расчета. _CRgActP<n> - таблица фактического периода действия. Эта таблица создается в том случае, если у регистра расчета установлен флажок Период действия. _CRgReca!c<n> - таблица перерасчета регистра расчета. Все таблицы регистра расчета имеют сквозную нумерацию. Например, для одного регистра расчета могут быть созданы следующие таблицы: _CRglOO _CRgActP106 _CRgReca!clO4 _CRgChngR<n> - таблица регистрации изменений регистра расчета. Создается для каждого регистра расчета, участвующего хотя бы в одном плане обмена. _CRgReca!cChngR<n> - таблица регистрации изменений перерасчета. Создается, если перерасчет участвует хотя бы в одном плане обмена. Бизнес-процессы _ВРг<п> - основная таблица бизнес-процесса. _BPr<n>_VT<k> - табличная часть бизнес-процесса. _BPRPoints<n> - таблица точек маршрута бизнес-процесса. Таблицы, содержащие табличные части бизнес-процесса, имеют тот же номер <п>, что и основная таблица бизнес-процесса, однако для таблицы точек маршрута бизнес-процесса используется сквозная нумерация. Поэтому для одного бизнес-процесса могут быть созданы, например, следующие таблицы: _ВРг75 _BPr75_VT76 _BPRPoints78 _BPrChngR<n> - таблица регистрации изменений бизнес-процесса. Созда- ется для каждого бизнес-процесса, участвующего хотя бы в одном плане обмена.
Задачи _Task<n> - основная таблица задачи. _Task<n>_VT<k> - табличная часть задачи. Таблицы, содержащие табличные части задачи, имеют тот же номер <п>, что и основная таблица задачи. Например: _Task77 _Task77_VT80 _TaskChngRec<n> - таблица регистрации изменений в задачах. Созда- ется для каждого объекта метаданных Задача, который участвует хотя бы в одном плане обмена. При использовании информационной базы IBM DB2 префиксы псев- донимов таблиц начинаются не с символа подчеркивания, а сразу с буквенной части. Хранилище конфигурации Хранилище конфигурации используется при групповой разработке конфи- гураций и служит для хранения истории версий конфигурации, включая последнюю (текущую) версию. Все хранилище содержится в одном файле - 1Cv8ddb.1cd. Каталог, в котором располагается этот файл, может быть произвольным и задается при создании хранилища конфигурации. Если разработка конфигурации ведется с использованием хранилища конфигурации, то данные, хранимые в этом файле, являются жизненно важными. Поэтому рекомендуется выполнять резервное копирование файла 1Cv8ddb.1cd. Журнал регистрации Журнал регистрации относится к информационной базе, но не является ее частью. Он служит для сохранения информации о событиях, возника- ющих в процессе работы пользователей с данной информационной базой. Эта информация может быть важной с организационной точки зрения, но не является необходимой для функционирования прикладного решения «1 С:Предприятия». Журналы регистрации хранятся в специальных каталогах 1Cv8Log по одному на каждую информационную базу. Каждый каталог содержит файл 1Cv8.!gf и несколько файлов с именами вида yyyyMMddhhmmss.lgp, где уууу - номер года, ММ - номер месяца, dd - номер дня в месяце, hh - номер часа, mm - номер минуты, ss - номер секунды. Например, Профессиональная разработка в системе «1С:Предприятие 8»
20070525200000.!gp. Файл 1Cv8.!gf содержит общую информацию журнала регистрации. Каждый файл yyyyMMddhhmmss.lgp содержит фрагмент журнала регистрации за соответствующий период. Имя файла представляет момент времени начала периода. Длина периода опреде- ляется настройкой журнала регистрации Разделять хранение журнала по периодам. В файловом варианте информационной базы журнал регистрации распо- лагается в каталоге информационной базы, в том же, что и файл самой информационной базы. Например, если информационная база хранится в файле C:/Enterprise!nfoBase/1cv8.1cd, то журнал регистрации будет нахо- диться в каталоге C:/EnterpriselnfoBase/1Cv8log. В клиент-серверном варианте информационной базы журнал регис- трации располагается в подкаталоге рабочего каталога кластера. Имя подкаталога определяется иден- тификатором информационной базы. Например: C:/Program Fi!es/1cv82/ server/reg_1541/fb9d9cc4-ccd0-4be7-87e8- с5182945291 е/1 Cv8Log. Таблица. Виды профайлов Принадлежность данных Примеры хранимы Компьютер клиента - Открыто ли табло - Настройки текста» Профайлы Профайлы содержат информацию, Компьютер клиента - Файлы клиентски) о резервных клан служебная инфор не оказывающую влияния на логику функционирования системы на базе «1С:Предприятия». Такая информация не Информационная база - Режим аутентифи «ЮЛредприятия - Каталог последне хранилища конфи является необходимой, но ее сохранение может, например, повысить комфорт- ность работы пользователя. В профайлах обычно хранятся формат и расположение окон и диалогов, настройки шрифтов, цветов, отборов и т. п. Потеря такой Информационная база и пользователь - Настройки динам» - Настройки отборо регистрации Компьютер и информационная база - Настройки сравне конфигураций. - Настройки глобал конфигурации информации не может привести к нару- шению работоспособности системы. Данные из профайлов читаются при Компьютер, информационная база и пользователь - Расположение окт - Список переменно просмотра в отпа/ старте «1С:Предприятия» и записы- ваются при его штатном завершении. По этой причине в случае нештатного завершения некоторые пользовательские настройки могут не сохраниться. Профайлы различаются по принадлеж- ности хранимой в них информации. «ЮЛредприятие 8» в режиме «Конфигуратор» - Расположение оке - Цвета редактора в конфигураторе «1 С:Предприятие 8» в режиме «1С:Предприятие» - Расположение оке - Цвета редактора в конфигураторе Этим же свойством определяется то, что хранятся они в различных ката- логах различных компьютеров. Диалог запуска «ЮЛредприятия 8» - Размеры и распог - Настройки диалог информационных Том 2
Вазмещение7данн^1х{систем^1С«11.С: Предприятие»! Например, параметры, связанные с экранными характеристиками компьютера, хранятся так, чтобы действовать только в пределах данного компьютера, а параметры, связанные только с данными и не имеющие отношение к компьютеру, хранятся таким образом, чтобы быть доступными при запуске пользователем системы с любого компью- тера. Параметры, связанные с конфигурированием, сохраняются независимо от информационной базы, так как считается, что разра- ботчик может работать с несколькими информационными базами и несколькими конфигурациями. Параметры работы пользователя в режиме 1 С: Предприятие сохраняются для конкретной информационной базы и конкретного пользователя. Далее (см. табл.) перечислены профайлы, используемые системой «1С:Предприятие» с привязкой к их расположению. жданных Расположение юго редактора «Данные приложений пользователям C/1cv82/1Cv8.pfl, например: C:/Documents and Settings/User/Application Data/1 C/1 cv82/1 Cv8.pfl настроек, информация герах и другая мация Например C:\Documents and Settings\AII Users\Applicadon Data\1C\1 Cv82\ conn8211.pfl кации при старте »из отладчика. го сохранения гурации в файл Таблица flies базы данных, в которой размещена информационная база 1Ч6СКИХ списков, в по журналу Таблица files базы данных, в которой размещена информационная база ния файлов ьного поиска по текстам «Данные приложений пользователям С/1ст82/«Идентификатор информационной 6a3H>/1Cv8.pfl, например: C:/Documents and Settings/User/Application Data/1 C/1 cv82/ 4129dbdb-b495- 41 cb-99ea-ef315060a03e/1 Cv8. pfl еэ синтакс-помощника. >ix для быстрого дчике «Данные приложений пользователям С/1ст82/«Идентификатор информационной базы>/«Идентификатор пользователям Cv8.pfl, например: C:/Documents and Settings/User/Application Data/1 C/1 cv82/4129dbdb-b495- 41cb-99ea-ef315060a03e/E8D87DA4-A087-4145-95E7-D613E0F7CB64/1Cv8.pfl )н конфигуратора, иодупей «Данные приложений пользователям C/1cv82/1Cv8cmn.pfl, например: C:/Documents and Settings/User/Application Data/1 C/1 cv82/1Cv8cmn.pfl )н конфигуратора, модулей «Данные приложений пользователям С/1ст82/«Идентификатор информационной базы>/«Идентификатор пользователям Cv8cmn.pfl, например: C:/Documents and Settings/User/Application Data/1 C/1 cv82/ 4129dbdb- b495-41cb-99ea-ef315060a03e/E8D87DA4-A087-4145-95E7- D613E0F7CB64/1Cv8cmn.pfl южение диалога запуска, ов установки параметров баз «Данные приложений пользователям C/1 cv82/1Cv8strt.pfl, например: C:/Documents and Settings/User/Application Data/1 C/1 cv82/1Cv8strt.pfl
ПриложениеЭХранениеУданн£|х< Другие вспомогательные данные Кроме профайлов, система «1С:Предприятие» использует целый ряд других вспомогательных файлов. В них содержится информация, которая помогает сделать работу пользователей системы более удобной. def.usr - содержит имя пользователя, который последним открывал данную информационную базу. Этот файл хранится в каталоге: сданные приложений пользователя>\1С\1Сл/82\<Идентификатор ИБ>. Например: C:\Documents and Settings\User\App!ication Data\1C\1Cv82\4129dbdb-b495- 41 cb-99ea-ef315060a03e\def.usr; ibases.vSi - содержит список информационных баз, зарегист- рированных на данном клиентском компьютере. Этот список отображается в диалоге Запуск «1 С: Предприятия». Этот файл хранится в каталоге: сданные приложений пользователя^C\1CEStart\. Например: C:\Documents and Settings\User\Application Data\1C\1CEStart\ibases.v8i; v8cscadr.!st - содержит адрес каталога шаблонов конфигураций. Этот файл хранится в каталоге: «Данные приложений пользователя^! С\1 Cv82\. Например: C:\Documents and Settings\User\App!ication Data\1C\1Cv82\ v8cscadr.lst; GenTemp!_ru.st, GenTempl en.st - стандартный файл шаблонов текста на русском и английском языках соответственно. Этот файл хранится в каталоге загрузочных модулей «1С:Предприятия». Например: C:\Program Fi!es\1CV82\bin; appsrvrs.lst — содержит список серверов «1С:Предприятия», зарегис- трированных в утилите администрирования информационных баз в варианте клиент-сервер. Этот файл хранится в каталоге: «Данные приложений пользователя^! C\1Cv82\. Например: C:\Documents and Settings\User\App!ication Data\1 С\1 Cv82\appsrvrs.!st; srvribrg.Ist - содержит список кластеров, зарегистрированных на данном компьютере сервера «1С:Предприятия». Содержащиеся в нем данные необходимы для нормальной работы приложений, использующих данный сервер «1С:Предприятия». Этот файл хранится на центральном сервере кластера в каталоге: «рабочий каталог цент- рального сераера>. Например: C:/Program Fi!es/1cv82/server/srvribrg.lst; 1 CV8Reg.!st - файл настройки кластера (например: C:\Program Fi!es\1 cv82\ srvinfo\reg_1541 \1 CV8Reg.!st); в каталогах DBNameCache, ConfigSave, Config, SlCache хранится множество файлов, кеширующих различные компоненты конфи- гурации. Эта информация является производной от конфигурации информационной базы, хранимой в базе данных, и служит для ускорения запуска клиентских приложений и повышения их произ- водительности. Кеш конфигурации располагается в каталоге данных приложений текущего пользователя, например, C:/Documents and
Settings/User/Loca! Settings/Application Data/1 C/1 cv82/7b0a6294-d6a3-41 c5- a23e-dc9e5301 ad22/DBNameCache; в каталоге 1Cv8FTxt хранятся данные, используемые службой полнотекстового поиска. Они располагаются на компьютере цент- рального сервера «ЮЛредприятия» в каталоге «рабочий каталог кластера>/<идентификатор информационной базы>. Например: C:/Program Fi!es/1 cv82/server/reg_1541/7eac7609-c0cb-4701 -83cf-9ff5f8961 de8/1 Cv8FTxt; группа файлов CACHE/ddb<n>.snp хранится в каталоге хранилища конфигурации и служит для кеширования запрошенных версий конфигурации из этого хранилища. Наличие этих файлов не является обязательным и позволяет ускорить получение версий конфигурации; *.1ссг - конфигурационный файл веб-сервиса для работы с удаленным хранилищем может иметь произвольное имя (расширение 1ссг обяза- тельно), формат XML и содержит единственный узел с произвольным именем и атрибутом connectstring - в этом атрибуте указывается адрес сервера хранилища в схеме tcp; *.mft - файл с расширением mft является файлом-манифестом - специ- альным файлом, описывающим шаблон конфигурации. Файл может иметь произвольное имя. Файл располагается в каталоге установлен- ного шаблона конфигурации; *.v8i - в данном файле приводится описание формата файла описаний зарегистрированных информационных баз. Данный список исполь- зуют все клиенты. Файл располагается на локальном компьютере в каталоге %APPDATA%\1C\1CEStart\ и по умолчанию имеет имя ibases.vSi; 1 CESCmn.cfg - содержит общие настройки программ запуска (1 CEStart. ехе и 1Cv8s.exa); ICEStart.cfg - содержит настройки, которые используют программы запуска (1CEStart.exe и 1Cv8s.exe) и клиентские приложения (1Cv8.exe и 1Cv8c.exe). Файл расположен в каталоге %APPDATA%\1C\1 CEStart; adminstall.cfg - указывает на то, что установка системы программ «ЮЛредприятие» выполнялась с использованием средств админис- трирования операционной системы. Файл располагается в каталоге конфигурационных файлов системы «ЮЛредприятие» и представ- ляет собой текстовый документ в кодировке UTF-8; comcntrcfg.xm! - служит для указания внешнему соединению необходи- мости запуска в отладочном режиме. Файл располагается в каталоге конфигурационных файлов системы «ЮЛредприятие», и его наличие не является обязательным; conf.cfg - определяет расположение каталога общих конфигурационных файлов. Файл расположен в каталоге bin\conf каталога конкретной версии «ЮЛредприятия» и представляет собой текстовый документ в кодировке UTF-8; Профессиональная разработка в системе «ЮЛредприятие 8»
debugcfg.xm! - предназначен для настройки дополнительного диапазона портов, используемого при отладке конфигураций. Файл располагается в каталоге конфигурационных файлов системы «1С:Предприятие», и его наличие не является обязательным; default.vrd - служит для настройки веб-клиента и использования веб-сервисов и находится в каталоге виртуального приложения; inetcfg.xm! - позволяет задавать настройки прокси по умолчанию и имеет больший приоритет над настройками прокси по умолчанию в Windows. Файл располагается в каталоге конфигурационных файлов системы «1С:Предприятие», и его наличие не является обязательным; logcfg.xml - служит для настройки технологического журнала. Файл располагается в каталоге конфигурационных файлов системы «1С:Предприятие», и его наличие не является обязательным; logui.txt - располагается в каталоге %АРРОАТА%\1С\1Су82\<Уникальный идентификатор информационной базы> и содержит список интер- активных действий пользователя, которые выполнялись за время журналирования; nethasp.ini - используется для настройки параметров взаимодействия системы «1С:Предприятие» с HASP License Manager. Файл располага- ется в каталоге конфигурационных файлов системы «1С :Предприятие», и его наличие не является обязательным; nhsrv.ini - содержит некоторые настройки HASP License Manager. При запуске HASP License Manager осуществляет поиск конфигурационного файла nhsrv.ini в различных каталогах в следующей последователь- ности: □ каталог, в котором размещается исполняемый файл HASP License Manager; □ текущий каталог Windows; □ системный каталог Microsoft Windows (%SystemRoot%\system32 - для 32-разрядной версии и %SystemRoot%\system - для 64-разрядной версии); □ каталог Microsoft Windows; □ каталоги, перечисленные в переменной окружения PATH (только в случае установки HASP License Manager как приложения Microsoft Windows). Рекомендуется размещать файл nhsrv.ini, если это необходимо, в ката- логе, в котором размещается исполняемый файл HASP License Manager. Проверить, что HASP License Manager нашел и прочитал файл конфи- гурации, можно с помощью журнала Activity Log/Server Activity Log; srv1cv82 - конфигурационный файл Zetc/sysconfig/srv1cv82 используется для задания параметров запуска агента сервера «1С:Предприятие» с помощью скрипта /etc/init.d/srv1cv82. Данный конфигурационный файл Том 2
Вазмещение7данн^1х{систем^1С«11.С: Предприятие»! используется в случае запуска сервера «1С:Предприятия» в операци- онной системе Linux; swpuser.ini - для того чтобы рабочий процесс запускался не от имени того же пользователя, что и агент сервера, в каталоге данных прило- жений, относящемся к пользователю агента сервера, может быть размещен файл swpuser.ini; *.lic - лицензии базовых конфигураций (C:\Documents and Settings\AI! Users\Application Data\1C\Iicenses). файлы программных лицензий расположены в каталоге конфигураци- онных файлов системы «1С:Предприятие». Временные данные Временные данные нужны только в течение нескольких пересекающихся во времени сеансов или одного сеанса «1С:Предприятия». К нескольким пересекающимся во времени сеансам относятся данные совместного использования, которые относятся к файловой информаци- онной базе в целом. Например, это данные, которые нужны для реализации блокировок данных информационной базы. Такие данные хранятся в том же каталоге, что и файл информационной базы: 1Cv8.1cl — является носителем блокировок объектов базы данных, расположенной в файле 1Cv8.1cd; 1Cv8Tmp.1cd - хранит служебную сеансовую информацию, в част- ности список активных пользователей; 1 Cv8Tmp. 1 с! - является носителем блокировок данных, расположенных в файле 1Cv8Tmp.1cd. Для хранилища конфигурации «1С:Предприятие 8» в режиме Конфигу- ратор создает временные файлы аналогичного назначения, расположенные в каталоге хранилища конфигурации: 1Cv8ddb.1cl - является носителем блокировок данных из хранилища конфигурации; 1Cv8dtmp.1cd - хранит служебную сеансовую информацию, в част- ности список активных пользователей хранилища конфигурации; 1 Cv8dtmp. 1 cl - является носителем блокировок данных, расположенных в файле 1Cv8ddb.1cd. Данные, используемые только в течение одного сеанса «1С:Предприятия», размещаются во временных файлах, создаваемых в каталоге, опреде- ленном в системе Microsoft Windows как каталог временных файлов. При этом для клиентского приложения используется каталог временных файлов текущего пользователя Windows, например, C:\Documents and Settings\User\Loca! Settings\Temp. Для сервера «1С:Предприятия» использу- ется системный каталог временных файлов, например, C:\WINNT\Temp.
ПриложениеЭХранениеУданн£|х< ПОЛЯ ТАБЛИЦ БАЗЫ ДАННЫХ Как упоминалось в предыдущем разделе, многие объекты конфигу- рации описывают определенные структуры хранения информации в базе данных. При этом для хранения данных одних объектов конфигурации создаются одна или несколько связанных таблиц базы данных, а другие объекты конфигурации определяют наличие тех или иных полей в этих таблицах. Как правило, это подчиненные объекты конфигурации. Исклю- чение составляют константы, которые хранятся в одной таблице базы данных, поэтому для каждой константы создается поле в этой таблице. В обобщенном виде информация о соответствии тех или иных объектов конфигурации таблицам или полям базы данных представлена в таблице ниже. Таблица. Соответствие объектов конфигурации полям и таблицем базы данных Элемент базы данных Объект конфигурации Таблица Бизнес-процесс Все константы Документ Журнал документов Задача Перерасчет Перечисление План видов расчета План видов характеристик План обмена План счетов Последовательность Регистр бухгалтерии Регистр накопления Регистр расчета Регистр сведений Справочник Табличная часть Поле Измерение Константа Признак учета Признак учета субконто Реквизит Реквизит адресации Ресурс Таблицы базы данных, создаваемые для объектов конфигурации, были перечислены в разделе «Таблицы информационной базы, определяемые структурой метаданных» на стр. 662. Здесь мы подробнее остановимся на полях базы данных, создаваемых для хранения данных тех или иных объектов конфигурации. Для всех перечисленных объектов конфигурации должен быть указан тип значений хранимых данных. В общем случае это может быть один из примитивных типов, ссылочный тип или составной тип.
Хранение значений полей примитивных и ссылочных типов Если назначен один из примитивных типов или ссылочный тип, то в базе данных создается одно поле, тип которого соответствует указанному типу. В таблице ниже приведен список примитивных типов с указанием соответствующего типа поля базы данных в терминах различных СУБД. Таблица. Типы полей, хранящих значения примитивных и ссылочных типов Тип данных Тип поля базы данных Пример MS SQL Server PostgreSQL IBM DB2 Число длина п, точность к NUMERIC(n, k) numeric(n.k) dec(n.k) _Fld390 Строка фиксированной длины п NCHAR(n) mchar(n) graphic(n) _Fld390 Строка переменной длины п NVARCHAR(n) mvarchar(n) vargraphic(n) _Fld390 Строка неограниченной длины NTEXT mvarchar dbclob _Fld390 Дата DATETIME timestamp timestamp _Fld390 Булево BINARY(1) boolean char(1) for bit data _Fld390 Хранилище значения IMAGE bytea blob _Fld390 Ссылка BINARY(16) bytea char(16) for bit data _Fld242_RRef Для примитивных типов и хранилища значения имя формируется из префикса _Fld и некоторого номера, позволяющего однозначно иденти- фицировать данное поле. Для ссылочных типов к имени поля добавляется суффикс _RRef. Схема базы данных содержит информацию о типах тех или иных полей. Таким образом, известно, что, например, в поле _F!d390 содержится тип значения Булево, а в поле _F!d242_Rref - значение типа СправочникСсылка. Номенклатура. Хранение значений полей составного типа Если указано, что объект конфигурации имеет составной тип данных или набор типов, то для хранения значений такого типа будет исполь- зовано несколько полей базы данных. Количество используемых полей будет зависеть от набора типов, входящих в составной тип. Все поля базы данных, содержащие значение такого объекта конфигурации, имеют одинаковые имена, различающиеся суффиксами (несколькими послед- ними символами). Суффикс имени поля базы данных определяет тип и назначение хранимых в нем данных. В табл. «Типы полей, хранящие Профессиональная разработка в системе «1С:Предприятие 8»
значения составного типа» перечислены все возможные суффиксы имен полей базы данных с указанием их типа, значения полей с этими суффиксами и условия, при которых они добавляются к представлению объектов базы данных данного типа. В общем случае состав полей для хранения значения такого объекта может включать в себя до семи полей. Значение поля с суффиксом _ TYPE указывает, каков фактический тип значения, хранящегося в этих полях: Число, Строка, Дата, Булево или Ссылка. Если хранится значение одного из примитивных типов, то это значение получается из поля с соот- ветствующим суффиксом: _N, _S, _Т или _L (рис. «Хранение значений составного типа»). Если хранится значение некоторого ссылочного типа из нескольких возможных, то поле с суффиксом _RTRef содержит указание на конкретный тип ссылки (фактически содержит номер таблицы), а поле с суффиксом _ RRRef- собственно ссылку (идентификатор записи, на которую ссылается значение). Таблица. Типы полей, хранящие значения составного типа Суффикс Тип поля базы данных Когда присутствует MS SQL Server PostgreSQL IBM DB2 .TYPE BINARY(1) bytea char(1) for bit data Всегда _L BINARY(1) boolean char(1) for bit data Если в составе типов есть тип Буг _N NUMERIC(n, k) numeric(n,k) dec(n,k) Если в составе типов есть тип чи< п, точность-к _Т DATETIME timestamp timestamp Если в составе типов есть тип Да- _S NCHAR(n) mchar(n) graphic(n) Если в составе типов есть тип Стр п символов NVARCHAR(n) mvarchar(n) vargraphic(n) Если в составе типов есть тип Стр переменной максимальной длины NVARCHAR(n) mvarchar dbclob Если в составе типов есть тип Стр переменной максимальной длины _В BINARY(n) bytea char(n) for bit data Может использоваться в служебнь для хранения двоичных данных до VARBINARY(n) bytea varchar(n) for bit data Может использоваться в служебнь для хранения двоичных данных до IMAGE bytea blob Выбран тип Хранилище значеи _RTRef BINARY(4) bytea varchar(4) for bit data Если в составе типов есть нескот ссылочных типов или набор типов _RRRef BINARY(16) bytea varchar(16) for bit data Выбран тип Ссылка Том 2
Рис. Хранение значений составного типа Если хранится значение единственно возможного ссылочного типа, то поле с суффиксом _RTRef отсутствует (т.к. тип ссылки известен из схемы базы данных), а в поле с суффиксом _RRRef также хранится идентификатор записи, на которую ссылается значение. Назначение Пример Содержит идентификатор фактического типа: Булево, число, Строка, Дата ипи Ссылка _Fld631_TYPE дево Содержит значение типа Булево. Если тип не Булево, содержит 0x00 _Fld533_L :ло длина - Содержит значение типа число. Если тип не Число, содержит 0 _Fld211_N га Содержит значение типа Дата. Если тип не Дата, содержит дату '00000101000000’ _Fld538_T >ока длины Содержит значение типа Строка. Если тип не Строка, содержит строку из п пробелов _Fld421_S >ока п символов Содержит значение типа Строка. Если тип не Строка, содержит пустую строку >ока п символов Содержит значение типа Строка. Если тип не Строка, содержит пустую строку >1Х полях дины п байт Содержит значение, если его тип Двоичный (этот тип является служебным и недоступен на уровне конфигурации), или последовательность нулевых байт в противном случае _Fld421_B >1Х полях дины п байт Содержит значение, если его тип Двоичный (этот тип является служебным и недоступен на уровне конфигурации), или последовательность нулевых байт в противном случае 1ИЯ Содержит значение, если его тип Хранилище значения, или последовательность байт нулевой длины в противном случае >ко Содержит номер таблицы, на которую ссыпается значение, если его тип Ссылка, или 0x00000000 в противном случае _Fld354_RTRef Содержит идентификатор записи, на которую ссылается значение, если его тип Ссылка, или 0x00000000000000000000000000000000 в противном случае _Fld354_RRRef <т
IП ри ложен иё^Хранён иёУдан н Gix Такой механизм хранения значений данных позволяет наиболее адек- ватным способом выполнять средствами СУБД сравнение, сортировки, группировки и другие операции над данными, предусмотренные во встроенных объектах «1С:Предприятия» и в языке запросов. В процессе конфигурирования «1С:Предприятия» следует учиты- вать увеличение объема хранимых данных в СУБД при использовании составных типов данных и использовать составные типы, только если это оправдано с точки зрения функционирования конфигурации. Обобщая все сказанное выше, можно выделить следующие вари- анты представления полями таблиц СУБД полей объектов базы данных «1С:Предприятия». Таблица. Варианты представления попей объектов Вариант Состав типов Пример Один тип, в том числе ссылка на объекты базы данных одного типа Строка _Fld513 СлравочникСсылка.Товары _Fld469_RRef Набор типов или ссыпка на объекты базы данных двух и более типов СправочникСсылка _Fld572_TYPE _Fld572_ RTRef _Fld572_ RRRef СлравочникСсыпка.Организации, СлравочникСсылка.Контра тенты ЛюбаяСсылка Несколько примитивных типов ипи ссылки хотя бы с одним типом, отличным от ссылок Число, Строка _Fld436_TYPE _Fld436_N _Fld436_S Булево, СлравочникСсылка.Контра тенты _Fld677_TYPE _Fld677_L _Fld677_RRRef Число, СправочникСсылка _Fld638_TYPE _Fld638_N _Fld638_RTRef _Fld638_RRRef Все варианты перечислены в порядке уменьшения эффективности: первый вариант является наиболее эффективным, последний - наименее эффективным, что является определенной платой за его универсальность. Поэтому при использовании последнего варианта необходимо учитывать возможное снижение эффективности и быть уверенным в том, что это не скажется существенно на функционировании прикладного решения. Кроме собственно ресурсоемкости, дополнительные проблемы могут возникнуть в тех случаях, когда поле, представляемое в соответствии с последним вариантом, участвует в индексах.
Индексирование полей составного типа Создание индексов по полям составных типов имеет важную особенность, которая при неосторожном использовании может отрицательно сказаться на производительности информационной базы. Если в индекс входит поле составного типа, для которого задано несколько различных типов (отличных от ссылок или ссылки хотя бы с одним типом, отличным от ссылок), то вместо каждого дополнительного индекса, вклю- чающего это поле, будет создано столько дополнительных индексов, сколько различных типов содержится в описании типа этого поля. Такой подход позволяет уменьшить длину ключа в индексе и использовать пост- роенные индексы в операциях сравнения полей составных типов. Рассмотрим несколько примеров. Пусть индексируемое поле составного типа включает следующие типы: Число, Дата, ДокументСсылка. ПриходнаяНакладная. В этом случае будет создано три индекса, которые будут включать в себя следующие наборы полей. Таблица. Индексирование полей, хранящих данные составного типа Типы составного типа Индексы Число _Fld647_TYPE + _Fld647_N Дата _Fld647_TYPE + _Fld647_D ДокументСсыпка.ПриходнаяНакладная _Fld647_TYPE + _Fld647_RRRef Рассмотрим другой пример, когда составной тип содержит несколько ссылочных типов. Таблица. Индексирование попей, хранящих данные составного типа Типы составного типа Индексы Бупево _Fld325_TYPE + _Fld325_L Число _Fld325_TYPE + _Fld325_N СправочникСсылка.ФизическиеЛица СправочникСсылка. ЮридическиеЛица _Fld325_TYPE + _Fld325_RTRef + _Fld325_RRRef Теперь рассмотрим ситуацию, когда в составной индекс входят сразу оба приведенных здесь поля составного типа. Поскольку первое поле имеет составной тип, для него будет создано три индекса, а поскольку второе поле также имеет составной тип, то для каждого созданного индекса будет создано еще три. Профессиональная разработка в системе «1С:Предприятие 8»
Таблица. Построение индекса по двум реквизитам составного типа Типы первого поля Типы второго ПОЛЯ Индексы Число Булево _Fld647_TYPE + _Fld647_N + _Fld325_TYPE + _Fld325_L Число Число _Fld647_TYPE+ _Fld647_N + _Fld325_TYPE + _Fld325_N Число СправочникСсылка.ФизическиеЛица СлравочникСсылка.ЮрцдическиеЛица _Fld647_TYPE + _Fld647_N + _Fld325_TYPE + _Fld325_RTRef+ Fld325_RRRef Дата Булево _Fld647_TYPE + _Fld647_D + _Fld325_TYPE + _Fld325_L Дата Число _Fld647_TYPE + _Fld647_D + _Fld325_TYPE + _Fld325_N Дата СправочникСсылка.ФизическиеЛица СправочникСсылка.ЮрцдическиеЛица _Fld647_TYPE + _Fld647_D + _Fld325_TYPE + _Fld325_RTRef + _Fld325_RRRef ДокументСсылка.ПриходнаяНакладная Булево _Fld647_TYPE + _Fld647_RRRef+ _Fld325_TYPE + _Fld325_L ДокументСсылка.ПриходнаяНакладная Число _Fld647_TYPE + _Fld647_RRRef+ _Fld325_TYPE + _Fld325_N ДокументСсылка.ПриходнаяНакладная СправочникСсылка.ФизическиеЛица СлравочникСсылка.ЮридическиеЛица _Fld647_TYPE + _Fld647_RRRef+ _Fld325_TYPE + _Fld325_RTRef+ _Fld325_RRRef Из приведенных примеров видно, что в общем случае количество фактически созданных индексов будет равно произведению количеств различных типов (ссылки считаются одним типом), составляющих тип каждого из полей. Подобная нелинейная зависимость количества созда- ваемых индексов может отрицательно сказаться на производительности системы в тех местах, где индексы таблиц базы данных, создаваемые системой автоматически, включают относительно большое количество полей: ресурсы регистров и реквизиты, для которых индексирование задается в явном виде в конфигураторе; измерения регистров. Том 2
ПОДРОБНЕЕ Раздел «Индексы таблиц базы данных», стр. 675. Сравнение полей составного типа В процессе функционирования информационных баз одним из важнейших действий над данными является их сравнение. Способ представления в СУБД данных различных типов, реализованный в «1С:Предприятии», вносит некоторые особенности в выполнение операций сравнения. Очевидно, что способ представления данных СУБД сказывается на тех сравнениях, которые выполняются средствами СУБД. Сравнение значений во встроенном языке «1С:Предприятия» не вызывает обращений к СУБД и не зависит от представления в СУБД участвующих в них данных. Сравнение средствами СУБД выполняется в основном при использовании запросов. Например, в операциях сравнения, группировки и упорядочивания. Листинг. Использование сравнения в запросе ВЫБРАТЬ ЗарплатаКВыплате.Представпение ИЗ Документ.ЗарппатаКВыппате КАК ЗарплатаКВыппате ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Попьзоватепи КАК Пользователи ПО ЗарппатаКВыппате.Ответственный = Пользователи.Ссыпка В приведенном примере раздел ПО содержит сравнение двух полей на равенство. Другой случай - преобразование типов и обращение по ссылкам. Листинг. Использование преобразования типов в запросе ВЫБРАТЬ ВЫРАЗИТЬ(ЗарплатаКВыплате.Ответсгаенный КАКСправочник.Пользоватепи).Представление ИЗ Документ.ЗарппатаКВыппате КАК ЗарплатаКВыппате В этом примере значение реквизита Документ.ЗарплатаКВыплате.Ответ- стаенный преобразуется к типу СправочникСсылка.Пользователи, после чего выбирается представление объекта. И в том и в другом случае результат выполнения операции будет зависеть от типа реквизита Ответственный документа ЗарплатаКВыплате.
ПриложениеЭХранениеУданн£|х< Также операции сравнения могут содержаться в SQL-запросах, которые порождаются различными программными объектами «1С:Предприятия». Например, исполнение метода Выбрать() приведет к построению и испол- нению SQL-запроса к базе данных, содержащего операции сравнения. Листинг. Использование метода «Выбрать()» Выборка = Справочники.ФильтрыДляЭлектронныхПисем.Выбрать(, УчетнаяЗапись, I Новый Структура("Использование”, Истина), "Порядок ВОЗР"); | Выбранный в «1С:Предприятии 8» механизм представления данных составных типов позволяет естественным образом исполнять сорти- ровки, группировки и вычисление агрегатных функций в терминах SQL без потери эффективности. В то же время операции сравнения данных, в представлении которых учас- твуют несколько полей, для СУБД не являются элементарными и приводят к формированию сложных условий, включающих все поля, которые участвуют в представлении сравниваемых данных. «1С:Предприятие» обеспечивает адекватность исполнения любых сравнений данных. Однако игнорирование особенностей сравнения полей составного типа может привести к снижению эффективности разрабатываемых конфигураций. Рассмотрим общий случай, коща выполняется сравнение двух полей составного типа, содержащих полный набор возможных различных типов данных «1С:Предприятия». Допустим, что в базе данных им сопостав- лены имена полей _Fld111 и _F!d222. Тогда некоторые варианты сравнений этих полей на уровне базы данных будут выглядеть как на таблице «Варианты выполнения сравнения на уровне базы данных». Из приведенных примеров видно, что сравнение полей составных типов использует условие, содержащее операцию OR. Наличие этой операции существенно ограничивает возможности СУБД по оптимизации плана такого запроса, в том числе по использованию индексов. Это может привести к существенному замедлению исполнения такого запроса. Особым случаем сравнения полей составных типов являются те сравнения, в реализации которых средствами SQL операция OR не исполь- зуется. Исполнение таких сравнений не может привести к существенному снижению производительности. Среди них: сравнение с литералом; сравнение со значением поля примитивного типа; сравнение на равенство со значением поля составного типа, включаю- щего только ссылочные типы; сравнение на равенство значений полей составного типа с одинаковым набором типов (набор ссылочных типов может быть произвольным).
Таблица. Варианты выполнения сравнения на уровне базы данных Операция сравнения Реализация средствами SQL Реквизит! = Реквизит2 _FldlH_TYPE = _Fld222_TYPE AND (_Fldlll_TYPE = 0x01 OR _Fldlll_TYPE = 0x02 AND _Fldlll_L = _Fld222_L OR _Fldlll_TYPE = 0x03 AND _Fldlll_N = _Fld222_N OR _Fldlll_TYPE = 0x04 AND _Fldlll_T = _Fld222_T OR _Fldlll_TYPE = 0x05 AND _Fldlll_S = _Fld222_S OR _Fldlll_TYPE = 0x06 AND _Fldlll_B = _Fld222_B OR _Fldlll_TYPE = 0x07 AND _Fldlll_RTRef=_Fld222_RTRef AND _Fldl ll.RRRef=_Fld222_RRRef ) Реквизит! о Реквизит _Fldlll_TYPE <> _Fld222_TYPE OR (_FldlH_TYPE = 0x02 AND _Fldlll_L <> _Fld222_L OR_FldlH_TYPE = 0x03 AND _Fldlll_N <>_Fld222_N OR_FldlH_TYPE = 0x04 AND _Fldlll_T<> _Fld222_T OR_FldlH_TYPE = 0x05 AND _Fldlll_S <>_Fld222_S OR _FldlH_TYPE = 0x06 AND _Fldlll_B <> _Fld222_B OR_FldlH_TYPE = 0x07 AND (_Fldlll_RTRef <> _Fld222_RTRef OR _Fldl!1_RRRef<>_Fld222_RRRef ) ) Реквизит! > Реквизит2 _Fldlll_TYPE > _Fld222_TYPE OR _Fld 111_TYPE = _Fld222_TYPE AND (_Fldlll_TYPE = 0x02AND_Fldlll_L>_Fld222_L OR _Fldlll_TYPE = 0x03 AND _Fld 111_N > _Fld222_N OR _Fldlll_TYPE = 0x04 AND _Fldlll_T > _Fld222_T OR _Fldlll_TYPE = 0x05 AND _Fld 111_S > _Fld222_S OR _Fldlll_TYPE = 0x06 AND _Fldlll_B > _Fld222_B OR _Fldlll_TYPE = 0x07 AND (_Fldlll_RTRef > _Fld222_RTRef OR _Fldlll_RTRef = _Fld222_RTRef AND _Fld111_RRRef = _Fld222_RRRef) ) Реализация следующих сравнений хотя и может содержать операции OR, но, как правило, хорошо оптимизируется СУБД. Их исполнение обычно также не приводит к существенному снижению производительности: сравнение >, <, >=, <= со значением поля составного типа, включаю- щего только ссылочные типы; сравнение >, <, >=, <= значений полей составного типа с одинаковым набором типов (набор ссылочных типов может быть произвольным). Приведенные выше соображения позволяют сформулировать следующие рекомендации по использованию полей составных типов: использовать поля составных типов следует только тоща, когда это является оправданным с точки зрения логики функционирования конфигурации; не следует использовать составные типы (кроме ссылочных) для полей, по которым связываются таблицы. Например, если в документах ПриходнаяНакладная и РасходнаяНакладная есть реквизит Контракт составного типа, то исполнение следующего запроса может быть неэффективным. Профессиональная разработка в системе «1С:Предприятие 8»
Листинг. Связь таблиц по полю составного типа ВЫБРАТЬ ПриходнаяНакладная.Контракт ИЗ Документ.ПриходнаяНакледная КАК ПриходнаяНакладная ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходнаяНакладная КАК РасходнаяНакладная ПО ПриходнаяНакладная.Контракт = РасходнаяНакладная.Контракт желательно избегать выполнения операций поиска и отбора по значе- ниям полей составных типов (кроме ссылочных); не следует определять поля составного типа (кроме ссылочных) в таблицах с потенциально очень большим количеством записей; желательно избегать использования субконто и измерений регистров составных типов (кроме ссылочных); индексирование по полям составных типов следует использовать только после тщательного анализа этого решения с точки зрения его необходимости и возможных потерь производительности. ИНДЕКСЫ ТАБЛИЦ БАЗЫ ДАННЫХ При создании таблиц, соответствующих тем или иным объектам конфигу- рации, система автоматически создает набор индексов, обеспечивающих эффективную работу с этими таблицами. В то же время разработчик может дополнительно, если существует такая необходимость, указать те или иные поля, которые также должны участвовать в построении индекса. Информация об индексах, создаваемых системой автоматически, может быть полезна при написании текстов запросов с целью оптимизации времени их выполнения. С другой стороны, возможность создания дополнительных индексов таблиц базы данных может быть использована при выполнении оптими- зации конкретных алгоритмов, сложных запросов. Реквизиты различных объектов конфигурации имеют свойство Индексировать. Это свойство может быть установлено в значение Индексировать и в некоторых случаях Индексировать с доп. упорядочиванием. При этом система при реструктури- зации информационной базы будет создавать дополнительные индексы с учетом заданных свойств. Кроме этого, при работе с динамическими списками необходимо представ- лять правила, по которым система создает индексы таблиц базы данных, т.к. механизм динамического просмотра напрямую «завязан» с индек- сами, существующими в базе данных. Настройка динамических списков предоставляет широкие возможности упорядочивания и отбора списков, однако далеко не все возможные варианты упорядочивания, например, Том 2
могут быть реализованы одинаково эффективно. Вполне реальна ситу- ация, когда механизм динамического просмотра просто будет отключен, потому что в базе данных не найдется подходящего индекса для выпол- нения установленного упорядочивания. В этом случае работа списка может значительно замедлиться, т. к. данные из базы данных будут выби- раться не порциями, а целиком из всей таблицы. В приведенном ниже описании указаны имена полей, используемые в таблицах запросов. Для измерений, реквизитов и т.д. применяются условные имена Изме- рение!, Реквизит! и т.д. Те индексные поля, которые не являются обязательными, приведены в квадратных скобках. Если в индексе присутс- твует набор однотипных полей, это описывается многоточием, например: Реквизит + Измерение! + [Измерение2 + ...]. Справочник Основная таблица Основные индексы Ссылка Этот индекс создается всегда для любого справочника. Код + Ссылка Этот индекс создается, если длина кода не равна 0. Наименование + Ссылка Этот индекс создается, если длина наименования не равна 0. Реквизит + Ссылка Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Реквизит + Код + Ссылка Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина кода не равна 0; основное представление справочника в виде кода. Реквизит + Наименование + Ссылка Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием;
ПриложениеЭХранениеУданн£|х< длина наименования не равна 0; основное представление справочника в виде наименования. Реквизит Этот индекс создается, если справочник включен в критерий отбора через реквизит Реквизит. Дополнительные индексы Дополнительные индексы для подчиненного справочника (вне зависи- мости от иерархичности справочника) Владелец + Код + Ссылка Этот индекс создается, если длина кода не равна 0. Владелец + Наименование + Ссылка Этот индекс создается, если длина наименования не равна 0. Владелец + Ссылка Этот индекс создается, если длина кода и наименования равна 0. Владелец + Реквизит + Ссылка Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Владелец + Реквизит + Код + Ссылка Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина кода не равна 0; основное представление справочника в виде кода. Владелец + Реквизит + Наименование + Ссылка Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина наименования не равна 0; основное представление справочника в виде наименования. Дополнительные индексы для иерархического неподчиненного справоч- ника. Родитель + ЭтоГруппа + Код + Ссылка Этот индекс создается, если длина кода не равна 0. Родитель + ЭтоГруппа + Наименование + Ссылка Этот индекс создается, если длина наименования не равна 0.
Родитель + ЭтоГруппа + Реквизит + Ссылка Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Родитель + ЭтоГруппа + Реквизит + Код + Ссылка Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина кода не равна 0; основное представление справочника в виде кода. Родитель + ЭтоГруппа + Реквизит + Наименование + Ссылка Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина наименования не равна 0; основное представление справочника в виде наименования. Если для справочника не задано свойство Размещение групп сверху, то состав индексов соответствует приведенной выше таблице, но в индексы при этом не включено поле ЭтоГруппа. Дополнительные индексы для иерархического подчиненного справоч- ника. Владелец + Родитель + ЭтоГруппа + Код + Ссылка Этот индекс создается, если длина кода не равна 0. Владелец + Родитель + ЭтоГруппа + Наименование + Ссылка Этот индекс создается, если длина наименования не равна 0. Владелец + Родитель + ЭтоГруппа + Ссылка Этот индекс создается, если длина кода и наименования равна 0. Владелец + Родитель + ЭтоГруппа + Реквизит + Ссылка Этот индекс создается в случае, если для реквизита свойство Индексиро- вать установлено в значение Индексировать. Владелец + Родитель + ЭтоГруппа + Реквизит + Код + Ссылка Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина кода не равна 0; основное представление справочника в виде кода. Владелец + Родитель + ЭтоГруппа + Реквизит + Наименование + Ссылка Профессиональная разработка в системе «1С:Предприятие 8»
Этот индекс создается, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина наименования не равна 0; основное представление справочника в виде наименования. Если для справочника не задано свойство Размещение групп сверху, то состав индексов соответствует приведенной выше таблице, но в индексы при этом не включено поле ЭтоГруппа. Таблица табличной части Все таблицы, предоставляющие доступ к табличным частям объектов, индексируются одинаково. ПОДРОБНЕЕ Раздел «Табличная часть», стр. 678. Документ Основная таблица Ссылка Дата + Ссылка Эти индексы создаются всегда для любого документа. Номер + Ссылка Этот индекс создается, если длина номера не равна 0. Реквизит + Ссылка Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Реквизит + Дата + Ссылка Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать с доп. упорядочиванием. Реквизит Этот индекс создается, если документ включен в критерий отбора через реквизит Реквизит. ПрефиксНомера + Номер + Ссылка Этот индекс создается, если длина номера не равна 0. Том 2
Таблица табличной части Все таблицы, предоставляющие доступ к табличным частям объектов, индексируются одинаково. ПОДРОБНЕЕ Раздел «Табличная часть», стр. 678. Журнал документов Дата + Ссылка Этот индекс создается всегда для любого журнала документов. Графа + Ссылка Этот индекс создается, если для графы свойство Индексировать установ- лено в значение Индексировать. Графа + Дата + Ссылка Этот индекс создается, если для графы свойство Индексировать установ- лено в значение Индексировать с доп. упорядочиванием. План видов характеристик Индексы, создаваемые для таблиц плана видов характеристик, анало- гичны индексам, создаваемым для справочника. Разница заключается только в условиях создания индексов: у плана видов характеристик длина кода и наименования не может быть равна нулю, и план видов характе- ристик не может быть подчиненным. ПОДРОБНЕЕ Основные индексы таблиц справочника подробно описаны в разделе «Справочник», стр. 675. План счетов Основная таблица Ссылка Код + Ссылка Родитель + Код + Ссылка Наименование + Ссылка Родитель + Наименование + Ссылка Эти индексы создаются всегда для любого плана счетов.
ПриложениеЭХранениеУданн£|х< Порядок + Ссылка Родитель + Порядок + Ссылка Эти индексы создаются, если длина порядка не равна 0. Реквизит + Ссылка Родитель + Реквизит + Ссылка Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Реквизит + Порядок + Ссылка Родитель + Реквизит + Порядок + Ссылка Эти индексы создаются, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина порядка не равна 0. Реквизит + Код + Ссылка Родитель + Реквизит + Код + Ссылка Эти индексы создаются, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина порядка равна 0; основное представление в виде кода. Реквизит + Наименование + Ссылка Родитель + Реквизит + Наименование + Ссылка Эти индексы создаются, если: для реквизита свойство Индексировать установлено в значение Индек- сировать с доп. упорядочиванием; длина порядка равна 0; основное представление в виде наименования. Реквизит Этот индекс создается, если план счетов включен в критерий отбора через реквизит Реквизит. Таблица табличной части Все таблицы, предоставляющие доступ к табличным частям объектов, индексируются одинаково. ПОДРОБНЕЕ Раздел «Табличная часть», стр. 678.
План видов расчета Индексы, создаваемые для таблиц плана видов расчета, аналогичны основным индексам, создаваемым для справочника. ПОДРОБНЕЕ Основные индексы таблиц справочника подробно описаны в разделе «Справочник», стр. 675. План обмена Индексы, создаваемые для таблиц плана обмена, аналогичны основным индексам, создаваемым для справочника. Разница заключается только в условиях создания индексов: у плана обмена длина кода и длина наименования не могут быть равны нулю. ПОДРОБНЕЕ Основные индексы таблиц справочника подробно описаны в разделе «Справочник», стр. 675. Табличная часть Ссылка + Ключ Этот индекс создается всегда для любой табличной части любого объекта конфигурации. Реквизит Этот индекс создается, если объект конфигурации включен в критерий отбора через реквизит Реквизит табличной части или для рекви- зита табличной части свойство Индексировать установлено в значение Индексировать. Регистр сведений Непериодический регистр сведений Измерение1 + [Измерение2 +...] Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании. Этот индекс создается, если есть хоть одно измерение регистра. Измерением + Измерение! + [Измерение2 +...] Индекс, включающий все измерения. Первое поле - Измерением, затем все остальные измерения в том порядке, в котором они заданы при конфи- гурировании. Профессиональная разработка в системе «1С:Предприятие 8»
Этот индекс создается, если: для измерения H3MepeHHeN задано свойство Индексировать или свойство Ведущее; измерением - не первое измерение; измерением - не единственное измерение. Реквизит + Измерение! + [Измерение2 +...] Индекс, в котором первое поле - Реквизит, затем все измерения в том порядке, в котором они заданы при конфигурировании. Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Ресурс + Измерение! + [Измерение2 +...] Индекс, в котором первое поле - Ресурс, затем все измерения в том порядке, в котором они заданы при конфигурировании. Этот индекс создается, если для ресурса свойство Индексировать установ- лено в значение Индексировать. В данный индекс включается поле Ресурс, и затем все измерения в том порядке, в котором они заданы в составе регистра как объекта конфигу- рации. Периодический регистр сведений Период + [Измерение! + ...] Этот индекс создается всегда для любого периодического регистра сведений. Измерение! + [Измерение2 +...] + Период Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании, и поле Период. Этот индекс создается, если есть хоть одно измерение регистра. Измерением + Париод + Измерение! + [Измерение2 +...] Индекс, включающий поле Париод и все измерения. Первое поле - Изме- рением, затем поле Период, затем все остальные измерения в том порядке, в котором они заданы при конфигурировании. Этот индекс создается, если: для измерения измерением свойство Индексировать установлено в значение Индексировать; измерением - не единственное измерение. Том 2
Реквизит + Период + [Измерение! + ...] Индекс, в котором первое поле - Реквизит, затем поле Период, затем все измерения в том порядке, в котором они заданы при конфигурировании. Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Ресурс + Период + [Измерение! + ...] Индекс в котором первое поле - Ресурс, затем поле Период, затем все изме- рения в том порядке, в котором они заданы при конфигурировании. Этот индекс создается, если для ресурса свойство Индексировать установ- лено в значение Индексировать. Дополнительный индекс для регистра сведений, подчиненного регистратору Регистратор + НомерСтроки Этот индекс создается всегда для любого регистра сведений, подчинен- ного регистратору. Регистр сведений с периодичностью «По позиции регистратора» Период + Регистратор + НомерСтроки Регистратор + НомерСтроки Эти индексы создаются всегда для любого регистра сведений с периодич- ностью По позиции регистратора. Измерение! + [Измерение2 + ...] + Период + Регистратор + НомерСтроки Индекс, включающий все измерения в том порядке, в котором они заданы при конфигурировании, поле Период, поле Регистратор и поле НомерСтроки. Этот индекс создается, если есть хоть одно измерение регистра. Измерение + Период + Регистратор + НомерСтроки Этот индекс создается, если для измерения свойство Индексировать уста- новлено в значение Индексировать. Реквизит + Период + Регистратор + НомерСтроки Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Ресурс + Период + Регистратор + НомерСтроки Этот индекс создается, если для ресурса свойство Индексировать установ- лено в значение Индексировать.
ПриложениеЭХранениеУданн£|х< Регистр накопления Основная таблица Период + Регистратор + НомерСтроки Регистратор + НомерСтроки Этот индекс создается всегда для любого регистра накопления. Измерение + Период + Регистратор + НомерСтроки Этот индекс создается, если для измерения свойство Индексировать уста- новлено в значение Индексировать. Реквизит + Период + Регистратор + НомерСтроки Этот индекс создается, если для реквизита свойство Индексировать уста- новлено в значение Индексировать. Таблица итогов Период + Измерение! + Измерение2 + ... + Измерением + Разделитель - по всем измерениям регистра. Измерение + Период — если для измерения Измерение свойство Индексиро- вать установлено в значение Индексировать. Агрегаты регистра накопления Таблица агрегатов Период + Измерение! + Измерение2 + ... + Измерением - этот индекс созда- ется всегда. Таблица статистики регистра накопления Идентификатор + Период + Разделитель - этот индекс создается всегда. Карта используемых измерений - этот индекс создается всегда. Таблица опций сети агрегатов Идентификатор - этот индекс создается всегда. Таблица буфера новых оборотов регистра накопления Период + Измерение! + Измерение2 + ... + Измерением - этот индекс созда- ется всегда.
Таблица новых оборотов регистра накопления Период + Измерение! + Измерение2 + ... + Измерением + Разделитель - этот индекс создается всегда. Таблица кодов измерений регистра накопления Период + UUID измерения 1 + ... + UUID измерениям - этот индекс созда- ется всегда. Таблица сети агрегатов Идентификатор + UU!D измерения 1 + ... + UU!D измерениям - этот индекс создается всегда. Регистр бухгалтерии Основная таблица Основная таблица регистра без корреспонденции Период + Регистратор + НомерСтроки Регистратор + НомерСтроки Эти индексы создаются всегда для любого регистра бухгалтерии без корреспонденции. Счет + Период + Регистратор Этот индекс создается, если регистру назначен план счетов. Измерение + Период + Регистратор + НомерСтроки Этот индекс создается, если для измерения свойство Индексировать установлено в значение Индексировать. Реквизит + Период + Регистратор + НомерСтроки Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать. Основная таблица регистра с корреспонденцией Для основной таблицы регистра бухгалтерии с корреспонденцией создаются те же индексы, что и для регистра без корреспонденции, за исключением того, что вместо индекса по счету создаются два индекса по счету дебета и счету кредита: СчетДт + Период + Регистратор СчетКт + Париод + Регистратор Эти индексы создаются всегда для любого регистра с корреспонденцией. Профессиональная разработка в системе «1С:Предприятие 8»
Таблица значений субконто Регистратор + НомерСтроки + Корреспонденция Период + Регистратор + НомерСтроки + ВидСубконто + Корреспонденция ВидСубконто + Значение Эти индексы создаются, если регистр бухгалтерии ссылается на план счетов, у которого максимальное количество субконто больше нуля. Регистр расчета Основная таблица ПериодРегистрации + Регистратор + НомерСтроки Регистратор + НомерСтроки Эти индексы создаются всегда для любого регистра расчета. ПериодРегистрации + [Базовое Измерение! +...] Индекс по полю ПериодРегистрации и всем базовым измерениям, т.е. по тем измерениям, у которых установлено свойство Базовое. Базовые измерения следуют в том порядке, в котором они заданы при конфигури- ровании. Если базовые измерения отсутствуют, то этот индекс будет строиться только по полю ПериодРегистрации. [БазовоеИзмерение1 +...] + ПериодРегистрации Индекс по всем базовым измерениям, т. е. по тем измерениям, у которых установлено свойство Базовое, и полю ПериодРегистрации. Этот индекс создается, если есть хоть одно базовое измерение. ПериодДействия + [БазовоеИзмерение1 +...] Индекс по полю ПериодДейстаия и всем базовым измерениям, т. е. по тем измерениям, у которых установлено свойство Базовое. Базовые измерения следуют в том порядке, в котором они заданы при конфигурировании. Этот индекс создается, если установлено свойство регистра расчета ПериодДействия. [БазовоеИзмерение1 +...] + ПариодДействия Индекс по всем базовым измерениям, т. е. по тем измерениям, у которых установлено свойство Базовое и полю ПериодДействия. Этот индекс создается, если: установлено свойство регистра расчета ПериодДействия, есть хоть одно базовое измерение. Том 2
Измерение + ПериодРвгистрации + Регистратор + НомерСтроки Этот индекс создается, если для измерения свойство Индексировать установлено в значение Индексировать. Реквизит + ПериодРвгистрации + Регистратор + НомерСтроки Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать. Таблица перерасчета Регистратор + ВидРасчета + [Измерение! + ...] Индекс по полю Регистратор, полю ВидРасчета и всем полям измерений перерасчета в той последовательности, в которой они сконфигуриро- ваны. Этот индекс создается всегда для таблицы перерасчета. Последовательность Таблица регистрации документов в последовательности Регистратор [Измерение! + ...] + Период + Регистратор Индекс по всем полям измерений, полю Период и полю Регистратор. Поля измерений следуют в том порядке, в котором они заданы при конфи- гурировании. Эти индексы создаются всегда для любой последовательности. Таблица границ последовательности [Измерение! + ...] + Период + Регистратор Индекс по всем полям измерений, полю Период и полю Регистратор. Поля измерений следуют в том порядке, в котором они заданы при конфи- гурировании. Этот индекс создается всегда для любой последовательности. Перечисление Ссылка Порядок + Ссылка Поле Порядок таблиц перечислений соответствует порядку, в котором значения перечисления расположены в дереве конфигурации. Эти индексы создаются всегда для любого перечисления.
ПриложениеЭХранениеУданн£|х< Бизнес-процесс Основная таблица Ссылка Дата + Ссылка Завершен + Дата + Ссылка Стартован + Дата + Ссылка ВедущаяЗадача + Ссылка Эти индексы создаются всегда для любого бизнес-процесса. Номер + Ссылка Этот индекс создается в случае, если длина номера не равна 0. Реквизит + Ссылка Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать. Реквизит + Дата + Ссылка Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать с доп. упорядочиванием. Реквизит Этот индекс создается в случае, если бизнес-процесс включен в критерий отбора через реквизит Реквизит. Таблица табличной части Все таблицы, предоставляющие доступ к табличным частям объектов, индексируются одинаково. ПОДРОБНЕЕ Раздел «Табличная часть», стр. 678. Таблица точек маршрута Ссылка Порядок + Ссылка Поле Порядок таблиц точек соответствует порядку, в котором точки марш- рута были введены в графическую схему бизнес-процесса. Эти индексы создаются всегда для любого бизнес-процесса.
Задача Основная таблица Ссылка Дата + Ссылка Наименование + Ссылка Выполнена + Наименование + Ссылка Выполнена + Дата + Ссылка БизнесПроцесс + ТочкаМаршрута + Ссылка Выполнена + БизнесПроцесс + ТочкаМаршрута + Ссылка БизнесПроцесс + Дата + Ссылка Эти индексы создаются всегда для любой задачи. Номер + Ссылка Этот индекс создается, если длина номера не равна 0. Реквизит + Ссылка Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать. Реквизит + Дата + Ссылка Этот индекс создается, если для реквизита свойство Индексировать установлено в значение Индексировать с доп. упорядочиванием. Реквизит Этот индекс создается, если задача включена в критерий отбора через реквизит Реквизит. Таблица табличной части Все таблицы, предоставляющие доступ к табличным частям объектов, индексируются одинаково. ПОДРОБНЕЕ Раздел «Табличная часть», стр. 678. Таблицы регистрации изменений Таблицы регистрации изменений для различных объектов метаданных отличаются только составом и типами полей ключа данных - набора полей, однозначно определяющих данные. Для объектных типов данных (Справочник, Документ, ПланСчетов и др.) - это Ссылка; для регистров, подчиненных регистратору (РегистрНакопления, РегистрБухгалтерии, Профессиональная разработка в системе «1С:Предприятие 8»
РегистрСведений, подчиненный регистратору и др.), - Регистратор; для регистров сведений, не подчиненных регистратору, - поля, соот- ветствующие изменениям, входящим в основной отбор регистра; для констант - идентификатор объекта метаданных Константы. Узел + Номер сообщения + Ключ данных Ключ данных + Узел + Номер сообщения Эти индексы создаются всегда для любой таблицы регистрации изменений. Таблица списка пользователей Уникальный идентификатор пользователя Роль Имя пользователя ОС Имя пользователя Полное имя пользователя Показывать пользователя в списке для диалога аутентификации Эти индексы создаются всегда для любой таблицы списка пользова- телей. Таблица истории работы пользователей Уникальный идентификатор пользователя Уникальный идентификатор пользователя + Дата время Уникальный идентификатор пользователя + Хеш по URL Эти индексы создаются всегда для любой таблицы истории работы пользователей. Таблица хранилища системных настроек Уникальный идентификатор пользователя + Имя предмета настройки + Имя множественной (именованной) настройки Этот индекс создается всегда для любой таблицы хранилища системных настроек. Том 2
Таблица хранилища настроек отчетов Уникальный идентификатор пользователя + Имя предмета настройки + Имя множественной (именованной) настройки Этот индекс создается всегда для любой таблицы хранилища настроек отчетов. Таблица хранилища настроек вариантов отчетов Уникальный идентификатор пользователя + Имя предмета настройки + Имя множественной (иманованной) настройки Этот индекс создается всеща для любой таблицы хранилища настроек вариантов отчетов. Таблица хранилища общих настроек Уникальный идентификатор пользователя + Имя предмета настройки + Имя множественной (именованной) настройки Этот индекс создается всегда для любой таблицы хранилища общих настроек. Таблица хранилища настроек данных форм Уникальный идентификатор пользователя + Имя предмета настройки + Имя множастванной (иманованной) настройки Этот индекс создается всегда для любой таблицы хранилища настроек данных форм.